




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一份C學(xué)習(xí)資料與習(xí)題解答
第1章C語(yǔ)言程序的基本構(gòu)成
1.1本章要點(diǎn)
1.用C語(yǔ)句所寫(xiě)的序列稱(chēng)為C源程序,它的后綴為.c。C源程序經(jīng)過(guò)編譯(compile)后生成一個(gè)目標(biāo)文件
(.obj),鏈接庫(kù)函數(shù)后生成可執(zhí)行文件(.exe)。
2.結(jié)構(gòu)化程序的三種結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu).
(1)順序結(jié)構(gòu)的程序是一條語(yǔ)句接一條語(yǔ)句順序地往下執(zhí)行,一直到程序結(jié)束。
例如:
intx,y;
scanf("%d",&x);
y=x*x;
printf("y=%d\n",y);
以上4條語(yǔ)句,順序地往下執(zhí)行。
(2)分支結(jié)構(gòu)指在程序執(zhí)行過(guò)程中,程序的流程可由多路分支組成,根據(jù)不同的條件去執(zhí)行不同的任務(wù)。
例如:
intx;
if(x>0)
printffa%d的值大于0\n",x);
else
printffa%d的值小于0\n”,x);
以上if-else語(yǔ)句根據(jù)x是否大于0,只執(zhí)行一條分支。
(3)循環(huán)結(jié)構(gòu)是指在程序中需要根據(jù)某項(xiàng)條件重復(fù)地執(zhí)行某項(xiàng)任務(wù)若干次,直到滿(mǎn)足或不滿(mǎn)足某條件為止,
這就構(gòu)成循環(huán)結(jié)構(gòu)。
例如:
intx=100/sum=0;
while(x>=l)
(
sum=sum+x;
)
3.算法是指解決問(wèn)題所使用的一系列合乎邏輯的解題步驟,程序可以認(rèn)為對(duì)算法的具體實(shí)現(xiàn),即:算法+
數(shù)據(jù)結(jié)構(gòu)=程序。
例如:有如圖所示的環(huán),剪開(kāi)一個(gè)環(huán)作為一種操作,作怎么樣的最小操作,能呈現(xiàn)最多的狀態(tài)?
例如:如何在數(shù)列23,4,56,-9,100,2,45,0,87,10中查找最大數(shù)?
具體的算法為:
第。步:比較開(kāi)始;
第1步:把第1個(gè)數(shù)23作為當(dāng)前最大值;
第2步1當(dāng)前最大值第2個(gè)數(shù)比較,獲取當(dāng)前最大值23;
第3步:當(dāng)前最大值第3個(gè)數(shù)比較,獲取當(dāng)前最大值56:
第4步:當(dāng)前最大值第4個(gè)數(shù)比較,獲取當(dāng)前最大值56;
第5步:當(dāng)前最大值第5個(gè)數(shù)比較,獲取當(dāng)前最大值100;
第10步:當(dāng)前最大值第10個(gè)數(shù)比較,獲取當(dāng)前最大值100;
第11步:比較結(jié)束。
程序代碼為:
mta口0]={23,4,56,?9,100,2,45,0,87,10};
inti,max;
max=a[0];
for(i=l;i<10;i++)
if(a[i]>max)
max=a[i];
printf("max=%d\n",max);
4.流程圖是一種用圖解方式來(lái)說(shuō)明解決一個(gè)方案所需完成的一系列操作。
例如:為了對(duì)上述求解。
5.C語(yǔ)言是結(jié)構(gòu)化的程序設(shè)計(jì)語(yǔ)言,C程序由一個(gè)或多個(gè)文件構(gòu)成,而文件可由一個(gè)或多個(gè)函數(shù)組成,函
數(shù)由語(yǔ)句構(gòu)成,表示語(yǔ)句結(jié)束,語(yǔ)句由表達(dá)式構(gòu)成,表達(dá)式由保留字、標(biāo)識(shí)符、運(yùn)算符構(gòu)成。
(1)函數(shù)的原型如下:
函數(shù)返回值函數(shù)名(形式參數(shù)表);
例如函數(shù):
doubleadd(double,double);
(2)函數(shù)代碼
類(lèi)型函數(shù)名(形式參數(shù)聲明)
函數(shù)體數(shù)據(jù)聲明部分
語(yǔ)句部分
例如函數(shù)定義:
doubleadd(doublex,doubley)/*類(lèi)型函數(shù)名(形式參數(shù)聲明)*/
{
doublez;/*數(shù)據(jù)聲明部分*/
z=x+y;/*以下兩行為語(yǔ)句部分*/
returnz;
}
(3)常見(jiàn)的保留字
保留字是指C語(yǔ)言中有特殊含義的字,只能用于C語(yǔ)言中特定的場(chǎng)合。例如:
int:用于定義整型變量。
float:用于定義實(shí)型變量。
double:用于定義雙精度變量。
char:用于定義字符變量或字符串變量。
if:用于判斷。
for:用于循環(huán)。
while:用于循環(huán)。
(4)標(biāo)識(shí)符
標(biāo)識(shí)符分為系統(tǒng)命名的標(biāo)識(shí)符與用戶(hù)自命名標(biāo)識(shí)符。通常用戶(hù)自定義標(biāo)識(shí)符以字母或下劃線(xiàn)開(kāi)頭,由字母、
數(shù)字和下劃線(xiàn)組成。
6.常量
(1)整型常量的表示方法:023、0x23、23等。
(2)實(shí)型常量的表示方法:2.71828,0.0、.54、0.3e2等。
(3)字符常量的表示方法:W
注意:轉(zhuǎn)義字符常量,如,\n\\101、'141,只代表一個(gè)字符。反斜線(xiàn)后的八進(jìn)制數(shù)可以不用0開(kāi)頭,如'101,
代表的就是字符常量K。反斜線(xiàn)后的十六進(jìn)制數(shù)只可由小寫(xiě)字母x開(kāi)頭,不允許用大寫(xiě)字母X,也不能用
Ox開(kāi)頭,如,X4I代表字符常量7V。
7.變量
在程序設(shè)計(jì)中,使用變量前都需要定義,定義變量意味著給變量分配存儲(chǔ)空間,變量的定義格式為:
類(lèi)型變量名;
例如定義兩個(gè)整型變量x、y
intx,y;
在程序中變量的地址是用“&變量名”來(lái)表示的。
8.字符串
字符串常量是由雙引號(hào)括起來(lái)的一串字符,如"string"就是字符串常量。在C語(yǔ)言中,系統(tǒng)在每個(gè)字符串
的最后自動(dòng)加入?個(gè)字符'\0'作為字符串的結(jié)束標(biāo)志。
(1)字符串的結(jié)束符'\0'占內(nèi)存空間,但在測(cè)試字符串長(zhǎng)度時(shí)不計(jì)在內(nèi),也不輸出。
(2)為字符串的結(jié)束符,但遇到,\0,不一定是字符串的結(jié)束,可能是八進(jìn)制數(shù)組成的轉(zhuǎn)義字符常量,如
字符串"abc\067de"表示6個(gè)字符,并非為3個(gè),因\067,為一個(gè)轉(zhuǎn)義字符。
9.運(yùn)算符
在C程序中有極為豐富的運(yùn)算符,例如算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符等。
(1)算術(shù)運(yùn)算符有+、-、*、-、%、++、-等操作。
注意:%只能適用于整型數(shù)運(yùn)算,表達(dá)式y(tǒng)=(x++)與丫=*++等同。
(2)關(guān)系運(yùn)算符主要用于比較,>、>=、<、<=的優(yōu)先級(jí)高于==、!=
⑶邏輯運(yùn)算符有邏輯與&&、邏輯或||和邏輯非!。
(4)位運(yùn)算符有~、&、|、八、?、?
10.編輯C程序時(shí)應(yīng)注意的問(wèn)題
編輯C程序?qū)?yīng)注意的問(wèn)題如下:
(1)C程序中區(qū)分大小寫(xiě)字母,書(shū)寫(xiě)格式自由,一行內(nèi)可寫(xiě)幾個(gè)語(yǔ)句。
(2)用“;”作為語(yǔ)句的結(jié)束標(biāo)記。
(3)函數(shù)定義如:main()、命令#include<stdio.h>、#definePI3.14159不是語(yǔ)句,后面不能用";"號(hào)。
(4)注釋用符號(hào)“/*”和“*/”來(lái)界定,“/”和“*”之間不可以有空格。
(5)可運(yùn)行程序中必須有一個(gè)main函數(shù),且只能有一個(gè)main函數(shù)。
(6)?個(gè)好的程序應(yīng)該有詳細(xì)的注釋。
1.2課本練習(xí)參考答案
一、選擇題
1.()是構(gòu)成C語(yǔ)言程序的基本單位。
A.函數(shù)B.過(guò)程C.子程序D.文件
2.()是C語(yǔ)言提供的合法的數(shù)據(jù)類(lèi)型關(guān)鍵字。
A.floatB.signedC.integerD.char
3.以下選項(xiàng)中不合法的用戶(hù)標(biāo)識(shí)符是()o
A.abc.cB.fileC.MainD.printf
4.以下選項(xiàng)中不合法的用戶(hù)標(biāo)識(shí)符是()o
A.123B._12C.A$D.Dim
5.合法的C語(yǔ)言字符常數(shù)是()o
A.'\084'B."A"C.'ab'D.'\x43'
6.合法的C語(yǔ)言字符常數(shù)是()o
A.'\t'B."A"C.54D.A
7.合法的C語(yǔ)言長(zhǎng)整型常數(shù)是().
A.OLB.5712700C.0.054838743D.2.1869el0
8.C語(yǔ)言中,要求運(yùn)算數(shù)必須是整型的運(yùn)算符是().
A.%B./C.<D.!
9.以卜.選項(xiàng)中正確的整型常量是()。
A.12.B.-20C.1,000D.0458
10.以下選項(xiàng)中正確的實(shí)型常量是()。
A.0B.3.1415C.0.329X102D.+.871
11.以卜選項(xiàng)中不正確的實(shí)型常量是().
A.2.607E-1B.0.8103e2C.77.77D.456e-2.0
參考答案:
1.A2.B3.A4.A5.D6.A
7.A8.A9.B10.B11.D
第2章輸入/輸出程序設(shè)計(jì)
2.1本章要點(diǎn)
1字符串的格式輸入與輸出
在計(jì)算機(jī)程序設(shè)計(jì)中最基本的就是輸入與輸出,輸入與輸出與變量的類(lèi)型有關(guān),例如用printf.scanf的格
式符%d、%lf、%c、%5控制整型變量、雙精度變量、字符變量、字符串的輸入與輸。
(1)字符串的輸出
字符串的輸出分兩種情況:
直接輸出
格式:printf("輸出字符串”);
例如:printf("********”);
printf(“請(qǐng)您輸入”);
格式輸出
格式:printff?%s……”,字符串變量地址,……);
例如:charstr[20]="abed";
printf("字符str的%s%s\n"內(nèi)容是",str);
(2)字符串的輸入
格式:scanf("%s……”,字符串變量地址,……);
例如:charstr[20];
scanf("%s”,str);
注意:scanf輸入以空格為分隔。在上式中如輸入:1234567abed(回車(chē))
字符串str的內(nèi)容為:123,數(shù)組名代表此數(shù)組的首地址。
2整型數(shù)的格式輸入與輸出
(1)整型數(shù)的格式輸出
格式:printffu%d……”,整型變量或整型數(shù),……);
例如:intx=0x20";
printf("x=0%o,x=0x%x,x=%dy=%-5d\n",x,x,x,200);
(2)整型數(shù)的格式輸入
格式:scanf("%d……”,整型變量地址,……);
例如:intx,y;
scanf("%d%d”,&x,&y);
此時(shí)要注意輸入的兩個(gè)整數(shù)用空格分隔,如果語(yǔ)句寫(xiě)成:
scanf("%d,%d",&x,&y);
則輸入的兩個(gè)整數(shù)用‘,'分隔。
3雙精度數(shù)的格式輸入與輸出
(1)雙精度數(shù)的格式輸出
格式:printf("%lf……;雙精度變量或雙精度數(shù),……);
例如:
doubley=0.51347e-3;
printf("%-6.3lf\n”,y);
(2)雙精度數(shù)的格式輸入
格式:scanf("%lf……”,雙精度變量地址,……);
例如:
doubley;
scanf(“%lf”,&y);
注意:在雙精度數(shù)輸入時(shí)不能控制精度,例如下列語(yǔ)句是錯(cuò)誤的:
doubley;
scanf("%6.2lf",&y);
4字符的格式輸入與輸出
(1)字符的格式輸出
格式:printf("%c……”,字符變量或字符,……);
(2)字符的格式輸入
格式:scanf("%c……”,字符變量地址,……);
例如:
charchl,ch2;
scanf("%c%c”,&chl,&ch2);
printf(,<%c%c%d\n",chl,ch2,chl-ch2);
注意:
(1)printf可以有修飾符,例:%6.2f、%-5d、%2c等;
(2)scanf輸入在變量地址,輸入時(shí)必須與控制格式一一對(duì)應(yīng);
(3)scanf輸入時(shí)%£或%肝不可以有精度控制,在%s時(shí)輸入以空格為分割;
(4)字符串的輸入可以使用函數(shù)gets、字符串的輸出可以使用函數(shù)puts。
例如:
charstr[100];
gets(str);
puts(str);
2.2課本練習(xí)參考答案
1.用函數(shù)printf輸出一個(gè)中空的三角星。
#include<stdio.h>
voidmain()
(
printtf"*");
printf("**");
printtf"***");
)
2.從鍵盤(pán)輸入兩個(gè)整型數(shù),實(shí)現(xiàn)兩個(gè)整型數(shù)的互換。
#include<stdio.h>
voidmain()
(
printff"Entertwointeger:\n");
intxl,x2,x;
scanf("%d%d"z&xl,&x2);
x=xl;
xl=x2;
x2=x;
printf("%d,%d”,xl,x2);
)
3.從鍵盤(pán)輸入-個(gè)三位的整數(shù),分別輸出它的個(gè)位數(shù)、十位數(shù)、百位數(shù)。
#include<stdio.h>
voidmain()
{
printf("Enteroneinteger:\n");
intx,yl,y2,y3;
scanf("%d"/&x);
yl=x%10;
x=x/10;
y2=x%10;
x=x/10;
y3=x%10;
("個(gè)位:十位:百位:
printf%d,%d,%d\n",ylzy2/y3);
)
4.寫(xiě)出以下程序的輸出結(jié)果。
#include<stdio.h>
voidmain()
{
inti=010,j=10;
',
printf(%d/%d\n"/++ij-);
)
答案:9,10
5.編寫(xiě)程序,屏幕提示“您是一個(gè)學(xué)生嗎”,可輸入V或次進(jìn)行回答,屏幕可輸出您的選項(xiàng)。
#include<stdio.h>
voidmain()
{
charx;
printf("您是一個(gè)學(xué)生嗎?您輸入V或'n'進(jìn)行回答:\n“);
scanf("%c",&x);
if(x=='y')
printf("您是一個(gè)學(xué)生\n“);
else
printf("您不是一個(gè)學(xué)生\n“);
)
6.從鍵盤(pán)輸入一個(gè)角度x,求10*sin(x)的值。
#include<stdio.h>
#include<math.h>
voidmain()
{
printff'Enteroneinteger:\n");
floatx;
scanf("%f',&x);
printf("10*sin(x)=%f\n"/10*sin(x));
}
第3章
循環(huán)程序設(shè)計(jì)
-本章要點(diǎn)與習(xí)題解答
3.1本章要點(diǎn)
1.while循環(huán)
While循環(huán)的格式如下:
while(條件表達(dá)式)
(
循環(huán)體
)
首先判斷循環(huán)的條件是否滿(mǎn)足,如條件滿(mǎn)足則執(zhí)行循環(huán)體,條件不滿(mǎn)足則退出循環(huán)體,此種循環(huán)有可能循
環(huán)體一次也不執(zhí)行。
例如:
while((ch=getchar())!=,#')
{
if(ch>=,A'&&ch<=,Z')
putchar(ch);
)
注意:
在循環(huán)體中不止一條語(yǔ)句時(shí)要形成語(yǔ)句塊,在(ch=getchar())中,括號(hào)不能省略。
2.do-while循環(huán)
do-while循環(huán)是后判斷循環(huán),不論循環(huán)的條件是否滿(mǎn)足,循環(huán)體至少應(yīng)執(zhí)行一次,do-while循環(huán)的語(yǔ)句格式
如下:
do
(
循環(huán)體
}while(表達(dá)式);
例如:
intsum=0,x;
do
(
scanf("%d”,&x);
sum+=x;
}while(x);
while與do^while在循環(huán)條件不滿(mǎn)足時(shí)是有區(qū)別的,例如:
語(yǔ)句段:
intn;
scanf("%d",&n);
while(n)
(
printf();
n--;
)
語(yǔ)句段:
intn;
scanf("%d",&n);
do
(
printf(y);
n-;
}while(n);
do~while在條件不滿(mǎn)足時(shí)還要執(zhí)行?次。
3.for循環(huán)
C語(yǔ)言中的for循環(huán)語(yǔ)句應(yīng)用比較靈活,雖然主要用于定數(shù)循環(huán),但也可以不定數(shù)循環(huán),它完全可以替代
while循環(huán)。
for語(yǔ)句格式如下:
for(初始化表達(dá)式;條件表達(dá)式;增量表達(dá)式)
{
循環(huán)體
)
例如:
for(;(ch=getchar())!=,#';)
if(ch>=,A'&&ch<='Z')
putchar(ch);
4.break語(yǔ)句和continue語(yǔ)句
break語(yǔ)句可應(yīng)用于循環(huán)體中或switch語(yǔ)句中。在循環(huán)中,當(dāng)程序執(zhí)行到break語(yǔ)句后,立即退出循環(huán);在
多分支語(yǔ)句中,程序遇到break語(yǔ)句時(shí),停止以下分支的執(zhí)行。
continue語(yǔ)句只能位于循環(huán)體內(nèi),執(zhí)行continue語(yǔ)句后,continue語(yǔ)句到循環(huán)體末尾之間的語(yǔ)句會(huì)被跳過(guò),
轉(zhuǎn)到循環(huán)條件判斷處,根據(jù)循環(huán)條件是否執(zhí)行下一次循環(huán)。break語(yǔ)句和continue語(yǔ)句往往與if一起使用。
例如語(yǔ)句段:
intn;
scanf("%d",&n);
while(n)
(
printf(…);
n-;
3.2課本練習(xí)參考答案
1.執(zhí)行語(yǔ)句for(i=0;i++<5;);后,變量i的值是(
A.6B.5C.4D.0
答案:A
2.若inti=O;下列語(yǔ)句計(jì)算1+2+…+10的是()<>
A.while(s+=i);B.for(;i<=10;i++,s+=i)
C.for(;i<=10;s+=ij++)D.for(;i<9;i++/s+=i)
答案:C
3.以下不是死循環(huán)的語(yǔ)句是()0
A.for(;;x++);B.while⑴{x++};
C.do{i++;}while(l)D.for(x=-10;x++;)
答案:D
4.以下for語(yǔ)句的循環(huán)次數(shù)是()o
intij=3;
for(;i=j;i-J-)
printf("%d",i);
A.2B.3C.4D.O
答案:B
5.若inti,x;則語(yǔ)句for(i=x=0;i<9:i+=++x);的循環(huán)體要執(zhí)行()次。
答案:3
6.下面的語(yǔ)句顯示輸出6行6列的整數(shù)數(shù)組h的從左上角到右下角主對(duì)角線(xiàn)上的所有元素,請(qǐng)補(bǔ)充完整:
forjinti=0;i<;)
printf("%d"z);
答案:for(inti=0;i<6;i++)
printf(”%d",h[i][i]);
7.寫(xiě)出以下程序運(yùn)行的結(jié)果,此程序?qū)崿F(xiàn)了什么功能?
#include<stdio.h>
voidmain()
{inta[10]={2,4,0,-5,10,6,-8,9,6,7};
inti,count=0;
for(i=0;i<10;i++)
if(a[i]==O)count++;
elsecontinue;
printf("%d\n",count);
}
答案:此程序功能:統(tǒng)計(jì)數(shù)組中0的個(gè)數(shù)。
8.寫(xiě)出以卜.程序的功能。
#include<stdio.h>
voidmain()
{
inta[10]={2,4,0,-5,10,6,-8,9,6,7},tmp,k;
for(k=0;k<10/2;k++)
(
tmp=a[k];
a[k]=a[10-k-l];
a[10-k-l]=tmp;
)
}
答案:此程序功能是第一個(gè)位置上的數(shù)和最后一個(gè)位置上的數(shù)交換,第二個(gè)位置上的數(shù)和最后二個(gè)位置上
的數(shù)交換,依次類(lèi)推。
9.寫(xiě)出以下程序運(yùn)行后的輸出結(jié)果。
#include<stdio.h>
voidmain()
(
intij;
for(i=0;i<6;i++)
(
for(j=0;j<i;j++)
printff'");
for(j=0;j<2*(5-i)-l;j++)
printf("*H);
printf("\n");
}
}
答案:此程序功能:輸出倒三角,具體如下圖所示。
*********
*******
*****
***
10.以卜程序功能為求1加到100的和。請(qǐng)改正卜列程序的錯(cuò)誤,改正后的程序?qū)懺谟疫叺目瞻滋?,并?/p>
機(jī)調(diào)試檢驗(yàn)。
(1)
#include<stdio.h>
voidmain()
{
inti,s;
i=l;s=0;
while(i<=100);
s=s+i;
i++;
,,
printf(l+2+3+―.+99+100=%d\n"/s);
)
答案::
#include<stdio.h>
voidmain()
(
inti,s;
i=l;s=0;
while(i<=100)
(
s=s+i;
i++;
}
printf(“1+2+3+….+99+100=%d\n",s);
}
(2)
#include<stdio.h>
voidmain()
{
inti,s;
i=l;
s=0;
while(i<=100)
s=s+i;
i++;
printf("l+2+3+-.+99+100=%d\n",s);
)
答案:
#include<stdio.h>
voidmain()
inti,s;
i=l;s=0;
while(i<=100)
{
s=s+i;
i++;
)
printf("l+2+3+―,+99+100=%d\n"/s);
)
11.輸入一個(gè)奇數(shù),例如輸入9,輸出為:求1*3*...*9的值。輸出為:l*3*5*7*9=945o
參考答案:
#include<stdio.h>
main()
{
intxj;
longinty=l;
printf("Pleaseinputanoddnumber:\n");
scanf("%d",&x);
for(i=l;i<=x;i+=2)
{
y=y*i;
if(i!=x)
printf("%d*”,i);
if(i==x)
printf("%d",i);
printf("=%ld\n"zy);
12.輸入一個(gè)5~10之間的整數(shù)n,求l!+2!+3!+…+n!。例如,輸入5,輸出為:1!+2!+3!+…+5!=1530
參考答案:
#include<stdio.h>
main()
{
intx,i,j;
longinty=O,k=l;
printff'Pleaseinputanumberbetween5and10:\n");
scanf(“%d”,&x);
for(i=l;i<=x;i++)
{
k=k*i;
y=y+k;
)
printf("y=%ld\n",y);
)
13.在屏幕上輸出以下內(nèi)容:
1
12
123
1234
12345
123456
1234567
12345678
123456789
參考答案:
#include<stdio.h>
main()
{
intij;
for(i=l;i<=9;i++)
{
for(j=l;j<=i;j++)
printf("%cl"j);
printffXn");
)
)
14.求2+4+6+…+98+100的和,用多種for表達(dá)式來(lái)完成。
參考答案:
#include<stdio.h>
voidmain()
{
inti,sum=0;
for(i=2;i<=100;i+=2)
sum=sum+i;
printf("sum=%d\n",sum);
)
15.輸入?個(gè)自然數(shù),輸出它的因子。例如輸入12,輸出2,2,3;輸入7,輸出7。
參考答案:
#include<stdio.h>
main()
intnumbeoi=2;
printf("Pleaseinputanumberin'');
scanf("%d”,&number);
printf("Thefactorsof%dare:\n",number);
while(i<=number)
{
if(number%i==O)
(
printf("%d"J);
number=number/i;
)
elsei++;
)
}
16.輸入一行字符,統(tǒng)計(jì)它有多少個(gè)字母?
參考答案:
#include<stdio.h>
voidmain()
{
charch[100];
inti,j,num=0;
printff'Pleaseinputletters:\n");
for(i=l;i<100;i++)
{
ch[i]=getchar();
if(ch[i]=='\n')
break;
)
for(j=l;j<i;j++)
{
if((chO]>='a'&&chO]<=,z')||(ch[j]>='A'&&ch[j]<=,Z'?
num++;
}
printff'Thenumberofthelettersare%d",num);
)
17.猜數(shù)字游戲,編寫(xiě)??個(gè)程序,隨機(jī)產(chǎn)生?個(gè)正整數(shù),讓人猜這個(gè)數(shù)字,每猜1次,計(jì)算機(jī)會(huì)告訴他是
大了還是小了。當(dāng)猜對(duì)了,計(jì)算機(jī)將祝賀他,并告訴他一共猜了多少次。
提示:程序中num將產(chǎn)生隨機(jī)產(chǎn)生?個(gè)正整數(shù)。
參考答案:
ttinclude<math.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
intmain(void)
intnum,guess,times;
srand((unsigned)time(NULL));
num=rand();
printff'Pleaseguessthenumber:\n");
for(times=l;times<=100;times++)
(
scanf(”%d,&guess);
if(guess>num)
printf("Toobig!Input'O'toshowtheanswer?Orguesson!\n*');
elseif(guess<num&&guess!=O)
printf("Toosmall!Input'O'toshowtheanswer?Orguesson!\n");
elseif(guess==O)
printf("Yougiveup?Theansweris%d"/num);
else
(
printff'Congratulations!Theyouhaveguessed%dtimes!",
times);
break;
)
)
)
第4章
分支結(jié)構(gòu)的程序設(shè)計(jì)
-本章要點(diǎn)與習(xí)題解答
4.1本章要點(diǎn)
1.if語(yǔ)句的三種形式
(1)if語(yǔ)句
用法:if(表達(dá)式)
語(yǔ)句塊
功能:如果表達(dá)式為"真"(非0),則執(zhí)行語(yǔ)句;否則,執(zhí)行if后面的語(yǔ)句。要注意,如果語(yǔ)句塊中由多
條C語(yǔ)句構(gòu)成,一定要構(gòu)成語(yǔ)句塊。
例如:在初速為V0的勻加速運(yùn)動(dòng)中,如果加速度a大于0,請(qǐng)輸出過(guò)t0秒時(shí)的速度與位移。
if(a>0)
{
u,>
printffv=%lf\nzvO+a*tO);
Mw
printf(s=%lf\nzvO*tO+l.O/2*a*tO*tO);
)
(2)if?else語(yǔ)句
if(表達(dá)式)
語(yǔ)句塊1
else
語(yǔ)句塊2
功能:如果表達(dá)式的結(jié)果為“真”(非0),則執(zhí)行語(yǔ)句塊1:否則,執(zhí)行語(yǔ)句塊2。
例如:
輸入一個(gè)整數(shù),判斷此整數(shù)能否被3整數(shù)。
intx;
scant)"%d",&x);
if(x%3==0)
printf("%d能夠被3整除\n");
else
printffu%d不能夠被3整除\n");
(3)
if(表達(dá)式1)
語(yǔ)句塊1
elseif(表達(dá)式2)
語(yǔ)句塊2
elseif(表達(dá)式n-1)
語(yǔ)句塊n-1
else
語(yǔ)句塊n
功能:從上到下依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真(非0)時(shí),執(zhí)行與其相對(duì)應(yīng)的語(yǔ)句,并跳過(guò)其
余條件的判別;如果所有的表達(dá)式均為假(0),則執(zhí)行語(yǔ)句n。
if(表達(dá)式1)
語(yǔ)句塊1
elseif(表達(dá)式2)
語(yǔ)句塊2
elseif(表達(dá)式n-1)
語(yǔ)句塊n-1
else
語(yǔ)句塊n
功能:從上到下依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真(非0)時(shí),執(zhí)行與其相對(duì)應(yīng)的語(yǔ)句,并跳過(guò)其
余條件的判別;如果所有的表達(dá)式均為假(0),則執(zhí)行語(yǔ)句n。
2.switch語(yǔ)句
switch語(yǔ)句格式如下:
switch(表達(dá)式)
case常量表達(dá)式1:
語(yǔ)句序列1
[break;]
case常量表達(dá)式2:
語(yǔ)句序列2
[break;]
case常量表達(dá)式n:
語(yǔ)句序列n
[break;]
default:
語(yǔ)句序列n+1
)
當(dāng)執(zhí)行switch語(yǔ)句時(shí),首先計(jì)算緊跟其后一對(duì)括號(hào)中的表達(dá)式的值,然后在switch語(yǔ)句體內(nèi)尋找與該值吻
合的case標(biāo)號(hào),如果有與該值相等的標(biāo)號(hào),則執(zhí)行該標(biāo)號(hào)后開(kāi)始的各語(yǔ)句,包括在其后的所有case和default
中的語(yǔ)句,直到break語(yǔ)句或switch語(yǔ)句體結(jié)束;如果沒(méi)有與該值相等的標(biāo)號(hào),并且存在default標(biāo)號(hào),則
從default標(biāo)號(hào)后的語(yǔ)句開(kāi)始執(zhí)行,直到switch語(yǔ)句體結(jié)束:如果沒(méi)有與該值相等的標(biāo)號(hào),且不存在default
標(biāo)號(hào),則跳過(guò)switch語(yǔ)句體,什么也不做。
4.2課本練習(xí)參考答案
1.if語(yǔ)句的表達(dá)式要表示判斷條件“x不等于0",下面表達(dá)式寫(xiě)法中正確的是()。
A.x=0B.xC.!xD.x<>0
答:B
2.以下程序的輸出結(jié)果是什么?
#include<stdio.h>
voidmain()
(
intx=l,y=-10;
if(x<++y)
if(y-<0)x+=y;
elsex+=3*y;
elsex=3*y;
printf("%d\n”,x);
)
答:27
3.以下程序段對(duì)輸入的兩個(gè)整數(shù)按從小到大輸出,請(qǐng)補(bǔ)充缺少的語(yǔ)句。
intx,y;
scanf("%d%d"z&x/&y);
if()
printf("%d/%d\n"zx/y);
else
',
printf(%d,%d\n"zyzx);
答:x<y
4.以卜程序段對(duì)輸入字符更改大小寫(xiě),請(qǐng)補(bǔ)充缺少的語(yǔ)句。
charch;
ch=getchar();
if()
ch=ch+32;
elseif()
ch=ch-32;
答案:ch>='A'&&ch<='Z,
ch>='a'&&ch<=,z'
5.編號(hào)程序,功能為輸入若干整數(shù)給x,使用if語(yǔ)句輸出x的絕對(duì)值,當(dāng)輸入0時(shí)結(jié)束。
#include<stdio.h>
voidmain()
{
inti;
scanf(”%d”,&i);
while(i)
(
if(i<0)
printf("%d”廠i);
else
printf("%d"J);
scanf("%d",&i);
)
}
6,編寫(xiě)程序,功能為將輸入字符的大寫(xiě)字符轉(zhuǎn)換成小寫(xiě)字符輸出,小寫(xiě)字符原樣輸出。
#include<stdio.h>
voidmain()
{
chars;
while((s=getchar())!='\n')
{
if(s>='A'&&s<=Z)
s+=32;
putchar(s);
}
)
7.編寫(xiě)程序,功能為輸入一批字符,按回車(chē)時(shí)結(jié)束,統(tǒng)計(jì)小寫(xiě)字符大寫(xiě)字符、數(shù)字字符或其他字符的個(gè)數(shù)。
#include<stdio.h>
voidmain()
intdaxie=0,xiaoxie=0,number=0/others=0;
chara;
while((a=getchar())!='\n')
{
if(a>='A'&&a<=Z)
daxie+=l;
elseif(a>='a'&&a<=*z')
xiaoxie+=l;
elseif(a>='0'&&a<='9')
number+=l;
else
others+=l;
}
printf("daxie=%dzxiaoxie=%d,number=%d/others=%d\n",daxie/xiaoxiez
number,others);
)
8.編寫(xiě)程序,計(jì)算分段函數(shù):
#include<stdio.h>
voidmain()
{
floaty,x;
printff'Pleaseinputx:\n");
scanf(”%f”,&x);
if(x<=l)
y=x+5;
elseif(x<10)
y=2*x;
else
y=y(x-10);
printf("y=%f"zy);
)
9.編寫(xiě)程序,功能為將輸入的百分制成績(jī)按五分制的成績(jī)輸出。百分制與五分制之間的關(guān)系見(jiàn)下表。
百分制五分制
90?1005
80?894
70-793
60?692
<601
#include<stdio.h>
voidmain()
inti;
printf("請(qǐng)輸入分?jǐn)?shù):”);
scanf(“%d,&i);
while(i<0&&i>100)
{
printf("請(qǐng)重新輸入分?jǐn)?shù),需在0至100之間”);
scanf("%d"z&i);
)
if(i>=90)
printf("相對(duì)應(yīng)的五分制:5\n");
elseif(i>=80)
printf("相對(duì)應(yīng)的五分制:4\n");
elseif(i>=70)
printf("相對(duì)應(yīng)的五分制:3\n“);
elseif(i>=60)
printf(“相對(duì)應(yīng)的五分制:2\n");
else
printf(“相對(duì)應(yīng)的五分制:l\n");
)
10.用switch語(yǔ)句完成如卜功能:讀入一個(gè)實(shí)數(shù)x,再輸入一個(gè)整數(shù),若輸入是1,則計(jì)算sin(x);若輸入
是2,則計(jì)算cos(X):若輸入是3,則計(jì)算tan(x):若輸入其他值,則顯示錯(cuò)誤信息。
#include<stdio.h>
#include<math.h>
intmain()
{
inta;
floatx;
scanf("%f%d"/&x/&a);
switch(a)
{
casel:printf("y=sin(x)=%f"/sin(x));break;
case2:printf("y=cos(x)=%f"/cos(x));break;
case3:printf("y=tan(x)=%f"/tan(x));break;
default:printf("Error!");break;
)
)
11.用switch語(yǔ)句完成如下功能:輸入星期1到星期5,輸出它們對(duì)應(yīng)的顏色。
星期1:blue
星期2:red
星期3:white
星期4:yellow
星期5:green
#include<stdio.h>
intmain()
intweekday;
scanf("%d,&weekday);
switch(weekday)
(
casel:printf("blue");break;
case2:printf("red");break;
case3:printf("white");break;
case4:printf("yellow");break;
case5:printf("green");break;
default:printf("Error!");break;
}
return0;
)
12.用switch語(yǔ)句完成如下功能:從鍵盤(pán)輸入A、B、C、D四個(gè)等級(jí)中的一個(gè),轉(zhuǎn)化輸出見(jiàn)下表。
等級(jí)輸出
A優(yōu)秀
B良好
C中等
D及格
E不及格
#include<stdio.h>
voidmain()
(
chardegree;
scanf("%c"z°ree);
switch(degree)
{
caseW:printf(“優(yōu)秀)break;
case'B':printf("良好");break;
case'C':printf("中等");break;
case'D':printf("及格");break;
case'E':printf("不及格");break;
default:printf("Error!");break;
}
}
13.寫(xiě)出以下程序運(yùn)行后的輸出結(jié)果。
#include<stdio.h>
voidmain()
{inta=Ozb=l;
switch(a)
{case0:
switch(b)
{case0:a-;b++;printf("a=%d/b=%d\n",a/b);break;
case1:a++;b--;printf("a=%dzb=%d\n"/a/b);break;
)
case1:a++;b++;printf("a=%d/b=%cl\n"za/b);
}
)
答案:
a=lzb=0
a=2,b=l
第5章
數(shù)組及其應(yīng)用
-本章要點(diǎn)與習(xí)題解答
5.1本章重點(diǎn)
1.數(shù)組是一種構(gòu)造類(lèi)型,數(shù)組有以下主要特點(diǎn):
1)每個(gè)數(shù)組中的元素類(lèi)型必須一致。
2)用不同的卜標(biāo)來(lái)區(qū)分?jǐn)?shù)組的元素。
3)數(shù)組在內(nèi)存中占有連續(xù)的存儲(chǔ)單元,數(shù)組名表示數(shù)組在內(nèi)存中的首地址。
4)數(shù)組和指針有著極密切的聯(lián)系,可以通過(guò)指針移動(dòng)來(lái)對(duì)數(shù)組元素進(jìn)行操作。
例如:
定義數(shù)組與指針:inta[10],*p;
數(shù)組中的元素a[i]都只能是整型數(shù),i取值范圍為0~9,用i來(lái)區(qū)分?jǐn)?shù)組的元素,在內(nèi)存空間中a[5]、a[6]的
物理地址是相鄰的,在這個(gè)數(shù)組中數(shù)組名a表示數(shù)組的首地址,也代表整個(gè)數(shù)組。如果同時(shí)定義指針,可
以用指針?lè)奖阋脭?shù)組元素。
P=a;
for(;p<a+10;p++)
printf("%6d
2.?維數(shù)組賦值?維數(shù)組賦值有三種方法:數(shù)組的初始化;程序中賦值;鍵盤(pán)中讀入。
例如:
(1)數(shù)組的初始化
inta[5]={10,20,30,40,50};
注意以下賦值是錯(cuò)誤的:
inta[5];
a⑸={10,20,30,40,50};或a={10,20,30,40,50};
3.字符數(shù)組
在C語(yǔ)言中,以字符VT作為字節(jié)符串結(jié)束標(biāo)記,它的ASCII代碼值為0、1CT占用存儲(chǔ)空間、不輸出,但不
計(jì)入串的實(shí)際長(zhǎng)度。
例如:字符數(shù)組定義:charstr[81]={<<abcl234");
此數(shù)組的長(zhǎng)度為7,占用8個(gè)內(nèi)存空間,因?yàn)橛蠥CT作為字節(jié)符串結(jié)束標(biāo)記。
注意:以下給數(shù)組的賦值是不合法的:
chars[10];s^Hellol";
4.數(shù)組元素的杳找
在本教材中,數(shù)組元素的查找中涉及到順序查找與二分法查找。
順序杳找可以應(yīng)用到無(wú)序數(shù)組中,順序查找是指從數(shù)組頭開(kāi)始到數(shù)組結(jié)束,最好情況查找一次就找到,最
壞的情況是查找到最后才有結(jié)果。
例如在n個(gè)元素的數(shù)組a中查找x出現(xiàn)的次數(shù)num,可用以下程序段:
for(num=0,i=0;i<n;i++)
if(a[i]==x)
num++;
二分法杳找應(yīng)用在有序排列的數(shù)組中,二分法杳找中先判斷數(shù)組中間這個(gè)元素是否是所要查找的,如果不
是,在第二次查找時(shí)數(shù)據(jù)量就減少一半,查找效率高。
例如在n個(gè)元素的有序數(shù)組a中查找x,應(yīng)用二.分法的程序段為:
while((low<=high)&&(found==0))
{
mid=(low+high)/2;
if(m<a[mid])
low=mid+l;
elseif(m>a[mid])
high=mid-l;
else
found=l;
}
5.數(shù)組元素的插入
在數(shù)組元素的插入中都會(huì)涉及到定位問(wèn)題,一種是把數(shù)據(jù)插入到某一確定的位置,此時(shí)只需把此位置后的
元素依次后移,把此位置空出,然后插入此數(shù);另?種是在有序數(shù)組中根據(jù)插入數(shù)的大小通過(guò)查找定位,
把此位置后的元素依次后移,空出此位置,然后插入此數(shù)。
例如:把數(shù)據(jù)num插入數(shù)組a中的確定位置X。
for(i=n-l;i>=x;i-)
(
a[i+l]=a[i];
)
a[x]=num;
n++;
6.數(shù)組元素的刪除
在數(shù)組元素的刪除中也會(huì)涉及到定位問(wèn)題,一旦確定了要?jiǎng)h除數(shù)據(jù)的位置,此時(shí)只需把此位開(kāi)始的元素依
次前移。數(shù)據(jù)的刪除也可分成兩種情況:一種是直接刪除某一位置上的數(shù):另一種情況是刪除某數(shù),這要
在數(shù)組中根據(jù)數(shù)的大小通過(guò)查找定位,而此時(shí)數(shù)組也可以分成兩種數(shù)組,即有序數(shù)組與無(wú)序數(shù)組,定位后
同樣把此位開(kāi)始的元素依次前移。
例如:把刪除數(shù)組a中確定位置x中的元素。
for(i=x;i<n;i++)
a[i]=a[i+l];
7.數(shù)組的排序
數(shù)組的排序的方法有很多,排序的優(yōu)劣主要考慮的是排序的速度與排序過(guò)程中占用內(nèi)存空間的大小。在本
節(jié)中主要學(xué)習(xí)冒泡排序與選擇排序。
(1)冒泡排序
冒泡排序的基本思想是:對(duì)于n個(gè)數(shù)進(jìn)行排序,假定是從大到小進(jìn)行排序,將相鄰兩個(gè)數(shù)依次比較,將大
數(shù)排列在前,即先將第?個(gè)數(shù)和第:個(gè)數(shù)比較,大數(shù)放前、小數(shù)放后,接著將第:個(gè)數(shù)和第三個(gè)數(shù)進(jìn)行比
較,大數(shù)放前、小數(shù)放后,然后依次類(lèi)推,經(jīng)過(guò)第輪比較以后,找到一個(gè)最小數(shù)排在最下面。接著進(jìn)行
下一輪比較,不斷進(jìn)行,直到最后一個(gè)數(shù),比較結(jié)束。
例如有以下數(shù)據(jù)進(jìn)行從小到大排列:1038126
第1輪比較是:10與3比交換,10與8比交換,10與12比不動(dòng),12與6比交換,其結(jié)果為:3810612,
最大一個(gè)數(shù)已比出,余下元素進(jìn)行第2輪比較。
第2輪比較是:3與8比不變,8與10比不變,10與6比交換,其結(jié)果為:3861012,次最大
一個(gè)數(shù)也已比出,余下元素進(jìn)行第3輪比較,依次類(lèi)推。
⑵選擇排序
在冒泡排序中,經(jīng)常要進(jìn)行兩個(gè)數(shù)之間的交換,程序執(zhí)行效率低。為了提高效率,通常采用選擇排序。假
定是從小到大排序,選擇排序的基本思想是在耍排序的一組數(shù)中,選出最小的一個(gè)數(shù)與第一個(gè)位置的數(shù)交
換;然后在剩卜.的數(shù)當(dāng)中再找最小的數(shù)與組數(shù)中第:個(gè)位置的數(shù)交換,如此循環(huán)到倒數(shù)第:個(gè)數(shù)和最后一
個(gè)數(shù)比較為止。在每一輪排序中,最多交換一個(gè)數(shù)據(jù)。
例如:
有以下數(shù)據(jù)要求用選擇排序法進(jìn)行從小到大排列:1038126
第1輪比較是:先設(shè)標(biāo)記flag=0,表示把第。個(gè)數(shù)作為最小數(shù),10與3比交換,3數(shù)值小,設(shè)標(biāo)記flag=l,
有標(biāo)記的數(shù)與8126比標(biāo)記不變,然后有標(biāo)記的數(shù)與10交換,形成數(shù)組3108126,然后進(jìn)行第2
輪比較。
第2輪比較是:先設(shè)標(biāo)記flag=l,表示把第1個(gè)數(shù)作為最小數(shù),10與8比交換,設(shè)標(biāo)記flag=2;8與12比,
標(biāo)記不變;8與6比,設(shè)標(biāo)記flag=4;然后有標(biāo)記的數(shù)與10交換,形成數(shù)組3681210,然后進(jìn)行
第3輪比較,依次類(lèi)推。
5.2課本練習(xí)參考答案
一、選擇題
1.在C語(yǔ)言中,引用數(shù)組元素時(shí),其數(shù)組下標(biāo)的數(shù)據(jù)類(lèi)型允許是().
A.整型常數(shù)B.整型表達(dá)式
C.整型常數(shù)或整型表達(dá)式D.任何類(lèi)型表達(dá)式
答:C
2.要說(shuō)明有20個(gè)int元素的數(shù)組,應(yīng)當(dāng)選擇語(yǔ)句()o
A.inta[10];B.inta[2,5];
C.inta[];D.int*a[10];
答:A
3.以下對(duì)?維數(shù)組a進(jìn)行正確初始化的語(yǔ)句是()。
A.inta[10]=(0,0,0,0,0);B.inta[10]={};
C.inta[]={0};D.inta[10]={10*l};
答:C
4.以下對(duì)外部的二維數(shù)組a進(jìn)行正確初始化的語(yǔ)句是().
A.inta[2][]={{l,2,3},{4,5,6}};
B.inta[][3]={{l,2,3},{4,5,6}};
C.inta[2][4]={{l,2,3},{4,5},{6});
D.inta[][3]={{l,2,3},{},{4,5});
答:B
二、編程題
1.從鍵盤(pán)輸入n個(gè)數(shù),找出最大數(shù)和最小數(shù)。
#include<stdio.h>
ttdefineSIZE100
voidmain()
{
inta[SIZE],i,max,min,n;
printf("請(qǐng)輸入數(shù)組元素的個(gè)數(shù)\n”);
scanf("%d",&n);
printf("請(qǐng)輸入數(shù)組元素\n“);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
max=a[0];
min=a[0];
for(i=l;i<n;i++)
(
if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];
)
printf("Thebiggestnumberis%d\n"/max);
printff'Thesmallestnumberis%d\n"/min);
}
2.采用遍歷查找,在數(shù)組夠注]={2,3,20,58,72,76,78,87,90,900}中找出偶數(shù)。
#include<stdio.h>
intmain()
{
inta[10]={2,3,20,58,72,76,78,87,90,900};
inti;
printff'Theevennumbersare:\n");
for(i=0;i<10;i++)
{
if(a[i]%2==0)
printf("%d"za[i]);
)
return0;
)
3.采用折半查找,在數(shù)組4$K日={2,3,20,58,72,76,78,87,90,900}中找到87,然后將其刪除。
#include<stdio.h>
intmain()
{
inta[10]={2,3,20,58,72,76,78,87,90,900};
intij/max=9/min=0/m=87;
i=(max+min)/2;
while(max>=min)
(
if(a[i]<m)
(
min=i;
i=(max+min)/2;
}
elseif(a[i]>m)
(
max=i;
i=(max+min)/2;
)
else
break;
)
for(j=i;j<9;j++)
a[j]=aO+l];
for(j=0;j<9;j++)
printf("%d”聲皿;
return0;
)
4.查找一個(gè)從鍵盤(pán)輸入的字符串中是否含有單詞“is”,有則輸出yes,否則輸出no。
#include<stdio.h>
intmain()
(
chars[100];
intij;
printff'Pleaseinputthewords:\n");
for(i=0;i<100;i++)
(
s[i]=getchar();
if(s[i]=='\n')
break;
)
if(s[0]=='i'&&s[l]==,s'&&s[2]==,')
printf("yes");
else
for(j=0;j<i;j++)
if(((s[j]<'A'||s[j]>'z')||(s[j]>'Z'&&s[j]<'a,))&&(sU+l]
=='i'&&s[j+2]==,s')&&((s[j+3]<,A,||sO+3]>'z')||(s[j+3]>
(
printfC'yes");
break;
)
)
if(j==i)
printf("no");
}
return0;
)
5.一個(gè)升序數(shù)組a[SIZE]={2,3,20,30,34,58,72,76,78,87,90,900},使用冒泡排序法,使其變成降序數(shù)組。
#include<stdio.h>
intmain()
{
intijzn,temp;
inta[12]={2,3,20,30,34,58,72,76,78,87,90,900};
for(i=0;i<12-l;i++)
for(j=0;j<12-i-l;j++)
if(a[j]<aO+l])
(
temp=a01;
a[j]=a[j+l];
a[j+l]=temp;
)
printf(“從大到小排序后的數(shù)組為:\n");
for(i=0;i<12;i++)
printf(”%6d”,a[i]);
printfCXn'1);
return0;
)
6.一個(gè)升序數(shù)組a[SIZE]={2,3,20,30,34,58,72,76,78,87,90,900},使用選擇排序法,使其變成降序數(shù)組。
#include<stdio.h>
intmain()
{
intij,n,k,temp;
inta[12]={2,3,20,30,34,58,72,76,78,87,90,900};
for(i=0;i<=12-l;i++)
{
k=i;
for(j=i+l;j<=12-l;j++)/*在a[SIZE]中選擇最小值的下標(biāo)*/
if(a[j]>a[k])/*用k指出每次在無(wú)序段中的最小元素*/
k=j;
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
)
)
printf("從大到小排序后的數(shù)組為:\n");
for(i=0;i<12;i++)
printf("%6d”,a[i]);
printf("\n");
return0;
)
第6章
函數(shù)及其應(yīng)用
-本章要點(diǎn)與習(xí)題解答
6.1本章重點(diǎn)
1.一個(gè)C源程序無(wú)論包含多少個(gè)函數(shù),C程序總是從main()函數(shù)開(kāi)始執(zhí)行,最后回到main()函數(shù)。C語(yǔ)言中
的函數(shù)可分為系統(tǒng)函數(shù)及自定義函數(shù)。
2.函數(shù)原型,其形式如下:
函數(shù)返回值類(lèi)型函數(shù)名(形式參數(shù)列表);
自定義函數(shù)的格式如下:
函數(shù)返回值類(lèi)型函數(shù)名(形式參數(shù)聲明)
{
函數(shù)體;
)
形參和實(shí)參結(jié)合分為兩種形式:數(shù)據(jù)復(fù)制方式和地址傳送方式。
請(qǐng)注意函數(shù)體定義、函數(shù)原形聲明、函數(shù)調(diào)用在形式上的區(qū)別。例如:
#include<stdio.h>
#include<math.h>
/*函數(shù)定義*/
doublepow3(doubleazdoubleb,doublec)
{
doublex,y;
x=pow(b,c);
y=pow(a,x);
returny;
)
intmain()
doublea,b,c,d;
doublepow3(doubleRouble,double);/*函數(shù)原形說(shuō)明*/
scanf("%lf%lf%lf"/&az&b,&c);
/*函數(shù)調(diào)用*/
d=pow3(a,b,c);
printf("%ld\n,d);
return0;
)
3.系統(tǒng)函數(shù)
C語(yǔ)言提供了豐富的庫(kù)函數(shù),如數(shù)學(xué)函數(shù)、字符和字符串處理函數(shù)、輸入/輸出函數(shù)等,調(diào)用C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函
數(shù)時(shí)要包含相應(yīng)的函數(shù)庫(kù)。
4.自定義函數(shù)
根據(jù)需要自己編寫(xiě)的函數(shù),對(duì)自定義函數(shù)的幾點(diǎn)說(shuō)明:對(duì)自定義函數(shù)的幾點(diǎn)說(shuō)明:
1)返回值類(lèi)型缺省的函數(shù)默認(rèn)為整型。當(dāng)函數(shù)在return表達(dá)式中的類(lèi)型與函數(shù)聲明的類(lèi)型不一致時(shí),函數(shù)
返同值的類(lèi)型以聲明類(lèi)型為準(zhǔn)。
2)函數(shù)調(diào)用在先、定義在后,應(yīng)有函數(shù)的聲明語(yǔ)句,函數(shù)聲明中參數(shù)的名稱(chēng)可省略,但類(lèi)型不可省略。
3)定義函數(shù)時(shí)的參數(shù)稱(chēng)為形參,函數(shù)調(diào)用時(shí)的參數(shù)稱(chēng)為實(shí)參,實(shí)際參數(shù)必須具有確定的值。形參與實(shí)參在
類(lèi)型與個(gè)數(shù)上必須一一對(duì)應(yīng),多個(gè)參數(shù)之間用逗號(hào)隔開(kāi)。函數(shù)的形參是函數(shù)的內(nèi)部變量,一旦函數(shù)執(zhí)行完
畢,形參所占的存儲(chǔ)空間將被系統(tǒng)收回。
4)函數(shù)參數(shù)傳遞時(shí)可分為值傳遞與地址傳遞,在任何情況下參數(shù)的傳遞都是單向的,形參數(shù)值的變化不會(huì)
影響到實(shí)參。
5.函數(shù)的嵌套與遞歸調(diào)用
一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù),叫函數(shù)的嵌套調(diào)用;一個(gè)函數(shù)直接或間接地調(diào)用自己,函數(shù)的叫遞歸調(diào)用。
遞歸函數(shù)常用于解決那些需要分多次求解,并且每次求解過(guò)程基本類(lèi)似的問(wèn)題。遞歸函數(shù)內(nèi)部對(duì)自身的每
一次調(diào)用都會(huì)導(dǎo)致一個(gè)與原問(wèn)題相似而范圍上要小一點(diǎn)的新問(wèn)題。例如:
intf(intx)
(
if(x>=2)
f(x/2);
printf(',%d",x%2);
return0;
)
在f函數(shù)中,如果x大于等于2,將再次調(diào)用函數(shù)f,即調(diào)用它自己,這叫做函數(shù)的遞歸調(diào)用。函數(shù)遞歸調(diào)
用時(shí),要借助于堆棧。最初堆棧為空,當(dāng)函數(shù)再次調(diào)用自己前,需把相關(guān)的變量放入堆棧,最后乂從堆棧
中彈出,直到堆??諡橹?。
6.2課本練習(xí)參考答案
?、閱讀程序,寫(xiě)出程序運(yùn)行的結(jié)果。
1.寫(xiě)出以下程序的執(zhí)行結(jié)果。
#include<stdio.h>
floataverfinta[])
intkzsum=0;
floatave;
for(k=0;k<10;k++)
sum+=*(a+k);
ave=(float)sum/10;
return(ave);
)
intmain()
{
floatave;
staticb[]={78,89,98,76,78,45,88,81,92,85);
ave=aver(b);
printf("ave=%f\n"/ave);
}
提示:數(shù)組b的首地址傳遞給形參a,*(a+k)就是數(shù)組元素b[k]。
答案:ave=81.000000
2.閱讀程序,寫(xiě)出程序的執(zhí)行結(jié)果。
#include<stdio.h>
voidabc(charstr[])
{inta,b;
for(a=b=0;str[a]!='\0';a++)
if(str[a]!='c,)
str[b++]=str[a];
str[b]='\0';
)
intmain()
{
charstr[]="abcdef";
abc(str);
printf("str[]=%s"zstr);
return0;
)
提示:數(shù)組str的首地址傳遞給形參str,str[a]就是實(shí)參中的數(shù)組元素str[a],當(dāng)數(shù)組元素不為工,時(shí)進(jìn)行復(fù)制。
答案:str[]=abdef
3.寫(xiě)出以下程序的執(zhí)行結(jié)果。
#include<stdio.h>
intsort(intb[],intn,intx)
{
intk;
for(k=n-l;k>=0;k-)
if(b[k]<x)
b[k+l]=b[k];
else
b
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年體育組織服務(wù)項(xiàng)目資金申請(qǐng)報(bào)告
- 2025年廣東省安全員知識(shí)題庫(kù)
- 2025年河北省張家口市單招職業(yè)適應(yīng)性測(cè)試題庫(kù)完整版
- 2025年阜新高等專(zhuān)科學(xué)校單招職業(yè)適應(yīng)性測(cè)試題庫(kù)一套
- 2025年呼倫貝爾職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)匯編
- 2025年度土地互換與農(nóng)村土地制度改革合同
- 2025年度客戶(hù)價(jià)格保密與農(nóng)業(yè)科技合作開(kāi)發(fā)合同
- 2025年度工地食堂員工滿(mǎn)意度調(diào)查與提升承包合同
- 2025年度夫妻雙方子女撫養(yǎng)權(quán)及探望權(quán)離婚協(xié)議書(shū)
- 2025年度房屋贈(zèng)予與遺產(chǎn)分配協(xié)議
- 燕窩采購(gòu)合同模板
- 小學(xué)五年級(jí)下冊(cè)外研版英語(yǔ):Module 5 模塊測(cè)試
- 諾如病毒課件教學(xué)課件
- 《城市軌道交通應(yīng)急處理》課件-《城市軌道交通應(yīng)急處理》項(xiàng)目四
- 臨建工程勞務(wù)承包條件
- 2024年山東省青島市中考道德與法治試題卷(含答案及解析)
- GB/T 44561-2024石油天然氣工業(yè)常規(guī)陸上接收站液化天然氣裝卸臂的設(shè)計(jì)與測(cè)試
- 員工履歷表(標(biāo)準(zhǔn)樣本)
- 薪酬管理制度、員工薪資結(jié)構(gòu)規(guī)定、薪酬福利管理制度
- 2024-2030年中國(guó)實(shí)驗(yàn)室自動(dòng)行業(yè)市場(chǎng)發(fā)展分析及投資發(fā)展戰(zhàn)略研究報(bào)告
- 睪丸扭轉(zhuǎn)的護(hù)理課件
評(píng)論
0/150
提交評(píng)論