第二十二十一講綜合練習及復(fù)習_第1頁
已閱讀1頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算概論 之 C語言程序設(shè)計,期終總結(jié),關(guān)于考試,時間:2011年1月4日下午3:10~5:00(請?zhí)崆?0分鐘到) 地點:計算中心機房(平時上機地)請將學(xué)生證放到桌面上關(guān)于用戶和IP綁定:考試時,每個人都只能用自己的帳戶在同一臺機器上登錄,否則將被鎖定,不能繼續(xù)考試!,復(fù)習:講義,基本概念及基本語法 多閱讀以前的源代碼 解決問題的思路 計算,計算過程中變量的值及其變化 循環(huán)過程中的當前循環(huán)、循環(huán)的跳出 通過中間變量來記

2、錄一些狀態(tài) ……,關(guān)于考試,一、關(guān)于工程的創(chuàng)建,1、每一個程序(有一個main()函數(shù)),都應(yīng)創(chuàng)建一個工程。2、我們創(chuàng)建的工程(Project)類型為:Win32 Console Application。3、工程的命名要有規(guī)律可循,工程文件存放的文件夾位置應(yīng)為Z盤上以你自己的學(xué)號命名的文件夾。4、新建的應(yīng)用程序(Application)類型為: A “Hello World” Application,,,,,創(chuàng)建工程,工程類型

3、,工程名稱,工程文件存放位置,,一、關(guān)于工程的創(chuàng)建,如果創(chuàng)建的應(yīng)用程序類型為“Hello World” Application ,則VC++編程環(huán)境會為你創(chuàng)建所有所需源文件及程序框架,你只需對源程序文件進行修改即可: 你要修改的源程序文件為“工程名.cpp” 程序框架不要變動 將語句 printf(“Hello World!”); 刪除,加上自己的代碼即可,,將工程視圖切換到File View,,修改與工程名同名的源文件,,編譯時

4、請選擇Build,,編輯你的程序,,程序框架不要修改,,,,二、關(guān)于程序的錯誤修改及調(diào)試,當程序編譯出現(xiàn)錯誤時,不要驚慌,編譯結(jié)果輸出窗口已經(jīng)為你指明了程序的出錯行及錯誤原因,可以據(jù)此來修改程序錯誤。 修改錯誤時,應(yīng)從出錯信息中的第一條開始,用鼠標雙擊該條信息,程序源文件窗口就將定位到出錯行。 很多時候,程序編譯后會出很多錯誤,但很可能是由第一個錯誤衍生而來的,改完第一個錯誤后,再編譯時其他錯誤就不再出現(xiàn)了。所以,應(yīng)該每

5、修改完一個錯誤后就編譯一次。,二、關(guān)于程序的錯誤修改及調(diào)試,{,,這里少了一個“{”。,雙擊第一行,定位錯誤及了解錯誤原因!,二、關(guān)于程序的錯誤修改及調(diào)試,當程序編譯通過后,在程序執(zhí)行時,由于程序算法及其他原因,執(zhí)行結(jié)果有可能不正確,這時從源程序表面上就很難發(fā)現(xiàn)錯誤,而是需要對程序進行跟蹤調(diào)試。 在跟蹤調(diào)試過程中,可以一步一步執(zhí)行程序語句,在每一條語句執(zhí)行后,可以查看相關(guān)變量的值,以判斷和預(yù)期結(jié)果是否相符;也可以了解程序的執(zhí)行順

6、序,看它是否和預(yù)期的程序流程相符。 當然,在跟蹤調(diào)試前,還需要確定一下程序可能從哪里出錯,設(shè)置一個斷點,讓程序在此停止自動運行,由我們手動一步一步發(fā)出程序執(zhí)行命令。如果不能確定程序是從哪里出錯,則可以將斷點設(shè)置在程序的第一條語句處。,設(shè)置程序斷點,,,,跟蹤方式執(zhí)行程序,,查看變量值,,當前程序執(zhí)行停留在此行,,程序手動執(zhí)行 進入函數(shù) 一步一步執(zhí)行 從函數(shù)中執(zhí)行出來 執(zhí)行到光標所在行,三、程序設(shè)計的基本過程,目標:利用計

7、算機來解決問題 過程: 創(chuàng)建一個新工程:每一個問題,都創(chuàng)建一個工程 創(chuàng)建一個源文件:只用一個源文件 編寫源程序:預(yù)編譯、函數(shù)聲明、main()函數(shù),其他函數(shù) 編譯鏈接、修改錯誤 運行、調(diào)試,三、問題求解的基本步驟,目標:給出解決問題的程序 步驟: 分析問題,明確輸入和輸出的數(shù)據(jù) 確定數(shù)據(jù)的表示方法(數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)及相應(yīng)變量) 尋找解決問題的算法(包括明確中間過程所使用的數(shù)據(jù)) 編寫程序,三、問題求解的基本步驟,

8、求2個整數(shù)的和,輸入數(shù)據(jù):兩個整數(shù)?先要定義2個整數(shù)變量輸出數(shù)據(jù):一個整數(shù)?定義1個整數(shù)變量,來存放2個數(shù)的和算法:先從鍵盤輸入2個整數(shù),將這2個數(shù)相加,并賦給相應(yīng)的變量,最后將和輸出。,#include int main(){ int a, b, c; scanf(“%d%d”, &a, &b); c = a + b; printf(“%d”, c); return 0;

9、},四、常見問題,標準輸入輸出的使用: scanf():用于從鍵盤中輸入數(shù)據(jù),賦給變量 printf():將希望輸出的內(nèi)容顯示在屏幕上(一行一行地顯示),先定義變量,再利用scanf()函數(shù)給該變量輸入相應(yīng)的數(shù)據(jù),最后才能使用該變量。int a, b, c;scanf(“%d%d”, &a, &b);c = a + b;,printf()函數(shù)可以將變量的內(nèi)容以及其他的提示信息輸出到屏幕上。p

10、rintf(“\n%d + %d = %c\n”, a, b, c);,如果a 為1,b為4,則輸出為:1 + 4 = 5,double r;scanf(“%lf”, &r);,四、常見問題,字符和字符串的輸入輸出: char s[100];輸入字符: scanf(“%c”, &s[i]);輸入字符串:(兩者會產(chǎn)生沖突,不要一起使用) scanf(“%s”, s); 或者

11、 gets(s); 輸出字符: printf(“%c”, s[i]); 輸出字符串: printf(“%s”, s); 或者 puts(s);,數(shù)值的表達范圍不同的數(shù)據(jù)類型,其表達范圍是不同的,也是有限的浮點數(shù)精度float和 double 的計算精度不同,double的精度要高2.33和2.33f在計算機內(nèi)是不同的整數(shù)的除法得到的仍是整數(shù),小數(shù)部分舍去,如:1/2 =0, 5/2 =2。

12、若需要得到小數(shù)部分,則需要進行強制類型轉(zhuǎn)換:(float)1/2,或者1.0/21/2*(a+b+c+d)運算符“=”和“==”這是兩個完全不同的運算符,前者是賦值,后者是比較if(x=2) … if(x= =2) …,四、常見問題,字符常量的表達 x = a; (錯誤,此事a被當作變量名) x = ‘a(chǎn)’; (正確) if(x==a) …

13、 if(x==‘a(chǎn)’) …漏大括號, 本應(yīng)在一起執(zhí)行的程序結(jié)果只執(zhí)行一條 if(x>0) if(x>0) x = x + 4; { x = x/4; x = x + 4;

14、 x = x/4; }亂加分號, 比如在if、for 和while后加分號 for(x=1;x0); //此時形成空語句{…} {…},四、常見問題,switch/case語句:往往忘了在分支后加break語句,導(dǎo)致后續(xù)不該執(zhí)行的

15、分支語句也執(zhí)行;case子句后面應(yīng)該是整型常量,包括字符。 變量初始化:沒有初始化就引用,導(dǎo)致結(jié)果錯誤,尤其對于數(shù)組問題?!白詣?chuàng)”表達式:注意關(guān)系表達式和邏輯表達式的使用方法if( 11 && a<n )if (i==1, 3, 5), if (i==1 || 3 || 5), if (i==1 | 3 | 5)? if(i==1 || i==3 || i==3)忽略邏輯表達式中邏輯運算符的優(yōu)先級,導(dǎo)致

16、該用括號的地方?jīng)]用括號:盡可能地使用括號! 不會處理輸出格式,比如要求輸出一組數(shù),中間用逗號間隔,則很多同學(xué)不知道怎么能做到最后一個數(shù)后面不跟逗號 先打印第一個元素,printf(“%d”, a[0]);再用for循環(huán)打印其他元素, printf(“,%d”, a[i]);,四、常見問題,程序的執(zhí)行順序 V = 4 * 3.14f * r * r * r;L = 2 * 3.14f * r;scanf("%f

17、", &r);printf("%.2f\n%.2f", V, L);if…else ifif( x>0 ){}else if( x==0 ){{else if( x<0 ){},四、常見問題,嵌套if if( x>0 ){ if( x>0&&x<10) { } else {

18、 }},不理解題意,有些要用循環(huán)多次輸入的題目,只實現(xiàn)了一次的功能。 變量作用域問題:在作用域外引用變量。 工程的創(chuàng)建,頭文件的包含程序書寫格式不規(guī)范,導(dǎo)致代碼不夠清晰,可讀性不好。 欠缺獨立解決問題的意識,比如在碰到問題時不知道先查閱講義、參考書等,四、常見問題,編譯錯誤的解決指定行前后,錯誤的原因充分利用調(diào)試工具debug特定的輸入變量的的當前值表達式的當前值程序的執(zhí)行順序,四、常見問題,不同類型數(shù)據(jù)的混

19、合運算:整型數(shù)據(jù)和浮點數(shù)據(jù)的混合運算double a;a = 75/100*7.5; //a = ?a = 0.6*(2/3); //a = ?,四、常見問題,此時a的結(jié)果都為0!,四、常見問題,數(shù)組讀入問題 int a; scanf(“%d”, &a); int s[100][100]; scanf(“%d”, &s[i][j]); //一次讀

20、入一個整數(shù) char s[80]; scanf(“%c”, &s[i]); //一次讀入一個字符 scanf(“%s”, s); //空格或回車結(jié)束(不含空格) gets(s); //回車結(jié)束,四、常見問題,動態(tài)數(shù)組的使用:當處理的數(shù)據(jù)個數(shù)在編程時不確定時 int i, n; struct ABC

21、{ char name[100]; int num; }*stu; scanf(“%d”, &n); stu = (struct ABC *) malloc(sizeof(struct ABC )*n); for(i=0; i<n; i++) { scanf(“%d%s”, &stu[i].num, stu[i

22、].name); } … free(p);,全局和局部變量同名int x;void p(){ printf(“%d”, x);} void main(){ int x; //不能和全局變量同名! scanf(“%d”, &x); p();},四、常見問題,四、常見問題,大數(shù)組的定義:應(yīng)定義為全局變量int x[

23、50000];int s[10000][10000];void main(){ int i, j; for( i=0; i<50000; i++) scanf(“%d”, &x[i]); for( i=0; i<10000; i++) for( j=0; j<10000; j++) scanf(“%d”, &s[

24、i][j]);},四、常見問題,數(shù)組的越界訪問int s[10000][10000];void main(){ int i, j; … for( i=0; i<10000; i++) { for( j=0; j<10000; j++) { if( s[i][j-1] == 0 && s[i][j+1] == 0

25、) … } }},四、常見問題,循環(huán)控制:連續(xù)退出二重循環(huán) int i, j; … for( i=0; i<10000; i++) { int isbreak = 0; for( j=0; j<10000; j++) { … if(… ) {

26、 isbreak = 1; break; } } if( isbreak ) break; …… },四、常見問題,字符串的處理:字符串在字符數(shù)組中以’\0’結(jié)束字符串長度與字符數(shù)組的長度不是一個概念!char s[100];int i;scanf(“%s”,

27、s);for( i=0; i<100; i++){ if( s[i]==…},四、常見問題,字符串的比較與交換比較:有專門的函數(shù) strcmp(str1, str2)不能用“==”: str1==str2(錯誤?。┛截悾河袑iT的函數(shù) strcpy(dest, orig)不能用“=”:dest = orig;char str1[100], str2[100], tmp[100];scanf(“%s %s

28、”, str1, str2);if( strcmp(str1,str2)>0 ){ strcpy(tmp, str1); strcpy(str1, str2); srcpy(str2,tmp); },四、常見問題,編程網(wǎng)格中一個常見的輸入輸出控制問題第一行輸入一個整數(shù)n,其后有n行,每行是……輸出有n行,……int n;scanf(“%d”, &n);for( int i=0;

29、 i<n; i++ ){ scanf(“…”, …); …… printf(“…”, …); },“程序提交后輸出為空”有幾個原因: 1、對于某些測試用例,程序確實沒有輸出(考慮不夠全面); 2、程序超時;3、程序運行時有錯誤,還沒有輸出就結(jié)束了(有些錯誤,在VC環(huán)境中是不會出現(xiàn)的, 但在編程網(wǎng)格中是會出錯的。比如數(shù)組的越界訪問),五、編程網(wǎng)格的常見問題,五、編程網(wǎng)格的常見問題,為什么我的程序在V

30、C中正確,但在PG上不對?你的程序?qū)ψ兞课凑_地初始化你分配的數(shù)組大小太小了,無法處理大測試數(shù)據(jù)程序?qū)μ厥馇樾蔚奶幚聿徽_程序判斷語句中該使用“ == ”的地方使用了“ =”,五、編程網(wǎng)格的常見問題,為什么我的程序在VC中編譯正確,但在PG上是Compile Error?main函數(shù)定義為void main()了,應(yīng)該為int main()程序中使用了strlwr和strupr等函數(shù)(strlwr和strupr不是ANSI

31、C的標準函數(shù))忘記了相應(yīng)的#include多了一行VC專用的#include "stdafx.h",五、編程網(wǎng)格的常見問題,為什么我的程序編譯不通過?強制類型轉(zhuǎn)換應(yīng)為(int)a,而不是int(a)#define 語句中使用了等號:#define PAI = 3.14159對浮點數(shù)使用了求余數(shù)運算符%,C語言中%只能用于整數(shù)間的運算for循環(huán)語句的循環(huán)控制中用“,”而不是“;”分隔三部分,五、關(guān)于程序風格

32、,Any fool can write code that a computer can understand. Good programmer write code that human can understand.——Martin Fowler,問題1: 給定年月日,判斷該日是這年的第幾天。,int year, month, day, total, i;scanf(“%d%d%d”, &year, &m

33、onth, &day);total = 0;for( i=1; i<month; i++){ if ( i ==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12) { total = total +31; } if ( i ==4 || i==6 || i==9 || i==11) {

34、 total = total +30; } if ( i ==2) { if( (year%4==0&&year%100!=0) || year%400==0 ) total = total +29; else total = total +28; }}total = total + day;,六、程序示例,問題

35、1: 給定年月日,判斷該日是這年的第幾天。,//利用數(shù)組來存放每月的天數(shù)int year, month, day, total, i;int mday[12] = {31,28,31,30,31,30,31,31,30,31,30,31};scanf(“%d%d%d”, &year, &month, &day);total = 0;for( i=1; i<month; i++){

36、 total = total + mday[i-1];}if( (year%4==0&&year%100!=0) || year%400==0 ) total = total + 1;total = total + day;,六、程序示例,問題2: 細菌繁殖。細菌數(shù)目每天成倍增長。給定起始和終止日,以及起始日細菌數(shù)目,求終止日細菌數(shù)目。,int m1, d1, m2, d2, n

37、um1, num2;int total1, total2, days, i;scanf(“%d%d%d%d%d”, &m1, &d1, &num1, &m2, &d2);//利用剛才的算法,分別求得起始日和終止日是該年的第幾天total1 = …total2 = …days = total2 – total1;num2 = num1;for( i=1; i<days; i

38、++){ num2 = 2*num2;},六、程序示例,問題2: 細菌繁殖。細菌數(shù)目每天成倍增長。給定起始和終止日,以及起始日細菌數(shù)目,求終止日細菌數(shù)目。,int m1, d1, m2, d2, num1, num2;int mday[12] = {31,28,31,30,31,30,31,31,30,31,30,31};int days, i;scanf(“%d%d%d%d%d”, &m1, &

39、;d1, &num1, &m2, &d2);days = 0;for( i=m1; i<m2;i++){ days = days + mday[i-1];}days = days + d2 – d1;num2 = num1*(int)pow(2, days);,六、程序示例,六、程序示例,問題3:編寫一個程序,要求用戶從鍵盤上輸入一個整數(shù),并把每位數(shù)字轉(zhuǎn)換成英文。如當用戶輸入1024時,

40、屏幕上輸出:one, zero, two, four,如何做?輸入輸出數(shù)據(jù):算法關(guān)鍵:如何確定一個整數(shù)有多少位?每位數(shù)是多少?該如何表達?,#include #include int main(){ int a, b, p; int len; //a的位數(shù) scanf(“%d”, &a); len = 0; b = a; do{ b = b / 10;

41、 len ++; }while(b>0); for( int i = len-1; i>=0; i--) { p = a/(int)pow(10,i); … a = a – p*(int)pow(10, i); }return 0;},if( i!=0 ){ switch(p) {case 0: { pri

42、ntf("zero,"); break; }case 1: { printf("one,"); break; }case 2: { printf("two,"); break; }case 3: { printf("three,"); break; }case 4: { printf("four,"); break; }

43、case 5: { printf("five,"); break; }case 6: { printf("six,"); break; }case 7: { printf("seven,"); break; }case 8: {printf("eight,"); break; }case 9: { printf("nine,&qu

44、ot;); break; } }}else{ switch(p) {case 0: { printf("zero"); break; }case 1: { printf("one"); break; }case 2: { printf("two"); break; }case 3: { printf("three"

45、;); break; }case 4: { printf("four"); break; }case 5: { printf("five"); break; }case 6: { printf("six"); break; }case 7: { printf("seven"); break; }case 8: {printf("

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論