




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Chap 4 循環(huán)結構循環(huán)結構4.1 用格里高利公式求用格里高利公式求的近似值的近似值 (while語句語句)4.2 統計一個整數的位數統計一個整數的位數 (do-while語句語句)4.3 判斷素數判斷素數 (break 和和 continue 語句語句)4.4 求求1!+2!+.+100! (循環(huán)嵌套循環(huán)嵌套)4.5 循環(huán)結構程序設計循環(huán)結構程序設計本章要點本章要點n什么是循環(huán)什么是循環(huán)? 為什么要使用循環(huán)為什么要使用循環(huán)? 如何實現循環(huán)如何實現循環(huán)?n實現循環(huán)時,如何確定循環(huán)條件和循環(huán)體實現循環(huán)時,如何確定循環(huán)條件和循環(huán)體?n怎樣使用怎樣使用while 和和do-while語句實現次數不
2、確定的語句實現次數不確定的循環(huán)循環(huán)?nwhile 和和do-while語句有什么不同語句有什么不同?n如何使用如何使用break語句處理多循環(huán)條件語句處理多循環(huán)條件?n如何實現多重循環(huán)如何實現多重循環(huán)?4.1 用格里高利公式求用格里高利公式求的近似值的近似值例例4-1 使用格里高利公式求使用格里高利公式求的近似值,的近似值,要求精確到最后一項的絕對值小于要求精確到最后一項的絕對值小于104。4.1.1 程序解析程序解析4.1.2 while語句語句 11114357#include /*程序中調用絕對值函數,包含程序中調用絕對值函數,包含math.h */int main(void) int
3、denominator, flag; double item, pi; /* pi 用于存放累加和用于存放累加和*/ /*循環(huán)初始化循環(huán)初始化*/ flag = 1; /* flag 表示第表示第i 項的符號,初始為正項的符號,初始為正*/ denominator = 1 ; /* denominator 表示第表示第i 項的分母,初始為項的分母,初始為1*/ item = 1.0; /* item中存放第中存放第i 項的值,初值取項的值,初值取1*/ pi = 0; /* 置累加和置累加和pi 的初值為的初值為0*/ while(fabs (item) = 0.0001) /*當當| ite
4、m |0.0001時,執(zhí)行循環(huán)時,執(zhí)行循環(huán)*/ item = flag * 1.0 / denominator; /*計算第計算第i項的值項的值*/ pi = pi + item; /*累加第累加第i項的值項的值*/ flag = -flag; /*改變符號,為下一次循環(huán)做準備改變符號,為下一次循環(huán)做準備*/ denominator = denominator +2; /*分母遞增分母遞增2,為下一次循環(huán)做準備,為下一次循環(huán)做準備*/ pi = pi * 4; /*循環(huán)計算的結果是循環(huán)計算的結果是pi /4*/ printf ( “pi = %.4fn”, pi); return 0;4.1.
5、1 程序解析求程序解析求的近似值的近似值pi = 3.1418 item=0.0 ?fabs(item) 0.0014.1.2 while 語句語句一般形式為:一般形式為:while (表達式表達式) 循環(huán)體語句循環(huán)體語句; 真真假假while下一條語句下一條語句表達式表達式循環(huán)體語句循環(huán)體語句循環(huán)條件循環(huán)條件循環(huán)體循環(huán)體一條語句一條語句while語句的執(zhí)行流程語句的執(zhí)行流程while 語句說明語句說明while語句的執(zhí)行流程:語句的執(zhí)行流程:當表達式的值為當表達式的值為“真真”時,循環(huán)執(zhí)行,直到表時,循環(huán)執(zhí)行,直到表達式的值為達式的值為“假假”,循,循環(huán)中止并繼續(xù)執(zhí)行環(huán)中止并繼續(xù)執(zhí)行whil
6、e的下一條語句。的下一條語句。 while語句中的語句中的表達式表達式可以是可以是任意合法的表達式任意合法的表達式,循環(huán)體循環(huán)體語句只能是一條語句語句只能是一條語句。與與for語句相比,語句相比,while語句構成簡單,只有一個表達式和語句構成簡單,只有一個表達式和一條循環(huán)體語句,分別對應循環(huán)的兩個核心要素:一條循環(huán)體語句,分別對應循環(huán)的兩個核心要素:循環(huán)條循環(huán)條件和循環(huán)體件和循環(huán)體,可以直接把循環(huán)問題的分析設計轉換為語句,可以直接把循環(huán)問題的分析設計轉換為語句實現。實現。指定次數的循環(huán)程序設計,循環(huán)的實現一般包括指定次數的循環(huán)程序設計,循環(huán)的實現一般包括4個部分,個部分,即即初始化初始化、條
7、件控制條件控制、重復操作重復操作以及以及通過改變循環(huán)變量的通過改變循環(huán)變量的值最終改變條件的真假性值最終改變條件的真假性,使循環(huán)能正常結束。這,使循環(huán)能正常結束。這4個部分個部分直接和直接和for語句中的語句中的4個成分個成分(表達式表達式1、表達式、表達式2、循環(huán)體語、循環(huán)體語句和表達式句和表達式3)相對應,當相對應,當while語句使用時,由于它只有語句使用時,由于它只有2個個成分成分(表達式和循環(huán)體語句表達式和循環(huán)體語句),就需要另加,就需要另加初始化部分初始化部分, while語句的循環(huán)體語句語句的循環(huán)體語句可包含可包含for語句的循環(huán)體語句和表達語句的循環(huán)體語句和表達式式3,所以,所
8、以while的循環(huán)體語句中必須包含的循環(huán)體語句中必須包含能最終改變循環(huán)能最終改變循環(huán)條件真假性的操作條件真假性的操作。while 和和 for 的比較說明的比較說明 while 語句和語句和for語句(執(zhí)行機制實質是一樣的)語句(執(zhí)行機制實質是一樣的)都是在都是在循環(huán)前先判斷條件,只有條件為循環(huán)前先判斷條件,只有條件為“真真”才進入循環(huán)。才進入循環(huán)。表達式表達式1;while (表達式表達式2) for的循環(huán)體語句的循環(huán)體語句; 表達式表達式3;把把for語句改寫成語句改寫成while語句語句for(表達式表達式1; 表達式表達式2; 表達式表達式3) 循環(huán)體語句循環(huán)體語句while 和和 f
9、or 的比較說明的比較說明while 和和 for 的比較的比較for (i = 1; i = 10; i+) sum = sum + i; i = 1; 循環(huán)變量賦初值循環(huán)變量賦初值while (i =0。循環(huán)的三種常見的控制方式(計數控制的循環(huán)、循環(huán)的三種常見的控制方式(計數控制的循環(huán)、條件控制的循環(huán)、標記控制的循環(huán))條件控制的循環(huán)、標記控制的循環(huán)) int main(void) int num,count; /* 用用num記錄輸入數據的個數記錄輸入數據的個數,count記錄不及格人數記錄不及格人數*/double grade, total; /* grade 存放輸入的成績,存放輸入的
10、成績, total保存成績之和保存成績之和 */num = 0; total = 0;count=0;printf(“Enter grades: n”); /*輸入提示輸入提示*/scanf(“%lf”, &grade); /* 輸入第輸入第1個數,個數,%lf中的中的l是字母是字母*/ /*當輸入數據當輸入數據grade大于等于大于等于0時,執(zhí)行循環(huán)時,執(zhí)行循環(huán)*/ while (grade = 0) /* 輸入負數,循環(huán)結束輸入負數,循環(huán)結束 */ total = total + grade; /*累加成績累加成績*/ num+; /*計數計數*/ if(grade60) coun
11、t+; scanf (“%lf”, &grade); /*讀入一個新數據,為下次循環(huán)做準備讀入一個新數據,為下次循環(huán)做準備*/if(num != 0) printf(“Grade average is %.2fn, total/num); printf(“Number of failure is %dn, count); else printf( Grade average is 0n); return 0;Enter grades: 67 88 73 54 82 -1Grade average is 72.80Number of failures is 1Enter grades:
12、-1 67 88 73 54 82Grade average mark is 04.2 統計一個整數的位數統計一個整數的位數例例4-3 從鍵盤讀入一個整數,統計該數的位從鍵盤讀入一個整數,統計該數的位數。例如,輸入數。例如,輸入12534,輸出,輸出5;輸入;輸入-99,輸出輸出2;輸入;輸入0,輸出,輸出1。4.2.1 程序解析程序解析4.2.2 do - while語句語句 int main(void) int count, number; /*count記錄整數記錄整數number的位數的位數*/ count = 0;printf(“Enter a number: );scanf (%d
13、, &number) ;if (number 0) number = -number; /*將輸入的負數轉換為正數將輸入的負數轉換為正數*/ do number = number / 10; /*整除后減少一位個位數,組成一個新數整除后減少一位個位數,組成一個新數*/ count +; /*位數加位數加1*/ while (number != 0); /*判斷循環(huán)條件判斷循環(huán)條件*/printf(It contains %d digits.n, count); return 0;4.2.1 程序解析統計一個整數的位數程序解析統計一個整數的位數Enter a number: 12534I
14、t contains 5 digits.Enter a number: -99It contains 2 digits.Enter a number: 0It contains 1 digits.while (number != 0) number = number / 10; count +;if(number=0) count=1;4.2.2 do - while 語句語句一般形式為:一般形式為:do 循環(huán)體語句循環(huán)體語句 while (表達式表達式);先循環(huán)先循環(huán)后判斷后判斷真真假假表達表達式式循環(huán)體語句循環(huán)體語句do-while的下一條語句的下一條語句執(zhí)行流程:執(zhí)行流程:第一次進入第一
15、次進入循環(huán)時,首先執(zhí)行循環(huán)循環(huán)時,首先執(zhí)行循環(huán)體語句,然后再檢查循體語句,然后再檢查循環(huán)控制條件,即計算表環(huán)控制條件,即計算表達式,若值為達式,若值為“真真”,繼續(xù)循環(huán),直到表達式繼續(xù)循環(huán),直到表達式的值為的值為“假假”,循環(huán)結,循環(huán)結束,執(zhí)行束,執(zhí)行do-while的下的下一條語句。一條語句。do-while語句執(zhí)行流程語句執(zhí)行流程n while 是先判斷條件,再決定是否循環(huán);是先判斷條件,再決定是否循環(huán);n do-while 是先至少循環(huán)一次,然后再根據是先至少循環(huán)一次,然后再根據循環(huán)的結果決定是否繼續(xù)循環(huán)。循環(huán)的結果決定是否繼續(xù)循環(huán)。while 和和 do-while 的比較的比較真真假
16、假表達式表達式循環(huán)體語句循環(huán)體語句do-while的下一條語句的下一條語句真真假假while的下一條語句的下一條語句表達式表達式循環(huán)體語句循環(huán)體語句udo_while語句的使用方法和語句的使用方法和 while語句類似,語句中的表達式可語句類似,語句中的表達式可是任意合法的表達式,循環(huán)體語句只能是一條語句;使用時要另加是任意合法的表達式,循環(huán)體語句只能是一條語句;使用時要另加初始化部分,循環(huán)體語句必須包含能最終改變條件真假性的操作。初始化部分,循環(huán)體語句必須包含能最終改變條件真假性的操作。udo_while語句適合于先循環(huán),后判斷循環(huán)條件的情況,一般在循語句適合于先循環(huán),后判斷循環(huán)條件的情況,
17、一般在循環(huán)體的執(zhí)行過程中明確循環(huán)控制條件。它每執(zhí)行一次循環(huán)體后,再環(huán)體的執(zhí)行過程中明確循環(huán)控制條件。它每執(zhí)行一次循環(huán)體后,再判斷條件,以決定是否進行下一次循環(huán)。判斷條件,以決定是否進行下一次循環(huán)。無論循環(huán)條件的值如何,無論循環(huán)條件的值如何,至少會執(zhí)行一次循環(huán)體。至少會執(zhí)行一次循環(huán)體。4.3 判斷素數判斷素數例例4-4 輸入一個正整數輸入一個正整數m,判斷它是否為素數。判斷它是否為素數。素數就是只能被素數就是只能被1和自身整除的正整數,和自身整除的正整數,1不是不是素數,素數,2是素數。是素數。4.3.1 程序解析程序解析4.3.2 break語句語句 和和continue語句語句4.3.1 程
18、序解析判斷素數程序解析判斷素數算法:除了算法:除了1和和m,不能被其它數整除。,不能被其它數整除。設設 i 取值取值 2, m-1 n如果如果m不能被該區(qū)間上的任何一個數整除,即對不能被該區(qū)間上的任何一個數整除,即對每個每個i,m%i 都不為都不為0,則,則m是素數是素數n只要找到一個只要找到一個i,使使m%i為為0,則,則m肯定不是素數肯定不是素數m %2 %3 %4 %5 %(m-1)不是素數不是素數 | =0 =0是素數是素數 & !=0 !=0 m不可能被大于不可能被大于 m/2 的數整除的數整除 i 取值取值 2, m-1 、 2, m/2 、 2, mfor(i = 2;
19、i m/2 &m!=1 ) printf(yesn)else printf(non”);int main(void) int i, m;printf(“Enter a number: );scanf (%d, &m);for (i = 2; i m/2&m!=1 ) /*如果循環(huán)正常結束,說明如果循環(huán)正常結束,說明m不能被任何一個不能被任何一個i整除,整除, 則則m是素數是素數*/ printf(%d is a prime number! n, m); else printf(No!n); 例例4-4源程序判斷素數源程序判斷素數Enter a number: 9NoEn
20、ter a number: 1111 is a prime number!for (i = 2; i = m/2; i+) if (m % i = 0) printf(No!n); else printf(%d is a prime number! n, m); 循環(huán)條件循環(huán)條件?循環(huán)的結束條件循環(huán)的結束條件?for (i = 2; i = m/2; i+) if (m % i = 0) printf(No!n); else printf(%d is a prime number! n, m); break 語句語句while(exp) 語句語句1 if (expb) break; 語句語句2
21、真真假假 exp 語句語句1假假 expb 語語 句句2循環(huán)體循環(huán)體真真for (i = 2; i m/2 &m!=1 ) printf(Yes); else printf(No!n); 當循環(huán)有多個出口時:當循環(huán)有多個出口時: 表示循環(huán)條件表示循環(huán)條件 區(qū)分結束條件區(qū)分結束條件for(i = 2; i = m/2; i+) if(m%i = 0) printf(No!n); break; printf(Yes); u當循環(huán)結構中出現多個循環(huán)條件時,當循環(huán)結構中出現多個循環(huán)條件時,可以由循環(huán)語句中的表達式和可以由循環(huán)語句中的表達式和break語語句共同控制。句共同控制。break語句強
22、制循環(huán)結束。語句強制循環(huán)結束。ubreak語句應該和語句應該和if語句配合使用,語句配合使用,即條件滿足時,才執(zhí)行即條件滿足時,才執(zhí)行break跳出循環(huán);跳出循環(huán);否則,若否則,若break無條件執(zhí)行,意味著永無條件執(zhí)行,意味著永遠不會執(zhí)行循環(huán)體中遠不會執(zhí)行循環(huán)體中break后面的其他后面的其他語句。語句。continue 語句語句while(exp) 語句語句1 if (expb) continue; 語句語句2真真假假 exp 語句語句1假假e x pb 語語 句句2循環(huán)體循環(huán)體真真continue 語句的作用語句的作用是跳過循環(huán)體中是跳過循環(huán)體中continue后面的后面的語句,繼續(xù)下一
23、次循環(huán)。語句,繼續(xù)下一次循環(huán)。 continue 語句一般也需要語句一般也需要與與if語句配合使用。語句配合使用。break 和和 continue#include stdio.hint main(void) char c; int i; for (i = 0; i 10; i+) c = getchar(); if (c = n) break; putchar(c); abc efgh 123 abcabcefgh1continue;break語句和語句和 continue語句的區(qū)別:語句的區(qū)別:break結束循環(huán),而結束循環(huán),而continue只是跳過后面語句繼續(xù)循環(huán)。只是跳過后面語句繼續(xù)
24、循環(huán)。 break除了可以終止循環(huán)外,還用于除了可以終止循環(huán)外,還用于switch語句,而語句,而continue只能用于循環(huán)。只能用于循環(huán)。例例 break舉例:輸出圓面積,面積大于舉例:輸出圓面積,面積大于100時停止時停止#define PI 3.14159main() int r; float area; for(r=1;r100) break; printf(r=%d,area=%.2fn,r,area); break 和和 continue例如例如 以下程序段輸出以下程序段輸出100200之間所有能被之間所有能被3整除的數。整除的數。for(i = 100;i = 200;i+)
25、if( i % 3 != 0 )continue; printf(“%d ”,i);for(i = 100;i = 200;i+) if(i % 3 = 0) printf(“%d ”,i);例例4-5 簡單的猜數游戲。最多允許猜簡單的猜數游戲。最多允許猜5次。次。# include int main(void) int mynumber = 38; /* 計算機指定被猜的數計算機指定被猜的數 */ int count = 0,yournumber; for(count = 1;count mynumber ) printf(Sorry! your number is bigger than
26、my number! n); else printf(Sorry! your number is smaller than my number! n); printf(Game is over!n); return 0; Input your number:48Sorry! your number is bigger than my number!Input your number:38Ok! you are right!Game is over!4.4 求求1! + 2! + . + 100!for (i = 1; i = 100; i+) item = i ! sum = sum + it
27、em;4.4.1 程序解析程序解析調用函數調用函數 fact(i) 計算計算 i 的階乘的階乘4.4.2 嵌套循環(huán)嵌套循環(huán)用循環(huán)計算用循環(huán)計算 i 的階乘的階乘#include double fact (int n); /*函數聲明函數聲明*/int main(void) int i; double sum; sum = 0; for(i = 1; i = 100; i+ ) sum = sum + fact (i); /*調用調用fact (i)求求i!,共重復,共重復100次次*/ printf(“1! + 2! + 3! + + 100! = %en”, sum);/*用指數用指數形式輸
28、出形式輸出 結果結果*/ return 0;double fact (int n) /*定義求定義求n!的函數的函數*/ int i; double result = 1; /*變量變量result 存放階乘的值,并置初值為存放階乘的值,并置初值為1*/ for (i = 1; i = n; i+) /*循環(huán)執(zhí)行循環(huán)執(zhí)行n次,計算次,計算n!*/ result = result * i ; return result ; /*把結果回送主函數把結果回送主函數*/4.4.1 程序解析程序解析例例4-6 求求1! + 2! + . + 100! 要求定義和調用函要求定義和調用函數數fact(n)計
29、算計算n的階乘的階乘。1! + 2! + + 100! = 9.426900e+157 4.4.2 嵌套循環(huán)嵌套循環(huán)累加求和的累加求和的for語句為:語句為:for (i = 1; i = 100; i+) item = i ! sum = sum + item;for(i = 1; i = 100; i+) /*外層循環(huán)執(zhí)行外層循環(huán)執(zhí)行100次,求累加和次,求累加和*/ item = 1; /*置置item的初值為的初值為1,以保證每次求階乘都從,以保證每次求階乘都從1開始連乘開始連乘*/ for (j = 1; j = i; j+) /*內層循環(huán)重復內層循環(huán)重復i次,算出次,算出 item
30、=i!*/ item = item * j; sum = sum + item; /*累加累加i!*/i!=1i!=1* *2 2* * *i,i,是個連乘的是個連乘的重復過程,每次循環(huán)完成重復過程,每次循環(huán)完成一次乘法,循環(huán)一次乘法,循環(huán)i i次求出次求出 i!i!的值。的值。例例4-7 求求1! + 2! + . + 100! 要求使用要求使用嵌套循環(huán)。嵌套循環(huán)。#include int main(void) int i, j;double item, sum; /* 變量變量item中中 存放階乘的值存放階乘的值 */sum = 0; for(i = 1; i = 100; i+) /*
31、外層循環(huán)執(zhí)行外層循環(huán)執(zhí)行100次,求累加和次,求累加和*/ item = 1; /*置置item的初值為的初值為1,以保證每次求階乘都從,以保證每次求階乘都從1開始連乘開始連乘*/ for (j = 1; j = i; j+) /* 內層循環(huán)算出內層循環(huán)算出 item = i! */ item = item * j; /*內層循環(huán)重復內層循環(huán)重復i次,算出次,算出 item=i!*/ sum = sum + item; /* 把把i!累加到累加到sum中中*/printf(“1! + 2! + 3! + + 100! = %en”, sum); /*用指數用指數形式輸形式輸 出結果出結果*/1
32、!+2!+100!=9.42690e+157內層循環(huán)的初始化內層循環(huán)的初始化for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; 求求1! + 2! + . + 100!item = 1;for(i = 1; i = 100; i+) for (j = 1; j = i; j+) item = item * j; sum = sum + item; 求求1! + 1!*2! + + 1!*2!*100! 分析嵌套循環(huán)分析嵌套循環(huán)(二重循環(huán)二重循環(huán))的執(zhí)行過程的執(zhí)行過
33、程for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; n 外層循環(huán)變量外層循環(huán)變量 i 的每個值的每個值內層循環(huán)變量內層循環(huán)變量 j 變化一個輪次;變化一個輪次;n 內外層循環(huán)變量不能相同內外層循環(huán)變量不能相同分別用分別用 i 和和 jfor (i = 1; i = 100; i+) for (j = 1; j = i; j+) printf (%d %dn, i, j );二重循環(huán)的執(zhí)行過程二重循環(huán)的執(zhí)行過程 使用嵌套的循環(huán)體時,應注意以下問題使用嵌套的循環(huán)體時
34、,應注意以下問題 n在嵌套的各層循環(huán)體中,使用復合語句(即用一對大花括號將循環(huán)體語句括起來)保證邏輯上的正確性 n內層和外層循環(huán)控制變量不應同名,以免造成混亂 n嵌套的循環(huán)最好采用右縮進格式書寫,以保證層次的清晰性 n循環(huán)嵌套不能交叉,即在一個循環(huán)體內必須完整的包含著另一個循環(huán) 合法的嵌套循環(huán)合法的嵌套循環(huán) 外層循環(huán) 內層循環(huán) 內層循環(huán) 內層循環(huán) 合法的嵌套循環(huán) 課堂練習課堂練習1: 編寫程序,實現以下圖形輸出編寫程序,實現以下圖形輸出(輸出輸出行數可變行數可變)。*#include #include #define N 10#define N 10void main() void main(
35、) intint i,ji,j; ; for(i=1;i= for(i=1;i=N;iN;i+) +) /控制行數控制行數 for(j=1;j=N- for(j=1;j=N-i;ji;j+)+)/隨著行數的增加,輸出遞減數目的空格隨著行數的增加,輸出遞減數目的空格 printfprintf( );( ); for(j=1;j=2 for(j=1;j=2* *i-1;j+)i-1;j+) printfprintf(* *);); printf(nprintf(n);); 課堂練習課堂練習2: 輸出九九乘法表輸出九九乘法表4.5 循環(huán)程序設計循環(huán)程序設計n循環(huán)程序的實現要點:循環(huán)程序的實現要點:歸
36、納出歸納出哪些操作需要反復執(zhí)行?哪些操作需要反復執(zhí)行? 循環(huán)體循環(huán)體這些操作在什么情況下重復執(zhí)行這些操作在什么情況下重復執(zhí)行? 循環(huán)條件循環(huán)條件n選用合適的循環(huán)語句選用合適的循環(huán)語句for while do-whilen循環(huán)具體實現時分兩種情況考慮(循環(huán)條件):循環(huán)具體實現時分兩種情況考慮(循環(huán)條件):事先給定循環(huán)次數,首選事先給定循環(huán)次數,首選for語句語句通過其他條件控制循環(huán),考慮通過其他條件控制循環(huán),考慮while或或do-while語語句句循環(huán)語句的選擇循環(huán)語句的選擇一般說來,如果題目中給出了循環(huán)次數,首選一般說來,如果題目中給出了循環(huán)次數,首選for語句,它看起來最清晰,循環(huán)的語句,
37、它看起來最清晰,循環(huán)的4個組成個組成部分一目了然;如果循環(huán)次數不明確,需要部分一目了然;如果循環(huán)次數不明確,需要通過其他條件控制循環(huán),通常選用通過其他條件控制循環(huán),通常選用while語語句;如果必須先進入循環(huán),經循環(huán)體運算得句;如果必須先進入循環(huán),經循環(huán)體運算得到循環(huán)控制條件后,再判斷是否進行下一次到循環(huán)控制條件后,再判斷是否進行下一次循環(huán),使用循環(huán),使用do-while語句最合適。語句最合適。循環(huán)語句的選擇循環(huán)語句的選擇用類用類C語言的格式描述如下:語言的格式描述如下:if(循環(huán)次數已知)循環(huán)次數已知) 使用使用for語句語句else /* 循環(huán)次數未知循環(huán)次數未知 */if (循環(huán)條件在進
38、入循環(huán)時明確循環(huán)條件在進入循環(huán)時明確)使用使用while語句語句else /* 循環(huán)條件需要在循環(huán)體中明確循環(huán)條件需要在循環(huán)體中明確 */使用使用do-while語句語句選擇三種循環(huán)的一般思路選擇三種循環(huán)的一般思路n如果循環(huán)次數已知,用如果循環(huán)次數已知,用forn如果循環(huán)次數未知,用如果循環(huán)次數未知,用whilen如果循環(huán)體至少要執(zhí)行一次,用如果循環(huán)體至少要執(zhí)行一次,用do-whilen只是思路,不是定律只是思路,不是定律死循環(huán)死循環(huán)n永遠不會退出的循環(huán)為死循環(huán)永遠不會退出的循環(huán)為死循環(huán)for (;) while (1) do while (1)除非確實需要死循環(huán),否則不要使用這樣的形除非確實
39、需要死循環(huán),否則不要使用這樣的形式。它們使循環(huán)的中止條件變得不明朗式。它們使循環(huán)的中止條件變得不明朗n一般情況下,要極力避免死循環(huán)一般情況下,要極力避免死循環(huán)絕大多數程序不需要死循環(huán)。如果出現,往往絕大多數程序不需要死循環(huán)。如果出現,往往都是都是bug時間過長的循環(huán)會造成時間過長的循環(huán)會造成“假死假死”現象,也要考現象,也要考慮解決慮解決/*從輸入的從輸入的n個成績中選出最高分,用個成績中選出最高分,用for語句實現語句實現*/#include int main(void) int i, mark, max, n; /* max 中放最高分中放最高分*/ printf(“Enter n: ”)
40、; scanf (“%d”, &n); /*輸入數據個數輸入數據個數*/ printf(“Enter %d marks: ”, n); /*提示輸入提示輸入n個成績個成績*/ scanf (%d, &mark); /* 讀入第一個成績讀入第一個成績 */ max = mark; /* 假設第一個成績是最高分假設第一個成績是最高分 */ for (i = 1; i n; i+ )/*由于已經讀了一個數,循環(huán)執(zhí)行由于已經讀了一個數,循環(huán)執(zhí)行n-1次次*/ scanf (“%d”, &mark); /* 讀入下一個成績讀入下一個成績 */ if (max mark) /* 如
41、果該成績比最高分高如果該成績比最高分高 */ max = mark; /* 再假設該成績?yōu)樽罡叻衷偌僭O該成績?yōu)樽罡叻?*/ printf(Max = %dn, max); return 0;例例4-8求最值問題。求最值問題。 輸入一批學生的成績,求最高分輸入一批學生的成績,求最高分(for)mark maxmaxmarkEnter n: 5Enter 5 marks:67 88 73 54 82Max = 88Enter n: 0Enter 0 marks:67Max = 67/*從輸入的一批以負數結束的成績中選出最高分,用從輸入的一批以負數結束的成績中選出最高分,用while語句實現語句實現
42、*/#include int main(void) int mark, max; /* max中放最高分中放最高分*/ printf(“Enter marks:); scanf (%d, &mark); /* 讀入第一個成績讀入第一個成績 */ max = mark; /* 假設第一個成績是最高分假設第一個成績是最高分 */ /*當輸入的成績大于等于當輸入的成績大于等于0時,執(zhí)行循環(huán)時,執(zhí)行循環(huán)*/ while (mark = 0) if(max mark) /* 如果讀入的成績比最高分高如果讀入的成績比最高分高 */ max = mark ; /* 再假設該成績?yōu)樽罡叻衷偌僭O該成績?yōu)?/p>
43、最高分 */ scanf (“%d”, &mark ); /* 讀入下一個成績讀入下一個成績*/ printf(Max = %dn, max); return 0;例例4-8求最值問題求最值問題.輸入一批學生的成績,求最高分輸入一批學生的成績,求最高分(while)Enter marks:67 88 73 54 82 -1Max = 88Enter marks:-1Max = -1#include int main(void) int mark, max; /* max中放最高分中放最高分*/ max = -1; /* 給給max賦一個小初值賦一個小初值 */ printf(“Ente
44、r marks: ); do scanf (%d, &mark ); if (max = 0); printf(Max = %dn, max);例例4-8 求最值問題。輸入一批學生的成績,求最高分求最值問題。輸入一批學生的成績,求最高分(do-while)Enter marks: 67 88 73 54 82 -1Max = 88Enter marks: -1Max = -1例例4-9 逆序問題。輸入一個正整數,將其逆逆序問題。輸入一個正整數,將其逆序輸出。例如,輸入序輸出。例如,輸入12345,輸出,輸出54321。確定:確定:循環(huán)條件循環(huán)條件和和循環(huán)體循環(huán)體(循環(huán)不變式循環(huán)不變式)
45、 12345 5 4 3 2 112345 % 10 = 5 12345 / 10 = 1234 1234 % 10 = 4 1234 / 10 = 123 123 % 10 = 3 123 / 10 = 12 12 % 10 = 2 12 / 10 = 1 1 % 10 = 1 1 / 10 = 0 結束結束循環(huán)不變式循環(huán)不變式 x%10 x=x/10循環(huán)結束條件循環(huán)結束條件 x=0經過歸納得到:經過歸納得到:重復以下步驟:重復以下步驟:(a) x%10,分離一位,分離一位(b) x=x/10,為下一次分離做準備,為下一次分離做準備直到直到x=0,循環(huán)結束循環(huán)結束/*逆序輸出一個正整數逆序輸
46、出一個正整數*/#include int main(void) int x;printf(“Enter x:”);scanf( “%d”, &x);while (x != 0) printf( %d , x %10); x = x/10 ;Enter x: 123455 4 3 2 1用用do-while實現?實現?例例4-9 逆序問題。輸入一個正整數,將其逆逆序問題。輸入一個正整數,將其逆序輸出。例如,輸入序輸出。例如,輸入12345,輸出,輸出54321。例例4-10 素數問題。求素數問題。求500以內的全部素數,每行輸出以內的全部素數,每行輸出10個。個。for (m = 2;
47、m = 500; m+) if (m是素數是素數) printf( “%d”, m); /*輸出素數輸出素數*/n = sqrt(m);for(i = 2; i n) printf(yesn)else printf(non”);for (m = 2; m = 500; m+) n=sqrt(m); for(i = 2; i n) printf(%d, m) 例例4-10 源程序源程序#include #include int main(void) int count, i, m, n; count = 0; /* count 記錄素數的個數,用于控制輸出格式記錄素數的個數,用于控制輸出格式*/
48、 for (m = 2; m = 100; m+) n = sqrt(m); for (i = 2; i n) /* 如果如果m是素數是素數 */ printf(“%6d”, m); /* 輸出輸出m */ count+; /* 累加已經輸出的素數個數累加已經輸出的素數個數 */ if (count %10 = 0) printf(“n”); /* 如果如果count是是10的倍數,換行的倍數,換行 */ printf(“n”);例例4-11斐波那契數列問題。輸出斐波那契斐波那契數列問題。輸出斐波那契(Fibonacci)序列的前序列的前10項項 1, 1, 2, 3, 5, 8, 13,21
49、,34,55x1 x2 x x1 x2 xx1 = x2 = 1;x = x1 + x2;x1 = x2;x2 = x;int main(void) int I,x1,x2,x; /*x1和和x2依次代表前兩項,依次代表前兩項,x表示其后一項表示其后一項*/x1 = 1; /*頭兩項都是頭兩項都是1*/x2 = 1;printf (“%6d%6d”, x1, x2 ); /* 先輸出頭兩項先輸出頭兩項 */for (i = 1; i = 8; i+) /* 循環(huán)輸出后循環(huán)輸出后8項項 */ x = x1 + x2; /* 計算新項計算新項 */ printf(%6d, x); x1 = x2;
50、 /* 更新更新x1和和x2,為下一次計算新項,為下一次計算新項x作準備作準備 */ x2 = x; 雞兔共有雞兔共有30只,腳共有只,腳共有90只,編寫只,編寫一個程序計算雞兔各有多少只。一個程序計算雞兔各有多少只。解:設其中雞有解:設其中雞有x只,兔有只,兔有y只,列方程組得:只,列方程組得:x+y=302x+4y=90解得:解得:x=15y=15答:其中雞有答:其中雞有15只,兔有只,兔有15只。只。 雞兔共有雞兔共有30只,腳共有只,腳共有90只,編寫只,編寫一個程序計算雞兔各有多少只。一個程序計算雞兔各有多少只。#includevoid main( ) int x,y; if (x+y=30)&(2x+4y=90)printf(“x=%d,y=%d”,x,y); 雞兔共有雞兔共有30只,腳共有只,腳共有90只,編寫只,編寫一個程序計算雞兔各有多少只。一個程序計算雞兔各有多少只。改進?改進?例例4-12 窮舉算法窮舉算法(古典算術問題古典算術問題)搬磚頭搬磚頭某工地需要搬運磚塊,已知男人一人搬某工地需要搬運磚塊,已知男人一人搬3塊
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年電子脂肪秤項目合作計劃書
- 氣象預報系統歷史數據存儲策略
- 教育寓言類故事的解析
- 軟件應用教程
- 紅海行動寓言故事中的成長啟示
- Isoxepac-Standard-生命科學試劑-MCE
- 2025年劇裝道具相關工藝美術品合作協議書
- 4-epi-Edoxaban-tosylate-4-epi-DU-176b-生命科學試劑-MCE
- 金融投資行業(yè)理財產品投資風險免責協議
- 小學生學習方法探討征文
- 人教版八年級數學下冊課件【全冊】
- 物聯網管理平臺的設計與實現
- 1例妊娠糖尿病的個案護理
- 《排球正面雙手傳球》課件
- 光伏發(fā)電職業(yè)病危害預評價方案方案
- 財務報表涉稅分析
- 五官科眼耳鼻咽喉科醫(yī)療常用器械的認識
- 企業(yè)清產核資報表
- 淺談建筑工程機電安裝施工技術運用論文
- 2023年新改版教科版四年級下冊科學練習題(一課一練+單元+期中+期末)
- 婦產科護理學課程標準
評論
0/150
提交評論