版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第5章 循環(huán)程序設(shè)計2第5章 循環(huán)程序設(shè)計5.1 概述 5.2 while和do while循環(huán) 5.3 for循環(huán) 5.4 循環(huán)的嵌套 5.5 循環(huán)的控制 5.6 應(yīng)用舉例5.7 程序調(diào)試 3第5章 循環(huán)程序設(shè)計4第5章 循環(huán)程序設(shè)計5第5章 循環(huán)程序設(shè)計6第5章 循環(huán)程序設(shè)計7第5章 循環(huán)程序設(shè)計8第5章 循環(huán)程序設(shè)計9第5章 循環(huán)程序設(shè)計10第5章 循環(huán)程序設(shè)計 水溫度的量變引起水的物理形態(tài)的質(zhì)變: 水在標(biāo)淮大氣壓下加溫到100攝氏度變成汽 降溫到0攝氏度變成冰。11第5章 循環(huán)程序設(shè)計 物體從地球上拋射速度的量變引起運(yùn)動形式的質(zhì)變: 小于7911m/s時,在地面上沿彈道飛行; 達(dá)到79
2、11m/s時,繞地球作橢園軌道運(yùn)動,成為地球的衛(wèi)星; 增大到11189m/s時,脫離地球成為繞太陽運(yùn)行的一個行星; 速度達(dá)到16662m/s時,脫離太陽系成為迢游太空的一個天體。12第5章 循環(huán)程序設(shè)計 計算機(jī)程序由若干語句順序組成: 順序結(jié)構(gòu)的程序只能按照語句的先后順序從前向后依次執(zhí)行 分支結(jié)構(gòu)程序雖然允許在執(zhí)行了某個判斷后跳過某些語句執(zhí)行后面的語句,但也只能按語句的前后次序執(zhí)行 有時,需要在程序中重復(fù)執(zhí)行某個語句或語句塊,就需要循環(huán)結(jié)構(gòu)13第5章 循環(huán)程序設(shè)計生活中的例子: 擊鼓傳花:大家坐成一個圈,鼓聲響起的時候?qū)⒒ㄊ樞蚪坏较乱粋€人的手里,依次向下傳遞,當(dāng)鼓聲突然中斷時停止傳花,花束落
3、在誰的手里便成為輸家 4100米接力賽跑:第1個人跑完100米后將接力棒傳給第2個人,第2個人再跑100米,然后是第3個人,直到第4個人跑完最后一個100米 共同點(diǎn): 都要完成相同的任務(wù):量變的重復(fù)內(nèi)容 都有結(jié)束條件:發(fā)生質(zhì)變的界限14第5章 循環(huán)程序設(shè)計1. 計算sum=1+2+3+10015第5章 循環(huán)程序設(shè)計1. 計算sum=1+2+3+100循環(huán)體循環(huán)控制條件循環(huán)控制變量循環(huán)的初始化#include void main( ) int i=1, sum=0 ;while ( i = 100 )sum = sum + i ;i+ ;printf ( “Sum = %d n”, sum )
4、;16第5章 循環(huán)程序設(shè)計2. 計算sum=2+4+6+100循環(huán)體循環(huán)控制條件循環(huán)控制變量循環(huán)的初始化#include void main( ) int i=2, sum=0 ;while ( i = 100 )sum = sum + i ;i+=2 ;printf ( “Sum = %d n”, sum ) ;175.2 while和do while循環(huán)格式:while( 表達(dá)式 ) 語句do 語句 while( 表達(dá)式 ) ;說明: 括號中的“表達(dá)式”是循環(huán)控制條件,但不限于關(guān)系表達(dá)式和邏輯表達(dá)式 “語句”是單一語句,但可以是復(fù)合語句 如果while語句的括號后面只有“;”,則循環(huán)體為空
5、。如果do-while語句的括號后面(分號前面)還有其他符號,則出現(xiàn)語法錯誤185.2 while和do while循環(huán)while語句的執(zhí)行過程while語句的執(zhí)行過程是:計算“表達(dá)式”的值;若“表達(dá)式”的值不時0,為“真”,繼續(xù)執(zhí)行;否則,結(jié)束循環(huán),轉(zhuǎn)到while語句后面的語句繼續(xù)執(zhí)行程序;執(zhí)行“語句”部分,即執(zhí)行循環(huán)體;返回繼續(xù)執(zhí)行。195.2 while和do while循環(huán)do-while語句的執(zhí)行過程205.2 while和do while循環(huán)循環(huán)語句的特點(diǎn): while循環(huán)是“先判斷后循環(huán)”,如果開始時循環(huán)條件不滿足,循環(huán)體就一次也不執(zhí)行 do-while循環(huán)是“先循環(huán)后判斷”,即
6、使第一次判斷的結(jié)果為“假”,循環(huán)體也已經(jīng)執(zhí)行了一次 但不論哪種循環(huán),循環(huán)體中必須包含能夠使循環(huán)條件變?yōu)椤凹佟钡倪\(yùn)算215.2 while和do while循環(huán)循環(huán)的變化:sum=1+2+3+100#include void main( ) int i=1, sum=0 ;while ( i= 100 )sum = sum + i+ ;printf ( “Sum = %d n”, sum ) ;#include void main( ) int i=1, sum=0 ;dosum = sum + i ;i+;while ( i= 100 );printf ( “Sum = %d n”, sum
7、) ;225.2 while和do while循環(huán)幾何級數(shù)2x的力量: 一頁普通紙的厚度約為0.1mm(1mm=10-3m) 珠穆朗瑪峰的高度為8844.43m 編寫程序計算一下,普通紙對折多少次可以超過珠穆朗瑪峰的高度?235.2 while和do while循環(huán)#include void main( )double paper_height, mountain_height;int number;paper_height=0.0001;mountain_height=8844.43;number=0;while ( paper_height mountain_height ) paper_
8、height *= 2; number += 1; printf(對折第%d次后的高度是%g。n, number, paper_height);245.2 while和do while循環(huán)幾何級數(shù)2x的力量: 中國戰(zhàn)國時期的趙國辯士公孫龍有一個著名命題:“一尺之棰,日取其半,萬世不竭”。這是說,一尺長(0.33m)的一根木棰,每天取它一半,世世代代也取不完。這一命題,包含了某些樸素辯證法的思想,它猜測到了物質(zhì)的無限可分性。但嚴(yán)格說來它并不科學(xué)。因?yàn)榫湍骋痪唧w物質(zhì)形態(tài)來說,它在被分割到一定程度時就不再是這一事物了。 最大的原子是銫,半徑為225pm(1pm=10-12m) 編寫程序計算一下,這只
9、木棰日取一半,取多少天可以比銫原子的半徑???255.2 while和do while循環(huán)265.2 while和do while循環(huán)#include void main( )double hammer_height, cesium_radius;int number;hammer_height=0.33;cesium_radius=225e-12;number=0;while ( cesium_radius hammer_height ) hammer_height /= 2; number += 1; printf(第%d天后的高度是%g。n, number, hammer_height);
10、275.2 while和do while循環(huán) 恩格斯說:“純粹的量的分割是有一個極限的,到了這個極限它就轉(zhuǎn)化為質(zhì)的差別;物體純粹是由分子構(gòu)成的,但它是本質(zhì)上不同于分子的東西,正如分子又不同于原子一樣”。 取到第3天,剩下的部分4.125cm長,這時它還能做為“木棰”嗎?取到第31天,它剩下的部分已經(jīng)沒有分子那么大了,這時它不僅不再能成為“木棰”,連木頭的物理分子都已經(jīng)不是了。當(dāng)然,它還可以被取下去,但隨著次數(shù)的變化,它必然會發(fā)生不同層次的質(zhì)變。 嚴(yán)格說來,應(yīng)該是“一尺之棰,日取其半,三日可竭”;作為木質(zhì)應(yīng)該是“一只之棰,日取其半,一月乃竭”;作為物質(zhì),應(yīng)該是“一尺之棰,日取其半,萬世不蝎”。這
11、就是說,不同層次的量變,總是引起與之相應(yīng)的質(zhì)變。285.2 while和do while循環(huán)循環(huán)的嵌套 如果在一個循環(huán)的循環(huán)體內(nèi)包含另一個完整的循環(huán)則稱為循環(huán)的嵌套,其中被嵌套的循環(huán)稱為內(nèi)循環(huán),而嵌套了內(nèi)循環(huán)的是外循環(huán) 內(nèi)循環(huán)還可以嵌套循環(huán),形成多級(層)嵌套295.2 while和do while循環(huán)順序打印1-10的階乘,即1!, 2!, , 10! 本題的關(guān)鍵是求階乘 數(shù)學(xué)上,n!=123(n-1)n305.2 while和do while循環(huán)外循環(huán)內(nèi)循環(huán)對比程序:#include void main( ) int i=1;float f = 1;while( i = 10 )f = f
12、 * i;printf( %2d! = %.0f n, i, f );i + ;思考一下:8-10的階乘#include void main( )int i=1, j ;float f ;while( i = 10 )j = 1;f = 1;while( j = i )f = f * j;j + ;printf( “ %2d! = %.0f n”, i, f );i + ;315.2 while和do while循環(huán) 循環(huán)的嵌套不僅可以發(fā)生在相同語句之間,如while嵌套while、do-while嵌套do-while,while語句和do-while語句也可以互相嵌套(1)while(.)(
13、2)while()while() dowhile();(3)do(4)dowhile() do while() ; while() ;325.2 while和do while循環(huán)錯誤的嵌套形式 循環(huán)必須是完整的,不允許內(nèi)外循環(huán)交叉嵌套f = 1;while( i 10)i=1;do f = f * i;i +; while( i10 );混亂的控制條件 內(nèi)外循環(huán)的循環(huán)控制條件通常是分開的內(nèi)外循環(huán)的循環(huán)控制條件通常是分開的,相對獨(dú)立的,相對獨(dú)立的i=1; s=0;while ( i 3 )s = s + f;i = 1; f=1;while( i5)i +=2;f = f * i;i+ ; 33
14、5.2 while和do while循環(huán)應(yīng)用舉例 輸入一個5位數(shù),計算并輸出各位的和方法一:將輸入的5位數(shù)看作是5個獨(dú)立的數(shù)字字符,依次讀取每一個數(shù)字字符,將其轉(zhuǎn)化為對應(yīng)的數(shù)字后再求和 將數(shù)組字符ch轉(zhuǎn)化為數(shù)字的方法為ch-0345.2 while和do while循環(huán) 輸入一個5位數(shù),計算并輸出各位的和#include void main( ) char ch ;int i=0, sum = 0;printf(“Enter a number with 5 digits: ”);while( i 5 )ch = getchar( );sum += ch - 0 ; /* 將數(shù)字字符轉(zhuǎn)化為對應(yīng)的
15、數(shù)字 */ i+ ;printf( “Sum of these 5 digits is %dn”, sum ) ;355.2 while和do while循環(huán)幾種常見運(yùn)算:幾種常見運(yùn)算:l如果如果chch為數(shù)字字符,則表達(dá)式為數(shù)字字符,則表達(dá)式ch - ch - 0 0的值為對應(yīng)的數(shù)字的值為對應(yīng)的數(shù)字l如果如果chch為大寫字母,則表達(dá)式為大寫字母,則表達(dá)式 ch-ch-A A+ +a a 為對應(yīng)的小寫字母為對應(yīng)的小寫字母l如果如果chch為小寫字母,則表達(dá)式為小寫字母,則表達(dá)式 ch-ch-a a+ +A A 為對應(yīng)的大寫字母為對應(yīng)的大寫字母技巧技巧365.2 while和do while循
16、環(huán) 輸入一個5位數(shù),計算并輸出各位的和方法二:將輸入的5位數(shù)看作一個整數(shù),先讀取該整數(shù),再分離出各位數(shù)字 對于整數(shù)x,其個位數(shù)為 x%10 要求整數(shù)x的十位數(shù),可以先令x=x/10,再求x的個位數(shù)375.2 while和do while循環(huán) 輸入一個5位數(shù),計算并輸出各位的和#include void main( ) int x, x1, r, sum = 0;printf(Enter a number: );scanf( %d, &x) ;x1=x;while( x 0 )r = x % 10;sum += r ; x /= 10 ;printf( Sum of the digits
17、 in %d is %dn, x1, sum ) ;385.2 while和do while循環(huán) 任意輸入一行字符,統(tǒng)計字母a和A的個數(shù)#include void main( )char ch;int count=0;printf( Enter characters: );doch = getchar( );if( ch=A | ch=a ) count+; while( ch != n );printf( Counter of a or A: %dn , count );395.2 while和do while循環(huán)405.2 while和do while循環(huán)#include void mai
18、n( )int f = -1, n =1 ;float t, pi = 0 ;/* t為最后一項(xiàng)的值 */dof = -f ;/* 第n項(xiàng)的符號 */t = 1.0 / ( 2*n -1 ) ;/* 用1.0是為了避免整除 */pi += f * t ;n+ ; while( t 1e-5 );pi = 4 * pi ;printf( PI = %.4f n, pi ) ;415.3 for語句 for語句是常用的、特殊的循環(huán)控制語句 for語句的功能強(qiáng)大,使用靈活,變化多樣 for語句優(yōu)點(diǎn):將“循環(huán)初始化條件”、“循環(huán)控制條件”、“循環(huán)控制變量的修改”集中表示 將量變與質(zhì)變的因素集中表示42
19、5.3 for語句for語句的用法for( 表達(dá)式1 ; 表達(dá)式2 ; 表達(dá)式3 ) 語句l“表達(dá)式表達(dá)式1 1”用于用于循環(huán)的初始化循環(huán)的初始化l“表達(dá)式表達(dá)式2 2”是是forfor語句的語句的循環(huán)控制條件循環(huán)控制條件,當(dāng)循環(huán)控制條件為,當(dāng)循環(huán)控制條件為1(True)1(True)或非或非0 0時,運(yùn)行代表循環(huán)體的時,運(yùn)行代表循環(huán)體的“語句語句”部分,可以是任何形式的表達(dá)部分,可以是任何形式的表達(dá)式式l“表達(dá)式表達(dá)式3 3”用于用于修改循環(huán)控制變量的值修改循環(huán)控制變量的值,目的是使,目的是使“表達(dá)式表達(dá)式2 2”的值的值變?yōu)樽優(yōu)?(False)0(False),以結(jié)束循環(huán),以結(jié)束循環(huán)l“語
20、句語句”部分是部分是forfor語句的語句的循環(huán)體循環(huán)體,可以是單一語句,也可以是復(fù),可以是單一語句,也可以是復(fù)合語句合語句435.3 for語句for語句的執(zhí)行過程445.3 for語句使用for語句編程。計算sum=1+2+3+100#include void main( ) int i, sum=0 ;for( i =1 ; i=100 ; i+)sum += i ;printf( “sum = %d n, sum );455.3 for語句任意輸入10個數(shù),求平均值#include void main( ) int i ;float x, sum=0 ;printf( Enter 10
21、 numbers one by one: n );for( i =1 ; i=10 ; i+)scanf( %f, &x );sum += x ;printf( Average is %f n, sum/10 );465.3 for語句循環(huán)的嵌套 for語句可以嵌套for語句構(gòu)成循環(huán)的嵌套 for語句也可以與while語句、do-while語句互相嵌套475.3 for語句例:順序打印1-10的階乘,即1!, 2!, 3!, , 10!#include void main( )int i, j ;float f ;for( i=1; i = 10 ; i+ )f = 1;for( j=
22、1; j = i ; j+ )f = f * j; printf( %2d! = %.0f n, i, f );#include void main( )int i=1, j ;float f ;while( i = 10 )j = 1;f = 1;while( j = i )f = f * j;j + ;printf( “ %2d! = %.0f n”, i, f );i + ;485.3 for語句例:打印幾何圖形對于這類問題,每行中星號的個數(shù)、總行數(shù)等都應(yīng)該用循環(huán)結(jié)構(gòu)進(jìn)行控制,而不是直接輸出若干行字符串#include void main( )int i, j ;for(i=1; i =
23、 4; i+ )for( j = 0; ji ; j+ ) putchar( );for( j = 1; j=6 ; j+ ) putchar(*);putchar(n);*495.3 for語句例:甲、乙兩個會計進(jìn)行點(diǎn)鈔比賽,甲的速度為5張/秒,乙的為8張/秒。乙在甲已經(jīng)點(diǎn)了100張鈔票后才開始,問:只要幾秒時間乙就可以超過甲?l 經(jīng)過經(jīng)過 t 秒,甲點(diǎn)過的鈔票數(shù)秒,甲點(diǎn)過的鈔票數(shù)有有 x=100+5t 張,乙的為張,乙的為 y=8t 張張l 問題就是求問題就是求 yx 時的時的 t 值值#include void main( )int t ;int x=100, y=0 ;for( t=0
24、 ; x y ; t+ )x = 100+5*t ;y = 8 * t;printf( Time is %d secondsn, t);505.3 for語句for語句的變化形式 可以省略for語句的“表達(dá)式1”或“表達(dá)式3”,也可以都省略(“退化為”while語句)例:將用鍵盤輸入的若干字符順序輸出到屏幕上#include void main( ) char ch ;for( ; (ch=getchar( ) ) !=n ; )putchar( ch ) ;515.3 for語句 如果省略“表達(dá)式2”,則循環(huán)控制條件總為“真”下面的語句是“合法”的,但構(gòu)成了“死循環(huán)”: for( i=1;
25、; i+) sum += i ;l下面的程序在運(yùn)行時會因?yàn)橄旅娴某绦蛟谶\(yùn)行時會因?yàn)椤俺粤愠粤恪倍鲥e:而出錯:#include void main( )char i ;int sum=0 ;for( i=1; ; i+) sum += 1000 / i ;printf( sum=%d n, sum);525.4 循環(huán)的控制 復(fù)雜的循環(huán)控制條件對循環(huán)的控制問題,不僅僅是防止對循環(huán)的控制問題,不僅僅是防止“死循環(huán)死循環(huán)”,還包括選擇恰當(dāng)?shù)臅r機(jī),還包括選擇恰當(dāng)?shù)臅r機(jī),正確地結(jié)束循環(huán)正確地結(jié)束循環(huán) 有的時候,循環(huán)控制條件是復(fù)雜的,還可能是多種條件的綜合有的時候,循環(huán)控制條件是復(fù)雜的,還可能是多種條
26、件的綜合53例:假設(shè)每個班最多有例:假設(shè)每個班最多有3030個人,依次輸入每個人的成績,如果輸入的不個人,依次輸入每個人的成績,如果輸入的不是是0-1000-100之間的數(shù),或者已經(jīng)輸入了之間的數(shù),或者已經(jīng)輸入了3030個數(shù),則結(jié)束輸入,輸出計算個數(shù),則結(jié)束輸入,輸出計算結(jié)果。結(jié)果。#include void main( )int i = 0, flag=1 ;float score, ave = 0 ;printf( Enter scores one by one:n );while ( i 30 & flag =1 )scanf( %f, &score );if( scor
27、e 100 )flag = 0;elseave += score;i+ ;if( i 0 ) ave = ave / i;printf(Average: %.2fn, ave);545.4 循環(huán)的控制 下面的程序塊常用來對輸入的數(shù)據(jù)進(jìn)行限制:下面的程序塊常用來對輸入的數(shù)據(jù)進(jìn)行限制:do scanf(%d, &iInput );while( iInput MAXIMUM );或者,或者, scanf(%d, &iInput );while( iInput MAXIMUM ) scanf(%d, &iInput ); 常用下面的程序塊要求用戶選擇常用下面的程序塊要求用戶選擇
28、Yes或或No,忽略其他輸入:,忽略其他輸入:printf(Enter Yes / No ? );do ch=getchar( );while( ch!=y & ch!=Y & ch!=n & ch!=N );或者,?或者,?(討論一下討論一下)技巧技巧55例:利用隨機(jī)數(shù)產(chǎn)生一個乘法算式,用戶輸入算式的運(yùn)算結(jié)果,由程序判斷對錯。#include #include void main( )int iFor = 0, iErr =0 ;int x, y, iAns ; char ch;doiFor +;x = rand() % 100;y = rand() % 100;pr
29、intf( %d x %d = ? , x, y );scanf( %d, &iAns );if( iAns=x*y ) printf( Right!n ) ;elseiErr +; printf( You are wrong.n ) ;printf(Are you want to continue ? (Y/N) ) ;do ch=getchar( );while( ch!=y & ch!=Y & ch!=n & ch!=N ); while( ch=y | ch=Y );printf(In %d questions, , iFor );printf(youv
30、e made %d right, %d wrong.n, iFor - iErr, iErr );565.4 循環(huán)的控制break語句l breakbreak語句的格式為:語句的格式為:break;break;l 在在switchswitch語句中,語句中,breakbreak語句用于跳語句用于跳過后面的語句,結(jié)束過后面的語句,結(jié)束switchswitch語句語句l 在循環(huán)結(jié)構(gòu)中,在循環(huán)結(jié)構(gòu)中,breakbreak語句的作用是語句的作用是跳出循環(huán)結(jié)構(gòu),執(zhí)行循環(huán)后面的語跳出循環(huán)結(jié)構(gòu),執(zhí)行循環(huán)后面的語句句在下面的程序塊中,由于在下面的程序塊中,由于breakbreak語語句的作用,循環(huán)只進(jìn)行了句的
31、作用,循環(huán)只進(jìn)行了1 1次,次,printfprintf語句一次也沒有執(zhí)行,并且語句一次也沒有執(zhí)行,并且永遠(yuǎn)也不會被執(zhí)行:永遠(yuǎn)也不會被執(zhí)行:for( i=1; i 100; i+) sum += i;break;printf( %d, sum );575.4 循環(huán)的控制continue語句l continue語句的格式為:continue;l continue語句只能用在循環(huán)結(jié)構(gòu)中,用于結(jié)束本次循環(huán),即跳過循環(huán)體中后面的語句,開始下一次循環(huán)下面的語句塊中,循環(huán)次數(shù)是下面的語句塊中,循環(huán)次數(shù)是100100次,但次,但printfprintf語句一次也沒有執(zhí)行:語句一次也沒有執(zhí)行:for( i=1
32、; i 100; i+) sum += i;continue;printf( %d, sum );585.4 循環(huán)的控制break語句和continue語句的有效范圍都僅限于所在的循環(huán)語句之內(nèi)。如果想從嵌套的循環(huán)結(jié)構(gòu)的內(nèi)循環(huán)中直接跳出到外循環(huán)之外,使用一個break語句是不行的??尚械姆椒ㄊ牵涸诔绦蛑幸胍粋€標(biāo)識變量,在各循環(huán)的結(jié)束位置檢測這一標(biāo)識,用多個break語句作連續(xù)的跳轉(zhuǎn)flag =1while( i 10 )for( j=i; j10; j+)if( j=2*i)flag =0;break;if( flag != 1)break;printf(%d, i);595.4 循環(huán)的控制例
33、:順序打印100-1000之間所有9的倍數(shù),如果一個數(shù)同時也是7的倍數(shù)則停止打印#include void main( ) int i ;for( i=100; i1000; i+) if( i % 9 !=0 ) continue ;printf( %5d, i ) ;if( i % 7 =0 ) break;605.4 循環(huán)的控制例:求任意正整數(shù)的除了自身以外的最大因數(shù)#include void main( )int i, n;printf( Enter a number: );scanf(%d, &n );for( i=n-1 ; i0; i- )if( n % i = 0 )
34、break;printf(The biggest factor of %d is %dn, n, i );615.4 循環(huán)的控制goto語句l goto語句是從早期程序設(shè)計語言遺留下來的一個語句,稱為無條件跳轉(zhuǎn)語句,已被淘汰l goto語句的使用格式是:goto 語句標(biāo)號;l “語句標(biāo)號”是一個特殊的標(biāo)識符,由字母、數(shù)字或下劃線組成(第一個字符不能是數(shù)字),后面跟冒號“:”,放在語句行的最前頭#include void main( )int i =100;while( i1000 )if( i % 9 !=0 ) goto Next ;printf( “%5d”, i ) ;Next: i +
35、;例:打印所有的100-1000間9的倍數(shù)625.5 應(yīng)用舉例阿米巴原蟲,以細(xì)菌和更小的原蟲為食 中樞神經(jīng)系統(tǒng)的阿米巴原蟲感染水溶組織內(nèi)阿米巴在一個試管中吞吃細(xì)菌被稱為“食腦變形蟲”的阿米巴原蟲能從人的鼻子里鉆入大腦,將人的腦子“吃”掉。635.5 應(yīng)用舉例例:阿米巴用簡單分裂方式繁殖,每分裂一次用時3分鐘。將若干個阿米巴放在一個盛滿營養(yǎng)液的容器內(nèi),45分鐘后容器內(nèi)充滿了阿米巴。已知容器最多可以裝阿米巴220個,試問,開始的時候往容器內(nèi)放了多少個阿米巴? 分析:根據(jù)題意,阿米巴每根據(jù)題意,阿米巴每3分鐘分裂一次,分鐘分裂一次,那么從開始將阿米巴放入容器里面,到那么從開始將阿米巴放入容器里面,到
36、 45 分鐘分鐘后充滿容器,需要分裂后充滿容器,需要分裂15次。而次。而“容器最多可容器最多可以裝阿米巴以裝阿米巴220個個”,即阿米巴分裂,即阿米巴分裂15次以后得次以后得到的個數(shù)是到的個數(shù)是220。題目要求計算分裂之前的阿米。題目要求計算分裂之前的阿米巴數(shù),不妨巴數(shù),不妨使用倒推的方法使用倒推的方法,從第,從第15次分裂之次分裂之后的后的220個,倒推出第個,倒推出第 15 次分裂之前(即第次分裂之前(即第14次分裂之后)的個數(shù),再進(jìn)一步倒推出第次分裂之后)的個數(shù),再進(jìn)一步倒推出第 14次次分裂之前、第分裂之前、第13次分裂之前、次分裂之前、第第1次分裂之次分裂之前的個數(shù)。前的個數(shù)。645
37、.5 應(yīng)用舉例設(shè)開始時阿米巴的個數(shù)為設(shè)開始時阿米巴的個數(shù)為x0,第,第1次、第次、第2次、第次、第3次次第第15次分裂之后的個數(shù)分次分裂之后的個數(shù)分別為別為x1、x2、x3、x15,則有以下關(guān),則有以下關(guān)系:系:x0=x1/2x1=x2/2xn=xn+1/2x14=x15/2已知已知x15=220,可以利用上面的關(guān)系倒推出,可以利用上面的關(guān)系倒推出x0#include #include void main( )int i ;long x = pow(2, 20) ;for( i = 15; i0 ; i-) x = x / 2 ;printf( There are %d amebas.n ,
38、x ) ;65例:谷角猜想,對于任意一個自然數(shù)n,若n為偶數(shù),則將其除以2;若n為奇數(shù),則將其乘以3,然后再加1。如此反復(fù),經(jīng)過有限次運(yùn)算后,總可以得到自然數(shù)1。試編程驗(yàn)證之。#include void main( )int n ;printf( Enter a number: ) ;scanf( %d, &n );printf( %5d, n );while( n 1 )if( n%2 = 0 ) n /= 2;else n = 3* n +1 ;printf(%5d, n );665.5 應(yīng)用舉例例:打印九九乘法口訣表要求:九九乘法口訣表呈三角形,共有9行。第1行有1列,第2行有2
39、列,第9行有9列。打印方法是,用外循環(huán)控制行數(shù),包括打印一行中的所有列和換行,在內(nèi)循環(huán)中,打印某一行上的所有列。#include void main( )int i, j;for( i=1; i = 9; i+ )for( j=1; j = i; j+ ) printf( %1dx%1d=%-4d, j, i, j*i );printf(n);67例:利用迭代公式 求 的近似值,結(jié)果保留5位有效數(shù)字。11()2nnnaxxxxa用該迭代公式求用該迭代公式求a的平方根的平方根x,實(shí)際是求近似值實(shí)際是求近似值xn+1,即,即xxn+1,“保留保留5位有效數(shù)字位有效數(shù)字”可理解為可理解為|xn+1-
40、xn|/ xn+110-5#include #include void main( )float x, y, y0 ;printf( Enter a positive: ) ;do scanf(%f, &x ) ; while( x 1e-5 );printf(Square root of %f is %fn,x, y );68例:利用牛頓迭代法求方程的 在2附近的一個實(shí)根。3253220 xx對于方程f (x)=0,把f (x)在x0附近展開成泰勒級數(shù):f (x) = f (x0) + (xx0) f (x0) + (xx0)2 f (x0) +取線性部分作為方程f (x) = 0的
41、近似方程,則有:f (x0) + f (x0)(xx0) = 0設(shè)f (x0) 0,則方程的近似解為:x1=x0f (x0) / f (x0)再把f (x)在x1附近展開,也取其線性部分。若f (x1)0,則得到方程的另一個近似解:x2=x1f (x1)/f (x1)這樣,可得到牛頓法的一個迭代序列:xn+1=xnf (xn)/f (xn)當(dāng)f (xn+1)0時即可認(rèn)為xn+1就是方程f (x)=0的近似解。對于本題,f (x) = 5x3 - 3x2 - 22f (x) = 15x2 - 6xx0 = 269例:利用牛頓迭代法求方程的 在2附近的一個實(shí)根。3253220 xx#include
42、 void main( ) float x, y, y1;x = 2;do y = x*x* ( 5*x - 3 ) - 22 ;y1 = (15 * x 6 ) * x ;x = x y / y1; while( fabs( y ) 1e-5 )printf(The root is %fn, x);705.6 程序調(diào)試 對于程序設(shè)計而言,即使優(yōu)秀的程序員也不能保證不會犯錯誤 一個優(yōu)秀的程序,不在于使用了先進(jìn)的算法,而在于僅僅包含少量的錯誤 程序中的錯誤是在所難免的,關(guān)鍵是發(fā)現(xiàn)并糾正錯誤 初學(xué)程序設(shè)計的人有必要從一開始就養(yǎng)成良好的習(xí)慣,培養(yǎng)嚴(yán)謹(jǐn)?shù)墓ぷ髯黠L(fēng),并逐步掌握一些編程技巧715.6 程序
43、調(diào)試程序調(diào)試的一般策略程序中的錯誤一般可分為:程序中的錯誤一般可分為:比較容易發(fā)現(xiàn),通常,有語法錯誤的程序不能通過編譯和連比較容易發(fā)現(xiàn),通常,有語法錯誤的程序不能通過編譯和連接,也就不能生成可執(zhí)行的程序接,也就不能生成可執(zhí)行的程序又叫語義錯誤,也就是不能正確地表達(dá)所需要的功能,是較又叫語義錯誤,也就是不能正確地表達(dá)所需要的功能,是較常見的錯誤之一。其外部表現(xiàn)為,程序可以運(yùn)行,但有時出錯,有時常見的錯誤之一。其外部表現(xiàn)為,程序可以運(yùn)行,但有時出錯,有時又不出錯。邏輯錯誤通常比較難于被發(fā)現(xiàn),查錯和糾錯對任何程序員又不出錯。邏輯錯誤通常比較難于被發(fā)現(xiàn),查錯和糾錯對任何程序員來說都是挑戰(zhàn)來說都是挑戰(zhàn)比
44、較少見,通常是由于對問題的分析不徹底造成的,糾正這比較少見,通常是由于對問題的分析不徹底造成的,糾正這類錯誤需要重新設(shè)計程序類錯誤需要重新設(shè)計程序725.6 程序調(diào)試調(diào)試程序的一般步驟為:調(diào)試程序的一般步驟為:,也就是人工檢查,是在完成程序設(shè)計后,在上機(jī)調(diào)試前,仔細(xì)地對程序代碼,也就是人工檢查,是在完成程序設(shè)計后,在上機(jī)調(diào)試前,仔細(xì)地對程序代碼進(jìn)行全面的檢查。通過靜態(tài)檢查,不僅可以發(fā)現(xiàn)程序中的語法錯誤,也可以發(fā)現(xiàn)邏輯錯進(jìn)行全面的檢查。通過靜態(tài)檢查,不僅可以發(fā)現(xiàn)程序中的語法錯誤,也可以發(fā)現(xiàn)邏輯錯誤,甚至發(fā)現(xiàn)設(shè)計上的缺陷。為便于查錯,應(yīng)力求做到編碼的標(biāo)準(zhǔn)化、文檔化,增強(qiáng)編誤,甚至發(fā)現(xiàn)設(shè)計上的缺陷。
45、為便于查錯,應(yīng)力求做到編碼的標(biāo)準(zhǔn)化、文檔化,增強(qiáng)編碼的可讀性、可理解性、可維護(hù)性。要做到:采用結(jié)構(gòu)化方法,劃分功能模塊和程序段,碼的可讀性、可理解性、可維護(hù)性。要做到:采用結(jié)構(gòu)化方法,劃分功能模塊和程序段,采用必要的縮進(jìn)和對齊,簡化表達(dá)式,每行只有一個語句,盡量使用注釋,使用有意義采用必要的縮進(jìn)和對齊,簡化表達(dá)式,每行只有一個語句,盡量使用注釋,使用有意義的標(biāo)識符,的標(biāo)識符,是指通過上機(jī)調(diào)試發(fā)現(xiàn)錯誤的過程。完成編碼后,可以借助編譯程序檢查隱,是指通過上機(jī)調(diào)試發(fā)現(xiàn)錯誤的過程。完成編碼后,可以借助編譯程序檢查隱藏的語法錯誤,如錯誤標(biāo)識符、非法的表達(dá)式、錯誤的函數(shù)調(diào)用等。利用連接程序,可藏的語法錯誤
46、,如錯誤標(biāo)識符、非法的表達(dá)式、錯誤的函數(shù)調(diào)用等。利用連接程序,可以檢查連接錯誤,如調(diào)用了未定義的函數(shù)、缺乏必要的函數(shù)定義等。通過試運(yùn)行程序,以檢查連接錯誤,如調(diào)用了未定義的函數(shù)、缺乏必要的函數(shù)定義等。通過試運(yùn)行程序,可以發(fā)現(xiàn)一些邏輯錯誤,如錯誤的計算、有問題的輸入和輸出等可以發(fā)現(xiàn)一些邏輯錯誤,如錯誤的計算、有問題的輸入和輸出等735.6 程序調(diào)試程序中的錯誤有兩種:程序中的錯誤有兩種:Error和和Warning Error是必須要糾正的,任何是必須要糾正的,任何Error都會導(dǎo)致編譯或連接失敗都會導(dǎo)致編譯或連接失敗 Warning一般不影響生成可執(zhí)行的一般不影響生成可執(zhí)行的“程序程序”,但程
47、序有缺陷,但程序有缺陷 合格的程序員不僅要糾正致命合格的程序員不僅要糾正致命Error,也要重視并糾正,也要重視并糾正Warning 當(dāng)程序中錯誤較多時,應(yīng)從最前面的錯誤開始逐一改正當(dāng)程序中錯誤較多時,應(yīng)從最前面的錯誤開始逐一改正有些錯誤實(shí)際出自同樣的原因,只要糾正了其中的一個就會消除所有這些錯有些錯誤實(shí)際出自同樣的原因,只要糾正了其中的一個就會消除所有這些錯誤誤745.6 程序調(diào)試程序的跟蹤與調(diào)試,以Visual C+ 6.0為例1、程序的“調(diào)試”運(yùn)行方式打開主菜單,點(diǎn)擊 “Go”(快捷鍵是F5)755.6 程序調(diào)試2、使程序暫停的方法執(zhí)行到光標(biāo)處:將光標(biāo)放在一個語句行上,單擊“debug”
48、工具欄中的“Run to Cursor”按鈕 設(shè)置斷點(diǎn):將光標(biāo)放在一個語句行上,然后點(diǎn)擊“Add/Remove Breakpoint”按鈕 ,即可在此設(shè)置(或取消)一個斷點(diǎn)“中斷”(Break)方式:當(dāng)程序運(yùn)行在調(diào)試方式下時,單擊“Break”按鈕,即可立即“中斷”程序的運(yùn)行;要恢復(fù)暫停程序的執(zhí)行,只要單擊“Go”按鈕即可765.6 程序調(diào)試3、在“暫停”狀態(tài)下常見的操作 單步運(yùn)行程序。點(diǎn)擊“Step Over”按鈕 或“Step Into”按鈕即可一行一行地執(zhí)行程序,每執(zhí)行完一行都自動進(jìn)入暫停狀態(tài) 觀察變量的值。使用“Variables”窗口可觀察程序中的各種變量的當(dāng)前值,點(diǎn)擊其中的“Loc
49、als”選項(xiàng)卡可以顯示所定義的變量的值。在“Watch”窗口中,也可以添加或刪除要觀察的變量的值。當(dāng)“Watch”有效時,點(diǎn)擊選中源代碼窗口,把鼠標(biāo)指向任何變量,稍待片刻,就會彈出該變量的值 修改變量的值。要臨時修改變量的值,可以雙擊改變量的“Value”域(在Variables窗口或Watch窗口都有效),進(jìn)行編輯 模擬計算。單擊“QuickWatch”按鈕 ,彈出“QuckWatch”對話框,可以用當(dāng)前程序中的變量組成算式進(jìn)行簡單的模擬運(yùn)算775.6 程序調(diào)試4、查錯的技巧程序中隱藏的錯誤通常難于發(fā)現(xiàn),可以采取一些技巧:但這種辦法并不理想,一來使用起來不方便,二來破壞了程序的原有結(jié)構(gòu),三是
50、在不需要的時候還要一一刪除,不注意會遺漏。使用條件編譯會更好些,這是比較高效的方法一旦懷疑某段程序有錯,可以在程序段的開始位置設(shè)置斷點(diǎn),當(dāng)程序運(yùn)行到斷點(diǎn)而暫停時,通過一步一步地執(zhí)行程序,并觀察變量的變化,判斷錯誤是否存在。但這種方法也有不利的地方,比如,如果程序段所表達(dá)的邏輯比較復(fù)雜,或者循環(huán)次數(shù)很多,都會導(dǎo)致調(diào)試?yán)щy。對程序段的執(zhí)行邏輯進(jìn)行仔細(xì)分析,劃分程序執(zhí)行路徑的種類,針對每種路徑設(shè)計若干組不同的輸入數(shù)據(jù),依次使用這些數(shù)據(jù)來測試程序,觀察程序的運(yùn)行狀態(tài)和結(jié)果,以發(fā)現(xiàn)可能隱藏著的錯誤78小強(qiáng)蛋糕店之“成本核算” 小強(qiáng)蛋糕店開張已經(jīng)快有兩個月了,小強(qiáng)起早貪黑、沒日沒夜地干活,但是每到月小強(qiáng)蛋
51、糕店開張已經(jīng)快有兩個月了,小強(qiáng)起早貪黑、沒日沒夜地干活,但是每到月底結(jié)算的時候,他卻發(fā)現(xiàn)經(jīng)濟(jì)上入不敷出!雖然小強(qiáng)天性底結(jié)算的時候,他卻發(fā)現(xiàn)經(jīng)濟(jì)上入不敷出!雖然小強(qiáng)天性“樂善好施樂善好施”、“學(xué)雷鋒做好學(xué)雷鋒做好事事”,但是如果長期如此,蛋糕店不久也會,但是如果長期如此,蛋糕店不久也會“關(guān)門大吉關(guān)門大吉”了。了。 為了找出原因所在,小強(qiáng)打算應(yīng)用羅老師傳授的為了找出原因所在,小強(qiáng)打算應(yīng)用羅老師傳授的“循環(huán)程序結(jié)構(gòu)循環(huán)程序結(jié)構(gòu)”編寫一個計算機(jī)編寫一個計算機(jī)程序,對制作的每款蛋糕進(jìn)行程序,對制作的每款蛋糕進(jìn)行“成本核算成本核算”,計算出合理的成本價格,以利于今后的經(jīng),計算出合理的成本價格,以利于今后的
52、經(jīng)營。營。79小強(qiáng)蛋糕店之“成本核算” 蛋糕主要原料是面粉、牛奶、奶油、雞蛋和糖,小強(qiáng)蛋糕的主要原料成分表如下所蛋糕主要原料是面粉、牛奶、奶油、雞蛋和糖,小強(qiáng)蛋糕的主要原料成分表如下所示:示:產(chǎn)品名稱產(chǎn)品名稱面粉面粉牛奶牛奶奶油奶油雞蛋雞蛋糖糖凍檸檬芝士凍檸檬芝士110g100ml500g80g50g啤酒胡蘿卜巧克力啤酒胡蘿卜巧克力100g50ml200g180g100g黑森林黑森林95g40ml400g110g120g杏脯蜂蜜杏脯蜂蜜12018ml100g80g110g巧克力榛果巧克力榛果106g21ml100g203g135g水果奶油水果奶油100g60ml300g120g140g小強(qiáng)立體
53、造型小強(qiáng)立體造型80g30ml100g90g80g80小強(qiáng)蛋糕店之“成本核算”面粉、牛奶、奶油、雞蛋和糖的當(dāng)前市場價格表如下所示:面粉、牛奶、奶油、雞蛋和糖的當(dāng)前市場價格表如下所示:產(chǎn)品名稱產(chǎn)品名稱市場價格市場價格面粉面粉3元元/500g牛奶牛奶6元元/500ml奶油奶油10元元/500g雞蛋雞蛋5元元/500g糖糖3元元/500g81小強(qiáng)蛋糕店之“成本核算”小強(qiáng)蛋糕店設(shè)計的小強(qiáng)蛋糕店設(shè)計的“成本核算成本核算”程序程序cost.c如下:如下:#include void main( )float flour_w, milk_w, butter_w, egg_w, sugar_w;float fl
54、our_p, milk_p, butter_p, egg_p, sugar_p;float ave_p; char is_repeat=y; flour_p=3;milk_p=6; butter_p=10;egg_p=5;sugar_p=3; printf(請按以下順序輸入蛋糕成分?jǐn)?shù)量。請按以下順序輸入蛋糕成分?jǐn)?shù)量。n);printf(面粉、牛奶、奶油、雞蛋、糖:面粉、牛奶、奶油、雞蛋、糖:n);scanf(%f%f%f%f%f, &flour_w, &milk_w, &butter_w, &egg_w, &sugar_w);82小強(qiáng)蛋糕店之“成本核算”
55、while (is_repeat=y) ave_p = (flour_w*flour_p + milk_w*milk_p + butter_w*butter_p + egg_w*egg_p + sugar_w*sugar_p)/500;printf(這款蛋糕的主要成本價格是這款蛋糕的主要成本價格是%.2f元。元。n, ave_p);printf(還需要對其它蛋糕進(jìn)行成本核算嗎?還需要對其它蛋糕進(jìn)行成本核算嗎?n);getchar();printf(需要輸入需要輸入y,否則輸入,否則輸入n:);scanf(%c, &is_repeat);if (is_repeat=Y | is_repe
56、at=y) printf(請按以下順序輸入蛋糕成分?jǐn)?shù)量。請按以下順序輸入蛋糕成分?jǐn)?shù)量。n); printf(面粉、牛奶、奶油、雞蛋、糖:面粉、牛奶、奶油、雞蛋、糖:n); scanf(%f%f%f%f%f, &flour_w, &milk_w, &butter_w, &egg_w, &sugar_w); else is_repeat = n; printf(歡迎使用,再見!歡迎使用,再見!n);83小強(qiáng)蛋糕店之“成本核算” 小強(qiáng)感覺計算某個產(chǎn)品成本時都要重新輸入相應(yīng)的各個成分,十分不便??磥?,小強(qiáng)感覺計算某個產(chǎn)品成本時都要重新輸入相應(yīng)的各個成分,十分不便??磥?,需要請教羅老師,有沒有更好的辦法?需要請教羅老師,有沒有更好的辦法?產(chǎn)品名稱產(chǎn)品名稱面粉面粉牛奶牛奶奶油奶油雞蛋雞蛋糖糖凍檸檬芝士凍檸檬芝士110g100ml500g80g50g啤酒胡蘿卜巧克力啤酒胡蘿卜巧克力100g50ml200g180g100g黑森林黑森林95g40ml400g110g120g杏脯蜂蜜杏脯蜂蜜120g18ml100g80g110g巧克力榛果巧克力榛果106g21ml100g203g135g水果奶油水果奶油100g60ml300g120g140g小強(qiáng)立體造型小強(qiáng)立體造型80g30ml100g90g80g84第5章 循環(huán)程序設(shè)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版房地產(chǎn)抵押貸款合同3篇
- 二零二五版智慧城市物聯(lián)網(wǎng)技術(shù)應(yīng)用合同實(shí)施指南3篇
- 二零二五年度文化產(chǎn)業(yè)短期工勞務(wù)合作合同2篇
- 二零二五年金融投資風(fēng)險兜底保障合同示范3篇
- 二零二五年度知識產(chǎn)權(quán)股權(quán)轉(zhuǎn)讓定金合同3篇
- 二零二五版智能交通系統(tǒng)-城區(qū)隔離護(hù)欄采購合同3篇
- 二零二五版?zhèn)€人戶外探險活動貸款合同擔(dān)保與安全協(xié)議3篇
- 二零二五版環(huán)保產(chǎn)業(yè)合理化建議書合同2篇
- 二零二五年度新型農(nóng)業(yè)耕地承包與流轉(zhuǎn)管理合同3篇
- 二零二五版GRc構(gòu)件生產(chǎn)、安裝與智能化管理合同3篇
- 二零二五年度無人駕駛車輛測試合同免責(zé)協(xié)議書
- 2023中華護(hù)理學(xué)會團(tuán)體標(biāo)準(zhǔn)-注射相關(guān)感染預(yù)防與控制
- PPVT幼兒語言能力測試題附答案
- JB∕T 14089-2020 袋式除塵器 濾袋運(yùn)行維護(hù)技術(shù)規(guī)范
- 陜西省寶雞市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)及行政區(qū)劃代碼
- 中華人民共和國職業(yè)分類大典電子版
- 畢業(yè)設(shè)計小型液壓機(jī)主機(jī)結(jié)構(gòu)設(shè)計與計算
- 19XR開機(jī)運(yùn)行維護(hù)說明書
- 全國非煤礦山分布
- 臨床研究技術(shù)路線圖模板
- GB∕T 2099.1-2021 家用和類似用途插頭插座 第1部分:通用要求
評論
0/150
提交評論