一份C學(xué)習(xí)資料與習(xí)題解答_第1頁(yè)
一份C學(xué)習(xí)資料與習(xí)題解答_第2頁(yè)
一份C學(xué)習(xí)資料與習(xí)題解答_第3頁(yè)
一份C學(xué)習(xí)資料與習(xí)題解答_第4頁(yè)
一份C學(xué)習(xí)資料與習(xí)題解答_第5頁(yè)
已閱讀5頁(yè),還剩93頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論