C语言刷题训练营-第六讲

BC52-衡量人体胖瘦程度

https://www.nowcoder.com/practice/4d604603fae94a26b59b7bc18f363bc0?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

在计算BMI(BodyMassIndex ,身体质量指数)的案例基础上,判断人体胖瘦程度。BMI中国标准如下表所示。

 
输入描述:

多组输入,每一行包括两个整数,用空格隔开,分别为体重(公斤)和身高(厘米)。

输出描述:

针对每行输入,输出为一行,人体胖瘦程度,即分类。

示例1
输入

80 170
60 170
90 160
50 185

输出

Overweight
Normal
Obese
Underweight

参考代码:

#include 
int main()
{
    float weight = 0.0;
    float hight = 0.0;
    while (scanf("%f %f", &weight, &hight) != EOF)
    {
        float bmi = weight / (hight * hight / 100 / 100);
        if (bmi < 18.5)
            printf("Underweight\n");
        else if (bmi >= 18.5 && bmi <= 23.9)
            printf("Normal\n");
        else if (bmi > 23.9 && bmi <= 27.9)
            printf("Overweight\n");
        else 
            printf("Obese\n");
    }
    return 0;
}

答案解析:

1. 多组输入
2. 浮点数除法要保证除号的两端至少有一个浮点数
 

BC53-计算一元二次方程

https://www.nowcoder.com/practice/7da524bb452441b2af7e64545c38dc26?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

从键盘输入a, b, c的值,编程计算并输出一元二次方程ax2 + bx + c = 0的根,

当a = 0时,输出“Notquadratic equation”,

当a ≠ 0时,根据△ = b2 - 4ac的三种情况计算并输出方程的根。

输入描述:

多组输入,一行,包含三个浮点数a, b, c,以一个空格分隔,表示一元二次方程ax2 + bx + c = 0的系数。

输出描述:

针对每组输入,输出一行,输出一元二次方程ax2 + bx +c = 0的根的情况。

  如果a = 0,输出“Not quadratic equation”;

  如果a ≠  0,分三种情况:

△ = 0,则两个实根相等,输出形式为:x1=x2=...

△  > 0,则两个实根不等,输出形式为:x1=...;x2=...,其中x1  <=  x2。

△  < 0,则有两个虚根,则输出:x1=实部-虚部i;x2=实部+虚部i,即x1的虚部系数小于等于x2的虚部系数,实部为0时不可省略。实部= -b / (2*a),虚部= sqrt(-△ ) / (2*a)

所有实数部分要求精确到小数点后2位,数字、符号之间没有空格。
示例1
输入

2.0 7.0 1.0

输出

x1=-3.35;x2=-0.15

示例2
输入

0.0 3.0 3.0

输出

Not quadratic equation

示例3
输入

1 2 1

输出

x1=x2=-1.00

示例4
输入

2 2 5

输出

x1=-0.50-1.50i;x2=-0.50+1.50i

示例5
输入

1 0 1

输出

x1=0.00-1.00i;x2=0.00+1.00i

参考代码:

#include 
#include 

int main()
{
    float a = 0.0;
    float b = 0.0;
    float c = 0.0;
    while (scanf("%f %f %f", &a, &b, &c) != EOF)
    {
        if (a != 0)
        {
            float disc = b * b - 4 * a * c;
            if (disc > 0.0)
                printf("x1=%.2f;x2=%.2f\n",(-b - sqrt(disc)) / (2 * a),(-b + sqrt(disc)) / (2 * a));
            else if (disc < 0.0)
                printf("x1=%.2f-%.2fi;x2=%.2f+%.2fi\n",(-b) / (2 * a), sqrt(-disc) / (2 * a),(-b) / (2 * a), sqrt(-disc) / (2 * a));
            else
                printf("x1=x2=%.2f\n", (-b) / (2 * a));
        }
        else
            printf("Not quadratic equation\n");
    }
    return 0;
}

答案解析:

1. 多组输入
2. 根据不同的限制条件给出相应的计算结果
3. 小点数后位数有限制
 

BC54-获得月份天数

https://www.nowcoder.com/practice/13aeae34f8ed4697960f7cfc80f9f7f6?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。

输入描述:

多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。

输出描述:
针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。

示例1
输入

2008 2

输出

29

参考代码:

//普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年(如2004年、2020年就是闰年)。
//世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)。
#define _CRT_SECURE_NO_WARNINGS
#include
int IsLeapYear(int n)
{
    if (((n % 4 == 0) && (n % 100 != 0)) || (n % 400 == 0))
        return 1;
    else
        return 0;
}

int main()
{
    int year = 0;
    int month = 0;
    while (scanf("%d %d", &year, &month) != EOF)
    {
        switch (month)
        {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:printf("31\n");
            break;
        case 2:if (IsLeapYear(year))
        {
            printf("29\n");
            break;
        }
              else
        {
            printf("28\n");
            break;
        }
        case 4: case 6: case 9: case 11:printf("30\n");
            break;
        }
    }
    return 0;
}
#include 
int main()
{
    int y = 0;
    int m = 0;
    int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    while (scanf("%d%d", &y, &m) != EOF)
    {
        int day = days[m - 1];
        if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
        {
            if (m == 2)
                day += 1;
        }
        printf("%d\n", day);
    }
    return 0;
}

代码解析:

1. 多组输入
2. 判断闰年,如果是闰年,2月多一天,其他都正常。
 

BC55-简单计算器

https://www.nowcoder.com/practice/b8f770674ba7468bb0a0efcc2aa3a239?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

KiKi实现一个简单计算器,实现两个数的“加减乘除”运算,用户从键盘输入算式“操作数1运算符操作数2”,

计算并输出表达式的值,如果输入的运算符号不包括在(+、-、*、/)范围内,输出“Invalidoperation!”。

当运算符为除法运算,即“/”时。如果操作数2等于0.0,则输出“Wrong!Division by zero!”

输入描述:

多组输入,一行,操作数1运算符操作数2(其中运算符号包括四种:+、-、*、/)。
输出描述:
针对每组输入,输出为一行。

如果操作数和运算符号均合法,则输出一个表达式,操作数1运算符操作数2=运算结果,各数小数点后均保留4
位,数和符号之间没有空格。

如果输入的运算符号不包括在(+、-、*、/)范围内,输出“Invalid operation!”。当运算符为除法运
算,即“/”时。

如果操作数2等于0.0,则输出“Wrong!Division by zero!”。

示例1
输入

1.0+3.0
1.0;4.0
44.0/0.0

输出

1.0000+3.0000=4.0000
Invalid operation!
Wrong!Division by zero!

参考代码:
精度尽量保持高
这个题使用float精度不满足要求

#include
int main()
{
    double left=0.0;
    double right=0.0;
    char oper=0;
    while(scanf("%lf%c%lf",&left,&oper,&right)!=EOF)
    {
        switch(oper)
        {
            case '+':
                printf("%.4f%c%.4f=%.4f",left,oper,right,left+right);
                break;
            case '-':
                printf("%.4f%c%.4f=%.4f",left,oper,right,left-right);
                break;
            case '*':
                printf("%.4f%c%.4f=%.4f",left,oper,right,left*right);
                break;
            case '/':
                if(right!=0.0)
                {
                    printf("%.4f%c%.4f=%.4f",left,oper,right,left/right);
                    break;
                }
                else
                {
                    printf("Wrong!Division by zero!");
                    break;
                }
            default:
                printf("Invalid operation!");
   				break;
        }
    }
    return 0;
}

代码解析:

1. 多组输入
2. 按照格式接收,按照要求编写代码就行
3. switch语句
 

BC56-线段图案

https://www.nowcoder.com/practice/a95744270f274a14a8a0dafe10421589?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的线段图案。

输入描述:

多组输入,一个整数(1~100),表示线段长度,即“*”的数量。

输出描述:

针对每行输入,输出占一行,用“*”组成的对应长度的线段。

示例1
输入

10
2

输出

**********
**

#include 
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;
        for (i = 0; i < n; i++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

答案解析:

1. 多组输入
2. 每次打印一个*,按照输入的个数打印后换行就行
 

BC57-正方形图案

https://www.nowcoder.com/practice/1304bb23c2e344989d5c7a578d263e4c?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的正方形图案。

输入描述:

多组输入,一个整数(1~20),表示正方形的长度,也表示输出行数。

输出描述:

针对每行输入,输出用“*”组成的对应边长的正方形,每个“*”后面有一个空格。

示例1
输入

4

输出

* * * *
* * * *
* * * *
* * * *

示例2
输入

5

输出

* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
 
参考代码:
 

#define _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;
        int j = 0;
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

答案解析:

1. 多组输入
2. 每组是由n组*+空格组成
 

BC58-直角三角形图案

https://www.nowcoder.com/practice/00dd93f7c7074754b7511bf56d1f15ac?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的直角三角形图案。

输入描述:

多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。

输出描述:

针对每行输入,输出用“*”组成的对应长度的直角三角形,每个“*”后面有一个空格。

示例1
输入

4

输出

*
* *
* * *
* * * *

示例2
输入

5

输出

*
* *
* * *
* * * *
* * * * *

参考代码:

#include
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;
        //控制行数
        for (i = 1; i <= n; i++)
        {
            //每一行
            int j = 0;
            for (j = 1; j <= i; j++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

答案解析:

1. 多组输入
2. 每一行的输出要有计算清楚
 

BC59-翻转直角三角形图案

https://www.nowcoder.com/practice/2cdea429fa414fbba26e6c821724ca06?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的翻转直角三角形图案。

输入描述:

多组输入,一个整数(2~20),表示翻转直角三角形直角边的长度,即“*”的数量,也表示输出行数。

输出描述:

针对每行输入,输出用“*”组成的对应长度的翻转直角三角形,每个“*”后面有一个空格。

示例1
输入

5

输出

* * * * *
* * * *
* * *
* *
*

示例2
输入

6

输出

* * * * * *
* * * * *
* * * *
* * *
* *
*

参考代码:

#include 
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;
        for (i = n; i >= 1; i--)
        {
            int j = 0;
                for (j = i; j >= 1; j--)
                {
                    //这里注意空格
                    printf("* ");
                }
            printf("\n");
        }
    }
    return 0;
}

答案解析:

1. 多组输入
2. 每两个*中间有空格,要注意
3. 控制好一行输出的内容
 

BC60-带空格的直角三角形

https://www.nowcoder.com/practice/192d1039c3d44155bb868073f5482670?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的带空格直角三角形图案。

输入描述:

多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。

输出描述:

针对每行输入,输出用“*”组成的对应长度的直角三角形,每个“*”后面有一个空格。

示例1
输入

5

输出

        * 
      * * 
    * * * 
  * * * * 
* * * * *

示例2
输入

4

输出

      * 
    * * 
  * * * 
* * * *

参考代码:

//代码1-常规写法
#include 
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;
        //行数控制
        for (i = 0; i < n; i++)
        {
            //空格
            int j = 0;
            for (j = 0; j < n - 1 - i; j++)
            {
                printf("  ");
            }
            //*
            for (j = 0; j <= i; j++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}
//代码2
#include 
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;
        int j = 0;
        //行数
        for (i = 0; i < n; i++)
        {
            //一行
            for (j = 0; j < n; j++)
            {
                //行和列的和
                //这里可以把行数和列数标出来就能看明白
                if (i + j < n - 1)
                {
                    printf("  ");
                }
                else
                {
                    printf("* ");
                }
            }
            printf("\n");
        }
    }
    return 0;
}


答案解析:

1. 多组输入
2. 方法2中i+j 在红色三角范围内的每个坐标上,横纵坐标之和小于n-1的。
 

BC61-金字塔图案

https://www.nowcoder.com/practice/d84e8339f9444bb6b29bd3f227c8e538?tpId=107&rp=1&ru=%2Fta%2Fbeginner-programmers&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking

题目描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的金字塔图案。

输入描述:

多组输入,一个整数(2~20),表示金字塔边的长度,即“*”的数量,,也表示输出行数。

输出描述:

针对每行输入,输出用“*”组成的金字塔,每个“*”后面有一个空格。

示例1
输入

4

输出

   *
  * *
 * * *
* * * *

示例2
输入

5

输出   

    *
   * *
  * * *
 * * * *
* * * * *

参考代码:

#include 
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;
        for (i = 0; i < n; i++)
        {
            //一行
            int j = 0;
            //空格
            for (j = 0; j < n - 1 - i; j++)
            {
                printf(" ");
            }
            //*
            for (j = 0; j <= i; j++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

答案解析:

1. 多组输入
2. 每一行的前边应该是空格,后边是*+空格,控制好个数就行
 

你可能感兴趣的:(C语言编程入门之刷题篇)