題目來源:高教版《全國計算機等級考試二級教程——C語言程序設(shè)計》
P35 編程和改錯題
3.16
題目:
以下程序多處有錯媚创。若必須按下面的形式輸入數(shù)據(jù),并且必須按下面指定的形式輸出數(shù)據(jù),請對該程序做相應(yīng)的修改。
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);
}
當程序執(zhí)行時,屏幕的顯示和要求輸入形式如下:
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()函數(shù)的括號
{ double a, b, c, s, v;
printf("input a, b, c:\n); //換行符導(dǎo)致輸出與要求的輸出不符,要求的輸出中這里是不換行的
scanf("%d %d %d", a, b, c); //格式字符錯誤看政,double類型應(yīng)該使用%lf,而且還漏了取址運算符“&”
a = a * b;
v = a * b * c;
printf("%d %d %d", a, b, c); //格式字符錯誤抄罕。此外允蚣,這里應(yīng)該加上a,b,c和一個換行符,否則與要求的輸出格式不同
printf("s = %f\n", s, "v = %d\n", v); //格式控制錯誤呆贿,應(yīng)該寫在一起嚷兔。此外,也不應(yīng)有換行符
}
正確的程序如下:
(左大括號獨占一行做入、第二行main函數(shù)的寫法“int main (void);”和最后的“return 0;”與教材上的不一樣冒晰,這是我的個人習(xí)慣,按照教材上的左大括號后不換行竟块、寫“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分鐘換算成用小時和分鐘表示蒋情,然后分別進行輸出。
解答:
題目的意思應(yīng)該是要求把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
題目:
編寫程序违帆,輸入兩個整數(shù):1500和350浙巫,求出它們的商和余數(shù)并進行輸出金蜀。
解答:
這題跟上面那題有點像刷后,用同樣的方法來實現(xiàn)就可以。
程序如下:
#include <stdio.h>
int main(void)
{
int a = 1, b = 1, s = 1, ys = 1;
printf("請輸入兩個整數(shù):");
scanf("%d %d",&a, &b);
s = a / b; //求兩數(shù)之商
ys = a % b; //求余數(shù)
printf("%d和%d的商為:%d渊抄,余數(shù)為:%d\n",a,b, s, ys);
return 0;
}
輸入和輸出:
3.19
題目:
編寫程序尝胆,讀入三個雙精度數(shù),求它們的平均值并保留此平均值小數(shù)點后一位數(shù)护桦,對小數(shù)點后第二位數(shù)進行四舍五入含衔,最后輸出結(jié)果。
解答:
程序如下:
#include <stdio.h>
int main(void)
{
double a = 1.0, b = 1.0, c = 1.0, answer = 1.0;
printf("請輸入三個浮點數(shù):");
scanf("%lf %lf %lf", &a, &b, &c);
answer = (a + b + c) / 3; //進行求平均值的運算
printf("answer = %.2lf", answer); //用“.2”控制輸出數(shù)據(jù)所占的寬度,實現(xiàn)保留一位數(shù)并將第二位進行四舍五入的功能
return 0;
}
輸出:
3.20
題目:
編寫程序贪染,讀入三個整數(shù)給a缓呛、b、c杭隙,然后交換它們中的數(shù)哟绊,把a中原來的值給b,把b中原來的值給c痰憎,把c中原來的值給a票髓,然后輸出a、b铣耘、c洽沟。
解答:
要實現(xiàn)三個整數(shù)的值互相交換,除了要定義這三個整數(shù)a蜗细,b裆操,c之外還需要另外再定義兩個整數(shù)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("請輸入三個整數(shù):");
scanf("%d %d %d",&a, &b, &c); //輸入三個整數(shù):a,b,c
printf("輸入的值為:a = %d, b = %d, c = %d\n",a, b, c); //輸出原始值
//以下五行進行三個數(shù)值的交換
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,請將以下選擇結(jié)構(gòu)改寫成由switch語句構(gòu)成的選擇結(jié)構(gòu)水援。
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語句如下:
(雖然放入完整的程序中能通過編譯而且輸出正確但是這段語句是不是最優(yōu)的改寫方法不能確定密强,如果有更好的實現(xiàn)方法的話歡迎大佬指正。)
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
題目:
編寫程序蜗元,輸入一位學(xué)生的生日(年:y0或渤、月:m0、日:d0)奕扣,并輸入當前的日期(年:y1薪鹦、月:m1、日:d1)惯豆,輸出該生的實際年齡池磁。
解答:
基本思路是,首先求當前年份和生日年份的差楷兽,如果小于0地熄,則輸出“錯誤”。
如果當前年份和生日年份的差大于零芯杀,判斷當前月份和生日月份的差端考,如果大于零雅潭,判斷當前日期和生日日期的差,如果也大于零却特,則生日就是當前年份和生日年份的差扶供。如果這兩項有一項小于零,就將當前年份和生日年份減1作為該生的實際年齡裂明。
(在我的這個程序里诚欠,把當前日期是生日當天的情況也算作實際年齡為當前年份和實際年份減1,如果不要這么算的話要再加一個if語句漾岳,也是可以實現(xiàn)的轰绵,看對題目的理解了。)
#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
題目:
編寫程序尼荆,輸入一個整數(shù)左腔,打印出它是奇數(shù)還是偶數(shù)。
解答:
很簡單的題捅儒,用一個求模運算和一個if語句就可以完成液样。
程序如下:
#include <stdio.h>
int main(void)
{
int a = 0, b = 0;
scanf_s("%d", &a);
b = a % 2;
if (b != 0) //利用該數(shù)除以2的余數(shù)是否為0來判斷該數(shù)是奇數(shù)還是偶數(shù)
printf("它是奇數(shù)。\n");
else
printf("它是偶數(shù)巧还。\n");
return 0;
}
輸入和輸出如下:
4.24
題目:
編寫程序鞭莽,輸入a、b麸祷、c三個數(shù)澎怒,打印出最大者。
解答:
很簡單阶牍,用兩條不嵌套的if語句就可以實現(xiàn)喷面。
程序如下:
#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("最大的數(shù)為:%d", d);
return 0;
}
輸入和輸出如下:
4.25
題目:
對于以下函數(shù):
編寫程序,要求輸入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;
}