2019-02-24 计算机二级C语言之课后习题(1)

题目来源:高教版《全国计算机等级考试二级教程——C语言程序设计》

P35 编程和改错题

3.16

题目:

以下程序多处有错。若必须按下面的形式输入数据,并且必须按下面指定的形式输出数据,请对该程序做相应的修改。

main
{
    double a, b, c, s, v;
    printf("input a, b, c:\n);
    scanf("%d %d %d", a, b, c);
    a = a * b;
    v = a * b * c;
    printf("%d %d %d", a, b, c);
    printf("s = %f\n", s, "v = %d\n", v);
}

当程序执行时,屏幕的显示和要求输入形式如下:

input a, b, c:2.0 2.0 3.0

a = 2.000000, b = 2.000000, c = 3.000000

s = 4.000000, v = 12.000000

解答:

原程序中错误的地方如注释所述:

//缺少#include <stdio.h>
main //漏掉了main()函数的括号
{   double a, b, c, s, v;
    printf("input a, b, c:\n); //换行符导致输出与要求的输出不符,要求的输出中这里是不换行的
    scanf("%d %d %d", a, b, c); //格式字符错误,double类型应该使用%lf,而且还漏了取址运算符“&”
    a = a * b;
    v = a * b * c;
    printf("%d %d %d", a, b, c); //格式字符错误。此外,这里应该加上a,b,c和一个换行符,否则与要求的输出格式不同
    printf("s = %f\n", s, "v = %d\n", v); //格式控制错误,应该写在一起。此外,也不应有换行符
}

正确的程序如下:

(左大括号独占一行、第二行main函数的写法“int main (void);”和最后的“return 0;”与教材上的不一样,这是我的个人习惯,按照教材上的左大括号后不换行、写“main ( )”以及不写return 0;也是可以通过编译的。)

#include <stdio.h>
int main(void)
{
    double a, b, c, s, v;
    printf("input a, b, c:");
    scanf("%lf %lf %lf", &a, &b, &c);
    s = a * b;
    v = a * b * c;
    printf("a = %lf, b = %lf, c = %lf\n", a, b, c);
    printf("s = %lf,v = %lf\n", s, v);
    return 0;
}

输出:

与题目要求的输出格式相同。

3.17

题目:

编写程序,把560分钟换算成用小时和分钟表示,然后分别进行输出。

解答:

题目的意思应该是要求把560分钟换算成x小时x分钟,再输出。换算过程可以用除法和求模来完成。

程序如下:

#include <stdio.h>
int main(void)
{
    int minute = 560;
    int minute1, hour = 0;
    hour = minute / 60; //计算换算后的小时
    minute1 = minute % 60; //计算换算后的分钟
    printf("560 minutes = %d h %d min", hour, minute1); //输出换算后的小时和分钟
    return 0;
}

输出:

560 minutes = 9 h 20 min

3.18

题目:

编写程序,输入两个整数:1500和350,求出它们的商和余数并进行输出。

解答:

这题跟上面那题有点像,用同样的方法来实现就可以。

程序如下:

#include <stdio.h>
int main(void)
{
    int a = 1, b = 1, s = 1, ys = 1;
    printf("请输入两个整数:");
    scanf("%d %d",&a, &b);
    s = a / b; //求两数之商
    ys = a % b; //求余数
    printf("%d和%d的商为:%d,余数为:%d\n",a,b, s, ys);
    return 0;
}

输入和输出:

C语言课后习题-2.png

3.19

题目:

编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。

解答:

程序如下:

#include <stdio.h>
int main(void)
{
    double a = 1.0, b = 1.0, c = 1.0, answer = 1.0; 
    printf("请输入三个浮点数:");
    scanf("%lf %lf %lf", &a, &b, &c); 
    answer = (a + b + c) / 3; //进行求平均值的运算
    printf("answer = %.2lf", answer); //用“.2”控制输出数据所占的宽度,实现保留一位数并将第二位进行四舍五入的功能
    return 0;
}

输出:


3.20

题目:

编写程序,读入三个整数给a、b、c,然后交换它们中的数,把a中原来的值给b,把b中原来的值给c,把c中原来的值给a,然后输出a、b、c。

解答:

要实现三个整数的值互相交换,除了要定义这三个整数a,b,c之外还需要另外再定义两个整数d和e。首先把a的值存在d中,把b的值存在e中,再把c的值给a,d(也就是原来的a)的值给b,最后把e(原来的b)的值给c。

程序如下:

#include <stdio.h>
int main(void)
{
    int a = 0, b = 0, c = 0, d = 0, e = 0; 
    printf("请输入三个整数:");
    scanf("%d %d %d",&a, &b, &c); //输入三个整数:a,b,c
    printf("输入的值为:a = %d, b = %d, c = %d\n",a, b, c); //输出原始值
    //以下五行进行三个数值的交换
    d = a;
    e = b;
    a = c;
    b = d;
    c = e;
    printf("交换后的值为:a = %d, b = %d, c = %d\n",a, b, c); //输出交换后的值
    return 0;
}

输入和输出:

P49 编程题

4.21

题目:

若a的值小于100,请将以下选择结构改写成由switch语句构成的选择结构。

if (a < 30)
    m = 1;
else if (a < 40)
    m = 2;
else if (a < 50)
    m = 3;
else if (a < 60)
    m = 4;
else
    m = 5;

改写后的switch语句如下:

(虽然放入完整的程序中能通过编译而且输出正确但是这段语句是不是最优的改写方法不能确定,如果有更好的实现方法的话欢迎大佬指正。)

switch (a / 10)
{
    case 0:
        m = 1;
        break;
    case 1:
        m = 1;
        break;
    case 2:
        m = 1;
        break;
    case 3:
        m = 2;
        break;
    case 4:
        m = 3;
        break;
    case 5:
        m = 4;
        break;
    default:
        m = 5;
        break;
}

4.22

题目:

编写程序,输入一位学生的生日(年:y0、月:m0、日:d0),并输入当前的日期(年:y1、月:m1、日:d1),输出该生的实际年龄。

解答:

基本思路是,首先求当前年份和生日年份的差,如果小于0,则输出“错误”。

如果当前年份和生日年份的差大于零,判断当前月份和生日月份的差,如果大于零,判断当前日期和生日日期的差,如果也大于零,则生日就是当前年份和生日年份的差。如果这两项有一项小于零,就将当前年份和生日年份减1作为该生的实际年龄。

(在我的这个程序里,把当前日期是生日当天的情况也算作实际年龄为当前年份和实际年份减1,如果不要这么算的话要再加一个if语句,也是可以实现的,看对题目的理解了。)

#include <stdio.h>
int main(void)
{
    int y0 = 2000, m0 = 1, d0 = 1, y1 = 2000, m1 = 1, d1 = 1, y2 = 1, m2 = 1, d2 = 1;
    printf("请输入生日:\n");
    scanf("%d %d %d", &y0, &m0, &d0);
    printf("请输入当前日期:\n");
    scanf("%d %d %d", &y1, &m1, &d1);
    y2 = y1 - y0; //求当前年份和生日年份的差
    if (y1 - y0 < 0) //判断当前年份和生日年份的差是否小于0
        printf("错误\n");
    else if (m1 - m0 > 0) //判断当前月份和生日月份的差是否小于0
        printf("该生的实际年龄为:%d\n", y2); 
    else if (d1 - d0 > 0) //判断当前日期和生日日期的差是否小于0
        printf("该生的实际年龄为:%d\n", y2);
    else
    {
        y2--; 
        printf("该生的实际年龄为:%d\n", y2);
    }
    return 0;
}

输入和输出:

4.23

题目:

编写程序,输入一个整数,打印出它是奇数还是偶数。

解答:

很简单的题,用一个求模运算和一个if语句就可以完成。

程序如下:

#include <stdio.h>
int main(void)
{
    int a = 0, b = 0;
    scanf_s("%d", &a);
    b = a % 2;
    if (b != 0) //利用该数除以2的余数是否为0来判断该数是奇数还是偶数
        printf("它是奇数。\n");
    else
        printf("它是偶数。\n");
    return 0;
}

输入和输出如下:

4.24

题目:

编写程序,输入a、b、c三个数,打印出最大者。

解答:

很简单,用两条不嵌套的if语句就可以实现。

程序如下:

#include <stdio.h>
int main(void)
{
    int a = 0, b = 0, c = 0;
    scanf("%d %d %d", &a, &b, &c);
    int d = a;
    if (c > d)
        d = c;
    if (b > d)
        d = b;
    printf("最大的数为:%d", d);
    return 0;
}

输入和输出如下:

4.25

题目:

对于以下函数:
\begin{cases} x\quad(-5<x<0)\\ x-1\quad(x=0)\\ x+1\quad(0<x<10)\\ \end{cases}
编写程序,要求输入x的值,输出y的值。分别用:

  1. 不嵌套的if语句
  2. 嵌套的if语句
  3. if-else语句
  4. switch语句

解答:

不嵌套的if语句:

#include <stdio.h>
int main(void)
{
    int x = 0, y = 0;
    scanf("%d", &x);
    if (-5 < x && x < 0)
        y = x;
    if (x == 0)
        y = x - 1;
    if (0 < x && x < 10)
        y = x + 1;
    printf("%d", y);
    return 0;
}

嵌套的if语句:

#include <stdio.h>
int main(void)
{
    int x = 0, y = 0;
    scanf("%d", &x);
    if (x <= 0 && x > -5)
    {
        if (x < 0)
            y = x;
        if (x == 0)
            y = x - 1;
    }
    else
        y = x + 1;
    printf("%d", y);
    return 0;
}

if-else语句:

#include <stdio.h>
int main(void)
{
    int x = 0, y = 0;
    scanf("%d", &x);
    if (x > 0)
        y = x + 1;
    else if (x < 0)
            y = x;
    else 
            y = x - 1;
    printf("%d", y);
    return 0;
}

switch语句:

#include <stdio.h>
int main(void)
{
    int x = 0, y = 0, z = 0;
    scanf("%d", &x);
    z = x < 0 ? 2 : 3;
    z = x == 0 ? 1: 3;
    switch ( z )
    {
    case 1:
        y = x - 1;
break;
    case 2:
        y = x;
        break;
    default:
        y = x + 1;
        break;
    }
    printf("%d", y);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容