




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1循環2C語言的重復語句用于設置循環。循環是重復執行其他語句的一種語句,循環中重復執行的語句就是循環體 C語句中,每個循環都有一個控制表達式。每次執行循環體時都要對控制表達式進行計算。 如果表達式為真,也就是不為零,那么繼續執行循環。3C 提供三種循環語句: while語句:用于判定控制表達式在循環體執行之前的循環。 do語句:用于判定控制表達式在循環體執行之后的循環。 for語句:對于自增或自減計數變量的循環十分方便。 4使用while語句是最簡單、最基本的設置循環方法。 While語句格式如下:while ( 表達式表達式) 語句語句表達式即為控制表達式;語句則是循環體。 5while語句
2、示例:while (i n) /* 控制表達式控制表達式 */ i = i * 2; /* 循環體循環體 */執行while語句時,首先計算控制表達式的值。如果值不為零(真),那么執行循環體,接著再次判定表達式。這個過程持續進行直到最終控制表達式的值變為零。6while語句示例:計算大于或等于數n的最小的2次冪:i = 1;while (i n) i = i * 2;設n為10時,下面跟蹤顯示了while語句執行情況:i = 1;i現在值為1.i n成立嗎?是,繼續。i = i * 2;i現在為2.i n成立嗎?是,繼續。i = i * 2;i現在為4。i n成立嗎?是,繼續。i = i *
3、2;i現在為8。i n成立嗎?是,繼續。i = i * 2;i現在為16。i 0) printf(T minus %d and countingn, i); i-;即使沒有嚴格要求的時候,一些程序員始終使用大括號括住循環體:while (i 0) printf(T minus %d and countingn, i); i-;整個過程持續到顯示信息為整個過程持續到顯示信息為“T minus 1 and counting”。9關于while語句的一些討論: 在while循環終止時,控制表達式的值為假。因此,當通過表達式i 0控制循環終止時,i必須是小于或等于0的。 可能根本不執行while循環體
4、。因為控制表達式是在循環體執行之前進行判定。 while語句常??梢杂卸嘀貙懛ā8雍喢鞯倪f減計數循環如下:while (i 0) printf(T minus %d and countingn, i-);10如果控制表達式的值始終是非零值的話,while語句將無法終止。C語句程序員有時故意用非零常量作為控制表達式來構造無限循環:while (1) 除非循環體含有跳出循環控制的語句(break, goto, return)或調用了導致程序終止的函數,否則上述這種形式的while語句將永遠執行下去。11程序square.c用一個while語句顯示平方值表格。用戶指定平方值表格的行數:This p
5、rogram prints a table of squares.Enter number of entries in table: 5 1 1 2 4 3 9 4 16 5 2512square.c /* Prints a table of squares using a while statement */ #include int main(void) int i, n; printf(This program prints a table of squares.n); printf(Enter number of entries in table: ); scanf(%d, &
6、n); i = 1; while (i = n) printf(%10d%10dn, i, i * i); i+; return 0;13程序sum.c 對用戶輸入的整數數列求和:This program sums a series of integers.Enter integers (0 to terminate): 8 23 71 5 0The sum is: 107程序需要使用循環,循環采用scanf函數讀取用戶輸入數,然后再把這個數加到運算的總和中。14sum.c /* Sums a series of numbers */ #include int main(void) int n
7、, sum = 0; printf(This program sums a series of integers.n); printf(Enter integers (0 to terminate): ); scanf(%d, &n); while (n != 0) sum += n; scanf(%d, &n); printf(The sum is: %dn, sum); return 0;運行結果:運行結果:505050501001nn1001nn(1)循環體如果包含一個以上的語句,應該用花括弧括起來,以復合語句形式出現.(2)在循環體中應有使循環趨向于結束的語句。 運行結
8、果:運行結果:5050505017do語句的一般格式如下:do 語句語句 while ( 表達式表達式 ) ;執行do語句時,先執行循環體,再計算控制表達式的值。如果表達式的值非零,那么再次執行循環體,然后再次計算表達式的值。18使用do語句重寫前面的“倒數計數”程序:i = 10;do printf(T minus %d and countingn, i); -i; while (i 0);do語句和while語句沒有本質的區別。唯一的不同在于do語句的循環體至少會被執行一次。19最好對所有的do語句都使用大括號包括循環體,因為沒有大括號的do語句很容易被誤認為是while語句:do pri
9、ntf(T minus %d and countingn, i-);while (i 0);粗心的讀者可能會把單詞while誤認為是while語句的開始。while(i=100)while(i=100)運行結果:運行結果:505050501001nn運行結果:運行結果:505050501001nn22程序numdigits.c 計算用戶輸入的整數的位數:Enter a nonnegative integer: 60The number has 2 digit(s).方法是將將用戶輸入的整數反復除以10,直到結果變為0,除的次數就是用戶輸入整數的位數。do語句比while語句更適合,因為每個整數
10、,即便是0都至少有一位數字。23numdigits.c /* Calculates the number of digits in an integer */ #include int main(void) int digits = 0, n; printf(Enter a nonnegative integer: ); scanf(%d, &n); do n /= 10; digits+; while (n 0); printf(The number has %d digit(s).n, digits); return 0;24for語句適合應用在使用“計數”變量的循環中,然而它也靈
11、活用于許多其他類型的循環中。for語句的一般格式如下:for ( 表達式1; 表達式2; 表達式3 ) 語句表達式1、表達式2和表達式3全都是表達式。示例:for (i = 10; i 0; i-) printf(T minus %d and countingn, i);25for語句的執行流程for(表達式1;表達式2;表達式3) 語句;26for語句和while語句關系緊密。 除了極少數情況,for循環總可以等價替換為while循環:表達式表達式1;while ( 表達式表達式2 ) 語句語句 表達式表達式3;表達式1是在循環開始執行前,只執行一次的初始化步驟。27表達式2控制用于控制循環
12、的終止(循環持續執行,只要表達式2的值非零)。表達式3是在每次循環的最后被執行的一個操作。按照這種模式,上面的for循環可以改寫為如下的while循環:i = 10;while (i 0) printf(T minus %d and countingn, i); i-;28研究等價的while語句有助于更好地理解for語句。例如,假設把先前for循環示例中的i-替換為-i:for (i = 10; i 0; -i) printf(T minus %d and countingn, i);等價的while循環顯示上述的替換對循環沒有任何影響:i = 10;while (i 0) printf(T
13、 minus %d and countingn, i); -i;29由于for語句中的第一和第三表達式都是以語句的方式執行的,所以它們的值互不相關它們有用僅僅是因為有副作用。 所以,這兩個表達式常常是賦值表達式或自增/自減表達式。30for語句對于“向上加”(變量自增)或“向下減”(變量自減)的循環來說是最好的選擇。對于向上加或向下減共有n次的情況,for語句經常會采用下列形式中的一種。從從0向上加到向上加到n1:for (i = 0; i n; i+) 從從1向上加到向上加到n:for (i = 1; i = 0; i-) 從從n向下減到向下減到1:for (i = n; i 0; i-)
14、31常見語句錯誤: 在控制表達式中用 (反之亦然)。“向上加”使用或或=運算符。 在控制表達式中使用=代替, , 或=。 編寫的控制表達式用i=n代替i 0; -i) printf(T minus %d and countingn, i);如果省略第三個表達式,那么循環體需確保第二個表達式的值最終會變為假:for (i = 10; i 0;) printf(T minus %d and countingn, i-);33當第一和第三表達式都省略時,for循環與while循環沒有任何區別:for (; i 0;) printf(T minus %d and countingn, i-);等價于w
15、hile (i 0) printf(T minus %d and countingn, i-);while語句的形式更清楚,因此更可取。34如果省略第二個表達式,那么它默認為真,因此for語句不會終止(除非以某種其他形式停止)。 例如:某些程序員用下列的for語句建立無限循環:for (;) 35C99中,for語句的第一個表達式能被替換為一個聲明(定義)。 這個特性允許程序員在for循環中定義變量:for (int i = 0; i n; i+) 這樣,變量i不需要在for循環前定義。 36在for語句中定義的變量不能在循環體外訪問,即在循環外不可見):for (int i = 0; i n
16、; i+) printf(%d, i); /* legal; i is visible inside loop */ printf(%d, i); /* WRONG */37讓for語句定義自己的循環控制變量通常是個好的做法,方便且讓程序易于理解。 當然,如果程序需要在循環結束后訪問這樣的變量,那么就需要采用for語句常規的方式。for語句可以定義多個相同類型的變量:for (int i = 0, j = 0; i n; i+ +) 38有時,for語句可能需要多個初始表達式,或在每次循環時一次對幾個變量進行自增(減)操作??梢栽趂or語句的第一和第三表達式中使用逗號表達式實現這些想法。逗號表
17、達式具有如下形式:表達式1, 表達式2這里表達式1和表達式2可以是任意兩個表達式。 39逗號表達式的計算分兩步實現: 第一,計算表達式1并丟棄計算結果。 第二,計算表達式2并將計算結果作為整個逗號表達式的結果。計算表達式1始終是有意義的。當計算逗號表達式+i, i + j, i先自增,然后計算i + j 假設,變量i和j的值分別為1和5,那么上面逗號表達式的值為7,而i的值將自增為2。40逗號運算符是左結合性的,所以編譯器把下列表達式:i = 1, j = 2, k = i + j解釋為:(i = 1), (j = 2), (k = (i + j)即左邊的操作先于右邊的執行,這樣表達式i =
18、1, j = 2, 和k = i + j 將從左到右執行。41逗號運算符允許將兩個或多個表達式黏貼成一個表達式。在后面章節中我們會看到某些定義將從逗號運算符中受益。for語句是唯一除上述之外還可以發現逗號運算符的地方。 例如:for (sum = 0, i = 1; i = N; i+) sum += i;利用附加的逗號運算符,for語句可以初始化兩個及以上的變量。42程序square.c(Section 6.1)可以通過將while循環轉化為for循環的方式進行改進:43square2.c /* Prints a table of squares using a for statement
19、*/ #include int main(void) int i, n; printf(This program prints a table of squares.n); printf(Enter number of entries in table: ); scanf(%d, &n); for (i = 1; i = n; i+) printf(%10d%10dn, i, i * i); return 0;44C語言對控制循環行為的三個表達式沒有加任何限制。 雖然這些表達式通常對同一個變量進行初始化、判定和更新,但是不要求它們之間以任何方式進行相互關聯。程序square3.c 等價
20、于square2.c,但是包含一個for語句,它初始化一個變量(square), 判定另一個變量(i), 并對第三個變量(odd)進行自增操作。 for語句這種極大的靈活性有時是十分有用的,但是原始的程序無疑更加清晰。45square3.c /* Prints a table of squares using an odd method */ #include int main(void) int i, n, odd, square; printf(This program prints a table of squares.n); printf(Enter number of entries
21、 in table: ); scanf(%d, &n); i = 1; odd = 3; for (square = 1; i = n; odd += 2) printf(%10d%10dn, i, square); +i; square += odd; return 0;46通常循環的退出點是在while或for循環體之前,或do循環體之后。使用break語句可以在循環體中間設置退出點,甚至設置多個退出點。47break語句能夠把程序控制從switch語句中轉移出來,而且還可以用于跳出while、do或for循環??梢跃帉懸粋€循環用于測試一個數是否是素數,只要發現一個約數就用brea
22、k語句終止循環:for (d = 2; d n; d+) if (n % d = 0) break;48在循環終止后,可以用if語句來確定是提前終止(即n不是素數)還是正常終止(n是素數):if (d n) printf(%d is divisible by %dn, n, d);else printf(%d is primen, n);49break語句特別適合退出點在循環體中間,而不是循環體之前或之后的循環。 例如,用于讀入用戶輸入并且在遇到特殊輸入值時終止的循環:for (;) printf(Enter a number (enter 0 to stop): ); scanf(%d, &
23、amp;n); if (n = 0) break; printf(%d cubed is %dn, n, n * n * n);50break語句把程序控制從最內層封閉的while、do、for或switch語句中轉移出來。 當這些語句出現嵌套時,break語句只能跳出一層嵌套:while () switch () break; break語句從語句從switch語句中轉移出程序控制,但沒有從語句中轉移出程序控制,但沒有從while循環中轉移出來。循環中轉移出來。51continue語句與break語句類似: break語句把程序控制轉出循環體。 continue語句把程序控制轉移到循環體結束
24、之前的一點。 break語句使程序控制跳出循環,continue語句把程序控制留在循環體內。break語句和continue語句的另一個區別:break語句可以在用于switch語句和循環中,而continue語句則只能用在循環中。52使用使用continue語句語句的循環示例:的循環示例:n = 0;sum = 0;while (n 10) scanf(%d, &i); if (i = 0) continue; sum += i; n+; /* continue jumps to here */53不用continue語句的相同循環示例:n = 0;sum = 0;while (n
25、10) scanf(%d, &i); if (i != 0) sum += i; n+; 1001nn當n能被3整除時,執行continue語句,結束本次循環(即跳過printf函數語句),只有n不能被3整除時才執行printf函數。1001nn當n能被3整除時,執行continue語句,結束本次循環(即跳過printf函數語句),只有n不能被3整除時才執行printf函數。56goto語句語句能跳轉到函數中任何有標號的語句處。能跳轉到函數中任何有標號的語句處。標號是放置在語句開始處的標識符:標識符:語句一條語句可以有多個標號。 goto語句語句格式如下:格式如下:goto 標識符;執
26、行語句語句 goto L,把程序控制轉移到標號L后的語句上, 轉移目標語句必須與goto語句在同一個函數中。57如果C語言沒有break語句,goto語句可以用于退出循環:for (d = 2; d n; d+) if (n % d = 0) goto done;done: if (d n) printf(%d is divisible by %dn, n, d);else printf(%d is primen, n);58goto語句語句在日常的在日常的C語言編程中很少用到。語言編程中很少用到。break、continue和return 等語句本質上都是受限制的goto語句語句,它們和,它
27、們和exit函數一起足夠應付函數一起足夠應付其他編程語言中大多數其他編程語言中大多數goto語句語句的情況。的情況。盡管如此,goto語句偶爾還是很有用的。59考慮從包含switch語句的循環中退出的問題。 break語句不會產生期望的效果:它可以跳出switch語句,但是無法跳出循環。 goto語句語句可以解決這個問題:可以解決這個問題:while () switch () goto loop_done; /* break wont work here */ loop_done: goto語句在需要從嵌套的多層循環中轉出時還是很語句在需要從嵌套的多層循環中轉出時還是很有用。有用。 1001n
28、n這里用的是“當型”循環結構,當滿足“i=100” 時執行花括弧內的循環體。 運行結果:運行結果:5050505061許多簡單的交互式程序都是基于菜單的,它們向用戶顯示可供選擇的命令列表。一旦用戶選擇了某條命令,程序就執行相應的操作,然后提示用戶輸入下一條命令。這個過程一直會持續到用戶選擇“退出”或“停止”命令。這類程序的核心顯然是循環。for (;) 提示用戶輸入命令; 讀入命令; 執行命令;62執行這個命令將需要switch語句(或級聯式if語句)for (;) 提示用戶輸入命令; 讀入命令; switch (command) case 命令1: 執行操作1; break; case 命令
29、2: 執行操作2; break; . . . case 命令n: 執行操作n; break; default: 顯示錯誤信息; break; 63程序checking.c用這種循環來維護賬本的余額程序將為用戶提供選擇菜單:刷新帳戶余額,往帳戶上存錢,從帳戶上取錢,顯示當前余額,退出程序。64* ACME checkbook-balancing program *Commands: 0=clear, 1=credit, 2=debit, 3=balance, 4=exit Enter command: 1Enter amount of credit: 1042.56Enter command:
30、2Enter amount of debit: 133.79Enter command: 1Enter amount of credit: 1754.32Enter command: 2Enter amount of debit: 1400Enter command: 2Enter amount of debit: 68Enter command: 2Enter amount of debit: 50Enter command: 3Current balance: $1145.09Enter command: 465checking.c /* Balances a checkbook */ #
31、include int main(void) int cmd; float balance = 0.0f, credit, debit; printf(* ACME checkbook-balancing program *n); printf(Commands: 0=clear, 1=credit, 2=debit, ); printf(3=balance, 4=exitnn); for (;) printf(Enter command: ); scanf(%d, &cmd); switch (cmd) case 0: balance = 0.0f; break;66 case 1:
32、 printf(Enter amount of credit: ); scanf(%f, &credit); balance += credit; break; case 2: printf(Enter amount of debit: ); scanf(%f, &debit); balance -= debit; break; case 3: printf(Current balance: $%.2fn, balance); break; case 4: return 0; default: printf(Commands: 0=clear, 1=credit, 2=debi
33、t, ); printf(3=balance, 4=exitnn); break; 67語句可以為空,即除了末尾的分號外什么符號也沒有。 下面一行代碼包含三條語句:i = 0; ; j = 1;空語句主要有一個好處:編寫空循環體的循環。 68考慮下面尋找素數的循環:for (d = 2; d n; d+) if (n % d = 0) break;如果把條件n % d = 0移到循環控制表達式中,那么循環體將會為空:for (d = 2; d 0); /* WRONG */ printf(T minus %d and countingn, i); -i;while圓括號后多余的分號(空語句)造
34、成無限循環。 70例3:i = 11;while (-i 0); /* WRONG */ printf(T minus %d and countingn, i);循環體在循環終止后只執行一次;顯示信息如下:循環體在循環終止后只執行一次;顯示信息如下:T minus 0 and counting例4:for (i = 10; i 0; i-); /* WRONG */ printf(T minus %d and countingn, i);同樣,循環體只執行一次,并顯示相同的信息。 一個循環體內又包含另一個完整的循環結構 稱為循環的嵌套。內嵌的循環中還可以嵌套 循環,這就是多層循環。 三種循環(
35、while循環、do-while循環和for循 環)可以互相嵌套。 下面幾種都是合法的形式:(1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( ); (4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while( ) 循環嵌套中,每層循環的進行都有相應的控制機制(比如循環變量)。但是在某一層x中,可能會使用甚至改變另一層使用甚至改變另一層y的控制機制(比如在x層中引用甚至修改y層的循環變量的值),這是造成多層循環難以理解的重要原因。例:int m
36、ain()int i,k,s=0;for(i=1;i=10;i+)for(k=1;k=i;k+)s+=k;printf(%d,s);此程序的作用是什么?打印的結果是?例:int main()int i,k,s=0;for(i=1;i=10;i+)for(k=1;k=i;k+)if(k%2=0) i+;s+=k;printf(%d,s);此程序的作用是什么?打印的結果是?例:使用循環,在屏幕上打印如下圖案: * * * * * *效果:分析:1. 將圖形放入笛卡爾坐標系(即建模) * * * * * * * * * * * *坐標平移2. 得到數學模型: 0123456-1-2-3-4-5-6打印空格打印空格打印空格打印空格打印星號3. 用數學不等式來描述打印星號區域:(1)寫出四條邊線的方程(也可先不平移坐標,寫出原方程后再平移):(x-3)+(y+3)=3, -(x-3)+(y+3)=3,-(x-3)-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 38055.1-2025越野叉車安全使用要求第1部分:伸縮臂式叉車
- 毛巾產品的生命周期評估考核試卷
- 社會心理學在人機交互設計中的應用考核試卷
- 涂料配方設計考核試卷
- 電子元器件識別與應用考核試卷
- 社交心理學與消費者心理分析考核試卷
- 紡織機械的邊緣計算服務發展趨勢預測考核試卷
- 服裝批發過程中的質量控制考核試卷
- 禽類屠宰行業綠色可持續發展考核試卷
- 海底設施施工質量控制與驗收考核試卷
- 《內科常見病的診治》課件
- 離心泵有效汽蝕余量計算公式
- 第十一章計劃調控法律制度
- 《我的家鄉日喀則》課件
- 語文版一年級下冊語文閱讀理解(15篇)
- 華文版書法五年級下冊 第12課 同字框 教案
- 國網裝表接電(初級)理論考試復習題庫(含答案)
- 實驗四酸性磷酸酶及值測定
- 勞動保障協理員試題
- 《多邊形的面積》單元整體作業設計
- 同濟大學《高等數學》第七版上、下冊答案(詳解)
評論
0/150
提交評論