大学教材《C语言程序设计》(浙大版)课后习题解析 | 第三、四章

news2024/11/17 15:37:34

概述

      本文主要提供《C语言程序设计》(浙大版) 第三、四章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第五、六章节课后习题解析,如想了解更多,请持续关注该专栏。

专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客icon-default.png?t=N7T8http://t.csdnimg.cn/ZtcgY

一.第三章(分支结构)

选择题

[3-1]

有一函数 以下程序段中错误的是( )。

A.

if(x>0)y=1;
else if(x==0)y=0;
else y=-1;

B.

y=0;
if(x>0)y=1;
else if(x<0)y=-1;

C.

y=0;
if(x>=0);
if(x>0)y=1;
else y=-1;

D.

if(x>=0)
    if(x>0)y=1;
    else y=0;
else y=-1;

答:C

解析:根据函数, x 大于 0 ,y 的值为 1 。x 等于 0,y 的值为 0,x 小于 0,y 的值为 -1。选项 A,B,D 代码均正确。

[3-2]

对于变量定义: int a, b=0; 下列叙述中正确的是( )。

A. a 的初始值是 0,b 的初始值不确定

B. a 的初始值不确定,b 的初始值是 0

C. a 和 b 的初始值都是 0

D.a 和 b 的初始值都不确定

答:B

解析:定义变量时,没有给a赋值,所以 a 的初始值不确定。b 的值赋值为 0 。

[3-3]

下列程序段的输出结果是( )。

int a=3,b=5;
if(a=b)printf("%d=%d",a,b);
else printf( "%d!=%d",a,b);

A.5=5

B.3=3

C.3!=5

D.5!=3

答:A

解析:a 的初始值为 3 ,b 的值为 5 。执行 if 语句的条件,为赋值语句。赋值语句作为判断条件是什么意思呢?它并不是以是否赋值成功作为 true 和 false 的判断机制,而是看赋值的值是多少,如果为 0 自动就作为 false了。这里赋值为 5 。执行 if 里的语句。所以答案为选项A。

[3-4]

能正确表示逻辑关系“a≥10或a≤0"的C语言表达式是( )。

A. a>=10 or a<=0

B. >=0 | a<= 10

C. a>=10 && a<=0

D. a>=10lla<=0

答:D

解析:a 大于等于 10,表示为 a>=10,a 小于等于 0,表示为 a<=0,使用的是关系运算符。中间的或使用逻辑运算符||,所以答案为选项D。

[3-5]

下列叙述中正确的是( )。
A. break 语句只能用于 switch 语句

B.在 switch 语句中必须使用 default

C. break 语句必须与 switch 语句中的 case 配对使用

D.在 switch 语句中,不一定使用 break 语句

答:D

解析:

选项 A 中,break 语句还可以用于循环语句中,表示强制结束循环。

选项 B 中,在 switch 语句中,default 是可选的,可以有,也可以没有。

选项 C 中,break 语句可以用于循环语句,for,while,do-while 等语句中。

选项 D ,正确。

[3-6]

在嵌套使用 if 语句时,C 语言规定 else 总是( )。


A.和之前与其具有相同缩进位置的 if 配对

B.和之前与其最近的 if 配对

C.和之前与其最近的且不带 else 的if配对

D.和之前的第一个 if 配对

答:C

解析:

else 和 if 的匹配准则:else 与最靠近它的,而且没有与别的 else 匹配过的 if 相匹配。所以答案选择C。

[3-7]

下列程序段的输出结果是( )。

int a=2, b=-1, c=2;
if(a<b)
    if(b<0) c≈0;
    else c++;
printf( "%d\n", c);

A.2

B.1

C.0

D.3

答:A

解析:

a 的初始值为 2,b 的初始值为 -1,c 的初始值为 2。外层 if 语句的条件为 a<b ,这里条件不成立,那么直接结束这个 if 语句,执行最后的打印语句,打印 c 的值为 2。

[3-8]

在执行以下程序段时,为使输出结果为 t=4,则给 a 和 b 输入的值应满足的条件是( )。

int a, b, s, t;
scanf("%d,%d", &a, &b);
s = 1;t = 1;
if (a > 0)    s = s + 1;
if (a > b)    t = s + t;
else if (a == b)    t = 5;
else t = 2 * s;
printf("t=%d\n", t);

A. a>b

B. 0<a<b

C. 0>a>b

D. a<b<0

答:B

解析:

按照选项B为条件,a 大于 0,那么会执行第一个 if 语句,那么执行 s=s+1 后,s 的值为 2 。而下面的为 t 赋值的语句,我们执行最后 else 中的就可以让 t 的值为 4 ,就需要让前面的 if 语句以及 else if 语句的条件都不成立,那么 a < b 即可。

填空题

[3-1]

执行以下程序段,若输入32,则输出( );若输入58,则输出( )。

int a;
scanf("%d", &a);
if(a>50) printf("%d", a);
if(a>40) printf("%d", a);
if(a>30) printf("%d", a);

答:32,585858

解析:

如果输入 32,那么 a 的值为 32,前面两个 if 语句条件不成立,最后一个成立,打印 32。

如果输入 58,那么 a 的值为 58,3 个 if 语句条件都成立,打印了 3 次 a 的值,所以 585858。

[3-2]

表示条件10<x<100或者x<0的C语言表达式是( )。


答:(x>10&&x<100)||x<0

解析:x 大于 10 并且小于 100。可以表示成 x>10 ,x<100 ,因为是并且的关系,所以中间使用逻辑运算符 与&& 来链接。和 x<0 的关系是或者,那么使用 或|| 来链接。

[3-3]

输出偶数。输入一个正整数 n ,再输入 n 个整数,输出其中的偶数。要求相邻偶数中间用一个空格分开,行末不得有多余空格。请填空。

char ch;
int first = 1, k, n, x;
scanf("%d", &n);
for (k = 1; k <= n; k++){
  scanf("%d", &x);
  if(__________){
    if(__________){
        printf("%d", x);
        __________;
    }else {
      __________;
    }
  }
}

答:

x % 2 == 0

first == 1

first = 0;

printf(" %d", x);

[3-4]

以下程序段的运行结果是( )。

int k=16;
switch(k%3) {
  case 0: print("zero");
  
  case 1: printf("one"); 
  
  case 2: printf("two");
  
}

答:onetwo

解析:siwtch 作用的数据是:k%3,结果为 1 。那么会匹配 case 1,打印 one ,没有 break 语句,后面的 case 2 的内容直接穿透执行,继续打印 two 。

[3-5]

找出 3 个整数中最大的数。输入3个整数,输出其中最大的数。请填空。

int a, b, c, max;
scanf("%d %d %d", &a, &b, &c);
if(a>b){
    if(a>c)    __________;
    else    __________;
}else {
    if(__________)    max=b;
    else    __________;
}
printf("The max is %d\n", max);

答:

max = a;

max = c;

b > c

max = c;

程序设计题

[3-1]

比较大小:输入 3 个整数,按从小到大的顺序输出。试编写相应程序。(上)


方法一答案代码:

#include <stdio.h>
int main()
{
    // (课后习题3.3.1)
    /*
    比较大小:输入 3 个整数,按从小到大的顺序输出。
    */
    int a, b, c;
    printf("input a,b,c:");
    scanf("%d%d%d", &a, &b, &c);
    if (a > b)
    {
        if (b > c)
        {
            printf("%d <= %d <= %d\n", c, b, a);
        }
        else
        {
            if (a > c)
                printf("%d <= %d <= %d\n", b, c, a);
            else
                printf("%d <= %d <= %d\n", b, a, c);
        }
    }
    else
    {
        if (a > c)
        {
            printf("%d <= %d <= %d\n", c, a, b);
        }
        else
        {
            if (b < c)
                printf("%d <= %d <= %d\n", a, b, c);
            else
                printf("%d <= %d <= %d\n", a, c, b);
        }
    }
    return 0;
}


运行结果:

比较大小:输入 3 个整数,按从小到大的顺序输出。试编写相应程序。(下)


方法二答案代码:

#include <stdio.h>
int main()
{
    // (课后习题3.3.1)
    /*
    比较大小:输入 3 个整数,按从小到大的顺序输出。
    */
    int a, b, c;
    int temp;
    printf("input a,b,c:");
    scanf("%d%d%d", &a, &b, &c);
    // 先比较a和b,让a中存储比较小的,b中存储较大的。
    if (a > b)
    { // 所以判断,如果a大于b,就交换a和b的值
        temp = a;
        a = b;
        b = temp;
    }
    // 然后比较a和c,如果a大于c,就交换a和c的值,此操作结束后,a存储3个数中最小值。
    if (a > c)
    {
        temp = a;
        a = c;
        c = temp;
    }
    // 最后,比较b和c
    if (b > c)
    {
        temp = b;
        b = c;
        c = temp;
    }
    // 按照a,b,c的顺序打印即可。
    printf("%d <= %d <= %d\n", a, b, c);
    return 0;
}


运行结果:

[3-2]

高速公路超速处罚:按照规定,在高速公路上行驶的机动车,超出本车道限速的 10% 则处 200 元罚款; 超出 50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。


答案代码:

#include <stdio.h>
int main()
{
    // (课后习题3.3.2)
    /*
    高速公路超速处罚:按照规定,在高速公路上行驶的机动车,
    超出本车道限速的 10% 则处 200 元罚款; 超出 50%,就要吊销驾驶证。
    */
    double n = 120, x;
    printf("input x(为车辆实际速度):");
    scanf("%lf", &x);
    if (x >= n * 1.1 && x < n * 1.5)
        printf("您已超速10%%,处罚款200元 \n");
    else if (x >= n * 1.5)
        printf("您已超速50%%,已吊销驾驶证 \n");
    else
        printf("您没有超速\n");
    return 0;
}


运行结果:

WX20220406-174642@2x

WX20220406-174650@2x

[3-3]

出租车计价:某城市普通出租车收费标准如下:起步里程为 3公里,起步费 10 元; 超过起步里程后 10 公里内,每公里 2 元; 超过 10 公里以上的部分加收 50% 的空驶补贴费,即每公里 3 元; 营运过程中,因路阻及乘客要求临时停车的,按每 5 分钟 2 元计收(不足 5 分钟则不收费)。运价计费尾数四舍五入,保留到元。编写程序,输入行驶里程(公里)与等待时间(分钟),计算并输出乘客应支付的车费(元)。


答案代码:

#include <stdio.h>
int main()
{
    
    double x, y=0.0;
    int t; //等待时间
    printf("输入行驶公里x(x>0),临时停车时间t:");
    scanf("%lf%d", &x, &t);
    if (x >= 3.0)
    {
        y += 10.0;
        if (x >= 13.0) //超过起步里程后10公里
            y += 10.0 * 2.0 + (x - 13.0) * 3.0;
        else //大于3公里但不超过13公里
            y += (x - 3.0) * 2.0;
    }
    else //不足三公里的按照起步价收费
        y = 10.0;
    // 加上等待时间
    if (t >= 5)
        y += t / 5.0 * 2;
    printf("金额 %f 元\n", y);
    y = (int)(y + 0.5);
    printf("乘客应支付的车费为:%.2lf 元\n", y);
    return 0;
}


运行结果:

[3-4]

统计学生成绩:输入一个正整数 n ,再输入 n 个学生的成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:大于或等于 90 分为 A ,小于 90 分且大于或等于 80 分为 B,小于 80 分且大于或等于 70 为 C,小于 70 分且大于或等于 60 为D,小于 60 分为E。试编写相应程序。


答案代码:

#include <stdio.h>
int main()
{
    int score, n, i, A = 0, B = 0, C = 0, D = 0, E = 0;
    printf("input n:");
    scanf("%d", &n);
    printf("输入 %d 个score(1~100):\n", n);
    for (i = 1; i <= n; i++)
    {
        scanf("%d", &score);
        printf("输入百分制成绩 %d 对应的五分制成绩为:", score);
        if (score >= 90)
        {
            putchar('A');
            putchar('\n');
            A++;
        }
        else if (score >= 80)
        {
            putchar('B');
            putchar('\n');
            B++;
        }
        else if (score >= 70)
        {
            putchar('C');
            putchar('\n');
            C++;
        }
        else if (score >= 60)
        {
            putchar('D');
            putchar('\n');
            D++;
        }
        else
        {
            putchar('E');
            putchar('\n');
            E++;
        }
    }
    printf("等级占比:A=%d, B=%d, C=%d, D=%d, E=%d\n", A, B, C, D, E);
    return 0;
}


运行结果:

[3-5]

三角形判断:输入平面上任意三个点的坐标(x1, y1)、(x2, y2)、(x3, y3),检验它们能否构成三角形。如果这 3 个点能构成一个三角形,输出周长和面积(保留 2 位小数); 否则,输出 “Impossible”。试编写相应程序。
提示:在一个三角形中,任意两边之和大于第三边。三角形面积计算公式如下:

,其中 s = (a+b+c)/2。

答案代码:

#include <stdio.h>
#include <math.h>
int main()
{
    double x1, y1, x2, y2, x3, y3, S, C, area, a, b, c;
    printf("输入三个点的坐标(x1,y1),(x2,y2),(x3,y3):");
    scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3);
    a = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
    b = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));
    c = sqrt(pow(x1 - x3, 2) + pow(y1 - y3, 2));
    if ((a + b > c) && (a + c > b) && (b + c > a) && (a - b < c) && (a - c < b) && (b - c < a))
    {
        C = a + b + c;
        S = (a + b + c) / 2.0;
        area = sqrt(S * (S - a) * (S - b) * (S - c));
        printf("此三角形的周长为 %.2lf, 面积为 %.2lf \n", C, area);
    }
    else
        printf("Impossible \n");
    return 0;
}

运行结果:

二.第四章(循环结构)

选择题

[4-1]

以下程序段( )不能实现求 s = 1+2+...+n-1。
A.

int i, n, s=0;
scanf("%d", &n);
for(i=1; i<n; i++){
  s=s+i;
}

B.

int i,n,s=0;
scanf("%d",&n);
for(i=1; i<=n-1;++i){
  s=s+i;
}

C.

int i,n, s≈0;
scanf("%d", &n);
for(i=n-1;i>0;i--){
  s=s+i;
}

D.

int i,n,s=0;
scanf("%d",&n);
for(i=n-1;i>0;++i){
  s=s+i;
}

答:D

解析:

选项 A、B、C 的代码都可以实现题目要求。但是选项 D 的代码执行起来是个死循环,i 的值从 n-1 开始,然后++i,循环的结束条件是 i>0,i 的值越加越大,一直大于 0,条件永远成立。实现的并不是从 1 累加到 n-1。

[4-2]

输入65 14 `<Enter>`,以下程序段的输出结果为( )。

int m, n;
scanf("%d%d", &m,&n);
while(m!=n) {
    while(m>n)    m=m-n;
    while(n>m)    n=n-m;
}
printf( "m=%d\n", m);

A. m=3

B. m=2

C. m=1

D. m=0

答:C

解析:

m 的初始值为 65,n 的初始值为 14。第一个while 的条件 m!=n,是成立的。执行里面的循环体。

第二个while 的条件 m >n,此时也是成立的,执行里面的循环体 m=m-n;执行后 m 的值为 51,因为是循环语句,要再次判断条件是否成立,m>n 依然成立,再执行一次循环体 m=m-n;执行后 m 的值为37。再次判断条件 m>n 依然成立,再一次执行循环体 m=m-n;执行后 m 的值为23。再次判断条件 m>n 依然成立,再一次执行循环体 m=m-n;执行后 m 的值为 9 。再次判断条件 m>n不成立,结束这个循环。

程序继续执行到第三个 while 循环,条件是 n>m,此时 m 的值为 9,n 的值为 14,条件成立,执行里面的循环体 n=n-m,执行后 n 的值为 5。再来判断循环条件 n>m,已经不成立了。结束这个循环。

此时里面的两个循环作为最外层的循环的循环体,结束这次执行之后,要再来判断最外层循环的条件 m!=n,此时 m 的值为 9,n 的值为 5。条件成立,要再次执行里面的循环体,就是两个里层循环。先看第二个循环条件 m>n,成立的,那吗执行里面的循环体 m=m-n,执行后 m 的值为 4,再来判断条件 m>n,已经不成立了,结束这个循环。

程序继续执行到第三个循环,条件是 n>m,此时 m 的值为 4,n 的值为 5,条件成立,执行里面的循环体 n=n-m,执行后 n 的值为 1。再来判断循环条件 n>m,已经不成立了。结束这个循环。

这两个循环执行结束后,要继续判断最外层的循环条件 m!=n,此时 m 的值为 4,n 的值为 1,条件成立,再次进去执行里面的两个内层循环。先来判断第二个循环条件 m>n,成立的,执行里面的循环体 m=m-n,执行后,m 的值为 3,再来判断条件 m>n,依然成立,执行里面的循环体 m=m-n,执行后,m 的值为2,再来判断条件 m>n,依然成立,执行里面的循环体 m=m-n,执行后,m 的值为 1。再来判断条件 m>n,此时已经不成立了。结束这个循环。

程序继续执行到第三个while循环,条件是 n >m,此时 m 的值为 1,n 的值也为 1。条件不成立,结束这个循环。

然后要再来判断外层循环的条件 m!=n,此时 m 的值为 1 ,n 的值也为 1。条件不成立,结束这个外层循环。

程序继续向下执行,打印输出语句,m 的值为 1。

[4-3]

C语言中 while 和 do-while 循环的主要区别是( )。


A. do-while 的循环体至少无条件执行一次

B. while 的循环控制条件比 do-while 的循环控制条件严格

C. do-while 允许从外部转到循环体内

D. do-while 的循环体不能是复合语句

答:A

解析:

while 循环是先判断条件,条件成立再执行循环体。

do-while 循环是先执行循环体,再判断条件是否成立。即使条件不成立,也已经执行一次循环体了。

[4-4]

下列叙述中正确的是( )。


A. break 语句只能用于 switch 语句体中

B. continue 语句的作用是使程序的执行流程跳出包含它的所有循环

C. break 语句只能用在循环体内和 switch 语句体内

D. 在循环体内使用 break 语句和 continue 语句的作用相同

答:C

解析:

break 语句可以使用在 switch 中。也可以使用在循环中,表示强制结束循环。

break 语句用在循环中表示强制结束循环,无论循环条件是否成立,循环都彻底的结束了。而 continue 语句,也是用于强制结束循环,但只是结束这一次循环,循环下次继续执行。

[4-5]

下列叙述中正确的是( )。


A. do-while 语句构成的循环不能用其他语句构成的循环来代替

B. do-while 语句构成的循环只能用 break 语句退出

C. 用 do-while 语句构成的循环,在 while 后的表达式为非零时结束循环

D. 用 do-while 语句构成的循环,在 while 后的表达式为零时结束循环

答:D

解析:

C 语言中的三种循环语句 for,while 和 do-while ,其实是可以互相替代的,只是写法不同。有些情况使用 for 循环比较方便,有些情况使用 while 比较方便,有些时候使用 do-while 比较方便。这三种循环的成立条件,都是非零,就会执行循环体。所以此题目的正确答案是选项 D。

[4-6]

下列程序段的输出结果是( )。

int i;
for(i=1; i<6; i++){
    if(i%2!=0){
        printf("#");
        continue;
  }
    printf("*");
}

A. #*#*#

B. #####

C. *****

D. *#*#*

答:A

解析:

此代码实现的是判断变量 i 的值,如果为奇数,打印 # , 如果为偶数,打印 * 。

变量 i 的初始值为1,循环条件为 i<6,成立里面的循环体,是一个 if 语句,继续判断 if 语句的条件,i%2!=0,也是成立的,打印一个 # ,然后执行 continue 语句,结束本次循环,不打印 * ,

然后执行 i++,此时 i 的值为 2 ,循环条件依然成立,判断 if 语句的条件,不成立,那么不执行 if 里的代码,跳过 if 语句执行后面的打印语句,打印出 *,

然后执行 i++,此时 i 的值为 3,循环条件依然成立,判断 if 语句的条件,成立的,执行 if 语句里的内容,打印 #,然后执行 continue,结束这次循环。

然后执行 i+=,此时 i 的值为 4,循环条件依然成立,判断 if 语句的条件,不成立,那吗不执行 if 里的代码,跳过 if 语句执行后面的打印语句,打印出 *,

然后执行 i++,此时 i 的值为 5,循环条件依然成立,判断 if 语句的条件,成立的,执行 if 语句里的内容,打印 #,然后执行 continue,结束这次循环。

然后执行 i++,此时 i 的值为 6,循环条件不成立了,结束 for 循环。

填空题

[4-1]

执行以下程序段后,变量 i 的值是( ),s 的值是( )。

int i, s=0;
for(i=1; i<=10: i=i+3)
    s=s+i;

答:13,22

解析:

变量 i 的初始值为 1,s 的初始值为 0。for 循环的条件是 i <= 10,

第一次循环:i 的值为 1,s 的值为 0,执行循环体的内容后,s 的值为 1。然后执行 i=i+3,然后 i 的值为 4。

第二次循环:i 的值为 4,s 的值为 1,执行循环体的内容后,s 的值为 5。然后执行 i=i+3,然后 i 的值为 7。

第三次循环:i 的值为 7,s 的值为 5,执行循环体的内容后,s 的值为12 。然后执行 i=i+3,然后 i 的值为 10。

第四次循环:i 的值为 10,s 的值为 12,执行循环体的内容后,s 的值为 22。然后执行 i=i+3,然后 i 的值为 13。

不再满足循环的条件了,循环结束。

[4-2]

下列程序段的输出结果是( )。

for(int i=14; i>1; i/=3)
    printf("%d#",i);

答:14#4#

解析:

变量 i 的初始值是 14,for 循环的条件是 i>1,

第一次循环:i 的值为 14,执行循环体的内容后,打印 14# 。然后执行 i/=3,然后 i 的值为 4。

第二次循环:i 的值为 4,执行循环体的内容后,打印 4# 。然后执行 i/=3,然后 i 的值为 1。

不再满足循环的条件了,循环结束。

[4-3]

以下程序段 A 的输出结果是( ),程序段 B 的输出结果是( )。
程序段 A

int num=0,s1=0;
while(num<=2) {
  num++;
  s1=s1+num;
}    
printf("s1=%d\n", s1);

程序段B

int num=0,s2=0;
while( num<=2) {
    s2=s2+num;
    num++;
}
printf("s2=%d\n",s2);

答:s1=6,s2=3

解析:

程序段 A:

变量 num 的初始值是0,s1 的初始值也是 0,while 循环的条件是 num<=2,

第一次循环,num 的值为 0,执行 num++ 后,num 的值为 1,然后执行 s1=s1+num 后,s1 的值为1,

第二次循环,num 的值为 1,执行 num++ 后,num 的值为 2,然后执行 s1=s1+num 后,s1 的值为3,

第三次循环,num 的值为 2,执行 num++ 后,num 的值为 3,然后执行 s1=s1+num 后,s1 的值为6,

再判断 while 循环的条件,不成立了,循环结束。

程序段 B:

变量 num 的初始值是0,s2 的初始值也是 0,while 循环的条件是 num<=2,

第一次循环,num 的值为 0,执行 s2=s2+num 后,s2 的值为 0 ,执行 num++ 后,num 的值为 1,

第二次循环,num 的值为 1,执行 s2=s2+num 后,s2 的值为 1 ,执行 num++ 后,num 的值为 2,

第三次循环,num 的值为 2,执行 s2=s2+num 后,s2 的值为 3 ,执行 num++ 后,num 的值为 3,

再判断 while 循环的条件,不成立了,循环结束。

[4-4]

求序列和。计算并输出 s=1+12+ 123+ 1234+12345 的值。请填空。

int i,s=0, t=0;
for(i=1; i<=5; i++){
  t=__________+i;
  s=s+t;
}
printf("s=%d\n", s);

答:t*10

解析:

循环中 i 的值是从 1 到 5。只要让 t 的值分别为 1,12,123,1234,12345即可。所以思考 t = ? 加 i。每次 ? 的值就该是 0,10,120,1230,12340 即可。

[4-5]

以下程序段A的输出结果是( ),程序段B的输出结果是( )。
程序段 A

int num=0;
while(num<6){
  num++;
  if(num==3) break;
  printf("%d#",num);
}

程序段 B

int num=0;
while(num<6) {
  num++;
  if(num==3) continue;
  printf("%d#",num);
}

答:1#2#,1#2#4#5#6#

解析:

这两段代码考察的是 break 和 continue 的用法的区别。

break 执行后,会彻底的结束循环。所以 num 的值为 3,满足条件后,整个循环就结束了,哪怕循环条件依然成立。打印到 num 的值为2。

continue 执行后,结束这次循环,但是循环还是会继续。所以 num 的值为 3,满足条件后,只是结束了这次循环,所以打印的时候,只是跳过了 3,后面的继续。

[4-6]

输入82pay! `<Enter>`, 以下程序段的输出结果为( )。

char ch;
int i;
for(i=1; i<=6; i++){
  ch=getchar(); 
  if(ch>='a' && ch<='z') ch=(ch+5-'a')%26+'a';
  else 1f(ch>='0' & ch<='9') ch=(ch+2-'0')%10+'0';
  putchar(ch);
}

答:04ufd!

解析:

这段代码实现的是将输入的自负,如果是数字,后移 2 位。如果是字母,后移 5 位。其他字符原样输出。

输入 8,输出 0。输入 2,输出 4。

输入 p,输出 u。输入 a,输出 f。输入 y,输出 d。输入 !,输出还是 !。

[4-7]

阅读下列程序段并回答问题。

  int i, j, k = 0, m = 0;
    for (i = 0; i < 2; i++){
        ; /*第3行*/
        for (j = 0; j < 3; j++)
            k++;
        m++; /*第6行*/
    }
    printf("k=%d, m=%d\n", k, m);

(1) 程序段的输出是( )

(2) 将第6行改为"m=m+k;", 程序段的输出是( )

(3) 将第3行改为"k=0;", 将第6行改为"m=m+k;",程序段的输出是( )

答:(1) k=6 m=2 (2) k=6 m=9 (3) k=3 m=6

解析:

(1)

变量 i 的初始值为 0,外层循环条件 i < 2,

外层循环第一次:i = 0,

​ 内层循环 j 的初始值为 0,内层循环条件 j<3,

​ 内层循环第一次:j = 0,满足条件,执行 k++ 后,k 的值为 1。然后执行 j++,j 的值为 1。

​ 内层循环第二次:j = 1,满足条件,执行 k++ 后,k 的值为 2。然后执行 j++,j 的值为 2。

​ 内层循环第三次:j = 2,满足条件,执行 k++ 后,k 的值为 3。然后执行 j++,j 的值为 3。

​ 不满足条件,结束内层循环。

​ 继续向下执行,到 m++,执行后,m 的值为 1。

​ 然后执行 i++,i 的值为 1。

外层循环第二次:i = 1,

​ 内层循环 重新执行 1 次。j 的值从 0 到 3。k 的值累加到 6。然后结束内层循环。继续向下执行,到 m++,执行后,m 的值为 2。然后执行 i++,i 的值为 2。

外层循环也结束了。最终 k 的值为 6,m 的值为 2。

(2) (3) 的分析同 (1) 一样。

[4-8]

输出方阵。输入一个正整数 n(1≤n≤10),打印一个 n 行 n 列的方阵。当 n=4 时,输出如下方阵。请填空。

13      14      15        16
 9      10      11        12
 5       6       7         8
 1       2       3         4
    int i, j, n;
    scanf("%d", &n);
    for (________; i >= 0; ________)
    {
        for (j = 1; j <= n; j++)
        {
            printf("%4d", ________);
        }
        printf("\n");
    }


答:i=n-1, i-- , 4*i+j

[4-9]

输出等腰三角形。输入一个正整数 n(1≤n≤9),打印一个高度为 n 且由`“*”`组成的等腰三角形图案。当 n=3 时,输出如下等腰三角形图案。请填空。

  *
 ***
*****
  int i, j, n;
    scanf("%nd", &n);
    for (i = 1; i <= n; i++)
    {
        for (________;  ________; ________)
        {
            printf(" ");
        }
        for (________;  ________; ________)
        {
            printf("*");
        }
        ________;
    }


答:j=1;j<=n-i;j++ j=1;j<=2*i-1;j++ printf("\n")

[4-10]

顺序输出整数的各位数字。输入一个非负整数,从高位开始逐位分割并输出它的各位数字。例如,输入9837,输出 9 8 3 7。请填空。

    int digit, number, pow, t_number;
    scanf("%d", &number);
    t_number = number;
    pow = 1;
    while (________)
    {
        pow = pow * 10;
        t_number = t_number / 10;
    }
    while (pow >= 1)
    {
        digit = ________;
        number = ________;
        pow = pow / 10;
        printf("%d ", digit);
    }
    printf("\n");


答:t_number/10!=0 number/pow number%pow

解析:

这里先将接收到的 number 的值,复制一份到 t_number 中。

第一个循环中获取的 pow 是为了获取 number的最大的权重(就是最高位的权重值)。比如123,最高位是 1,在百位上,权重就是 100。

第二个循环中,digit 是为了获取每个位上的数字。

程序设计题

[4-1]

求奇数和。输入一批正整数(以零或负数为结束标志),求其中的奇数和。试编写相应程序。

答案代码:

#include <stdio.h>
int main()
{
        int n, sum;
    printf("input n:\n");
    sum = 0;
    while (1)
    {
        scanf("%d", &n);
        if (n > 0)
        {
            if (n % 2 != 0)
            {
                sum += n; // 累加奇数
            }
        }else{
                  break;
            }
    }
    printf("奇数和为:%d\n", sum);
    return 0;
}


运行结果:

[4-2]

展开式求和。输入一个实数 x,计算并输出下式的和,直到最后一项的绝对值小于 0.000 01 ,计算结果保留 4 位小数。要求定义和调用函数 fact(n) 计算 n 的阶乘,可以调用 pow() 函数求幂。试编写相应程序。
  
 

答案代码:

#include <stdio.h>
#include <math.h>
double fact(int n);
int main()
{
    int n;
    double eps, x, s, item;
    eps = 0.00001;
    printf("input x:");
    scanf("%lf", &x);
    s = 0;
    item = 1;
    n = 1;
    while (fabs(item) >= eps)
    {
        s += item;
        item = pow(x, n) / fact(n);
        n++;
    }
    s = s + item;
    printf("结果为:%.4lf\n", s);
    return 0;
}
double fact(int n)
{
    int i;
    double result = 1;
    for (i = 1; i <= n; i++)
    {
        result *= i;
    }
    return result;
}


运行结果:

[4-3]

求序列和。输入一个正整数 n,输出 2/1+3/2+5/3+8/5+... 的前 n 项之和,保留 2 位小数。该序列从第 2 项起,每项的分子是前一项分子与分母的和,分母是前项的分子。试编写相应程序。

答案代码:

#include <stdio.h>
int main()
{
  int i,n;
    double x,x1,x2,sum =0;
  x1= 2;//分子
  x2= 1;//分母
  printf("input n:");
    scanf("%d", &n);
  for( i = 1;i <= n; i++){
    sum += x1 / x2;
    x = x1 + x2; // 临时存储:分子+分母,就是下一次的分子
    x2 = x1; // 下一次的分母,就是上次的分子
    x1 = x; // 下一次的分子
  }    
  printf("sum = %.2lf\n",sum);
    
    return 0;
}

运行结果:

[4-4]

和求序列和。输入两个正整数 a 和 n,求 a+aa+aaa+aa...a ( n 个 a ) 之和。例如,输入 2 和 3 ,输出246 ( 2+22+222 )。试编写相应程序。

答案代码:

#include <stdio.h>
int main()
{
  int i,a,b=0,n,sum =0;
  printf("input a,n:");
    scanf("%d%d", &a, &n);
  for(i=1;i<=n;i++){
    b = b*10+a;
    sum += b;
  }
  printf("sum = %d\n",sum);
  
    return 0;
}

运行结果:

[4-5]

换硬币。将一笔零钱(大于 8 分,小于 1 元,精确到分 ) 换成 5 分,2 分和 1 分的硬币,每种硬币至少有一枚。输入金额,问有几种换法? 针对每种换法, 输出各种面额硬币的数量和硬币的总数量。试编写相应程序。

答案代码:

#include <stdio.h>
int main()
{
    int m, n1, n2, n5, total = 0, count = 0;
    printf("input m:");
    scanf("%d", &m);
    if (m <= 8 || m >= 100)
    {
        printf("Invalid!\n");
    }
    else
    {
        for (n5 = 1; n5 <= m; n5++)
        {
            for (n2 = 1; n2 <= m; n2++)
            {
                for (n1 = 1; n1 <= m; n1++)
                {
                    if (n5 * 5 + n2 * 2 + n1 == m)
                    {
                        count++;
                        printf("5分有 %d 个,2分有 %d 个,1分有 %d 个,总共有 %d 个\n", n5, n2, n1, n5 + n2 + n1);
                    }
                }
            }
        }
        printf("共有 %d 种算法\n", count);
    }
    return 0;
}

运行结果:

 [4-6]

输出水仙花数。输入一个正整数 n ( 3≤n≤7 ), 输出所有的 n 位水仙花数。水仙花数是指一个 n 位正整数,它的各位数字的 n 次幕之和等于它本身。 例如 153 的各位数字的立方和是1^3+5^3+3^3 =153。试编写相应程序。

答案代码:

#include <stdio.h>
#include <math.h>
int main()
{
    int n;
    do
    {
        printf("input n (3≤n≤7):");
        scanf("%d", &n);
    } while (n > 7 || n < 3);
    printf("水仙花数有:\n");
    int i = pow(10, n) - 1;
    int limit = pow(10,n-1);
    int digit, sum, s, m;
    while (i >= limit) 
    {
        sum = 0;
        s = i; 
        m = n;
        //循环获取每个位上的数字
        while (s != 0)
        {
            digit = s / (int)(pow(10, m - 1));
            s %= (int)(pow(10, m - 1));
            sum += pow(digit, n); // 每个位上的数字的n次方和
            m--;
        }
        if (sum == i)
        {
            printf("%d\t", i);
        }
        i--;
    }
    printf("\n");
    return 0;
}

运行结果:

[4-7]

求最大公约数和最小公倍数。输入两个正整数 m 和 n (m≤1000, n≤1000 ),求其最大公约数和最小公倍数。试编写相应程序。

答案代码:

#include <stdio.h>
int main()
{
    int m, n, i, j;
    printf("input m,n:");
    scanf("%d%d", &m, &n);
    if (m <= 0 || n <= 0 || m > 1000 || n > 1000)
    {
        printf("Invalid!\n");
    }
    for (i = m < n ? m : n; i >= 1; i--)
    {
        if (m % i == 0 && n % i == 0)
        {
            printf("gcd = %d\n", i); // 最大公约数
            break;
        }
    }
    j = m / i * n;
    printf("lcm = %d\n", j); // 最小公倍数
    return 0;
}

运行结果:

[4-8]

打印菱形星号 `"*"` 图案。输入一个正整数 n (n 为奇数),打印一个高度为 n 的 `"*"` 菱形图案。例如,当 n 为 7 时,打印出以下图案。试编写相应程序。
 

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

答案代码:

#include <stdio.h>
#include <math.h>
int main()
{
    int i, j, n, k;
    printf("input odd number n:");
    scanf("%d", &n);
    k = (n + 1) / 2; // 计算菱形的边长
    // 上三角
    for (i = 1; i <= k; i++)
    {
        for (j = 1; j <= n - 2 * i + 1; j++) // 循环打印空格
        {
            printf(" ");
        }
        for (j = 1; j <= 2 * i - 1; j++)
        {
            printf("* "); // 循环打印*
        }
        printf("\n");
    }
    // 下三角
    for (i = 1; i < k; i++)
    {
        for (j = 1; j <= i * 2; j++) // 打印空格
        {
            printf(" ");
        }
        for (j = 1; j <= n - 2 * i; j++)
        {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

运行结果:

[4-9]

输出等腰三角形。输入一个正整数 n(1≤n≤9),打印一个高度为 n 且由`“*”`组成的等腰三角形图案。当 n=3 时,输出如下等腰三角形图案。请填空。
 

  *
 ***
*****
  int i, j, n;
    scanf("%nd", &n);
    for (i = 1; i <= n; i++)
    {
        for (________;  ________; ________)
        {
            printf(" ");
        }
        for (________;  ________; ________)
        {
            printf("*");
        }
        ________;
    }


答:j=1;j<=n-i;j++ j=1;j<=2*i-1;j++ printf("\n")

[4-10]

猴子吃桃问题。一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个; 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第 n 天早上想再吃时,只剩下一个桃子了。问:第一天共摘了多少个桃子? 试编写相应程序。(提示:采取逆向思维的方法,从后往前推断)
 

答案代码:

#include <stdio.h>
int main()
{
    int i, n, sum;
    printf("input n:");
    scanf("%d", &n);
      sum = 1;//最后一天的
    for (i = 1; i < n; i++) //循环n-1天
    {                            
        sum =  (sum + 1) * 2; //前一天的桃子数(第一天的)=(吃剩下的(第2天的桃子数)+1)*2
    }
    printf("第一天摘桃 %d 个\n", sum);
    return 0;
}

运行结果:

[4-11]

兔子繁衍问题。一对兔子,从出生后第 3 个月起每个月都生一对兔子。小兔子长到第 3 个月后每个月又生一对兔子。假如兔子都不死,请问第 1 个月出生的一对兔子,至少需要繁衔到第几个月时兔子总数才可以达到 n 对? 输入一个不超过10 000的正整数 n ,输出兔子总数达到 n 最少需要的月数。试编写相应程序。


答案代码:

#include <stdio.h>
int main()
{
    int n, m, c;
    int f1 = 1, f2 = 1;
    printf("input n (n<=10000):");
    scanf("%d", &n);
    if (n < 2)
    {
        printf("想要 %d 对兔子,至少 1 个月,可以产出 1 对兔子 \n", n);
    }
    else
    {
        m = 2; //月份
        c = 0; //当前月的兔子数
        while (c < n)
        {
            m++;// 3月
            c = f1 + f2; // 3月的兔子数
            // 为下一个月做准备,改变f1和f2的值
            f1 = f2;
            f2 = c;
        }
        printf("想要 %d 对兔子,至少 %d 个月,可以产出 %d 对兔子 \n", n, m, c);
    }
    return 0;
}

运行结果:

总结

      以上为本篇文章的所有内容,后续将更新各个章节课后习题解析,如想了解更多,请持续关注该专栏。如有疑问或提供意见,请指出,谢谢!!!

   文章内容参考: 程序咖

   如想观看讲解视频或解析请参考:C语言程序设计第4版(浙大版)何钦铭颜晖著 (chengxuka.cn)icon-default.png?t=N7T8https://www.chengxuka.cn/#/mooc/outline?_id=39&title=C%25E8%25AF%25AD%25E8%25A8%2580%25E7%25A8%258B%25E5%25BA%258F%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25AC%25AC4%25E7%2589%2588(%25E6%25B5%2599%25E5%25A4%25A7%25E7%2589%2588)%25E4%25BD%2595%25E9%2592%25A6%25E9%2593%25AD%25E9%25A2%259C%25E6%2599%2596%25E8%2591%2597

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1548424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】进阶学习:pandas--describe()函数的使用介绍

&#x1f40d;【Python】进阶学习&#xff1a;pandas——describe()函数的使用介绍 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…

抖音弹幕游戏开发:打造全新互动体验,引领潮流风尚

在数字科技迅猛发展的时代&#xff0c;抖音作为一款领先的短视频平台&#xff0c;始终走在创新的前沿。为了满足用户日益增长的互动需求&#xff0c;我们投入大量研发力量&#xff0c;成功推出了抖音弹幕游戏开发项目&#xff0c;旨在为用户带来一种全新的、沉浸式的互动体验。…

鸿蒙(HarmonyOS)Navigation如何实现多场景UI适配?

场景介绍 应用在不同屏幕大小的设备上运行时&#xff0c;往往有不同的UI适配&#xff0c;以聊天应用举例&#xff1a; 在窄屏设备上&#xff0c;联系人和聊天区在多窗口中体现。在宽屏设备上&#xff0c;联系人和聊天区在同一窗口体现。 要做好适配&#xff0c;往往需要开发…

Alpha律所管理系统,助力律师团队管理提效再升级

律师团队管理&#xff0c;是律所成长与发展经久不衰的议题。无论是律所的创办还是扩张&#xff0c;管理者首先要考虑的就是管理模式的选择与更新问题&#xff0c;这几乎成为一个律所能否长远发展的关键“七寸”。那么&#xff0c;到底为什么团队管理如此重要&#xff0c;做好管…

【实现100个unity特效之7】unity 3d实现各种粒子效果

文章目录 先看最终效果下雨效果萤火虫和火花四溅的效果 3d下雨粒子效果涟漪效果雨滴和涟漪效果结合水花效果雨滴涟漪水花结合问题雾气效果萤火虫火花效果萤火虫和火花效果结合其他特效爆炸、闪电、火焰、雷雨特效&#xff08;2023/7/5更新&#xff09;源码完结 先看最终效果 下…

冰岛人[天梯赛]

文章目录 题目描述思路AC代码 题目描述 输入样例 15 chris smithm adam smithm bob adamsson jack chrissson bill chrissson mike jacksson steve billsson tim mikesson april mikesdottir eric stevesson tracy timsdottir james ericsson patrick jacksson robin patrickss…

图片如何做成二维码?手机扫码看图的制作方法

现在用二维码来展示图片、照片时很常用的一种方式&#xff0c;通过扫秒二维码就能够在手机上预览图片&#xff0c;更加的方便快捷。在制作图片二维码的时候&#xff0c;有些情况下需要不定时的在二维码图案不变的情况经常性的修改内容&#xff0c;或者除了图片之外还要加入其它…

【数据结构】受限制的线性表——队列

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

最新版CleanMyMac X4.15.2有哪些亮眼的更新?

CleanMyMac X是一款专为macOS系统设计的清理和优化工具&#xff0c;它集成了多种功能来帮助用户保持Mac系统的整洁、高效和安全。 首先&#xff0c;CleanMyMac X具备智能扫描和清理功能&#xff0c;能够自动识别并清理Mac上的各种垃圾文件&#xff0c;包括重复文件、无用的语言…

《AI绘画与修图实战:Photoshop+Firefly从入门到精通》

关键点 1.自学教程&#xff1a;内容安排由浅入深、循序渐进&#xff0c;130多个经典AI案例案例助你在实战中掌握技巧 2.技术手册&#xff1a;透彻讲解PSAI、Firefly&#xff0b;AI的绘画和修图实战技巧&#xff0c;高效率学习 3.老师讲解&#xff1a;赠送170分钟频教程和数百个…

企业内推平台招聘信息采集与分析在线项目实习

师傅带练 项目背景 为了实现有效的招聘&#xff0c;企业需要制定明确的招聘需求&#xff0c;根据业务发展需求和市场变化&#xff0c;精准定位所需人才的类型和层次&#xff0c;提高招聘效率和质量。而招聘网站需要积极满足企业的需求&#xff0c;提供针对性的服务&#xff0…

c语言--跳出continue、break

C 语言中的 continue 语句有点像 break 语句。但它不是强制终止&#xff0c;continue 会跳过当前循环中的代码&#xff0c;强迫开始下一次循环。 对于 for 循环&#xff0c;continue 语句执行后自增语句仍然会执行。对于 while 和 do…while 循环&#xff0c;continue 语句重新…

【面试题】数据底层原理:Elasticsearch写入流程解析

前言&#xff1a;本篇博客将介绍Elasticsearch的数据底层原理&#xff0c;涉及数据写入的过程以及相关概念。我们将深入探讨buffer、translog、refresh、commit、flush和merge等核心概念&#xff0c;帮助您更好地理解Elasticsearch的数据存储机制。 写入数据的基本过程 Elast…

【牛客】【刷题节】美团2024届秋招笔试第一场编程真题

1.小美的外卖订单【简单题】 题意理解&#xff1a; 这道题是简单题&#xff0c;主要是一个逻辑实现和判断的问题。但是简单题一般喜欢加一点小障碍&#xff0c;所以读题的时候就要比较注意一些约束条件。就比如这道题&#xff1a;过了15/20个测试用例&#xff0c;出现error, 当…

蓝桥杯小白月赛3.23

题目描述&#xff1a; AC代码&#xff1a; #include <iostream> #include<cstring> #include<algorithm>using namespace std;const int N 2e510; string str[N]; //写上&会速度更快一些 bool cmp(const string &s1,const string &s2) {//例…

金色传说:SAP-PP-CO01/CO02生产订单释放时增强:检查并显示下层组件在不合格库存地库存

文章目录 需求场景一、实现的效果二、实现步骤1.创建自建表2.增强代码 三、重磅福利 需求场景 计划员释放订单时,如果下层组件在不合格库存中有库存时,应先确认不合格库存地库存是否可用,已避免重复生产和库存积压. 因此,提出此需求: 在生产订单下达(释放)时,要提示下层组件在…

七段码(蓝桥杯)

文章目录 七段码题目描述答案&#xff1a;80分析编程求解&#xff1a;有多种方法方法一&#xff1a;状态压缩枚举构图&#xff08;以二极管为顶点&#xff09;DFS判断连通代码方法二&#xff1a;bfs 七段码 题目描述 小蓝要用七段码数码管来表示一种特殊的文字。 上图给出了…

python和Vue开发的RBAC用户角色权限管理系统

后端框架&#xff1a;python的FastAPI作为后端服务和python-jose作为JWT认证 前端框架&#xff1a;Vue3构建页面和Vue Router作为路由管理&#xff0c;Pinia作为数据存储&#xff0c;Vite作为打包工具 可以实现菜单控制和路由控制&#xff0c;页面里面有按钮权限控制&#xf…

css预处理器scss的使用如何全局引入

目录 scss 基本功能 1、嵌套 2、变量 $ 3、mixin 和 include 4、extend 5、import scss 在项目中的使用 1、存放 scss 文件 2、引入 variables 和 mixins 2-1、局部引入 2-2、全局引入 3、入口文件中引入其他文件 项目中使用 css 预处理器&#xff0c;可以提高 cs…

输入与输出

输入(Scanner类) Scanner是java5的新特性&#xff0c;在java.util包里&#xff0c;可以完成用户输入。步骤&#xff1a; 导入java.util包&#xff1b;构造Scanner对象&#xff0c;参数为u标准输入流System.in&#xff1b;使用next()方法系列接收数据 nextBoolean()接收一个布…