C語言編程循環控制_第1頁
C語言編程循環控制_第2頁
C語言編程循環控制_第3頁
C語言編程循環控制_第4頁
C語言編程循環控制_第5頁
已閱讀5頁,還剩57頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

循環結構程序設計小故事:軍訓結束后,逸凡和同學們開始正式上課了。拿到校歷一看,發現本學期一共21周,前4周軍訓,第5至20周上課,第21周考試。上課時,一周24節課,其中周一6節課,大學英語,高等數學,思想道德修養與法律基礎;周二4節課,信息技術基礎,體育;周三6節課,大學英語,高等數學,中國近現代史綱要;周四4節課,信息技術基礎,大學語文;周五4節課,大學英語,線性代數。用C語言來完成上課任務。23#include<stdio.h>voidmain(){ inti; printf("輸出上課任務!/n"); printf("第1-4周軍訓/n"); for(i=5;i<=20;i=i+1) { printf(“-------第%d周上課任務-------\n",i); printf("星期一:大學英語,高等數學,思想道德修養與法律基礎\n"); printf("星期二:信息技術基礎,體育\n"); printf("星期三:大學英語,高等數學,中國近現代史綱要\n"); printf("星期四:信息技術基礎,大學語文\n"); printf("星期五:大學英語,線性代數\n"); } printf("第21周考試/n");}引例使用銀行卡取款,當密碼重復三次輸入錯誤,將會禁止再次輸入,凍結卡的使用。如何用程序實現?4#include"stdio.h"intmain(){intpsw,n=0;printf("請輸入密碼:\n");while(n<3){scanf("%d",&psw); if(psw==123) { printf("歡迎\n"); break;}else{ n++; if(n==3)printf("3次輸入錯誤,您的賬戶將被凍結\n");elseprintf("密碼錯誤,請重新輸入:\n } }return0;}55.1循環結構6為解決某一問題,或求取某一計算結果,特定的條件下,程序中反復按某一模式進行操作。輸入50個學生的成績求30個整數之和檢查50個學生的成績是否及格求30天的平均花銷設計循環結構要點

需要重復哪些的步驟,即循環體中的操作;需要合理設計循環條件,使循環不無限次執行;修改循環條件,使循環條件的值趨近0。5.1循環結構設計循環結構需考慮:

循環體的算法?-重復執行的部分

循環的條件、循環結束條件?-循環的終止

如何修改循環條件?-使循環趨于結束75.1循環結構while(表達式)

{語句;}do{

語句;}while(表達式);for(表達式1;表達式2;表達式3)

{ 語句;}85.2while語句0語句非0表達式9

語句形式

–當型循環while(表達式

){

循環體;

}邏輯表達式決定是否執行循環體表達式值為邏輯true則執行循環體重復執行的操作直至表達式的值為false例:while語句,求1+2+3+...+100。main(){inti,sum=0;i=1;while(i<=100)

{sum=sum+i;

i++;

}printf(“%d\n”,sum);}i=1;sum=0;sum=sum+i;i++;假真i<=10010i=0;i++;sum=sum+i;99)循環條件?循環結束條件?修改循環條件?例輸出10個*號非0i<=10打印星號0i++;#include<stdio.h>main(){inti;i=1;/*循環控制初值*/while(i<=10)/*{循環體}*/{printf(“*”);i++;/*邏輯表達式值可變*/}}分析:偶數和放在even中,even=2+4+6…+100;奇數和放在odd中,odd=1+3+5+…+99;計數器n初值=1.while(n<100){odd=odd+n;even=even+(n+1);n=n+2}例求100以內的奇偶數之和。5.3do-while語句do-while

語句用來實現“直到型”循環結構。一般形式:do{循環體}while(表達式);

循環體語句表達式真假流程圖13do-while語句至少執行一次循環體。

執行過程:先執行一次指定的“循環體語句”,然后判別“表達式”,當“表達式”的值為非0時,返回重新執行“循環體語句”,如此反復,直到表達式的值等于0為止,此時循環結束。即do-while語句至少執行一次循環體。注意:⑴當“語句”部分包含一個以上的語句時,應該用復合語句"{}"的形式;⑵在循環體中應有使循環趨于結束的語句。14例:

用do-while循環語句求1+2+3+...+100。main(){inti,sum=0;i=1;do{sum=sum+i;

i++;}while(i<=100);printf("%d\n",sum);}

i=1;sum=0;

sum=sum+i;

i++;i<=100

真假15do-while

語句的while語句后要加“;”。while語句可能一次也不執行循環體,但do-while語句至少執行一次循環體。對于同一個問題,既可以用while語句,也可以用do-while語句處理。do-while結構可以轉換成while結構。說明:16在一般情況下,用while語句和用do-while處理同一問題時,若二者的循環體部分是一樣的,它們的結果也一樣。 但是如果while后面的表達式一開始就為假(0),兩種循環的結果是不同的。 亦即當while后面的表達式第一次的值為真(非0)時,兩種循環得到的結果相同。否則結果不同。17(2)main(){intsum=0,i;scanf("%d",&i);do

{sum=sum+i; i++;}while(i<=10);printf("%d",sum);}

(1)main(){intsum=0,i; scanf(“%d”,&i); while(i<=10)

{sum=sum+i; i++; }

printf(“%d”,sum);}12sum=0(2)sum=121sum=5518例任意輸入一個整數,將該數各位倒序輸出。程序一:用while語句實現

此程序輸入為0時沒有輸出main(){intnumber,digit;printf("pleaseinputdata:");scanf("%d",&number);

while(number!=0){digit=number%10;printf("%d",digit);number=number/10;}}main(){intnumber,digit;printf("pleaseinputdata:");scanf("%d",&number);do{digit=number%10;printf("%d",digit);number=number/10;}while(number!=0);}此程序輸入為0時仍有輸出程序二:用do-while語句實現5.4for語句

for

語句既可用于循環次數已經確定的情況,也可用于循環次數不確定而只給出循環結束條件的情況,它完全可以代替while語句。一般形式:for(表達式1;表達式2;表達式3)

語句21執行過程:1.求解表達式1;

2.求解表達式2:如果值為真(非0),則執行“語句”部分;如果值為假(0),則結束循環;

3.當表達式2為真時,在執行了“語句”部分后,求解表達式3;

4.轉到第2步繼續執行。說明:當“語句”部分包含一個以上的語句時,應該用復合語句“{}”

的形式。for(表達式1;表達式2;表達式3)

語句22for語句最常用的形式:for(循環變量賦初值;循環結束條件;循環變量增值)

語句main(){inti,sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("%d",sum);}例:用for語句構成循環,求1+2+3+...+100。23for循環語句也可以寫為while語句形式:for(表達式1;表達式2;表達式3)

語句表達式1;while(表達式2){

語句;表達式3;}

for(i=1;i<=100;i++) sum=sum+i;i=1;while(i<=100){sum=sum+i;i++;}24如果“表達式2”省略,即不判斷循環條件,則認為表達式2始終為真,此時循環無法終止(死循環)。

for(i=1;;i++) sum+=i;說明:若循環變量在for語句之前已經賦初值,則for語句的一般形式中的“表達式1”可以省略,但是“;”不能省略。例如:i=1; for(;i<=100;i++)sum+=i;25如果“表達式3”省略,則程序中必須有保證循環能正常結束的措施。

for(i=1;i<=100;){ sum+=i;i++;} 可以省略表達式1和表達式3,只有表達式2,即只給循環條件。

此時,for語句完全等同于while語句。可見for語句比while語句功能強,除了可以給出循環條件外,還可賦初值,使循環變量自動增值等。for(;i<=100;){sum=sum+i;i++;}

while(i<=100){sum=sum+i;i++;}26三個表達式都省略,如for(

;;

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

i=1; for(sum=0;i<=100;i++)sum=sum+i;277.“表達式1”和“表達式3”可以是一個簡單的表達式,也可以是逗號表達式。

例如: for(sum=0,i=1;i<=100;i++) sum=sum+i; for(i=1,j=100;i<=j;i++,j--) k+=i+j;在逗號表達式內按自左至右順序求解,整個逗號表達式的值為其中最右邊的表達式的值。

for(sum=0,i=1;++i,i<=100;) sum=sum+i;相當于for(sum=0,i=1;i<=100;++i) sum=sum+i;28“表達式2”一般是關系表達式或邏輯表達式,但也可以是數值表達式或字符表達式,只要其值非0,就執行循環體。分析:for(i=0;(c=getchar())!='\n';i+=c);for(;(c=getchar())!='\n'

;) putchar(c);

9.由于for語句功能很強,盡量按for語句的規范來寫,也盡量不要把與循環控制無關的內容放到for語句中。29for(循環變量賦初值;循環結束條件;循環變量增值)

語句i<=nni=1m=m*ii=i+1ym=1開始結束輸出m輸入n分析:用m表示乘積,m=n!=1*2*……*n算法:置初值:m1計算積:mm*1; mm*2; …… mm*n;用i表示乘數,一般形式為:mm*i例:分別用while、do-while、for循環語句求n!。30i<=nni=1m=m*ii=i+1ym=1開始結束輸出m輸入n#include"stdio.h"voidmain(){unsignedi,m,n;scanf("%u",&n);m=1;i=1;while(i<=n){m=m*i;i++;}printf("%d",m);}while#include"stdio.h"voidmain(){unsignedi,m,n;scanf("%u",&n);m=1;i=1;do{m=m*i;i++;}while(i<=n);

printf("%d",m);}do-while源程序:#include"stdio.h"voidmain(){unsignedi,m,n;scanf("%u",&n);m=1;

for(i=1;i<=n;i++)m=m*i;printf("%d",m);}for3132例.求10個數的最小值。#include<stdio.h>main(){ floatx;inti;floatmin; printf("輸入第1個數:"); scanf("%f",&x); min=x;

for(i=2;i<=10;i++)

{

printf("輸入第%d個數:",i); scanf("%f",&x);

if(x<min)min=x;

}

printf("最小值=%f\n",min);}例:打印出所有的“水仙花數”,所謂“水仙花數”是指一個三位數,其各位數字立方和等于該數本身。例如:153是一個“水仙花數”,因為153=13+53+33。分析:從小到大開始循環遍歷所有的三位數,每個數分解出個、十、百位,若各位數字立方和等于該數本身,則打印,否則繼續判斷下一個三位數。3334main(){inti,j,k,n;printf("'水仙花數有:");

for(n=100;n<1000;n++)

{

i=n/100;/*分解出百位*/

j=n/10%10;/*分解出十位*/

k=n%10;/*分解出個位*/

if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)

printf("%-5d",n);}printf("\n");}5.6循環的嵌套355.6循環的嵌套三種循環可以互相嵌套。一個循環體內又包含另一個完整的循環結構時,稱為循環的嵌套。內嵌的循環中還可以嵌套循環,即循環嵌套可以多于一層,這就是多層循環嵌套。(1)while(){ … while(){…} …}(2)do{ … do{…} while(); …}while()(3)for(;;){ … for(;;){…} …}36(4)while(){ … do{…} while(); …}(5)do{ … while(){…} …}while()(6)for(;;){ … while(){…} …}(7)while(){ …for(;;){…} …}(8)do{ … for(;;){…} …}while()(9)for(;;){ … do{…} while(); …}37注意:1.三種循環可互相嵌套,層數不限,每層可有多個循環嵌套但不能相互交叉。2.嵌套的循環控制變量不能相同。3.內循環變化快,外循環變化慢;外循環每執行一次循環體,內循環要完整執行一遍。4.正確確定循環體。38例:屏幕輸出9*9乘法口訣表。分析:分行與列考慮,共9行9列,i控制行,j控制列。一般二維表格可以用雙重循環處理。#include"stdio.h"voidmain(){inti,j;printf("\n");

for

(i=1;i<10;i++){

for(j=1;j<10;j++) printf("%d*%d=%-3d",i,j,i*j);

printf(“\n”);/*被乘數變換時換行*/}}-3d表示左對齊,占3位395.7幾種循環的比較

三種循環結構(while、do-while、for)三種循環都可以處理同一問題,一般情況下它們可以互相代替。while和do-while循環,在while后面指定循環條件,而使循環趨于結束的語句包含在循環體中。

for循環可以在“表達式3”中包含使循環趨于結束的操作,甚至可以將循環體中的操作全部放到“表達式3”中。40用while和do-while循環時,循環變量初始化應在while和do-while之前,for循環可以在“表達式1”中實現循環變量的初始化。while循環先判斷,后執行;

do-while循環先執行,后判斷;

for循環先判斷,后執行。對while循環、do-while循環、for循環,可以用break語句跳出循環,還可以用continue語句結束本次循環。4142while語句多用于循環次數不定的情況do-while語句多用于至少要運行一次的情況for語句多用于要賦初值或循環次數固定的情況小故事上課一周下來,英語老師發現個別同學整天躲在宿舍里打游戲,逃課次數太多,非常生氣,決定警告他們,如果誰在第7周逃英語課,以后的課就別上了,沒有資格參加英語考試。這時,可以用break語句來解決這個問題。43while(周數小于等于20){輸出請參加英語學習;如果第7周逃課break;輸出參加英語學習的時間;}44

5.7改變循環執行的狀態5.8.1break語句-強制結束循環

break語句除了可以用來跳出switch結構之外,還可以用來從循環體內跳出循環,即提前結束循環,接著執行循環下面的語句。如當r=6時,area大于100,這時執行break語句,提前結束循環,即不再繼續執行其余的幾次循環。if(area>100)break;for(r=1;r<=10;r++){ area=pi*r*r;

printf("%f\n",area);

}r=1,area=3.14r=2,area=12.56r=3,area=28.26r=4,area=50.24r=5,area=78.5r=6,area=113.0446break語句的一般形式:break;注意:break語句只能用于循環語句和switch語句,不能用于其它語句。小故事逸凡和同學們上完了一周的課,感覺十分輕松,發現大學里好多下午沒有課,可以自己看看書,玩玩。10月1日,國慶節放假一周。10月1日是星期四,星期三下午開始放假。哪知道,星期三下午還有2節課。如果上下午的課再回家,可能就沒有車了。逸凡思鄉心切,祈禱老師這次上課不點名,決定冒險逃掉星期三下午的課,中午準備行李就回家。4748#include<stdio.h>voidmain(){ intTaokeWeek=6; intweek; for(week=5;week<=20;week++) { printf("逸凡上第%d周星期三上午的課/n",week); if(week==TaokeWeek)continue;/*強制繼續循環,下面的語句不執行*/

printf("逸凡上第%d周星期三上午的課/n",week);

}}5.8.2continue語句語句的一般形式:continue;

作用:結束本次循環,即跳過循環體中continue之后的其它語句,轉到循環體結束點之前。voidmain(){intn=100;for(;n<=200;n++){if(n%3==0)

continue;printf("%d\n",n);}}例:輸出100--200之間的不能被3整除的數。voidmain(){intn=100;while(n<=200){if(n%3==0)

continue;printf("%d\n",n);n++;}}×voidmain(){intn=99;while(n<200){

n++;if(n%3==0)

continue;printf("%d\n",n);}}√49例:輸出100--200之間的不能被3整除的數。voidmain(){intn=100;for(;n<=200;n++){if(n%3==0)

continue;printf("%d\n",n);}}voidmain(){intn=100;for(;n<=200;n++){if(n%3==0)

break;printf("%d\n",n);}}改寫如下,結果?break和continue的區別:continue語句只結束本次循環,然后轉到循環體結束點處,而不是終止整個循環的執行。break語句結束整個循環過程。只輸出10010150表達式1語句語句while語句的下一條語句表達式2假真真假continue⑵⑴while(表達式1){ …if(表達式2) continue; …}⑵while(表達式1){ …if(表達式2) break; …}比較下面兩個循環結構:51表達式1語句語句while語句的下一條語句表達式2假真真假break⑴例:指出下面程序循環的執行次數:voidmain(){ inta=0,j=10; for(;j>3;j--){a++;if(a>3)break; } printf(“%d”,a);}52例:閱讀分析程序.main(){ inta,b; for(a=1,b=1;a<=100;a++){ if(b>=20) break; if(b%3==1){ b+=3; continue; } b-=5; } printf("a=%d\n",a);}53voidmain(){charch;intsum=0;while(1){ch=getchar();if(ch=='\n')break;if(ch>='A'&&ch<='Z')sum++;}printf(“%d\n”,sum);}例:從鍵盤上連續輸入字符,并統計其中大寫字母的個數,直到輸入“換行”字符時結束。while((ch=getchar())!='\n'){541.下列while循環,將執行幾次()

inti=4;while(i--)printf(“%d”,i);A)3 B)4 C)0D)無限次2.下列程序段執行幾次循環()

intj=0;while(!(++j%3)) break;A)2B)3C)6D)一次也不執行思考練習題:1.B2.D553.執行下列程序段后,a值為()

inta=15,b=-1; if((a>b)?a++:b++) a%=5;A)15 B)0 C)1 D)163.C4.以下程序循環幾次()

intx=-1; do{x=x*x;}while(!x);A)1B)2C)死循環D)有語法錯誤4.A565.執行下列程序段后,n值為()

intn=0,a=1; switch(a){ case1:n+=1; case2:n+=2;break; default:n+=3; }A)1 B)2 C)3 D)65.C576.執行以下程序后,s值為()

intn=1,s=0; while(++n<10){if(!(n%5)) break; s+=n; }A)1 B)9 C)25 D)以上均不是6.B58

5.9程序舉例用循環的思想設計的算法:窮舉法列舉出問題中所有可能出現的情況,對各個狀態一一測試,直到找到符合條件的情況,或將全部可能狀態都測試完為止。 如:水仙花數、素數、百錢百雞迭代法不斷用新值取代變量的舊值,或由舊值遞推出變量的新值的過程。如:累加、累乘、

Fibonacci數列、級數

變量說明:pi—級數和t—一般項n—分母s—±符號

5.9程序舉例【例1】用公式 求π的近似值,直到最后一項的絕對值<10-6

。6061#include<math.h>#include<stdio.h>main(){ints;floatn,t,pi;t=1;n=1;s=1;pi=0;while(fabs(t)>=1.0e-6){pi=pi+t;n=n+2;s=-s;t=s/n;/*若n定義為int?*/}pi=pi*4;printf("%f\n",pi);}61【例2】求Fibonacci數列:1,1,2,3,5,8,...的前40個數。

F1=1(n=1) F2=1(n=2) Fn=Fn-1+Fn-2(n>=3)62否結束i<=40是f3=f2+f1;輸出f3;f1=f2;f2=f3;i=i+1i=3開始置初值f1=1;f2=1;voidmain(){longintf1,f2,f3;inti;f1=1;f2=1;

printf("%12ld%12ld",f1,f2);for(i=3;i<=40;i++){f3=f2+f1;printf("%12ld",f3);

if(i%4==0)printf("\n");f1=f2;f2=f3;}}程序1:定義變量:

f1,f2,f3;f3=f1+f2;63voidmain(){longintf1,f2;inti;f1=1;f2=1;for(i=1;i<=20;i++){ printf("%12ld%12ld",f1,f2);

if(i%2==0) printf("\n"); f1=f1+f2; f2=f2+f1;}}程序2:64#include<math.h>voidmain(){intm,i,k;scanf("%d",&m);k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1)printf("%disaprimenumber\n",m);elseprintf("%disnotaprimenumber\n",m);}【例3】判斷一個數是否為素數(只能被1和自身整除的數) 當m不能被2~之中的任一整數整除時,m是素數。注意:循環正常結束時,

i的值是k+1m%i==0k=sqrt(m);i=2;i=i+1;i>=k+1真假假真真假輸出m不是素數輸出m是素數輸入mi<=k65【例4】求100—200間的全部素數。#include<math.h>#include<stdio.h>voidmain(){intm,k,i;for(m=101;m<=200;m+=2){

k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0)break; if(i>=k+1) printf(“%d\n",m);}}6667*******************************************************【例5】輸出簡單字符圖形的雙重循環分析:該圖形一共10行,每一行增加一個字符,應循環10次,每次輸出一行,循環為:行

*個數

1122…1010for(i=1~10){

第i行:

i個星號,for(j=1~i)輸出*輸出換行}68【例6】

顯示輸出如下所示的三角形

分析:行號空格數*數

* 051*** 143***** 235*******

溫馨提示

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

評論

0/150

提交評論