C語言循環(huán)結構_第1頁
C語言循環(huán)結構_第2頁
C語言循環(huán)結構_第3頁
C語言循環(huán)結構_第4頁
C語言循環(huán)結構_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第5章章 循環(huán)結構循環(huán)結構1. 5.1 5.5 2學時2. 5.6 2學時問題的提出:對于這樣的一類問題:問題1. 從鍵盤輸入10個學生的成績,求總成績。問題2. 求100以內的素數問題3. 求1!+2!+3!+10! 用前面所學知識來解決這些問題是非常麻煩的對于問題1的一個笨辦法:設一個變量,每次輸入一個學生成績,累加后再輸入下一個學生成績,如下: scanf(“%f”,&a); s=s+a; scanf(“%f”,&a); s=s+a; . 這樣重復10次,然后輸出s的值。 是否可用一種語句,使這兩句話能自動的重復執(zhí)行10次,以簡化書寫的麻煩呢? 這就是循環(huán)語句的任務。5

2、.1 goto循環(huán)結構概述C語言可實現循環(huán)的語句:l用goto 和 if 構成循環(huán)lwhile 語句ldo while 語句lfor 語句goto語句及用goto構成循環(huán)vgoto語句一般格式: goto 語句標號; .標號:語句; v功能:無條件轉移語句v說明:l不能用整數作標號l只能出現在goto所在函數內,且唯一l只能加在可執(zhí)行語句前面l限制使用goto語句例 用if 和goto語句構成循環(huán),求1001nn/*ch5_1.c*/#include main() int i,sum=0; i=1;loop: if(i=100) sum+=i; i+; goto loop; printf(%d

3、,sum);sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050循環(huán)初值循環(huán)終值循環(huán)變量增值循環(huán)條件循環(huán)體5.2 while循環(huán)結構v一般形式:while(表達式) 循環(huán)體語句;v執(zhí)行流程:expr循環(huán)體假(0)真(非0)whilev特點:先判斷表達式,后執(zhí)行循環(huán)體v說明:l循環(huán)體有可能一次也不執(zhí)行l(wèi)循環(huán)體可為任意類型語句l下列情況,退出while循環(huán)u條件表達式不成立(為零)u循環(huán)體內遇break,return,gotol無限循環(huán): while(1) 循環(huán)體;例 用while循環(huán)求 1001nn/*ch5_2.c*/#include main()

4、 int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum);循環(huán)初值循環(huán)終值循環(huán)變量增值循環(huán)條件循環(huán)體【例】問題【例】問題1的解決方法的解決方法1:采用:采用while循環(huán)結構循環(huán)結構main() int count=1,total=0,grade; while(count=10) printf(input the grade:); scanf(%d,&grade); total=total+grade; count+; printf(%dn,total);應注意:應注意:1、計數器和累加器的、計數器和累加器的初值;初值;

5、2、一次循環(huán)后,循環(huán)、一次循環(huán)后,循環(huán)控制變量的變化情況。控制變量的變化情況。3、跳出循環(huán)時循環(huán)控、跳出循環(huán)時循環(huán)控制變量的值應為多少?制變量的值應為多少?如果如果count初值為初值為10,20時呢?時呢?111098765432count10987654321次數次數每次循環(huán)后,控制變量每次循環(huán)后,控制變量count的變化情況的變化情況例 顯示110的平方/*ch5_21.c*/#include main() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i); i+; 運行結果:1*1=12*2=43*3=94*4=165*5=256*6=367

6、*7=498*8=649*9=8110*10=100注意:循環(huán)控制變量值在循環(huán)體內必須有所改變。 例如:請問下例中循環(huán)結束時i值為多少?i=1;while (i=100) putchar(*); i+; i+應該在循環(huán)體內改變:do 循環(huán)體語句; while(表達式);v執(zhí)行流程:do循環(huán)體expr假(0)真(非0)while5.3 dowhile循環(huán)結構v一般形式:v特點:先執(zhí)行循環(huán)體,后判斷表達式v說明:l至少執(zhí)行一次循環(huán)體ldowhile可轉化成while結構expr循環(huán)體假(0)真(非0)循環(huán)體While循環(huán)例 用dowhile循環(huán)求 1001nn/*ch5_3.c*/#include

7、 main() int i,sum=0; i=1; do sum+=i;i+; while(i=100); printf(%d,sum);【例】問題【例】問題1的解決方法的解決方法2:采用:采用do-while循環(huán)結構循環(huán)結構【源程序】main() int count=1,total=0,grade; do printf(input the grade:); scanf(%d,&grade); total=total+grade; count+; while(count=10); printf(%dn,total);應注意:應注意:1、一次循環(huán)后,循環(huán)控制、一次循環(huán)后,循環(huán)控制變量的變

8、化情況。變量的變化情況。2、跳出循環(huán)時循環(huán)控制變、跳出循環(huán)時循環(huán)控制變量的值應為多少?如果量的值應為多少?如果count初值為初值為10,20時呢?時呢?111098765432count10987654321次數次數每次循環(huán)后,控制變量的變化情況每次循環(huán)后,控制變量的變化情況例 while和dowhile比較/*ch5_4.c*/#include main() int i,sum=0; scanf(%d,&i); do sum+=i;i+; while(i=10); printf(%d,sum);main() int i,sum=0; scanf(%d,&i); while(

9、i=10) sum+=i;i+; printf(%d,sum);1、跳出循環(huán)時循環(huán)控制變量的值應為多少?如果輸入值為1,10,20時呢?2、輸出結果呢?1.while結構與do-while循環(huán)結構相類似.2.但要注意區(qū)別:v前者:先判斷表達式,再執(zhí)行語句。至少要執(zhí)行0次v后者:先執(zhí)行語句,再判斷表達式。至少要執(zhí)行1次。3.也就是說用兩種循環(huán)結構處理同一問題時,若二者的循環(huán)體部分是一樣的,當while后面表達式的第一次的值為“真(非0)”時,兩種循環(huán)結構得到的結果相同,否則二者的結果不相同。While 與與 do while 循環(huán)結構的比較循環(huán)結構的比較5.4 for循環(huán)結構v一般形式:for(

10、expr1 ; expr2 ; expr3) 循環(huán)體語句;v執(zhí)行流程:vfor(循環(huán)變量賦初值;循環(huán)條件;改變循環(huán)變量)表達式表達式1表達式表達式2循環(huán)體循環(huán)體表達式表達式3TFvfor語句一般應用形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)循環(huán)體語句;v說明:lfor語句中expr1, expr2 ,expr3 類型任意,都可省略,但分號;不可省l無限循環(huán): for(;)lfor語句可以轉換成while結構expr1;while(expr2)循環(huán)體語句;expr3;例 用for循環(huán)求 1001nn#include main() int i,sum=0; for(i=1;i=100;

11、i+) sum+=i; printf(%d,sum);例:#include main( ) int i=0; for(i=0;i10;i+) putchar(a+i); 運行結果:abcdefghij例:#include main( ) int i=0; for(;i10;i+) putchar(a+i); 例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); 例:#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; 逗號運算符的主要應用在for語句中的表達式1或表達式3建議為了增強程

12、序的可讀性,盡量不省略for結構中的表達式。main() int i,j,k; for(i=0,j=100;i=j;i+,j-) k=i+j; printf(%d+%d=%dn,i,j,k); #includemain() char c; for(;(c=getchar()!=n;) printf(%c ,c);#include main() int i,c; for(i=0;(c=getchar()!=n;i+=3)printf(%c ,i+c);main() int count,total=0,grade; for(count=1;count=10;count+) printf(input

13、 the grade:); scanf(%d,&grade); total=total+grade; printf(%dn,total);111098765432count10987654321次數次數每次循環(huán)后,控制變量的變化情況每次循環(huán)后,控制變量的變化情況【例】問題1的解決方法3:采用for循環(huán)結構 5.5 輔助控制語句break語句v功能:在循環(huán)語句和switch語句中,終止并跳出循環(huán)體或開關體v說明:lbreak只能終止并跳出最近一層的結構lbreak不能用于循環(huán)語句和switch語句之外的任何其它語句之中exprbreak;假(0)真(非0)whiledobreak;.ex

14、pr假(0)真(非0)whileexpr2break;.假(0)真(非0)forexpr1expr3switchexpr語句組1break;語句組2break;語句組nbreak;語句組break;.const 1const 2const ndefaultcase 例 break舉例:輸出圓面積,面積大于100時停止#define PI 3.14159main() int r; float area; for(r=1;r100) break; printf(r=%d,area=%.2fn,r,area); 例 break舉例:小寫字母轉換成大寫字母,直至輸入非字母字符#include main

15、() int i,j; char c; while(1) c=getchar(); if(c=a & c=z) putchar(c-a+A); else break; 例 判斷m是否素數讀入mk=mi=2當ikm被i整除真假用break結束循環(huán)i=i+1ik+1真假輸出:m”是素數”輸出:m”不是素數”#include #include main() int m,i,k; scanf(%d,&m); k=sqrt(m); for(i=2;i=k+1) printf(%d is a prime numbern,m); else printf(%d is not a prime n

16、umbern,m);continue語句v功能:結束本次循環(huán),跳過循環(huán)體中尚未執(zhí)行的語句,進行下一次是否執(zhí)行循環(huán)體的判斷v僅用于循環(huán)語句中exprcontinue;假(0)真(非0)while真(非0)docontinue;.expr假(0)whileexpr2continue;.假(0)真(非0)forexpr1expr3例 求輸入的十個整數中正數的個數及其平均值#include main() int i,num=0,a; float sum=0; for(i=0;i10;i+) scanf(%d,&a);if(a=0) continue;num+;sum+=a; printf(%d

17、 plus integers sum :%6.0fn,num,sum); printf(Mean value:%6.2fn,sum/num);5.6 第第4-5章實例解析章實例解析【例】顯示輸入的字符, 如果按的是Esc鍵, 則退出循環(huán); 如果按的是Enter鍵, 則不做任何處理,繼續(xù)輸入下一個字符。#include “conio.h” main( ) char ch; for (; ;) ch=getch(); /*不帶回顯的字符輸入函數 */ if (ch=27) /* Esc鍵的ACSII碼為27*/ break; /*退出循環(huán)*/ if (ch=13) continue; /*按的是E

18、nter:鍵,跳過字符輸出語句*/ putch(ch); /*顯示輸入的字符*/ getch( ); /*讓程序停一下,拍任意鍵繼續(xù),可以不要*/main()int a,b,c,d,t;printf(input a,b,c,d:n);scanf(%d,%d,%d,%d,&a,&b,&c,&d);if(ab)t=a;a=b;b=t;if(ac)t=a;a=c;c=t;if(ad)t=a;a=d;d=t;if(bc)t=b;b=c;c=t;if(bd)t=b;b=d;d=t;if(c0) if (grademax) max=grade; if(grademin) m

19、in=grade; printf(input the next grade:); scanf(%d, &grade); printf(max=%d min=%dn,max,min);課堂任務:課堂任務:1.用用dowhile改寫改寫【源程序】/用dowhile改寫,并用了breakmain() int grade,max=-1,min=1000; /為何這樣取初值? do printf(input the next grade:); scanf(%d, &grade); if (grademax) max=grade; if (grademin) min=grade; whil

20、e(1); printf(max=%d min=%dn,max,min);main() int n; long t=1,sum=0;/注意累乘器及累加器的初值 for(n=1;n100;n+) t=t*n; if(n%2=0) continue; sum=sum+t; printf(sum=%ldn,sum);次數次數1239899t1!2!3!98!99!sum1!-+3!-+99!n23499100每次循環(huán)后,重要變量的變化情況【例】計算1!+ 3!+ 5!+ + 99!。 分析:該題實質上是一個累加求和的問題,而且已知其循環(huán)的次數因此可以用for語句來實現;對于累加應有選擇地進行,即只對

21、奇數項求和,可以用if語句和continue語句組合來進行選擇性地累加?!驹闯绦颉縨ain() int n=1;n while(n=10) if(n=6) continue; printf(%4d,n); n+; 請問請問: 跳出循環(huán)時循環(huán)控制跳出循環(huán)時循環(huán)控制變量的值應為多少?運行變量的值應為多少?運行結果呢?該程序有何問題?結果呢?該程序有何問題?如果有該如何改正?如果有該如何改正?無限循環(huán)無限循環(huán);運行結果:運行結果:1 2 3 4 5555554321n987654321次數次數每次循環(huán)后,重要變量的變化情況每次循環(huán)后,重要變量的變化情況例例. 閱讀程序并回答問題閱讀程序并回答問題ma

22、in( ) long int I,s=0; for( I=10;I=150;I+) if(I%3=0|I%7=0) s=s+I*I; printf(“n%ld”,s);例. 10,150之間,能被3或7整除的數的平方和。 分析:用變量s求和,s初值為0。用變量I從10到150循環(huán),如果I能被3或7整除(I%3=0|I%7=0),則s=s+I*I00 01 02 03 04 0510 11 12 13 14 1520 21 22 23 24 2530 31 32 33 34 3540 41 42 43 44 4550 51 52 53 54 55請寫出輸出結果:請寫出輸出結果:例例 執(zhí)行語句段:

23、執(zhí)行語句段:for(i=0;i6;i+) for(j=0;j6;j+) printf(“%3d%d”,i,j); putchar(n);外循環(huán)外循環(huán)內循環(huán)內循環(huán)算法:從i= 3 開始做分別用2,3,4,i 除i,(可參考數論知識)如果i被某個數整除 , i是合數。i+; 測試下一個i;例 編程求出3至1000內的全部的質數。#include main( ) int i, j ,count=0,flag; /* 用flag作標志 */for(i=3; i=1000; i+)flag = 0; /* 設標志為0 */ for(j=2; j=sqrt(i); j+) if (i % j = =0)

24、/* 測試 j 能夠整數 i*/ flag = 1;break /* 能,則不是素數,標志為1 */ /* i 測試完畢 */ if(flag = = 0) /* i是素數,則輸出 */ printf(“%4d, ”, i ); count+; if (count % 8 = = 0) printf(“n” ); /*每行輸出8個*/ /* 測試下一個 i */main( ) long int f1=1,f2=1,f3,n; for( n=3;n=1;a-) s=0; for(I=1;Ia;I+) if(a%I=0) s=s+I; if(a=s) break; printf(“n%d”,a);例:求 1/99+2/98+1main( ) float s=0.0; int i,j; for(i=1,j=99; i=j; i+,j- -) s = s + (float)i/j; printf(“result is:%f”,s);次數次數1234 48

溫馨提示

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

最新文檔

評論

0/150

提交評論