第6章程序控制結(jié)構(gòu)2循環(huán)_第1頁
第6章程序控制結(jié)構(gòu)2循環(huán)_第2頁
第6章程序控制結(jié)構(gòu)2循環(huán)_第3頁
第6章程序控制結(jié)構(gòu)2循環(huán)_第4頁
第6章程序控制結(jié)構(gòu)2循環(huán)_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章程序控制結(jié)構(gòu)2循環(huán)6.1循環(huán)結(jié)構(gòu)P循環(huán)體YN當P為真循環(huán)體P循環(huán)體YN當P為真循環(huán)體當型循環(huán)兩種形式P循環(huán)體NY直到P為真循環(huán)體P循環(huán)體Y直到P為真循環(huán)體直到型循環(huán)兩種形式N循環(huán)——while語句,for語句while(表達式)

{

循環(huán)語句;}do

{

循環(huán)語句;}while(表達式);for(表達式1;表達式2;表達式3)

{

循環(huán)語句;}while語句while(表達式)

{

循環(huán)語句;}只要表達式的值為非0(真),就重復(fù)執(zhí)行while循環(huán)語句,直到表達式值為0(假)時止P循環(huán)體YNdo-while語句do

{

循環(huán)語句;

}while(表達式);首先執(zhí)行語句,然后判斷表達式的值。如果表達式為0,結(jié)束while循環(huán)語句。否則,再次執(zhí)行循環(huán)語句。語句會被至少執(zhí)行一次P循環(huán)體YNfor語句for(表達式1;表達式2;表達式3)

{

循環(huán)語句;}循環(huán)起始條件(通常對循環(huán)變量賦初值)循環(huán)結(jié)束條件(每次執(zhí)行循環(huán)語句前需判斷)循環(huán)增量(循環(huán)語句執(zhí)行完一次后計算表達式3的值)(1)計算表達式1,計算表達式2。若表達式2的值0(不滿足結(jié)束條件),則執(zhí)行循環(huán)語句,若表達式2的值=0,則結(jié)束循環(huán);執(zhí)行循環(huán)語句;(3)計算表達式3,再次判斷表達式2的值.依此重復(fù)下去,直到表達式2的值=0(假)。注意循環(huán)變量的使用通過循環(huán)變量i的值來控制循環(huán)次數(shù)。For循環(huán)的循環(huán)總次數(shù)是已知的。for(i=1;i<=100;i++){sum+=i;}for語句for(表達式1;表達式2;表達式3)

{

循環(huán)語句;}相當于:

表達式1和表達式3可以沒有或者是用逗號分隔的多個表達式的組合。但最好不要有太多的表達式組合

表達式1;

while(表達式2){

循環(huán)語句;

表達式3;

}選擇三種循環(huán)的一般原則如果循環(huán)次數(shù)已知,用for如果循環(huán)次數(shù)未知,用while如果循環(huán)體至少要執(zhí)行一次,用do-while這只是“一般”原則,不是“原則”注意在for和while語句之后一般沒有分號有分號表示循環(huán)體就是分號之前的內(nèi)容(空循環(huán)體)while(i<100);

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

printf("%d",i);for通常有一個循環(huán)變量控制循環(huán)的次數(shù),不要在循環(huán)體內(nèi)改變這個變量例:計算n!=1×2×…n分別用如下語句編程forwhiledo-while循環(huán)次數(shù)已知,首先考慮用for循環(huán)語句#include<stdio.h>main(){inti,n;/*i是循環(huán)變量*/longp=1;/*存放階乘的值*/printf("Pleaseentern:");scanf("%d",&n);for(i=1;i<=n;i++){p=p*i;}printf("%d!=%ld\n",n,p);}例:計算n!=1×2×…n例:計算n!=1×2×…nWhile循環(huán)語句實現(xiàn)inti=1;while(i<=n){p=p*i;i++;}do…while循環(huán)語句實現(xiàn)inti=1;do{p=p*i;i++;}while(i<=n);只猜1次直到猜對為止最多猜10次例:循環(huán)控制語句——猜數(shù)游戲猜數(shù)游戲用到的庫函數(shù)怎樣模擬計算機“想”一個數(shù)呢?隨機函數(shù)rand()產(chǎn)生[0,RAND_MAX]

之間的隨機數(shù)magic=rand();#include<stdlib.h>RAND_MAX在stdlib.h中定義,不大于雙字節(jié)整數(shù)的最大值32767產(chǎn)生[0,b-1]之間的隨機數(shù)magic=rand()%b;產(chǎn)生[a,a+b-1]之間的隨機數(shù)magic=rand()%b+a;例#include<stdlib.h>#include<stdio.h>

main(){ intmagic;/*計算機"想"的數(shù)*/ intguess;/*人猜的數(shù)*/ magic=rand()%100+1;/*“想”一個[1,100]之間的數(shù)magic*/ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess);

if(guess>magic) {printf("Wrong!Toohigh!\n"); } elseif(guess<magic) {printf("Wrong!Toolow!\n"); } else { printf("Right!\n"); printf("Thenumberis:%d\n",magic); }}只猜1次例#include<stdlib.h>#include<stdio.h>main(){ intmagic; intguess; intcounter;/*記錄人猜次數(shù)的計數(shù)器變量*/ magic=rand()%100+1; counter=0;/*計數(shù)器變量count初始化為0,統(tǒng)計猜測次數(shù)*/ do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;/*計數(shù)器變量count加1*/ if(guess>magic) printf("Wrong!Toohigh!\n"); elseif(guess<magic) printf("Wrong!Toolow!\n"); }while(guess!=magic);

printf("Right!\n"); printf("counter=%d\n",counter);}直到猜對為止#include<stdlib.h>#include<stdio.h>#include<time.h>main(){ intmagic; intguess; intcounter; srand(time(NULL)); magic=rand()%100+1; counter=0; do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++; if(guess>magic) printf("Wrong!Toohigh!\n"); elseif(guess<magic) printf("Wrong!Toolow!\n"); else printf("Right!\n"); }while((guess!=magic)&&(counter<10));

printf("counter=%d\n",counter);}實驗3最多猜10次6.3嵌套循環(huán)While循環(huán)語句的嵌套;

while(){ … while() {…}}for(;;){…

while(){}

do{}while();…}使用嵌套的循環(huán)體時,應(yīng)注意以下問題

在嵌套的各層循環(huán)體中,使用復(fù)合語句(即用一對大花括號將循環(huán)體語句括起來)保證邏輯上的正確性

內(nèi)層和外層循環(huán)控制變量不應(yīng)同名,以免造成混亂

嵌套的循環(huán)最好采用右縮進格式書寫,以保證層次的清晰性

代碼風格問題循環(huán)嵌套不能交叉,即在一個循環(huán)體內(nèi)必須完整的包含著另一個循環(huán)

例:打印乘法九九表

例#include<stdio.h>main(){ intm,n; for(m=1;m<10;m++) printf("%4d",m);/*打印表頭*/ printf("\n"); for(m=1;m<10;m++) printf("-"); printf("\n"); for(n=1;n<10;n++) { for(m=1;m<10;m++) { printf("%4d",n*m); } printf("\n"); }}例:打印下三角乘法九九表

#include<stdio.h>main(){ intm,n; for(m=1;m<10;m++) printf("%4d",m);/*打印表頭*/ printf("\n"); for(m=1;m<10;m++) printf("-"); printf("\n"); for(m=1;m<10;m++) { for(n=1;n<=m;n++) { printf("%4d",m*n); } printf("\n"); }}例6.5流程的轉(zhuǎn)移控制break語句continue語句goto語句break和continuebreak語句:退出循環(huán)結(jié)構(gòu)語句或者switch如果是嵌套循環(huán),則只退出break語句所在的循環(huán)。continue:中斷本次循環(huán)體的執(zhí)行過程,并進行循環(huán)的下一輪break和continue少用為妙break和continue假假真真break表達式1表達式2循環(huán)語句后的下一條語句循環(huán)語句后的下一條語句假假真真

表達式1表達式2continue例:單步運行演示break語句和continue語句的用法區(qū)別#include<stdio.h>main(){ inti,n; for(i=1;i<=5;i++) { printf("Pleaseentern:"); scanf("%d",&n); if(n<0) break; printf("n=%d\n",n); } printf("Programisover!\n");}Pleaseentern:10↙n=10Pleaseentern:-10↙Programisover!例

:單步運行演示break語句和continue語句的用法區(qū)別#include<stdio.h>main(){ inti,n; for(i=1;i<=5;i++) { printf("Pleaseentern:"); scanf("%d",&n); if(n<0) continue; printf("n=%d\n",n); } printf("Programisover!\n");}Pleaseentern:10↙n=10Pleaseentern:-10↙Pleaseentern:20↙n=20Pleaseentern:-20↙Pleaseentern:30↙n=30Programisover!標號舉例error:printf(“Errors!,exit!\n”);Goto語句舉例gotoerror;一般形式語句標號:…………goto語句標號;goto與標號(label)是goto的過錯?還是程序員的過錯?破壞了結(jié)構(gòu)化設(shè)計風格容易帶來錯誤隱患如非必需,盡量不用gotomain(){

intsum;

gotonext;

sum=0;/*被goto跳過*/next:

printf("%d",sum);}其他流程轉(zhuǎn)移控制標準庫函數(shù)exit()

作用是終止整個程序的執(zhí)行,強制返回操作系統(tǒng)調(diào)用該函數(shù)需要嵌入頭文件<stdlib.h>用法:exit(code);code參數(shù)設(shè)置(慣例):

0表示程序正常退出;非0表示程序出現(xiàn)某種錯誤退出。例題分析:素數(shù)問題 給定一個正整數(shù)n=91,判斷它是不是素數(shù)。判斷標準:素數(shù)只能被自身和1整除。例如,91%1=0,91%91=0.思路:將2至n-1之間的所有整數(shù),同n進行求余操作,判斷余數(shù)是否為0,如果發(fā)現(xiàn)任意一次為0,則n必然不是素數(shù)。循環(huán)語句。程序結(jié)構(gòu)intmain(){ //定義變量、初始化

//進行計算、處理

//輸出結(jié)果

}intmain(){ intn=91; intx;//循環(huán)變量

intcount=0;//用于統(tǒng)計n被整除的次數(shù)

for(x=2;x<=n-1;x++) { if(n%x==0) count++; }

if(count>0) printf(“n不是是素數(shù)"); else printf("n是素數(shù)");

return0;}思考1:目的:假設(shè)判斷是否能夠整除(n%x==0)的計算開銷很大,程序應(yīng)該盡量減少該操作。對上述程序進行優(yōu)化利用break或continue縮減需要被檢查的除數(shù)范圍,還是[2,n-1]???思考2:求出所有的100-200之間的素數(shù)雙重循環(huán)問題。6.6程序排錯最優(yōu)秀的程序員也很難保證其編寫的程序能夠在計算機上一次調(diào)試通過。程序出錯并不可怕,只要學會一定的程序測試和排錯技巧,出錯就不再可怕;相反,我們還可以在錯誤中學習并牢記寶貴的知識,并教導(dǎo)我們?nèi)绾晤A(yù)防錯誤的再次發(fā)生。掌握一些預(yù)防錯誤發(fā)生和減少錯誤的技術(shù)非常重要:好的算法設(shè)計、好的編程風格、限制全局數(shù)據(jù)結(jié)構(gòu)的使用、邊界條件測試等。VC編譯軟件中有自動整理格式功能只要選取需要的代碼,按ALT+F8就能自動整理成帶縮進格式的c文件。程序中常見的出錯原因——11、編譯錯誤;編譯過程中出現(xiàn)的錯誤,通常屬于語法錯誤,即編寫的語句不符合C語言的語法

溫馨提示

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

評論

0/150

提交評論