第3章 程序控制結(jié)構(gòu)_第1頁(yè)
第3章 程序控制結(jié)構(gòu)_第2頁(yè)
第3章 程序控制結(jié)構(gòu)_第3頁(yè)
第3章 程序控制結(jié)構(gòu)_第4頁(yè)
第3章 程序控制結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩115頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

3.1程序的基本結(jié)構(gòu)3.2語句3.3順序結(jié)構(gòu)3.4選擇結(jié)構(gòu)3.5循環(huán)結(jié)構(gòu)3.6轉(zhuǎn)向語句3.7結(jié)構(gòu)化程序設(shè)計(jì)的方法3.8案例應(yīng)用第3章程序控制結(jié)構(gòu)1一個(gè)良好的程序由以下三種基本結(jié)構(gòu)組成:(1)順序結(jié)構(gòu)——按語句的先后順序逐條執(zhí)行

。(2)選擇結(jié)構(gòu)

——按照條件邏輯是否成立有選擇的執(zhí)行不同的語句。(3)循環(huán)結(jié)構(gòu)——根據(jù)某項(xiàng)條件重復(fù)地執(zhí)行某項(xiàng)任務(wù)若干次直到滿足或不滿足某條件為止。循環(huán)結(jié)構(gòu)有兩種形式分別為:

當(dāng)型循環(huán)直到型循環(huán)3.1程序的基本結(jié)構(gòu)23.1程序的基本結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)33.2語句C程序源程序文件1源程序文件2源程序文件n預(yù)處理命令函數(shù)n函數(shù)1數(shù)據(jù)聲明函數(shù)首部函數(shù)體數(shù)據(jù)聲明執(zhí)行語句C程序的結(jié)構(gòu):43.2語句一個(gè)c程序可以有若干個(gè)源程序文件組成一個(gè)源文件可以有若干個(gè)函數(shù)和預(yù)處理命令以及全局變量聲明部分組成一個(gè)函數(shù)有函數(shù)首部和函數(shù)體組成函數(shù)體由數(shù)據(jù)聲明和執(zhí)行語句組成C語句分為6類聲明語句表達(dá)式語句復(fù)合語句控制語句空語句函數(shù)調(diào)用語句53.2.1聲明語句聲明語句主要用來說明合法標(biāo)識(shí)符,以便能在程序中合法使用它們。

“先聲明,后使用”的原則。語法格式:數(shù)據(jù)類型符用戶標(biāo)識(shí)符;{charc;/*聲明字符變量,遵循先聲明后使用原則*/scanf(“%c”,&c);/*輸入字符,對(duì)字符變量c賦值*}63.2.2表達(dá)式語句

由一個(gè)表達(dá)式加一個(gè)分號(hào)構(gòu)成。x=5;分號(hào)賦值表達(dá)式表達(dá)式語句+=注意:x=5和x=5;是不同的。前者是一個(gè)賦值表達(dá)式,后者一個(gè)賦值表達(dá)式語句。73.2.3復(fù)合語句復(fù)合語句:用一對(duì){}括起來的語句,又稱分程序或語句塊。{ z=x+y; t=z/100; printf(“%f”,t); }注意:復(fù)合語句中最后一個(gè)語句的分號(hào)不能忽略不寫。在語法上將復(fù)合語句看成是單條語句。83.2.4控制語句控制語句:控制語句是用于控制程序流程的語句,一般指那些可改變順序結(jié)構(gòu)的語句。

C語言的流程控制語句可分為三類:

條件判斷語句:if、switch循環(huán)執(zhí)行語句:while、do-while、for流程轉(zhuǎn)向語句:break、continue、return93.2.5空語句空語句:僅由一個(gè)分號(hào)“;”組成的語句。

;(什么也不做)空語句的作用如下:(1)在循環(huán)語句中提供一個(gè)不執(zhí)行任何操作的空循環(huán)體。(2)為有關(guān)語句提供標(biāo)號(hào),用以說明程序執(zhí)行的位置。即,用來做流程的轉(zhuǎn)向點(diǎn)。103.2.6函數(shù)調(diào)用語句函數(shù)調(diào)用語句:由一個(gè)函數(shù)調(diào)用加一個(gè)分號(hào)構(gòu)成。例:Printf(“ThisisaCprogram.”);

11在順序結(jié)構(gòu)中,從第一條語句到最后一條語句完全按先后次序順序執(zhí)行。3.3順序結(jié)構(gòu)【例3.2】從鍵盤輸入圓半徑,輸出圓面積(圓周率取3.14,計(jì)算結(jié)果保留小數(shù)點(diǎn)后兩位)。分析:(1)聲明兩個(gè)實(shí)型變量r和s。變量r用于存放從鍵盤輸入的圓半徑,變量s用于保存圓面積。(2)從鍵盤輸入圓半徑數(shù)值,賦給變量r。(3)利用圓面積公式s=3.14*r*r求圓面積。(4)輸出s的值。123.3順序結(jié)構(gòu)流程圖如下所示:#include<stdio.h>voidmain(){

doubler,s;//聲明實(shí)型變量r,sprintf("Pleaseinputr\n");scanf("%lf",&r);//通過鍵盤輸入r值s=3.14*r*r;

//通過圓面積公式計(jì)算圓面積,并將計(jì)算結(jié)果賦給變量sprintf("s=%.2lf\n",s);//輸出s的值}133.3順序結(jié)構(gòu)【例3.3】輸入整型變量a和b的值,交換它們的值并輸出。分析:(1)聲明兩個(gè)整型變量a、b用于存放輸入的兩個(gè)數(shù)。(2)從鍵盤上輸入兩個(gè)整數(shù),保存到變量a、b中。(3)利用一個(gè)臨時(shí)存儲(chǔ)單元temp,達(dá)到交換變量a、b的值目的。(4)輸出交換后變量a、b的值。a2b8temp28214#include<stdio.h>voidmain(){inta,b,temp;printf("Inputa=");scanf("%d",&a);printf("Inputb=");scanf("%d",&b);temp=a;a=b;b=temp;printf(“a=%d,b=%d\n”,a,b);

}實(shí)現(xiàn)a,b值的交換3.4選擇結(jié)構(gòu)選擇結(jié)構(gòu):

在現(xiàn)實(shí)生活中,需要進(jìn)行判斷和選擇的情況很多。如果你在家,我去拜訪你如果考試不及格,要補(bǔ)考如果遇到紅燈,要停車等待周末我們?nèi)ソ加?0歲以上的老年人,入公園免票選擇結(jié)構(gòu)用if語句和switch語句來實(shí)現(xiàn)。163.4選擇結(jié)構(gòu)3.4.1if語句3.4.2switch語句3.4.3程序應(yīng)用舉例173.4.1if語句1.if(表達(dá)式)語句if(x>y)printf(”%d”,x);語句0(假)表達(dá)式非0(真)單分支結(jié)構(gòu)183.4.1if語句雙分支結(jié)構(gòu)2.if(表達(dá)式)語句1else語句2if(x>y)printf(”%d”,x);elseprintf(”%d”,y);語句2非0(真)表達(dá)式0(假)語句1193.4.1if語句☆使用說明1)if(表達(dá)式)語句2)if(表達(dá)式)語句1else語句2關(guān)系表達(dá)式邏輯表達(dá)式if(a==b&&x==y)printf(”a=b,x=y”);203.4.1if語句☆使用說明1)if(表達(dá)式)語句2)if(表達(dá)式)語句1else語句2數(shù)值表達(dá)式if(0)printf(”O(jiān)K.”);213.4.1if語句☆使用說明1)if(表達(dá)式)語句2)if(表達(dá)式)語句1else語句2關(guān)系表達(dá)式邏輯表達(dá)式if(x>0)printf(”%f”,x);elseprintf(”%f”,-x);數(shù)值表達(dá)式配對(duì)不能丟223.4.1if語句☆使用說明1)if(表達(dá)式)語句2)if(表達(dá)式)語句1else語句2可以是:簡(jiǎn)單的語句復(fù)合語句另一個(gè)if語句等圓括號(hào)不能省略

233.4.1if語句多分支結(jié)構(gòu)3.if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2elseif(表達(dá)式3)語句3……elseif(表達(dá)式n)語句nelse語句n+1243.4.1if語句【例3.4】用單分支選擇語句形式,實(shí)現(xiàn)從鍵盤輸入兩個(gè)整數(shù),按從小到大次序輸出這兩個(gè)數(shù)。分析:(1)定義2個(gè)整型變量a、b用于存放輸入的兩個(gè)數(shù)。(2)從鍵盤上輸入2個(gè)整型變量a、b的值。(3)比較a和b大小。如果a>b,則交換a、b中數(shù)值。(4)輸出變量a、b的值。25#include<stdio.h>voidmain(){

inta,b,temp;printf("Inputa=");scanf("%d",&a);printf("Inputb=");scanf("%d",&b);if(a>b){temp=a;a=b;b=temp;}printf("%d,%d\n",a,b);}實(shí)現(xiàn)a,b值的交換“{”和“}”必須成對(duì)出現(xiàn),構(gòu)成復(fù)合語句。如果復(fù)合語句中只有一條語句,則可省略;否則,不能省略。if(a>b)條件判斷Inputa=9↙Inputb=

3↙3,93.4.1if語句【例3.5】利用if-else雙分支結(jié)構(gòu)語句形式,實(shí)現(xiàn)輸入整型變量a和b的值,輸出它們中較大的值。分析:(1)聲明所需的整型變量a、b。(2)從鍵盤上輸入兩個(gè)整型變量a、b的值。(3)用關(guān)系表達(dá)式判斷a>b是否為真,如果為真,則執(zhí)行(4);否則,執(zhí)行(5)。(4)輸出a的值。(5)輸出b的值。27#include<stdio.h>voidmain(){

inta,b;printf("Inputa=");scanf("%d",&a);printf("Inputb=");scanf("%d",&b);if(a>b)printf("較大數(shù)是%d\n",a);elseprintf("較大數(shù)是%d\n",b);}雙分支結(jié)構(gòu)不能省略Inputa=4↙Inputb=13↙較大數(shù)是133.4.1if語句【例3.6】學(xué)校按總評(píng)分?jǐn)?shù)(設(shè)定為0到100分范圍)把學(xué)生學(xué)期成績(jī)分成五等,90分及以上為A,80到89分為B,70到79分為C,60到69分為D,分?jǐn)?shù)低于60分為E。編程實(shí)現(xiàn)從鍵盤輸入一個(gè)學(xué)生總評(píng)分?jǐn)?shù),輸出其對(duì)應(yīng)等級(jí)。(用elseif多分支結(jié)構(gòu)實(shí)現(xiàn))分析:(1)聲明一個(gè)整型變量m,用于存放學(xué)生總評(píng)分?jǐn)?shù)。(2)從鍵盤輸入一個(gè)學(xué)生總評(píng)分?jǐn)?shù)賦予m。(3)用elseif語句依次判斷m是否屬于等級(jí)A、B、C、D中的一種,如果是,輸出對(duì)應(yīng)等級(jí),退出選擇控制結(jié)構(gòu);否則,執(zhí)行(3)。(4)如果m都不在等級(jí)A、B、C、D對(duì)應(yīng)分?jǐn)?shù)范圍內(nèi),則輸出為E等,退出選擇控制結(jié)構(gòu)。293.4.1if語句#include<stdio.h>voidmain(){intm;printf("Pleaseinputmark:");scanf("%d",&m);

if(m>=90)printf("A\n");

else

if(m>=80)printf("B\n");

else

if(m>=70)printf("C\n");

else

if(m>=60)printf("D\n");

elseprintf("E\n");}Pleaseinputmark:83↙B

if(m>=90)printf("A\n");

else

if(m>=80)printf("B\n");

else

if(m>=70)printf("C\n");

else

if(m>=60)printf("D\n");

elseprintf("E\n");應(yīng)將處于同一層的if和其對(duì)應(yīng)的else縮進(jìn)對(duì)齊以增強(qiáng)程序可讀性。303.4.1if語句4.if語句的嵌套有的選擇結(jié)構(gòu)中又包含一個(gè)或多個(gè)選擇結(jié)構(gòu),這稱為選擇結(jié)構(gòu)的嵌套。if語句中可以又包括另一個(gè)if語句,這就是if語句的嵌套??梢杂胕f語句的嵌套實(shí)現(xiàn)嵌套的選擇結(jié)構(gòu)。313.4.1if語句4.if語句的嵌套一般形式:if(表達(dá)式1)if(表達(dá)式2)語句1else語句2elseif(表達(dá)式3)語句3else語句4內(nèi)嵌if323.4.1if語句【例3.7】從鍵盤輸入三個(gè)整數(shù),輸出最大的那個(gè)數(shù)。分析:(1)聲明所需的整型變量a、b、c,以及變量max。max用于保存最大的數(shù)。(2)從鍵盤上輸入3個(gè)整數(shù),分別保存在整型變量a、b和c中。(3)找出a、b、c中最大的數(shù),賦給max。(4)輸出max的值。333.4.1if語句34voidmain(){inta,b,c,max;printf("Pleaseinput3integernumber:");scanf("%d%d%d",&a,&b,&c);if(b>a){ if(c>b)max=c;elsemax=b;}else{if(c>a)max=c; elsemax=a;}printf("max=%d\n",max);}此處的{}可以省略應(yīng)將處于同一層的if和其對(duì)應(yīng)的else縮進(jìn)對(duì)齊以增強(qiáng)程序可讀性。3.4.1if語句例:if()

if()語句1else

if()語句2else語句3例:if()

{if()語句1}else

if()語句2else語句3當(dāng)if和else數(shù)目不同時(shí),可以加花括號(hào)來確定配對(duì)關(guān)系。else總是與它上面最近的未配對(duì)的if配對(duì)363.4.1if語句373.4.1if語句#include<stdio.h>voidmain(){

inta,b,c,max;printf("Pleaseinput3integernumber:");scanf("%d%d%d",&a,&b,&c);

max=a>b?a:b;max=max>c?max:c;printf("max=%d\n",max);}

max=(a>b?a:b)>c?(a>b?a:b):c;

383.4.1if語句【例3.8】任意輸入一個(gè)年號(hào)(如2011),判斷是否是閏年。(閏年滿足的條件是能被4整除但不能被100整除或者能被400整除)分析:(1)聲明一個(gè)整型變量year,用于存放年號(hào)。(2)從鍵盤輸入一個(gè)年號(hào),賦給變量year。(3)判斷year是否滿足閏年的條件,如果滿足輸出“是閏年”,否則輸出“不是閏年”。393.4.1if語句方法一:40#include<stdio.h>voidmain(){

intyear;printf("Pleaseinputyear=:");scanf("%d",&year);

if(year%400==0)printf("是閏年\n");else{if(year%4==0&&year%100!=0)printf("是閏年\n"); elseprintf("不是閏年\n");}}if(year%400==0||(year%4==0&&year%100!=0))printf("是閏年\n");elseprintf("不是閏年\n");閏年滿足的條件:(1)能被4整除但不能被100整除;(year%4==0&&year%100!=0))(2)能被400整除。year%400==0

3.4.1if語句方法二:用變量leap代表是否閏年的信息若閏年,令leap=1;非閏年,leap=0最后判斷l(xiāng)eap是否為1(真),若是,則輸出“閏年”信息42#include<stdio.h>voidmain() {intyear,leap;printf("enteryear:");scanf("%d",&year);if(year%4==0)if(year%100==0) if(year%400==0)leap=1;elseleap=0; elseleap=1;elseleap=0;if(leap)printf("%dis",year);elseprintf("%disnot",year);printf("aleapyear.\n");}標(biāo)志變量與if(leap!=0)含義相同那if(leap==0)相當(dāng)于什么呢?if(leap==0)等價(jià)于if(!leap)if(leap!=0)等價(jià)于if(leap)#include<stdio.h>voidmain() {intyear,leap;printf("enteryear:");scanf("%d",&year);if(year%4==0)if(year%100==0) if(year%400==0)leap=1;elseleap=0; elseleap=1;elseleap=0;if(leap)printf("%dis",year);elseprintf("%disnot",year);printf("aleapyear.\n");}if(year%4!=0)leap=0;elseif(year%100!=0)leap=1;elseif(year%400!=0)leap=0;elseleap=1;if((year%4==0&&year%100!=0)||(year%400==0))leap=1;elseleap=0;3.4.2switch語句switch語句用來實(shí)現(xiàn)多分支選擇結(jié)構(gòu)學(xué)生成績(jī)分類85分以上為’A’等70~84分為’B’等60~69分為’C’等……人口統(tǒng)計(jì)分類

按年齡分為老、中、青、少、兒童453.4.2switch語句switch語句的一般形式:switch(表達(dá)式){case常量表達(dá)式1:語句1case常量表達(dá)式2:語句2

┇case常量表達(dá)式n:語句ndefault:語句n+1}不能相同463.4.2switch語句switch(grade){case’A’:printf(”85~100\n”);case’B’:printf(”70~84\n”);case’C’:printf(”60~69\n”);case’D’:printf(”<60\n”);default:printf(”error\n”);}若grade的值為“A”85~10070~8460~69<60errorbreak;break;break;break;85~100473.4.2switch語句grade輸出85~100‘A’‘B’輸出70~84輸出60~69‘C’輸出<60輸出error‘D’其他483.4.2switch語句說明:(1)switch是關(guān)鍵字,其后的表達(dá)式必須用“()”括起來。(2)表達(dá)式的數(shù)據(jù)類型可以是整數(shù)類型、字符類型或枚舉類型。(3)“()”中表達(dá)式結(jié)果類型必須與switch語句體中case后常量表達(dá)式數(shù)據(jù)類型一致。(4)case是關(guān)鍵字,其后每個(gè)常量表達(dá)式的值必須不相同,否則會(huì)出現(xiàn)二義性。(5)各個(gè)case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。例如,可以先出現(xiàn)“default:…”。493.4.2switch語句(6)當(dāng)表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式值相等時(shí),就執(zhí)行此case后面的語句;否則,就執(zhí)行default后面的語句。(7)關(guān)鍵字default并不是必須的,如果沒有default,當(dāng)所有case后面的常量表達(dá)式值都沒有與switch后圓括號(hào)表達(dá)式值相等時(shí),則什么也不執(zhí)行,直接退出swtich語句。(8)多個(gè)可以共用一組執(zhí)行語句。(9)關(guān)鍵字break一般不能省略。它的作用是使程序執(zhí)行某一個(gè)case分支后,使流程跳出switch結(jié)構(gòu),終止switch語句的執(zhí)行;若break省略,程序向下一行繼續(xù)執(zhí)行,不跳出switch語句體。503.4.2switch語句switch語句的一般使用形式:switch(表達(dá)式){case常量表達(dá)式1:語句1case常量表達(dá)式2:語句2

┇case常量表達(dá)式n:語句ndefault:語句n+1}break;break;break;513.4.2switch語句switch語句的一般使用形式:如果沒有break,流程圖又是什么樣呢?523.4.2switch語句【例3.9】學(xué)校按總評(píng)分?jǐn)?shù)(設(shè)定為0到100分范圍)把學(xué)生學(xué)期成績(jī)分成五等,90分及以上為A,80到89分為B,70到79分為C,60到69分為D,分?jǐn)?shù)低于60分為E。編程實(shí)現(xiàn)從鍵盤輸入一個(gè)學(xué)生總評(píng)分?jǐn)?shù),輸出其對(duì)應(yīng)等級(jí)。編程實(shí)現(xiàn)從鍵盤輸入一個(gè)學(xué)生總評(píng)分?jǐn)?shù),輸出其對(duì)應(yīng)等級(jí)(用switch語句實(shí)現(xiàn))。53voidmain(){intm;printf("Pleaseinputmark:");scanf("%d",&m);switch(m/10){case10:printf("A\n");break;case9:printf("A\n");break;case8:printf("B\n");break;case7:printf("C\n");break;case6:printf("D\n");break;default:printf("E\n");}}case10:case9:printf("A\n");break;Pleaseinputmark:100↙A3.4.2switch語句【例3.10】鍵盤輸入年號(hào)和月份,輸出該月的天數(shù)。

分析:(1)根據(jù)公歷,每年的1、3、5、7、8、10和12月份每月都有31天;4、6、9和11月份每月都有30天。2月平年有28天,閏年有29天??梢钥闯鲞@是一個(gè)多分支選擇問題,可以利用switch語句來解決。(2)可以設(shè)置變量year,month,days來分別表示年、月、當(dāng)月天數(shù)。還可以設(shè)置一個(gè)標(biāo)記flag,判斷當(dāng)年是否為閏年。(3)先判斷年號(hào)是否為閏年,可參見例題3.8。再利用swtich語句,進(jìn)入多分支選擇。55voidmain(){intyear,month,days,flag;printf("Pleaseinputyear:");scanf("%d",&year);printf("Pleaseinputmonth:");scanf("%d",&month);if(year%400==0)flag=1;//flag為1表示是閏年else{if(year%4==0&&year%100!=0) flag=1; else flag=0;//flag為0表示非閏年}

判斷是否為閏年。switch(month){case1:case3:case5:case7:case8:case10:case12:days=31;break;case4:case6:case9:case11:days=30;break;case2: {if(flag==1)days=29; elsedays=28;}break;default:printf("monthinputerror\n");}printf("%d年%d月份有%d\n",year,month,days);}

根據(jù)具體月份,給當(dāng)月天數(shù)賦值根據(jù)閏年還是平年,來判斷2月份的天數(shù)3.4.3程序應(yīng)用舉例【例3.11】某城市為鼓勵(lì)節(jié)約用水,對(duì)居民用水量作如下規(guī)定:若一戶居民每月用水量不超過30噸(含30噸),則按每噸0.6元收費(fèi);若大于30噸但不超過50噸(含50噸),則其中30噸按0.6元收費(fèi),剩余部分按每噸0.9元收費(fèi);若超過50噸,則不超過50噸的部分按前面方法收費(fèi),剩余部分按每噸1.5元收費(fèi)。程序?qū)崿F(xiàn)輸入一戶居民的月用水量,輸出應(yīng)繳納的水費(fèi)。分析:(1)聲明d,用于存放用水量;聲明m,用于計(jì)算水費(fèi)。(2)根據(jù)不同的用水量,確定出不同的水費(fèi)計(jì)算公式。(3)計(jì)算出相對(duì)應(yīng)的水費(fèi)。583.4.3程序應(yīng)用舉例59#include<stdio.h>voidmain(){

doubled,m;scanf("%lf",&d);

if(d<=30) m=d*0.6;

else

if(d<=50) m=30*0.6+(d-30)*0.9;

else

m=30*0.6+20*0.9+(d-50)*1.5;printf("水費(fèi)為%.2lf元",m);}

有沒有必要寫成這樣呢?

else

if(d>30&&d<=50)沒有!3.4.3程序應(yīng)用舉例【例3.12】某銷售公司員工月收入為底薪加當(dāng)月銷售業(yè)績(jī)(設(shè)為整數(shù)元)提成。底薪900元,具體提成如下表:銷售業(yè)績(jī)(元)提成比例<500005000~999910%10000~1999913%20000~3999915%>=4000018%除以5000的商012,34,5,6,7>=8613.4.3程序應(yīng)用舉例62voidmain(){

intprofit,p;doublesalary;salary=900;printf("請(qǐng)輸入當(dāng)月銷售業(yè)績(jī):");scanf("%d",&profit);p=profit/5000;switch(p){case0:break; case1:salary+=profit*0.1;break; case2: case3:salary+=profit*0.13;break; case4:case5:case6: case7:salary+=profit*0.15;break;

default:salary+=profit*0.18;}printf("本月收入為%.2lf元\n",salary);}3.5循環(huán)結(jié)構(gòu)什么是循環(huán)?為什么要使用循環(huán)?問題:如果以前所學(xué)的知識(shí),怎么解呢?步驟1:先求1加2,得到結(jié)果3步驟2:將步驟1得到的和3再加3,得到結(jié)果6步驟3:將6再加4,得10步驟4:將10再加5,得15

…步驟99:將步驟98得到的和4950再加100,得到結(jié)果5050

那有沒有更簡(jiǎn)便的方法呢?643.5循環(huán)結(jié)構(gòu)步驟1:使y=1;步驟2:使i=2;步驟3:使y+i,和仍放在變量y中,可表示為:y=y+i;步驟4:使i的值加1,即i=i+1。步驟5:如果i不大于(小于等于)100,返回重新執(zhí)行步驟S3以及其后的步驟S4和S5;否則,算法結(jié)束。算法改進(jìn)如下:如果要計(jì)算1000653.5循環(huán)結(jié)構(gòu)循環(huán)的概念現(xiàn)實(shí)生活中許多問題是需要重復(fù)處理計(jì)算一個(gè)班50學(xué)生每人的平均成績(jī)工廠各車間的生產(chǎn)日?qǐng)?bào)表全國(guó)各省市的人口統(tǒng)計(jì)分析各大學(xué)招生情況統(tǒng)計(jì)全校教職工工資報(bào)表絕大多數(shù)的應(yīng)用程序都包含重復(fù)處理663.5循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)又稱為重復(fù)結(jié)構(gòu)循環(huán)結(jié)構(gòu)和順序結(jié)構(gòu)、選擇結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu),它們是各種復(fù)雜程序的基本構(gòu)造單元要構(gòu)成一個(gè)有效的循環(huán),應(yīng)指定兩個(gè)條件:(1)需要重復(fù)執(zhí)行的操作,這稱為循環(huán)體(2)循環(huán)結(jié)束的條件,即在什么情況下停止重復(fù)的操作實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語句:while、do…while、for語句

673.5循環(huán)結(jié)構(gòu)3.5.1while語句3.5.2do_while語句3.5.3for語句3.5.4幾種循環(huán)的比較3.5.5循環(huán)的嵌套3.5.6程序舉例683.5.1while語句一、一般形式:

while(表達(dá)式)

語句

二、執(zhí)行過程:

先計(jì)算表達(dá)式的值,如果為真,執(zhí)行循環(huán)體,然后繼續(xù)計(jì)算表達(dá)式的值,如果為真,再執(zhí)行循環(huán)體,如此重復(fù)。當(dāng)表達(dá)式的值為假時(shí),退出該循環(huán)語句。循環(huán)體循環(huán)條件不能省略關(guān)鍵字693.5.1while語句三、流程圖:四、特點(diǎn):

先判斷,后執(zhí)行。

請(qǐng)看一個(gè)例子Y表達(dá)式語句N70【例3.11】求1+2+…+100的,即。Nsum=0;i=1;Yi<=100sum=sum+i;i++;#include<stdio.h>voidmain(){inti,sum;i=1,sum=0;

while(i<=100){sum=sum+i;i++;}printf("sum=%d\n",sum);}運(yùn)行結(jié)果:sum=5050循環(huán)條件循環(huán)體不能省略3.5.1while語句五、注意事項(xiàng):(1)循環(huán)體如果包含一個(gè)以上的語句,應(yīng)該用花括弧括起來,以復(fù)合語句形式出現(xiàn)。(2)循環(huán)體可能一次也不執(zhí)行。(3)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。

在上例中,循環(huán)結(jié)束的條件是i>100,使循環(huán)趨于結(jié)束的語句是i++;

723.5.1while語句【例3.14】輸入兩個(gè)正整數(shù)a、b,求它們的最大公約數(shù)。方法一:最大公約數(shù)定義法。分析:根據(jù)最大公約數(shù)的定義,a、b兩個(gè)數(shù)的最大公約數(shù)s一定是介于1到a之間的一個(gè)數(shù),不會(huì)大于a;且能同時(shí)被a和b整除。(1)先假設(shè)a、b的最大公約數(shù)為a,即s=a。(2)如果a或b中有一個(gè)數(shù)不能被s整除,即a%s!=0或b%s!=0,說明s不是公約數(shù),執(zhí)行(3);否則,執(zhí)行(4)。(3)判斷比s小1的數(shù)是否是a和b的公約數(shù)。即執(zhí)行s=s-1后再返回(2)。(4)退出while循環(huán),輸出s。73#include<stdio.h>voidmain(){

inta,b,s;printf("Pleaseinputtwopositivenumber:");scanf("%d%d",&a,&b);s=a;while(a%s!=0||b%s!=0){s=s-1;}printf("最大公約數(shù)是%d\n",s);

}此處可以省略循環(huán)條件循環(huán)體Pleaseinputtwopositivenumber:1227↙最大公約數(shù)是33.5.1while語句方法二:輾轉(zhuǎn)相除法。分析:當(dāng)b不等于0時(shí),重復(fù)執(zhí)行運(yùn)算c=a%b,a=b,b=c消除相同的因子,直到b為0時(shí),a即為所求的解。例如:a=18,b=27(1)首先b不為0,執(zhí)行c=a%b;a=b;b=c;之后,a=27,b=18,c=9。(2)b=9不為0,執(zhí)行c=a%b;a=b;b=c;之后,a=18,b=9,c=9。(3)b=9不為0,繼續(xù)執(zhí)行c=a%b;a=b;b=c;之后,a=9,b=0,c=0。(4)b=0,結(jié)束。此時(shí),a=9即為18和27的最大公約數(shù)。76#include<stdio.h>voidmain(){inta,b,c;printf("Pleaseinputtwopositivenumber:");scanf("%d%d",&a,&b);while(b!=0){ c=a%b; a=b; b=c;}printf("最大公約數(shù)是%d\n",a);}此處不能省略循環(huán)條件循環(huán)體Pleaseinputtwopositivenumber:1624↙最大公約數(shù)是83.5.2do-while語句do-while語句的特點(diǎn):先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。一般形式為:

do{

循環(huán)體語句

}while(表達(dá)式);循環(huán)體,“{”和“}”一般不能省略,只有循環(huán)體語句只有一個(gè)語句時(shí)可省略,建議都不省略。循環(huán)條件不能省略不能省略783.5.2do-while語句執(zhí)行過程:先執(zhí)行一次指定的循環(huán)體語句,然后判別表達(dá)式,當(dāng)表達(dá)式的值為非零(“真”)時(shí),返回重新執(zhí)行循環(huán)體語句,如此反復(fù),直到表達(dá)式的值等于0為止,此時(shí)循環(huán)結(jié)束。do-while與while語句的區(qū)別:do-while循環(huán)語句先執(zhí)行循環(huán)體一次,再判斷循環(huán)條件。因而do-while語句的循環(huán)體至少執(zhí)行一次;而while循環(huán)語句不一定會(huì)執(zhí)行循環(huán)體。表達(dá)式非0(真)0(假)循環(huán)體語句793.5.2do-while語句【例3.15】求1+2+…+100的和(用do-while語句實(shí)現(xiàn))。i≤100非0(真)0(假)sum=sum+ii=i+1sum=0i=180#include<stdio.h>voidmain(){

inti,sum;i=1;sum=0;do{ sum=sum+i; i++;}while(i<=100);printf("sum=%d\n",sum);}運(yùn)行結(jié)果:sum=50503.5.2do-while語句while和do-while循環(huán)的比較:凡是能用while循環(huán)處理,都能用do…while循環(huán)處理。do…while循環(huán)結(jié)構(gòu)可以轉(zhuǎn)換成while循環(huán)結(jié)構(gòu)。do-while語句可以看成是由一個(gè)復(fù)合語句加上一個(gè)while結(jié)構(gòu)構(gòu)成的。

在一般情況下,用while語句和用do-while語句處理同一問題時(shí),若二者的循環(huán)體部分是一樣的,它們的結(jié)果也一樣。但是如果while后面的表達(dá)式一開始就為假(0值)時(shí),兩種循環(huán)的結(jié)果是不同的。82【例3.16】分別用while和do-while實(shí)現(xiàn)求n+(n+1)+…10的和。鍵盤輸入不同的n,觀察輸出結(jié)果。/*while語句實(shí)現(xiàn)*/#include<stdio.h>voidmain(){intn,sum=0;printf("n=");scanf("%d",&n);while(n<=10){ sum=sum+n; n++;}printf("sum=%d\n",sum);}/*do-while語句實(shí)現(xiàn)*/#include<stdio.h>voidmain(){ intn,sum=0; printf("n="); scanf("%d",&n); do { sum=sum+n; n++; }while(n<=10); printf("sum=%d\n",sum);}/*while語句實(shí)現(xiàn)*/運(yùn)行結(jié)果:1↙sum=55再運(yùn)行一次:11↙sum=0/*do-while語句實(shí)現(xiàn)*/運(yùn)行結(jié)果:1↙sum=55再運(yùn)行一次:11↙sum=11說明:當(dāng)while后面的表達(dá)式的第一次的值為“真”時(shí),兩種循環(huán)得到的結(jié)果相同。否則,結(jié)果不相同。3.5.3for語句C語言中的for語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語句。一般形式:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

{循環(huán)體}設(shè)置初始條件,只執(zhí)行一次??梢詾榱銈€(gè)、一個(gè)或多個(gè)變量設(shè)置初值。循環(huán)條件表達(dá)式,用來判定是否繼續(xù)循環(huán)。在每次執(zhí)行循環(huán)體前先執(zhí)行此表達(dá)式,決定是否繼續(xù)執(zhí)行循環(huán)。對(duì)循環(huán)變量進(jìn)行修改,使循環(huán)趨于結(jié)束,它是在執(zhí)行完循環(huán)體后才進(jìn)行的。843.5.3for語句for語句的執(zhí)行過程:(1)先求解表達(dá)式1。(2)計(jì)算表達(dá)式2。若表達(dá)式2的值為真(非0),則執(zhí)行(3);若表達(dá)式2的值為假(值為0),則執(zhí)行(5)。(3)執(zhí)行循環(huán)體語句。(4)執(zhí)行表達(dá)式3,然后返回(2)。(5)for循環(huán)結(jié)束,執(zhí)行循環(huán)結(jié)構(gòu)后面的語句。853.5.3for語句for語句最簡(jiǎn)單的形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)

for(i=1;i<=100;i++)sum=sum+i;等價(jià)于i=1;while(i<=100){sum=sum+i;i++; }用for語句更簡(jiǎn)單、方便863.5.4幾種循環(huán)的比較循環(huán)結(jié)構(gòu)語句都由循環(huán)變量賦初值、循環(huán)條件、循環(huán)體、循環(huán)變量改變語句這四個(gè)要素組成。

(1)for語句的一般形式中的“表達(dá)式1”可以省略,但此時(shí)一般應(yīng)在for語句之前給循環(huán)變量賦初值。注意,省略表達(dá)式1時(shí),其后的分號(hào)不能省略。例如:i=1;

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

執(zhí)行時(shí),跳過“求解表達(dá)式1”這一步,其他不變。873.5.4幾種循環(huán)的比較

(2)for語句的一般形式中“表達(dá)式3”也可以省略,但此時(shí)要設(shè)法保證循環(huán)能正常結(jié)束。例如:

i=1;for(;i<=100;){sum=sum+i;i++;}執(zhí)行時(shí),跳過“求解表達(dá)式1”和“求解表達(dá)式3”這一步,其它不變。跳過“求解表達(dá)式3”,不是說每次循環(huán)中改變循環(huán)變量的值這一步可以省略;而是在這里的for循環(huán)體中,已經(jīng)用“i++;”語句改變了循環(huán)變量的值。相當(dāng)于i=1;while(i<=100){sum=sum+i;i++; }883.5.4幾種循環(huán)的比較(3)在用while和do-while循環(huán)之前,一般要先對(duì)循環(huán)變量先賦初值。也就是說,循環(huán)變量的初始化操作一般是在while和do-while語句之前完成;而for循環(huán)的循環(huán)變量初始化一般是用表達(dá)式1實(shí)現(xiàn)。(4)while和for屬于“當(dāng)型”循環(huán),即先判斷循環(huán)條件,后執(zhí)行循環(huán)體;do-while屬于“直到型”循環(huán),即先執(zhí)行循環(huán)體一次,再判斷循環(huán)條件。893.5.5循環(huán)的嵌套一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)3種循環(huán)(while循環(huán)、do…while循環(huán)和for循環(huán))可以互相嵌套內(nèi)循環(huán)必須完整地嵌套在外循環(huán)內(nèi),兩者不允許交叉。一般情況下,嵌套循環(huán)變量不允許同名,即各層循環(huán)的循環(huán)變量名稱不能相同。903.5.5循環(huán)的嵌套下面幾種都是合法的形式:(1)

while()(2)do(3)for(;;){…{…{…

while()dofor(;;){…}{…{…}…}while();…}}while();}(4)

while()(5)for(;;)(6)do{…{…{…

dowhile()for(;;){…{…}{…}}while();……}}}while();913.5.5循環(huán)的嵌套【例3.18】輸出5行,每行都輸出1,2,3,4,5五個(gè)數(shù)字。分析:可以用一個(gè)循環(huán)語句,實(shí)現(xiàn)輸出5個(gè)數(shù)字。然后再把這個(gè)工作重復(fù)5次,即在這個(gè)循環(huán)外面加一個(gè)循環(huán)即可。用循環(huán)語句,實(shí)現(xiàn)輸出5個(gè)數(shù)字:for(j=1;j<=5;j++) {printf("%d",j); }然后讓這段代碼重復(fù)執(zhí)行5次就可以了。92#include<stdio.h>voidmain(){

inti,j;

for(i=1;i<=5;i++)

{

for(j=1;j<=5;j++)

{printf("%d",j);

}printf("\n");

}

}

外循環(huán)內(nèi)循環(huán)每輸出完5個(gè)數(shù)后換一行循環(huán)體語句重復(fù)執(zhí)行5次也可用while語句現(xiàn),但用for語句更簡(jiǎn)潔。3.5.6程序舉例【例3.19】打印輸出九九乘法表。1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=103*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=143*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81123456789

123456789最多9列9行943.5.6程序舉例分析:(1)打印九九乘法表的格式:要求打印九行,可用for循環(huán)結(jié)構(gòu)語句實(shí)現(xiàn),循環(huán)變量設(shè)為i。主要程序段如下:inti;for(i=1;i<=9;i++){/*打印第i行*//*打印換行*/}printf("\n");

重點(diǎn)是這個(gè)如何實(shí)現(xiàn)?953.5.6程序舉例(2)打印第i行:每行打印的個(gè)數(shù)不同,第i行打印i個(gè),用for循環(huán)結(jié)構(gòu)語句實(shí)現(xiàn)每行打印的個(gè)數(shù),設(shè)循環(huán)變量為j。主要程序段如下:intj;for(j=1;j<=i;j++){/*打印第i行的第j個(gè)乘法運(yùn)算表達(dá)式*/}第i行有i列

printf("%d*%d=%d",j,i,j*i);

963.5.6程序舉例(3)將打印第i行嵌入到打印九行中,結(jié)果如下:inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++) {/*打印第i行的第j個(gè)乘法運(yùn)算表達(dá)式*/ } /*打印換行*/}97#include<stdio.h>voidmain(){

inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d",j,i,j*i);} printf("\n");}}循環(huán)打印九行循環(huán)打印i列3.5.6程序舉例【例3.20】為使電文保密,往往按一定規(guī)律將其轉(zhuǎn)換成密碼,收?qǐng)?bào)人再按約定的規(guī)律將其譯回原文。程序?qū)崿F(xiàn)將輸入的一個(gè)小寫字母單詞轉(zhuǎn)換成密文輸出。例如,將字母b變成字母f,即變成其后的第4個(gè)字母,u變成y,z變成d,如,“hello”經(jīng)過加密就變成“l(fā)ipps”。abcdefg……wxyz993.5.6程序舉例分析:(1)判斷輸入的字符是否為小寫字母(2)從字母a到v,只需將字母加上4就行例如,’a’+4就是’e’(3)從字母w到z,將字母加4,再減去26’w’+4-26就是’a’100#include<stdio.h>voidmain(){

charc;while((c=getchar())!='\n'){if(c>='a'&&c<='z') {c=c+4; if(c>'z')c=c-26; }printf("%c",c);}printf("\n");}不斷輸入字符,直到輸入一個(gè)“換行”為止加密處理if(c>='a'&&c<=‘v')c=c+4;elsec=c+4-26;3.5.6程序舉例分析:設(shè)變量n用來存入人數(shù),它的可能取值應(yīng)該是1—99,所以令初值為1。什么樣的n才符合條件呢?

條件:n%3==2&&n%5==3&&n%7==5

【古典問題之:韓信點(diǎn)兵】

有一隊(duì)不足百人的隊(duì)伍,三三數(shù)之余2,五五數(shù)之余3,七七數(shù)之余5,問人有幾何?♀

♀♀♀♀

♀♀♀♀

♀♀

♀♀♀♀♀♀

♀♀♀♀♀♀

♀♀♀102Yn=1;n<100NY輸出nN符合條件?n=n+1;流程圖如下所示:#include<stdio.h>voidmain(){intn;n=1;

while(n<100){

if(n%3==2&&n%5==3&&n%7==5)

printf("N=%d\n",n);n=n+1;}}

運(yùn)行結(jié)果:N=68循環(huán)體循環(huán)條件隊(duì)伍人數(shù)條件3.5.6程序舉例分析:定義一個(gè)變量n——100…999,令初值為100;什么樣的n才符合條件呢?

條件:百位:a=n/100;十位:b=n/10%10;個(gè)位:c=n%10;【古典問題之:水仙花數(shù)問題】

輸出所有的水仙花數(shù),所謂“水仙花數(shù)”,是指一個(gè)3位數(shù),其各位數(shù)字的立方和等于該數(shù)本身。例如,153是一個(gè)水仙花數(shù),因?yàn)?53=。a*a*a+b*b*b+c*c*c==n

104流程圖如下所示:Yn=100;a=n/100;b=n/10%10;c=n%10;a*a*a+b*b*b+c*c*c==n輸出nn=n+1;n<1000YNN#include<stdio.h>voidmain(){intn,a,b,c;for(n=100;n<1000;n++){a=n/100;b=n/10%10;c=n%10;

if(a*a*a+b*b*b+c*c*c==n)printf("%5d",n);}}運(yùn)行結(jié)果:

153370371407

循環(huán)體循環(huán)條件水仙花數(shù)條件3.5.6程序舉例分析:設(shè)公雞、母雞和小雞分別購(gòu)買x、y、z只。則有方程:x+y+z=100和5x+3y+z/3=100,其中發(fā)現(xiàn)有3個(gè)未知數(shù)兩個(gè)方程,按照通常解法是無法求解的。但是知道,x、y、z都是不大于100的正整數(shù),因此它們的組合是有限的。不妨用計(jì)算機(jī)來窮舉出所有的組合,輸出滿足條件要求的組合就可以得到結(jié)果了。【古典問題之:百錢百雞問題】

公元前5世紀(jì),我國(guó)數(shù)學(xué)家張丘建在《算經(jīng)》一書中提出了一個(gè)“百錢買百雞問題”,問題如下:公雞5錢一只,母雞3錢

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論