信息学奥赛一本通 第三章 程序的控制结构第二节C语言非C++

第三章 程序的控制结构

第二节 switch语句

2057:【例3.9 】星期几

#include <stdio.h>

int main()
{
    
    
    // 声明一个整型变量n
    int n;

    // 从输入读取一个整数并赋给n
    scanf("%d", &n);

    // 根据n的值执行相应的操作
    switch(n)
    {
    
    
        // 如果n的值为1,打印"Monday"
        case 1:
            printf("Monday");
            break;

        // 如果n的值为2,打印"Tuesday"
        case 2:
            printf("Tuesday");
            break;

        // 如果n的值为3,打印"Wednesday"
        case 3:
            printf("Wednesday");
            break;

        // 如果n的值为4,打印"Thursday"
        case 4:
            printf("Thursday");
            break;

        // 如果n的值为5,打印"Friday"
        case 5:
            printf("Friday");
            break;

        // 如果n的值为6,打印"Saturday"
        case 6:
            printf("Saturday");
            break;

        // 如果n的值为7,打印"Sunday"
        case 7:
            printf("Sunday");
            break;

        // 如果n的值不在1-7之间,打印"input error!"
        default:
            printf("input error!");
    }

    return 0; 
}

2058:【例3.10】简单计算器

#include <stdio.h>

int main()
{
    
    
    // 声明两个双精度浮点型变量x和y,用于存储输入的两个数字
    double x, y;

    // 声明一个字符型变量c,用于存储输入的运算符
    char c;

    // 从输入流读取两个数字和一个运算符
    scanf("%lf %lf %c", &x, &y, &c);

    // 根据输入的运算符进行相应的运算
    switch(c)
    {
    
    
        // 如果运算符为'+',输出x和y的和
        case '+':
            printf("%.2lf", x + y);
            break;

        // 如果运算符为'-',输出x和y的差
        case '-':
            printf("%.2lf", x - y);
            break;

        // 如果运算符为'*',输出x和y的乘积
        case '*':
            printf("%.2lf", x * y);
            break;

        // 如果运算符为'/',需要先判断除数是否为0
        case '/':
            if (y == 0) // 如果除数是0
                printf("Divided by zero!"); // 输出:除0,这是非法运算
            else
                printf("%.2lf", x / y); // 否则输出x除以y的结果
            break;

        // 如果输入的运算符不是 + - * /
        default:
            printf("Invalid operator!"); // 输出"非法运算符"
    }

    return 0;
}

2059:【例3.11】买笔

#include <stdio.h>

int main()
{
    
    
    // 定义四个整型变量,分别用于存储输入的数(x)和需要四个(n4)、五个(n5)、六个(n6)的数量
    int x, n4 = 0, n5 = 0, n6 = 0; 

    // 从标准输入获取一个数,并将其赋值给x
    scanf("%d", &x); 

    // 如果输入的数大于4
    if(x > 4)
    {
    
    
        // 计算输入的数x可以被4整除的次数,即需要四个的数量,并将结果赋值给n4
        // 然后计算x除以4的余数,并将余数赋值给x
        n4 = x / 4;
        x %= 4; 

        // 根据修改后的x的值做不同的处理
        switch(x)
        {
    
    
            case 1:
                // 如果x的值为1,则n5(需要五个的数量)增加1,n4(需要四个的数量)减少1
                n5++;
                n4--;
                break;
            case 2:
                // 如果x的值为2,则n6(需要六个的数量)增加1,n4(需要四个的数量)减少1
                n6++;
                n4--;
                break;
            case 3:
                // 如果x的值为3,则n6(需要六个的数量)增加1,n4(需要四个的数量)减少1
                n6++;
                n4--;
                // 如果n4的值大于0,则n5(需要五个的数量)增加1,n4(需要四个的数量)减少1
                if(n4 > 0)
                {
    
    
                    n5++;
                    n4--;
                }
                break;
            default:
                // 如果x的值为0或4,不做任何操作
                break;
        }
    }

    // 打印需要六个、五个和四个的数量
    printf("%d %d %d", n6, n5, n4); 

    return 0;
}



1049:晶晶赴约会

#include <stdio.h>

int main()
{
    
    
    int a;
    scanf("%d", &a); // 从输入流中读取一个整数a

    // 使用switch语句来检查a的值是否为1,3或5
    switch(a)
    {
    
    
        case 1:
        case 3:
        case 5:
            printf("NO"); // 如果a是1,3或5,则输出"NO"
            break;
        default:
            printf("YES"); // 如果a不是1,3或5,则输出"YES"
            break;
    }

    return 0;
}

1050:骑车与走路

#include <stdio.h>
#include <math.h>

int main() {
    
    
    double s, tw, tb;
    scanf("%lf", &s); // 从输入流中读取一个浮点数s

    tw = s / 1.2; // 计算走路所需时间
    tb = 27 + 23 + s / 3; // 计算骑车所需时间

    int diff = (int)round((tw - tb) * 10000); // 计算时间差并将其转换为整数

    // 使用switch语句来判断哪种方式更快
    switch(diff) {
    
    
        case 0:
            // 如果两种方式用时相同,则输出"All"
            printf("All");
            break;
        default:
            // 如果走路用时更多,则输出"Bike",否则输出"Walk"
            printf(diff > 0 ? "Bike" : "Walk");
            break;
    }

    return 0;
}

1051:分段函数

#include <stdio.h>

int main() {
    
    
    float x, y;
    scanf("%f", &x); // 从输入流中读取一个浮点数x

    int ix = (int)(x * 10); // 将x乘以10并转换为整数,以便在switch语句中使用

    // 使用switch语句来确定应用哪个公式
    switch(ix / 50) {
    
     // ix / 50将x的范围从[0, 5), [5, 10), [10, 20)转换为[0, 1), [1, 2), [2, 4)
        case 0:
            y = -x + 2.5;
            break;
        case 1:
            y = 2 - 1.5 * (x - 3) * (x - 3);
            break;
        case 2:
        case 3:
            y = x / 2 - 1.5;
            break;
    }

    printf("%.3f\n", y); // 输出y,保留三位小数

    return 0;
}

1052:计算邮资

#include <stdio.h>

int main()
{
    
    
    int w, r = 8; // w: 重量, r: 结果
    char h; // h: 是否加急

    // 从输入中读取重量和是否加急
    scanf("%d %c", &w, &h);

    // 如果重量超过1000,增加额外费用
    if(w > 1000)
    {
    
    
        // 如果减去1000后的重量能被500整除,则按照每500g增加4的费用
        if((w - 1000) % 500 == 0)
            r += (w - 1000) / 500 * 4;
        else
            // 否则,需要向上取整
            r += ((w - 1000) / 500 + 1) * 4;
    }

    // 判断是否加急
    switch(h) {
    
    
        case 'y': // 如果加急
            r += 5;
            break;
        default: // 如果不加急,不做任何操作
            break;
    }

    printf("%d", r); // 输出结果

    return 0;
}

1053:最大数输出

#include<stdio.h>

int main()
{
    
    
    int a, b, c;
    int big; // 用来存储a、b和c中最大的值

    // 从标准输入读取三个整数
    scanf("%d%d%d", &a, &b, &c); 

    // 判断a和b中哪个大
    if(a > b)
        big = a; // 如果a大于b,那么a就是大数
    else
        big = b; // 如果b大于或等于a,那么b就是大数

    // 判断big和c中哪个大
    if(big < c)
        big = c; // 如果c大于big,那么c就是最大数

    // 输出最大数
    printf("%d", big);

    return 0;
}

1054:三角形判断

#include<stdio.h>

int main()
{
    
    
    int a, b, c;

    //从标准输入读取三个整数
    scanf("%d%d%d", &a, &b, &c); 

    /* 判断a、b、c三个数能否构成三角形,需要满足以下三个条件:
    1. 任意两边之和大于第三边
    2. 任意两边之差小于第三边
    由于已知a、b、c都是整数,所以只需要判断任意两边之和大于第三边即可
    */
    if(a + b > c && a + c > b && c + b > a)
        printf("yes\n"); //如果满足条件,输出“yes”
    else
        printf("no\n"); //如果不满足条件,输出“no”

    return 0;
}

1055:判断闰年

#include<stdio.h>

int main()
{
    
    
    int year;

    //从标准输入读取一个整数
    scanf("%d", &year); 

    /* 判断一个年份是否为闰年,需要满足以下两个条件之一:
    1. 年份能被400整除
    2. 年份不能被100整除,但能被4整除
    */
    if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
        printf("Y\n"); //如果满足条件,输出“Y”
    else
        printf("N\n"); //如果不满足条件,输出“N”

    return 0;
}

1056:点和正方形的关系

#include<stdio.h>

int main()
{
    
    
    int x, y;

    //从标准输入读取两个整数
    scanf("%d%d", &x, &y); 

    /* 判断点(x,y)是否在以原点(0,0)为中心,边长为2的正方形内,
    需要满足以下四个条件:
    1. x的值在[-1, 1]之间
    2. y的值在[-1, 1]之间
    */
    if(x >= -1 && x <= 1 && y >= -1 && y <= 1)
        printf("yes\n"); //如果满足条件,输出“yes”
    else
        printf("no\n"); //如果不满足条件,输出“no”

    return 0;
}

1057:简单计算器

#include<stdio.h>

int main()
{
    
    
    int x, y; //声明两个整型变量,表示参与运算的数字
    char c; //声明字符型变量,表示运算符

    //从标准输入读取两个整数和一个字符
    scanf("%d %d %c", &x, &y, &c); 

    //switch选择语句,看变量c与哪个case后面的常量相等
    switch(c)
    {
    
    
        case '+': //如果c是'+'
            printf("%d\n", x + y); //输出x+y的结果
            break;
        case '-': //如果c是'-'
            printf("%d\n", x - y); //输出x-y的结果
            break;
        case '*': //如果c是'*'
            printf("%d\n", x * y); //输出x*y的结果
            break;
        case '/': //如果c是'/'
            if (y == 0) //如果除数是0
                printf("Divided by zero!\n"); //输出:除0,这是非法运算
            else
                printf("%d\n", x / y); //输出x/y的结果
            break;
        default: //如果运算符不是 + - * /
            printf("Invalid operator!\n"); //输出"非法运算符"
    }

    return 0;
}

1058:求一元二次方程

#include<stdio.h>
#include<math.h>

int main()
{
    
    
    double a, b, c;
    scanf("%lf %lf %lf", &a, &b, &c); //从标准输入读取三个浮点数

    double delta = b*b - 4*a*c; //计算判别式delta

    //如果delta等于0(考虑到浮点数的精度问题,这里不能直接用delta==0来判断)
    if(fabs(delta) < 0.00001)
        printf("x1=x2=%.5lf\n", -b/(2*a)); //输出相等的根 
    else if(delta > 0) //如果delta大于0
    {
    
    
        double x_small = (-b-sqrt(delta))/(2*a); //x_small保存较小的根 
        double x_big = (-b+sqrt(delta))/(2*a); //x_big保存较大的根 

        //刚刚求出的x_small与x_big没有确定的大小关系,此处操作可以使得x_small一定小于x_big 
        if(x_small > x_big)
        {
    
    
            double temp = x_small; //交换x_small与x_big
            x_small = x_big;
            x_big = temp;
        }

        printf("x1=%.5lf;x2=%.5lf\n", x_small, x_big); //先输出较小的根再输出较大的根 
    }
    else
        printf("No answer!\n"); //没有实根 

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44738632/article/details/134974854
今日推荐