《c語言-第5章 循環程序設計.ppt》由會員分享,可在線閱讀,更多相關《c語言-第5章 循環程序設計.ppt(83頁珍藏版)》請在人人文庫網上搜索。
1、第5章 循環程序設計,管理學院 電子商務系,2,第5章 循環程序設計,5.1 概述 5.2 while和do while循環 5.3 for循環 5.4 循環的嵌套 5.5 循環的控制 5.6 應用舉例 5.7 程序調試,3,第5章 循環程序設計,4,第5章 循環程序設計,5,第5章 循環程序設計,6,第5章 循環程序設計,7,第5章 循環程序設計,8,第5章 循環程序設計,9,第5章 循環程序設計,10,第5章 循環程序設計,水溫度的量變引起水的物理形態的質變: 水在標淮大氣壓下加溫到100攝氏度變成汽 降溫到0攝氏度變成冰。,11,第5章 循環程序設計,物體從地球上拋射速度的量變引起運動形。
2、式的質變: 小于7911m/s時,在地面上沿彈道飛行; 達到7911m/s時,繞地球作橢園軌道運動,成為地球的衛星; 增大到11189m/s時,脫離地球成為繞太陽運行的一個行星; 速度達到16662m/s時,脫離太陽系成為迢游太空的一個天體。,12,第5章 循環程序設計,計算機程序由若干語句順序組成: 順序結構的程序只能按照語句的先后順序從前向后依次執行 分支結構程序雖然允許在執行了某個判斷后跳過某些語句執行后面的語句,但也只能按語句的前后次序執行 有時,需要在程序中重復執行某個語句或語句塊,就需要循環結構,13,第5章 循環程序設計,生活中的例子: 擊鼓傳花:大家坐成一個圈,鼓聲響起的時候將。
3、花束順序交到下一個人的手里,依次向下傳遞,當鼓聲突然中斷時停止傳花,花束落在誰的手里便成為輸家 4100米接力賽跑:第1個人跑完100米后將接力棒傳給第2個人,第2個人再跑100米,然后是第3個人,直到第4個人跑完最后一個100米 共同點: 都要完成相同的任務:量變的重復內容 都有結束條件:發生質變的界限,14,第5章 循環程序設計,1. 計算sum=1+2+3+100,15,第5章 循環程序設計,1. 計算sum=1+2+3+100,循環體,循環控制條件,循環控制變量,循環的初始化,#include void main( ) int i=1, sum=0 ; while ( i = 100 。
4、) sum = sum + i ; i+ ; printf ( “Sum = %d n”, sum ) ; ,16,第5章 循環程序設計,2. 計算sum=2+4+6+100,循環體,循環控制條件,循環控制變量,循環的初始化,#include void main( ) int i=2, sum=0 ; while ( i = 100 ) sum = sum + i ; i+=2 ; printf ( “Sum = %d n”, sum ) ; ,17,5.2 while和do while循環,格式: while( 表達式 ) 語句 do 語句 while( 表達式 ) ; 說明: 括號中的“表。
5、達式”是循環控制條件,但不限于關系表達式和邏輯表達式 “語句”是單一語句,但可以是復合語句 如果while語句的括號后面只有“;”,則循環體為空。如果do-while語句的括號后面(分號前面)還有其他符號,則出現語法錯誤,18,5.2 while和do while循環,while語句的執行過程,while語句的執行過程是: 計算“表達式”的值; 若“表達式”的值不時0,為“真”,繼續執行;否則,結束循環,轉到while語句后面的語句繼續執行程序; 執行“語句”部分,即執行循環體; 返回繼續執行。,19,5.2 while和do while循環,do-while語句的執行過程,20,5.2 wh。
6、ile和do while循環,循環語句的特點: while循環是“先判斷后循環”,如果開始時循環條件不滿足,循環體就一次也不執行 do-while循環是“先循環后判斷”,即使第一次判斷的結果為“假”,循環體也已經執行了一次 但不論哪種循環,循環體中必須包含能夠使循環條件變為“假”的運算,21,5.2 while和do while循環,循環的變化:sum=1+2+3+100,#include void main( ) int i=1, sum=0 ; while ( i= 100 ) sum = sum + i+ ; printf ( “Sum = %d n”, sum ) ; ,#includ。
7、e void main( ) int i=1, sum=0 ; do sum = sum + i ; i+; while ( i= 100 ); printf ( “Sum = %d n”, sum ) ; ,22,5.2 while和do while循環,幾何級數2x的力量: 一頁普通紙的厚度約為0.1mm(1mm=10-3m) 珠穆朗瑪峰的高度為8844.43m 編寫程序計算一下,普通紙對折多少次可以超過珠穆朗瑪峰的高度?,23,5.2 while和do while循環,#include void main( ) double paper_height, mountain_height; 。
8、int number; paper_height=0.0001; mountain_height=8844.43; number=0; while ( paper_height mountain_height ) paper_height *= 2; number += 1; printf(對折第%d次后的高度是%g。n, number, paper_height); ,24,5.2 while和do while循環,幾何級數2x的力量: 中國戰國時期的趙國辯士公孫龍有一個著名命題:“一尺之棰,日取其半,萬世不竭”。這是說,一尺長(0.33m)的一根木棰,每天取它一半,世世代代也取不完。這一命。
9、題,包含了某些樸素辯證法的思想,它猜測到了物質的無限可分性。但嚴格說來它并不科學。因為就某一具體物質形態來說,它在被分割到一定程度時就不再是這一事物了。 最大的原子是銫,半徑為225pm(1pm=10-12m) 編寫程序計算一下,這只木棰日取一半,取多少天可以比銫原子的半徑小?,25,5.2 while和do while循環,26,5.2 while和do while循環,#include void main( ) double hammer_height, cesium_radius; int number; hammer_height=0.33; cesium_radius=225e-12。
10、; number=0; while ( cesium_radius hammer_height ) hammer_height /= 2; number += 1; printf(第%d天后的高度是%g。n, number, hammer_height); ,27,5.2 while和do while循環,恩格斯說:“純粹的量的分割是有一個極限的,到了這個極限它就轉化為質的差別;物體純粹是由分子構成的,但它是本質上不同于分子的東西,正如分子又不同于原子一樣”。 取到第3天,剩下的部分4.125cm長,這時它還能做為“木棰”嗎?取到第31天,它剩下的部分已經沒有分子那么大了,這時它不僅不再能成為。
11、“木棰”,連木頭的物理分子都已經不是了。當然,它還可以被取下去,但隨著次數的變化,它必然會發生不同層次的質變。 嚴格說來,應該是“一尺之棰,日取其半,三日可竭”;作為木質應該是“一只之棰,日取其半,一月乃竭”;作為物質,應該是“一尺之棰,日取其半,萬世不蝎”。這就是說,不同層次的量變,總是引起與之相應的質變。,28,5.2 while和do while循環,循環的嵌套,如果在一個循環的循環體內包含另一個完整的循環則稱為循環的嵌套,其中被嵌套的循環稱為內循環,而嵌套了內循環的是外循環 內循環還可以嵌套循環,形成多級(層)嵌套,29,5.2 while和do while循環,順序打印1-10的階乘。
12、,即1!, 2!, , 10!,本題的關鍵是求階乘 數學上,n!=123(n-1)n,30,5.2 while和do while循環,外循環,內循環,對比程序: #include void main( ) int i=1; float f = 1; while( i = 10 ) f = f * 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 * 。
13、j; j + ; printf( “ %2d! = %.0f n”, i, f ); i + ; ,31,5.2 while和do while循環,循環的嵌套不僅可以發生在相同語句之間,如while嵌套while、do-while嵌套do-while,while語句和do-while語句也可以互相嵌套 (1)while(.)(2)while() while() do while(); (3)do(4)do while() do while() ; while() ;,32,5.2 while和do while循環,錯誤的嵌 套形式,循環必須是完整的,不允許內外循環交叉嵌套 f = 1; whi。
14、le( i 10) i=1; do f = f * i; i +; while( i10 );,混亂的控 制條件,內外循環的循環控制條件通常是分開的,相對獨立的 i=1; s=0; while ( i 3 ) s = s + f; i = 1; f=1; while( i5) i +=2; f = f * i; i+ ; ,33,5.2 while和do while循環,應用舉例,輸入一個5位數,計算并輸出各位的和,方法一:將輸入的5位數看作是5個獨立的數字字符,依次讀取每一個數字字符,將其轉化為對應的數字后再求和 將數組字符ch轉化為數字的方法為ch-0,34,5.2 while和do wh。
15、ile循環,輸入一個5位數,計算并輸出各位的和,#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 ; /* 將數字字符轉化為對應的數字 */ i+ ; printf( “Sum of these 5 digits is %dn”, sum ) ; ,35,5.2 while和do while循環,幾種常見運算: 如果ch為數字字符,則表達式ch - 0的值為對應的數字 如果c。
16、h為大寫字母,則表達式 ch-A+a 為對應的小寫字母 如果ch為小寫字母,則表達式 ch-a+A 為對應的大寫字母,技巧,36,5.2 while和do while循環,輸入一個5位數,計算并輸出各位的和,方法二:將輸入的5位數看作一個整數,先讀取該整數,再分離出各位數字 對于整數x,其個位數為 x%10 要求整數x的十位數,可以先令x=x/10,再求x的個位數,37,5.2 while和do while循環,輸入一個5位數,計算并輸出各位的和,#include void main( ) int x, x1, r, sum = 0; printf(Enter a number: ); sca。
17、nf( %d, ,38,5.2 while和do while循環,任意輸入一行字符,統計字母a和A的個數,#include void main( ) char ch; int count=0; printf( Enter characters: ); do ch = getchar( ); if( ch=A | ch=a ) count+; while( ch != n ); printf( Counter of a or A: %dn , count ); ,39,5.2 while和do while循環,40,5.2 while和do while循環,#include void main(。
18、 ) int f = -1, n =1 ; float t, pi = 0 ;/* t為最后一項的值 */ do f = -f ;/* 第n項的符號 */ t = 1.0 / ( 2*n -1 ) ;/* 用1.0是為了避免整除 */ pi += f * t ; n+ ; while( t 1e-5 ); pi = 4 * pi ; printf( PI = %.4f n, pi ) ; ,41,5.3 for語句,for語句是常用的、特殊的循環控制語句 for語句的功能強大,使用靈活,變化多樣 for語句優點:將“循環初始化條件”、“循環控制條件”、“循環控制變量的修改”集中表示 將量變與質。
19、變的因素集中表示,42,5.3 for語句,for語句的用法 for( 表達式1 ; 表達式2 ; 表達式3 ) 語句 “表達式1”用于循環的初始化 “表達式2”是for語句的循環控制條件,當循環控制條件為1(True)或非0時,運行代表循環體的“語句”部分,可以是任何形式的表達式 “表達式3”用于修改循環控制變量的值,目的是使“表達式2”的值變為0(False),以結束循環 “語句”部分是for語句的循環體,可以是單一語句,也可以是復合語句,43,5.3 for語句,for語句的執行過程,44,5.3 for語句,使用for語句編程。計算sum=1+2+3+100,#include void。
20、 main( ) int i, sum=0 ; for( i =1 ; i=100 ; i+) sum += i ; printf( “sum = %d n, sum ); ,45,5.3 for語句,任意輸入10個數,求平均值,#include void main( ) int i ; float x, sum=0 ; printf( Enter 10 numbers one by one: n ); for( i =1 ; i=10 ; i+) scanf( %f, ,46,5.3 for語句,循環的嵌套,for語句可以嵌套for語句構成循環的嵌套 for語句也可以與while語句、do-。
21、while語句互相嵌套,47,5.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=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。
22、 + ; printf( “ %2d! = %.0f n”, i, f ); i + ; ,48,5.3 for語句,例:打印幾何圖形,對于這類問題,每行中星號的個數、總行數等都應該用循環結構進行控制,而不是直接輸出若干行字符串,#include void main( ) int i, j ; for(i=1; i = 4; i+ ) for( j = 0; ji ; j+ ) putchar( ); for( j = 1; j=6 ; j+ ) putchar(*); putchar(n); ,49,5.3 for語句,例:甲、乙兩個會計進行點鈔比賽,甲的速度為5張/秒,乙的為8張/秒。乙在。
23、甲已經點了100張鈔票后才開始,問:只要幾秒時間乙就可以超過甲?,經過 t 秒,甲點過的鈔票數有 x=100+5t 張,乙的為 y=8t 張 問題就是求 yx 時的 t 值,#include void main( ) int t ; int x=100, y=0 ; for( t=0 ; x y ; t+ ) x = 100+5*t ; y = 8 * t; printf( Time is %d secondsn, t); ,50,5.3 for語句,for語句的變化形式,可以省略for語句的“表達式1”或“表達式3”,也可以都省略(“退化為”while語句),例:將用鍵盤輸入的若干字符順序輸。
24、出到屏幕上,#include void main( ) char ch ; for( ; (ch=getchar( ) ) !=n ; ) putchar( ch ) ; ,51,5.3 for語句,如果省略“表達式2”,則循環控制條件總為“真”,下面的語句是“合法”的,但構成了“死循環”: for( i=1; ; i+) sum += i ;,下面的程序在運行時會因為“除以零”而出錯: #include void main( ) char i ; int sum=0 ; for( i=1; ; i+) sum += 1000 / i ; printf( sum=%d n, sum); ,52。
25、,5.4 循環的控制,復雜的循環控制條件 對循環的控制問題,不僅僅是防止“死循環”,還包括選擇恰當的時機,正確地結束循環 有的時候,循環控制條件是復雜的,還可能是多種條件的綜合,53,例:假設每個班最多有30個人,依次輸入每個人的成績,如果輸入的不是0-100之間的數,或者已經輸入了30個數,則結束輸入,輸出計算結果。,#include void main( ) int i = 0, flag=1 ; float score, ave = 0 ; printf( Enter scores one by one:n ); while ( i 100 ) flag = 0; else ave +=。
26、 score; i+ ; if( i 0 ) ave = ave / i; printf(Average: %.2fn, ave); ,54,5.4 循環的控制,下面的程序塊常用來對輸入的數據進行限制: do scanf(%d, 或者,?(討論一下),技巧,55,例:利用隨機數產生一個乘法算式,用戶輸入算式的運算結果,由程序判斷對錯。,#include #include void main( ) int iFor = 0, iErr =0 ; int x, y, iAns ; char ch; do iFor +; x = rand() % 100;y = rand() % 100; prin。
27、tf( %d x %d = ? , x, y ); scanf( %d, ,56,5.4 循環的控制,break語句,break語句的格式為: break; 在switch語句中,break語句用于跳過后面的語句,結束switch語句 在循環結構中,break語句的作用是跳出循環結構,執行循環后面的語句,在下面的程序塊中,由于break語句的作用,循環只進行了1次,printf語句一次也沒有執行,并且永遠也不會被執行: for( i=1; i 100; i+) sum += i; break; printf( %d, sum ); ,57,5.4 循環的控制,continue語句,contin。
28、ue語句的格式為: continue; continue語句只能用在循環結構中,用于結束本次循環,即跳過循環體中后面的語句,開始下一次循環,下面的語句塊中,循環次數是100次,但printf語句一次也沒有執行: for( i=1; i 100; i+) sum += i; continue; printf( %d, sum ); ,58,5.4 循環的控制,break語句和continue語句的有效范圍都僅限于所在的循環語句之內。如果想從嵌套的循環結構的內循環中直接跳出到外循環之外,使用一個break語句是不行的。可行的方法是:在程序中引入一個標識變量,在各循環的結束位置檢測這一標識,用多個b。
29、reak語句作連續的跳轉, flag =1 while( i 10 ) for( j=i; j10; j+) if( j=2*i) flag =0;break; if( flag != 1)break; printf(%d, i); ,59,5.4 循環的控制,例:順序打印100-1000之間所有9的倍數,如果一個數同時也是7的倍數則停止打印,#include void main( ) int i ; for( i=100; i1000; i+) if( i % 9 !=0 ) continue ; printf( %5d, i ) ; if( i % 7 =0 ) break; ,60,5.。
30、4 循環的控制,例:求任意正整數的除了自身以外的最大因數,#include void main( ) int i, n; printf( Enter a number: ); scanf(%d, ,61,5.4 循環的控制,goto語句,goto語句是從早期程序設計語言遺留下來的一個語句,稱為無條件跳轉語句,已被淘汰 goto語句的使用格式是: goto 語句標號; “語句標號”是一個特殊的標識符,由字母、數字或下劃線組成(第一個字符不能是數字),后面跟冒號“:”,放在語句行的最前頭,#include void main( ) int i =100; while( i1000 ) if( i 。
31、% 9 !=0 ) goto Next ; printf( “%5d”, i ) ; Next: i +; ,例:打印所有的100-1000間9的倍數,62,5.5 應用舉例,阿米巴原蟲,以細菌和更小的原蟲為食,中樞神經系統的阿米巴原蟲感染,水溶組織內阿米巴在一個試管中吞吃細菌,被稱為“食腦變形蟲”的阿米巴原蟲能從人的鼻子里鉆入大腦,將人的腦子“吃”掉。,63,5.5 應用舉例,例:阿米巴用簡單分裂方式繁殖,每分裂一次用時3分鐘。將若干個阿米巴放在一個盛滿營養液的容器內,45分鐘后容器內充滿了阿米巴。已知容器最多可以裝阿米巴220個,試問,開始的時候往容器內放了多少個阿米巴?,分析:根據題意,。
32、阿米巴每3分鐘分裂一次,那么從開始將阿米巴放入容器里面,到 45 分鐘后充滿容器,需要分裂15次。而“容器最多可以裝阿米巴220個”,即阿米巴分裂15次以后得到的個數是220。題目要求計算分裂之前的阿米巴數,不妨使用倒推的方法,從第15次分裂之后的220個,倒推出第 15 次分裂之前(即第14次分裂之后)的個數,再進一步倒推出第 14次分裂之前、第13次分裂之前、第1次分裂之前的個數。,64,5.5 應用舉例,設開始時阿米巴的個數為x0,第1次、第2次、第3次第15次分裂之后的個數分別為x1、x2、x3、x15,則有以下關系: x0=x1/2 x1=x2/2 xn=xn+1/2 x14=x15。
33、/2 已知x15=220,可以利用上面的關系倒推出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 , x ) ; ,65,例:谷角猜想,對于任意一個自然數n,若n為偶數,則將其除以2;若n為奇數,則將其乘以3,然后再加1。如此反復,經過有限次運算后,總可以得到自然數1。試編程驗證之。,#include void main( ) int n ; printf( Enter a number:。
34、 ) ; scanf( %d, ,66,5.5 應用舉例,例:打印九九乘法口訣表 要求:九九乘法口訣表呈三角形,共有9行。第1行有1列,第2行有2列,第9行有9列。打印方法是,用外循環控制行數,包括打印一行中的所有列和換行,在內循環中,打印某一行上的所有列。,#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,例:利用迭代公式 求 的近似值,結果保留5位有效數字。,用該迭代公式求a的平方根x,實際。
35、是求近似值xn+1,即xxn+1,“保留5位有效數字”可理解為 |xn+1-xn|/ xn+110-5,#include #include void main( ) float x, y, y0 ; printf( Enter a positive: ) ; do scanf(%f, ,68,例:利用牛頓迭代法求方程的 在2附近的一個實根。,對于方程f (x)=0,把f (x)在x0附近展開成泰勒級數: f (x) = f (x0) + (xx0) f (x0) + (xx0)2 f (x0) + 取線性部分作為方程f (x) = 0的近似方程,則有: f (x0) + f (x0)(xx0)。
36、 = 0 設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) 當f (xn+1)0時即可認為xn+1就是方程f (x)=0的近似解。對于本題, f (x) = 5x3 - 3x2 - 22 f (x) = 15x2 - 6x x0 = 2,69,例:利用牛頓迭代法求方程的 在2附近的一個實根。,#include void main( ) float x, y,。
37、 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); ,70,5.6 程序調試,對于程序設計而言,即使優秀的程序員也不能保證不會犯錯誤 一個優秀的程序,不在于使用了先進的算法,而在于僅僅包含少量的錯誤 程序中的錯誤是在所難免的,關鍵是發現并糾正錯誤 初學程序設計的人有必要從一開始就養成良好的習慣,培養嚴謹的工作作風,并逐步掌握一些編程技巧,71,5.6 程序調試,程序調試的一般策略 程序。
38、中的錯誤一般可分為: 語法錯誤比較容易發現,通常,有語法錯誤的程序不能通過編譯和連接,也就不能生成可執行的程序 邏輯錯誤又叫語義錯誤,也就是不能正確地表達所需要的功能,是較常見的錯誤之一。其外部表現為,程序可以運行,但有時出錯,有時又不出錯。邏輯錯誤通常比較難于被發現,查錯和糾錯對任何程序員來說都是挑戰 設計錯誤比較少見,通常是由于對問題的分析不徹底造成的,糾正這類錯誤需要重新設計程序,72,5.6 程序調試,調試程序的一般步驟為: 靜態檢查,也就是人工檢查,是在完成程序設計后,在上機調試前,仔細地對程序代碼進行全面的檢查。通過靜態檢查,不僅可以發現程序中的語法錯誤,也可以發現邏輯錯誤,甚至發。
39、現設計上的缺陷。為便于查錯,應力求做到編碼的標準化、文檔化,增強編碼的可讀性、可理解性、可維護性。要做到:采用結構化方法,劃分功能模塊和程序段,采用必要的縮進和對齊,簡化表達式,每行只有一個語句,盡量使用注釋,使用有意義的標識符, 動態檢查,是指通過上機調試發現錯誤的過程。完成編碼后,可以借助編譯程序檢查隱藏的語法錯誤,如錯誤標識符、非法的表達式、錯誤的函數調用等。利用連接程序,可以檢查連接錯誤,如調用了未定義的函數、缺乏必要的函數定義等。通過試運行程序,可以發現一些邏輯錯誤,如錯誤的計算、有問題的輸入和輸出等,73,5.6 程序調試,程序中的錯誤有兩種:Error和Warning Error。
40、是必須要糾正的,任何Error都會導致編譯或連接失敗 Warning一般不影響生成可執行的“程序”,但程序有缺陷 合格的程序員不僅要糾正致命Error,也要重視并糾正Warning 當程序中錯誤較多時,應從最前面的錯誤開始逐一改正有些錯誤實際出自同樣的原因,只要糾正了其中的一個就會消除所有這些錯誤,74,5.6 程序調試,程序的跟蹤與調試,以Visual C+ 6.0為例,1、程序的“調試”運行方式 打開主菜單,點擊 “Go”(快捷鍵是F5),75,5.6 程序調試,2、使程序暫停的方法 執行到光標處:將光標放在一個語句行上,單擊“debug”工具欄中的“Run to Cursor”按鈕 設置。
41、斷點:將光標放在一個語句行上,然后點擊“Add/Remove Breakpoint”按鈕 ,即可在此設置(或取消)一個斷點 “中斷”(Break)方式:當程序運行在調試方式下時,單擊“Break”按鈕,即可立即“中斷”程序的運行;要恢復暫停程序的執行,只要單擊“Go”按鈕即可,76,5.6 程序調試,3、在“暫停”狀態下常見的操作 單步運行程序。點擊“Step Over”按鈕 或“Step Into”按鈕即可一行一行地執行程序,每執行完一行都自動進入暫停狀態 觀察變量的值。使用“Variables”窗口可觀察程序中的各種變量的當前值,點擊其中的“Locals”選項卡可以顯示所定義的變量的值。在。
42、“Watch”窗口中,也可以添加或刪除要觀察的變量的值。當“Watch”有效時,點擊選中源代碼窗口,把鼠標指向任何變量,稍待片刻,就會彈出該變量的值 修改變量的值。要臨時修改變量的值,可以雙擊改變量的“Value”域(在Variables窗口或Watch窗口都有效),進行編輯 模擬計算。單擊“QuickWatch”按鈕 ,彈出“QuckWatch”對話框,可以用當前程序中的變量組成算式進行簡單的模擬運算,77,5.6 程序調試,4、查錯的技巧 程序中隱藏的錯誤通常難于發現,可以采取一些技巧: 在程序中加入一些“調試代碼”,輸出變量的中間值以幫助判斷但這種辦法并不理想,一來使用起來不方便,二來破。
43、壞了程序的原有結構,三是在不需要的時候還要一一刪除,不注意會遺漏。使用條件編譯會更好些 通過設置斷點、跟蹤運行等方式調試程序,這是比較高效的方法一旦懷疑某段程序有錯,可以在程序段的開始位置設置斷點,當程序運行到斷點而暫停時,通過一步一步地執行程序,并觀察變量的變化,判斷錯誤是否存在。但這種方法也有不利的地方,比如,如果程序段所表達的邏輯比較復雜,或者循環次數很多,都會導致調試困難 程序的單元測試法。對程序段的執行邏輯進行仔細分析,劃分程序執行路徑的種類,針對每種路徑設計若干組不同的輸入數據,依次使用這些數據來測試程序,觀察程序的運行狀態和結果,以發現可能隱藏著的錯誤,78,小強蛋糕店之“成本核。
44、算”,小強蛋糕店開張已經快有兩個月了,小強起早貪黑、沒日沒夜地干活,但是每到月底結算的時候,他卻發現經濟上入不敷出!雖然小強天性“樂善好施”、“學雷鋒做好事”,但是如果長期如此,蛋糕店不久也會“關門大吉”了。 為了找出原因所在,小強打算應用羅老師傳授的“循環程序結構”編寫一個計算機程序,對制作的每款蛋糕進行“成本核算”,計算出合理的成本價格,以利于今后的經營。,79,小強蛋糕店之“成本核算”,蛋糕主要原料是面粉、牛奶、奶油、雞蛋和糖,小強蛋糕的主要原料成分表如下所示:,80,小強蛋糕店之“成本核算”,面粉、牛奶、奶油、雞蛋和糖的當前市場價格表如下所示:,81,小強蛋糕店之“成本核算”,小強蛋糕。
45、店設計的“成本核算”程序cost.c如下:,#include void main( ) float flour_w, milk_w, butter_w, egg_w, sugar_w; float flour_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(請按以下順序輸入蛋糕成分數量。n); printf(面粉、牛奶、奶油、雞蛋、糖:n); scanf(%f%f%f%f%f, ,82,小強。
46、蛋糕店之“成本核算”,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(還需要對其它蛋糕進行成本核算嗎?n); getchar(); printf(需要輸入y,否則輸入n:); scanf(%c, ,83,小強蛋糕店之“成本核算”,小強感覺計算某個產品成本時都要重新輸入相應的各個成分,十分不便。看來,需要請教羅老師,有沒有更好的辦法。