《程序設(shè)計(jì)與C語言》課件第4章_第1頁(yè)
《程序設(shè)計(jì)與C語言》課件第4章_第2頁(yè)
《程序設(shè)計(jì)與C語言》課件第4章_第3頁(yè)
《程序設(shè)計(jì)與C語言》課件第4章_第4頁(yè)
《程序設(shè)計(jì)與C語言》課件第4章_第5頁(yè)
已閱讀5頁(yè),還剩193頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第4章語句及控制結(jié)構(gòu)4.1C語言語句4.2簡(jiǎn)單語句4.3輸入/輸出功能語句4.4條件語句4.5循環(huán)語句4.6轉(zhuǎn)向語句習(xí)題44.1C語言語句

C語言中,語句的含義也非常廣泛。任何數(shù)據(jù)成分,只要以分號(hào)結(jié)尾,就稱為語句,甚至只有一個(gè)分號(hào)也稱為語句(空語句)。分號(hào)是C語言中語句的標(biāo)志。一個(gè)語句可分寫成多行,只要未遇到分號(hào)就認(rèn)為還在同一個(gè)語句中;反之,在一行中也可以寫多個(gè)語句。也就是說,C程序的書寫是相當(dāng)自由的。不過為了醒目起見,最好一行只寫一條語句,并且根據(jù)不同的語法成分,錯(cuò)落有致地加以排列,這樣會(huì)更好地增加程序的可讀性。本章我們將詳述C中的語句。在學(xué)習(xí)一種語言時(shí),要對(duì)其使用的語法規(guī)則、語義含義等深刻理解,靈活運(yùn)用。表4-1中先給出了C語言中語句的類別、名稱及一般形式。4.2簡(jiǎn)單語句4.2.1空語句空語句在程序中只用一個(gè)分號(hào)表示:;它什么也不做。它主要用在:①轉(zhuǎn)向語句的轉(zhuǎn)向點(diǎn);②循環(huán)語句的循環(huán)體。若循環(huán)體為空,則其循環(huán)的動(dòng)作全在循環(huán)頭中進(jìn)行。4.2.2表達(dá)式語句表達(dá)式是由運(yùn)算符和運(yùn)算對(duì)象構(gòu)成的式子,本身并沒有執(zhí)行的功能,但如果在它的后面加上一個(gè)分號(hào),就變成了語句,可以被執(zhí)行了。雖然表達(dá)式的種類很多,但最常見的表達(dá)式語句多為賦值語句和函數(shù)調(diào)用語句。例如:i=3;x=PI*r*r;++i;printf(″Hello!″);其中前三個(gè)為賦值語句,第四個(gè)為函數(shù)調(diào)用語句。

x+3;也是個(gè)表達(dá)式語句,實(shí)現(xiàn)x和3相加,但它未改變x的內(nèi)容,也未引起其他變化,因此對(duì)這個(gè)語句的執(zhí)行沒有實(shí)際意義。

【例4-1】交換兩個(gè)變量的值。

解題思路:要交換兩個(gè)變量的值,必須借助第三者。設(shè)有兩個(gè)變量a和b,當(dāng)把a(bǔ)的數(shù)據(jù)直接賦給b時(shí)就會(huì)破壞b中的內(nèi)容,而通過第三個(gè)變量作中間過渡,就可以避免這種情況的發(fā)生,如圖4-1所示。圖4-1交換兩個(gè)變量值的示意圖程序?qū)崿F(xiàn)如下:#include<stdio.h>main(){inta,b,c;a=4,b=8;printf(″a=%d,b=%d\n″,a,b);c=a;a=b;b=c;printf(″a=%d,b=%d\n″,a,b);return0;}運(yùn)行輸出:a=4,b=8a=8,b=4其中,a=4,b=8;是逗號(hào)表達(dá)式(包含了賦值)語句。在前后兩個(gè)表達(dá)式的運(yùn)算互不相關(guān)的時(shí)候,可以用逗號(hào)運(yùn)算符把它們連起來,當(dāng)然也可以用分號(hào)。4.2.3復(fù)合語句把多條語句用花括號(hào)括起來即構(gòu)成所謂的復(fù)合語句,例如:{sum=sum+i+j;i++;j--;}復(fù)合語句對(duì)內(nèi)部來說有多條語句,對(duì)外部來說它又是一個(gè)整體,算是一個(gè)語句。復(fù)合語句通常用做循環(huán)語句的循環(huán)體或條件語句的分支。例如,在上例中假設(shè)只有在a大于b時(shí)才交換它們的值,則可以寫為if(a>b){c=a;a=b;b=c;}4.3輸入/輸出功能語句

C語言沒有提供專門的輸入/輸出語句,但是卻提供了有輸入/輸出功能的函數(shù),通過函數(shù)調(diào)用就可以達(dá)到輸入/輸出的目的。函數(shù)屬于表達(dá)式的一部分,因此函數(shù)調(diào)用語句也是表達(dá)式語句的一種。要使用這些輸入/輸出函數(shù),必須要把有關(guān)函數(shù)的信息告訴程序。告訴的方法是在程序頭部加上#include<stdio.h>說明。“stdio.h”是一個(gè)頭文件,stdio代表“standardinputandoutput(標(biāo)準(zhǔn)輸入/輸出)”,即用系統(tǒng)提供的標(biāo)準(zhǔn)輸入/輸出設(shè)備來進(jìn)行輸入/輸出。標(biāo)準(zhǔn)輸入設(shè)備有鍵盤,標(biāo)準(zhǔn)輸出設(shè)備有屏幕、打印機(jī)等。擴(kuò)展名“h”代表head,說明該文件是頭文件。#include是包含,它表示在編譯以前先把頭文件stdio.h包含進(jìn)來,程序中就可以使用標(biāo)準(zhǔn)輸入/輸出函數(shù)了。4.3.1字符輸入/輸出功能語句

1.getchar函數(shù)該函數(shù)形式為:

getchar()

getchar是函數(shù)名,后面圓括號(hào)內(nèi)是空的,說明該函數(shù)沒有參數(shù)。該函數(shù)的使用形式是:

〈字符變量〉=getchar();其功能是從鍵盤上敲入一個(gè)字符,然后把它賦給字符變量。需注意的是,所鍵入的字符并不立即賦給字符變量,只有在輸入一個(gè)回車符后,字符變量才能得到字符。要想使字符變量立即得到所鍵入的字符,可用getch()函數(shù)。單獨(dú)調(diào)用getchar()函數(shù)不能得到字符,但有其他用途,比如在程序的最后增加getchar();語句,可便于在用戶界面觀察程序的執(zhí)行結(jié)果。

2.putchar函數(shù)該函數(shù)形式為:

putchar(〈字符對(duì)象〉)

putchar是函數(shù)名,其參數(shù)可以是一個(gè)字符常量或字符變量。該函數(shù)的功能是向終端輸出一個(gè)字符。因整型和字符型是通用的,所以putchar函數(shù)也能夠把代表某個(gè)字符編碼的整數(shù)作為一個(gè)字符輸出。

【例4-2】字符輸入/輸出。#include<stdio.h>main(){charch1,ch2,ch3;ch1=getchar();ch2=getchar();ch3=getchar();putchar(ch1);putchar(′′);putchar(ch2);putchar(′′);putchar(ch3);putchar(′\n′);putchar(′\101′);putchar(66);putchar(′\″′);putchar(′\n′);return0;}運(yùn)行程序: 輸入: abc↙

輸出為: a└┘b└┘c AB″其中,′\101′是′A′的八進(jìn)制編碼,66是′B′的十進(jìn)制編碼,輸出結(jié)果中的表示一個(gè)空格,下同。注意:

如果輸入時(shí)按了空格鍵或回車鍵,則getchar函數(shù)會(huì)把空格符或換行符作為字符讀入。有時(shí)還可以直接用getchar和putchar輸入和輸出字符,不需要再定義一個(gè)字符變量,例如:

putchar(getchar());此時(shí),getchar()函數(shù)作為putchar()函數(shù)的參數(shù)被調(diào)用,它輸入的字符不經(jīng)轉(zhuǎn)手就被putchar輸出了。4.3.2格式化輸入/輸出功能語句

getchar、putchar函數(shù)只能對(duì)字符進(jìn)行輸入/輸出,而對(duì)其他類型的數(shù)據(jù)就必須用格式輸入/輸出函數(shù)進(jìn)行輸入/輸出。

1.printf函數(shù)這是一個(gè)格式化的輸出函數(shù),它使用的一般格式是:

printf(〈控制格式〉,〈輸出列表〉)前面我們已知,輸出的對(duì)象必須有相應(yīng)的控制字符限定修飾才能輸出,那么C中都有哪些控制字符呢?我們?cè)谶@里主要介紹以下控制字符:d,o,x,u,c,s,f,e,g,p。不同的控制字符用以輸出不同類型的數(shù)據(jù)。表4-2給出了要輸出的數(shù)據(jù)類型與其控制格式之間的對(duì)應(yīng)關(guān)系。

1)%d格式

(1)%d格式用來輸出十進(jìn)制整數(shù),按數(shù)據(jù)的實(shí)際長(zhǎng)度輸出。

(2)可以對(duì)輸出數(shù)據(jù)所占字節(jié)位數(shù)加以限制,方法是在%和d之間加一整數(shù),整數(shù)可正可負(fù)。正整數(shù)表示輸出數(shù)據(jù)在所給空間中右對(duì)齊,左邊留出空格;負(fù)整數(shù)表示左對(duì)齊,右邊留出空格。當(dāng)輸出數(shù)據(jù)位數(shù)大于所給空間時(shí),則可突破位數(shù)的限制,按其實(shí)際大小全部輸出,例如:

printf(″a=%5d″,13); 輸出為:a=└┘

└┘

└┘13 printf(″a=%-5d″,13); 輸出為:a=13└┘

└┘

└┘

printf(″a=%3d″,12345); 輸出為:a=12345

(3)%ld格式。當(dāng)輸出的數(shù)據(jù)大于32767時(shí),不能再用%d格式,這時(shí)應(yīng)該用長(zhǎng)格式%ld輸出。例如:

printf(″a=%ld″,1234567);的輸出為:a=1234567。也可以對(duì)長(zhǎng)格式的位數(shù)加以限制,方法如(2)。

2)%o格式

%o以八進(jìn)制形式輸出整數(shù),其機(jī)理是把整數(shù)在內(nèi)存中的ASCII編碼由低位向高位三位一組進(jìn)行分節(jié),每一節(jié)用一個(gè)八進(jìn)制數(shù)碼表示,這樣如果原來的數(shù)據(jù)為負(fù),則符號(hào)位的1也被作為八進(jìn)制數(shù)的一部分加以處理了。例如:

inta=-1; printf(″%d,%o\n″,a,a);的輸出為:-1,177777。a=-1的內(nèi)存形式為因此,用八進(jìn)制格式輸出整數(shù)時(shí)以正整數(shù)為宜。1111111111111111

3)%x格式(或%X)

%x以十六進(jìn)制形式輸出整數(shù),其機(jī)理和八進(jìn)制輸出一樣,只是它將對(duì)二進(jìn)制編碼按四位一組進(jìn)行分節(jié),每節(jié)用一個(gè)十六進(jìn)制數(shù)碼表示,同樣也不考慮符號(hào)。如:inta=-1;printf(″%d,%o,%x\n″,a,a,a);的輸出為:-1,177777,ffff。

4)%u格式

%u以十進(jìn)制形式輸出無符號(hào)整數(shù)??梢杂?u格式輸出定義為其他整數(shù)類型的數(shù)據(jù),用其他輸出整數(shù)的格式也可以輸出定義為無符號(hào)整數(shù)的數(shù)據(jù),只是要注意,這兩種情況只能在正整數(shù)的區(qū)間內(nèi)使用。

【例4-3】格式化輸出。#include<stdio.h>main(){inti=-2;unsignedintu=65535;printf(″u=%d,%o,%x,%u\n″,u,u,u,u);printf(″i=%d,%o,%x,%u\n″,i,i,i,i);return0;}運(yùn)行輸出:u=-1,177777,ffff,65535i=-2,177776,fffe,65534由例4-3的運(yùn)行輸出可以看出,%u格式是把最高位也作為數(shù)值位處理的,而%d格式是把最高位當(dāng)成符號(hào)位來處理的。

5)%c格式

%c格式輸出一個(gè)字符,和字符ASCII編碼對(duì)應(yīng)的整數(shù)也以字符形式輸出,并可以為其指定長(zhǎng)度。例如charc=′a′;printf(″c=%c,%c\n″,c,97);printf(″c=%5c\n″,c);則結(jié)果為:c=a,ac=└┘└┘└┘a

6)%s格式

%s格式用來輸出字符串。

(1)%s格式按實(shí)際大小輸出字符串,但若字符串中含有′\0′字符,則輸出到′\0′截止,即并不把雙引號(hào)中的內(nèi)容全部輸出。例如:

printf(″s=%s\n″,″China″);輸出:s=China printf(″s=%s\n″,″China\0Japan″);輸出:s=China字符′\0′后的內(nèi)容被舍掉,′\0′本身也不輸出。如果字符串中有控制字符,則控制字符也會(huì)發(fā)揮作用。例如:

printf(″%s\n″,″China\nJapan″);則輸出為:

China Japan

(2)指定輸出字符串的長(zhǎng)度,規(guī)則如前。例如:

printf(″s=%6s″,″book″);輸出:s=└┘└┘book(右對(duì)齊) printf(″s=%-6s″,″book″);輸出:s=book└┘└┘(左對(duì)齊) printf(″s=%2s″,″book″);輸出:s=book(突破限制)

(3)輸出字符串前端的部分字符格式%<m>.<n>s。這種格式指明:在m列寬度中輸出字符串的前n個(gè)字符,當(dāng)m<n時(shí),有m=n。例如:

printf(″s=%5.3s″,″China″);輸出:s=└┘└┘Chi printf(″s=%-5.3s″,″China″);輸出:s=Chi└┘└┘

printf(″s=%2.3s″,″China″);〖HT5SS]輸出:s=Chi

7)%f格式

%f格式以小數(shù)形式輸出單精度、雙精度類型的浮點(diǎn)數(shù)。

(1)以%f格式輸出浮點(diǎn)數(shù)時(shí),整數(shù)部分全部輸出,小數(shù)部分輸出6位,但輸出的不一定全是有效數(shù)字。對(duì)單精度數(shù)只有左邊7位有效,而對(duì)雙精度數(shù)只有前16位有效。

(2)也可以指定輸出的寬度和小數(shù)位數(shù),例如:

printf(″f=%10.2f\n″,123.456);輸出:f=└┘└┘└┘└┘123.46輸出寬度中包含小數(shù)點(diǎn)位數(shù),小數(shù)部分進(jìn)行四舍五入。

printf(″f=%-10.2f″,123.456);輸出:f=123.46 printf(″f=%1.2f″,123.456);輸出:f=123.46└┘└┘└┘└┘當(dāng)所給寬度小于數(shù)據(jù)位數(shù)時(shí)會(huì)自動(dòng)突破位數(shù)的限制,這時(shí)數(shù)據(jù)的整數(shù)部分全部輸出,小數(shù)部分按要求輸出。

8)%e格式(或%E)

%e格式以指數(shù)形式輸出浮點(diǎn)數(shù),包括單精度數(shù)和雙精度數(shù)。輸出時(shí),尾數(shù)的整數(shù)部分只有1位,系統(tǒng)自動(dòng)指定尾數(shù)的小數(shù)部分的寬度和指數(shù)部分的寬度。對(duì)此不同的系統(tǒng)有不同的規(guī)定。對(duì)TurboC來說,小數(shù)部分6位,指數(shù)部分4位(包括字母e或E,1位階符,2位階碼)。例如:

printf(″f=%e″,123.456);輸出:f=1.234560e+02也可以指定輸出寬度和尾數(shù)的小數(shù)位數(shù):

printf(″f=%10.2e″,123.456);輸出:f=└┘└┘1.23e+02同樣,當(dāng)總寬度定義得小時(shí)會(huì)被突破。當(dāng)有小數(shù)部分時(shí),輸出至少要用6位:尾數(shù)的整數(shù)1位,小數(shù)點(diǎn)1位,指數(shù)部分的4位。這6位再加上小數(shù)部分指定的位數(shù),即為實(shí)際使用的位數(shù),例如:

printf(″f=%6.2e″,123.456); 輸出:f=1.23e+02輸出占用了8位。

9)%g格式(或%G)

%g格式用于輸出尾數(shù)中不帶無效0的浮點(diǎn)數(shù),以盡可能地少占輸出寬度。例如:

printf(″g=%g″,123.4); 輸出:g=123.4這種輸出更符合人們的閱讀習(xí)慣。

10)%p格式

%p格式用于輸出變量的地址,而變量的地址是由編譯程序分配的。通過查看變量的地址,可以知道變量在內(nèi)存中的相對(duì)位置。例如:

inta,b; printf(″&a=%p,&b=%p\n″,&a,&b);輸出:&a=FFD4, &b=FFD2

11)對(duì)printf函數(shù)控制字符的進(jìn)一步說明

(1)以上介紹了10種控制字符的一般用法,為了滿足特殊的要求,還可以對(duì)控制字符加一些特殊的修飾。修飾符或標(biāo)志共有6種,如表4-3所示。標(biāo)志的具體用法看下面的例子。

【例4-4】標(biāo)志的具體用法。#include<stdio.h>main(){printf(″%+d\t%+d\n″,786,-786);/*輸出:+786-786*/printf(″a=%d\ta=%d\n″,5,-5);/*輸出:a=5a=-5*/printf(″%#o\n″,1427);/*輸出:02623*/printf(″%#x\n″,1427);/*輸出:0x593*/printf(″%g\n″,1427.00);/*輸出:1427*/ printf(″%#g\n″,1427.00);/*輸出:1427.00*/ printf(″%+09d″,125);/*輸出:+00000125*/ printf(″%*.*f″,7,2,87.4573);/*輸出:87.46*/ printf(″%-+09d″,125);/*輸出:+125,此時(shí)0占位符不起作用,只有在域?qū)挻笥跀?shù)據(jù)位數(shù)且是右對(duì)齊時(shí),0占位符才起作用*/ return0; }其中:″%+09d″中的9是輸出總域?qū)?,包括在正?shù)前所加的“+”字符,0表示用0來填充;printf(″%*.*f″,7,2,87.4573);中的*號(hào)表示的數(shù)值是由后面的參數(shù)提供的,兩個(gè)*號(hào)分別和7、2相對(duì)應(yīng),也就是″%7.2f″這樣的格式。采用格式串中用不定寬度表示而后由參數(shù)確定的格式有一定的靈活性。

(2)精度說明。我們已介紹過用%f和%e對(duì)浮點(diǎn)數(shù)的輸出作精度說明,同樣對(duì)%d和%g控制符我們也可以作精度說明。

%d的精度說明是指至少要打印的數(shù)字位數(shù),例如:

printf(″%.9d″,123);輸出:000000123多余的位數(shù)用0填充。

%g的精度說明是指輸出的有效數(shù)字的最大位數(shù),例如:

printf(″%.3g″,12.389);輸出:12.4

(3)程序中易出現(xiàn)的錯(cuò)誤:①把除%X、%G、%E外的控制字符寫成大寫,如%D等。②試圖用%c格式輸出字符串的第一個(gè)字符。如:

printf(″%c″,″China″);這樣輸出不了′C′。③試圖用%s格式輸出字符。如:

printf(″%s\n″,′a′);結(jié)果也是錯(cuò)誤的。

2.scanf函數(shù)

scanf函數(shù)能對(duì)各種類型的數(shù)據(jù)變量進(jìn)行格式化輸入。

scanf函數(shù)的一般格式為:

scanf(〈控制格式〉,〈輸入列表〉)前面我們已知,scanf的輸入列表中是以逗號(hào)分開的變量的地址,即每個(gè)變量名前面必須加一個(gè)地址運(yùn)算符&。而在控制格式串中必須有和后面地址相對(duì)應(yīng)的控制字符,里面還可以出現(xiàn)非控制字符,如果出現(xiàn)有非控制字符,則在輸入時(shí)必須也把它們輸入,否則就會(huì)發(fā)生輸入錯(cuò)誤。例如:inta,b,c;scanf(″%d,%d,%d″,&a,&b,&c);格式控制串中除有三個(gè)格式控制符%d外,還有兩個(gè)逗號(hào),這兩個(gè)逗號(hào)在輸入時(shí)也必須輸入,即必須按如下格式輸入:

3,4,5↙

如果輸入時(shí)以

345↙形式敲入,則會(huì)出現(xiàn)錯(cuò)誤。為了避免這種錯(cuò)誤,在控制串中最好不要加入其他成分,以免在輸入時(shí)忘掉或不匹配。如果在輸入格式控制串中沒有其他字符,如:

scanf(″%d%d%d″,&a,&b,&c);則輸入時(shí)就可以非常靈活多樣。例如,可以作

3└┘└┘4└┘└┘5↙這樣的輸入,也可以隨意換行,作

3↙ 4└┘└┘5↙這樣的輸入,只要能把兩個(gè)整數(shù)分開即可。表4-4列出了輸入的數(shù)據(jù)與其所用的控制符之間的對(duì)應(yīng)關(guān)系。在表4-4中的基本輸入控制符之前還可以再加如表4-5所示的修飾符。例如:

inta,b; scanf(″%2d%*3d%*2c%2d″,&a,&b);若輸入:

12345&&67↙

則結(jié)果為a=12,b=67。%*3d會(huì)把345舍掉,%*2c會(huì)把&&舍掉。應(yīng)注意,和%*3d對(duì)應(yīng)的應(yīng)該是三位數(shù)字,和%*2c對(duì)應(yīng)的應(yīng)該是兩個(gè)字符。這種方法主要用于對(duì)已有數(shù)進(jìn)行選取,一般不用。注意:

(1)用′%c′格式輸入時(shí),敲入的任何字符,包括空格,均作為有效字符輸入。

(2)用scanf輸入時(shí),應(yīng)做到變量類型、輸入格式和輸入數(shù)據(jù)三者相一致。例如有變量定義:inta,b,c;longintl1,l2,l3;floatx,y,z;doubled1,d2,d3;

①輸入數(shù)據(jù)和控制格式不一致時(shí)會(huì)出錯(cuò)。例如對(duì)于

scanf(″%d%d%d″,&a,&b,&c);輸入:

23.4└┘65└┘71.8↙

則a、b、c均無正確的整數(shù)值。②用短格式輸入長(zhǎng)變量時(shí)會(huì)出錯(cuò),如scanf(″%d%d″,&l1,&l2);scanf(″%f%f″,&d1,&d2);③用長(zhǎng)格式輸入短變量時(shí)也會(huì)出錯(cuò),如

scanf(″%ld%ld″,&a,&b);scanf(″&lf&lf″,&x,&y);④對(duì)長(zhǎng)變量只能用長(zhǎng)格式進(jìn)行輸入,下面的寫法是正確的:

scanf(″%ld%ld″,&l1,&l2);scanf(″%lf%lf″,&d1,&d2);對(duì)格式化輸入/輸出的具體細(xì)節(jié)在上機(jī)時(shí)應(yīng)多加注意和練習(xí),這樣才能逐漸明白和掌握。

【例4-5】輸入一個(gè)字符,求其先導(dǎo)字符和后繼字符。

編程思路:對(duì)字符的輸入,既可以用getchar函數(shù),也可以用“%c”控制格式;輸出時(shí)既可以用putchar函數(shù),也可以用“%c”作格式輸出。字符是有序類型,故可求其先導(dǎo)和后繼,前后字符的ASCII編碼相差為1。#include<stdio.h>main(){charc,ch,pre,pos;c=getchar();pre=c-1;putchar(pre);putchar(′,′);putchar(c);putchar(′\n′);scanf(″%c″,&ch);pos=ch+1;printf(″%c,%c″,ch,pos);return0;}運(yùn)行輸出:ii↙

h,ii,j

注意:輸入時(shí)一定要敲入兩個(gè)字符再按回車鍵,這樣一個(gè)字符給變量c,一個(gè)字符給ch。如果只輸入一個(gè)字符就按回車鍵,則把這個(gè)字符交給了變量c,而把回車符交給了變量ch,它就輸出不出來了。凡涉及字符輸入時(shí)都要考慮這種情況。

【例4-6】輸入一個(gè)球的半徑,求其體積;輸入一個(gè)圓柱體的底面半徑和高,求圓柱體的表面積。

編程思路:①找出和問題有關(guān)的量,每個(gè)量用一個(gè)變量表示。本題需要定義5個(gè)變量:球半徑rg,球體積volume,圓柱底面半徑rs,高h(yuǎn),表面積area。②寫出數(shù)學(xué)公式:③把代數(shù)公式轉(zhuǎn)換成C語言的表達(dá)式形式:volume=4*π*rg*rg*rg/3area=2*π*rs*rs+2*π*rs*h④C語言中沒有π這個(gè)字符,必須用一個(gè)常數(shù)代換它,因?yàn)閷?duì)它要使用多次,所以可以把它定義為符號(hào)常量,方法如下: #definePI3.141593于是可寫出程序如下:

#include<stdio.h>#definePI3.141593main(){floatarea,volume,rg,rs,h;printf(″Inputradiumofglobal:\n″);

scanf(″%f″,&rg);volume=4*PI*rg*rg*rg/3;

printf(″Inputradiumandhightofcolumn:\n″);scanf(″%f%f″,&rs,&h);area=2*PI*rs*rs+2*PI*rs*h;printf(″Thevolume=%10.2f\n″,volume);printf(″Thearea=%-10.2f\n″,area);return0;}運(yùn)行輸出:

Inputradiumofglobal: 3.5↙

Inputradiumandhightofcolumn:

4.24.5↙

Thevolume=└┘└┘└┘└┘179.59(右對(duì)齊) Thearea=229.59└┘└┘└┘└┘(左對(duì)齊)

【例4-7】輸入一個(gè)三位數(shù),分別以十進(jìn)制格式(%d)和字符格式(%c)輸出其百位、個(gè)位、十位數(shù)字。編程思路:①首先運(yùn)用求模(%)和整除(/)運(yùn)算求出個(gè)位、十位、百位上的數(shù)字。②根據(jù)數(shù)字和相應(yīng)數(shù)字字符之間的關(guān)系確定與個(gè)位、十位和百位上的數(shù)字對(duì)應(yīng)的字符。數(shù)字和相應(yīng)數(shù)字字符的關(guān)系如下: 數(shù)字+′0′=相應(yīng)數(shù)字字符如7+′0′=′7′,9+′0′=′9′。程序如下:#include<stdio.h>main(){intn,ge,shi,bai;printf(″Inputaninteger:\n″);scanf(″%d″,&n);ge=n%10;shi=(n/10)%10;bai=n/100;printf(″bai:%d\n″,bai);printf(″digit:%d%d%d\n″,bai,shi,ge);printf(″chara:%c%c%c\n″,bai+′0′,shi+′0′,ge+′0′);return0;}運(yùn)行輸出:Inputaninteger:379↙

digit:379chara:3794.4條件語句

C語言中有兩種條件語句:雙分支的if語句和多分支的switch語句。根據(jù)不同的情況恰當(dāng)?shù)厥褂盟鼈?,可以提高編程效率?.4.1if語句

1.if語句的一般形式

if語句的一般形式是:

if(〈表達(dá)式〉)〈語句1〉else〈語句2〉

if語句的語義如圖4-2所示。圖4-2if語句的語義首先對(duì)表達(dá)式求值,若值為真就執(zhí)行語句1,否則就執(zhí)行語句2。

說明:

(1)語句1和語句2可以是簡(jiǎn)單語句,也可以是復(fù)合語句。else前若是簡(jiǎn)單語句則必須由分號(hào)結(jié)束,不要認(rèn)為分號(hào)會(huì)把整個(gè)if語句攔腰截?cái)?,事?shí)上不加分號(hào)在C語言中反而是錯(cuò)誤的。

(2)語句2也可以沒有,這時(shí)的if語句結(jié)構(gòu)稱為單路結(jié)構(gòu);若兩個(gè)分支都有則稱為雙路結(jié)構(gòu)。

【例4-8】輸入三角形的三邊,求三角形的面積。編程思路:①定義4個(gè)變量a,b,c和area,分別表示三角形的三條邊與面積。②由三邊求三角形面積的公式是:其中,在C語言中寫為s=(a+b+c)/2。開平方要調(diào)用C語言提供的內(nèi)部函數(shù)sqrt(),有關(guān)這個(gè)函數(shù)的性質(zhì)在math.h頭文件中說明,因此在程序中應(yīng)該把這個(gè)頭文件包含進(jìn)來。③根據(jù)數(shù)學(xué)知識(shí),三角形任意兩邊之和大于第三邊,因此對(duì)輸入的三邊必須進(jìn)行判斷,以保證輸入的三邊能夠構(gòu)成一個(gè)有意義的三角形。程序如下:#include<stdio.h>#include<math.h>main(){floata,b,c,area,s;printf(″Input3edges:\n″);scanf(″%f%f%f″,&a,&b,&c);if(a+b>c&&b+c>a&&a+c>b){s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));printf(″Thearea=%.2f″,area);}elseprintf(″Inputerror!\n″);return0;}運(yùn)行輸出:Input3edges:237↙

Inputerror!再運(yùn)行一次:Input3edges:357↙Thearea=6.50

2.if語句的嵌套在if語句中,它的任一分支又可以是一個(gè)if語句,這樣就形成了嵌套的if語句,其一般形式為:if(〈條件1〉)〈語句1〉elseif(〈條件2〉)〈語句2〉

elseif(〈條件n〉)〈語句n〉else〈語句n+1〉其語義如圖4-3所示。圖4-3嵌套的if語句的語義

寫嵌套的if語句時(shí)應(yīng)注意以下問題:

(1)if和else應(yīng)配對(duì)出現(xiàn),每一個(gè)else和離它最近且尚未匹配的if相匹配。

(2)應(yīng)在條件為真時(shí)執(zhí)行一個(gè)操作,而在條件為假時(shí)再去測(cè)試下一個(gè)條件。不要在某條件成功后再接著去測(cè)試下一個(gè)條件,這樣做的話,在嵌套層次數(shù)多時(shí)會(huì)失去智力上的控制,即不要寫成下面的形式:if〈條件1〉if〈條件2〉if〈條件3〉

else…else…else…

(3)在嵌套的多個(gè)條件中,應(yīng)盡量把求值為真的概率最大的條件放在前面優(yōu)先判斷,這樣可以提高if語句的運(yùn)行效率。例如:在學(xué)生成績(jī)的登記中,90分以上為A,80~90分為B,70~80分為C,60~70分為D。如果80~90分之間的學(xué)生最多,就應(yīng)先對(duì)這個(gè)分?jǐn)?shù)段進(jìn)行處理:if(score>=80&&score<90)printf(″B″);elseif(score>=90){printf(″A″);printf(″Verygood!\n″);} elseif(score>=70) printf(″C″); else printf(″D″);這樣寫是為了避免在嵌套層數(shù)過多時(shí)語句不斷向右縮而使一行的空間不斷減少,從而不得不使語句折行,那樣就破壞了程序的可讀性,因此我們推薦上面這種寫法,即不管嵌套多少層,都使else處在同一列上。在條件score>=90成立的情況下有兩條語句,它們構(gòu)成了復(fù)合語句,因此要用花括號(hào)括起來,如果缺少花括號(hào),則會(huì)出現(xiàn)錯(cuò)誤。

【例4-9】輸入一個(gè)字符,若為數(shù)字字符,則輸出Number;若為大寫字母,則輸出Upper;若為小寫字母,則輸出Lower;若為回車換行符,則輸出ReturnLine,其他字符則輸出Other。編程思路:①用嵌套的if語句對(duì)輸入的字符進(jìn)行連續(xù)判斷。②C語言中沒有集合運(yùn)算符,要判斷一個(gè)對(duì)象是否屬于某個(gè)集合,應(yīng)該列出這個(gè)集合的上下界,這要用關(guān)系運(yùn)算符和邏輯運(yùn)算符來描述范圍。程序如下:#include<stdio.h>main(){charch;printf(″Inputacharacter:\n″);ch=getchar();if(ch==′0′&&ch<=′9′)printf(″Number\n″);elseif(ch>=′A′&&ch<=′Z′) printf(″Upper\n″);elseif(ch>=′a′&&ch<=′z′) printf(″Lower\n″);elseif(ch==′\n′) printf(″ReturnLine\n″);elseprintf(″Other\n″);return0;}運(yùn)行輸出:Inputacharacter:A↙

Upper

注意:不能把代數(shù)中的不等式簡(jiǎn)單地搬到C語言中來,如表示大寫字母的范圍應(yīng)該寫成ch>=′A′&&ch<=′Z′,而不能寫成′A′<=ch<=′Z′。

if語句在程序中常見的錯(cuò)誤是:①忘記標(biāo)記復(fù)合語句的一個(gè)或兩個(gè)花括號(hào)。對(duì)嵌套在中間的復(fù)合語句來說,這樣會(huì)引起語法錯(cuò)誤;對(duì)最后的一個(gè)復(fù)合語句來說,這樣會(huì)引起邏輯錯(cuò)誤。②if結(jié)構(gòu)的條件部分沒有用圓括號(hào)括起來,如:ifa>b…。③在if結(jié)構(gòu)的條件部分后面加分號(hào),這樣在單路選擇中會(huì)出現(xiàn)邏輯錯(cuò)誤,在雙路選擇中會(huì)出現(xiàn)語法錯(cuò)誤。例如:

if(a>b);printf(″OK″):原意為當(dāng)a大于b時(shí)打印OK,現(xiàn)在的情況是不管a是否大于b都打印OK。if(a>b);printf(″Yes″);elseprintf(″No″);這時(shí)會(huì)出現(xiàn)語法錯(cuò)誤。

3.if語句中條件表達(dá)式的靈活設(shè)置因?yàn)镃語言中是用非0和0來表示真和假的,所以條件的表示可以有多種形式:

(1)用一個(gè)數(shù)值表示條件。如:intm;scanf(″%d″,&m);if(!m)printf(″Yes″);其中if(!m)等價(jià)于if(m==0)。

(2)將賦值運(yùn)算和條件判斷結(jié)合起來。如:charch;if((ch=getchar())!=′\n′)putchar(ch);這里先調(diào)用getchar函數(shù),輸入一個(gè)字符,賦給ch,再判斷ch是否為回車符,若不是回車符則將其輸出。

(3)用復(fù)合的邏輯表達(dá)式表示條件。如:

if(score>70&&score<80)printf(″B″);此時(shí)常犯的錯(cuò)誤是寫成數(shù)學(xué)中的不等式形式:

if(70<score<80)數(shù)學(xué)中的式子要經(jīng)過適當(dāng)改造才能用于C程序中,不能直接照搬。

4.if語句和條件表達(dá)式的關(guān)系如有條件表達(dá)式語句max=a>b?a:b;,其功能是把a(bǔ)、b中的最大者賦給變量max,用if語句來實(shí)現(xiàn)即為:if(a>b)max=a;elsemax=b;在條件不太復(fù)雜的情況下,用條件表達(dá)式比較簡(jiǎn)單,但如果條件復(fù)雜,嵌套層數(shù)較多時(shí),還是用if語句為好。在程序設(shè)計(jì)中,將if語句和條件表達(dá)式結(jié)合起來使用會(huì)使程序變得簡(jiǎn)練。

【例4-10】猜數(shù)游戲。程序預(yù)置一個(gè)常數(shù)(稱為幻數(shù)),讓用戶猜,猜對(duì)時(shí)給出正確信息,否則會(huì)給出是大了還是小了的提示。#include<stdio.h>main(){intmagic=618,guess;printf(″Inputyourguess:\n″);scanf(″%d″,&guess);if(guess!=magic)guess>magic?printf(″High″):printf(″Low″);else{printf(″***Right***\n″);printf(″%disthemagicnumber.\n″,magic);}return0;}運(yùn)行輸出:Inputyourguess:600↙

Low再運(yùn)行:

Inputyourguess: 700↙

High再運(yùn)行:

Inputyourguess: 618↙

***Right*** 618isthemagicnumber.這里的條件表達(dá)式語句相當(dāng)于一個(gè)內(nèi)嵌的if語句。4.4.2switch語句

if語句是雙分支結(jié)構(gòu),如果要連續(xù)地測(cè)試多個(gè)條件,就需要用嵌套的if語句來實(shí)現(xiàn)。如果嵌套層次過多,不僅寫起來麻煩,而且還不清晰。對(duì)于這類問題,用switch語句可以很好地解決。switch語句是一種多分支結(jié)構(gòu),其一般形式是:switch(〈表達(dá)式〉){case〈常量1〉:〈語句1〉case〈常量2〉:〈語句2〉

case〈常量n〉:〈語句n〉default:〈語句n+1〉}

switch語句的語義如圖4-4所示。它的含義是:首先對(duì)表達(dá)式e進(jìn)行計(jì)算,如果其值是e1,則轉(zhuǎn)去執(zhí)行語句s1。如s1后面有break語句,則switch語句結(jié)束;如s1后面無break語句,則在switch內(nèi)部繼續(xù)向下執(zhí)行s2。如果e的值不為e1,而為e2,則轉(zhuǎn)去執(zhí)行e2后面的s2語句,執(zhí)行完s2后的情況如上。如e的值與e1,e2,…,en全不相同,就去執(zhí)行語句sn+1。處在switch語句中最后位置上的語句,其后面加不加break效果相同,程序執(zhí)行到此處都會(huì)退出switch語句。圖4-4switch語句的語說明:

(1)switch語句中的表達(dá)式的類型只能是有序類型。

(2)e1,e2,…,en是表達(dá)式的求值結(jié)果,必須互不相同。

(3)可以有多個(gè)常量共同擁有一個(gè)語句的情況,如:

case1:case2:case3:printf(″123″);break;

(4)default指出當(dāng)表達(dá)式求值結(jié)果和所有常量均不相同時(shí)要執(zhí)行的動(dòng)作。它的位置可以放在switch中的任何地方,不一定放在最后。

(5)語句si(i=1,2,…,n)可以是一條語句,也可以是多條語句,是多條語句時(shí)不必用花括號(hào)括起來。

【例4-11】用switch語句輸出學(xué)生的分?jǐn)?shù)等級(jí)。設(shè)分?jǐn)?shù)大于等于90分為A等,70~90分為B等(含70),60~70分為C等(含60),60分以下為D等,分?jǐn)?shù)為浮點(diǎn)數(shù)。

編程思路:switch后的表達(dá)式必須是有序類型而且求出的結(jié)果應(yīng)當(dāng)是一個(gè)個(gè)離散的值,而不是一個(gè)數(shù)值范圍。應(yīng)該想辦法把一個(gè)范圍轉(zhuǎn)換成一個(gè)確定的值,這是使用switch語句的關(guān)鍵。在這里我們可以把分?jǐn)?shù)除以10再取整,即可變成離散的數(shù)值,就可以用switch語句解決了。#include<stdio.h>main(){inti;floatscore;printf(″Inputascore\n″);scanf(″%f″,&score);i=score/10;

switch(i){case9:case10:printf(″A″);break;case7:case8:printf(″B″);break;case6:printf(″C″);break;default:printf(″D″);}return0;}運(yùn)行輸出:Inputascore87.5↙

B再運(yùn)行:Inputascore99.8A輸入的分?jǐn)?shù)是實(shí)數(shù),但通過賦值語句就變成了整型,整型是有序類型,并且i具有有限的離散值。printf(″D″);語句后面可以不要break,但如果把其他地方的break全去掉,則當(dāng)輸入分?jǐn)?shù)95.9時(shí),會(huì)連續(xù)地輸出ABCD,因此一定要注意break的使用。4.5循環(huán)語句到目前為止我+們所遇到的程序都是簡(jiǎn)單程序,解決的問題都很簡(jiǎn)單。要解決復(fù)雜問題,并充分發(fā)揮計(jì)算機(jī)快速的優(yōu)勢(shì),那么程序中很可能要用到循環(huán)語句。掌握好循環(huán)語句就可編出高質(zhì)量的程序。C語言提供了三種循環(huán)語句:for語句、while語句和do_while語句。下面分別加以討論。4.5.1for語句

for語句的基本形式如下:

for(〈表達(dá)式e1〉;〈表達(dá)式e2〉;〈表達(dá)式e3〉)〈語句s〉其中,表達(dá)式e2的類型為邏輯型,表達(dá)式e1和表達(dá)式e3都不是邏輯型,在其中不能使用比較運(yùn)算符與邏輯運(yùn)算符。

for語句的語義如圖4-5所示。它的含義是:首先對(duì)表達(dá)式e1求值,然后判斷表達(dá)式e2是否為真,如為真就去執(zhí)行語句s,接著對(duì)表達(dá)式e3求值,再回去判斷e2,直到e2為假時(shí)退出for循環(huán)。先看一個(gè)簡(jiǎn)單的例子。圖4-5for語句的語義

【例4-12】求1~100之間所有奇數(shù)之和。#include<stdio.h>main(){inti,sum=0;for(i=1;i<=100;i+=2)sum+=i;printf(″sum=%d\n″,sum);return0;}運(yùn)行輸出:

sum=2500在該例的for循環(huán)頭中有三個(gè)表達(dá)式,它們被兩個(gè)分號(hào)分開。循環(huán)頭的組成部分如下:循環(huán)控制變量控制變量的終值↓ ↓

for(i=1;i<=100;i+=2) ↑↑↑for關(guān)鍵字控制變量初值遞增控制變量可以看出能否循環(huán)是由循環(huán)控制變量決定的。一進(jìn)入循環(huán),首先對(duì)控制變量置初值,這個(gè)初值是否合適,還要由表達(dá)式e2對(duì)它進(jìn)行判斷,只有在e2為真的情況下才能去執(zhí)行循環(huán)體。若一開始條件就假,則循環(huán)體一次也不執(zhí)行。在每次循環(huán)之后,控制變量的值都要加以改變,這個(gè)改變量是決定能否繼續(xù)循環(huán)或是否會(huì)無窮循環(huán)的關(guān)鍵,一定要使它的值逐漸向循環(huán)終值方向變化。當(dāng)表達(dá)式e3計(jì)算完之后,再回來計(jì)算表達(dá)式e2,若e2為真則繼續(xù)循環(huán),否則退出循環(huán)。for循環(huán)頭中的三個(gè)表達(dá)式可以缺省,可以缺一個(gè),缺兩個(gè),甚至三個(gè)全缺,但不管怎么缺,其中的兩個(gè)分號(hào)不能缺,而且這三個(gè)表達(dá)式的功能也一定要在或前或后的其他地方以其他的形式表現(xiàn)出來。另外,在表達(dá)式e1

和表達(dá)式e3

的地方可以只有一個(gè)表達(dá)式,也可以有多個(gè)用逗號(hào)分開的表達(dá)式,并且還可以包含和循環(huán)無關(guān)的其他表達(dá)式。下面是幾種不同的表示方法:

(1)表達(dá)式e1

和表達(dá)式e3

是逗號(hào)表達(dá)式,如intsum,i;for(sum=0,i=1;i<=100;i++,i++)sum+=i;其中sum=0和循環(huán)控制變量無關(guān)。

(2)省略表達(dá)式e1

和表達(dá)式e3,如intsum=0,i=1;for(;i<=100;){sum+=i;i+=2;}表達(dá)式e1移到了for語句前,而表達(dá)式e3則移到了for循環(huán)體中。

(3)三個(gè)表達(dá)式全部省略,如intsum=0,i=1;for(;;){sum+=i;i+=2;if(i>100)break;}表達(dá)式e1移到了for語句前,而表達(dá)式e2和表達(dá)式e3的功能全部在循環(huán)體中。

(4)省略循環(huán)體,把循環(huán)體變成空語句,原來的工作放到循環(huán)頭中完成,如intsum=0,i;for(i=1;i<=100;sum+=i,i+=2);這時(shí)應(yīng)注意,原循環(huán)體中的語句一定要放在控制變量增值之前,否則就會(huì)出錯(cuò)。雖然以上幾種寫法都是可以的,但為了程序清晰起見,我們不主張這樣使用,在for循環(huán)頭中應(yīng)只放置和控制變量有關(guān)的表達(dá)式,而其他的操作應(yīng)放在循環(huán)之前或循環(huán)體中。

【例4-13】計(jì)算復(fù)利。某人在銀行存入10000.00元錢,存期8年,年利率為3.5%,求其每一年的存款額。計(jì)算復(fù)利的公式是:a=p(1+r)n。其中:

p:本金,初始存款值 r:利率

a:n年后的存款數(shù) n:年數(shù)#include<stdio.h>#include<math.h>main(){intn;doublea,p=10000.00,r=0.035;printf(″%s%21s\n″,″Year″,″Amount″);

for(n=1;n<=8;n++)

{a=p*pow(1+r,n);printf(″%4d%21.2f″,n,a);}return0;}運(yùn)行輸出:YearAmount1 10350.002 10712.253 11087.184 11475.235 11876.866 12292.557 12722.798 13168.09程序中引用了一個(gè)內(nèi)部數(shù)學(xué)函數(shù)pow(x,y),其功能是求x的y次方,因此應(yīng)把包含其信息說明的頭文件math.h包含進(jìn)來。

【例4-14】求序列前20項(xiàng)之和。

編程思路:首先從觀察序列中每一項(xiàng)的組成及前后項(xiàng)之間的關(guān)系入手。發(fā)現(xiàn)除首項(xiàng)外,每一項(xiàng)的分子都是前一項(xiàng)的分子與分母之和,而每一項(xiàng)的分母又等于前一項(xiàng)的分子,因此可以很容易地從前一項(xiàng)求出后一項(xiàng),而第一項(xiàng)可以直接設(shè)置。另外,雖然每項(xiàng)的分子、分母都是整數(shù),但考慮到C語言中整除的特點(diǎn),必須把它們定義成浮點(diǎn)類型。又因循環(huán)次數(shù)已知,故選用for循環(huán)語句。程序如下:#include<stdio.h>main(){

floatsum=0,num=2,den=1;inti;for(i=1;i<=20;i++){ sum+=num/den; num+=den; den=num-den;}printf(″Thesum=%.2f\n″,sum);return0;}運(yùn)行輸出:

Thesum=32.664.5.2while語句

while語句的基本形式為:

while(〈表達(dá)式e〉) 〈語句s〉

while語句的語義如圖4-6所示。其含義是:首先計(jì)算表達(dá)式e的值,只要其值為真就執(zhí)行循環(huán)體語句s,直到表達(dá)式e求值為假,然后退出循環(huán)。在循環(huán)體中,一定要對(duì)循環(huán)控制變量進(jìn)行修改。圖4-6while語句的語義

【例4-15】求1~100之間所有偶數(shù)之和。#include<stdio.h>main(){intsum,i;sum=0;i=2;while(i<=100){ sum=sum+i; i+=2;}printf(″sum=%d\n″,sum);return0}運(yùn)行輸出:

sum=2550

while語句多用在循環(huán)次數(shù)預(yù)先難以確定的循環(huán)中,如下例所示。

【例4-16】輸入并輸出一個(gè)字符串,遇“?!苯Y(jié)束。#include<stdio.h>main(){charc;while((c=getchar())!=′?!?putchar(c);return0;}運(yùn)行程序,當(dāng)輸入為:

Thisisastring#↙

則輸出為:

Thisisastring程序在執(zhí)行時(shí)并不是輸入一個(gè)字符后立即把它送到屏幕,而是先放入內(nèi)存緩沖區(qū)中,只有在打了回車符之后才把緩沖區(qū)里的內(nèi)容一塊輸出。

【例4-17】輸入一個(gè)字符串,去掉所有的前導(dǎo)空格,并將其余地方的多個(gè)連續(xù)空格壓縮為一個(gè)空格。例如

″└┘└┘└┘└┘This└┘└┘└┘is└┘└┘└┘a└┘└┘└┘└┘program″壓縮為

″Thisisaprogram″

編程思路:可考慮用雙重循環(huán)解決。外循環(huán)用以輸入整個(gè)字符串,內(nèi)循環(huán)處理連續(xù)的空字符。因整個(gè)字符串的長(zhǎng)度和連續(xù)的空格數(shù)都是不確定的,因此可用while循環(huán)語句。當(dāng)輸入一個(gè)空格字符時(shí),用循環(huán)語句把可能連續(xù)的空格都讀出來,但不輸出,直到輸入一個(gè)非空格字符時(shí)才輸出一個(gè)空格,此時(shí)內(nèi)循環(huán)結(jié)束,并輸出最近讀入的非空格字符。程序如下:#include<stdio.h>main(){charch;printf(″Inputastring:\n″);while((ch=getchar())==′′);//去掉前導(dǎo)空格putchar(ch);while((ch=getchar())!=′\n′){ if(ch==′′) {while(ch==′′) ch=getchar(); putchar(′′); } putchar(ch); }putchar(′\n′);return0;}運(yùn)行輸出:

Inputastring:

└┘└┘└┘└┘This└┘└┘└┘is└┘└┘└┘a└┘└┘└┘└┘program↙

Thisisaprogram

【例4-18】愛因斯坦階梯問題。設(shè)有階梯,不知其階數(shù),但知:每步跨兩階最后剩1階;每步跨3階最后剩2階;每步跨5階最后剩4階;每步跨6階最后剩5階;每步跨7階正好到樓頂,求階梯共有多少階。編程思路:本題擬采用窮舉法求解:從整數(shù)1試起,一旦發(fā)現(xiàn)某個(gè)整數(shù)符合所有條件限制,就算找到了答案。這樣逐次加1地測(cè)試,雖然是可以的,但這未免也太機(jī)械了,我們可以根據(jù)條件,找出一個(gè)相對(duì)快捷的算法。設(shè)階數(shù)為n,根據(jù)所給的條件有下列關(guān)系:①n%2=1;②n%3=2;③n%5=4;④n%6=5;⑤n%7=0。由⑤可知,階梯數(shù)一定是7的倍數(shù),所以測(cè)試的初值可以從7開始并且在7的倍數(shù)14、21、28、35、…中測(cè)試。由①知,階梯數(shù)一定是奇數(shù),則進(jìn)一步簡(jiǎn)化測(cè)試范圍為7,21,35,…,這個(gè)數(shù)列的公差為14。對(duì)這個(gè)數(shù)列中的數(shù)值再用②、③、④式中的條件去檢測(cè),符合②、③、④式條件的數(shù)即為所求。根據(jù)上面的分析,可編程如下:#include<stdio.h>main(){intn=7;while(n%3!=2‖n%5!=4‖n%6!=5)n+=14;printf(″Total=%d\n″,n);return0;}運(yùn)行輸出:

Total=119

注意:while語句的表達(dá)式中,‖是或運(yùn)算符,表示只要有一個(gè)等式不成立,表達(dá)式就為真,就執(zhí)行循環(huán)體,直到三個(gè)等式全成立時(shí)為止。

【例4-19】求兩個(gè)正整數(shù)a,b的最大公約數(shù)(GreatestCommonDivisor,GCD)。求最大公約數(shù)的算法在第一章中已作過介紹,這里直接寫出程序。#include<stdio.h>main(){

intu,v,t;

printf(″Input2integers:\n″);

scanf(″%d%d″,&u,&v);while(v){

t=u%v;

u=v;

v=t;}printf(″TheGCD=%d\n″,u);return0;}運(yùn)行輸出:Input2integers:2639↙

TheGCD=13程序中的while(v)等價(jià)于while(v!=0)。

請(qǐng)思考:設(shè)有while(!e),其中條件!e和下列哪個(gè)表達(dá)式等價(jià)?①e!=0②e==0③e!=1④~e(~是求反運(yùn)算符)while中的條件是讓循環(huán)能夠進(jìn)行的條件,要求其值為真。這樣要使!e為真,就必須使e為假,所以答案應(yīng)是②式。

【例4-20】用近似公式求π的近似值,直到時(shí)為止(其中n為奇數(shù))。

編程思路:這是個(gè)求級(jí)數(shù)和的問題。解決這類問題時(shí),首先要找出級(jí)數(shù)的構(gòu)成規(guī)律,即前后項(xiàng)之間的關(guān)系,怎樣用前項(xiàng)求出后項(xiàng),這樣才便于用循環(huán)結(jié)構(gòu)求解。本例中,各項(xiàng)都是分?jǐn)?shù),分母逐次遞增2;各項(xiàng)的符號(hào)是正、負(fù)相間。于是只要能表示出第i項(xiàng),則分母加2再乘以-1即可得到第i+1項(xiàng)。接著設(shè)定變量,題目中要有表示和、項(xiàng)、分母和符號(hào)的4個(gè)變量,符號(hào)只取1和-1兩個(gè)值,表示在正負(fù)數(shù)之間轉(zhuǎn)換。因?yàn)椴恢姥h(huán)次數(shù),只知道結(jié)束循環(huán)的條件,所以選用while語句。程序如下:#include<stdio.h>#include<math.h>main(){ints=1;floatpi=0,t=1,n=1.0;while((fabs(t))>=1e-6){pi=pi+t; /*累加本項(xiàng)t*/n=n+2; /*分母加2,為下一項(xiàng)的分母*/s=-s; /*改變符號(hào),為下一項(xiàng)的符號(hào)*/t=s/n; /*求出下一項(xiàng)t*/}pi=pi*4;

printf(″pi=%f\n″,pi);return0;}運(yùn)行輸出:

pi=3.141594說明:

(1)程序中要用到求絕對(duì)值的數(shù)學(xué)函數(shù)fabs(),因此要把頭文件math.h包含進(jìn)來。

(2)分母n定義成float類型,是為了保證s/n的值為一實(shí)數(shù),否則其值永遠(yuǎn)為0。

(3)數(shù)學(xué)中的寫法10-6應(yīng)轉(zhuǎn)換為C語言的表示形式1e-6。4.5.3do_while語句

do_while語句的一般形式為:

do 〈語句s〉 while〈表達(dá)式e〉其語義如圖4-7所示。進(jìn)入do_while循環(huán)后,首先執(zhí)行一次循環(huán)體,然后再測(cè)試表達(dá)式e,如其為真則繼續(xù)執(zhí)行循環(huán)體,直至表達(dá)式求值為假。

do_while語句與while語句的差別僅僅在于:while語句是條件判斷在前,循環(huán)體執(zhí)行在后,如一開始就不滿足條件,則循環(huán)體一次也不執(zhí)行;而do_while語句是先執(zhí)行循環(huán)體,后判斷條件,所以它至少執(zhí)行循環(huán)體一次。圖4-7do_while語句的語義現(xiàn)在我們?cè)賮碛^察前面的輸入字符串的例子,現(xiàn)在要求結(jié)束符“#”也要輸出出來:#include<stdio.h>main(){charc;do{c=getchar();putchar(c);}while(c!=′?!?;return0;}運(yùn)行,輸入字符串:

thisisastring#↙

則輸出為:

Thisisastring#↙

【例4-21】輸入一個(gè)正整數(shù),然后按反向輸出。比如輸入12345,則輸出為54321。

編程思路:輸入時(shí)一次把一個(gè)整數(shù)完整地輸入,而輸出則是一次一個(gè)數(shù)字地輸出,并且要求把最低位先輸出,所以首先應(yīng)該把最低位數(shù)字分離出來,然后再分離出下一個(gè)最低位數(shù)字……怎樣才能把最低位分離出來呢?可用對(duì)10求模的方法。之后用對(duì)10求商的方法求出除掉最低位后的數(shù),作為進(jìn)一步反向輸出的基數(shù)。#include<stdio.h>main(){intnumber,digit;printf(″Inputaninteger\n″);scanf(″%d″,&number);do{digit=number%10;printf(″%d″,digit);number/=10;}while(number);printf(″\n″);return0;}運(yùn)行輸出:Inputaninteger12345↙

543214.5.4循環(huán)語句的嵌套循環(huán)嵌套以構(gòu)成多重循環(huán),這在解決很多實(shí)際問題中是經(jīng)常遇到的。C語言中的三種循環(huán)結(jié)構(gòu)可以互相組合使用。比如下面的一些嵌套形式: ①while() ②do { {

while() do {…} {…} while();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論