版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二講結(jié)構(gòu)化程序設(shè)計(jì)開發(fā)方法順序程序設(shè)計(jì)分支結(jié)構(gòu)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)/循環(huán)控制課程目錄第二講結(jié)構(gòu)化程序設(shè)計(jì)開發(fā)方法本講目錄一、C程序結(jié)構(gòu)·每一個(gè)源文件由預(yù)編譯命令和若干函數(shù)組成(對(duì)每個(gè)文件分別編譯,然后連接)·一般地,一個(gè)C程序可由多個(gè)源文件組成·每一個(gè)函數(shù)由說明部分和語句部分組成4.1C程序結(jié)構(gòu)和語句課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄C程序源程序文件1源程序文件i源程序文件n預(yù)編譯命令函數(shù)1函數(shù)n說明部分執(zhí)行部分(語句)………一、C程序結(jié)構(gòu)課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄二、C程序語句表達(dá)式語句控制語句復(fù)合語句終止程序運(yùn)行語句課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄函數(shù)調(diào)用語句:
如:printf("…");賦值語句:
如:i=i+1;i++;x+y;空語句:
如:;任何事情都不做。用來做被轉(zhuǎn)向點(diǎn),或循環(huán)語句中的循環(huán)體。1.表達(dá)式語句課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄2.控制語句––改變語句的執(zhí)行順序①if()~else~②for()~③while()~④do~while()⑤continue⑥break⑦switch⑧goto⑨returnswitch(多分支選擇)(條件語句)(循環(huán)語句)(循環(huán)語句)(循環(huán)語句)(結(jié)束本次循環(huán)語句)(中止執(zhí)行switch或循環(huán)語句)(多分支選擇語句)(轉(zhuǎn)向語句)(從函數(shù)返回語句)()表示條件,~表示語句課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄用{}括起來的一系列語句。如:if(a>b){ z=x+y; t=z/100; printf("%f",t);}3.復(fù)合語句(語句體)
復(fù)合語句中最后一個(gè)語句的分號(hào)不能忽略不寫。 C語言允許一行寫幾個(gè)語句,也允許一個(gè)語句拆開寫在幾行上,書寫格式無固定要求。課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄4.終止程序運(yùn)行語句exit(整數(shù));課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄return整數(shù);
賦值語句是由賦值表達(dá)式加上一個(gè)分號(hào)構(gòu)成。5.2賦值語句 C語言中的賦值號(hào)“=”是一個(gè)運(yùn)算符,在其他大多數(shù)語言中賦值號(hào)不是運(yùn)算符。
多數(shù)高級(jí)語言沒有“賦值表達(dá)式”一概念。 作為賦值表達(dá)式可以包括在其他表達(dá)式之中。
例如:
if((a=b)>0)t=a;課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄 if后面的(
)內(nèi)是一個(gè)條件,如:
if(x>0)…
在x的位置上換上一個(gè)賦值表達(dá)式“a=b”,其作用是:先進(jìn)行賦值運(yùn)算(將b的值賦給a),然后判斷a是否大于0,如大于0,執(zhí)行t=a。在if語句中的“a=b”不是賦值語句而是賦值表達(dá)式,這樣寫是合法的。
如果寫成if((a=b;)>0)t=a;就錯(cuò)了。 在if的條件中不能包含賦值語句。由此可以看到,c把賦值語句和賦值表達(dá)式區(qū)別開來,增加了表達(dá)式的種類,使表達(dá)式的應(yīng)用幾乎“無孔不入”,能實(shí)現(xiàn)其他語言中難以實(shí)現(xiàn)的功能.課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄printf()和scanf()是C語言中使用得最多的一種輸出函數(shù),它可按指定的格式輸出和輸入多個(gè)不同類型的數(shù)據(jù)。4.5
格式式輸入輸出函數(shù)上機(jī)實(shí)習(xí)課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄例2.1
最簡(jiǎn)單的C程序,這也是世界上第一個(gè)C程序。/*exam21.c*//*最簡(jiǎn)單的C程序*/#include<stdio.h>main(){ printf(“Hello,world!”);}頭文件主函數(shù)例----頭文件與主函數(shù)課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄例2.2
已知圓的半徑為R(R是一個(gè)可變的量),求圓的面積和周長(zhǎng),用計(jì)算機(jī)求解,程序如下/*exam22.c*//*計(jì)算圓的面積和周長(zhǎng)*/#include<stdio.h>main(){floatr,area,s;
scanf(“%f“,&r);area=3.14*r*r;s=2*3.14*r;
printf(“面積=%f,周長(zhǎng)=%f”,area,s);}1、注釋2、數(shù)據(jù)說明3、數(shù)據(jù)輸入4、數(shù)據(jù)處理5、結(jié)果輸出課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄例2.3
已知平行四邊形的長(zhǎng)為50,寬為10,計(jì)算平行四邊形的面積和周長(zhǎng)。程序如下://exam23.c//計(jì)算平行四邊形的面積和周長(zhǎng)#include<stdio.h>main(){floata,b;a=10.0;b=5.0;
printf(“AREA=%f”,a*b);}程序課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄例2.4
以我國1992年工業(yè)產(chǎn)值為100,如果以9%的年增長(zhǎng)率增長(zhǎng)計(jì)算到2000年時(shí)的工業(yè)產(chǎn)值。1算法分析:對(duì)此問題,要找出問題的數(shù)學(xué)模型。設(shè)r為年增長(zhǎng)率,n為年數(shù),v為第n年的總產(chǎn)值。則有v=100*(1+r)n2數(shù)據(jù)結(jié)構(gòu)根據(jù)算法分析,至少要用到這么幾個(gè)量,年增長(zhǎng)率、年數(shù)、第n年的總產(chǎn)值。而這幾個(gè)量中,年增長(zhǎng)率肯定是小數(shù)(浮點(diǎn))型數(shù)據(jù),年數(shù)是整數(shù)(整型),總產(chǎn)值不會(huì)是整數(shù),應(yīng)為浮點(diǎn)數(shù)。這些數(shù)據(jù)都要放在相應(yīng)的變量中,并要進(jìn)行相應(yīng)的數(shù)據(jù)說明。課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄//exam24.c//計(jì)算到2000年的工業(yè)產(chǎn)值#include<stdio.h>main(){intn;floatrate,value;n=2000-1992;rate=0.09;value=100*pow(1+rate,n);printf(“2000年的產(chǎn)值為%f:”,value);}pow為求冪的函數(shù)格式
pow(底,指數(shù))底,指數(shù)均為浮點(diǎn)數(shù)。自動(dòng)類型轉(zhuǎn)換3源程序代碼課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄
此例中,只能算到2000年,且年增長(zhǎng)率為9%時(shí)的工業(yè)產(chǎn)值。如果將工業(yè)產(chǎn)值改為10%,或者要算到其它年份,必須要修改源程序,使用不便。方法2:用scanf函數(shù)重新編寫程序。//exam24.c//計(jì)算到2000年的工業(yè)產(chǎn)值#include<stdio.h>main(){intn,year;floatvalue,rate;printf(“請(qǐng)輸入年份和年增長(zhǎng)率”);scanf(“%d,%f”,&year,&rate);n=year-1992;value=100*pow(1+rate,n);printf(“按給定利率到指定年份的產(chǎn)值為%f”,value);}課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄例2.5
雞兔同籠,已知雞兔總頭數(shù)為H(Heads),總數(shù)為F(Feet),問雞兔各有多少只?1算法分析:(1)建立數(shù)學(xué)模型設(shè)雞為x只,兔為y只,由題意有:
x+y=h......(1)
2*x+4*y=f......(2)(2)求解方程,找出x,y的具體求解公式:以下用消元法找出方程的解課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄(2)式-2×(1)式注意:計(jì)算機(jī)不會(huì)自己建數(shù)學(xué)模型,也不會(huì)自己解方程!2×y=f-2×hy=(f-2×h)/24×(1)式-(2)式2×X=4×H-FX=(4×H-F)/22數(shù)據(jù)結(jié)構(gòu)程序中要用到不同的數(shù)據(jù),存放頭、腳數(shù)量的變量,存放方程解(雞、兔數(shù)量)的變量,存放方程判別式的變量等。對(duì)于頭、腳的數(shù)量,肯定是整型變量,方程的解理論上講是整型,但在求解方程時(shí)要進(jìn)行運(yùn)算,為了避免發(fā)生錯(cuò)誤,最好是用浮點(diǎn)數(shù)據(jù)。課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄3偽代碼(由于此問題比較簡(jiǎn)單,也可直接編寫程序)。說明變量x,y,f,h輸入數(shù)據(jù)f,h計(jì)算x,y打印結(jié)果偽代碼是一種程序設(shè)計(jì)工具,介于程序語言與自然語言之間,偽代碼不能被計(jì)算機(jī)編譯,但它很容易翻譯成高級(jí)語言.課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄//exam25.c#include<stdio.h>main(){floatx,y;intf,h;
printf(“InputthenumbersofHeadsandFeet”);
scanf(“%d,%d”,&f,&h);x=(4.0*h-f)/2.0;y=(f-2.0*h)/2.0;printf(“Heads=%d;Feet=%d”,h,f);printf(“Chicken=%d,rabbits=%d”,x,y);}4源程序代碼說明輸入數(shù)據(jù)的內(nèi)容課程目錄第4講最簡(jiǎn)單的c程序設(shè)計(jì)—順序程序設(shè)計(jì)本講目錄問題:1、從鍵盤輸入一個(gè)數(shù),如果該數(shù)為正,打印,
否則不打??;2、將考試成績(jī)不及格的學(xué)生名單打印出來;3、解一元二次方程,求出相應(yīng)的實(shí)根或復(fù)根。
對(duì)于上述或類似問題,需要進(jìn)行某種判斷,并根據(jù)不同情況進(jìn)行不同的處理,怎樣進(jìn)行程序設(shè)計(jì)?第五講分支結(jié)構(gòu)程序設(shè)計(jì)課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄解決辦法:1、引入新的程序結(jié)構(gòu),分支結(jié)構(gòu),有時(shí)也稱判斷結(jié)構(gòu)或選擇結(jié)構(gòu)。2、為了和分支結(jié)構(gòu)相配合,同時(shí)還要引入邏輯表達(dá)式的概念。3、有三種形式可進(jìn)行分支結(jié)構(gòu)的程序設(shè)計(jì)A、if結(jié)構(gòu)B、多重選擇結(jié)構(gòu)(switch語句)C、無條件轉(zhuǎn)移結(jié)構(gòu)(goto語句)課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄if語句關(guān)系表達(dá)式和邏輯表達(dá)式if語句的變形及嵌套多重選擇語句(switch語句)無條件轉(zhuǎn)移語句(goto語句)本講小結(jié)本講內(nèi)容課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄的根1、算法分析:2、數(shù)據(jù)結(jié)構(gòu):由于問題簡(jiǎn)單,只需用到一些單精度實(shí)數(shù)例5.1求一元二次方程課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄3、偽代碼輸入方程系數(shù)a,b,c計(jì)算判別式d=b*b-4*a*cif判別式大于等于0then{
計(jì)算兩個(gè)實(shí)根定位輸出光標(biāo)打印結(jié)果}else{
計(jì)算實(shí)部計(jì)算虛部定位輸出光標(biāo)打印結(jié)果}endprogram課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄
#include<math.h>#include<stdio.h>main(){
floata,b,d,c,x1,x2,p,q;printf(“輸入方程系數(shù):”);
scanf(“%f,%f,%f”,&a,&b,&c);d=b*b-4*a*c;
if(d>=0){x1=((-b+sqrt(d))/(2*a);x2=((-b-sqrt(d))/(2*a);printf(“x1=%f,x2=%f\n”,x1,x2);
else{p=-b/(2*a);q=sqrt(-d)/(2*a);
printf(“x1=%f+i%f,x2=%f-i%f\n”,p,q,p,q);}}求平方根的函數(shù)4、源程序清單課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄例5.2
商店售貨,按購買貨物款的多少分別給予不同的優(yōu)惠折扣,編程計(jì)算實(shí)際應(yīng)付貨款。購貨不足250元,沒有折扣;購貨250元(含250元,下同),不足500元,減價(jià)5%;購貨500元,不足1000元,減價(jià)7.5%;購貨1000元,不足2000元,減價(jià)10%;購貨2000元及以上,減價(jià)15%;1、算法分析:設(shè)購物款為M,折扣為D,則D可表示為:
D=0(M〈250)
D=0.05(250≦M<500)D=0.075(500≦M<1000)D=0.1(1000≦M<2000)D=0.15(2000≦M)課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄2、源程序清單//exam42.c#include<stdio.h>main(){floatm,d,t;
printf(“請(qǐng)輸入購物金額:”);scanf(“%f”,&m);
if(m<250)d=0;if(m>=250&&m<500)d=0.05;if(m>=500&&m<1000)d=0.075;if(m>=1000&&m<2000)d=0.1;if(m>=2000)d=0.15;
t=m*(1-d),//計(jì)算應(yīng)付款
printf(“實(shí)際應(yīng)付款:%f”,t);}輸入購物款:249實(shí)際應(yīng)付款:249輸入購物款:500實(shí)際應(yīng)付款:462.5課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄例5.3
購物折扣程序的另一個(gè)寫法改寫后,程序更清晰,執(zhí)行時(shí)間更省。//exam42.c#include<stdio.h>main(){floatm,d,t;
printf(“請(qǐng)輸入購物金額:”);
scanf(“%f”,&m);if(m<250)d=0;
elseif(m>=250&&m<500)d=0.05;elseif(m>=500&&m<1000)d=0.075;elseif(m>=1000&&m<2000)d=0.1;
else
d=0.15;t=m*(1-d),//應(yīng)付款
printf(“實(shí)際應(yīng)付款:%f”,t);}課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄例5.4
從鍵盤輸入一字符,如果為Y,則打印是,為N,打印否,其它字符,打印輸入錯(cuò)誤。//exam54.c#include<stdio.h>main(){chara;printf(“輸入一個(gè)字符:”);a=getchar();if(a==‘Y’||a==‘N’){
if(a==‘Y’)printf(“是”);
elseprintf(“否”);}elseprintf(“輸入數(shù)據(jù)不合要求”);}演示顯示程序課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄#include<stdio.h>main(){intx,y,z;printf(“Iputx,y,z:”);scanf(“%d,%d,%d”,&x,&y,&z);
if(x>0){
if(y>0)if(z>0)printf(“所有數(shù)據(jù)大于零!”);elseprintf(“只有X,Y大于零!”);}
elseif(x==0){if(y==0)if(z==0)printf(“所有數(shù)據(jù)都為零!”);elseprintf(“只有X,Y等于零!”);}elseprintf(“X小于零!”);}例5.5
演示
嵌套不能太深,一般以三層為限,嵌套太深,容易出錯(cuò)。嵌套演示程序課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄#include<stdio.h>main(){intx,y,z;printf(“Iputx,y,z:”);scanf(“%d,%d,%d”,&x,&y,&z);if(x>0&&y>0&&z>0)
printf(“所有數(shù)據(jù)大于零!”);elseif(x>0&&y>0)printf(“只有X,Y大于零!”);elseif(x==0&&y==0&&z==0)printf(“所有數(shù)據(jù)都為零!”);elseif(x==0&&y==0)printf(“只有X,Y等于零!”);else//(x<0)printf(“X小于零!”);}利用邏輯表達(dá)式將例4.5改寫,改寫后程序的結(jié)構(gòu)要清晰得多。演示課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄例5.6
將輸入的字母轉(zhuǎn)化為小寫字母。1算法分析
在計(jì)算機(jī)中,處理英文字母,其實(shí)是處理它的ASCII碼值。將大寫字母變成小寫字母,就是將大寫字母的ASCII碼值變?yōu)橄鄳?yīng)的小寫字母的ASCII碼值。
大寫字母的ASCII值比小寫字母的ASCII值小32,故將相應(yīng)字母的ASCII值加32就變成了小寫字母。
程序設(shè)計(jì)時(shí),要注意如果輸入的不是大寫的字母,則不用轉(zhuǎn)換。課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄main(){charch;scanf(“%c”,&ch);if(ch>=‘A’&&ch<=‘Z’)ch=ch+32;printf(“%c”,ch);}2源程序代碼之一課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄main(){charch;scanf(“%c”,&ch);ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch;printf(“%c”,ch);}注意:1條件運(yùn)算符優(yōu)先于賦值運(yùn)算符,低于關(guān)系運(yùn)算符;
2條件運(yùn)算符的結(jié)合方向?yàn)椤白杂抑磷蟆?/p>
a>b?a:c>d?c:da>b?a:(c>d?c:d)此處使用了條件運(yùn)算符3源程序代碼之二課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄#include<stdio.h>main(){inti;
printf(“輸入數(shù)字1-7:”);
scanf(“%d”,&i);
if(i==1)printf(“TodayisMonday!\n”);elseif(i==2)printf(“TodayisTuesday!\n”);elseif(i==3)printf(“TodayisWednesday!\n”);elseif(i==4)printf(“TodayisThursday!\n”);elseif(i==5)printf(“TodayisFriday!\n”);elseif(i==6)printf(“TodayisSaturday!\n”);elseprintf(“TodayisSunday!\n”);}例5.7
輸入星期中的某一天,顯示對(duì)應(yīng)的英文此例似顯復(fù)雜,是否有更好的辦法?課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄main(){inti;printf(“輸入數(shù)字1-7:”);scanf(“%d”,&i);switch(i){case1:printf(“TodayisMonday!”);case2:printf(“TodayisTuesday!”);case3:printf(“TodayisWednesday!”);case4:printf(“TodayisThursday!”);case5:printf(“TodayisFriday!”);case6:printf(“TodayisSaturday!”);default:printf(“TodayisSunday!”);}}例5.8用switch
語句重寫打印星期程序。main(){intI;printf(“輸入數(shù)字1-7:”);scanf(“%d”,&i);if(i==1)printf(“TodayisMonday!”);elseif(i==2)printf(“TodayisTuesday!”);elseif(i=3)printf(“TodayisWednesday!”);elseif(i==4)printf(“TodayisThursday!”);elseif(i==5)printf(“TodayisFriday!”);elseif(i==6)printf(“TodayisSaturday!”);elseprintf(“TodayisSunday!”);}課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄要有break才等價(jià)例5.9
用switch語句重寫例4.4的程序main(){chara;printf(“輸入一個(gè)字符:”);
a=getchar();
if(a==‘Y’||a==‘N’)if(a==‘Y’)printf(“是\n”);else
printf(“否\n”);elseprintf(“字符不合要求!\n”);}顯然,改寫后的程序更清晰,更簡(jiǎn)短。main(){chara;printf(“輸入字符:”);a=getchar();
switch(a){case‘Y’:
printf(“是\n”);
break;case‘N’:
printf(“否\n”);break;default:
printf(“字符不合要求!\n”);
}}課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄例5.10
在屏幕上顯示菜單分析:程序首先在屏幕上將功能顯示出來,用戶根據(jù)需要選擇相應(yīng)的功能,程序根據(jù)用戶的選擇執(zhí)行相應(yīng)的程序段。對(duì)于這類程序,往往是用戶輸入一個(gè)英文字母,然后程序根據(jù)字母來斷別程序該執(zhí)行什么程序段,故一般用switch語句比較方便。課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄2源程序清單switch(a){case'i':printf(“調(diào)用輸入模塊!”);break;case'o':printf(“調(diào)用輸出模塊!”);break;case'l':printf(“調(diào)用查找模塊!”);break;case‘q':printf(“調(diào)用退出模塊!”);break;
}}main(){intchara;printf(“請(qǐng)選擇:”);
printf(“輸入i”);printf(“輸出o”);printf(“找出最長(zhǎng)的單詞l”);printf(“退出q”);a=getchar();執(zhí)行選項(xiàng)時(shí),要調(diào)用相應(yīng)的模塊(程序段)。由于現(xiàn)在還沒有相應(yīng)的程序,暫用一條打印語句代替。以后會(huì)用相應(yīng)程序代替課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄例5.11
統(tǒng)計(jì)某班級(jí)中計(jì)算機(jī)課程中考試成績(jī)高于80分的人數(shù)。假設(shè)學(xué)生人數(shù)為10main(){inti,fs,j=0;Loop:scanf(“%d”,&fs);j++;//統(tǒng)計(jì)已讀入的數(shù)據(jù)個(gè)數(shù)
if(fs>80){i++;printf(“%d,%d”,i,fs);}if(j<10)//當(dāng)數(shù)據(jù)沒讀完時(shí),繼續(xù)
gotoLoop;}課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄1、分支結(jié)構(gòu):改變程序的執(zhí)行流程,或有選擇地執(zhí)行程序;2、if~else和switch是結(jié)構(gòu)化語句,而goto語句不是;3、塊if語句可以取代所有的分支結(jié)構(gòu),而多重分支結(jié)構(gòu)不可;4、塊if語句中的條件可以是復(fù)雜邏輯表達(dá)式,而多重分支中的條件只能是簡(jiǎn)單表達(dá)式;5、塊if與goto語句結(jié)合,可以構(gòu)造任何復(fù)雜的循環(huán),但用專門的循環(huán)語句更方便。本講小結(jié)課程目錄第5講分支結(jié)構(gòu)程序設(shè)計(jì)本講目錄在許多問題中需要用到循環(huán)控制。循環(huán)是指對(duì)同一個(gè)程序段重復(fù)執(zhí)行若干次。被重復(fù)執(zhí)行的部分(由若干語句組成)稱為循環(huán)體。幾乎所有實(shí)用程序都包括循環(huán)。循環(huán)結(jié)構(gòu)又稱重復(fù)結(jié)構(gòu),它是結(jié)構(gòu)化程序設(shè)計(jì)的基本結(jié)構(gòu)之一。本講主要內(nèi)容:
goto循環(huán)語句
while循環(huán)語句
do~while循環(huán)語句
for循環(huán)語句
循環(huán)嵌套及注意的問題
程序的流程圖第六講循環(huán)控制課程目錄第6講循環(huán)控制本講目錄例6.1
查找某班級(jí)中計(jì)算機(jī)課程中考試是否有成績(jī)高于95分的人。1算法分析
此題的算法比較簡(jiǎn)單,將該班計(jì)算機(jī)課程的考試成績(jī)輸入計(jì)算機(jī),每輸入一個(gè)成績(jī),就與95進(jìn)行比較,如果有大于95的成績(jī),程序結(jié)束。但在輸入和比較時(shí),要有一種結(jié)構(gòu),使得計(jì)算機(jī)能不停地執(zhí)行輸入和比較,當(dāng)某種條件(如找到了大于95分的成績(jī),或者所有的成績(jī)都已輸入完)滿足,則結(jié)束程序。2數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)也很簡(jiǎn)單,用一個(gè)變量存放輸入的數(shù)據(jù),還要用一個(gè)變量記錄輸入數(shù)據(jù)的個(gè)數(shù),如果輸入的數(shù)據(jù)完成時(shí),則該變量就等于輸入的數(shù)據(jù)的最大個(gè)數(shù)。Goto例課程目錄第6講循環(huán)控制本講目錄說明整型變量fs,i;
輸入成績(jī)fs;
記錄輸入成績(jī)的個(gè)數(shù)(i=i+1);
iffs>95或者輸入數(shù)據(jù)完成(i>某值){
退出輸入;
elsego輸入成績(jī)行;}if(fs>95)
打印字符串“找到了!”
else
打印字符串“沒找到!”結(jié)束程序3程序偽代碼課程目錄第6講循環(huán)控制本講目錄main(){intfs,i;i=0;Loop1:scanf(“%d”,&fs);i=i+1;if(fs>95||i>=10)
gotoloop2;else
gotoloop1;loop2:if(fs>95)printf(“FIND!”);elseprintf(“DONOTFIND!”);}4源程序代碼之一構(gòu)成循環(huán)退出循環(huán)標(biāo)號(hào)標(biāo)號(hào)課程目錄第6講循環(huán)控制本講目錄5源程序代碼之二#include<stdio.h>main(){intfs,i=1;printf("\n請(qǐng)輸入第%d個(gè)數(shù)據(jù):",i);scanf("%d",&fs);
while(fs<=95&&i<10){ printf("請(qǐng)輸入第%d個(gè)數(shù)據(jù):",i+1);scanf("%d",&fs);i++;}if(fs>95)printf("\n找到啦!\n");elseprintf("\n沒找到!\n");}注意輸入提示W(wǎng)hile例1循環(huán)體課程目錄第6講循環(huán)控制本講目錄例6.2
將輸入的正文復(fù)制到輸出,每次一個(gè)字符.1算法分析
本題的含義是每次從鍵盤上輸入一個(gè)字符,然后將該字符在屏幕上輸出。因?yàn)槭钦?,故其結(jié)束的標(biāo)志為ctrl+z
要使用字符函數(shù)來接受從鍵盤輸入的字符,一般用getchar函數(shù)。課程目錄第6講循環(huán)控制本講目錄2源程序代碼
#include<stdio.h>
intmain(void){
charc;
printf(“inputatextendofctrl+z\n”);
c=getchar();
while(c!=EOF){
putchar(c);
c=getchar();
}
}
在頭文件中定義的常數(shù)(-1)While例2循環(huán)體注意輸入提示按ctrl+z鍵結(jié)束輸入輸入一個(gè)字符輸出一個(gè)字符課程目錄第6講循環(huán)控制本講目錄#include<stdio.h>intmain(void){ charc;
printf("inputatext\n");
while((c=getchar())!=EOF)putchar(c);}例6.3
請(qǐng)閱讀下面的程序,說明程序的功能。該程序與上面的程序功能一樣,只不過將字符輸入語句放入循環(huán)判斷條件中。在頭文件中定義的常數(shù)(-1)ctrl+z鍵結(jié)束輸入循環(huán)注意輸入提示按輸入一個(gè)字符輸出一個(gè)字符課程目錄第6講循環(huán)控制本講目錄例6.4
比較兩種循環(huán)的用法。從鍵盤輸入一個(gè)字符Y或N,直到輸入正確為止。1算法分析在程序中,經(jīng)常會(huì)遇到要求用戶輸入Y或N,以確定某種狀態(tài)。為防止用戶在無意中碰到鍵盤而輸入錯(cuò)誤的字符,程序?qū)τ脩糨斎氲牟缓弦蟮淖址雎?,并要求用戶重新輸入。為了做到上述要求,程序?qū)斎氲淖址M(jìn)行判斷,如果不合要求,則將輸入的字符忽略,并等待用戶重新輸入。顯然,要做到這一點(diǎn),須用一個(gè)循環(huán)程序,當(dāng)輸入正確時(shí),循環(huán)結(jié)束。設(shè)輸入變量為c,則循環(huán)控制條件為!(c==‘Y’||c==‘N’)或者(c!=‘Y’&&c!=‘N’)課程目錄第6講循環(huán)控制本講目錄2源代碼比較格式1:
c=getchar();
while(c!=’Y’&&c!=’N’){printf("answerisYorN“);c=getchar();}格式2:
do{printf(”EnterYorN“);c=getchar();}while(c!=’Y’&&c!=’N’);顯然,格式
2更方便!do例課程目錄第6講循環(huán)控制本講目錄#include<stdio.h>main(){intfs,i=1;
do{ printf("請(qǐng)輸入第%d個(gè)數(shù)據(jù):",i);scanf("%d",&fs);i++;}while(fs<=95&&i<10);if(fs>95)printf("\n找到啦!\n");elseprintf("\n沒找到!\n");}例6.5
將例6.1用新的do~while語句重寫查找某班級(jí)考試結(jié)果是否有高于95分的成績(jī)。do例循環(huán)體課程目錄第6講循環(huán)控制本講目錄例6.5
統(tǒng)計(jì)某班級(jí)中計(jì)算機(jī)課程中考試成績(jī)高于80分的人數(shù),現(xiàn)用for循環(huán)語句重寫該程序。
main(){intfs,sum,j;sum=0;
for(j=1;j<=10;j++){scanf(“%d”,&fs);if(fs>80){sum=sum+1;printf(“sum=%d\n“,sum);}}}給循環(huán)變量j賦初值1循環(huán)變量j加1循環(huán)控制條件for例循環(huán)體課程目錄第6講循環(huán)控制本講目錄例6.6
求數(shù)列
的和。1、分析:該數(shù)列中每一項(xiàng)的分母都有規(guī)律,后一項(xiàng)為前一項(xiàng)加5,分母的通式為:
An=An-1+5,A1=1或:
程序課程目錄第6講循環(huán)控制本講目錄//exam63.c#include<stdio.h>main(){ inti; floatsum=0;
for(i=0;i<=100;i++) { sum=sum+1.0/(1+i*5); } printf("%f",sum);}給循環(huán)變量i賦初值1循環(huán)變量i
加1循環(huán)控制條件循環(huán)for例課程目錄第6講循環(huán)控制本講目錄例6.7求的近似值,精確到公式為:
此類問題相對(duì)簡(jiǎn)單,但要注意累加變量和通項(xiàng)的初值。
該問題中,累加變量sum的初值為0,通項(xiàng)term的初值為1。課程目錄第6講循環(huán)控制本講目錄#include<stdio.h>#include<math.h>main(){ doublepi,term,sum; inti; sum=0.0; term=1.0;
for(i=1;term>0.00000000000001;i++){ term=1.0/(i*i); sum=sum+term; } pi=sqrt(sum*6); printf("%f\n",pi);}兩個(gè)相乘,其值會(huì)溢出,故得不到想要的結(jié)果循環(huán)for例課程目錄第6講循環(huán)控制本講目錄例6.8分別統(tǒng)計(jì)某班學(xué)生各科成績(jī)中高于80分的人數(shù)。學(xué)生人數(shù)為30人,課程為:數(shù)學(xué)、語文、英語、物理、生物。intn,i;n=0;for(i=1;i<=30;i++){ //對(duì)學(xué)生人數(shù)循環(huán)
scanf(“%d”,&fs);if(fs>=80)n=n+1;//累加大于80分的人數(shù)}printf("n=%d“,n);
先看統(tǒng)計(jì)數(shù)學(xué)成績(jī)循環(huán)for例課程目錄第6講循環(huán)控制本講目錄
統(tǒng)計(jì)五門課程,只需將統(tǒng)計(jì)一門課程的程序用不同的數(shù)據(jù)執(zhí)行5次,這可用一個(gè)循環(huán)實(shí)現(xiàn)。//統(tǒng)計(jì)某一門課程
n=0;for(i=0;i<3;i++){scanf(“%d”,fs);if(fs>=80)n=n+1;}printf("n=%d“,n);for(j=0;j<5;j++){//對(duì)課程循環(huán)
}統(tǒng)計(jì)每門課程的成績(jī)!//統(tǒng)計(jì)一門課程
n=0;for(i=0;i<3;i++){scanf(“%d”,fs);if(fs>=80)n=n+1;}printf("n=%d“,n);
這里,用到了二重循環(huán)。外循環(huán)內(nèi)循環(huán)for例課程目錄第6講循環(huán)控制本講目錄例6.9求自然對(duì)數(shù)的底e,取前n項(xiàng)的和。1算法分析此題有兩種算法:一種是直接求通項(xiàng),則先求n!,然后求1/n!,這種方法比較簡(jiǎn)單。求n階乘的程序段為f=1;for(j=1;j<=n;j++)f=f*j;課程目錄第6講循環(huán)控制本講目錄,則有設(shè)通項(xiàng)為由于數(shù)列的第一項(xiàng)不能用通項(xiàng)表示,故將其直接放入累加變量中。程序片段為第二種求通項(xiàng)的公式e=1.0;a=1;for(m=1;m<=n;m++){a=a*(1/m);e=e+a;}課程目錄第6講循環(huán)控制本講目錄//利用雙重循環(huán)計(jì)算main(){inti,j,n;floate,f;printf(“PleaseinputN:”);scanf(“%d”,&n);e=1.0;for(i=1;i<=n;i++){f=1;for(j=1;j<=i;j++)f=f*j;e=e+1/f;}printf(“e=%f”,e);}//利用單重循環(huán)計(jì)算main(){inti,n;floate,f;printf(“PleaseinputN:”);scanf(“%d”,&n);e=1.0;f=1;for(i=1;i<=n;i++){f=f*(1/i);e=e+f;}printf(“e=%f”,e);}2源代碼課程目錄第6講循環(huán)控制本講目錄例6.10
從鍵盤上輸入字符并按行顯示,遇到Esc鍵結(jié)束,要求只顯示輸出內(nèi)容。在每行前顯示字符串“TheLineNo.isn”,n為1,2,3,1算法分析此題要求從鍵盤上輸入字符并按行顯示,初一看,只要用行輸入語句就行。但仔細(xì)分析后會(huì)發(fā)現(xiàn),用行輸入語句不行。如用gets或scanf語句,則輸入的內(nèi)容會(huì)在屏幕上回顯(即輸入的內(nèi)容顯示在屏幕上),其次,這兩個(gè)語句都不能單獨(dú)捕捉到Esc鍵。因此,只能用單個(gè)字符輸入的函數(shù),但要求不要回顯,getchar函數(shù)也不行,但推測(cè)是與getchar相類似的函數(shù)。故可先調(diào)出getchar的幫助,然后看SeeAlso。課程目錄第6講循環(huán)控制本講目錄既然是按行顯示,用字符輸入函數(shù),每輸入一個(gè)字符,立刻在屏幕上顯示出來。當(dāng)接受到換行符時(shí),轉(zhuǎn)入下一行。因此,對(duì)每一行的輸入,要用一個(gè)循環(huán),循環(huán)的控制條件就是輸入的字符不為換行符。當(dāng)輸入為換行符時(shí),循環(huán)從頭開始。程序的結(jié)束是以接受到Esc鍵為標(biāo)志的,故而要在行輸入的外面再增加一個(gè)循環(huán),此循環(huán)的結(jié)束條件是輸入的字符為Esc鍵。行輸入的程序片段為printf("\nTheLineNo.is%d",i);do{printf("%c",c);c=getch();}while(c!=13&&c!=27);13return鍵ASCII碼27Esc鍵ASCII碼getch不回顯輸入字符函數(shù)課程目錄第6講循環(huán)控制本講目錄#include<stdio.h>#include<conio.h>intmain(void){inti=0;charc='\0';while(c!=27){c='\0';i++;printf("\nTheLineNo.is%d",i);do{printf("%c",c); c=getch();}while(c!=13&&c!=27);}printf("\nTheend\n");}從鍵盤上輸入一個(gè)字符,不回顯Esc鍵的ASCII碼值回車符的ASCII碼值2源程序代碼
課程目錄第6講循環(huán)控制本講目錄例6.11
輸入一個(gè)算式,模擬袖珍計(jì)算機(jī)的加、減、乘、除四則運(yùn)算。例如:輸入10.8+0.13*100計(jì)算結(jié)果為:1093.000000假定計(jì)算時(shí)不考慮運(yùn)算符的優(yōu)先級(jí),也不允許有(),而是按照運(yùn)算符出現(xiàn)的先后順序執(zhí)行運(yùn)算。sunhui:此例也沒講。課程目錄第6講循環(huán)控制本講目錄main(void){doublex,y;charop;inx:printf("inputarithmeticexpression:\n");scanf("%lf",&x);while((op=getchar())!='\n'){iny:scanf("%lf",&y); switch(op){ case'+':x+=y;break; case'-':x-=y;break; case'*':x*=y;break; case'/': if(y)x/=y; else{printf("divisioniszero,inputyagain\n"); gotoiny; } break;default:printf("illegaloperator,inputagain\n"); gotoinx; }}printf("%8.4f\n",x);}課程目錄第6講循環(huán)控制本講目錄開始
輸入系數(shù)a,b,cd>=0例6.12:用流程圖描述求解一元二次方程的根x1=(-b+sqrt(d))/2x2=(-b-sqrt(d))/2輸出x1,x2p=-b/2q=sqrt(-d)/2輸出x1,x2結(jié)束TF課程目錄第6講循環(huán)控制本講目錄d=b*b-4*a*c例6.13
輸入一段C語言程序(一個(gè)正文),按原來格式復(fù)制到輸出,復(fù)制過程中刪除輸入程序中所有的注釋。此處注釋專指“/**/”的注釋。1算法分析程序先要輸入,在C語言中,當(dāng)從鍵盤輸入時(shí),先將輸入數(shù)據(jù)放入鍵盤緩沖區(qū)中,當(dāng)接受到回車符后,程序才開始從鍵盤緩沖區(qū)中讀數(shù)據(jù)。分析之前,首先,弄明白問題的意思。程序要求輸入一段程序(C語言),并將輸入的程序在屏幕上輸出。在輸出時(shí)將程序中的注釋(/**/)過濾,既不輸出注釋。課程目錄第6講循環(huán)控制本講目錄輸出時(shí)要將注釋過濾掉,首先要判別什么內(nèi)容是注釋內(nèi)容。例:while(a>b){/*whilea>b*/printf(“*/”);}字符的類型,僅從字符本身是無法區(qū)分的。如上面的串中,字符串while可能是普通字符串,也可能是注釋字符串。同樣,對(duì)“*/”字符,與/*配對(duì)是注釋字符,否則就是普通字符。因此,需要一個(gè)類型標(biāo)志
state。因此,字符的類型標(biāo)志可取為:普通字符(COPY)、注釋開始(START)、注釋字符(COMMENT)、注釋結(jié)束(END)。因此,在C程序中,從注釋的角度來看,字符共有四種,普通字符、注釋開始字符、注釋結(jié)束字符及注釋字符。while(a>b){printf(“*/”);}
為普通字符,whilea>b
為注釋字符,/**/為注釋標(biāo)志字符。課程目錄第6講循環(huán)控制本講目錄參照下例開始程序設(shè)計(jì)。開始時(shí),state置普通字符狀態(tài)。在普通字符狀態(tài),如果輸入字符不是‘/’,則將字符原樣輸出,如果輸入字符為‘/’,在開始注釋狀態(tài),如果輸入字符為‘*’,while(a>b)/*whilea>b*/printf(“*/”);
則可能開始注釋,將state設(shè)為注釋狀態(tài),字符‘/’
不輸出;課程目錄第6講循環(huán)控制本講目錄參照下例開始程序設(shè)計(jì)。開始時(shí),state
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024秋新滬科版物理8年級(jí)上冊(cè)教學(xué)課件 第6章 熟悉而陌生的力 第4節(jié) 探究:滑動(dòng)摩擦力大小與哪里因素有關(guān)
- 2023年智能電能表及配件項(xiàng)目融資計(jì)劃書
- 2023年原料藥機(jī)械及設(shè)備項(xiàng)目融資計(jì)劃書
- 養(yǎng)老院老人生活照料管理制度
- 養(yǎng)老院老人健康飲食營養(yǎng)師考核獎(jiǎng)懲制度
- 物流整改方案
- 政府還款協(xié)議書(2篇)
- 抵押房子合同書(2篇)
- 《豆類堅(jiān)果類與健康》課件
- 2024年度生態(tài)農(nóng)業(yè)地產(chǎn)融資合作開發(fā)合同3篇
- 護(hù)理質(zhì)控分析整改措施(共5篇)
- 金屬礦山安全教育課件
- 托盤演示教學(xué)課件
- 中華農(nóng)耕文化及現(xiàn)實(shí)意義
- DBJ61-T 112-2021 高延性混凝土應(yīng)用技術(shù)規(guī)程-(高清版)
- 2023年高考數(shù)學(xué)求定義域?qū)n}練習(xí)(附答案)
- 農(nóng)產(chǎn)品品牌與營銷課件
- 蘇科版一年級(jí)心理健康教育第17節(jié)《生命更美好》教案(定稿)
- 車輛二級(jí)維護(hù)檢測(cè)單參考模板范本
- 測(cè)定總固體原始記錄
- (最新整理)夜市一條街建設(shè)方案
評(píng)論
0/150
提交評(píng)論