第一篇:《全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程C語(yǔ)言程序設(shè)計(jì)》
《全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程——C語(yǔ)言程序設(shè)計(jì)》
課后題及參考答案
第一章 程序設(shè)計(jì)基本概念
1.1 在TRUBO C環(huán)境中用RUN命令運(yùn)行一個(gè)C程序時(shí),所運(yùn)行的程序的后綴是______。答案:.exe 1.2 C語(yǔ)言源程序文件的后綴是_____,經(jīng)過(guò)編譯后,生成文件的后綴是_____,經(jīng)過(guò)連接后,生成文件的后綴是_____。
答案:.c.obj.exe 1.3 結(jié)構(gòu)化程序由_____、_____、_____三種基本結(jié)構(gòu)組成。答案:順序、選擇、循環(huán) 第二章 C程序設(shè)計(jì)的初步知識(shí)
一、選擇題
2.1 以下選項(xiàng)中正確的整型常量是
A)12.B)-20
C)1,000
D)4 5 6
答案:B 2.2 以下選項(xiàng)中正確的實(shí)型常量是
A)0
B)3.1415
C)0.329×10(2)(10的2次方)
D).871
答案:D 2.3 以下選項(xiàng)中不正確的實(shí)型常量是
A)2.607E-1
B)0.8103e 2
C)-77.77
D)456e-2
答案:B 2.4 以下選項(xiàng)中不合法的用戶標(biāo)識(shí)符是
A)abc.c
B)file
C)Main
D)PRINTF
答案:A 2.5 以下選項(xiàng)中不合法的用戶標(biāo)識(shí)符是
A)_123
B)printf
C)A$
D)Dim
答案:C 2.6 C語(yǔ)言中運(yùn)算對(duì)象必需是整型的運(yùn)算符是
A)%
B)/
C)!
D)**
答案:A 2.7 可在C程序中用作用戶標(biāo)識(shí)符的一組標(biāo)識(shí)符是
A)void
define
WORD
B)as_b3
_123
If
C)For
-abc
case
D)2c
DO
SIG
答案:B 2.8 若變量已正確定義并賦值,符合C語(yǔ)言語(yǔ)法的表達(dá)式是
A)a=a+7;
B)a=7+b+c,a++
C)int(12.3%4)
D)a=a+7=c+b
答案:B 2.9 以下敘述中正確的是
A)a是實(shí)型變量,C允許進(jìn)行以下賦值a=10,因此可以這樣說(shuō):實(shí)型變量中允許存放整型值。
B)在賦值表達(dá)式中,賦值號(hào)右邊既可以是變量也可以是任意表達(dá)式。
C)執(zhí)行表達(dá)式a=b后,在內(nèi)存中a和b存儲(chǔ)單元中的原有值都將被改變,a的值已由原值改變?yōu)閎的值,b的值由原值變?yōu)?。
D)已有a=3,b=5。當(dāng)執(zhí)行了表達(dá)式a=b,b=a之后,已使a中的值為5,b中的值為3。
答案:B 2.10 以下敘述中正確的是
A)在C程序中無(wú)論是整數(shù)還是實(shí)數(shù),只要在允許的范圍內(nèi)都能準(zhǔn)確無(wú)誤的表示。
B)C程序由主函數(shù)組成。
C)C程序由函數(shù)組成。
D)C程序由函數(shù)和過(guò)程組成。
答案:C 2.11 TURBO C中int類型變量所占字節(jié)數(shù)是
A)1
B)2
C)3
D)4
答案:B 2.12 不合法的八進(jìn)制數(shù)是
A)0
B)028
C)077
D)01
答案:B 2.13 不合法的十六進(jìn)制數(shù)是
A)oxff
B)0Xabc
C)0x11
D)0x19
答案:A
二、填空題
2.14 若k為int整型變量且賦值11。請(qǐng)寫(xiě)出運(yùn)算k++后表達(dá)式的值A(chǔ))_____和變量的值B)_____。
答案:
11、12 2.15 若x為double型變量,請(qǐng)寫(xiě)出運(yùn)算x=3.2,++x后表達(dá)式的值A(chǔ))_____和變量的值B)_____。
答案:4.2、4.2 2.16 函數(shù)體由符號(hào)____開(kāi)始,用符號(hào)____結(jié)束。函數(shù)體的前面是____部分,其后是____部分。
答案:{、}、定義、執(zhí)行
2.17 C語(yǔ)言中的標(biāo)識(shí)符可分為_(kāi)___、____、和預(yù)定義標(biāo)識(shí)符三類。
答案:關(guān)鍵字、用戶標(biāo)識(shí)符
2.18 在C語(yǔ)言程序中,用關(guān)鍵字____定義基本整型量,用關(guān)鍵字____定義單精度實(shí)型變量,用關(guān)鍵字___定義雙精度實(shí)型變量。
答案:int、float、double 2.19 把a(bǔ)1、a2定義成單精度實(shí)型變量,并賦初值1的定義語(yǔ)句是____。
答案:float a1=1.0,a2=1.0;
2.20 C程序中定義的變量,代表內(nèi)存中的一個(gè)____。
答案:存儲(chǔ)單元
2.21 表達(dá)式3.5+1/2的計(jì)算結(jié)果是____。
答案:3.5 2.22 對(duì)以下數(shù)學(xué)式,寫(xiě)出三個(gè)等價(jià)的C語(yǔ)言表達(dá)式____、____、____。
a×b
——
c
答案:a*b/c、a/c*b、b/c*a 2.23 表達(dá)式s=10應(yīng)當(dāng)讀做“____”。
答案:將10賦給變量s 2.24 計(jì)算機(jī)中內(nèi)存儲(chǔ)器的最小存儲(chǔ)單位稱____,其中能容納的數(shù)是____。
答案:位、0或1 2.25 通常一個(gè)字節(jié)包含____個(gè)二進(jìn)制位。在一個(gè)字節(jié)中能存放的最大(十進(jìn)制)整數(shù)是____,它的二進(jìn)制數(shù)的形式是____;最?。ㄊM(jìn)制)整數(shù)是____,它的二進(jìn)制數(shù)的形式是____。
答案:8、255、1111 1111、-128、1000 0000 2.26 當(dāng)計(jì)算機(jī)用兩個(gè)字節(jié)存放一個(gè)整數(shù)時(shí),其中能存放的最大(十進(jìn)制)整數(shù)是____、最?。ㄊM(jìn)制)整數(shù)是____,它的二進(jìn)制數(shù)的形式是____。
答案:65535、-32768、1000 0000 0000 0000 2.27 在C語(yǔ)言中整數(shù)可用____進(jìn)制數(shù)、____進(jìn)制數(shù)和____進(jìn)制數(shù)三種數(shù)制表示。
答案:十、八、十六
三、上機(jī)改錯(cuò)題
2.24 【分析與解答】
第1行的錯(cuò)誤:
(1)include是一個(gè)程序行,因此在此行的最后不應(yīng)當(dāng)有分號(hào)(;)。
(2)include程序行中后面的stdio.h是一個(gè)文件名,按規(guī)定,文件名應(yīng)當(dāng)放在一對(duì)雙引號(hào)(″ ″)內(nèi),或放在一對(duì)尖括號(hào)(< >)內(nèi)。 第2行的錯(cuò)誤:
(1)main()是主函數(shù)的起始行,不是語(yǔ)句,因此最后不應(yīng)當(dāng)有分號(hào)(;)。
(2)在同一行上的/ * main function * / 顯然是注釋;C語(yǔ)言規(guī)定:注釋由/*開(kāi)頭,由*/結(jié)束,但在*號(hào)和/之間不得插入任何空格,而在此處“/
*”和“/
*”之間存在空格,因此,/ * main function * /的寫(xiě)法式是錯(cuò)誤的,而應(yīng)寫(xiě)成:/* main function */。
第3行的錯(cuò)誤:
(1)在主函數(shù)的起始行main()的后面是函數(shù)體,函數(shù)體由左花括號(hào)({)開(kāi)始。但在函數(shù)體的第一行:float的前面缺少了左花括號(hào)({)。
(2)在同一行上的/* /*r is radius*/, /* s is area of circular*/ */ 顯然是注釋;C語(yǔ)言規(guī)定:注釋由/*開(kāi)頭,由*/結(jié)束,并且開(kāi)頭的/*將去找最近的*/去配對(duì),因此在/* /*r is radius*/中,第一個(gè)/*與最后的那個(gè)*/配上了對(duì),結(jié)果緊跟在后面的那個(gè)逗號(hào)(,)落在了注釋的外面,而構(gòu)成了一個(gè)多余符號(hào),為此,在編譯時(shí)將報(bào)告“語(yǔ)法錯(cuò)”。
第6行的錯(cuò)誤:
(1)printf(″%f \[KG-*3]n″,s)應(yīng)當(dāng)是一條輸出語(yǔ)句,但在最后缺少了一個(gè)分號(hào)。
(2)printf(″%f \[KG-*3]n″,s);是程序的最后一條語(yǔ)句,程序應(yīng)當(dāng)結(jié)束;但缺少了程序體結(jié)束所需的右花括號(hào)(});此右花括號(hào)可以放在printf(″%f \[KG-*3]n″,s);的后面,也可以放在printf(″%f \[KG-*3]n″,s);的下一行上。
2.25 【分析與解答】
第1行的錯(cuò)誤:在include行中的文件名應(yīng)該是stdio.h,而不是stdio.a。 第2行的錯(cuò)誤:在main的后面缺少一對(duì)圓括號(hào)。 第4行的錯(cuò)誤:在c=40的后面缺少分號(hào)。
第6行的錯(cuò)誤:在printf(″%f \〖KG-*3〗n″,v)的后面缺少分號(hào)。
第三章、順序結(jié)構(gòu)
一、選擇題
3.1 若a、b、c、d都是int類型變量且初值為0,以下選項(xiàng)中不正確的賦值語(yǔ)句是
A)a=b=c=100;
B)d++;
C)c+b;
D)d=(c=22)-(b++);
答案:C 3.2 以下選項(xiàng)中不是C語(yǔ)句的是
A){int i;i++;printf(“%d”, i);}
B);
C)a=5,c=10
D){;}
答案:C 3.3 以下合法的C語(yǔ)言賦值語(yǔ)句是
A)A=B=58
B)k=int(a+b);
C)a=58,b=58
D)--i;
答案:D 3.4 以下程序的輸出結(jié)果是
A)0
B)1
C)3
D)不確定的值
main()
{
int x=10,y=3;
printf(“%d”, y=x/y);
}
答案:C 3.5 若變量已正確說(shuō)明為int類型,要給a、b、c輸入數(shù)據(jù),以下不正確的輸入語(yǔ)句是
A)read(a,b,c);
B)scanf(“%d%d%d”,a,b,c);
C)scanf(“%D%D%D”,&a,&b,&c);
D)scanf(“%d%d%d”,&a,&b,&c);
答案:D 3.6 若變量已正確說(shuō)明為float類型,要通過(guò)以下賦值語(yǔ)句給a賦予
10、b賦予
22、c賦予33,以下不正確的輸入形式是
A)10
B)10.0,22.0,33.0
C)10.0
D)10 22
scanf(“%f %f %f”, &a, &b, &c);
答案:B 3.7 若變量以正確定義,要將a和b中的數(shù)進(jìn)行交換,下面不正確的語(yǔ)句組是
A)a=a+b,b=a-b,a=a-b;
B)t=a,a=b,b=t;
C)a=t;t=b;b=a;
D)t=b;b=a;a=t;
答案:C 3.8 若變量已正確定義,以下程序段的輸出結(jié)果是
A)輸出格式說(shuō)明與輸出項(xiàng)不匹配,輸出無(wú)定值
B)5.17000
C)5.168000
D)5.169000
x=5.16894;
printf(“%f”,(int)(x*1000+0.5)/(float)1000);
答案:D 3.9 若有以下程序段,c3中的值是
A)0
B)1/2
C)0.5
D)1
int c1=1,c2=2,c3;
c3=c1/c2;
答案:A 3.10 若有以下程序段,其輸出結(jié)果是
A)0,0,-10
B)0,0,5
C)-10,3,-10
D)3,3,-10
int a=0,b=0,c=0;
c=(a-=a-5),(a=b,b+3);
printf(“%d,%d,%d”,a,b,c);
答案:B 3.11 當(dāng)運(yùn)行以下程序時(shí),在鍵盤(pán)上從第一列開(kāi)始輸入9876543210
A)a=98,b=765,c=4321
B)a=10,b=432,c=8765
C)a=98,b=765.000000,c=4321.000000
D)a=98,b=765,c=4321.0
main(){
int a;float b,c;
scanf(“%2d%3f%4f”,&a,&b,&c);
printf(“a=%d,b=%f,c=%f”,a,b,c);}
答案:C 3.12 以下程序的輸出結(jié)果是
A)a=%2,b=%5
B)a=2,b=5
C)a=%%d,b=%%d
D)a=%d,b=%d
main(){ int a=2,b=5;
printf(“a=%%d,b=%%d”,a,b);}
答案:D 3.13 若int類型占兩個(gè)字節(jié),則以下程序段的輸出是
A)-1,-1
B)-1,32767
C)-1,32768
D)-1,65535
int a=-1;
printf(“%d,%u”,a,a);
答案:D 3.14 以下程序段的輸出是
A)*496 *
B)* 496*
C)*000496* D)輸出格式符不合法
int x=496;
printf(“*%-06d*”,x);
答案:A 3.15 以下程序段的輸出是
A)|3.1415|
B)| 3.0|
C)|
3|
D)|
3.|
float a=3.1415;
printf(“|%6.0f|”,a);
答案:C 3.16 以下程序段的輸出是
A)|2345.67800|
B)|12345.6780|
C)|12345.67800|
D)|12345.678|
printf(“|%10.5f|”,12345.678);
答案:C 3.17 以下程序段的輸出是
A)*0000057.66*
B)*
57.66*
C)*0000057.67*
D)*
57.67*
float a=57.666;
printf(“*%010.2f*”,a);
答案:C 3.18 若從終端輸入以下數(shù)據(jù),要給變量C賦以283.19,則正確的輸入語(yǔ)句是
A)scanf(“%f”,c);
B)scanf(“%8.4f”,&c);
C)scanf(“%6.2f”,&c);
D)scanf(“%8”,&c);
283.1900
答案:由于印刷錯(cuò)誤,本題沒(méi)有正確答案。改正意見(jiàn):
把選項(xiàng)A改為:scanf(“%f”,&c);或者把選項(xiàng)D改為:scanf(“%8f”,&c);則可分別選擇A或者D為正確答案。
3.19 若變量已正確說(shuō)明,要求用以下語(yǔ)句給a賦予3.12、給b賦予9.0,則正確的輸入形式是(□代表空格)
A)3.12□□9.0
B)a=□□3.12b=□□□9
C)a=3.12,b=9
D)a=3.12□□,b=9□□□□
scanf(“a=%f,b=%f”,&a,&b);
答案:C 3.20 以下程序的輸出結(jié)果是
A)9 8
B)8 9
C)6 6
D)以上三個(gè)都不對(duì)
#include “math.h” main(){ double a=-3.0, b=2;
printf(“%3.0f %3.0f”,pow(b,fabs(a)),pow(fabs(a),b));}
答案:B
二、填空題
3.21 若有以下定義,請(qǐng)寫(xiě)出以下程序段中輸出語(yǔ)句執(zhí)行后的輸出結(jié)果。(1)____(2)____(3)____
int i=-200,j=2500;
printf(“(1)%d %d”,i,j);
printf(“(2)i=%d, j=%d”,i,j);
printf(“(3)i=%d j=%d”,i,j);
答案:
-200 2500
i=-200, j=2500
i=-200 j=2500 3.22 變量i、j、k已定義為int類型并有初值0,用以下語(yǔ)句進(jìn)行輸入時(shí)
scanf(“%d”,&i);scanf(“%d”,&j);scanf(“%d”,&k);當(dāng)執(zhí)行第一個(gè)輸入語(yǔ)句,從鍵盤(pán)輸入:
12.3
則變量i、j、k的值分別是____、____、____。
答案:12、0、0 3.23 復(fù)合語(yǔ)句在語(yǔ)法上被認(rèn)為是____??照Z(yǔ)句的形式是____。
答案:一條語(yǔ)句、; 3.24 C語(yǔ)句的最后用____結(jié)束。
答案:;
3.25 以下程序段,要求通過(guò)scanf語(yǔ)句給變量賦值,然后輸出變量的值。寫(xiě)出運(yùn)行時(shí)給k輸入100,給a輸入25.81,給x輸入1.89234時(shí)的三種可能的輸入形式____、_____、____。
int k;float a;double x;
scanf(“%d%f%lf”,&k,&a,&x);
printf(“k=%d,a=%f,x=%f”,k,a,x);
答案:
(1)100 25.81 1.89234
(2)100 25.81
(3)100
int x=0177;
printf(“x=%3d,x=%6d,x=$%6o,x=%6x,x=%6u”,x,x,x,x,x);
答案:x=127,x= 127,x= 177,x=
7f,x= 127 3.27 以下程序段的輸出結(jié)果是____。
int x=0177;
printf(“x=%-3d,x=%-6d,x=$%-06d,x=$%06d,x=%%06d”,x,x,x,x,x);
答案:
27、x=127,x=127,x=$127,x=$000127,x=%06d 3.28 以下程序段的輸出結(jié)果是____。
double a=513.789215;
printf(“a=%8.6f,a=%8.2f,a=%14.8f,a=%14.8lf”,a,a,a,a);答案:a=513.789215,a= 513.79,a= 513.78921500,a= 513.78921500
三、編程題和改錯(cuò)題
3.16 【分析與解答】
(1)主函數(shù)名main后應(yīng)有一對(duì)圓括號(hào)。(2)變量定義語(yǔ)句中,v的前面缺逗號(hào)。
(3)第三行的printf語(yǔ)句用以提示輸入,但是原樣輸出的字符串沒(méi)有用雙引號(hào)括起來(lái);另外,從輸入的形式看,輸入的數(shù)據(jù)緊跟在提示之后,因此,printf格式串中最后不應(yīng)該有換行符——\n。
(4)因?yàn)檩斎腠?xiàng)a、b、c從定義和計(jì)算結(jié)果來(lái)看都是double類型,因此,第四行scanf語(yǔ)句格式串中的格式說(shuō)明不應(yīng)當(dāng)用%d而應(yīng)當(dāng)用%lf;且每一個(gè)變量之前應(yīng)該加地址運(yùn)算符&。
(5)第七行的printf語(yǔ)句中應(yīng)當(dāng)把%d都改成%lf或%f;按輸出要求在格式串中應(yīng)添加相應(yīng)的原樣輸出的字符;因?yàn)橄乱粋€(gè)printf的輸出從新的一行開(kāi)始,因此在本輸出語(yǔ)句的格式串的最后應(yīng)當(dāng)加換行符——\n。
(6)第八行的printf語(yǔ)句中應(yīng)當(dāng)把格式串整理合并放在輸出項(xiàng)的前面,輸出項(xiàng)放在后面,%d都改成%lf或%f;中間的\n刪去。
(7)請(qǐng)讀者自己寫(xiě)出修改后的程序,并上機(jī)調(diào)試。
3.17【分析與解答】
(1)分析:可用算術(shù)式560÷60把分鐘換算成小時(shí)和分鐘,商數(shù)就是小時(shí)數(shù),余數(shù)就是分鐘數(shù)。
(2)確定變量的名字和定義變量的類型:在程序中把小時(shí)數(shù)放在變量h中,把分鐘數(shù)放在變量m中。這兩個(gè)變量的類型可以是整型(本題中采用整型),也可以是實(shí)型。
(3)確定所用算法:求〖SX()560〖〗60〖SX〗〗的商數(shù),在C語(yǔ)言中可以用整除的算法,語(yǔ)句是h=560/60。求余數(shù)可用求余運(yùn)算符 %:560%60,其值放入變量m中的語(yǔ)句是:m=560%60。(4)設(shè)計(jì)輸出格式。若輸出的形式定為:小時(shí):分鐘,則按此形式設(shè)計(jì)輸出語(yǔ)句。(5)把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。(6)編寫(xiě)程序如下:
main() {
int h, m;
h=560/60;
m=560%60;
printf(″The result: %3d : %3d\n″, h,m);
}
運(yùn)行結(jié)果是:
The result:
: 20
3.18 【分析與解答】
(1)確定變量的名字和定義變量的類型。若用a存放1500,用b存放350;用q存放商數(shù),用r存放余數(shù),所有變量應(yīng)定義成int類型。
(2)設(shè)計(jì)輸入語(yǔ)句從終端輸入1500和350;在輸入語(yǔ)句之前,應(yīng)當(dāng)設(shè)計(jì)一個(gè)輸出語(yǔ)句,用以提示輸入。(3)可用整除求商數(shù),結(jié)果放在變量q中??捎们笥噙\(yùn)算符%求兩數(shù)之余數(shù),結(jié)果放在變量r中。(4)設(shè)計(jì)輸出語(yǔ)句。輸出a、b、q、r。
(5)把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。
本題的程序與3.30相似,請(qǐng)讀者參考上題并根據(jù)本題的解釋自己編程,并上機(jī)調(diào)試。
3.19 【分析與解答】
(1)定義4個(gè)雙精度變量a、b、c和ave,變量a、b、c分別存放讀入的3個(gè)雙精度數(shù),ave存放它們的平均值。
(2)設(shè)計(jì)輸入語(yǔ)句,以及在此之前用于提示輸入的(printf)語(yǔ)句。(3)設(shè)計(jì)求平均值的算法,把所求得的平均值放入變量ave中。
(4)設(shè)計(jì)把變量ave中的數(shù),從小數(shù)點(diǎn)后第二位數(shù)進(jìn)行四舍五入的算法?,F(xiàn)舉例說(shuō)明:若ave中的數(shù)為123.4644,為了保留此值小數(shù)點(diǎn)后一位,可用表達(dá)式:(int)(123.4644*10)/10.0;依次推算,為了保留此值小數(shù)點(diǎn)后二位,可用表達(dá)式:(int)(123.4644*100)/100.0;其他依此類推。
(5)若要求對(duì)小數(shù)點(diǎn)后第二位數(shù)進(jìn)行四舍五入,則可對(duì)原數(shù)加0.05后再進(jìn)行以上運(yùn)算。如要求保留123.4644小數(shù)點(diǎn)后一位且對(duì)第二位數(shù)進(jìn)行四舍五入,可用表達(dá)式:(int)((123.467+0.05)*10)/10.0。注意:分母一定要用實(shí)數(shù)10.0而不能用整數(shù)10,否則就變成整除了;若要求保留123.4644小數(shù)點(diǎn)后兩位且對(duì)第三位數(shù)進(jìn)行四舍五入,可用表達(dá)式:(int)((123.467+0.005)*100)/100.0;其他依此類推。(6)設(shè)計(jì)輸出語(yǔ)句。輸出a、b、c和ave。(7)把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。(8)編寫(xiě)程序如下: main()
{
double a,b,c,ave; printf(″Enter a ,b ,c : ″);
scanf(″%lf%lf%lf″, &a, &b, &c); ave=(a+b+c)/3; printf(″ave=%f\n″, ave);
/*用以比較四舍五入前后的數(shù)據(jù)*/ ave=(int)((ave+0.05)*10)/10.0;
printf(″a=%f, b=%f, c=%f, ave=%f\n″, a,b,c,ave);
}
3.20 【分析與解答】
(1)關(guān)于對(duì)變量中的數(shù)進(jìn)行交換的算法請(qǐng)參考3.7題中的解釋和《教程》中有關(guān)的例題。
(2)定義4個(gè)整型變量a、b、c和t,變量a、b、c分別存放讀入的3個(gè)整數(shù),t用作臨時(shí)存儲(chǔ)單元。(3)設(shè)計(jì)輸入語(yǔ)句,以及在此之前用于提示輸入的(printf)語(yǔ)句。(4)輸出a、b、c中的值,以便于比較。(5)交換的步驟如下: ① 把c中的值賦給t。 ② 把b中的值賦給c。 ③ 把a(bǔ)中的值賦給b。 ④ 把t中的值賦給a。
經(jīng)過(guò)以上步驟,已按要求進(jìn)行了交換。(6)輸出a、b、c中的值。(7)編寫(xiě)程序如下: main()
{
int a, b, c, t;
printf(″Enter a, b, c :\n″); scanf(″%d%d%d″,&a,&b,&c);
printf(″(1)a=%d,b=%d,c=%d\n″,a,b ,c); t=c;c=b;b=a;a=t;
printf(″(2)a=%d,b=%d,c=%d\n″,a,b,c);
}
第四章、選擇結(jié)構(gòu)
一、選擇題
4.1 下列運(yùn)算符中優(yōu)先級(jí)最高的運(yùn)算符是
A)!
B)%
C)-=
D)&&
答案:A 4.2 下列運(yùn)算符中優(yōu)先級(jí)最低的運(yùn)算符是
A)||
B)!=
C)<=
D)+
答案:A 4.3 為表示關(guān)系x≥y≥z,應(yīng)使用的C語(yǔ)言表達(dá)式是
A)(x>=y)&&(y>=z)
B)(x>=y)AND(y>=z)
C)(x>=y>=z)
D)(x>=y)&(y>=z)
答案:A 4.4 設(shè)a、b和c都是int型變量,且a=3,b=4,c=5;則以下的表達(dá)式中,值為0的表達(dá)式是
A)a&&b
B)a<=b
C)a||b+c&&b-c
|1)
答案:D 4.5 以下程序的輸出結(jié)果是
A)0
B)1
C)2
D)3
main()
{ int a=2,b=-1,c=2;
if(a
if(b<0)c=0;
else c+=1;
printf(“%d”,c);
}
D)!((a
答案:C 4.6 以下程序的輸出結(jié)果是
A)1
B)2
C)3
D)4
main(){ int w=4,x=3,y=2,z=1;
printf(“%d”,(w 答案:A 4.7 若執(zhí)行以下程序時(shí)從鍵盤(pán)上輸入3和4,則輸出結(jié)果是 A)14 B)16 C)18 D)20 main(){ int a,b,s; scanf(“%d%d”,&a,&b); s=a; if(a s*=s; printf(“%d”,s);} 答案:B 4.8 下面的程序片段所表示的數(shù)學(xué)函數(shù)關(guān)系是 -1(x<0)A)y= 0(x=0) 1(x>0) 1(x<0)B)y=-1(x=0) 0(x>0) 0(x<0)C)y=-1(x=0) 1(x>0) -1(x<0)D)y= 1(x=0) 0(x>0) y=-1;if(x!=0)y=1; if(x>0)y=1;else y=0;答案:A 4.9 運(yùn)行以下程序后,輸出 A)**** B)&&&& C)####&&&& D)有語(yǔ)法錯(cuò)誤不能通過(guò)編譯 main(){ int k=-3; if(k<=0)printf(“****”) else printf(“&&&&”);} 答案:D 4.10 若a和b均是正整型變量,以下正確的switch語(yǔ)句是 A)switch(pow(a,2)+pow(b,2)) { case 1: case 3: y=a+b;break; case 0: case 5: y=a-b; } B)switch(a*a+b*b); { case 3: case 1: y=a+b;break; case 0: y=b-a;break; } C)switch a { default: x=a+b; case 10: y=a-b;break; case 11: x=a*d;break; } D)switch(a+b) { case10 : x=a+b;break; case11 : y=a-b;break; } 答案:沒(méi)有正確答案。如果C選項(xiàng)改為: switch(a){ default: x=a+b; case 10: y=a-b;break; case 11: x=a*b;break;} 則答案可以選擇C 二、填空題 4.11 C語(yǔ)言中用____表示邏輯值“真”,用____表示邏輯值“假”。 答案:非0、0 4.12 C語(yǔ)言中的關(guān)系運(yùn)算符按優(yōu)先級(jí)別是____、____、____、____。 答案:>、<、>=、<=、==、!= 4.13 C語(yǔ)言中的邏輯運(yùn)算符按優(yōu)先級(jí)別是____、____、____。 答案:!、&&、|| 4.14 C語(yǔ)言中的關(guān)系運(yùn)算符和邏輯運(yùn)算符的優(yōu)先級(jí)別是____、____、____、____、____、____、____。 答案:!、<、>、==、!=、&&、|| 4.15 C語(yǔ)言中邏輯運(yùn)算符____的優(yōu)先級(jí)高于算術(shù)運(yùn)算符。 答案:! 4.16 將下列數(shù)學(xué)式改寫(xiě)成C語(yǔ)言的關(guān)系表達(dá)式或邏輯表達(dá)式A)____B)____。 A)a=b或a B)|x|>4 答案:A)a==b||a main(){ int a=100; if(a>100)printf(“%d”,a>100); else printf(“%d”,a<=100);} 答案:1 4.18 請(qǐng)寫(xiě)出與以下表達(dá)式等價(jià)的表達(dá)式A)____B)____。A)!(x>0) B)!0 答案:A)x<=0 B)1 4.19 當(dāng)a=1,b=2,c=3時(shí),以下if語(yǔ)句執(zhí)行后,a、b、c中的值分別為_(kāi)___、____、____。 if(a>c) b=a;a=c;c=b; 答案:3、2、2 4.20 若變量已正確定義,以下語(yǔ)句段的輸出結(jié)果是____。 x=0;y=2;z=3; switch(x) { case 0: switch(y==2) { case 1: printf(“*”);break; case 2: printf(“%”);break; } case 1: switch(z) { case 1: printf(“$”); case 2: printf(“*”);break; default : printf(“#”); } } 答案:*# 三、編程題 4.21 【分析與解答】 相關(guān)內(nèi)容請(qǐng)參考《教程》4.2節(jié)和4.4節(jié)。(1)改寫(xiě)如下: switch(a/10) { default : m=5;break; case 0 : case 1 : case 2 : m=1;break; case 3 : m=2;break; case 4 : m=3;break; case 5 : m=4;break; }; (2)本題中對(duì)a的判斷條件有一定的規(guī)律可尋;關(guān)鍵是,在switch語(yǔ)句后的表達(dá)式中利用了a/10,從而簡(jiǎn)化了case標(biāo)號(hào)。 4.22 【分析與解答】 編寫(xiě)本題的程序,首先要解決如何計(jì)算學(xué)生當(dāng)前的年齡(設(shè)存放實(shí)足年齡的變量是age)。(1)如果當(dāng)前的月份大于生日的月份,則學(xué)生的實(shí)足年齡age=y1-y0。 (2)如果當(dāng)前的月份等于生日的月份,就要看日數(shù),當(dāng)前的日數(shù)大于或等于生日的日數(shù),則學(xué)生的實(shí)足年齡age=y1-y0。 (3)如果不滿足以上的條件,就可斷定當(dāng)前的日期沒(méi)有超過(guò)生日日期,就是說(shuō)學(xué)生的年齡應(yīng)當(dāng)是age=y1-y0-1。 以上3條,用C語(yǔ)言可以描述如下: if((m1>m0)[JB>1|][JB>1|](m1==m0&&d1>=d0))age=y1-y0; else age=y1-y0-1; 讀者可以參考以上語(yǔ)句寫(xiě)出程序,也可以根據(jù)分析寫(xiě)出與此形式不同的語(yǔ)句和程序。 4.23【分析與解答】 (1)若輸入的整數(shù)a是奇數(shù),輸出 dd number,是偶數(shù)輸出:even number。 (2)若一個(gè)a是偶數(shù),它就能被2除盡,即a%2==0,輸出even number;若是奇數(shù),它就不能被2除盡,即a%2!〖KG-*2〗=0,輸出odd number。 讀者可以參考以上給出的算法,寫(xiě)出相應(yīng)的C語(yǔ)句,并編寫(xiě)出完整的程序。 4.24 【分析與解答】 本題的主要算法是從3個(gè)數(shù)中找出最大的那個(gè)數(shù)。假定始終把最大的數(shù)放在變量max中。(1)假定a中的數(shù)最大,把a(bǔ)賦給max。 (2)用b去和max比較,若b大于max,則把b賦給max;若不大于max,則什么也不做。(3)用c去和max比較,若c大于max,則把c賦給max;若不大于max,則什么也不做。(4)經(jīng)過(guò)以上操作,max中已放入了a、b、c三個(gè)數(shù)中的最大數(shù),輸出max即可。 讀者可以參考以上給出的算法,寫(xiě)出相應(yīng)的C語(yǔ)句,并編寫(xiě)出完整的程序。 4.25 【分析與解答】 (1)本題已給出了非常明確的條件,只要寫(xiě)出正確的條件判斷語(yǔ)句就可基本完成程序的編寫(xiě)。 (2)由給出的函數(shù)可知,只有x的值在規(guī)定的范圍內(nèi)時(shí),才求出y的值,因此程序應(yīng)當(dāng)對(duì)輸入的x進(jìn)行判斷,若超過(guò)范圍就不求y的值。 (3)現(xiàn)以使用if[CD#*2]else語(yǔ)句為例寫(xiě)出程序供參考。 main() { int x,y;printf(″Enter x : ″);scanf(″%d″, &x); if(x>-5&&x<10) { if(x==0)y=x-1; else if(x<10 && x>0)y=x+1; else if(x<0 && x>-5)y=x; printf(″x=%d y=%d\n″, x,y); } printf(″***END***\n\n″); } 第五章、循環(huán)結(jié)構(gòu) 一、選擇題 5.1 以下程序段的輸出結(jié)果是 A)9 B)1 C)11 int k,j,s; for(k=2;k<6;k++,k++) { s=1; for(j=k;j<6;j++)s+=j; } printf(“%d”, s); 答案:D 5.2 以下程序段的輸出結(jié)果是 A)12 B)15 C)20 int i,j,m=0; for(i=1;i<=15;i+=4) for(j=3;j<=19;j+=4)m++; printf(“%d”, m); 答案:C 5.3 以下程序段的輸出結(jié)果是 A)10 B)9 C)10 D)9 D)10 D)25 int n=10; while(n>7) { n--; printf(“%d”, n); } 答案:B 5.4 以下程序段的輸出結(jié)果是 A)1 B)3 0 C)1-2 int x=3; do { printf(“%3d”,x-=2);} while(!(--x)); 答案:C 5.5 以下程序段的輸出結(jié)果是 A)15 B)14 C)不確定 main() { int i,sum; for(i=1;i<6;i++)sum+=sum; printf(“%d”,sum); } 答案:C 5.6 以下程序段的輸出結(jié)果是 A)741 B)852 C)963 main() { int y=10; for(;y>0;y--) if(y%3==0) { printf(“%d”,--y);continue; } 答案:B 5.7 若x是int型變量,以下程序段的輸出結(jié)果是 A)**3 ##4 **5 B)##3 **4 ##5 C)##3 **4##5 D)**3##4 **5 for(x=3;x<6;x++) printf((x%2)?(“**%d”):(##%d“),x); D)死循環(huán) D)0 D)875421 } 答案:D 5.8 以下程序的輸出結(jié)果是 A)*#*#*#$ B)#*#*#*$ C)*#*#$ D)#*#*$ main(){ int i; for(i=1;i<=5;i++) { if(i%2)printf(”*“); else contionue; printf(”#“); } printf(”$“);} 答案:A 5.9 以下敘述正確的是 A)do_while語(yǔ)句構(gòu)成的循環(huán)不能用其它語(yǔ)句構(gòu)成的循環(huán)來(lái)代替。 B)do_while語(yǔ)句構(gòu)成的循環(huán)只能用break語(yǔ)句退出。 C)用do_while語(yǔ)句構(gòu)成循環(huán)時(shí),只有在while后的表達(dá)式為非零時(shí)結(jié)束循環(huán)。 D)用do_while語(yǔ)句構(gòu)成循環(huán)時(shí),只有在while后的表達(dá)式為零時(shí)結(jié)束循環(huán)。 答案:D 5.10 以下程序的輸出結(jié)果是 A)39 81 B)42 84 C)26 68 D)28 70 main(){ int x,i; for(i=1;i<=100;i++) { x=i; if(++x%2==0) if(++x%3==0) if(++x%7==0) printf(”%d “, x); } printf(”“);} 答案:D 二、填空題 5.11 當(dāng)執(zhí)行以下程序段后,i的值是____、j的值是____、k的值是____。 int a,b,c,d,i,j,k;a=10;b=c=d=5;i=j=k=0;for(;a>b;++b)i++;while(a>++c)j++;do k++;while(a>d++); 答案:5、4、6 5.12 以下程序段的輸出結(jié)果是____。 int k,n,m;n=10;m=1;k=1;while(k<=n)m*=2;printf(”%d“,m); 答案:死循環(huán) 5.13 以下程序的輸出結(jié)果是____。 main(){ int x=2; while(x--); printf(”%d“,x);} 答案:-1 5.14 以下程序段的輸出結(jié)果是____。 int i=0,sum=1; do { sum+=i++;}while(i<5); printf(”%d“,sum); 答案:11 5.15 有以下程序段: s=1.0; for(k=1;k<=n;k++)s=s+1.0/(k*(k+1)); printf(”%f“,s);請(qǐng)?zhí)羁?,使下面的程序段的功能完全與之等同。 s=0.0; ____; k=0; do { s=s+d; ____; d=1.0/(k*(k+1)); } while(____); printf(”%f“,s); 答案:d=1.0、k++、k<=n 5.16 以下程序的功能是:從鍵盤(pán)上輸入若干個(gè)學(xué)生的成績(jī),統(tǒng)計(jì)并輸出最高成績(jī)和最低成績(jī),當(dāng)輸入負(fù)數(shù)時(shí)結(jié)束輸入。請(qǐng)?zhí)羁铡?/p> main() { float x,amax,amin; scanf(”%f“,&x); amax=x;amin=x; while(____) { if(x>amax) amax=x; if(____) amin=x; scanf(”%f“,&x); } printf(”amax=%famin=%f“,amax,amin); } 答案:x>=0、x 三、編程題 5.17【分析與解答】 (1)本題的基本算法是求累加值。累加項(xiàng)的值有規(guī)律的遞增,每一項(xiàng)的絕對(duì)值比前一項(xiàng)增2,因此可以利用循環(huán)的控制變量的遞增來(lái)得到累加項(xiàng)的絕對(duì)值。例如: for(i=1;i<=101;i+=2)? (2)按所給的算式可以看到,累加項(xiàng)的符號(hào)是在交叉改變的,為此應(yīng)當(dāng)在循環(huán)體內(nèi)設(shè) 置一個(gè)變量,使它的符號(hào)按此規(guī)律交叉改變,這可用:s=-s;來(lái)實(shí)現(xiàn),s的初值為1;當(dāng)s的值為1時(shí),賦值后s中新的值為-1,當(dāng)s的值為-1時(shí),賦值后s中新的值為1。用s去乘累加項(xiàng),將使累加項(xiàng)的符號(hào)也隨之有規(guī)律地改變。(3)若累加和放在變量sum中,累加項(xiàng)放在變量t中,按照以上敘述,for循環(huán)體內(nèi)的語(yǔ)句可以設(shè)計(jì)如下: s=-s;t=s*i;sum=sum+t;(4)sum的值是51。 (5)請(qǐng)讀者自己對(duì)變量做出正確的定義并賦初值,設(shè)計(jì)輸出語(yǔ)句,完善程序。 5.18 【分析與解答】 (1)本題的基本算法是求累加值。累加項(xiàng)的分子部分都是1;分母的值有規(guī)律的遞增,依次為1!、2!、?、n!,即,若第i-1項(xiàng)的累加項(xiàng)為 t(i-1),則第i項(xiàng)的累加項(xiàng)是 t(i-1)*i,在程序中可用表達(dá)式:t=t/i(i從1變化到n)來(lái)表示。(2)根據(jù)以上分析,若用變量t來(lái)存放累加項(xiàng),當(dāng)i的值從1變化到n時(shí),可用以下語(yǔ)句來(lái)實(shí)現(xiàn)累加: t=t/i;e+=t; (3)為了實(shí)現(xiàn)累加過(guò)程,以上語(yǔ)句應(yīng)當(dāng)放在循環(huán)內(nèi),循環(huán)控制變量從1變化到n。 (4)若用for循環(huán),按題目要求已指定n的值是50。若用while循環(huán),并沒(méi)有指定n的值,但已指定了循環(huán)結(jié)束的條件,當(dāng)t的值小于10-4結(jié)束循環(huán)。(5)現(xiàn)例示用while循環(huán)來(lái)求e值的部分程序: i=1;e=1.0;t=1.0; while(t>=1e-4) { t=t/i; e+=t; i++; } (6)請(qǐng)讀者自己對(duì)變量做出正確的定義,設(shè)計(jì)輸出語(yǔ)句,完善程序;也可以參考此程序段,按照自己的思路獨(dú)立地完成程序。(7)e的值應(yīng)當(dāng)是:2.71828。 (8)根據(jù)以上分析,讀者已不難用for循環(huán)來(lái)實(shí)現(xiàn)求e值的計(jì)算。 (9)注意:在完成此程序時(shí),不要對(duì)分母中的階乘值進(jìn)行單獨(dú)計(jì)算,因?yàn)?7!的值已超過(guò)long類型的最大值,更無(wú)法求到50!。 5.19【分析與解答】 (1)從1880年至2000年的年數(shù)可用一個(gè)for循環(huán)來(lái)取得。 (2)對(duì)每一年,用以上指定的條件來(lái)進(jìn)行判斷,若滿足條件即為閏年,進(jìn)行輸出。 (3)按輸出的要求,需要設(shè)一個(gè)變量用于統(tǒng)計(jì)一行中輸出的個(gè)數(shù),若在一行上已連續(xù)輸出了5個(gè)年數(shù),就需輸出一個(gè)換行符,使下一個(gè)輸出項(xiàng)在新的一行上開(kāi)始;若用變量n來(lái)做此統(tǒng)計(jì),則當(dāng)表達(dá)式n%5==0時(shí)就應(yīng)輸出一個(gè)換行符,同時(shí)使n重新置0值。 (4)若變量y代表年數(shù),if語(yǔ)句的邏輯表達(dá)式可以寫(xiě)成如下: (y%4==0 && y%100!=0[JB>1|][JB>1|]y%400==0)(5)以下程序段供參考: for(y=1880;y<=2000;y++) if(y%4==0 && y%100![KG-*2]=0[JB>1|][JB>1|]y%400==0) { printf(″%d ″,y); n++; if(n%5==0) { printf(″\n″);n=0;} } (6)請(qǐng)讀者自己對(duì)變量做出正確的定義并賦初值,完善程序;也可以參考此程序段,按照自己的思路獨(dú)立地完成程序。從1880年至2000年有30個(gè)閏年。 5.20 【分析與解答】 (1)不難理解利用以下的for循環(huán)可以在一行上連續(xù)輸出n個(gè)*號(hào): for(i=1;i<=n;i++)printf(″*″); printf(″\n″); 若n的值是6,則連續(xù)輸出6個(gè)*號(hào)。 (2)以上圖形是在各行上輸出數(shù)目不等的*號(hào),只是*號(hào)的數(shù)目依次有規(guī)律地變化。在上半部分各行依次是1、3、5、7個(gè),因此可以用以下的程序段來(lái)實(shí)現(xiàn)這樣的輸出: for(k=1;k<=7;k++,k++) { for(i=1;i<=k;i++)printf(″*″); printf(″\n″); } 在下半部依次是5、3、1個(gè);因此可以用以下的程序段來(lái)實(shí)現(xiàn)這樣的輸出: for(k=5;k>=1;k--,k--) { for(i=1;i<=k;i++)printf(″*″); printf(″\n″); } 以上程序段從第一列起輸出的結(jié)果如下: * *** ***** ******* ***** *** * 現(xiàn)在我們已完成了在每行輸出指定數(shù)目的*號(hào)。 (3)輸出結(jié)果與題目要求不同,它們的區(qū)別是:按題目每一行之前有不同的空格,而這里則是所有的行都在第一列上開(kāi)始輸出*號(hào);所以接著就應(yīng)當(dāng)解決這一問(wèn)題。(4)分析題目要求,每行第一個(gè)*號(hào)位置的縮進(jìn)是有規(guī)律的,假定中間這一行第一個(gè)*號(hào)位置是在第一列,則可看出,第一至第三行的縮進(jìn)分別是3、2、1個(gè)空格;而圖形下半部的縮進(jìn)數(shù)則剛好相反。這可在以上循環(huán)中添加輸出連續(xù)空格的for循環(huán)來(lái)實(shí)現(xiàn),對(duì)于上半部程序如下: b=3; for(k=1;k<=7;k++,k++) { for(j=1;j<=b;j++)printf(″ ″);b--; for(i=1;i<=k;i++)printf(″*″); printf(″\n″); } (5)請(qǐng)讀者在理解以上給出的示例的基礎(chǔ)上,自己添加下半部空格的輸出。 第六章、字符型數(shù)據(jù) 一、選擇題 6.1 C語(yǔ)言中的簡(jiǎn)單數(shù)據(jù)類型有 A)整型、實(shí)型、邏輯型 B)整型、實(shí)型、字符型 C)整型、字符型、邏輯型 D)整型、實(shí)型、邏輯型、字符型 答案:B 6.2 C語(yǔ)言中,字符(char)型數(shù)據(jù)在微機(jī)內(nèi)存中的存儲(chǔ)形式是 A)反碼 B)補(bǔ)碼 C)EBCDIC碼 D)ASCII碼 答案:D 6.3 設(shè)有語(yǔ)句char a=''72'';,則變量a A)包含1個(gè)字符 B)包含2個(gè)字符 C)包含3個(gè)字符 D)說(shuō)明不合法 答案:A 6.4 C語(yǔ)言中不合法的字符常量是 A)''