




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章程序控制結構1第3章程序控制結構3.1語句3.2輸入與輸出3.3程序順序結構3.4程序選擇結構3.5程序循環(huán)結構23.1語句語句(statement)是C程序的最小單位程序由一條一條語句組成語句執(zhí)行的次序則稱為流程C語言語句分為簡單語句、復合語句和控制語句33.1.1簡單語句1.表達式語句x=a+b;//賦值語句t=a,a=b,b=t;//a和b交換a+b+c;//運算但無實際意義表達式;//用分號結束43.1.1簡單語句2.函數調用語句printf("a+b=%d",a+b);//輸出函數調用語句函數調用(實參);//用分號結束53.1.1簡單語句3.空語句4.聲明部分printf(“a+b=%d”,a+b);;//第2個即為空語句;//單個分號聲明部分......;執(zhí)行語句......;63.1.2復合語句復合語句(compoundstatement),又稱語句塊,簡稱塊(block)
{ [局部聲明部分......;]
語句序列......;}73.1.2復合語句復合語句內的每條語句必須以分號(;)結尾,但復合語句右大括號(})已表示結尾,因此其后不需要分號。如果在后面添加分號,意思變?yōu)橐粋€復合語句與一個空語句。{//復合語句
doubles,a=5,b=10,h=8;//局部聲明
s=(a+b)*h/2.0;
printf("area=%lf\n",s);}//復合語句不需要分號結尾83.1.2復合語句復合語句內部可以進行變量定義或類型聲明,這些定義或聲明僅在復合語句內部可以使用,稱為塊的局部作用域
。{
int
t,a=10,b=7;//定義局部變量t、a、bt=a,a=b,b=t;//僅在這個復合語句里使用}93.1.2復合語句復合語句允許嵌套,即在復合語句里還可以包含復合語句。{//復合語句
doublev1,r=5;//局部聲明
v1=4*3.1415926*r*r*r/3;{//嵌套的復合語句
doublev2,h=12;//嵌套的局部聲明
v2=3.1415926*r*r*h;printf("%lf,%lf\n",v1,v2);}//嵌套的復合語句結尾}//復合語句結尾103.1.3注釋可以在程序中編寫注釋(comments),有兩種形式:①/*......*/塊注釋語法形式:
/*......注釋內容*/113.1.3注釋②//行注釋語法形式:
說明:(1)注釋僅是對源程序的說明文字,它不是程序代碼,對程序運行沒有任何影響。實際上,在編譯程序時所有注釋內容將被忽略。
//......注釋內容
123.1.3注釋(2)/*......*/塊注釋允許多行注釋,以(/*)開頭,以(*/)結尾,這中間的任何內容均是注釋內容。注釋可以是任何來自于字符集的字符組合,包括換行符,也允許中文等非ASCII字符。/*......*/不允許嵌套133.1.3注釋(3)//行注釋表示從(//)開始直到本行末尾的所有字符均是注釋內容。//注釋只能注釋一行,如果要注釋多行就要寫多次。一般//注釋適用于短小精簡的注釋,/*......*/注釋適用于大段注釋。(4)編譯器將整個注釋理解為一個空白字符,相當于一個空格的作用。
143.1.4語句的寫法(1)多數情況下,在一個程序行里只寫一個語句,這樣的程序寫法清晰,便于閱讀、理解和調試。
(2)注意使用空格或TAB來作合理的間隔、縮進、對齊,使程序形成邏輯相關的塊狀結構,養(yǎng)成優(yōu)美的程序編寫風格。
(3)C語言允許在一行里寫多個語句。(4)C語言允許將一個語句拆成多行來寫。153.2輸入與輸出所謂輸入是指從外部輸入設備(如鍵盤、鼠標等)向計算機輸入數據,輸出是指從計算機向外部輸出設備(如顯示器、打印機等)輸出數據。
163.2輸入與輸出C語言輸入輸出操作是通過函數實現的。不同的函數能夠處理形式多樣的輸入輸出操作,支持不同的輸入輸出設備。若在程序中調用標準輸入輸出函數,應該用文件包含命令將頭文件stdio.h包含到程序中,命令形式為:
#include<stdio.h>173.2.1字符輸入與輸出1.字符輸出putchar函數putchar函數的作用是向顯示終端輸出一個字符,一般形式為:putchar(c);183.2.1字符輸入與輸出例3.1
1#include<stdio.h>2int
main()3{4
chara='C',b=6;5
putchar(a);//字符型變量,輸出C6putchar(b+'0');//整型表達式,輸出67putchar('\110');//轉義字符(八進制)輸出H8
putchar('\n');//轉義字符(換行),輸出換行
9
return0;10}193.2.1字符輸入與輸出例3.1
1#include<stdio.h>2intmain()3{4chara='C',b=6;5
putchar(a);//字符型變量,輸出C6putchar(b+'0');//整型表達式,輸出67putchar('\110');//轉義字符(八進制)輸出H8
putchar('\n');//轉義字符(換行),輸出換行
9return0;10}C6H程序運行屏幕203.2.1字符輸入與輸出2.字符輸入getchar函數getchar函數的作用是從鍵盤終端輸入一個字符,一般形式為:getchar()213.2.1字符輸入與輸出例3.2
1#include<stdio.h>2int
main()3{4
charc1,c2,c3;5c1=getchar();c2=getchar();c3=getchar();6putchar(c1);putchar(c2);putchar(c3);
7
return0;8}223.2.1字符輸入與輸出例3.2
1#include<stdio.h>2intmain()3{4charc1,c2,c3;5c1=getchar();c2=getchar();c3=getchar();6putchar(c1);putchar(c2);putchar(c3);
7return0;8}abc程序運行屏幕abc↙233.2.1字符輸入與輸出例3.2
1#include<stdio.h>2intmain()3{4charc1,c2,c3;5c1=getchar();c2=getchar();c3=getchar();6putchar(c1);putchar(c2);putchar(c3);
7return0;8}ab程序運行屏幕a↙bc↙243.2.2格式化輸出1.printf函數printf函數的作用是向標準輸出設備(顯示終端)輸出格式化的數據,一般形式為:(1)格式控制格式控制為字符串形式,稱為格式控制串printf(格式控制,輸出項列表......);25它主要有兩種內容:①格式說明。格式說明總是以百分號(%)字符開始,后跟格式控制字符,例如%d、%f等。它的作用是將輸出項轉換為指定格式輸出。②一般字符。除格式說明之外的其他字符,包含轉義字符。一般字符根據從左向右的出現順序直接輸出到顯示終端上,ASCII控制字符的輸出有特殊的含義。
3.2.2格式化輸出%[flags][width][.prec][h|l|L|F|N]type263.2.2格式化輸出表3-1printf格式說明域含義域域選描述含義type必需類型字符決定輸出項轉換為字符、字符串還是數值flags可選標志字符控制輸出的對齊、符號、空格及八進制和十六進制前綴??梢猿霈F多個標志width可選寬度說明指定輸出項的最小顯示寬度.prec可選精度說明指定輸出項的最大輸出字符數或浮點數小數精度h/l/L/F/N可選大小修飾指明輸出項類型大小或指針的遠近273.2.2格式化輸出表3-2printf類型字符含義字符類型輸出格式dint帶符號的十進制整數uint無符號十進制整數oint無符號八進制整數x或Xint無符號十六進制整數(若輸出為字母,x用abcdef,X用ABCDEF)283.2.2格式化輸出表3-2printf類型字符含義字符類型輸出格式fdouble具有[-]dddd.dddd格式的帶符號數值,dddd為一位或多位十進制數字。小數點前數字個數取決于數的量級;小數點后面數字個數取決于所要求的精度e或Edouble具有[-]d.dddde[+/-]ddd格式的帶符號數值,其中d為單個十進制數字,dddd為一位或多位十進制數字,ddd為三位十進制數。用e或E表示指數g或Gdouble以f或e格式輸出的帶符號數值,對給出的值及其精度,f和e哪個簡潔就用哪個。只有當值的指數小于-4或大于、等于精度說明時才使用e格式。尾部的0被截斷,只有小數點后跟1位或多位數字時才出現小數點。用e或E表示指數293.2.2格式化輸出表3-2printf類型字符含義字符類型輸出格式cchar單個字符s字符串指針直到第一個非空字符('\0')或滿足精度的字符串%輸出百分號'%'303.2.2格式化輸出表3-3printf標志字符含義標志意義默認-在給定域寬內左對齊輸出結果(右邊用空格填充)右對齊(左邊用空格或0填充)+如果輸出值是有符號數,則總是加上符號(+或-)只在負數前加(-)空格如果輸出值是有符號數或為正數,則以空格作為前綴加到輸出值前;如果空格和+標志同時出現,則忽略空格無313.2.2格式化輸出表3-3printf標志字符含義標志意義默認#指明使用如下的“轉換樣式”轉換輸出參數若類型字符為對輸出參數的影響x或X在任何非0輸出值前加上0x或0Xe,E,f強制在所有情況下輸出值總是包含小數點只有小數點后面有數字時才顯示它g,G同e和E,強制在所有情況下輸出值中總是包含小數點并阻止截斷尾部的0只有小數點后面有數字時才顯示它,截斷尾部的0323.2.2格式化輸出表3-4printf寬度說明寬度說明對輸出域寬度的影響n至少有n個字符寬度輸出,如果輸出值中的寬度小于n個,則輸出用空格填充直到最小寬度規(guī)定(如果flags為-,則填充在輸出值的右邊,否則在左邊)0n至少有n個字符寬度輸出,如果輸出值中的字符寬度小于n個,則輸出用0填充在輸出值的左邊(對于左對齊無效)*間接設置寬度,此時由輸出項列表提供寬度值,且它必須在輸出項的前面333.2.2格式化輸出表3-5printf精度說明精度說明精度影響.n類型含義e,E,f精度值指定小數點后數字的個數。四舍五入g,G精度值指定可輸出的有效數字的最大數目s精度值指定可輸出字符的最大數目,超出精度值范圍的字符不予輸出343.2.2格式化輸出表3-5printf精度說明精度說明精度影響(無)精度按默認值:類型默認值e,E,f6g,G打印6個有效數字,尾部的0串被截斷s輸出直到空字符('\0')為止.0或僅有.類型含義353.2.2格式化輸出續(xù)表3-5printf精度說明精度說明精度影響e,E,f,g,G輸出不打印小數點(及其后的小數)s無任何字符輸出*間接設置精度,此時由輸出項列表提供精度值,且它必須在輸出項的前面。如果寬度說明和精度說明同時使用*,則先出現寬度值,接著是精度值,然后才是輸出項。363.2.2格式化輸出表3-6printf類型大小修飾含義大小修飾type類型字符輸出參數被解釋為hd,o,x,X短整型(short)u無符號短整型(unsignedshort)ld,o,x,X長整型(long)u無符號長整型(unsignedlong)e,E,f,g,G雙精度浮點型(double)Le,E,f,g,G長雙精度浮點型(longdouble)373.2.2格式化輸出int
a=123,b=-1,c=12345;longh=-1;shorti=-1,j=32767;charc1=97;doublex=12.3456,y=12,z=12.123456789123;//①輸出整型數據printf("%d,%u,%x,%X,%o\n",a,a,a,a,a);//十進制、無符號、十六進制和八進制//輸出結果:123,123,7b,7B,173printf("%d,%u,%x,%X,%o\n",b,b,b,b,b);//十進制、無符號、十六進制和八進制,負數為補碼//-1,4294967295,ffffffff,FFFFFFFF,37777777777383.2.2格式化輸出printf("%ld,%lu,%lx,%lo\n",h,h,h,h,h);//長整型,負數為補碼//輸出結果:-1,4294967295,ffffffff,37777777777printf("%hd,%hu,%hx,%ho\n",i,i,i,i,i);//短整型,負數為補碼//輸出結果:-1,65535,ffff,177777printf("%hd,%hd\n",j,j+1);//短整型,數據溢出//輸出結果:32767,-32768//②輸出帶格式的整型數據printf("[%d],[%4d],[%-4d],[%4d],[%-4d]\n",a,a,a,c,c);//寬度、右對齊、左對齊、實際寬度//輸出結果:[123],[123],[123],[12345],[12345]393.2.2格式化輸出printf("[%+d],[%+d],[%d],[%d]\n",a,-a,a,-a);//填充正負符號、填充空格//輸出結果:[+123],[-123],[123],[-123]printf("[%04d],[%04d],[%04d],[%-04d]\n",a,b,c,a);//左邊填充0、右邊不影響//輸出結果:[0123],[-001],[12345],[123]printf("%#d,%#x,%#X,%#o\n",a,a,a,a);//填充十六進制、八進制前綴//輸出結果:123,0x7b,0X7B,0173printf("[%*d]\n",5,a);//由輸出項指定寬度//輸出結果:[123]403.2.2格式化輸出printf("[%8.2d],[%-8.2d]\n",a,a);//精度對整型無作用//輸出結果:[123],[123]//③輸出字符型數據printf("%d,%c\n",c1,c1);//字符型數值、ASCII碼//輸出結果:97,a//④輸出帶格式的字符型數據printf("[%12c],[%012c],[%-012c]\n",c1,c1,c1);//寬度、右對齊、左對齊//[a],[00000000000a],[a]413.2.2格式化輸出//⑤輸出浮點型數據printf("%lf,%e,%g\n",x,x,x);//小數格式、指數格式、最簡格式//輸出結果:12.345600,1.234560e+001,12.3456printf("%lf,%e,%g\n",y,y,y);//小數格式、指數格式、最簡格式//輸出結果:12.000000,1.200000e+001,12//⑥輸出指定精度的浮點型數據printf("[%lf],[%10lf],[%10.2lf],[%.2lf]\n",x,x,x,x);//默認精度、寬度、精度//[12.345600],[12.345600],[12.35],[12.35]423.2.2格式化輸出//⑦輸出帶格式的浮點型數據printf("[%+lf],[%+lf],[%lf],[%lf]\n",y,-y,y,-y);//填充正負符號、填充空格//[+12.000000],[-12.000000],[12.000000],[-12.000000]printf("[%06.1lf],[%-06.1lf]\n",y,y);//左邊填充0、右邊不影響//輸出結果:[0012.0],[12.0]printf("[%.*f],[%*.*f]\n",6,x,12,3,x);//由輸出項指定寬度、寬度與精度//輸出結果:[12.345600],[12.346]433.2.2格式化輸出//⑧輸出字符串printf("[%s],[%6s],[%-6s]\n","Java","Java","Java");//寬度對字符串的影響//輸出結果:[Java],[Java],[Java]printf("[%s],[%.3s],[%6.3s]\n","Basic","Basic","Basic");//精度對字符串的影響//輸出結果:[Basic],[Bas],[Bas]443.2.2格式化輸出//⑨特殊輸出printf("%%\n",c1);//兩個%%表示輸出一個%,輸出項//輸出結果:%printf("%d,%d\n",a,b,c);//格式數目小于輸出項數,忽略多余輸出項//輸出結果:123,-1printf("%d,%d,%d\n",a,b);//格式數目大于輸出項數,輸出結果不確定//輸出結果:123,-1,2367460printf("%d,%lf\n",x,a);//類型不對應,輸出結果不確定//輸出結果:2075328197,0.000000453.2.3格式化輸入scanf(格式控制,輸入項列表......);1.scanf函數scanf函數的作用是從標準輸入設備(鍵盤終端)讀取格式化的數據,一般形式為:%[*][width][h|l|L|F|N]type463.2.3格式化輸入表3-7scanf類型字符含義類型字符期望讀入(應輸入)的類型d十進制整數o八進制整數x或X十六進制整數u無符號十進制整數473.2.3格式化輸入表3-7scanf類型字符含義類型字符期望讀入(應輸入)的類型e,E,f,g,G由下列成分組成的浮點數:可選的符號+或-,包括小數點在內的一個或多個十進制數字序列,可選的指數符('e'或'E')其后的帶符號整數。[+/-]ddddddddd[.]dddd[E|e][+/-]dddc字符。指定c后,通常被跳過的空白符將被讀入,如果要讀下一個非空白符,要使用%1ss字符串。默認情況下,輸入字符串以空白符作為結束。483.2.3格式化輸入(3)*禁止字符*禁止字符的含義是從輸入數據中讀取類型相當的數據,但跳過這個數據,即不將它保存到輸入項中。(4)寬度說明寬度控制從輸入數據中讀出的最大字符數。轉換并存放到相應輸入項中。如果讀width個字符前遇到空白符或不能根據指定格式進行轉換的字符,則讀入的字符個數將少于width個。493.2.3格式化輸入(5)大小修飾大小修飾指明輸入的類型大小,與printf的大小修飾含義相同。
503.2.3格式化輸入int
a,b,c;longh;shorti;chark,m;doublex,y;scanf("%d%ld%hd%lf%le",&a,&h,&i,&x,&y);//輸入整型、長整型、短整型、浮點型//輸入:1231.233.25
結果a=1,h=2,i=3,x=1.23,y=3.25//輸入:1-13276812.312e5
結果a=1,h=-1,i=-32768,x=12.3,y=1.2e6513.2.3格式化輸入scanf("%d%d%d",&a,&b,&c);//連續(xù)輸入用空格、TAB、回車間隔//輸入:123結果a=1,b=2,c=3//輸入:1,2,3結果a=1,b,c不確定(輸入逗號不匹配空白符,scanf終止)scanf("%d,%d,%d",&a,&b,&c);//輸入必須匹配一般字符//輸入:1,2,3結果a=1,b=2,c=3//輸入:123結果a=1,b,c不確定(輸入空格不匹配逗號,scanf終止)523.2.3格式化輸入scanf("a=%db=%dc=%d",&a,&b,&c);//輸入必須匹配一般字符//輸入:a=1b=2c=3結果a=1,b=2,c=3//輸入:123結果a,b,c不確定(輸入不匹配a=,scanf終止)scanf("%4d%4d",&a,&b);//指定寬度//輸入:1212345結果a=12,b=1234//輸入:123456789結果a=1234,b=5678scanf("%1d%*2d%3d",&a,&b);//禁止字符//輸入:123456789結果a=1,b=456,23讀取但不保存533.2.3格式化輸入scanf("%d%c%d%c",&a,&k,&b,&m);//輸入字符型//輸入:12c34a結果a=12,k=c,b=34,m=a//輸入:12c34a結果a=12,k=空格,b,m不確定(輸入c不匹配%d,scanf終止)scanf("%d%d",&a,&b,&c);//格式數目小于輸出項數,多余輸入項未被輸入scanf("%d%d%d",&a,&b);//格式數目大于輸出項數,崩潰性錯誤scanf("%d%lf",&x,&a);//類型不對應,嚴重錯誤543.3程序順序結構通常情況下,語句以其出現的順序執(zhí)行一個語句執(zhí)行完會自動轉到下一個語句開始執(zhí)行,這樣的執(zhí)行稱為順序執(zhí)行。順序執(zhí)行反映了程序“按部就班”的執(zhí)行規(guī)律,多數情況下,程序的執(zhí)行就是這樣的。
553.3.1順序執(zhí)行圖3.1求圓面積的執(zhí)行次序順序執(zhí)行的次序是佷重要的
563.3.2跳轉執(zhí)行從問題求解的一般過程來看,還需要跳轉執(zhí)行。
①選擇語句:if語句、switch語句;②循環(huán)語句:while語句、do語句、for語句;③跳轉語句:goto語句、break語句、continue語句、return語句。
573.3.2跳轉執(zhí)行goto語句的作用是使程序無條件跳轉到別的位置,語法形式為:這里的標號是一個自定義的標識符,標號語句形式為:標號:語句序列......goto
標號;583.3.2跳轉執(zhí)行
1goto
L1;
…//語句序列
10L1:x=a+b;
…//語句序列執(zhí)行第1行時,程序跳轉到L1標號語句所在的第10行繼續(xù)運行:593.4程序選擇結構1.if語句2.switch語句603.4.1if語句if語句的作用是計算給定的表達式,根據結果選擇執(zhí)行相應的語句,語句形式有兩種:①if形式:②if-else形式:if(表達式)語句1;else
語句2;if(表達式)語句1;613.4.1if語句圖3.2兩種形式的if語句執(zhí)行流程PT
F內嵌
語句623.4.1if語句圖3.2兩種形式的if語句執(zhí)行流程633.4.1if語句當a﹥b時,執(zhí)行t=a,a=b,b=t運算,即a和b相互交換,若a小于等于b則什么也不做;總而言之,無論a和b之前是什么數,執(zhí)行這段程序后,a肯定小于等于b。
if(a>b)t=a,a=b,b=t;643.4.1if語句(1)if語句中的子語句既可以是簡單語句,又可以是復合語句或控制語句,但必須是“一個語句”的語法形式
1if(a>b)2x=a+b;y=a-b;3else4x=a-b;y=a+b;653.4.1if語句(2)子語句往往會有多條語句,甚至更復雜的情形,這時可以使用復合語句
1if(a>b){2x=a+b;y=a-b;3}4else{5x=a-b;y=a+b;6}663.4.1if語句總是交換的代碼(不好的code風格):
1if(a>b)2{3t=a;4a=b;5b=t;6};
1if(a>b){2t=a;3a=b;4b=t;5};673.4.1if語句一般地,if語句的表達式為關系、邏輯運算表達式也可以為其他表達式,但按邏輯值來理解:a=5,b=2;if(a)x=a*10;683.4.1if語句表3-8數值按邏輯值處理的結果數值邏輯值aaa!=0!aa==00假假真真非0真真假假6970例:將所給數學條件寫成C的邏輯表達式1)1≤a≤8并且1≤b≤102)a和b都是正的或都是負的(a、b符號相同)3)a和b之一為0,但不能都為04)a能被5或7整除Leapyearcondition:(yearnum%4==0)&&(yearnum%100!=0)||(yearnum%400==0)&&(yearnum%100=0)(a>=1&&a<=8)&&(b>=1&&b<=10)(a>0&&b>0)||(a<0&&b<0)或:(a*b)>0(a*b==0)&&(a+b!=0)(a%5==0)||(a%7==0)70用形式邏輯變量表示潤年條件:int
LeapisTrue;LeapisTrue=(yearnum%4==0)&&(yearnum%100!=0)||(yearnum%400==0)&&(yearnum%100==0);71713.4.1if語句例3.3
1#include<stdio.h>2#include<math.h>3int
main()4{5
doublea,b,c;6
printf("input
a,b,c:");7
scanf("%lf%lf%lf",&a,&b,&c);8
//判斷三邊長是否構成三角形
9
if(a+b>c&&a+c>b&&b+c>a){10
doubles,t;11t=(a+b+c)/2.0;12s=sqrt(t*(t-a)*(t-b)*(t-c));13
printf("area=%lf\n",s);14}
723.4.1if語句例3.3
15
elseprintf("error\n");16
return0;17}733.4.1if語句例3.3
15elseprintf("error\n");16return0;17}area=6.000000程序運行屏幕inputa,b,c:345↙743.4.2switch語句switch語句switch語句的作用是計算給定的表達式,根據結果選擇從多個分支入口執(zhí)行,語句形式為:switch(表達式){
case
常量表達式1:…語句序列1
case
常量表達式2:…語句序列2 ┇
case
常量表達式n:…語句序列n
default:…默認語句序列}753.4.2switch語句圖3.3switch語句執(zhí)行流程763.4.2switch語句(1)switch語句中case分支的語句序列可以是一個語句,也可以是任意多的語句序列,也可以沒有語句;既可以是簡單語句,又可以是復合語句和控制語句。如果沒有語句,則一旦執(zhí)行到這個case分支,什么也不做,繼續(xù)往下執(zhí)行。
773.4.2switch語句
1switch(n){2
case7:printf("step5\n");3
case6:4
case5:printf("step4\n");5
case4:6{7
printf("step3\n");printf("step2\n");8}9
case2:printf("step1\n");10
default:printf("step0\n");11}783.4.2switch語句(3)switch語法中default分支是可選的,若沒有default分支且沒有任何case標號的值相等時,switch語句將什么也不做,直接執(zhí)行后續(xù)語句。(4)switch語句分支選擇可以是C語言的任意表達式,但其值必須是整數(含字符類型)、枚舉類型,或者包含能轉換成這兩種類型的類型。
793.4.2switch語句(5)switch語法中的case分支必須是常量表達式且互不相同,即為整型、字符型、枚舉類型的常量值,但不能包含變量。例如若c是變量,則“casec>=‘a’&&c<=‘z’:”的寫法是錯的。case分支后面的冒號是必須的,即使沒有后面的語句序列。
803.4.2switch語句在switch語句中任意位置上,只要執(zhí)行到break語句,就結束switch語句的執(zhí)行,轉到switch結構后續(xù)語句。break;813.4.2switch語句更常見的switch結構應該如下,它提供了程序多分支選擇執(zhí)行流程。switch(表達式){
case
常量表達式1:…語句序列1;break;
case
常量表達式2:…語句序列2;break; ┇
case
常量表達式n:…語句序列n;break;
default:…默認語句序列}823.4.2switch語句圖3.4結構化的switch流程833.4.3選擇結構的嵌套1.if語句的嵌套(1)第一種形式,在else分支上嵌套if語句,語法形式為:if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3......elseif(表達式n)語句nelse語句m843.4.3選擇結構的嵌套圖3.5嵌套if語句第一種形式的執(zhí)行流程853.4.3選擇結構的嵌套例3.4
1#include<stdio.h>2int
main()3{4
int
score;5
scanf("%d",&score);6
if(score>=90)printf("A\n");7
elseif(score>=80)printf("B\n");8
elseif(score>=70)printf("C\n");9
elseif(score>=60)printf("D\n");10
elseprintf("E\n");11
return0;12}863.4.3選擇結構的嵌套1.if語句的嵌套(2)第二種形式,在if和else分支上嵌套if語句,語法形式為:
if(表達式1)
if(表達式2)語句1
else語句2else
if(表達式3)語句3
else語句4873.4.3選擇結構的嵌套圖3.6嵌套if語句第二種形式的執(zhí)行流程883.4.3選擇結構的嵌套例3.5
1#include<stdio.h>2int
main()3{4
int
a,b,c,d,t;5
scanf("%d%d%d%d",&a,&b,&c,&d);6
if(a>b)t=a,a=b,b=t;//結果a<=b7
if(a>c)t=a,a=c,c=t;//結果a<=c8
if(a>d)t=a,a=d,d=t;//結果a<=d9
//結果a<b,c,d10
if(b>c)t=b,b=c,c=t;//結果b<=c11
if(b>d)t=b,b=d,d=t;//結果b<=d12
//結果a<b<c,d13
if(c>d)t=c,c=d,d=t;//結果c<=d14
//結果a<b<c<d
893.4.3選擇結構的嵌套例3.5
15
printf("%d,%d,%d,%d\n",a,b,c,d);16
return0;17}9091例:根據x求y值。
3x-11(0≤x<10)
y=2x+5(10≤x<20)
x(20≤x<30)輸入
xx<10TF輸出X無效3x-11→yT輸入xx≥0&&x<30x<10x<202x+5→yx→y輸出yFFFTTx≥0&&x<30TFx<20TFy=xy=3x-11y=2x+5輸出x無效
輸出yTx<10F9192
intmain(){floatx,y;
printf(”Enterx:”);
scanf(”%f”,&x);if(x>=0&&x<30){if(x<10)y=3*x-11;elseif(x<20)y=2*x+5;elsey=x;
printf(”x=%7.2f,y=%7.2f\n”,x,y);}elseprintf(”%7.2fisinvalid.\n”,x);return0;}54923.4.3選擇結構的嵌套2.switch語句的嵌套switch語句是可以嵌套的:
1int
a=15,b=21,m=0;2switch(a%3){3
case0:m++;4
switch(b%2){5
default:m++;6
case0:m++;break;7}8
case1:m++;9}933.4.4選擇結構程序舉例例3.6
1#include<stdio.h>2int
main()3{4
int
y,m,d,Days;5
printf("input
y,m,d:");6
scanf("%d%d%d",&y,&m,&d);//輸入日期
7
switch(m){//計算每月的天數
8
case2:9Days=28;10
if((y%4==0&&y%100!=0)||(y%400==0))Days++;11
break;12
case4:case6:13
case9:case11:Days=30;break;
943.4.4選擇結構程序舉例例3.6
14
default:Days=31;//其余月份為31天
15}16d++;17
if(d>Days)d=1,m++;//判斷月末
18
if(m>12)m=1,y++;//判斷年末
19
printf("%d-%d-%d\n",y,m,d);20
return0;21}953.4.4選擇結構程序舉例例3.7
1#include<stdio.h>2int
main()3{4
int
m,d,t;5
printf("input
m,d:");6
scanf("%d%d",&m,&d);//輸入月份和日期
7t=m<7?21:23;//7月前為21,7月后為238
if(d>=t)m++;//在一個月的t號之后月份加一
9
switch(m){10
case2:printf("寶瓶\n");break;11
case3:printf("雙魚\n");break;12
case4:printf("白羊\n");break;13
case5:printf("金牛\n");break;14
case6:printf("雙子\n");break;
963.4.4選擇結構程序舉例例3.7
15
case7:printf("巨蟹\n");break;16
case8:printf("獅子\n");break;17
case9:printf("室女\n");break;18
case10:printf("天秤\n");break;19
case11:printf("天蝎\n");break;20
case12:printf("射手\n");break;21
default:printf("摩羯\n");22}23
return0;24}973.4.4選擇結構程序舉例圖3.7星座與日期規(guī)律9899例:設計一個簡單的菜單選擇程序,根據選擇可實現a與b的四則運算。#include“stdio.h”intmain(){
inta,b;charc1;printf(”1.Add\n”);printf(”2.Subtract\n”);printf(”3.Multiply\n”);printf(”4.Divide\n”);
printf(”Enteryourchoice:”);c1=getchar();5599100
c1=getchar();if(c1>=’1’&&c1<=’4’){
printf(”Enter
a,b:”);
scanf(“%d,%d”,&a,&b);switch(c1){case’1’:printf(“%d\n”,a+b);break;case’2’:printf(“%d\n”,a-b);break;case’3’:printf(“%d\n”,a*b);break;case’4’:printf(“%f\n”,(float)a/b);}}elseprintf(“Invalidselection.”);return0;}1003.5程序循環(huán)結構1.while語句2.do語句3.for語句101C語言實驗安排:周2晚19:00-21:4502011201、2、3、4曹光前4-16周
教室:3層北1023.5.1while語句while語句while語句的作用是計算給定的表達式,根據結果判定循環(huán)執(zhí)行語句,語句形式為:其中的語句稱為子語句,又稱循環(huán)體,圓括號內的表達式稱為循環(huán)條件。
while(表達式
)語句;1033.5.1while語句while語句的執(zhí)行過程是:①計算表達式,無論表達式為何種類型均將這個值按邏輯值處理;②如果值為真,則執(zhí)行子語句,然后重復①;③如果值為假,則while語句結束,執(zhí)行后續(xù)語句。
1043.5.1while語句圖3.8while語句執(zhí)行流程ExpressionRepetitionbody1053.5.1while語句【例3.8】求即
1063.5.1while語句圖3.8while語句執(zhí)行流程1073.5.1while語句例3.8
1#include<stdio.h>2int
main()3{4
int
n=1,sum=0;5
while(n<=100){//循環(huán)直到n大于1006sum=sum+n;//累加和
7n=n+1;8}9
printf("sum=%d\n",sum);10
return0;11}1083.5.1while語句例3.8
4
int
n=1,sum=0;5
while(n<=100){//循環(huán)直到n大于1006sum=sum+n;//累加和
7n=n+1;8}第4行先做循環(huán)前的初始化,n為1,sum為0。第5行while語句時n<=100的結果為真,則執(zhí)行循環(huán)體;循環(huán)體是復合語句,先計算sum累加,則sum變?yōu)?+1的結果,再讓n累加1。1093.5.1while語句例3.8
4
int
n=1,sum=0;5
while(n<=100){//循環(huán)直到n大于1006sum=sum+n;//累加和
7n=n+1;8}重復第5行的比較和執(zhí)行過程,則n值越來越趨向100,n<=100也越來越趨向假,sum逐漸為累加和的結果;當n為100時,n<=100為真,sum為的結果,n值累加到101,則n<=100為假,while語句結束。1103.5.1while語句例3.8
4
int
n=1,sum=0;5
while(n<=100){//循環(huán)直到n大于1006sum=sum+n;//累加和
7n=n+1;8}第4行叫循環(huán)初始,即進入循環(huán)前的初始計算過程。如果不給n和sum賦初值可不可以?1113.5.1while語句例3.8
4
int
n=1,sum=0;5
while(n<=100){//循環(huán)直到n大于1006sum=sum+n;//累加和
7n=n+1;8}第5行叫循環(huán)條件,即判斷是否繼續(xù)循環(huán)的條件或循環(huán)終止的條件。第7行叫循環(huán)控制,即讓循環(huán)條件趨向結束的計算過程。1123.5.1while語句循環(huán)結構三要素:循環(huán)初始、循環(huán)條件和循環(huán)控制。編寫循環(huán)程序,就要精確設計三要素。循環(huán)初始發(fā)生在循環(huán)之前,使得循環(huán)“就緒”;循環(huán)條件是循環(huán)得以繼續(xù)或終止的判定,而循環(huán)控制是在循環(huán)內部實現循環(huán)條件的關鍵過程。循環(huán)體可以直接或間接利用三要素來達到計算目的,也可以與三要素無關。
1133.5.1while語句while語句的說明。while語句的循環(huán)體既可以是簡單語句,又可以是復合語句或控制語句,但必須是“一個語句”的語法形式。在實際編程中,當循環(huán)體有多條語句時使用復合語句。在循環(huán)中應該有使while表達式趨向假的操作,否則表達式恒為真,循環(huán)永不結束,成為死循環(huán)。1143.5.1while語句while語句的說明。由于while語句先計算表達式的值,再判斷是否循環(huán),所以如果表達式的值始終為假,則循環(huán)一次也不執(zhí)行,失去了循環(huán)的意義。while語句循環(huán)條件可以是C語言的任意表達式。通常情況下,循環(huán)條件是關系表達式或邏輯表達式,應該謹慎出現別的表達式。從循環(huán)結構來看,while語句前應有循環(huán)初始,循環(huán)體內應有循環(huán)控制。
1153.5.2do語句do語句do語句的作用是先執(zhí)行語句,然后計算給定的表達式,根據結果判定是否循環(huán)執(zhí)行,語句形式為:其中的語句稱為子語句,又稱循環(huán)體,圓括號內的表達式稱為循環(huán)條件。
do
語句while(表達式
);1163.5.2do語句do語句的執(zhí)行過程是:①執(zhí)行子語句;②計算表達式,無論表達式為何種類型均將這個值按邏輯值處理;③如果值為真,則再次執(zhí)行①;如果值為假,則do語句結束,執(zhí)行后續(xù)語句。
1173.5.2do語句圖3.9do-while語句執(zhí)行流程Repetitionexpressioncontinue1183.5.2do語句do語句的說明。(1)do語句與while語句的語法和含義類似。(2)do語句的最后必須用分號(;)作為語句結束,循環(huán)體的復合語句形式為:do{…//復合語句}while(表達式
);1193.5.2do語句do語句的說明。(3)do語句先執(zhí)行后判定,while語句則是先判定后執(zhí)行;do語句至少要執(zhí)行循環(huán)體一次,而while語句可能一次也不執(zhí)行。(4)do語句結構和while語句結構是可以相互替換的。圖3.9(b)就是用while語句表示do語句的流程圖,虛線框內為while語句結構。通常情況下,while語句比do語句用得多,而do語句使用的情形似乎就是如圖3.9(b)的while語句結構。
1203.5.2do語句圖3.9do-while語句執(zhí)行流程121122例:輸入一個最多5位的無符號正整數,以十、二、八、十六進制形式輸出。intmain(){unsignednum,a;intn;
printf(”\nPleaseinputadata(1-65535):”);
scanf(”%u”,&num);printf(”\n\t10:%u\n\t2:”,num);a=num;do{n=a%2;a=a/2;/*除2取余法*/
printf(“%d\b\b”,n);}while(a!=0);
printf(”\n\t8:%o\n\t16:%x\n”,num,num);}631223.5.2do語句例3.9
1#include<stdio.h>2int
main()3{4
int
n=1,k=1;5
do{6k=k*n;7
scanf("%d",&n);8}while(n!=0);//輸入0時結束循環(huán)
9
printf("%d\n",k);//輸出乘積
10
return0;11}1233.5.3for語句for語句for語句的作用是計算給定的表達式,根據結果判定循環(huán)執(zhí)行語句,for語句有循環(huán)初始和循環(huán)控制功能,語句形式為:for(表達式1;表達式2;表達式3)語句;1243.5.3for語句for語句的執(zhí)行過程是:①計算表達式1;②計算表達式2,無論表達式2為何種類型均將這個值按邏輯值處理;③如果值為真,則執(zhí)行循環(huán)體,然后計算表達式3,再重復②;④如果值為假,則for語句結束,執(zhí)行后續(xù)語句。
1253.5.3for語句圖3.10for語句執(zhí)行流程1263.5.3for語句for語句的應用格式
for(循環(huán)初始;循環(huán)條件;循環(huán)控制)循環(huán)體;for(n=1,sum=0;n<=100;n++)sum=sum+n;1273.5.3for語句for語句內中三個表達式,用分號(;)作為間隔。三個表達式均可以省略,但中間的分號不能省略,下面分情形討論。情形一。省略表達式1。省略表達式1就相當于將循環(huán)初始計算省略了,此時應在for語句之前有循環(huán)初始,如while語句那樣。其執(zhí)行流程如圖3.11(a)所示。1283.5.3for語句圖3.11for語句的多種形式1293.5.3for語句省略表達式1。n=1,sum=0;for(;n<=100;n++)sum=sum+n;//累加和1303.5.3for語句情形二,省略表達式2。C語言規(guī)定省略表達式2,則循環(huán)條件始終為真,循環(huán)永遠執(zhí)行下去。其執(zhí)行流程如圖3.11(b)所示。1313.5.3for語句圖3.11for語句的多種形式1323.5.3for語句省略表達式2。for(n=1,sum=0;;n++)sum=sum+n;//無限循環(huán)1333.5.3for語句情形三,省略表達式3。省略表達式3相當于將循環(huán)控制計算省略了,此時應在for語句的循環(huán)體里有循環(huán)控制,如while語句那樣。其執(zhí)行流程如圖3.11(c)所示。1343.5.3for語句圖3.11for語句的多種形式1353.5.3for語句省略表達式3。for(n=1,sum=0;n<=100;)sum=sum+n,n++;for(n=1,sum=0;n<=100;)sum=sum+n;
n++;for(n=1,sum=0;n<=100;){sum=sum+n;
n++;}1363.5.3for語句情形四,省略表達式1和表達式3。此時,for語句只有充當循環(huán)條件的表達式2,完全等同于while語句,由此可見for語句比while語句功能強。例如:
n=1,sum=0;for(;n<=100;)sum=sum+n,n++;n=1,sum=0;while(n<=100)sum=sum+n,n++;137138例:for(i=10;i;i--)printf(“%d,”,i);
10,9,8,7,6,5,4,3,2,1,例:for(i=0;i<=10;i=i+2)printf(“%3d”,i);
printf(“\ni=%d”,i);
0246810i=12138139例:for(i=1,j=6;i<j;i++,j--)
printf(“%d*%d=%d\n”,i,j,i*j);
1*6=62*5=103*4=12例:空循環(huán)構成一個延時器
longt;
for(t=0;t<=83000000;++t);
139140例:計算1~5的階乘
intmain(){
int
i,fact;
for(fact=1,i=1;i<=5;i++) {fact=fact*i;
printf("\t%d!=%d\n",i,fact);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園學生人身安全賠償協(xié)議范本2025
- 二零二五年度汽車行業(yè)售后服務聘用勞動合同
- 2025年泰州貨運上崗證考試多少道題
- 家長會發(fā)言稿范文芳
- 2025年臺州資格證模擬考試
- 2025年德宏駕駛員貨運從業(yè)資格證模擬考試
- 2025年南通貨運運輸駕駛員從業(yè)資格證考試試題
- 電子商務平臺大數據精準營銷策略
- 2025年崇左b2貨運資格證考試題庫
- 克己的發(fā)言稿
- 貴州區(qū)域地質地史概述
- Aptitude態(tài)度的重要性
- 監(jiān)理大綱維修改造項目
- 中國著名的塔課件
- 邢臺市區(qū)土地級別及基準地價表
- 《推薦》500kV輸電線路應急處置預案6個
- 李小建《經濟地理學》(電子版)
- 中央空調安裝施工組織設計方案(水、多聯(lián)機)
- 2022年最新蘇教版五年級下冊科學全冊教案
- 咖啡樹的修剪方法和技術_種植技巧
- 小學四年級數學奧數應用題100題
評論
0/150
提交評論