信息學奧林匹克競賽C語言課程膠片3-定向改編V1.0_第1頁
信息學奧林匹克競賽C語言課程膠片3-定向改編V1.0_第2頁
信息學奧林匹克競賽C語言課程膠片3-定向改編V1.0_第3頁
信息學奧林匹克競賽C語言課程膠片3-定向改編V1.0_第4頁
信息學奧林匹克競賽C語言課程膠片3-定向改編V1.0_第5頁
已閱讀5頁,還剩55頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

C語言Part3forNOI選擇結構循環結構關系運算符及其優先次序<(小于)<=(小于或等于)>(大于)>=(大于或等于)==(等于)!=(不等于)優先級相同(高)優先級相同(低)算術運算符(+-*/%)>關系運算符>賦值運算符(=及其擴展賦值運算符)

關系表達式用關系運算符將兩個表達式(可以是算術表達式或關系表達式,邏輯表達式,賦值表達式,字符表達式)接起來的式子,稱關系表達式例:a>b,a+b>b+c,(a=3)>(b=5),’a’<‘b’,(a>b)>(b<c)關系表達式的值是一個邏輯值,即“真”或“假”。例:關系表達式”a>b”的值為“真”,表達式的值為1。C89語言中沒有專用的邏輯值,1代表真,0代表假例:c>a+bc>(a+b)a>b==c(a>b)==ca==b<ca==(b<c)a=b>ca=(b>c)邏輯運算符和優先次序&&(邏輯與)相當于其他語言中的AND||(邏輯或)相當于其他語言中的OR!(邏輯非)相當于其他語言中的NOT例:a&&b若a,b為真,則a&&b為真。

a||b若a,b之一為真,則a||b為真。!a若a為真,則!a為假。優先次序:!(非)>&&(與)>||(非)邏輯運算符中的“&&”和“||”低于關系運算符,“!”高于算術運算符先,邏輯運算符非再,算術運算符再,關系運算符后,邏輯運算符與、或最后,賦值運算符邏輯表達式1用邏輯運算符將關系表達式或邏輯量連接起來的式子就邏輯表達式邏輯表達式的值應該是一個邏輯量“真”或“假”。例:設a=4,b=5:!a的值為0a&&b的值為1a||b的值為1!a||b的值為14&&0||2的值為1任何非零的數值被認作“真”邏輯表達式2例:5>3&&8<4-!0

自左向右運算

1&&0邏輯值為08<3邏輯值為04-1值為3!0邏輯值為15>3邏輯值為1表達式值為0先,邏輯運算符非再,算術運算符再,關系運算符后,邏輯運算符與、或(5>3)&&(8<(4-(!0)))

例:!a&&b||x>y&&c((!a)&&b)||((x>y)&&c)邏輯表達式3在邏輯表達式的求解中,并不是所有的邏輯運算符都要被執行。(1)a&&b&&c只有a為真時,才需要判斷b的值,只有a和b都為真時,才需要判斷c的值。(2)a||b||c只要a為真,就不必判斷b和c的值,只有a為假,才判斷b。a和b都為假才判斷c例:(m=a>b)&&(n=c>d)當a=1,b=2,c=3,d=4,m和n的原值為1時,由于“a>b”的值為0,因此m=0,而“n=c>d”不被執行,因此n的值不是0而仍保持原值1。邏輯表達式4

用邏輯表達式來表示閏年的條件能被4整除,但不能被100整除。能被4整除,又能被400整除?

(year%4==0&&year%100!=0)||year%400==0值為真(1)是閏年,否則為非閏年。非閏年:

(year%4!=0)||(year%100==0&&year%400!=0)if語句的三種基本形式1(1)if(表達式)語句

例5.1:charch;ch=getchar();if(ch>='a'&&ch<='z')ch=ch-'a'+'A';putchar(ch);表達式語句真(非0)假(0)charch;ch=getchar();if(ch>='a'&&ch<='z'){ch=ch-'a'+'A';putchar(ch);}if語句的三種基本形式2(2)if(表達式)語句1else語句2例:if(x>y)printf(“%d”,x);elseprintf(“%d”,y);

條件

語句1

語句2非00if語句的三種基本形式3(3)if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3

……elseif(表達式m)語句melse語句nif語句的三種基本形式4intnumber;floatcost,price,total;printf("Pleaseenternumberandprice:\n");scanf("%d,%1f",&number,&price);if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)cost=0.075;elseif(number>50)cost=0.05;elsecost=0;total=number*price*(1-cost);printf("Total=%10.2f\n",total);例5.2:為了促銷,對購買貨物多的顧客有優惠:凡是購買50件及以上的,優惠5%;凡是購買100件及以上的,優惠7.5%;凡是購買300件及以上的,優惠10%;凡是購買500件及以上的,優惠15%。要求編程序,用戶輸入購買數量和單價,程序輸入應付貨款。switch(表達式){ case常量表達式1:語句1 case常量表達式2:語句2 …… case常量表達式n:語句n default:語句n+1}Switch語句intnumber;chartype;floatcost,price,total;printf("Pleaseenternumber,type(A,B,C,D)andprice:\n");scanf("%d,%c,%1f",&number,&type,&price);switch(type){case'A':cost=0.15;break;case'B':cost=0.10;break;case'C':cost=0.075;break;case'D':cost=0.05;break;default:cost=0;}total=number*price*(1-cost);printf("Total=%10.2f\n",total);字符型或者數值型每個常量表達式值必須互不相同C99允許1023個caseCase前允許執行語句;如果沒有break,則按順序執行,因此多個case可以共用一條執行語句if語句的三種基本形式513種形式的if語句中在if后面都有表達式,一般為邏輯表達式或關系表達式。2第二,第三種形式的if語句中,在每個else前面有一個分號,整個語句結束處有一個分號。3在if和else后面可以只含有一個內嵌的操作語句,也可以有多個操作語句,此時用花括號將幾個語句括起來成為一個復合語句。if語句的三種基本形式5例5.3輸入兩個實數,按代數值由小到大的順序輸出這兩個數。floata,b,t;scanf("%f,%f",&a,&b);if(a>b){t=a;a=b;b=t;}printf("%5.2f,%5.2f\n",a,b);yna>b交換兩個數if語句的三種基本形式5例5.4輸入三個數,要求按由小到大的順序輸出。floatsort[3];inti;for(i=0;i<3;i++){if(i==2)scanf("%f",(sort+i));elsescanf("%f,",(sort+i));}floatswap;if(sort[0]>sort[1]){swap=sort[1];sort[1]=sort[0];sort[0]=swap;}if(sort[0]>sort[2]){swap=sort[2];sort[2]=sort[0];sort[0]=swap;}if(sort[1]>sort[2]){swap=sort[2];sort[2]=sort[1];sort[1]=swap;}for(i=0;i<3;i++){printf("sort[%d]=%f\n",i,sort[i]);}數1>數2交換數1和數2取兩個數if語句嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套。形式:If()

if()語句1 else語句2Else

if()語句3 else語句4內嵌ifElse總是與它上面的,最近的,同一復合語句中的,未配對的if語句配對當if和else數目不同時,可以加花括號來確定配對關系條件語句的嵌套層數:C99為63,C89為8if語句嵌套例5.5有一個函數,編一程序,輸入一個x值,輸出y值。算法1:算法1:

輸入x輸入x

若x<0,則y=-1若x<0,則y=-1

若x=0,則y=0否則: 若x>0,則y=1若x=0,則y=0

輸出y若x>0,則y=1

輸出y

if語句嵌套上例中的程序段有四個,請判斷哪個是正確的?程序1:程序2:

if(x<0)if(x>=0)Y=-1;if(x>0)y=1;elseelsey=0;if(x==0)y=0;elsey=-1;elsey=1;程序3:程序4:y=-1;y=0;if(x!=0)if(x>=0)If(x>0)y=1;if(x>0)y=1;elsey=0;elsey=-1;正確正確條件運算符格式表達式1?表達式2∶表達式3功能判斷表達式1的值,如果成立就執行表達式2,否則就執行表達式3使用場合若在if語句中,當被判別的表達式的值為“真”或“假”時,都執行一個賦值語句且向同一個變量賦值時,可以用一個條件運算符來處理。max=(a>b)?a∶b;條件運算符優先級高于賦值運算符,低于關系運算符和算術運算符。

條件運算符的結合方向為“自右至左”。

表達式2”和“表達式3”不僅可以是數值表達式,還可以是賦值表達式或函數表達式。條件表達式中,表達式1的類型可以與表達式2和表達式3的類型不同。

條件運算符例5.6輸入一個字符,判別它是否大寫字母,如果是,將它轉換成小寫字母;如果不是,不轉換。然后輸出最后得到的字符。

charch;scanf("%c",&ch);ch=(ch>='A'&&ch<='Z')?(ch+32):ch;printf("%c\n",ch);

如果字符變量ch的值為大寫字母,則條件表達式的值為(ch+32),即相應的小寫字母。如果ch的值不是大寫字母,則條件表達式的值為ch,即不進行轉換。

例5.7運輸公司對用戶計算運費路程(s)越遠,每公里運費越低。標準如下:s<250km沒有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣設每公里每噸貨物的基本運費為p,貨物重為w,距離為s,折扣為d,則總運費f的計算公式為:f=p*w*s*(1-d)

例5.7源代碼intc,s;floatp,w,d,f;printf("Pleaseinputbasicfee,weight,distance:\n");scanf("%f,%f,%d",&p,&w,&s);if(s>=3000)c=12;elsec=s/250;switch(c){case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;case4:case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}f=p*w*s*(1-d/100.0);printf("freight=%15.4f\n",f);選擇結構循環結構什么是循環為什么要使用循環?問題1:問題2:求學生平均成績

分數相加后除以課數

在許多問題中需要用到循環控制。循環結構是結構化程序設計的基本結構之一,它和順序結構、選擇結構共同作為各種復雜程序的基本構造單元。goto語句goto語句為無條件轉向語句,它的一般形式為

goto語句標號;語句標號用標識符表示,它的定名規則與變量名相同,即由字母、數字和下劃線組成,其第一個字符必須為字母或下劃線。

例如:gotolabel_1;合法;goto123;不合法.goto語句

結構化程序設計方法主張限制使用goto語句,因為濫用goto語句將使程序流程無規律、可讀性差.一般來說,可以有兩種用途:(1)與if語句一起構成循環結構;(2)從循環體中跳轉到循環體外。

但是這種用法不符合結構化原則,一般不宜采用,只有在不得已時(例如能大大提高效率)才使用.例6.1用if語句和goto語句構成循環,求1到100的和

inti=1,sum=0;

loop:

if(i<=100)

{

sum=sum+i;

i++;

gotoloop;

}

printf("sum:%d\n",sum);說明:這里用的是“當型”循環結構,當滿足“i<=100”時執行花括弧內的循環體。運行結果:5050goto語句while語句while語句用來實現“當型”循環結構。一般形式:

while(表達式)語句當表達式為非0值時,執行while語句中的內嵌語句。其特點是:先判斷表達式,后執行語句。例6.1-1求1到100的和

inti=1,sum=0;

while(i<=100)

{

sum=sum+i;

i++;

}

printf("sum:%d\n",sum);說明:(1)循環體如果包含一個以上的語句,應該用花括弧括起來,以復合語句形式出現.(2)在循環體中應有使循環趨向于結束的語句。

while語句do-while語句do-while語句的特點:先執行循環體,然后判斷循環條件是否成立一般形式:

do

循環體語句

while

(表達式);執行過程:先執行一次指定的循環體語句,然后判別表達式,當表達式的值為非零(“真”)時,返回重新執行循環體語句,如此反復,直到表達式的值等于0為止,此時循環結束。例6.1-2求和Do-while語句inti=1,sum=0;do{sum=sum+i;i++;}while(i<=100);printf("sum:%d\n",sum);在一般情況下,用while語句和用do-while語句處理同一問題時,若二者的循環體部分是一樣的,它們的結果也一樣。但是,如果while后面的表達式一開始就為假(0值)時,兩種循環的結果是不同的。do-while和while語句比較例6.1-3求和運行結果:1↙sum:5050再運行一次:101↙sum:101Do-while和while語句的比較inti,sum=0;scanf("%d",&i);do{sum=sum+i;i++;}while(i<=100);printf("sum:%d\n",sum);inti,sum=0;scanf("%d",&i);while(i<=100){sum=sum+i;i++;};printf("sum:%d\n",sum);運行結果:1↙sum:5050再運行一次:101↙sum:0C語言中的for語句使用最為靈活,不僅可以用于循環次數已經確定的情況,而且可以用于循環次數不確定而只給出循環結束條件的情況,它完全可以代替while語句。一般形式:

for(表達式1;表達式2;表達式3)語句for語句先求解表達式1。求解表達式2,若其值為真(值為非0),則執行for語句中指定的內嵌語句,然后執行面第(3)步。若為假(值為0),則結束循環,轉到第(5)步。求解表達式3。轉回上面第(2)步驟繼續執行。循環結束,執行for語句下面的一個語句for語句的執行過程for語句等價于下列語句:表達式1;while(表達式2){語句;表達式3;}

表達式2?執行語句成立不成立執行for循環之后的語句執行表達式3執行表達式1for語句的一般形式中的“表達式1”可以省略,此時應在for語句之前給循環變量賦初值。注意省略表達式1時,其后的分號不能省略。如

for(;i<=100;i++)sum=sum+i;

執行時,跳過“求解表達式1”這一步,其他不變。for語句如果表達式2省略,即不判斷循環條件,循環無終止地進行下去。也就是認為表達式2始終為真。例如:for(i=1;;i++)sum=sum+i;

表達式1是一個賦值表達式,表達式2空缺。它相當于:

i=1;while(1){sum=sum+1;i++;}for語句表達式3也可以省略,但此時程序設計者應另外設法保證循環能正常結束。如:

for(i=1;i<=100;){sum=sum+i;i++;}

在上面的for語句中只有表達式1和表達式2,而沒有表達式3。i++的操作不放在for語句的表達式3的位置處,而作為循環體的一部分,效果是一樣的,都能使循環正常結束。for語句可以省略表達式1和表達式3,只有表達式2,即只給循環條件。如:

for(;i<=100;)在這種情況下,完全等同于while語句。可見for語句比while語句功能強,除了可以給出循環條件外,還可以賦初值,使循環變量自動增值等。for語句3個表達式都可省略,如:

for(;;)語句相當于

while(1)語句即不設初值,不判斷條件(認為表達式2為真值),循環變量不增值。無終止地執行循環體。for語句表達式1可以是設置循環變量初值的賦值表達式,也可以是與循環變量無關的其他表達式。如:

for(sum=0;i<=100;i++)sum=sum+i;表達式3也可以是與循環控制無關的任意表達式。for語句表達式1和表達式3也可以是逗號表達式,即包含一個以上的簡單表達式,中間用逗號間隔。如:

for(sum=0,i=1;i<=100;i++)sum=sum+i;或for(i=0,j=100;i<=j;i++,j--)k=i+j;表達式1和表達式3都是逗號表達式,各包含兩個賦值表達式,即同時設兩個初值,使兩個變量增值在逗號表達式內按自左至右順序求解,整個逗號表達式的值為最右邊的表達式的值for語句表達式2一般是關系表達式(如i<=100)或邏輯表達式(如a<b&&x<y),但也可以是數值表達式或字符表達式,只要其值為非零,就執行循環體for語句for(i=0;(c=getchar())!=′\n′;i+=c);

在表達式2中先從終端接收一個字符賦給c,然后判斷此賦值表達式的值是否不等于′\n′(換行符),如果不等于′\n′,就執行循環體。循環體為空語句,把本來要在循環體內處理的內容放在表達式3中,作用是一樣的。可見for語句功能強,可以在表達式中完成本來應在循環體內完成的操作。for語句例6.2輸入單詞并打印for語句運行情況:Computer↙(輸入)Computer(輸出)而不是Ccoommppuutteerrfor(intc;(c=getchar())!='\n';)printf("%c",c);for語句中只有表達式2,而無表達式1和表達式3。其作用是每讀入一個字符后立即輸出該字符,直到輸入一個“換行”為止。請注意,從終端鍵盤向計算機輸入時,是在按Enter鍵以后才將一批數據一起送到內存緩沖區中去的。C語言中的for語句比其他語言(如BASIC,PASCAL)中的FOR語句功能強得多。可以把循環體和一些與循環控制無關的操作也作為表達式1或表達式3出現,這樣程序可以短小簡潔。但過分地利用這一特點會使for語句顯得雜亂,可讀性降低,最好不要把與循環控制無關的內容放到for語句中。for語句一個循環體內又包含另一個完整的循環結構稱為循環的嵌套。內嵌的循環中還可以嵌套循環,這就是多層循環。三種循環(while循環、do-while循環和for循環)可以互相嵌套。循環嵌套(1)

while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…}{…}}while();}}while();(4)

while()(5)for(;;)(6)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()四種循環都可以用來處理同一問題,一般情況下它們可以互相代替。但一般不提倡用goto型循環。在while循環和do-while循環中,只在while后面的括號內指定循環條件,因此為了使循環能正常結束,應在循環體中包含使循環趨于結束的語句(如i++,或i=i+1等)。for循環可以在表達式3中包含使循環趨于結束的操作,甚至可以將循環體中的操作全部放到表達式3中。因此for語句的功能更強,凡用while循環能完成的,用for循環都能實現。用while和do-while循環時,循環變量初始化的操作應在while和do-while語句之前完成。而for語句可以在表達式1中實現循環變量的初始化。while循環、do-while循環和for循環,可以用break語句跳出循環,用continue語句結束本次循環(break語句和continue語句見下節)。而對用goto語句和if語句構成的循環,不能用break語句和continue語句進行控制.幾種循環的比較break語句可以用來從循環體內跳出循環體,即提前結束循環,接著執行循環下面的語句一般形式:

break;注意:break語句不能用于循環語句和switch語句之外的任何其他語句中。

break語句例6.3:計算r=1到r=10時的圓面積,直到面積area大于100為止break語句當area>100時,執行break語句,提前結束循環,即不再繼續執行其余的幾次循環。floatpi=3.14159;for(intr=1;r<=10;r++){floatarea=pi*r*r;if(area>100)break;printf("r=%d,area=%3.5f\n",r,area);}作用為結束本次循環,即跳過循環體中下面尚未執行的語句,接著進行下一次是否執行循環的判定.一般形式:

continue;continue語句

例6.5把100~200之間的不能被3整除的數輸出。說明:當n能被3整除時,執行continue語句,結束本次循環(即跳過printf函數語句),只有n不能被3整除時才執行printf函數。continue語句

for(intn=100;n<=200;n++){if(n%3==0)continue;printf("%d",n);}continue語句只結束本次循環,而不是終止整個循環的執行。break語句則是結束整個循環過程,不再判斷執行循環的條件是否成立。break語句和continue語句的區別

例6.6

用π/4≈1-1/3

溫馨提示

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

評論

0/150

提交評論