版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第3章程序設(shè)計控制結(jié)構(gòu)1
程序的結(jié)構(gòu):寫文章有文章的結(jié)構(gòu)建房子有房子的結(jié)構(gòu)制造機(jī)械產(chǎn)品由機(jī)械產(chǎn)品的結(jié)構(gòu)………
那么編寫程序是否有程序的結(jié)構(gòu)呢?學(xué)習(xí)的意義
程序結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)YES!第3章:程序設(shè)計的控制結(jié)構(gòu)
23.1順序結(jié)構(gòu)程序設(shè)計3.2選擇結(jié)構(gòu)程序設(shè)計3.3循環(huán)結(jié)構(gòu)程序設(shè)計學(xué)習(xí)目標(biāo)
了解結(jié)構(gòu)化程序設(shè)計的基本思想;掌握順序結(jié)構(gòu)的基本語句;掌握選擇結(jié)構(gòu)的語句并編程;掌握循環(huán)結(jié)構(gòu)的語句并編程;綜合使用三種程序結(jié)構(gòu)編程解決實際問題。學(xué)習(xí)內(nèi)容
3結(jié)構(gòu)化程序設(shè)計思想C語言采用的是結(jié)構(gòu)化程序設(shè)計思想?;舅枷耄喝魏纬绦蚨伎梢酝ㄟ^順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)表示。復(fù)雜程序是經(jīng)過這3種基本結(jié)構(gòu)反復(fù)嵌套使用而構(gòu)成的。優(yōu)點:程序模塊結(jié)構(gòu)清楚,層次分明,易于讀寫。4程序控制結(jié)構(gòu)(1)順序結(jié)構(gòu)ABCA條件ABTF(2)分支結(jié)構(gòu)條件TF(3)循環(huán)結(jié)構(gòu)ATF條件A條件TF53.1順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)是最簡單的一種程序結(jié)構(gòu),流程按語句從上到下的順序依次執(zhí)行的。順序結(jié)構(gòu)中經(jīng)常使用的是表達(dá)式語句、函數(shù)調(diào)用語句。程序中沒有用于分支選擇或循環(huán)的控制語句。
63.1.1賦值語句賦值語句由一個賦值表達(dá)式加上分號“;”組成,其一般形式為:
賦值表達(dá)式;賦值語句是程序中最基本的語句。例如:x=10 /*賦值表達(dá)式,非表達(dá)式語句*/x=10; /*賦值語句*/x=y=z=5; /*連續(xù)賦值語句*/73.1.2基本的輸入、輸出函數(shù)標(biāo)準(zhǔn)庫函數(shù)中提供了一系列的輸入輸出函數(shù):scanf格式輸入函數(shù)printf格式輸出函數(shù)
getchar字符輸入函數(shù)putchar字符輸出函數(shù)因為輸入/輸出由開發(fā)系統(tǒng)提供的庫函數(shù)實現(xiàn),函數(shù)的原型是在頭文件stdio.h中定義,因此在使用庫函數(shù)時,應(yīng)在源程序的開頭使用如下預(yù)編譯命令語句:
#include<stdio.h> 或
#include"stdio.h"
8格式輸出函數(shù)printf(P50,提到scanf前講)一般格式printf("格式控制字符串",表達(dá)式1,表達(dá)式2,…,表達(dá)式n);功能按照“格式控制字符串”的要求,將表達(dá)式1,表達(dá)式2,…,表達(dá)式n的值顯示在計算機(jī)屏幕上。
說明格式控制字符串用于指定輸出格式。它包含兩類字符:
常規(guī)字符:包括可顯示字符和用轉(zhuǎn)義字符表示的字符。
格式控制符:以%開頭的一個或多個字符,以說明輸出數(shù)據(jù)的類型、形式、長度、小數(shù)位數(shù)等。其格式為:%[修飾符]格式轉(zhuǎn)換字符例:
longintx=0x8AB6;printf(“TheValueofxis%ld\n”,x);常規(guī)字符常規(guī)字符(轉(zhuǎn)義符)格式控制符(修飾符)格式控制符(格式轉(zhuǎn)換符)9printf使用時的注意事項(1)格式控制字符串可以不包含任何格式控制符。printf(“howareyou?\n”);//只有一個字符串參數(shù),輸出為:howareyou?printf(“howoldareyou?\n”,20);//帶有兩個參數(shù),20沒有意義,輸出為:howoldareyou?已知:inta=2;函數(shù)調(diào)用:printf("a*a=%d,a+5=%d\n",a*a,a+5);實際輸出:
a*a=4,a+5=7(2)當(dāng)格式控制字符串中既含有常規(guī)字符,又包含有格式控制符時,則表達(dá)式的個數(shù)應(yīng)與格式控制符的個數(shù)一致。此時,常規(guī)字符原樣輸出,而格式控制符的位置上輸出對應(yīng)的表達(dá)式的值,其對應(yīng)的順序是:從左到右的格式控制符對應(yīng)從左到右的表達(dá)式。10printf使用時的注意事項(3)
如果格式控制字符串中格式控制符的個數(shù)多于表達(dá)式的個數(shù),則余下的格式控制符的值將是不確定的。printf("5+3=%d,5-3=%d,5*3=%d",5+3,5-3);輸出結(jié)果將是:5+3=8,5–3=2,5*3=-28710輸出隨機(jī)charch='A';printf("ch=%c",ch);//輸出結(jié)果:ch=A(以字符形式輸出)printf("ch=%d",ch);//輸出結(jié)果:ch=65(以'A'字符的ASCII碼形式輸出)(4)不同類型的表達(dá)式要使用不同的格式轉(zhuǎn)換符,同一表達(dá)式如果按照不同的格式轉(zhuǎn)換符來輸出,其結(jié)果可能是不一樣的。
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運行結(jié)果:
12類型格式字符含義d以十進(jìn)制形式輸出帶符號整數(shù)(正數(shù)不輸出符號)o以八進(jìn)制形式輸出無符號整數(shù)(不輸出前綴0)x以十六進(jìn)制形式輸出無符號整數(shù)(不輸出前綴Ox)u以十進(jìn)制形式輸出無符號整數(shù)f以小數(shù)形式輸出單、雙精度實數(shù)e以指數(shù)形式輸出單、雙精度實數(shù)g選%f或%e中較短的輸出寬度輸出單、雙精度實數(shù)c輸出單個字符s輸出字符串格式字符串的一般形式為(帶[]的項為可選項):
printf函數(shù)的格式控制符%[標(biāo)志][輸出最小寬度][.精度][長度]類型13字符含義l長度定義,輸出長整形類型,可以加在字符d、o、x、u之前h長度定義,輸出短整形類型m輸出數(shù)據(jù)最小寬度;若實際位數(shù)多于定義的寬度,則按實際位數(shù)輸出,若實際位數(shù)少于定義的寬度則補以空格或0(小數(shù)點也算作一位).n對實數(shù),表示輸出n位小數(shù);對字符串,表示截取n個字符-結(jié)果左對齊,右邊填空格+輸出符號(正號或負(fù)號)格式字符串的一般形式為(帶[]的項為可選項):%[標(biāo)志][輸出最小寬度][.精度][長度]類型第4次課結(jié)束結(jié)合P51舉例③,其它舉例自學(xué),④⑤⑥⑦上機(jī)演示講解14格式輸入函數(shù)scanf(P47)一般格式scanf(“格式控制字符串”,變量1的地址,變量2的地址,…,變量n的地址);功能在第一個參數(shù)格式控制字符串的控制下,接受用戶的鍵盤輸入,并將輸入的數(shù)據(jù)依此存放在變量1、變量2、……、變量n中
。
inta;scanf("%d",&a);取地址運算符(與按位“與”同符號),只能作用于變量!格式字符串以%開頭,在%后面跟有各種格式字符,以說明輸入數(shù)據(jù)的類型、長度等。格式控制符與后續(xù)參數(shù)中的變量地址的原則上應(yīng)有一一對應(yīng)的關(guān)系。已知:
inta,b;函數(shù)調(diào)用:scanf("%d%d",&a,&b);假設(shè)輸入:10□20↙變量的值:a的值是10,b的值是20第5次課15#include<stdio.h>voidmain(){ inta,b,c;
scanf("%d%d%d",&a,&b,&c);/*輸入整型數(shù)據(jù)*/ printf(“a=%d,b=%d,c=%d”,a,b,c);/*輸出數(shù)據(jù)*/}例3-1輸入多個整數(shù)。a=10,b=20,c=30運行結(jié)果(假設(shè)輸入為:102030↙):
16格式字符串的一般形式為(帶[]的項為可選項):類型格式字符含義d輸入十進(jìn)制整數(shù)o輸入八進(jìn)制整數(shù)x輸入十六進(jìn)制整數(shù)f或e輸入實數(shù)(用小數(shù)形式或指數(shù)形式)c輸入單個字符s輸入字符串
scanf函數(shù)的格式控制符
%[*][輸入數(shù)據(jù)寬度][長度]類型17字符含義l指定長度:輸入長整型數(shù)據(jù)(%ld,%lo,%lx)及雙精度型浮點數(shù)(%lf,%le)h指定長度:輸入短整型數(shù)據(jù)(%hd,%ho,%hx)輸入數(shù)據(jù)寬度指定輸入數(shù)據(jù)所占字符數(shù)(寬度)*表示該輸入項,讀入后不賦予相應(yīng)的變量
格式字符串的一般形式為(帶[]的項為可選項):%[*][輸入數(shù)據(jù)寬度][長度]類型*?18使用scanf函數(shù)注意事項(結(jié)合P49舉例,舉例自學(xué))
(1)如果相鄰兩個格式控制符之間,不指定數(shù)據(jù)分隔符(如逗號、冒號等),則相應(yīng)的兩個輸入數(shù)據(jù)之間,至少用一個空格分隔,或者用Tab鍵分隔,或者輸入一個數(shù)據(jù)后,按回車,然后再輸入下一個數(shù)據(jù)。例如:
scanf("%d%d",&num1,&num2);假設(shè)給num1輸入12,給num2輸入36,則正確的輸入操作為:
12□36↙(說明:□表示空格)或者
12↙36↙使用“↙”符號表示按回車鍵操作,在輸入數(shù)據(jù)操作中的作用是,通知系統(tǒng)輸入操作結(jié)束。19例如:
scanf("%d:%d:%d",&h,&m,&s);假設(shè)給h輸入12,給m輸入30,給s輸入10,正確的輸入操作為:
12:30:10↙
(2)格式控制字符串中出現(xiàn)的常規(guī)字符(包括轉(zhuǎn)義字符),務(wù)必原樣輸入。再例如:
scanf("num1=%d,num2=%d\n",&num1,&num2);
假設(shè)給num1輸入12,給num2輸入36,正確的輸入操作為:num1=12,num2=36\n↙例如:
scanf("%3c%3c",&ch1,&ch2);假設(shè)輸入abcdefg↙,則系統(tǒng)將讀取的“abc”中的'a'賦給變量ch1;將讀取的"def"中的'd'賦給變量ch2。(3)當(dāng)格式控制字符串中指定了輸入數(shù)據(jù)的域?qū)抴idth時,將讀取輸入數(shù)據(jù)中相應(yīng)的width位,但按需要的位數(shù)賦給相應(yīng)的變量,多余部分被舍棄。20(4)當(dāng)格式控制字符串中含有抑制符‘*’時,表示本輸入項對應(yīng)的數(shù)據(jù)讀入后,不賦給相應(yīng)的變量(該變量由下一個格式指示符輸入)。例如:
scanf("%2d%*2d%3d",&num1,&num2);printf("num1=%d,num2=%d\n",num1,num2);假設(shè)輸入123456789↙輸出結(jié)果為:num1=12,num2=567。
例如:
scanf("%c%c%c",&ch1,&ch2,&ch3);假設(shè)輸入:A□B□C↙,則系統(tǒng)將字母'A'賦值給ch1,空格'□'賦值給ch2,字母'B'賦值給ch3。(5)*
使用格式控制符%c輸入單個字符時,空格和轉(zhuǎn)義字符均作為有效字符被輸入。21(6)輸入數(shù)據(jù)時,遇到以下情況,系統(tǒng)認(rèn)為該數(shù)據(jù)結(jié)束:
遇到空格,或者回車鍵,或者Tab鍵。
遇到輸入域?qū)挾冉Y(jié)束。例如“%3d”,只取3列。
遇到非法輸入。比方說,在輸入數(shù)值數(shù)據(jù)時,遇到字母等非數(shù)值符號。例如:
scanf("%d",a);如果輸入為:12a3↙,a的值將是12。例如:scanf("%d,%d",&a,&b);如果輸入為:12a34↙,那么a的值將是12,b的值將無法預(yù)測。正確的輸入是:12,34↙(7)當(dāng)一次scanf調(diào)用需要輸入多個數(shù)據(jù)項時,如果前面數(shù)據(jù)的輸入遇到非法字符,并且輸入的非法字符不是格式控制字符串中的常規(guī)字符,那么,這種非法輸入將影響后面數(shù)據(jù)的輸入,導(dǎo)致數(shù)據(jù)輸入失敗。(注意第19頁)22(8)為改善人機(jī)交互性,同時簡化輸入操作,在設(shè)計輸入操作時,一般先用printf()函數(shù)輸出一個提示信息,再用scanf()函數(shù)進(jìn)行數(shù)據(jù)輸入。例如:將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運行結(jié)果(假設(shè)輸入為:a:M,b:N↙):
24字符的輸入getchar函數(shù)
功能:從鍵盤上輸入一個字符一般形式:getchar();
例3-4輸入單個字符。#include<stdio.h>voidmain(){ charc; c=getchar();/*取得用戶鍵盤輸入字符,賦給字符變量*/ putchar(c);/*將字符變量中的字符輸出到屏幕*/}a運行結(jié)果(假設(shè)輸入為: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()); /*直接作為表達(dá)式使用*/}abcd運行結(jié)果(假設(shè)輸入為:abcdefg↙):
26字符輸入的說明:如果程序執(zhí)行到getchar函數(shù),則會一直停留,直到收到鍵盤輸入,再繼續(xù)向下執(zhí)行其后的語句。getchar函數(shù)只能接受單個字符,輸入數(shù)字也按字符處理;即使輸入多個字符,函數(shù)也只接收第一個字符。如果需要輸入多個字符,可以連續(xù)使用多個getchar,依次取回輸入字符。27字符的輸出putchar函數(shù)
功能:在顯示器上輸出單個字符
一般形式:putchar(ch);
參數(shù)ch可以是:
字符變量 字符常量 整型數(shù)據(jù)常量(對應(yīng)的ASCII字符) 特殊字符 轉(zhuǎn)義字符28常用轉(zhuǎn)義字符轉(zhuǎn)義字符功能轉(zhuǎn)義字符功能\n回車換行\(zhòng)r回車\t水平制表\f換頁\a響鈴\b退格29例3-6連續(xù)輸出單個字符構(gòu)成句子#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!運行結(jié)果:
303.4綜合舉例(順序程序設(shè)計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);//面積
}教材此處有誤,不應(yīng)為dPleaseinputtheradius:30↙circ=188.50area=2827.43運行結(jié)果:
313.4綜合舉例(順序程序設(shè)計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".運行結(jié)果:
323.2選擇結(jié)構(gòu)程序設(shè)計選擇結(jié)構(gòu)是根據(jù)給定的條件進(jìn)行判斷,由判斷的結(jié)果決定執(zhí)行兩個或多個分支程序段的一支。通常采用if-else語法(教材有誤,不是if-case)或switch-case語法。條件語句1
語句2TF33說明:
(1)
“}”后不加分號(2)語法上和單一語句相同(3)復(fù)合語句可嵌套(4)復(fù)合語句內(nèi)定義的變量只能在復(fù)合語句內(nèi)使用。
復(fù)合語句將多個語句用大括號“{}”括起來組成的一個語句。
{inta=2,b=3,c;c=a+b;printf("c=%d\n",c);}一般形式為:
{[數(shù)據(jù)說明部分;]執(zhí)行語句部分;}
(補充)例:#include<stdio.h>voidmain(){intx=10,y=20,z;
z=x+y;
{intz;z=x*y;printf("z=%d\n",z);//輸出復(fù)合語句中z的值}printf("z=%d\n",z);//輸出復(fù)合語句外z的值}輸出結(jié)果:z=200z=303.2.1復(fù)合語句和空語句34
while(getchar()!='\n')
;本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。這里的循環(huán)體為空語句。
空語句只有分號“;”組成的語句稱為空語句??照Z句是什么也不執(zhí)行的語句。在程序中空語句可用來作空循環(huán)體。353.2.2關(guān)系運算符、邏輯運算符與條件運算符選擇結(jié)構(gòu)中,經(jīng)常采用結(jié)果為0或1的關(guān)系表達(dá)式、邏輯表達(dá)式來作為判斷條件。條件語句1
語句2TF36關(guān)系運算是對兩個值的大小等關(guān)系進(jìn)行比較。關(guān)系運算的表達(dá)式稱為關(guān)系表達(dá)式。C語言提供了6種關(guān)系運算符:關(guān)系運算符名稱優(yōu)先級<小于優(yōu)先級相同(高于下面兩種)<=(<和=之間沒有空格)小于或等于>大于>=(>和=之間沒有空格)大于或等于==(兩個=之間沒有空格)等于優(yōu)先級相同(低于上面四種)!=
(!和=之間沒有空格)不等于1.關(guān)系運算符和關(guān)系表達(dá)式
37關(guān)系表達(dá)式的結(jié)果是1或0。表達(dá)式關(guān)系成立,即為真,則結(jié)果是1;表達(dá)式不成立,即為假,結(jié)果為0。注意:C語言用0表示假,非0表示真。一個關(guān)系表達(dá)式的值不是0就是1,0表示假,1表示真。例如
關(guān)系表達(dá)式:a>b如果a=10,b=20,那么表達(dá)式不成立,結(jié)果為0。如果a=30,b=20,那么表達(dá)式成立,結(jié)果為1。38關(guān)系運算符的優(yōu)先級
算術(shù)運算符高移位運算符關(guān)系運算符&、|、^賦值運算符低例如:
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));例:求表達(dá)式的值inta=3,b=2,c=1,d,f;a>b(a>b)==cb+c<ad=a>bf=a>b>c//表達(dá)式值1//表達(dá)式值1//表達(dá)式值0//d=1//f=040關(guān)系運算注意:例若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(chǎn)’>0結(jié)果為‘A’>100結(jié)果為10例
應(yīng)避免對實數(shù)作相等或不等的判斷如1.0/3.0*3.0==1.0結(jié)果為可改寫為: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運行結(jié)果:422.邏輯運算符和邏輯表達(dá)式
邏輯運算符:對邏輯量進(jìn)行與、或、非的運算。
邏輯運算符例子名稱結(jié)合性優(yōu)先級關(guān)系!!a邏輯非,單目運算符,表示相反右結(jié)合性
高低&&(兩個&之間沒有空格)a&&b邏輯與,雙目運算符,表示并且左結(jié)合性||(兩個|之間沒有空格)a||b邏輯或,雙目運算符,表示或者AB!A!BA&&BA||B假(0)假(0)1100假(0)真(非0)1001真(非0)假(0)0101真(非0)真(非0)0011邏輯運算真值表:運算結(jié)果是1或0,1表示真,0表示假。43!、~、++、--、sizeof高算術(shù)運算符移位運算符關(guān)系運算符&、|、^&&、||賦值運算符低例如:
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.邏輯運算符和邏輯表達(dá)式
邏輯表達(dá)式
用邏輯運算符連接邏輯量或關(guān)系表達(dá)式而成的表達(dá)式稱為邏輯表達(dá)式。邏輯表達(dá)式的一般形式為:表達(dá)式邏輯運算符表達(dá)式例: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))));
例:求表達(dá)式的值a=4;b=5;!aa&&ba||b!a||b4&&0||2‘c’&&‘d’//值為0//值為1//值為1//值為1//值為1//值為1第5次課結(jié)束45邏輯運算注意:邏輯表達(dá)式求解時,并非所有的邏輯運算符都被執(zhí)行,只是在必須執(zhí)行下一個邏輯運算符才能求出表達(dá)式的解時,才執(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)//結(jié)果:m=0,n=1操作數(shù)可以是任何類型的數(shù)據(jù)。例如: ‘a(chǎn)’>=15 /*表達(dá)式結(jié)果為1*/ !10.0 /*表達(dá)式結(jié)果為0*/不做(n=c>d)第6次課463.條件運算符與條件表達(dá)式“?:”是C語言中唯一的三目運算符。一般形式:表達(dá)式1
?表達(dá)式2
:表達(dá)式3執(zhí)行過程例如:max=(a>b)?a:b;該語句實現(xiàn)的是求a、b兩個數(shù)中的大數(shù)。運算結(jié)果為:表達(dá)式2的值表達(dá)式1假真運算結(jié)果為:表達(dá)式3的值例求a+|b|printf(“a+|b|=%d\n”,b>0?a+b:a-b);例(a==b)?’Y’:’N’//若a等于b,表達(dá)式的值為‘Y’,否則為‘N’(x%2==1)?1:0//若x是奇數(shù),表達(dá)式的值為1,是偶數(shù)則為0(x>=0)?x:-x//表達(dá)式的值是x的絕對值(c>=‘a(chǎn)’&&c<=‘z’)?c-’a’+’A’:c//若c是小寫字母,表達(dá)式的值為其大寫字母;否則值為c。注意:c-‘a(chǎn)’+‘A’=c-(‘a(chǎn)’-’A’)=c-3247條件運算符?和:必須一起使用,不能分開。條件運算符的優(yōu)先級別很低,僅僅高于賦值運算符和逗號運算符,而比其他運算符都低。所以max=(a>b)?a:b;也可以寫成max=a>b?a:b;形式。條件運算符可嵌套
如x>0?1:(x<0?-1:0)結(jié)合方向:自右向左
如a>b?a:c>d?c:d
a>b?a:(c>d?c:d)表達(dá)式expr1、expr2、expr3類型可不同,表達(dá)式值取較高的類型。例x?‘a(chǎn)’:‘b’//x=0,表達(dá)式值為‘b’;x≠0,表達(dá)式值為‘a(chǎn)’x>y?1:1.5//x>y,值為1.0;x<y,值為1.5(x%2==1)?"odd":"even"條件運算符和條件表達(dá)式注意48例3-8輸入整數(shù)x,按右邊的函數(shù)檢驗x的正負(fù),并計算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運行結(jié)果:
49運算符總結(jié):
總體上講,單目運算符都是同等優(yōu)先級的,具有右結(jié)合性,并且優(yōu)先級比雙目運算符和三目運算符都高。三目運算符的優(yōu)先級比雙目運算符要低,但高于賦值運算符和逗號運算符。逗號運算符的優(yōu)先級最低,其次是賦值運算符。只有單目運算符、賦值運算符和條件運算符具有右結(jié)合性,其它運算符都是左結(jié)合性。雙目運算符中,算術(shù)運算符的優(yōu)先級最高,邏輯運算符的優(yōu)先級最低。
單目運算符高算術(shù)運算符移位運算符關(guān)系運算符位運算符邏輯運算符條件運算符賦值運算符逗號運算符低到現(xiàn)在為止,我們已經(jīng)學(xué)習(xí)了30多個運算符。掌握它們的優(yōu)先級關(guān)系特別重要。優(yōu)先級的記憶規(guī)則:503.2.3選擇結(jié)構(gòu)的程序設(shè)計選擇結(jié)構(gòu)有:使用if語句的條件選擇結(jié)構(gòu)使用switch語句的開關(guān)選擇結(jié)構(gòu)兩種形式。if語句簡單if形式if-else形式if-else-if形式嵌套的if語句513.2.3選擇結(jié)構(gòu)的程序設(shè)計1.if語句
簡單if語句形式
if(表達(dá)式)語句;格式:執(zhí)行流程:語句表達(dá)式TF含義:如果表達(dá)式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句而繼續(xù)執(zhí)行if語句之后的程序。例3-9判斷學(xué)生成績是否及格 #include"stdio.h"
voidmain() { intgrade; printf("Pleaseinputyourgrade:"); scanf("%d",&grade);
if(grade>=60) printf("Good!\n"); }Pleaseinputyourgrade:80↙Good!運行結(jié)果:
523.2.3選擇結(jié)構(gòu)的程序設(shè)計1.if語句
if_else形式
if(表達(dá)式)語句1;else語句2;格式:執(zhí)行流程:表達(dá)式語句1語句2TF含義:如果表達(dá)式的值為真,則執(zhí)行語句1,否則執(zhí)行語句2。例3-10判斷兩個整數(shù)的是否相等 #include"stdio.h"
voidmain() { inta,b; printf("Pleaseinputtwointegernumbers:"); scanf("%d%d",&a,&b);
if(a==b) printf("Equal!"); else printf("Unequal!"); }Pleaseinputtwonumbers:80100↙Unequal!運行結(jié)果:
531.if語句
if_else_if形式
if(表達(dá)式1)語句1;elseif(表達(dá)式2)語句2;elseif(表達(dá)式3)語句3;……[else語句n;]格式:執(zhí)行流程:表達(dá)式1語句1語句2F表達(dá)式2表達(dá)式3F語句3語句nTFTT含義:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個值為真時,則執(zhí)行其對應(yīng)的語句。然后跳到整個if語句之外繼續(xù)向后執(zhí)行程序。如果所有的表達(dá)式均為假,則執(zhí)行語句n。54例3-11比較兩個數(shù)的大小#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//注意與對應(yīng)if對齊,教材排版不妥
printf("%dislargerthan%d!\n",a,b); }Pleaseinputtwonumbers:80100↙100islargerthan80!運行結(jié)果:
Pleaseinputtwonumbers:100100↙Equal!另一種運行結(jié)果:
55例3-12判斷學(xué)生成績的級別#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與對應(yīng)else對齊,教材排版不妥Pleaseinputyourgrade(0-100):89↙89isGOOD!運行結(jié)果:
56if語句嵌套:
一般形式:if(expr1)
if(expr2)statement1;elsestatement2;else
if(expr3)statement3;elsestatement4;內(nèi)嵌if內(nèi)嵌ifif(expr1)
if(expr2)statement1;
內(nèi)嵌ifif(expr1){
if(expr2)statement1;}elsestatement2;
內(nèi)嵌ifif(expr1)if(expr2)statement1;else
statement2;else
statement3;內(nèi)嵌if57例3-13比較兩個數(shù)的大小
#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");}運行結(jié)果:Pleaseinputtwonumbers:80100↙a=100,b=80a>b58例3-14求三個數(shù)中的最大數(shù)#include<stdio.h>
voidmain(){ intx,y,z,max;
printf("Pleaseinputthreeintegernumber:"); scanf("%d%d%d",&x,&y,&z); max=x; /*初始設(shè)置變量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); }}運行結(jié)果:Pleaseinputtwonumbers:111133↙
max=3359if語句注意事項
(1)if語句后面的表達(dá)式必須用括號括起來。例:ifx>0printf(“x>0”);例:if(x>0)printf(“x>0”);
if(a=5)語句;
//表達(dá)式的值永遠(yuǎn)為非0,所以其后的語句總是要執(zhí)行的if(b)語句;
//等價于if(b!=0)語句;(2)表達(dá)式通常是邏輯表達(dá)式或關(guān)系表達(dá)式,但也可以是其它任何表達(dá)式,如賦值表達(dá)式等,甚至也可以是一個變量。只要表達(dá)式非零時,表達(dá)式的值就為真,否則就是假。60if語句注意事項
(3)在if語句的三種形式中,所有的語句應(yīng)為單個語句,如果要想在滿足條件時執(zhí)行一組(多個)語句,則必須把這一組語句用{}括起來組成一個復(fù)合語句。但要注意的是在}之后不能再加分號。例:if(a>b)a++;b++;else{a=0;b=1;}例:if(a>b){a++;b++;}else{a=0;b=1;}61if語句注意事項
(4)在if語句中,如果表達(dá)式是一個判斷兩個數(shù)是否相等的關(guān)系表達(dá)式,要當(dāng)心不要將==寫成了賦值運算符=。例:
#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”);}運行結(jié)果:x=0運行結(jié)果: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");}運行結(jié)果:a=0運行結(jié)果: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例:考慮下面程序輸出結(jié)果:
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);}結(jié)果:10等價于if(v1==0)等價于if(v2==0)652.switch語句(開關(guān)分支語句)一般形式:switch(表達(dá)式){caseC1: 語句組1;caseC2: 語句組2;…….caseCn: 語句組n;[default: 語句組m;]}含義:計算表達(dá)式的值,如果表達(dá)式的值和case中某常量表達(dá)式值相等時,就執(zhí)行該case下的語句組,然后對之后的所有case及default不再判斷而直接執(zhí)行。如果表達(dá)式的值與所有case后的常量表達(dá)式均不相同時,則僅執(zhí)行default后的語句。
66執(zhí)行過程:switch表達(dá)式語句組1語句組2語句組n語句組m…...C1C2Cndefaultcase
67例3-15輸入1-7之間的一個數(shù)字,輸出該數(shù)字在一個星期中所對應(yīng)日期的英文名稱#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");}}運行結(jié)果:Pleaseinputaintegernumberbetween1and7:5↙Friday SaturdaySundayError68case后面的“常量表達(dá)式”僅起語句標(biāo)號作用,并不進(jìn)行條件判斷。系統(tǒng)一旦找到入口標(biāo)號,就從此標(biāo)號開始執(zhí)行,不再進(jìn)行標(biāo)號判斷,所以必須加上break語句,以便結(jié)束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");}修改后的運行結(jié)果: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");}}運行結(jié)果:
No//假設(shè)輸入為: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");}}//假設(shè)輸入為:N運行結(jié)果:
NoALL70
使用switch語句注意事項(1)switch后面的“表達(dá)式”,可以是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);不可為浮點型表達(dá)式71
使用switch語句注意事項(2)每個case后面必須是“常量表達(dá)式”,表達(dá)式中不能包含變量。例:按成績分成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后面“常量表達(dá)式”的值,必須各不相同,否則會出現(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子句,那么它們之間順序的變化可能會影響輸出的結(jié)果。
#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;}}//假設(shè)輸入為:B運行結(jié)果:Yes,NoorAll運行結(jié)果:Yes,NoorAllNo//假設(shè)輸入為: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);}運行結(jié)果:a=2,b=1
77重疊表達(dá)方式:switch語句中,如果不同的case分支下執(zhí)行的是相同的語句組,那么可以簡化程序為重疊表達(dá)方式,語句組不需要重復(fù)編寫。
一般形式switch(表達(dá)式){ caseC1: caseC2: caseC3: 語句組1;break;
caseC4: 語句組2;break; ……. caseCn: 語句組n;break;[default: 語句組m;]}78例3-16判斷用戶輸入字符是數(shù)字還是空格或其他符號。#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);}}運行結(jié)果: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
例:當(dāng)a的值是1、2、3時,將b的值加2,當(dāng)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的程序自學(xué)(條理不夠清楚)。(補充)程序應(yīng)該這樣來設(shè)計:如果X能被Y整除,則余數(shù)為0,即如果X%Y的值等于0,則表示X能被Y整除!首先將是否閏年的標(biāo)志leap預(yù)置為0(非閏年),這樣僅當(dāng)year為閏年時,將leap置為1即可。這種處理兩種狀態(tài)值的方法,對優(yōu)化算法和提高程序可讀性非常有效,請讀者仔細(xì)體會。3.4選擇結(jié)構(gòu)程序設(shè)計舉例(P79)81#include<stdio.h>voidmain(){intyear,leap=0; //leap=0:預(yù)置為非閏年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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025辦公室租賃合同范本參考
- 2025芻議情勢變更在商品房預(yù)售合同的適用
- 2025年機(jī)械設(shè)備租賃合同
- 跨境貿(mào)易的挑戰(zhàn)與機(jī)遇-基于對公業(yè)務(wù)的國際市場調(diào)研
- 課題申報參考:馬克思時間概念的經(jīng)濟(jì)學(xué)闡釋研究
- 課題申報參考:禮樂文化與周代銘文書寫研究
- 2024年鐵爐鼓風(fēng)機(jī)項目資金需求報告代可行性研究報告
- 科技農(nóng)業(yè)助力糧食安全與環(huán)保
- 遼寧省撫順市新?lián)釁^(qū) 2024-2025學(xué)年七年級上學(xué)期11月期末道德與法治試題
- 獸藥零售的寵物主人健康教育與引導(dǎo)策略實施與效果評估考核試卷
- 蛋糕店服務(wù)員勞動合同
- 土地買賣合同參考模板
- 2025高考數(shù)學(xué)二輪復(fù)習(xí)-專題一-微專題10-同構(gòu)函數(shù)問題-專項訓(xùn)練【含答案】
- 新能源行業(yè)市場分析報告
- 2025年天津市政建設(shè)集團(tuán)招聘筆試參考題庫含答案解析
- 巖土工程勘察.課件
- 60歲以上務(wù)工免責(zé)協(xié)議書
- 2022年7月2日江蘇事業(yè)單位統(tǒng)考《綜合知識和能力素質(zhì)》(管理崗)
- 沈陽理工大學(xué)《數(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 高職《勞動教育》指導(dǎo)綱要
- XX公司年會活動報價單
評論
0/150
提交評論