




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、單元5 模塊化的程序結(jié)構(gòu)實(shí)驗(yàn)五 模塊化的程序設(shè)計(jì)實(shí)驗(yàn)?zāi)康模?)理解自頂向下,逐步細(xì)化的模塊化設(shè)計(jì)思想劃分子模塊;知道模塊化程序設(shè)計(jì)方法。(2)熟悉函數(shù)的定義、函數(shù)的聲明和函數(shù)的調(diào)用,理解函數(shù)調(diào)用的實(shí)現(xiàn)過程。(3)理解函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳送機(jī)制,通過參數(shù)將主調(diào)函數(shù)的數(shù)據(jù)傳遞到被調(diào)函數(shù),運(yùn)用return語句將被調(diào)函數(shù)的處理結(jié)果返回主調(diào)函數(shù)。(4)通過設(shè)置斷點(diǎn)和單步執(zhí)行,觀察子函數(shù)的執(zhí)行路徑,和子函數(shù)中變量的值的變化。實(shí)驗(yàn)范例引導(dǎo)任務(wù)任務(wù)1會(huì)變化的三角形任務(wù)2 計(jì)算生日相差幾天任務(wù) 會(huì)變化的三角形任務(wù)描述在屏幕上打印一個(gè)三角形,如圖5-1所示,運(yùn)行程序時(shí)輸入三角形的級別n,可以打印不同大小的三角形。圖
2、5-1 輸出可變的三角形任務(wù)解決任務(wù)解決路徑:圖5-2 任務(wù)1 解決路徑第一步:學(xué)習(xí)無參無返回值函數(shù)的定義、聲明和調(diào)用;第二步:了解函數(shù)參數(shù)的作用,學(xué)習(xí)使用帶參的函數(shù)構(gòu)建多層模塊程序的構(gòu)建;第三步:學(xué)習(xí)帶參無返回值函數(shù)的設(shè)計(jì);1編寫打印三角形的函數(shù)(1)問題分析要在屏幕上打印一個(gè)三角形,可以直接在main函數(shù)中使用printf語句完成,如下程序代碼所示:#include <stdio.h>int main() printf("打印一個(gè)三角形n "); printf(" *n"); printf(" *n"); printf
3、("*n");printf("打印結(jié)束n"); return 0; 在本任務(wù)中,要求調(diào)整程序的結(jié)構(gòu),寫一個(gè)打印三角形的無參無返回值函數(shù),然后在main函數(shù)中調(diào)用它實(shí)現(xiàn)打印三角形。程序員編寫的函數(shù)稱為用戶自定義函數(shù),相對于系統(tǒng)函數(shù)而言,不是系統(tǒng)已寫好的代碼,需要程序員自己定義函數(shù)和編寫實(shí)現(xiàn)函數(shù)的程序代碼。無參無返回值函數(shù)通常執(zhí)行一個(gè)具體的操作,無計(jì)算結(jié)果。(2)函數(shù)的應(yīng)用使用用戶自定義函數(shù)分三步:函數(shù)定義,函數(shù)聲明和函數(shù)調(diào)用。無參無返回值函數(shù)的定義無參無返回值函數(shù)定義的一般形式為:void函數(shù)名(void).一個(gè)打印三角形的函數(shù)的定義可以為:void tr
4、iangle(void) printf(" *n"); printf(" *n"); printf("*n"); triangle是函數(shù)名,函數(shù)名應(yīng)能體現(xiàn)函數(shù)的功能,以增強(qiáng)程序的可讀性,這個(gè)函數(shù)的功能是打印一個(gè)固定的三角形。函數(shù)類型為void,表示沒有返回值,形參表中寫void,表示沒有參數(shù),void可以省略,但一對圓括號(hào)不能省略,表示函數(shù)運(yùn)算符。 函數(shù)的聲明用戶自定義函數(shù)要先聲明后調(diào)用。無參無返回值的函數(shù)聲明的一般形式:void 函數(shù)名(void);例如triangle函數(shù)的聲明語句為:void triangle(void);函數(shù)聲
5、明所需要的信息都在函數(shù)的首部,書寫函數(shù)聲明時(shí)可以復(fù)制函數(shù)首部,加分號(hào)。 函數(shù)調(diào)用無返回值函數(shù)的調(diào)用形式為:函數(shù)名();例如triangle函數(shù)的調(diào)用語句為:triangle();雖然triangle函數(shù)沒有參數(shù),實(shí)參列表為空,但一對圓括號(hào)不能省略,而且圓括號(hào)中不能寫void。這種從函數(shù)名開始的調(diào)用形式,稱為函數(shù)語句。(3)編寫程序最后關(guān)注這三個(gè)組成部分在程序中出現(xiàn)的位置,程序sample05_01.cpp演示了一個(gè)規(guī)范的程序代碼格式?!纠?.1 sample05_01.cpp】/* 打印一個(gè)三角形*/ #include <stdio.h>/函數(shù)聲明void triangle(voi
6、d); int main() printf("打印一個(gè)三角形n"); /函數(shù)調(diào)用triangle(); printf("打印結(jié)束n"); ; return 0; /函數(shù)定義void triangle(void) printf(" *n"); printf(" *n"); printf("*n"); 在程序中,函數(shù)定義的位置最好在main函數(shù)后面,因?yàn)槌绦驈膍ain函數(shù)開始執(zhí)行,到main函數(shù)的最后一句語句結(jié)束,我們閱讀程序也習(xí)慣從main函數(shù)開始。函數(shù)和函數(shù)之間沒有先后關(guān)系,也沒有包含關(guān)系,不能
7、在一個(gè)函數(shù)的內(nèi)部定義另一個(gè)函數(shù),每個(gè)函數(shù)都是獨(dú)立定義的。函數(shù)聲明通常放在預(yù)編譯命令的后面,main函數(shù)之前。這是一個(gè)全局位置,函數(shù)聲明對所有的函數(shù)有效。如果函數(shù)聲明放在另一個(gè)函數(shù)的內(nèi)部,那只對該函數(shù)有效。函數(shù)調(diào)用按程序的需要進(jìn)行,一個(gè)函數(shù)定義并聲明后,可以多次調(diào)用。程序的執(zhí)行從main函數(shù)的第一條可執(zhí)行語句開始,執(zhí)行完printf語句,輸出字符串“打印一個(gè)三角形”,順次執(zhí)行函數(shù)調(diào)用語句“triangle();”,程序轉(zhuǎn)向triangle的函數(shù)定義處,執(zhí)行triangle函數(shù)中的語句,執(zhí)行完后回到main函數(shù),接著向下執(zhí)行printf語句和return語句,main執(zhí)行結(jié)束,程序結(jié)束。思考:如果
8、要在垂直方向上連續(xù)輸出三個(gè)三角形,如圖所示,該如何修改你的程序呢?圖5-3 輸出三個(gè)三角形提示.444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444:函數(shù)是通用項(xiàng)目,可以多次調(diào)用。2. 使用通用函數(shù)編寫三角形函數(shù)先閱讀兩個(gè)通用功能函數(shù)line和point,它們實(shí)現(xiàn)基本的顯示線段功能。line函數(shù)定義如下:void line(intstart,int end ) inti; for(i=1;i<start
9、;i+) /畫start-1個(gè)空格printf(" "); for(i=start;i<=end;i+)/畫*構(gòu)成的線段printf("*");printf("n"); /回車line函數(shù)的作用是畫一條從start開始到end結(jié)束的由*組成的線段,start和end是兩個(gè)整型參數(shù)變量,可以接受兩個(gè)整數(shù)值。例如line(5,10)的作用是先畫4個(gè)空格,從第5個(gè)位置開始畫6個(gè)星號(hào),回車結(jié)束。line(5,10) *void point(intstart,int end ) inti;for(i=1;i<start;i+) /畫
10、start-1個(gè)空格printf(" "); printf("*");/開始星號(hào)for(i=start+1;i<end;i+)/畫*之間的空格printf(" ");printf("*n") ; /結(jié)束星號(hào)和回車point函數(shù)的作用是畫一條從start到end的兩端星號(hào)中間空格的線段。例如point(5,10)的作用是先畫4個(gè)空格,從第5個(gè)位置 畫一個(gè)星號(hào),繼續(xù)畫空格,到第10個(gè)位置畫一個(gè)星號(hào),回車結(jié)束。point(5,10) * *line函數(shù)和point函數(shù)與前面的triangle函數(shù)相比,增加了兩個(gè)參數(shù)
11、變量start和end,這兩個(gè)變量在函數(shù)調(diào)用時(shí)可以接受兩個(gè)整數(shù),決定畫出的線段的長短。參數(shù)變量定義的方法與一般函數(shù)體內(nèi)定義變量的方法相似,要設(shè)定變量的數(shù)據(jù)類型,但不同的是每個(gè)參數(shù)變量必須單獨(dú)定義。帶參無返回值的函數(shù)定義一般格式如下:void 函數(shù)名( <type1> 形參變量1, <type2> 形參變量2,.) .line函數(shù)的兩個(gè)參數(shù)變量都是整型,也不能共用一個(gè)int類型,下面的定義形式是錯(cuò)誤的,end參數(shù)前的int不能省略:void line(int start, end)帶參無返回值的函數(shù)聲明同樣是函數(shù)首部加分號(hào),一般格式如下:void 函數(shù)名( <typ
12、e1> 形參變量1, <type2> 形參變量2,.);在調(diào)用帶參數(shù)的函數(shù)時(shí),要確保每個(gè)形參變量都能得到指定類型的數(shù)據(jù),數(shù)據(jù)的形式不限,可以是常量數(shù)據(jù),可以是變量數(shù)據(jù),還可以是表達(dá)式數(shù)據(jù)。無返回值帶參的函數(shù)調(diào)用一般格式如下:函數(shù)名(實(shí)參值1,實(shí)參值2.);【例5.2 line函數(shù)的調(diào)用示例】int s=10,e=20; line( 10,30); /輸出9個(gè)空格后,從10位置開始輸出21個(gè)星號(hào),回車結(jié)束 line( s,e); /輸出9個(gè)空格后,從10位置開始輸出11個(gè)星號(hào),回車結(jié)束 line( s,s+24); /輸出9個(gè)空格后,從10位置開始輸出25個(gè)星號(hào),回車結(jié)束函數(shù)的
13、調(diào)用,其實(shí)質(zhì)完成了將實(shí)參值賦給形參變量的操作如圖5-4所示:函數(shù)調(diào)用:實(shí)參值line(s,s+24);line(s , e);line( 10,30);函數(shù)定義:形參變量void line(intstart,int end ) 圖5-4 參數(shù)的傳遞示意圖思考:如果要在11的位置輸出一個(gè)星號(hào),是調(diào)用line函數(shù)還是point函數(shù)?下面使用line函數(shù)和point函數(shù)重新實(shí)現(xiàn)例5-1的triangle函數(shù),設(shè)置三角形向右平移8個(gè)空格,函數(shù)定義如下:void triangle(void) line(11,11); point(10,12); line(9,13);圖5-5 空心三角形實(shí)現(xiàn)繪制空心三角
14、形的完整程序:【例5.3 sample05_02.cpp】/* 打印一個(gè)三角形*/ #include <stdio.h>void line(intstart,int end ) ;void point(intstart,int end ) ;void triangle(void); int main()printf("打印一個(gè)三角形n"); /函數(shù)調(diào)用triangle(); printf("打印結(jié)束n"); return 0;/*畫一個(gè)空心三角形*/void triangle(void)line(11,11);point(10,12);lin
15、e(9,13);/*畫一條從start開始到end結(jié)束的由*組成的線段*/void line(intstart,int end ) inti;for(i=1;i<start;i+) /畫start-1個(gè)空格printf(" "); for(i=start;i<=end;i+)/畫*構(gòu)成的線段printf("*");printf("n"); /回車 /*畫一條從start到end的兩端星號(hào)中間空格的線段*/void point(intstart,int end ) inti;for(i=1;i<start;i+) /畫
16、start-1個(gè)空格printf(" "); printf("*");/開始星號(hào)for(i=start+1;i<end;i+)/畫*之間的空格printf(" ");/結(jié)束星號(hào)printf("*n") ; /回車12與例5-1比較,這個(gè)程序中增加了兩個(gè)用戶自定義函數(shù)line和point,調(diào)用這兩個(gè)函數(shù)重寫了triangle函數(shù),輸出了一個(gè)空心三角形。main函數(shù)不需要作改動(dòng)。3. 輸出可變的三角形最后來實(shí)現(xiàn)三角形的變化,輸入一個(gè)n值,n值不同,輸出三角形的大小也隨之變化。(1)問題分析修改triangle函數(shù)
17、的功能定義,給triangle函數(shù)增加一個(gè)形參變量n,三角形的大小由n值確定,一共n行,每行2*i-1 個(gè)星號(hào)。這樣,通過增加形參,triangle函數(shù)可處理的三角形增多,通用性增強(qiáng)。(2)算法設(shè)計(jì)上例中triangle函數(shù)的三句代碼標(biāo)號(hào)如下,分析每一句語句的作用, line(11,11);point(10,12);line(9,13);語句的作用是畫三角形的最上面的一個(gè)頂點(diǎn);語句的作用畫三角形的中部空心線,從頂點(diǎn)向下,每行的空心線開始端減1,結(jié)束端加1;語句的作用是畫三角形的底部實(shí)心線,畫2n-1個(gè)星號(hào)。設(shè)定:三角形上方頂點(diǎn)位置middle(最后一行的中間位置),線段開始端s,結(jié)束端e。算法
18、設(shè)計(jì)如下:1.調(diào)用line函數(shù)畫頂點(diǎn)星號(hào),middle位置是(2n-1)/2+12.設(shè)置s為middle-1,e為middle+13.畫n-2條三角形的中部空心線 循環(huán)i從2到n-1 ,步長1 3.1 調(diào)用point函數(shù)畫從s到e的空心線 3.2 s減1,e增14. 調(diào)用line函數(shù)畫從s到e的實(shí)線。(3)編寫程序triangle函數(shù)的實(shí)現(xiàn)代碼void triangle(int n )int middle=(2*n-1)/2+1; / middle是最后一行的中間位置ints,e; line(middle,middle);/ 畫頂點(diǎn)星號(hào) s=middle-1; /從頂點(diǎn)向下,每行的空心線開始端
19、減1,結(jié)束端加1 e=middle+1; for(int i=2;i<n;i+)/畫n-2條三角形的中部的空心線 point(s,e); s-;e+; line(s,e); /是畫三角形的底部實(shí)心線main函數(shù)調(diào)用時(shí),增加輸入n值輸入的語句,調(diào)用triangle函數(shù)時(shí),傳遞n值到triangle函數(shù),實(shí)現(xiàn)輸出可變的空心三角形?!纠?.4 sample05_03.cpp】/* 打印一個(gè)三角形*/ #include <stdio.h>void line(int start,int end ) ;void point(int start,int end ) ;void triang
20、le(int n); int main()int n;printf("打印一個(gè)三角形n"); printf("n=");scanf("%d",&n);triangle(n); printf("打印結(jié)束n"); ;return 0;void triangle(int n ) 略 void line(intstart,int end ) 略void point(intstart,int end ) 略任務(wù)2計(jì)算生日相差幾天任務(wù)描述班主任想知道班上某兩位同學(xué)在本年度的生日差幾天,設(shè)計(jì)程序,任意輸入兩個(gè)人在本年度的
21、生日日期,能夠計(jì)算兩人的生日差幾天。要求使用模塊化設(shè)計(jì)的方法完成任務(wù)。任務(wù)解決一個(gè)多函數(shù)結(jié)構(gòu)的C程序是模塊化設(shè)計(jì)的結(jié)果,模塊化設(shè)計(jì)的思想實(shí)際上是一種“分而治之”的思想,把一個(gè)大任務(wù)分為若干個(gè)子任務(wù),每一個(gè)子任務(wù)就相對簡單了。在拿到一個(gè)程序模塊以后,根據(jù)程序模塊的功能將它劃分為若干個(gè)子模塊,如果這些子模塊的規(guī)模還嫌大,還再可以劃分為更小的模塊。這個(gè)過程采用自頂向下的方法來實(shí)現(xiàn)。任務(wù)解決路徑:圖5-6 任務(wù)2 解決路徑第一步 學(xué)習(xí)模塊化的設(shè)計(jì)方法得到程序的函數(shù)構(gòu)成第二步 學(xué)習(xí)帶參有返回值函數(shù)的定義第三步 學(xué)習(xí)帶參有返回值函數(shù)的聲明和調(diào)用1.模塊化設(shè)計(jì)計(jì)算生日日期之間的差值,可以分別先算出該日期是該
22、年的第幾天,再求兩者的差值即可。第一層得到的算法如下:1. 輸入本年度year2. 輸入兩個(gè)同學(xué)的生日日期(m1-d1,m2-d2)3. 計(jì)算第一個(gè)同學(xué)的生日是本年的第幾天days14. 計(jì)算第二個(gè)同學(xué)的生日是本年的第幾天days25. 計(jì)算并輸出days1和days的差值在第一層的算法分析中,第3、4步還需要細(xì)化,解決求一個(gè)日期是該年的第幾天的問題。例如求2012年4月5日是2012年的第幾天,通常的做法是前3個(gè)月的總的天數(shù)相加,再加上4月份的5天。每個(gè)月的總的天數(shù)分三種情況:有31天的,有30天的,2月份單獨(dú)按閏年和非閏年區(qū)分為29天和28天,得到算法如下:year,month,day表示
23、日期,days表示第幾天1. 將day賦給days2. 累加從month-1月到1月的總的天數(shù)到days3. 返回days完成累加從month-1月到1月的總的天數(shù)到days,可以利用switch語句的case語句沒有break語句,則順次進(jìn)入下一case分支的特性來完成累計(jì)。2月份要根據(jù)是否閏年區(qū)分是29天還是28天。判斷一個(gè)年份是否是閏年的算法:如果year能被4整除但不能被100整除,或者能被400整除則返回1 否則返回0 到此向下細(xì)化的任務(wù)完成,得到模塊結(jié)構(gòu)如圖5-7所示1.計(jì)算生日的差值2.計(jì)算某年某月某日是該年的第幾天3.判斷閏年圖5-7 任務(wù)2 模塊結(jié)構(gòu)圖2. 編寫有返回值的帶參
24、函數(shù)C語言實(shí)現(xiàn)模塊結(jié)構(gòu)圖中模塊是通過函數(shù)來完成的,任務(wù)2包括三個(gè)函數(shù),模塊1對應(yīng)的是main函數(shù),模塊2和模塊3是兩個(gè)有返回值的函數(shù)。模塊2是已知一個(gè)日期求是該年的第幾天;模塊3是一個(gè)判斷函數(shù),判斷是否是閏年,返回真或假。由于C語言不提供布爾類型表示真假,通常返回1表示真,返回0表示假。帶參有返回值的函數(shù)定義的一般形式為:函數(shù)類型 函數(shù)名(數(shù)據(jù)類型 形參變量1,數(shù)據(jù)類型 形參變量2) return 表達(dá)式;return語句的作用是將函數(shù)的計(jì)算結(jié)果返回到函數(shù)調(diào)用處,表達(dá)式的值的類型應(yīng)與函數(shù)類型一致。表達(dá)式可以直接是一個(gè)常量,也可以是變量,也可以是計(jì)算表達(dá)式。在定義函數(shù)的時(shí)候,函數(shù)名應(yīng)與函數(shù)實(shí)現(xiàn)的
25、功能相呼應(yīng),已知的數(shù)據(jù)要設(shè)計(jì)形參變量來接受,計(jì)算的結(jié)果數(shù)據(jù)決定函數(shù)的類型。模塊3的實(shí)現(xiàn)功能是已知一個(gè)年份求是否是閏年。形參需要一個(gè),接受年份,int類型。返回值是0或1,int類型,可以定義函數(shù)如下:intisLeap (int y) return (y%4=0&&y%100!=0 |y%400=0);模塊2的實(shí)現(xiàn)是已知年月日,求第幾天,形參變量需要三個(gè),分別表示年月日,int類型;返回值是第幾天,int類型。根據(jù)算法可以定義函數(shù)如下:intcalcDays(inty,intm,int d) int days=d; switch(m-1) case 12: days+=31;c
26、ase 11:days+=30; case 10: days+=31; case 9 :days+=30;case 8 : days+=31; case 7 :days+=31;case 6 :days+=30;case 5 : days+=31;case 4 :days+=30;case 3 : days+=31;case 2 :days+=isLeap(y)?29:28;case 1 : days+=31;return days;3. 調(diào)用有返回值的帶參函數(shù)的形式調(diào)用有返回值的帶參函數(shù)和調(diào)用無返回值的帶參函數(shù)類似,區(qū)別在于需要設(shè)計(jì)如何接收函數(shù)計(jì)算的返回值??山邮辗祷刂档奈恢弥饕腥N,以調(diào)
27、用calcDays函數(shù)為例:(1)賦值語句index=calcDays(2012,4,5);(2)運(yùn)算表達(dá)式 d=calcDays(2012,8,5)- calcDays(2012,4,5);(3)函數(shù)的參數(shù)printf(“%d-%d-%d是該年的第幾天”,year,month,day,calcDays(year,month,day);返回值為真和假的判斷函數(shù)調(diào)用位置通常在書寫if條件或者是循環(huán)條件的位置,例如函數(shù)calcDays中在一個(gè)條件表達(dá)式中調(diào)用isLeap函數(shù):days+=isLeap(y)?29:28;isLeap(y)根據(jù)y是否為閏年返回1或0,1為真,條件表達(dá)式的值???后面的2
28、9;0為假,條件表達(dá)式的值?。汉竺娴?8。條件表達(dá)式的值累加給days變量。完成本任務(wù)的完整程序如下所示,粗體部分為函數(shù)調(diào)用的語句【例5.5 sample05_04.cpp】#include <stdio.h>#include<math.h>intisLeap (int y);intcalcDays(int y,int m,int d);int main()int year,m1,d1,days1,m2,d2,days2;printf("計(jì)算兩個(gè)生日相差的天數(shù)n");/輸入年份和兩個(gè)同學(xué)的生日日期。printf("year=");
29、scanf("%d",&year);printf("第一個(gè)同學(xué)的生日(mm-dd):");scanf("%d-%d",&m1,&d1);printf("第二個(gè)同學(xué)的生日(mm-dd):");scanf("%d-%d",&m2,&d2);/計(jì)算同學(xué)的生日是本年的第幾天。days1= calcDays(year,m1,d1);days2= calcDays(year,m2,d2);/計(jì)算并輸出days1和days的差值printf("兩個(gè)生日相差的天
30、數(shù)為%dn",abs(days1-days2);return 0;/* *求一個(gè)日期是該年的第幾天 */intcalcDays(int y,int m,int d) int days=d;switch(m-1) case 12: days+=31;case 11:days+=30;case 10: days+=31;case 9 :days+=30;case 8 : days+=31;case 7 :days+=31;case 6 :days+=30;case 5 : days+=31;case 4 :days+=30;case 3 : days+=31;case 2 :days+=
31、isLeap(y)?29:28;case 1 : days+=31;return days;/* *判斷一個(gè)年份是否是閏年 */int isLeap (int y)return (y%4=0&&y%100!=0 |y%400=0);運(yùn)行示例圖5-8 運(yùn)行結(jié)果l 調(diào)試錯(cuò)誤程序示例多函數(shù)結(jié)構(gòu)的程序查錯(cuò)步驟一般如下:(1)首先要定位出錯(cuò)的函數(shù)。在main函數(shù)中,斷點(diǎn)設(shè)置位置往往在IPO的交界處,以確定是輸入的錯(cuò)誤,還是處理的錯(cuò)誤,還是輸出的錯(cuò)誤。帶參有返回值的函數(shù)的調(diào)用位置往往是斷點(diǎn)的設(shè)置位置。(2)如果處理函數(shù)的返回值出錯(cuò),則在出錯(cuò)的函數(shù)中第一句設(shè)置斷點(diǎn),確定參數(shù)傳值是否正確。(3
32、)如果參數(shù)傳值正確,則在return語句前設(shè)置斷點(diǎn),確定是處理算法出錯(cuò),還是return語句出錯(cuò)。(4)如果算法出錯(cuò),則在算法的合適位置設(shè)置斷點(diǎn),單步執(zhí)行,觀察變量的值找出錯(cuò)誤。打開程序文件error05_01.cpp,實(shí)現(xiàn)功能與smaple05_04.cpp相同。#include <stdio.h>#include<math.h>intcalcDays(int y,int m,int d);int main()int year,m1,d1,days1,m2,d2,days2;printf("計(jì)算兩個(gè)生日相差的天數(shù)n");/輸入年份和兩個(gè)同學(xué)的生日日
33、期 printf("year=");scanf("%d",&year);printf("第一個(gè)同學(xué)的生日(mm-dd):");scanf("%d-%d",&m1,&d1);printf("第二個(gè)同學(xué)的生日(mm-dd):");scanf("%d-%d",&m2,&d2);/計(jì)算同學(xué)的生日是本年的第幾天days1= calcDays(int year,m1,d1);days2= calcDays(int year,m2,d2);/計(jì)算并輸
34、出days1和days的差值printf("兩個(gè)生日相差的天數(shù)為%dn",abs(days1-days2);return 0;intcalcDays(int y,int m,int d) int days=d;switch(m) case 12: days+=31;case 11: days+=30;case 10: days+=31;case 9 :days+=30;case 8 :days+=31;case 7 :days+=31;case 6 :days+=30;case 5 :days+=31;case 4 :days+=30;case 3 :days+=31;ca
35、se 2 :days+=isLeap(y)?29:28;case 1 :days+=31;return days;int isLeap (int y) if(y%4=0&&y%100!=0 |y%400=0) return 0; else return 1;先對程序文件進(jìn)行編譯,有編譯錯(cuò)誤,首先修改編譯錯(cuò)誤。第一條編譯錯(cuò)誤指向main函數(shù)的calcDays函數(shù)調(diào)用語句,函數(shù)調(diào)用時(shí)應(yīng)給出參數(shù)的值(實(shí)參),賦給函數(shù)定義處的形參變量,調(diào)用時(shí)不需要加變量類型。錯(cuò)誤語句days1= calcDays(int year,int m1,int d1);days2= calcDays(int
36、year,int m2,int d2);編譯錯(cuò)誤提示error05_01.cpp(20) : error C2144: syntax error : missing ')' before type 'int'修改后語句days1= calcDays(year,m1,d1);days2= calcDays(year,m2,d2);修改后重新編譯,第一條編譯錯(cuò)誤指向calcDays函數(shù)定義中的case 2語句。編譯錯(cuò)誤提示isLeap是沒有聲明的標(biāo)示符,isLeap是用戶自定的函數(shù),編譯系統(tǒng)不能識(shí)別一般兩種原因,一是沒有函數(shù)聲明,二是拼寫錯(cuò)誤。錯(cuò)誤語句case 2
37、:days+=isLeap(y)?29:28;編譯錯(cuò)誤提示error C2065: 'isLeap' : undeclared identifier修改在main函數(shù)前增加函數(shù)聲明語句。int isLeap (int y);再次編譯通過,可以運(yùn)行,運(yùn)行結(jié)果如圖所示,結(jié)果相差一天,與結(jié)果不符,存在邏輯錯(cuò)誤。圖5-8調(diào)試運(yùn)行圖(1)調(diào)試邏輯錯(cuò)誤,在main函數(shù)最后的輸出語句前設(shè)置斷點(diǎn),按F5調(diào)試運(yùn)行,輸入year和兩個(gè)同學(xué)的生日日期后,程序在斷點(diǎn)處停下,如圖5-9所示,在locals選項(xiàng)卡中觀察變量的當(dāng)前值,year和兩個(gè)同學(xué)的生日日期數(shù)據(jù)正確,days1和days2的值不正確,第
38、一個(gè)同學(xué)的生日日期應(yīng)為當(dāng)年的第28天,第二個(gè)同學(xué)的生日日期應(yīng)為當(dāng)年的第126天,calcDays計(jì)算出錯(cuò),按F5結(jié)束本次運(yùn)行。圖5-9調(diào)試運(yùn)行圖(2)繼續(xù)檢查calcDays函數(shù)的出錯(cuò)原因,calcDays函數(shù)的return語句直接return days,沒有錯(cuò)誤,故可以確定函數(shù)算法有誤,在switch語句前設(shè)置斷點(diǎn)。按F5調(diào)試運(yùn)行,輸入year和兩個(gè)同學(xué)的生日日期后,程序在斷點(diǎn)處停下,如圖5-10所示,觀察變量的值,calcDays函數(shù)的參數(shù)y、m、d已正確獲得main函數(shù)傳來數(shù)據(jù)2012、1、28,days取得初值28。繼續(xù)單步執(zhí)行按F10后,跳轉(zhuǎn)到switch語句中的case 1,day
39、s增至59,這里產(chǎn)生一個(gè)邏輯錯(cuò)誤。第一個(gè)同學(xué)是1月份的,不需要加上一月的最大天數(shù),算法上應(yīng)累加1(m-1)個(gè)月的最大天數(shù),switch語句的開關(guān)表達(dá)式應(yīng)為(m-1)。圖5-10調(diào)試運(yùn)行圖(3)執(zhí)行菜單命令stop debugging結(jié)束本次調(diào)試,修改后switch語句的表達(dá)式后再次運(yùn)行仍不對,再次斷點(diǎn)調(diào)試發(fā)現(xiàn)days1的值正確為28,但days2的值錯(cuò)誤,為125。單步調(diào)試calcDays函數(shù),計(jì)算第二個(gè)同學(xué)的生日時(shí),程序正確地進(jìn)入case 2,在watch1窗口測試isLeap函數(shù)的值發(fā)現(xiàn)isLeap的值錯(cuò)誤,如圖5-11所示。2012年是閏年,isLeap(y)應(yīng)為1。檢查isLeap函數(shù)
40、發(fā)現(xiàn)邏輯錯(cuò)誤,交換兩個(gè)return語句的位置,再執(zhí)行程序正確。圖5-11調(diào)試運(yùn)行圖(4)獨(dú)立任務(wù)任務(wù)1改錯(cuò)計(jì)算n!程序文件error5-2.cpp的功能是調(diào)用fact(n) 函數(shù),計(jì)算n!。#include <stdio.h>int main(void)int n;double f;printf("Input n:");scanf("%d",&n);f=fact(m); /設(shè)置調(diào)試斷點(diǎn)1printf("%d!=%fn",n,f);return 0; /設(shè)置調(diào)試斷點(diǎn)2double fact(m)int i;doubl
41、e product;for(i=1;i<=m;i+)product= product*i;return 0; /設(shè)置調(diào)試斷點(diǎn)3要求:1、請根據(jù)VC6的compile和link錯(cuò)誤信息改正錯(cuò)誤,使程序可以運(yùn)行。(要求:截屏一個(gè)錯(cuò)誤信息,給出對應(yīng)的修改語句)2、請按注釋要求設(shè)置3個(gè)調(diào)試斷點(diǎn),糾正程序邏輯錯(cuò)誤,使其能正確輸出n!。(1)邏輯錯(cuò)誤糾正前的調(diào)式結(jié)果:l 執(zhí)行到斷點(diǎn)1處,能顯示n變量值的watch窗口截屏:l 執(zhí)行到斷點(diǎn)3處,能顯示i、product變量值的watch窗口截屏:l 執(zhí)行到斷點(diǎn)2處,能顯示f變量值的watch窗口截屏:(2)邏輯錯(cuò)誤糾正后的調(diào)式結(jié)果:l 執(zhí)行到斷點(diǎn)1處,能顯示n變量值的watch窗口截屏:l 執(zhí)行到斷點(diǎn)3處,能顯示i、product變量值的watch窗口截屏:l 執(zhí)行到斷點(diǎn)2處,能顯示f變量值的watch窗口截屏:任務(wù)2改寫程序增加參數(shù)可以增加函數(shù)的可變性和通用性,請修改sample05_03.cpp:(1)復(fù)制sample05_03.cpp并改名
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園戶外活動(dòng)的教研探討計(jì)劃
- 第19課 探索宇宙(教學(xué)設(shè)計(jì))-2023-2024學(xué)年六年級科學(xué)下冊同步備課(青島版)
- 加強(qiáng)倉庫流程管理的實(shí)施方案計(jì)劃
- 《貴州創(chuàng)泰礦業(yè)有限公司修文縣龍場鎮(zhèn)高倉老二洞鋁鐵礦山礦產(chǎn)資源綠色開發(fā)利用方案(三合一)》評審意見
- (高清版)DB3715∕T 7-2022 黑水虻飼養(yǎng)技術(shù)規(guī)程
- 統(tǒng)編版小學(xué)語文二年級下冊第3課《開滿鮮花的小路》精美課件
- Unit 7 Days and Months Lesson 5 colorful seasons 教學(xué)設(shè)計(jì) 2024-2025學(xué)年冀教版(2024)七年級英語上冊
- 固態(tài)電池知識(shí)培訓(xùn)課件
- 能源行業(yè):石油工程師簡歷
- 初中體育與健康 初二上 水平四 八年級(第一學(xué)期)籃球大單元教學(xué)設(shè)計(jì)+體前變向換手運(yùn)球突破投籃教學(xué)設(shè)計(jì)
- 2024年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫附答案
- 六年級語文下冊第五單元教材解析
- 湖南省2021年普通高等學(xué)校對口招生考試英語
- 《通信電源培訓(xùn)》課件
- 《CT檢查技術(shù)》課件-CT圖像后處理
- 水產(chǎn)生物遺傳育種學(xué)課件
- 婦產(chǎn)科醫(yī)患溝通護(hù)理課件
- 第3課《萬物共存》課件
- 精致的八寶飯
- GB/T 43602-2023物理氣相沉積多層硬質(zhì)涂層的成分、結(jié)構(gòu)及性能評價(jià)
- 醫(yī)院預(yù)算執(zhí)行情況分析報(bào)告
評論
0/150
提交評論