第03章 程序設計的控制結構_第1頁
第03章 程序設計的控制結構_第2頁
第03章 程序設計的控制結構_第3頁
第03章 程序設計的控制結構_第4頁
第03章 程序設計的控制結構_第5頁
已閱讀5頁,還剩123頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章程序設計控制結構1

程序的結構:寫文章有文章的結構建房子有房子的結構制造機械產品由機械產品的結構………

那么編寫程序是否有程序的結構呢?學習的意義

程序結構順序結構選擇結構循環(huán)結構YES!第3章:程序設計的控制結構

23.1順序結構程序設計3.2選擇結構程序設計3.3循環(huán)結構程序設計學習目標

了解結構化程序設計的基本思想;掌握順序結構的基本語句;掌握選擇結構的語句并編程;掌握循環(huán)結構的語句并編程;綜合使用三種程序結構編程解決實際問題。學習內容

3結構化程序設計思想C語言采用的是結構化程序設計思想?;舅枷耄喝魏纬绦蚨伎梢酝ㄟ^順序結構、選擇結構、循環(huán)結構表示。復雜程序是經過這3種基本結構反復嵌套使用而構成的。優(yōu)點:程序模塊結構清楚,層次分明,易于讀寫。4程序控制結構(1)順序結構ABCA條件ABTF(2)分支結構條件TF(3)循環(huán)結構ATF條件A條件TF53.1順序結構程序設計順序結構是最簡單的一種程序結構,流程按語句從上到下的順序依次執(zhí)行的。順序結構中經常使用的是表達式語句、函數調用語句。程序中沒有用于分支選擇或循環(huán)的控制語句。

63.1.1賦值語句賦值語句由一個賦值表達式加上分號“;”組成,其一般形式為:

賦值表達式;賦值語句是程序中最基本的語句。例如:x=10 /*賦值表達式,非表達式語句*/x=10; /*賦值語句*/x=y=z=5; /*連續(xù)賦值語句*/73.1.2基本的輸入、輸出函數標準庫函數中提供了一系列的輸入輸出函數:scanf格式輸入函數printf格式輸出函數

getchar字符輸入函數putchar字符輸出函數因為輸入/輸出由開發(fā)系統(tǒng)提供的庫函數實現(xiàn),函數的原型是在頭文件stdio.h中定義,因此在使用庫函數時,應在源程序的開頭使用如下預編譯命令語句:

#include<stdio.h> 或

#include"stdio.h"

8格式輸出函數printf(P50,提到scanf前講)一般格式printf("格式控制字符串",表達式1,表達式2,…,表達式n);功能按照“格式控制字符串”的要求,將表達式1,表達式2,…,表達式n的值顯示在計算機屏幕上。

說明格式控制字符串用于指定輸出格式。它包含兩類字符:

常規(guī)字符:包括可顯示字符和用轉義字符表示的字符。

格式控制符:以%開頭的一個或多個字符,以說明輸出數據的類型、形式、長度、小數位數等。其格式為:%[修飾符]格式轉換字符例:

longintx=0x8AB6;printf(“TheValueofxis%ld\n”,x);常規(guī)字符常規(guī)字符(轉義符)格式控制符(修飾符)格式控制符(格式轉換符)9printf使用時的注意事項(1)格式控制字符串可以不包含任何格式控制符。printf(“howareyou?\n”);//只有一個字符串參數,輸出為:howareyou?printf(“howoldareyou?\n”,20);//帶有兩個參數,20沒有意義,輸出為:howoldareyou?已知:inta=2;函數調用:printf("a*a=%d,a+5=%d\n",a*a,a+5);實際輸出:

a*a=4,a+5=7(2)當格式控制字符串中既含有常規(guī)字符,又包含有格式控制符時,則表達式的個數應與格式控制符的個數一致。此時,常規(guī)字符原樣輸出,而格式控制符的位置上輸出對應的表達式的值,其對應的順序是:從左到右的格式控制符對應從左到右的表達式。10printf使用時的注意事項(3)

如果格式控制字符串中格式控制符的個數多于表達式的個數,則余下的格式控制符的值將是不確定的。printf("5+3=%d,5-3=%d,5*3=%d",5+3,5-3);輸出結果將是:5+3=8,5–3=2,5*3=-28710輸出隨機charch='A';printf("ch=%c",ch);//輸出結果:ch=A(以字符形式輸出)printf("ch=%d",ch);//輸出結果:ch=65(以'A'字符的ASCII碼形式輸出)(4)不同類型的表達式要使用不同的格式轉換符,同一表達式如果按照不同的格式轉換符來輸出,其結果可能是不一樣的。

11#include<stdio.h>voidmain(){ intx=65,y=97;

printf("%d,%d\n",x,y); printf("x:%c,y:%c\n",x,y); }例3-3輸出字符及其ASCII碼。65,97x:A,y:a運行結果:

12類型格式字符含義d以十進制形式輸出帶符號整數(正數不輸出符號)o以八進制形式輸出無符號整數(不輸出前綴0)x以十六進制形式輸出無符號整數(不輸出前綴Ox)u以十進制形式輸出無符號整數f以小數形式輸出單、雙精度實數e以指數形式輸出單、雙精度實數g選%f或%e中較短的輸出寬度輸出單、雙精度實數c輸出單個字符s輸出字符串格式字符串的一般形式為(帶[]的項為可選項):

printf函數的格式控制符%[標志][輸出最小寬度][.精度][長度]類型13字符含義l長度定義,輸出長整形類型,可以加在字符d、o、x、u之前h長度定義,輸出短整形類型m輸出數據最小寬度;若實際位數多于定義的寬度,則按實際位數輸出,若實際位數少于定義的寬度則補以空格或0(小數點也算作一位).n對實數,表示輸出n位小數;對字符串,表示截取n個字符-結果左對齊,右邊填空格+輸出符號(正號或負號)格式字符串的一般形式為(帶[]的項為可選項):%[標志][輸出最小寬度][.精度][長度]類型第4次課結束結合P51舉例③,其它舉例自學,④⑤⑥⑦上機演示講解14格式輸入函數scanf(P47)一般格式scanf(“格式控制字符串”,變量1的地址,變量2的地址,…,變量n的地址);功能在第一個參數格式控制字符串的控制下,接受用戶的鍵盤輸入,并將輸入的數據依此存放在變量1、變量2、……、變量n中

。

inta;scanf("%d",&a);取地址運算符(與按位“與”同符號),只能作用于變量!格式字符串以%開頭,在%后面跟有各種格式字符,以說明輸入數據的類型、長度等。格式控制符與后續(xù)參數中的變量地址的原則上應有一一對應的關系。已知:

inta,b;函數調用:scanf("%d%d",&a,&b);假設輸入:10□20↙變量的值:a的值是10,b的值是20第5次課15#include<stdio.h>voidmain(){ inta,b,c;

scanf("%d%d%d",&a,&b,&c);/*輸入整型數據*/ printf(“a=%d,b=%d,c=%d”,a,b,c);/*輸出數據*/}例3-1輸入多個整數。a=10,b=20,c=30運行結果(假設輸入為:102030↙):

16格式字符串的一般形式為(帶[]的項為可選項):類型格式字符含義d輸入十進制整數o輸入八進制整數x輸入十六進制整數f或e輸入實數(用小數形式或指數形式)c輸入單個字符s輸入字符串

scanf函數的格式控制符

%[*][輸入數據寬度][長度]類型17字符含義l指定長度:輸入長整型數據(%ld,%lo,%lx)及雙精度型浮點數(%lf,%le)h指定長度:輸入短整型數據(%hd,%ho,%hx)輸入數據寬度指定輸入數據所占字符數(寬度)*表示該輸入項,讀入后不賦予相應的變量

格式字符串的一般形式為(帶[]的項為可選項):%[*][輸入數據寬度][長度]類型*?18使用scanf函數注意事項(結合P49舉例,舉例自學)

(1)如果相鄰兩個格式控制符之間,不指定數據分隔符(如逗號、冒號等),則相應的兩個輸入數據之間,至少用一個空格分隔,或者用Tab鍵分隔,或者輸入一個數據后,按回車,然后再輸入下一個數據。例如:

scanf("%d%d",&num1,&num2);假設給num1輸入12,給num2輸入36,則正確的輸入操作為:

12□36↙(說明:□表示空格)或者

12↙36↙使用“↙”符號表示按回車鍵操作,在輸入數據操作中的作用是,通知系統(tǒng)輸入操作結束。19例如:

scanf("%d:%d:%d",&h,&m,&s);假設給h輸入12,給m輸入30,給s輸入10,正確的輸入操作為:

12:30:10↙

(2)格式控制字符串中出現(xiàn)的常規(guī)字符(包括轉義字符),務必原樣輸入。再例如:

scanf("num1=%d,num2=%d\n",&num1,&num2);

假設給num1輸入12,給num2輸入36,正確的輸入操作為:num1=12,num2=36\n↙例如:

scanf("%3c%3c",&ch1,&ch2);假設輸入abcdefg↙,則系統(tǒng)將讀取的“abc”中的'a'賦給變量ch1;將讀取的"def"中的'd'賦給變量ch2。(3)當格式控制字符串中指定了輸入數據的域寬width時,將讀取輸入數據中相應的width位,但按需要的位數賦給相應的變量,多余部分被舍棄。20(4)當格式控制字符串中含有抑制符‘*’時,表示本輸入項對應的數據讀入后,不賦給相應的變量(該變量由下一個格式指示符輸入)。例如:

scanf("%2d%*2d%3d",&num1,&num2);printf("num1=%d,num2=%d\n",num1,num2);假設輸入123456789↙輸出結果為:num1=12,num2=567。

例如:

scanf("%c%c%c",&ch1,&ch2,&ch3);假設輸入:A□B□C↙,則系統(tǒng)將字母'A'賦值給ch1,空格'□'賦值給ch2,字母'B'賦值給ch3。(5)*

使用格式控制符%c輸入單個字符時,空格和轉義字符均作為有效字符被輸入。21(6)輸入數據時,遇到以下情況,系統(tǒng)認為該數據結束:

遇到空格,或者回車鍵,或者Tab鍵。

遇到輸入域寬度結束。例如“%3d”,只取3列。

遇到非法輸入。比方說,在輸入數值數據時,遇到字母等非數值符號。例如:

scanf("%d",a);如果輸入為:12a3↙,a的值將是12。例如:scanf("%d,%d",&a,&b);如果輸入為:12a34↙,那么a的值將是12,b的值將無法預測。正確的輸入是:12,34↙(7)當一次scanf調用需要輸入多個數據項時,如果前面數據的輸入遇到非法字符,并且輸入的非法字符不是格式控制字符串中的常規(guī)字符,那么,這種非法輸入將影響后面數據的輸入,導致數據輸入失敗。(注意第19頁)22(8)為改善人機交互性,同時簡化輸入操作,在設計輸入操作時,一般先用printf()函數輸出一個提示信息,再用scanf()函數進行數據輸入。例如:將scanf("num1=%d,num2=%d\n",&num1,&num2);改為:printf("num1=");scanf("%d",&num1);printf("num2=");scanf("%d",&num2);23#include<stdio.h>voidmain(){ chara,b;

scanf("a:%c,b:%c",&a,&b); printf("a=%c,b=%c\n",a,b);}例3-2輸入字符。a=M,b=N運行結果(假設輸入為:a:M,b:N↙):

24字符的輸入getchar函數

功能:從鍵盤上輸入一個字符一般形式:getchar();

例3-4輸入單個字符。#include<stdio.h>voidmain(){ charc; c=getchar();/*取得用戶鍵盤輸入字符,賦給字符變量*/ putchar(c);/*將字符變量中的字符輸出到屏幕*/}a運行結果(假設輸入為:a↙):

25例3-5依次取回輸入字符#include<stdio.h>voidmain(){ charc1,c2,c3; c1=getchar();

/*取第一個輸入字符*/ c2=getchar();

/*取第二個輸入字符*/ c3=getchar();

/*取第三個輸入*/ putchar(c1); putchar(c2); putchar(c3); putchar(getchar()); /*直接作為表達式使用*/}abcd運行結果(假設輸入為:abcdefg↙):

26字符輸入的說明:如果程序執(zhí)行到getchar函數,則會一直停留,直到收到鍵盤輸入,再繼續(xù)向下執(zhí)行其后的語句。getchar函數只能接受單個字符,輸入數字也按字符處理;即使輸入多個字符,函數也只接收第一個字符。如果需要輸入多個字符,可以連續(xù)使用多個getchar,依次取回輸入字符。27字符的輸出putchar函數

功能:在顯示器上輸出單個字符

一般形式:putchar(ch);

參數ch可以是:

字符變量 字符常量 整型數據常量(對應的ASCII字符) 特殊字符 轉義字符28常用轉義字符轉義字符功能轉義字符功能\n回車換行\(zhòng)r回車\t水平制表\f換頁\a響鈴\b退格29例3-6連續(xù)輸出單個字符構成句子#include<stdio.h>voidmain(){ charc1='H',c2='E',c3='L',c4='O';/*定義字符變量并賦值*/

putchar(c1);

/*輸出字符變量的值*/

putchar(c2); putchar(c3); putchar(c3); putchar(c4);

putchar('\t');

/*輸出Tab制表鍵*/

putchar(87);

/*輸出字符W*/

putchar(‘!');

/*輸出字符!*/

putchar('\n');

/*輸出回車換行符*/}HELLO W!運行結果:

303.4綜合舉例(順序程序設計P78)例3-24輸入圓的半徑,求圓的周長和面積。

#include"stdio.h"

voidmain() { floatr; printf("Pleaseinputtheradius:\n"); scanf(“%f”,&r); //輸入半徑

printf(“circ=%.2f\n”,2*3.1415926*r);//周長 printf(“area=%.2f\n”,3.1415926*r*r);//面積

}教材此處有誤,不應為dPleaseinputtheradius:30↙circ=188.50area=2827.43運行結果:

313.4綜合舉例(順序程序設計P79)例3-25將輸入的大寫字母改成小寫字母。#include"stdio.h"voidmain(){charc1,c2;printf(“Pleaseinputacapitalletter:”);//輸入大寫字母c1=getchar();c2=c1+32;printf("Thelowercaseletterof\"%c\"is\"%c\".\n",c1,c2);}Pleaseinputacaptialletter:A↙Thelowercaseletterof"A"is"a".運行結果:

323.2選擇結構程序設計選擇結構是根據給定的條件進行判斷,由判斷的結果決定執(zhí)行兩個或多個分支程序段的一支。通常采用if-else語法(教材有誤,不是if-case)或switch-case語法。條件語句1

語句2TF33說明:

(1)

“}”后不加分號(2)語法上和單一語句相同(3)復合語句可嵌套(4)復合語句內定義的變量只能在復合語句內使用。

復合語句將多個語句用大括號“{}”括起來組成的一個語句。

{inta=2,b=3,c;c=a+b;printf("c=%d\n",c);}一般形式為:

{[數據說明部分;]執(zhí)行語句部分;}

(補充)例:#include<stdio.h>voidmain(){intx=10,y=20,z;

z=x+y;

{intz;z=x*y;printf("z=%d\n",z);//輸出復合語句中z的值}printf("z=%d\n",z);//輸出復合語句外z的值}輸出結果:z=200z=303.2.1復合語句和空語句34

while(getchar()!='\n')

;本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。這里的循環(huán)體為空語句。

空語句只有分號“;”組成的語句稱為空語句??照Z句是什么也不執(zhí)行的語句。在程序中空語句可用來作空循環(huán)體。353.2.2關系運算符、邏輯運算符與條件運算符選擇結構中,經常采用結果為0或1的關系表達式、邏輯表達式來作為判斷條件。條件語句1

語句2TF36關系運算是對兩個值的大小等關系進行比較。關系運算的表達式稱為關系表達式。C語言提供了6種關系運算符:關系運算符名稱優(yōu)先級<小于優(yōu)先級相同(高于下面兩種)<=(<和=之間沒有空格)小于或等于>大于>=(>和=之間沒有空格)大于或等于==(兩個=之間沒有空格)等于優(yōu)先級相同(低于上面四種)!=

(!和=之間沒有空格)不等于1.關系運算符和關系表達式

37關系表達式的結果是1或0。表達式關系成立,即為真,則結果是1;表達式不成立,即為假,結果為0。注意:C語言用0表示假,非0表示真。一個關系表達式的值不是0就是1,0表示假,1表示真。例如

關系表達式:a>b如果a=10,b=20,那么表達式不成立,結果為0。如果a=30,b=20,那么表達式成立,結果為1。38關系運算符的優(yōu)先級

算術運算符高移位運算符關系運算符&、|、^賦值運算符低例如:

c>a+b等價于:a>b!=c等價于:a==b<c等價于:

a=b>c等價于:

a>>2<c+d等價于:a&4>b|c等價于:

c>(a+b)(a>b)!=ca==(b<c)a=(b>c)(a>>2)<(c+d)(a&(4>b))|c再例如:

a<=b+c 等價于:a<=(b+c)d=a==b>c 等價于:d=(a==(b>c))d=a>b>c

等價于:d=((a>b)>c)39已知:a=1;b=2;c=3;

問:d=a!=c==a<b<c;的值?

答:d的值為1。等價于:d=((a!=c)==((a<b)<c));例:求表達式的值inta=3,b=2,c=1,d,f;a>b(a>b)==cb+c<ad=a>bf=a>b>c//表達式值1//表達式值1//表達式值0//d=1//f=040關系運算注意:例若a=0;b=0.5;x=0.3;

則a<=x<=b的值為

0例

5>2>7>8在C中是允許的,值為0例

inti=1,j=7,a;a=i+(j%4!=0);

則a=2例‘a’>0結果為‘A’>100結果為10例

應避免對實數作相等或不等的判斷如1.0/3.0*3.0==1.0結果為可改寫為:fabs(1.0/3.0*3.0-1.0)<1e-6041例3-7比較大小#include"stdio.h"voidmain(){ charc1='a',c2='b'; inti=10,j=20,k=30;

printf("c1=%c,c2=%c\n",c1,c2); printf("resultofc1>c2is:%d\n",c1>c2);printf("i=%d,j=%d,k=%d\n",i,j,k);printf("resultofk==i+jis:%d\n",k==i+j);printf(“resultofc1<iis:%d\n”,c1<i);/*比較字符變量c1和整型變量i的大小*/ }c1=a,c2=bresultofc1>c2is:0i=10,j=20,k=30resultofk==i+jis:1resultofc1<iis:0運行結果:422.邏輯運算符和邏輯表達式

邏輯運算符:對邏輯量進行與、或、非的運算。

邏輯運算符例子名稱結合性優(yōu)先級關系!!a邏輯非,單目運算符,表示相反右結合性

高低&&(兩個&之間沒有空格)a&&b邏輯與,雙目運算符,表示并且左結合性||(兩個|之間沒有空格)a||b邏輯或,雙目運算符,表示或者AB!A!BA&&BA||B假(0)假(0)1100假(0)真(非0)1001真(非0)假(0)0101真(非0)真(非0)0011邏輯運算真值表:運算結果是1或0,1表示真,0表示假。43!、~、++、--、sizeof高算術運算符移位運算符關系運算符&、|、^&&、||賦值運算符低例如:

a<=x&&x<=b等價于:a>b&&x>y等價于:a==b||x==y等價于:!a||a>b等價于:!a>b等價于:c=a||b等價于:a|7&&b&8等價于:a>>2&&b<<1等價于:2.邏輯運算符和邏輯表達式

邏輯表達式

用邏輯運算符連接邏輯量或關系表達式而成的表達式稱為邏輯表達式。邏輯表達式的一般形式為:表達式邏輯運算符表達式例:a<b&&b<c、x>10||x<-10、!x&&!y邏輯運算符的優(yōu)先級

(a<=x)&&(x<=b)(a>b)&&(x>y)(a==b)||(x==y)(!a)||(a>b)(!a)>bc=(a||b)(a|7)&&(b&8)(a>>2)&&(b<<1)表示“a小于等于x,且x小于等于b”。切勿寫為a<=x<=b44已知:a=4;b=5;

問:c=b>3&&2||8<b-!a;的值?

答:c的值為1。等價于:c=(((b>3)&&2)||(8<(b–(!a))));

例:求表達式的值a=4;b=5;!aa&&ba||b!a||b4&&0||2‘c’&&‘d’//值為0//值為1//值為1//值為1//值為1//值為1第5次課結束45邏輯運算注意:邏輯表達式求解時,并非所有的邏輯運算符都被執(zhí)行,只是在必須執(zhí)行下一個邏輯運算符才能求出表達式的解時,才執(zhí)行該運算符。例a&&b&&c//只在a為真時,才判別b的值;

只在a、b都為真時,才判別c的值例

a||b||c//只在a為假時,才判別b的值;

只在a、b都為假時,才判別c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b)&&(n=c>d)//結果:m=0,n=1操作數可以是任何類型的數據。例如: ‘a’>=15 /*表達式結果為1*/ !10.0 /*表達式結果為0*/不做(n=c>d)第6次課463.條件運算符與條件表達式“?:”是C語言中唯一的三目運算符。一般形式:表達式1

?表達式2

:表達式3執(zhí)行過程例如:max=(a>b)?a:b;該語句實現(xiàn)的是求a、b兩個數中的大數。運算結果為:表達式2的值表達式1假真運算結果為:表達式3的值例求a+|b|printf(“a+|b|=%d\n”,b>0?a+b:a-b);例(a==b)?’Y’:’N’//若a等于b,表達式的值為‘Y’,否則為‘N’(x%2==1)?1:0//若x是奇數,表達式的值為1,是偶數則為0(x>=0)?x:-x//表達式的值是x的絕對值(c>=‘a’&&c<=‘z’)?c-’a’+’A’:c//若c是小寫字母,表達式的值為其大寫字母;否則值為c。注意:c-‘a’+‘A’=c-(‘a’-’A’)=c-3247條件運算符?和:必須一起使用,不能分開。條件運算符的優(yōu)先級別很低,僅僅高于賦值運算符和逗號運算符,而比其他運算符都低。所以max=(a>b)?a:b;也可以寫成max=a>b?a:b;形式。條件運算符可嵌套

如x>0?1:(x<0?-1:0)結合方向:自右向左

如a>b?a:c>d?c:d

a>b?a:(c>d?c:d)表達式expr1、expr2、expr3類型可不同,表達式值取較高的類型。例x?‘a’:‘b’//x=0,表達式值為‘b’;x≠0,表達式值為‘a’x>y?1:1.5//x>y,值為1.0;x<y,值為1.5(x%2==1)?"odd":"even"條件運算符和條件表達式注意48例3-8輸入整數x,按右邊的函數檢驗x的正負,并計算x的絕對值。

#include"stdio.h"

voidmain() { intx,y; scanf("%d",&x); y=x>0?1:(x<0?–1:0); printf("y=%d\n",y); printf("abs(x)=%d\n",x>=0?x:-x); }-21↙y=-1abs(x)=21運行結果:

49運算符總結:

總體上講,單目運算符都是同等優(yōu)先級的,具有右結合性,并且優(yōu)先級比雙目運算符和三目運算符都高。三目運算符的優(yōu)先級比雙目運算符要低,但高于賦值運算符和逗號運算符。逗號運算符的優(yōu)先級最低,其次是賦值運算符。只有單目運算符、賦值運算符和條件運算符具有右結合性,其它運算符都是左結合性。雙目運算符中,算術運算符的優(yōu)先級最高,邏輯運算符的優(yōu)先級最低。

單目運算符高算術運算符移位運算符關系運算符位運算符邏輯運算符條件運算符賦值運算符逗號運算符低到現(xiàn)在為止,我們已經學習了30多個運算符。掌握它們的優(yōu)先級關系特別重要。優(yōu)先級的記憶規(guī)則:503.2.3選擇結構的程序設計選擇結構有:使用if語句的條件選擇結構使用switch語句的開關選擇結構兩種形式。if語句簡單if形式if-else形式if-else-if形式嵌套的if語句513.2.3選擇結構的程序設計1.if語句

簡單if語句形式

if(表達式)語句;格式:執(zhí)行流程:語句表達式TF含義:如果表達式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句而繼續(xù)執(zhí)行if語句之后的程序。例3-9判斷學生成績是否及格 #include"stdio.h"

voidmain() { intgrade; printf("Pleaseinputyourgrade:"); scanf("%d",&grade);

if(grade>=60) printf("Good!\n"); }Pleaseinputyourgrade:80↙Good!運行結果:

523.2.3選擇結構的程序設計1.if語句

if_else形式

if(表達式)語句1;else語句2;格式:執(zhí)行流程:表達式語句1語句2TF含義:如果表達式的值為真,則執(zhí)行語句1,否則執(zhí)行語句2。例3-10判斷兩個整數的是否相等 #include"stdio.h"

voidmain() { inta,b; printf("Pleaseinputtwointegernumbers:"); scanf("%d%d",&a,&b);

if(a==b) printf("Equal!"); else printf("Unequal!"); }Pleaseinputtwonumbers:80100↙Unequal!運行結果:

531.if語句

if_else_if形式

if(表達式1)語句1;elseif(表達式2)語句2;elseif(表達式3)語句3;……[else語句n;]格式:執(zhí)行流程:表達式1語句1語句2F表達式2表達式3F語句3語句nTFTT含義:依次判斷表達式的值,當出現(xiàn)某個值為真時,則執(zhí)行其對應的語句。然后跳到整個if語句之外繼續(xù)向后執(zhí)行程序。如果所有的表達式均為假,則執(zhí)行語句n。54例3-11比較兩個數的大小#include"stdio.h"voidmain(){ inta,b;

printf("Pleaseinputtwointegernumbers:"); scanf("%d%d",&a,&b);

if(a==b) printf(“Equal!”);//此處教材有誤,去掉“max”

elseif(a<b) printf("%dislargerthan%d!\n",b,a);

else//注意與對應if對齊,教材排版不妥

printf("%dislargerthan%d!\n",a,b); }Pleaseinputtwonumbers:80100↙100islargerthan80!運行結果:

Pleaseinputtwonumbers:100100↙Equal!另一種運行結果:

55例3-12判斷學生成績的級別#include<stdio.h>voidmain(){ intgrade;

printf("Pleaseinputyourgrade(0-100):"); scanf("%d",&grade);

if(grade>100||grade<0) printf("%disaninvalidvalue.\n",grade); elseif(grade>=80) printf("%disGOOD!",grade);

elseif(grade>=60) printf("%disOK!",grade);

else

printf("%disNOTGOOD!",grade); }//注意if與對應else對齊,教材排版不妥Pleaseinputyourgrade(0-100):89↙89isGOOD!運行結果:

56if語句嵌套:

一般形式:if(expr1)

if(expr2)statement1;elsestatement2;else

if(expr3)statement3;elsestatement4;內嵌if內嵌ifif(expr1)

if(expr2)statement1;

內嵌ifif(expr1){

if(expr2)statement1;}elsestatement2;

內嵌ifif(expr1)if(expr2)statement1;else

statement2;else

statement3;內嵌if57例3-13比較兩個數的大小

#include<stdio.h>

voidmain(){inta,b;printf(“Pleaseinputtwonumbers:");scanf("%d%d",&a,&b);printf(“a=%d,b=%d”,a,b);if(a!=b)if(a<b)printf(“a<b\n");elseprintf(“a>b\n");elseprintf(“a==b\n");}運行結果:Pleaseinputtwonumbers:80100↙a=100,b=80a>b58例3-14求三個數中的最大數#include<stdio.h>

voidmain(){ intx,y,z,max;

printf("Pleaseinputthreeintegernumber:"); scanf("%d%d%d",&x,&y,&z); max=x; /*初始設置變量max為x的值*/

if(x==y&&y==z) printf("x=y=z,max=%d\n",max);

else{

if(y>max) max=y;

if(z>max) max=z; printf("max=%d\n",max); }}運行結果:Pleaseinputtwonumbers:111133↙

max=3359if語句注意事項

(1)if語句后面的表達式必須用括號括起來。例:ifx>0printf(“x>0”);例:if(x>0)printf(“x>0”);

if(a=5)語句;

//表達式的值永遠為非0,所以其后的語句總是要執(zhí)行的if(b)語句;

//等價于if(b!=0)語句;(2)表達式通常是邏輯表達式或關系表達式,但也可以是其它任何表達式,如賦值表達式等,甚至也可以是一個變量。只要表達式非零時,表達式的值就為真,否則就是假。60if語句注意事項

(3)在if語句的三種形式中,所有的語句應為單個語句,如果要想在滿足條件時執(zhí)行一組(多個)語句,則必須把這一組語句用{}括起來組成一個復合語句。但要注意的是在}之后不能再加分號。例:if(a>b)a++;b++;else{a=0;b=1;}例:if(a>b){a++;b++;}else{a=0;b=1;}61if語句注意事項

(4)在if語句中,如果表達式是一個判斷兩個數是否相等的關系表達式,要當心不要將==寫成了賦值運算符=。例:

#include<stdio.h>

voidmain(){intx=0;if(x==0)printf(“x=0\n”);elseprintf(“x!=0\n”);}例:

#include<stdio.h>

voidmain(){intx=0;if(x=0)printf(“x=0\n”);elseprintf(“x!=0\n”);}運行結果:x=0運行結果:x!=062

if(……)if(……)if(……)else……else……else……C語言規(guī)定,在缺省{}時,else總是和它上面離它最近的未配對的if配對例:

#include<stdio.h>voidmain(){

inta=1,b=-1;

if(a>0)

if(b>0)a++;

elsea--;printf("a=%d\n");}例:

#include<stdio.h>voidmain(){

inta=1,b=-1;

if(a>0)

{if(b>0)a++;}

elsea--;printf("a=%d\n");}運行結果:a=0運行結果:a=1if_else配對原則63例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b)

{if(b==c)printf(“a==b==c”);

}elseprintf(“a!=b”);實現(xiàn)if~else正確配對方法:加{}64例:考慮下面程序輸出結果:

voidmain(){intx=100,a=10,b=20;intv1=5,v2=0;if(a<b)

if(b!=15)

if(!v1)x=1;

else

if(!v2)x=10;printf(“%d”,x);}結果:10等價于if(v1==0)等價于if(v2==0)652.switch語句(開關分支語句)一般形式:switch(表達式){caseC1: 語句組1;caseC2: 語句組2;…….caseCn: 語句組n;[default: 語句組m;]}含義:計算表達式的值,如果表達式的值和case中某常量表達式值相等時,就執(zhí)行該case下的語句組,然后對之后的所有case及default不再判斷而直接執(zhí)行。如果表達式的值與所有case后的常量表達式均不相同時,則僅執(zhí)行default后的語句。

66執(zhí)行過程:switch表達式語句組1語句組2語句組n語句組m…...C1C2Cndefaultcase

67例3-15輸入1-7之間的一個數字,輸出該數字在一個星期中所對應日期的英文名稱#include"stdio.h"voidmain(){ intday; printf("Pleaseinputaintegernumberbetween1and7:"); scanf("%d",&day);

switch(day) { case1: printf("Monday\n"); case2: printf("Tuesday\n"); case3: printf("Wednesday\n"); case4: printf("Thursday\n"); case5: printf("Friday\n"); case6: printf("Saturday\n"); case7: printf("Sunday\n"); default: printf("Error\n");}}運行結果:Pleaseinputaintegernumberbetween1and7:5↙Friday SaturdaySundayError68case后面的“常量表達式”僅起語句標號作用,并不進行條件判斷。系統(tǒng)一旦找到入口標號,就從此標號開始執(zhí)行,不再進行標號判斷,所以必須加上break語句,以便結束switch語句。

switch(day) { case1: printf("Monday\n"); break; case2: printf("Tuesday\n"); break; case3: printf("Wednesday\n"); break; case4: printf("Thursday\n"); break; case5: printf("Friday\n"); break; case6: printf("Saturday\n"); break; case7: printf("Sunday\n"); break; default: printf("Error\n");}修改后的運行結果:Pleaseinputaintegernumberbetween1and7:5↙Friday 69

#include<stdio.h>voidmain(){charch;ch=getch();switch(ch){case'Y':printf("Yes\n");break;case'N':printf("No\n");break;case'A':printf("All\n");break;default:printf("Yes,NoorAll\n");}}運行結果:

No//假設輸入為:N

#include<stdio.h>voidmain(){charch;ch=getch();switch(ch){case'Y':printf("Yes\n");break;case'N':printf("No\n");case'A':printf("All\n");break;default:printf("Yes,NoorAll\n");}}//假設輸入為:N運行結果:

NoALL70

使用switch語句注意事項(1)switch后面的“表達式”,可以是int、char和枚舉型中的一種,但不可為浮點型。floata,b=4.0;scanf("%f",&a);switch(a){case1:b=b+1;break;case2:b=b-1;break;}printf("b=%f\n",b);不可為浮點型表達式71

使用switch語句注意事項(2)每個case后面必須是“常量表達式”,表達式中不能包含變量。例:按成績分成A、B、C、D、E、F幾個等級。charscore;printf("EnterScore:");scanf("%d",&score);switch(score){casescore>=90:printf("A");break;casescore>=80&&score<90:printf(“B");break;casescore>=70&&score<80:printf(“C");break;casescore>=60&&score<70:printf(“E");break;default:printf(“F");break;}case后面包含變量72inta,b=4;scanf("%d",&a);switch(a){case1:b=b+2;break;case2:b=b*2;break;case1:b=b+2;break;}printf("b=%d\n",b);

使用switch語句注意事項(3)每個case后面“常量表達式”的值,必須各不相同,否則會出現(xiàn)相互矛盾的現(xiàn)象。case1在前面已使用73

使用switch語句注意事項(4)case后面語句(組)可加{}也可以不加{},但一般不加{}。switch(i){case1:{b=b+1;break;}//{}可加可不加case2:b=b-1;break;}74

使用switch語句注意事項(5-1)case子句和default子句如果都帶有break子句,那么它們之間順序的變化不會影響switch語句的功能。#include<stdio.h>voidmain(){charch;ch=getch();switch(ch){case'Y':printf("Yes\n");break;case'N':printf("No\n");break;case'A':printf("All\n");break;

default:printf("Yes,NoorAll\n");break;}}#include<stdio.h>voidmain(){charch;ch=getch();switch(ch){case'Y':printf("Yes\n");break;

default:printf("Yes,NoorAll\n");break;case'N':printf("No\n");break;case'A':printf("All\n");break;}}75

使用switch語句注意事項(5-2)case子句和default子句如果有的帶有break子句,而有的沒有帶break子句,那么它們之間順序的變化可能會影響輸出的結果。

#include<stdio.h>voidmain(){charch;ch=getchar();switch(ch){case'Y':printf("Yes\n");break;case'N':printf("No\n");break;case'A':printf("All\n");break;

default:printf("Yes,NoorAll\n");}}#include<stdio.h>voidmain(){charch;ch=getchar();switch(ch){case'Y':printf("Yes\n");break;

default:printf("Yes,NoorAll\n");case'N':printf("No\n");break;case'A':printf("All\n");break;}}//假設輸入為:B運行結果:Yes,NoorAll運行結果:Yes,NoorAllNo//假設輸入為:B76

使用switch語句注意事項 (6)switch語句可以嵌套。

voidmain(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y)

{case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}printf("\na=%d,b=%d",a,b);}運行結果:a=2,b=1

77重疊表達方式:switch語句中,如果不同的case分支下執(zhí)行的是相同的語句組,那么可以簡化程序為重疊表達方式,語句組不需要重復編寫。

一般形式switch(表達式){ caseC1: caseC2: caseC3: 語句組1;break;

caseC4: 語句組2;break; ……. caseCn: 語句組n;break;[default: 語句組m;]}78例3-16判斷用戶輸入字符是數字還是空格或其他符號。#include<stdio.h>voidmain(){charc;printf("Pleaseinputacharacter:");scanf("%c",&c);

switch(c)

{

case

'0':

case'1':

case'2':

case

'3':

case

'4':

case

'5':

case

'6':

case

'7':

case

'8':

case

'9': printf("%cisanumericalcharacter!\n",c); break;

case

'': printf("%cisablankspace!\n",c); break;

default: printf("%cisothercharacter!\n",c);}}運行結果:PleaseInputacharacter:5↙5isanumericalcharacter!程序用if語句也可以實現(xiàn),下面的程序段完成了相同的功能。c=getchar();if(c>='0'&&c<='9') printf("%cisanumericalcharacter!\n",c);elseif(c=='') printf("Inputisablankspace!\n");else printf("%cisothercharacter!\n",c);79

例:當a的值是1、2、3時,將b的值加2,當a的值是4、5、6時,將b的值減2。

inta,b=4;scanf("%d",&a);switch(a){case1:case2:case3:b+=2;break;case4:case5:case6:b-=2;break;default:b*=2;break;}printf("b=%d\n",b);80例3-26

判斷輸入的年份是否是閏年。閏年是能被4整除但不能被100整除的年份,或可以被400整除的年份。P79的程序自學(條理不夠清楚)。(補充)程序應該這樣來設計:如果X能被Y整除,則余數為0,即如果X%Y的值等于0,則表示X能被Y整除!首先將是否閏年的標志leap預置為0(非閏年),這樣僅當year為閏年時,將leap置為1即可。這種處理兩種狀態(tài)值的方法,對優(yōu)化算法和提高程序可讀性非常有效,請讀者仔細體會。3.4選擇結構程序設計舉例(P79)81#include<stdio.h>voidmain(){intyear,leap=0; //leap=0:預置為非閏年printf("Pleaseinputtheyear:");//提示輸入年份scanf(“%d”,&year);//輸入年份if(year%4==0)//如果被4整除

if(year%100!=0)//如果不被100整除leap=1;//置為閏年if(year%400==0)//如果被400整除

溫馨提示

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

評論

0/150

提交評論