版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章控制結(jié)構(gòu)第三章控制結(jié)構(gòu)內(nèi)容提要三種基本結(jié)構(gòu)介紹順序語句選擇語句循環(huán)語句程序的靈魂——算法算法:為解決一個(gè)問題而采取的方法和步驟,就稱為算法。NikiklausWirth提出:程序=算法+數(shù)據(jù)結(jié)構(gòu)。計(jì)算機(jī)算法分類數(shù)值算法求方程的根求函數(shù)的定積分非數(shù)值算法圖書檢索人事管理算法的特性:有窮性、確定性、有效性等常用的算法描述方法:1.帶序號(hào)的自然語言描述(易懂卻不直觀)2.流程圖:靈活、自由、形象、直觀,可表示任何算法輸入輸出處理
判斷起止連接點(diǎn)流程線4.偽代碼:用介于自然語言與計(jì)算機(jī)語言之間的文字及符號(hào)來描述算法(方便、易懂、便于向計(jì)算機(jī)語言過渡)3.N-S圖(盒圖):特點(diǎn):完全去掉了帶箭頭的流程線,算法的所有處理步驟都寫在一個(gè)大矩形框(表示簡(jiǎn)單、符合結(jié)構(gòu)化思想)A當(dāng)P為真
A
A
直到P為真處理判斷循環(huán)PTFBA【例1-3】輸入三個(gè)數(shù),然后輸出其中最大的數(shù)。算法可以表示如下:1)輸入A、B、C。(A、B、C中為輸入的數(shù))2)A與B中大的一個(gè)放入MAX中。(MAX中裝最大數(shù))3)把C與MAX中大的一個(gè)放入MAX中。4)輸出MAX,MAX即為最大數(shù)。 其中的2)、3)兩步仍不明確,無法直接轉(zhuǎn)化為程序語句,可以繼續(xù)細(xì)化:2)可細(xì)化為:把A與B中大的一個(gè)放入MAX中,若A>B,則MAX←A;否則MAX←B。3)可細(xì)化為:把C與MAX中大的一個(gè)放入MAX中,若C>MAX,則MAX←C。于是算法最后可以寫成:1)輸入A,B,C。2)若A>B,則MAX←A;否則MAX←B。3)若C>MAX,則MAX←C。4)輸出MAX,MAX即為最大數(shù)。這樣的算法已經(jīng)可以很方便地轉(zhuǎn)化為相應(yīng)的程序語句了?!纠?-4】計(jì)算1到100的累加和,寫出其算法自然語言描述1.定義兩個(gè)變量S和n2.0S單元3.1n單元4.S+nS5.n+1n6.判斷n≤100?是轉(zhuǎn)4否則轉(zhuǎn)77.輸出S的值【例1-4】計(jì)算1到100的累加和,寫出其算法流程圖描述FT開始0S1nS+nSn+1nn<=100?輸出S結(jié)束【例1-4】計(jì)算1到100的累加和,寫出其算法
N-S圖描述
偽代碼描述
0S1nn≤100?S+nSn+1n輸出S的值0S1nIfn≤100S+nSn+1nprintS結(jié)構(gòu)化程序設(shè)計(jì)方法結(jié)構(gòu)化程序的三種基本結(jié)構(gòu)1966年提出三種基本結(jié)構(gòu),用這三種基本結(jié)構(gòu)作為表示一種良好算法的基本單元:順序、選擇、循環(huán) 任何復(fù)雜的算法都是由這三種基本的結(jié)構(gòu)按一定的規(guī)律組成。①順序結(jié)構(gòu)AB操作步驟按書寫的順序執(zhí)行②選擇結(jié)構(gòu)A=3;B=4;C=A+B;TABPFIf(x!=0)y=sin(x)/x;elsey=1;
當(dāng)P為真
A
A
直到P為真③循環(huán)結(jié)構(gòu)先判斷,后執(zhí)行先執(zhí)行,后判斷S=0;n=1;While(n<=100){S=S+n;n++;}S=0;n=1;do{S=S+n;n++;}while(n<=100);三種基本結(jié)構(gòu)的共同特點(diǎn)1.單入口單出口2.結(jié)構(gòu)內(nèi)的每一部分都有機(jī)會(huì)被執(zhí)行3.不存在“死循環(huán)”結(jié)構(gòu)化程序設(shè)計(jì)過程1.確定算法:分析問題,(建立數(shù)學(xué)模型,選擇公式),寫出算法描述2.編寫程序:用計(jì)算機(jī)語言寫出實(shí)現(xiàn)算法的程序3.上機(jī)調(diào)試:輸入程序→編譯、鏈接、執(zhí)行程序→輸出結(jié)果
3.1
概述
1、結(jié)構(gòu)化程序設(shè)計(jì)思想:2、C語句分類:
C語言通過語句來實(shí)現(xiàn)三種結(jié)構(gòu),這些語句可以歸納為五類,分別是表達(dá)式語句、函數(shù)調(diào)用語句、空語句、復(fù)合語句和程序流程控制語句。1)表達(dá)式語句:表達(dá)式+“;”例:“count=0;”2)函數(shù)調(diào)用語句:例:“printf(“hello!”);”3)空語句:例如:while(getchar()!=’\n’){ ;}4)復(fù)合語句:例:{
語句1 …
語句n}5)程序流程控制語句 為了實(shí)現(xiàn)三種基本結(jié)構(gòu)中的選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)及有關(guān)的輔助功能,C語言提供了四種流程控制語句。(1)選擇控制語句:if、switch(2)循環(huán)控制語句:for、while、do-while(3)轉(zhuǎn)移控制語句:break、continue、goto(4)函數(shù)返回語句:return
C語言中的程序都不會(huì)是簡(jiǎn)單的順序結(jié)構(gòu),而是順序、選擇、循環(huán)三種結(jié)構(gòu)的復(fù)雜組合。在C語言中,有一組相關(guān)的控制語句,用以實(shí)現(xiàn)選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu):選擇控制語句:if;switch、case
循環(huán)控制語句:for、while、dowhile
轉(zhuǎn)移控制語句:break、continue、goto3.2
順序結(jié)構(gòu)程序設(shè)計(jì)
3.2.1
賦值語句賦值表達(dá)式加上一個(gè)分號(hào)就構(gòu)成了賦值語句。語句格式:變量=表達(dá)式;賦值語句的功能和特點(diǎn)都與賦值表達(dá)式相同,它是程序中使用最多的語句之一。例:A=3;B=4;
關(guān)于賦值語句的幾點(diǎn)說明由于在賦值符“=”右邊的表達(dá)式也可以又是一個(gè)賦值表達(dá)式,因此,下述形式:“變量=(變量=表達(dá)式);”是成立的,從而形成嵌套的情形。注意在變量說明中給變量賦初值和賦值語句的區(qū)別。給變量賦初值是變量說明的一部分,賦初值后的變量與其后的其它同類變量之間仍必須用逗號(hào)間隔,而賦值語句則必須用分號(hào)結(jié)尾。
注意賦值表達(dá)式和賦值語句的區(qū)別。 賦值表達(dá)式是一種表達(dá)式,它可以出現(xiàn)在任何允許表達(dá)式出現(xiàn)的地方,而賦值語句則不能。如:if((x=y+5)>0){z=x;}合法if((x=y+5;)>0){z=x;}非法4.如果賦值運(yùn)算符“=”兩邊的數(shù)據(jù)類型不相同,在賦值的時(shí)候要進(jìn)行類型轉(zhuǎn)換。關(guān)于輸入輸出
C語言本身不提供輸入輸出語句,輸入和輸出操作是由函數(shù)來實(shí)現(xiàn)的。在c標(biāo)準(zhǔn)函數(shù)庫中提供了一些輸入輸出函數(shù),例如,printf函數(shù)和scanf函數(shù)。在使用它們時(shí),千萬不要誤認(rèn)為它們是C語言提供的“輸入輸出語句”。
C語言函數(shù)庫中有一批“標(biāo)準(zhǔn)輸入輸出函數(shù)”,其中有:
putchar(輸出字符)getchar(輸入字符)printf(格式輸出)scanf(格式輸入)puts(輸出字符串)gets(輸入字符串)。
若要使用C語言中的函數(shù)庫,必須在程序的開頭位置用預(yù)編譯命令“#include”將有關(guān)的“頭文件”(函數(shù)庫文件)包括到用戶源文件中。在頭文件中包含了與用到的函數(shù)有關(guān)的信息。例如使用標(biāo)準(zhǔn)輸入輸出庫函數(shù)時(shí),要用到“stdio.h”文件。因此,在調(diào)用標(biāo)準(zhǔn)輸入輸出庫函數(shù)時(shí),程序的開頭應(yīng)有以下預(yù)編譯命令:
#include<stdio.h>3.2.2字符輸入輸出函數(shù)1、putchar()函數(shù)
putchar函數(shù)的作用是向終端輸出一個(gè)字符:例如putchar(c);它輸出字符變量c的值。c可以是字符型變量或整型變量。例3-1:#include<stdio.h>intmain(){putchar(’\101’);putchar(’*’);putchat(’A’);putchar(’*’);putchar(65);return0;}運(yùn)行結(jié)果如下:A*A*A2、getchar()函數(shù)
此函數(shù)的作用是從終端(或系統(tǒng)隱含指定的輸入設(shè)備)輸入一個(gè)字符。getchar函數(shù)沒有參數(shù),其一般形式為:getchar()。函數(shù)的值就是從輸入設(shè)備得到的字符。例3-2:#include<stdio.h>voidmain(){
charc;
c=getchar();
putchar(c);}1、格式輸入輸出函數(shù)printf() 它的作用是向終端輸出若干個(gè)任意類型的數(shù)據(jù)。printf函數(shù)的一般格式為printf(格式控制,輸出表列);如:printf("%d,%c\n",i,c);
3.2.3格式輸入輸出函數(shù)括弧內(nèi)包括兩部分:
(1)“格式控制”是用雙引號(hào)括起來的字符串,也稱“轉(zhuǎn)換控制字符串”,它包括兩種信息:
①格式說明,由“%”和格式字符組成,如%d,%f等。它的作用是將輸出的數(shù)據(jù)轉(zhuǎn)換為指定的格式輸出。格式說明總是由“%”字符開始的。②普通字符,即需要原樣輸出的字符。例如上面printf函數(shù)中雙引號(hào)內(nèi)的逗號(hào)、空格和換行符。
(2)“輸出列表”是需要輸出的一些數(shù)據(jù),可以是表達(dá)式。輸出格式說明對(duì)不同類型的數(shù)據(jù)用不同的格式字符。常用的有以下幾種格式字符:
(1)d格式符。用來輸出十進(jìn)制整數(shù)。有以下幾種用法:①%d,按整型數(shù)據(jù)的實(shí)際長度輸出。②%md,m為指定的輸出字段的寬度。③%ld,輸出長整型數(shù)據(jù)。
(2)O格式符,以八進(jìn)制數(shù)形式輸出整數(shù)。由于是將內(nèi)存單元中的各位的值(0或1)按八進(jìn)制形式輸出,因此輸出的數(shù)值不帶符號(hào),即將符號(hào)位也一起作為八進(jìn)制數(shù)的一部分輸出。(3)x格式符,以十六進(jìn)制數(shù)形式輸出整數(shù)。同樣不會(huì)出現(xiàn)負(fù)的十六進(jìn)制數(shù)。(4)u格式符,用來輸出unsigned型數(shù)據(jù),即無符號(hào)數(shù),以十進(jìn)制形式輸出。(5)c格式符,用來輸出一個(gè)字符。
一個(gè)整數(shù),只要它的值在0—255范圍內(nèi),也可以用字符形式輸出,在輸出前,系統(tǒng)會(huì)將該整數(shù)作為ASCII碼轉(zhuǎn)換成相應(yīng)的字符;反之,一個(gè)字符數(shù)據(jù)也可以用整數(shù)形式輸出。例3-3:使用基本格式說明%d、%o、%x輸出整型數(shù)據(jù)。#include<stdio.h>intmain(){inta=15;printf(”%d,%o,%x\n”,a,a,a);printf(”%5d”,a);return0;}運(yùn)行結(jié)果如下:15,17,f15例3-4輸出實(shí)型數(shù)據(jù),注意數(shù)據(jù)的有效位數(shù)。#include<stdio.h>intmain(){floatx,y,z;x=12345.111111;y=22222.222222;
z=x+y;
printf(”%f”,z);return0;}運(yùn)行結(jié)果如下:34567.335938例3-5:使用%c格式說明輸出數(shù)據(jù)。程序:#include<stdio.h>intmain(){inta=65,b=97;printf(”%d%d\n”,a,b);printf(”%d,%d\n”,a,b);printf(”%c,%c\n”,a,b);printf(”a=%d,b=%d\n”,a,b);return0;}運(yùn)行結(jié)果如下:659765,97A,aa=65,b=97(6)s格式符,用來輸出一個(gè)字符串。有幾種用法:①%s,輸出字符串。②%ms,輸出的字符串占m列,如字符串本身長度大于m,則突破m的限制,將字符串全部輸出。若串長小于m,則左補(bǔ)空格。③%-ms,如果串長小于m,則在m列范圍內(nèi),字符串向左靠,右補(bǔ)空格。④%m.ns,輸出占m列,但從字符串左端取n個(gè)字符。這n個(gè)字符輸出在m列的右側(cè),左補(bǔ)空格。⑤%-m.ns,其中m、n含義同上,n個(gè)字符輸出在m列范圍的左側(cè),右補(bǔ)空格。
注意:如果n>m,則m自動(dòng)取n值,即保證n個(gè)字符正常輸出。例3-6使用%s格式說明輸出數(shù)據(jù)。include<stdio.h>intmain(){printf(”%s”,”WelcometoChina!”);return0;}運(yùn)行結(jié)果如下:WelcometoChina!
(7)f格式符,用來輸出實(shí)數(shù)(包括單、雙精度),以小數(shù)形式輸出。有以下幾種用法:①%f,不指定字段寬度,由系統(tǒng)自動(dòng)指定,使整數(shù)部分全部如數(shù)輸出,并輸出6位小數(shù)。②%m.nf指定輸出的數(shù)據(jù)共占m列,其中有n位小數(shù)。如果數(shù)值長度小于m,則左端補(bǔ)空格。③%-m.nf與%m.nf基本相同,只是使輸出的數(shù)值向左端靠,右端補(bǔ)空格。例3-7:#include<stdio.h>voidmain(){
floatf=123.456;
printf(“%f%10f%10.2f%.2f%-10.2f\n”,
f,f,f,f,f);}(8)e格式符,以指數(shù)形式輸出實(shí)數(shù)。(9)g格式符,用來輸出實(shí)數(shù),它根據(jù)數(shù)值的大小,自動(dòng)選f格式或e格式(選擇輸出時(shí)占寬度較小的一種),且不輸出無意義的零。例如,若f=123.468,則printf(“%f%e%g”,f,f,f);輸出如下:
123.4680011.234680e+002123.468在使用printf函數(shù)時(shí),還有幾點(diǎn)要說明:(1)除了x,e,g外,其他格式字符必須用小寫字母,如%d不能寫成%D。(2)可以在printf函數(shù)中的“格式控制”字符串內(nèi)包含“轉(zhuǎn)義字符”,如“\n”、“\t”、“\b”、“\r”、“\f”、“\377”等。(3)上面介紹的d、o、x、u、c、s、f、e、g等字符,如用在“%”后面就作為格式符號(hào)。(4)如果想輸出字符“%”,則應(yīng)該在“格式控制”字符串中用連續(xù)兩個(gè)%表示,如:
printf(“%f%%”,1.0/3);2、scanf函數(shù)(格式輸入函數(shù))
它的作用是通過輸入終端按格式接受輸入的數(shù)據(jù)信息。scanf的一般形式為scanf(格式控制,地址表列);如:scanf(“%d%d%d”,&a,&b,&c);“格式控制”的含義同printf函數(shù);“地址表列”是由若干個(gè)地址組成的表列,可以是變量的地址,或字符串的首地址。地址可通過“&”(取地址運(yùn)算符)獲得。例如,&a指a在內(nèi)存中的地址。輸入格式說明(1)對(duì)unsigned型變量所需的數(shù)據(jù),可以用%u,%d或%o,%x格式輸入。(2)可以指定輸入數(shù)據(jù)所占列數(shù),系統(tǒng)自動(dòng)按它截取所需數(shù)據(jù)。如,scanf("%3d%3d",&a,&b);輸入:123456
系統(tǒng)自動(dòng)將123賦給a,456賦給b。(3)如果在%后有一個(gè)“*”附加說明符,表示跳過它指定的列數(shù)。例如,scanf("%2d%*3d%2d",&a,&b);如果輸入如下信息:
1234567
將12賦給a,%*3d表示讀入3位整數(shù)但不賦給任何變量。然后再讀入2位整數(shù)67賦給b。(4)輸入數(shù)據(jù)時(shí)不能規(guī)定精度,例如,scanf(“%7.2f”,&a);是不合法的。使用scanf函數(shù)時(shí)應(yīng)注意的問題(1)scanf函數(shù)中的“格式控制”后面應(yīng)當(dāng)是變量地址,而不應(yīng)是變量名。(2)如果在“格式控制”字符串中除了格式說明以外還有其他字符,則在輸入數(shù)據(jù)時(shí)應(yīng)輸入與這些字符相同的字符。例3-8:scanf函數(shù)的使用。
#include<stdio.h>intmain(){inta,b,temp;printf(”Pleaseinputa,b:”\n);scanf(”%d%d”,&a,&b);temp=b;b=a;a=temp;printf(”a=%d,b=%d\n”,a,b);return0;} 運(yùn)行結(jié)果如下:Pleaseinputa,b:23↙a=3,b=2
(3)在用“%c”格式輸入字符時(shí),空格字符和“轉(zhuǎn)義字符”都作為有效字符輸入。(4)在輸入數(shù)據(jù)時(shí),遇以下情況時(shí)該數(shù)據(jù)認(rèn)為結(jié)束。①遇空格,或按“回車”或“跳格”(tab)鍵。②按指定的寬度結(jié)束,如“%3d”,只取3列。③遇非法輸入。3.2.4程序舉例例3-9
輸入圓的半徑,求圓的面積。
#definePI3.14#include<stdio.h>intmain(){floatr,area;printf(”Pleaseinputr(r>=0):”);scanf(”%f”,&r); area=PI*r*r;printf(”%7.2f\n”,area);return0;}運(yùn)行結(jié)果如下:Pleaseinputr(r>=0):5↙78.50
在C語言中,根據(jù)條件來確定程序的執(zhí)行流程,選擇某一個(gè)分支來執(zhí)行的語句被稱為選擇語句。其基本特點(diǎn)是:程序的流程由多路分支組成,在程序的一次執(zhí)行過程中,根據(jù)不同的情況,只有一條支路被選中執(zhí)行,而其他分支上的語句被直接跳過。
C語言提供兩種選擇語句,分別是if語句和switch語句,if語句用于兩者選一的情況,而switch用于多分支選一的情形。3.3
選擇結(jié)構(gòu)程序設(shè)計(jì)
3.3.1if語句
if語句的三種形式:第一種形式語句格式:if(表達(dá)式)
{
語句;
}
語句功能:如果表達(dá)式的值為真(T),則執(zhí)行其后面的語句,否則不執(zhí)行該語句。表達(dá)式TF語句
第二種形式
語句格式:
if(表達(dá)式)
{
語句1}else{
語句2}
語句功能:如果表達(dá)式的值為真(T),則執(zhí)行語句1,否則執(zhí)行語句2。無論如何,語句1與語句2每次只能有一個(gè)被執(zhí)行。表達(dá)式TF語句1語句2要注意的是:if或if...else,包括后面要講到的第三種形式,即if...elseif...都被看成是一條語句,即使其中的語句是包含多條語句的復(fù)合語句,仍然如此。例3-10
輸入三個(gè)整數(shù),找出并打印其中的最小數(shù)。源程序:#include<stdio.h>voidmain(){
int
a,b,c,min;
printf(“inputa,b,c:”);
scanf(“%d%d%d”,&a,&b,&c);
if(a<b){min=a;}else{
min=b;}if(c<min){
min=c;}
printf(“Theresultis%d\n”,min);}例3-11從鍵盤讀入兩個(gè)數(shù)x、y,將大數(shù)存入x,小數(shù)存入y。分析:x、y從鍵盤讀入,若x>=y,只需順序輸出,否則,應(yīng)將x,y中的數(shù)進(jìn)行交換,然后輸出。兩數(shù)交換必須使用一個(gè)中間變量t,定義三個(gè)浮點(diǎn)數(shù)x、y、t。算法:
1)讀入x、y;2)大數(shù)存入x,小數(shù)存入y;3)輸出x、y。第2)步細(xì)化:若x<y,則交換x與y;再細(xì)化,x與y交換;①t=x②x=y③y=t讀入x、yx>yYN
t=x;x=y;y=t;輸出x、y第三種形式前兩種形式的if語句一般用于有兩個(gè)分支的情形,當(dāng)有多個(gè)分支選擇時(shí),可采用這種形式。語句功能:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真(T)時(shí),則執(zhí)行其對(duì)應(yīng)的語句。然后跳到整個(gè)if語句之外繼續(xù)執(zhí)行程序,如果所有的表達(dá)式均為假(F),則執(zhí)行語句n+1,然后繼續(xù)執(zhí)行后續(xù)的程序。語句格式:
if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2elseif(表達(dá)式3)語句3……elseif(表達(dá)式n)語句nelse
語句n+1
表達(dá)式1YN
Y表達(dá)式2N語句1……
語句2
表達(dá)式n
YN
語句n語句n+1 例3-12輸入一個(gè)百分制成績(jī),要求輸出其對(duì)應(yīng)的成績(jī)等級(jí)。其中90~100分的成績(jī)等級(jí)為’A’,80~89分為’B’,70~79分為’C’,60~69分為’D’,0~59分’E’。#include<stdio.h>intmain(){floatscore;chargrade;printf(”pleaseinputthescore:\n”);scanf(”%f”,&score);if(score>=90&&score<=100)grade=’A’;elseif(score>=80&&score<=89)grade=’B’;elseif(score>=70&&score<=79)grade=’C’;elseif(score>=60&&score<=69)grade=’D’;
elseif(score>=0&&score<=59)grade=’E’;elseprintf(”youhaveenteredthewronggrade!”);printf(”score=%.1f,grade=%c”,score,grade);return0;}運(yùn)行結(jié)果如下:pleaseinputthescore:86↙score=86.0,grade=B
第四種形式
if語句的嵌套if語句的嵌套形式在if語句中又包含了一個(gè)或者多個(gè)if語句,這種情形叫做if語句的嵌套。其一般形式如下:if(表達(dá)式1)
if(表達(dá)式2)語句1else
語句2elseif(表達(dá)式3)語句3else
語句4
if語句和else的配對(duì)嵌套在if語句當(dāng)中的語句有可能又是if-else型的,這個(gè)時(shí)候就會(huì)出現(xiàn)多個(gè)if和多個(gè)else重復(fù)出現(xiàn)的情況,所以應(yīng)當(dāng)特別注意if和else的配對(duì)關(guān)系。為了避免這種二義性C語言規(guī)定,else總是與它前面最近的if配對(duì)。
例如:
if(表達(dá)式1)
if(表達(dá)式2)語句1else語句2if(表達(dá)式3)語句2else語句3例3-13計(jì)算函數(shù)對(duì)多重if,最容易犯的錯(cuò)誤是if與else配對(duì)錯(cuò)誤,例如,寫成如下形式:y=0;if(x>=0)if(x>0)y=1;elsey=-1;
y=0;if(x>=0)
{if(x>0)
y=1;}elsey=-1;
3.2.2switch語句
if語句只能處理從兩者間選擇之一的情況,當(dāng)要實(shí)現(xiàn)幾種可能之一時(shí),就要用if-elseif甚至多重的嵌套if來實(shí)現(xiàn),當(dāng)分支較多時(shí),程序變得復(fù)雜冗長,可讀性降低。C語言提供了switch開關(guān)語句專門處理多路分支的情形,使程序變得簡(jiǎn)潔。語句功能:計(jì)算表達(dá)式的值,并逐個(gè)與其后面的常量表達(dá)式比較,當(dāng)表達(dá)式的值與某一個(gè)case中的常量表達(dá)式的值相等時(shí),就執(zhí)行此case后面的語句,若表達(dá)式的值與所有常量表達(dá)式的值都不相同時(shí),則執(zhí)行default后面的語句。switch語句格式:switch(表達(dá)式){case常量表達(dá)式1:語句1
case常量表達(dá)式2:語句2
……case常量表達(dá)式n:語句n
default:語句n+1;}break;break;break;,
特殊情況下,如果switch表達(dá)式的多個(gè)值都需要執(zhí)行相同的語句,可以采用下面的格式:
switch(i)
{case1:case2:case3:語句1break;case4:case5:語句2break;default:語句3}
當(dāng)整型變量i的值為1、2或3時(shí),執(zhí)行語句1;當(dāng)i的值為4或5時(shí),執(zhí)行語句2;否則,執(zhí)行語句3。幾點(diǎn)說明:(1)其中常量表達(dá)式的值必須是整型、字符型或者枚舉類型。并且各常量表達(dá)式的值不能相同,否則會(huì)出現(xiàn)錯(cuò)誤。(2)各語句里面允許有多條語句,可以不用{}括起來,若語句序列i為空,則對(duì)應(yīng)的break語句可去掉。(3)各case和default子句的出現(xiàn)順序不影響執(zhí)行結(jié)果,可以先出現(xiàn)default子句,再出現(xiàn)case子句。(4)執(zhí)行完一個(gè)case后面的語句后,流程轉(zhuǎn)入下一個(gè)case繼續(xù)執(zhí)行,case子句只是起到語句標(biāo)號(hào)的作用,并不是在該處進(jìn)行判斷的條件。所以若想跳出switch語句,則可以用一個(gè)break語句來實(shí)現(xiàn)。例3-14輸入月份,打印在2005年該月有幾天。程序如下:#include<stdio.h>voidmain(){
intmonth;
intday;
printf(“pleaseinputthemonthnumber:”);
scanf(“%d”,&month);switch(month){case1:case3:case5:case7:3.3.3程序舉例
case8:case10:case12:day=31;break;case4:case6:case9:case11:day=30;break;case2:day=28;break;default:day=-1;}
if(day==-1){
printf(“Invalidmonthinput!\n”);}else{printf(“2005.%dhas%ddays\n”, month,day);}}3.4
循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)語句是程序流程控制語句中的另一個(gè)基本語句。在實(shí)際問題中,常常需要進(jìn)行大量的重復(fù)處理。循環(huán)語句可以使我們只寫很少的語句,而讓計(jì)算機(jī)反復(fù)執(zhí)行,從而完成大量雷同的計(jì)算。
C語言中主要有三種循環(huán)語句:while語句、do…while語句和for語句,利用這些語句可以實(shí)現(xiàn)不同形式的循環(huán)結(jié)構(gòu)。
3.4.1while語句
while語句是用來實(shí)現(xiàn)“當(dāng)型”循環(huán)的控制語句。while語句格式:while(表達(dá)式){
語句}
語句功能:當(dāng)表達(dá)式的值為真(T)時(shí),執(zhí)行循環(huán)體語句。當(dāng)表達(dá)式的值為假(F)時(shí),退出循環(huán),執(zhí)行while語句后面的語句。
while語句的特點(diǎn)是先判斷,后執(zhí)行,若條件不成立,有可能一次也不執(zhí)行。
表達(dá)式為真
語句例3-15:用while語句,求1到50的和。分析:令和s的初值為0,變量i為記數(shù)器,i從1變到50,每一步令s=s+i,則最終s的值就是所求。程序如下:#include<stdio.h>voidmain(){inti=1,s=0;while(i<=50){s=s+i;i++;}printf(“s=%d”,s);}例3-16
求n!分析:n!=n*(n-1)*(n-2)*...2*1,0!=1。即S0=1,Sn=Sn-1*n??梢詮腟0開始,依次求出S1、S2、...Sn。#include<stdio.h>voidmain(){intn,i;longints;printf(“pleaseinputn(n>=0):”);scanf(“%d”,&n);if(n>=0){s=1;}
if(n>0){i=1;while(i<=n){s*=i;i=i+1;}}
printf(“%d!=%ld\n”,n,s);}else
printf(“Invalidinput!\n”);}
3.4.2do...while語句在C語句中,do…while語句是用來實(shí)現(xiàn)“直到型”循環(huán)的控制語句。
do…while語句格式:
do{
語句;
}while(表達(dá)式);語句功能:先執(zhí)行一次指定的循環(huán)體語句,再判別表達(dá)式,當(dāng)表達(dá)式的值為真(T)時(shí),則繼續(xù)執(zhí)行循環(huán)體語句,直到表達(dá)式的值為假(F)時(shí),才終止循環(huán),執(zhí)行while語句后面的語句。
語句表達(dá)式為真
do…while語句的基本特點(diǎn)是:先執(zhí)行后判斷,因此,循環(huán)體至少被執(zhí)行一次。但需要注意的是,do…while與標(biāo)準(zhǔn)的直到型循環(huán)有一個(gè)極為重要的區(qū)別,直到型循環(huán)是當(dāng)條件為真時(shí)結(jié)束循環(huán),而do…while語句恰恰相反,當(dāng)條件為真時(shí)循環(huán),一旦條件為假,立即結(jié)束循環(huán)。例3-17
用do-while語句計(jì)算1到100的和。程序如下:
#include<stdio.h>intmain(){
inti=1,s=0;
do
{
s=s+i;
i++;
}while(i<=100);
/*注意while后面一定要有分號(hào)*/
printf(”s=%d”,s);
return0;}運(yùn)行結(jié)果如下:s=5050C語言中,for語句的功能更強(qiáng),使用更廣泛,它不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)條件的情況。
for語句格式:
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
{
語句;}
語句功能:首先計(jì)算表達(dá)式1的值。再計(jì)算表達(dá)式2的值,若值為真(T),則執(zhí)行循環(huán)體一次,若為假,則跳出循環(huán)。然后計(jì)算表達(dá)式3的值。轉(zhuǎn)回第2步繼續(xù)執(zhí)行程序。循環(huán)結(jié)束,執(zhí)行for下面的程序。
3.4.3for語句
for語句最簡(jiǎn)單的應(yīng)用形式也就是最容易理解的形式如下:
for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語句;
例如:
for(i=1;i<=100;i++)
{s=s+i;}例3-18計(jì)算自然數(shù)1到n的平方和。#include<stdio.h>#include<math.h>voidmain(){inti;
floats;printf(“pleaseinputn:”);scanf(“%d”,&n);s=0.0;
for(i=1;i<=n;i++){s=s+(float)(i)*(float)(i);}printf(“1*1+2*2+...+%d*%d=%f\n”,n,n,s);}運(yùn)行結(jié)果如下:pleaseinputn:61*1+2*2+...+5*5+6*6=91.000000for語句的幾點(diǎn)說明:(1)for語句中的各表達(dá)式都可以省略,但分號(hào)間隔符不能少。(2)表達(dá)式1省略時(shí),應(yīng)在for語句之前給變量賦初值。(3)表達(dá)式2或者表達(dá)式3省略時(shí),將造成無限循環(huán),這個(gè)時(shí)候應(yīng)該在循環(huán)體內(nèi)部設(shè)法結(jié)束循環(huán)。例3-19:#include<stdio.h>voidmain(){
inta=0,n;
printf(“\ninputn:”);
scanf(“%d”,&n);
for(;n>0;){a++;n--;
printf(“%d”,a*2);}}
3個(gè)表達(dá)式語句都可以省略,如:
for(;;)語句;
這種情況下,for語句等效于
while(1)語句;
即不設(shè)初值,不判斷條件(認(rèn)為表達(dá)式2為真),循環(huán)變量不增值。無終止地執(zhí)行循環(huán)體。所以一般將條件表達(dá)式加break語句放在循環(huán)體內(nèi)適當(dāng)位置,一旦條件滿足時(shí),用break語句跳出for循環(huán)。
在for語句中,表達(dá)式1、表達(dá)式3都可以有一項(xiàng)或多項(xiàng),例如:
for(i=1,j=n;i<j;i++,j--)
語句;
表達(dá)式1同時(shí)為i和j賦初值,表達(dá)式3同時(shí)改變i和j的值。當(dāng)有不止一項(xiàng)時(shí),各項(xiàng)之間用逗號(hào)“,”分隔。
(1)三種語句的選用同一個(gè)問題,往往既可以用while語句解決,也可以用do…while或者for語句來解決,但在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體情況來選用不同的循環(huán)語句,選用的一般原則是:①如果循環(huán)次數(shù)在執(zhí)行循環(huán)體之前就已確定,一般用for語句;如果循環(huán)次數(shù)是由循環(huán)體的執(zhí)行情況確定的,一般用while語句或者do…while語句。②當(dāng)循環(huán)體至少執(zhí)行一次時(shí),用do…while語句,反之,如果循環(huán)體可能一次也不執(zhí)行,選用while語句。
關(guān)于循環(huán)語句的幾點(diǎn)說明:一個(gè)循環(huán)的循環(huán)體內(nèi)又有另一個(gè)循環(huán),叫做循環(huán)的嵌套。這種嵌套過程可以有很多重。嵌套的循環(huán)中還可以嵌套循環(huán),叫做多層循環(huán)。三種循環(huán)語句for、while、do…while可以互相嵌套自由組合。下面幾種嵌套形式都是合法的嵌套形式:①for(;;)②do{…{…while()for(;;){…}{…}……}}while();3.4.4循環(huán)的嵌套do(;;){
...for(;;){…}…}
while(;;){
...do{…}while…}
for(;;){
...while(;;){…}…}
for(;;){
...for(;;){…}…}
例3-20打印4行5列的星形矩陣。程序如下:#include<stdio.h>voidmain(){
inti,j;
for(i=0;i<4;i++){for(j=0;j<5;j++){printf(“*”);}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《證劵基礎(chǔ)知識(shí)最終》課件
- 《激光切割工藝》課件
- 荒山綠化項(xiàng)目可行性研究報(bào)告
- 《人力資源管理奧秘》課件
- 股份解禁協(xié)議三篇
- 專業(yè)畢業(yè)實(shí)習(xí)報(bào)告4篇
- 2023年-2024年企業(yè)主要負(fù)責(zé)人安全教育培訓(xùn)試題及答案(易錯(cuò)題)
- 2024員工三級(jí)安全培訓(xùn)考試題帶解析答案可打印
- 2023年-2024年項(xiàng)目部安全管理人員安全培訓(xùn)考試題附答案【培優(yōu)A卷】
- 2023年-2024年企業(yè)主要負(fù)責(zé)人安全培訓(xùn)考試題(預(yù)熱題)
- 幼兒教育-個(gè)別幼兒教育記錄表.文檔
- (高清版)DZT 0338.4-2020 固體礦產(chǎn)資源量估算規(guī)程 第4部分 SD法
- 婦產(chǎn)科學(xué) (安康職業(yè)技術(shù)學(xué)院)智慧樹知到期末考試答案2024年
- 供電所營銷安全管理措施
- 水閘閘門運(yùn)行方案
- 消費(fèi)型股東招募計(jì)劃書
- 2022-2023學(xué)年江蘇省連云港市九年級(jí)(上)期末數(shù)學(xué)試卷(含詳細(xì)答案解析)
- 會(huì)計(jì)事務(wù)所述職報(bào)告
- 2022年江蘇普通高中學(xué)業(yè)水平選擇性考試政治真題及答案
- 玻璃工業(yè)的節(jié)能減排與綠色制造
- 防止交叉感染的護(hù)理措施和策略
評(píng)論
0/150
提交評(píng)論