题目来源:高教版《全国计算机等级考试二级教程——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;
}
输入和输出:
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
题目:
对于以下函数:
编写程序,要求输入x的值,输出y的值。分别用:
- 不嵌套的if语句
- 嵌套的if语句
- if-else语句
- 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;
}