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

下載本文檔

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

文檔簡(jiǎn)介

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

2、錄一些狀態(tài) ……,關(guān)于考試,一、關(guān)于工程的創(chuàng)建,1、每一個(gè)程序(有一個(gè)main()函數(shù)),都應(yīng)創(chuàng)建一個(gè)工程。2、我們創(chuàng)建的工程(Project)類型為:Win32 Console Application。3、工程的命名要有規(guī)律可循,工程文件存放的文件夾位置應(yīng)為Z盤上以你自己的學(xué)號(hào)命名的文件夾。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)境會(huì)為你創(chuàng)建所有所需源文件及程序框架,你只需對(duì)源程序文件進(jìn)行修改即可: 你要修改的源程序文件為“工程名.cpp” 程序框架不要變動(dòng) 將語(yǔ)句 printf(“Hello World!”); 刪除,加上自己的代碼即可,,將工程視圖切換到File View,,修改與工程名同名的源文件,,編譯時(shí)

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

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

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

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

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

9、},四、常見問(wèn)題,標(biāo)準(zhǔn)輸入輸出的使用: 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);,四、常見問(wèn)題,字符和字符串的輸入輸出: char s[100];輸入字符: scanf(“%c”, &s[i]);輸入字符串:(兩者會(huì)產(chǎn)生沖突,不要一起使用) scanf(“%s”, s); 或者

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

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

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

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

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

16、該用括號(hào)的地方?jīng)]用括號(hào):盡可能地使用括號(hào)! 不會(huì)處理輸出格式,比如要求輸出一組數(shù),中間用逗號(hào)間隔,則很多同學(xué)不知道怎么能做到最后一個(gè)數(shù)后面不跟逗號(hào) 先打印第一個(gè)元素,printf(“%d”, a[0]);再用for循環(huán)打印其他元素, printf(“,%d”, a[i]);,四、常見問(wèn)題,程序的執(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 ){},四、常見問(wèn)題,嵌套if if( x>0 ){ if( x>0&&x<10) { } else {

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

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

20、入一個(gè)整數(shù) char s[80]; scanf(“%c”, &s[i]); //一次讀入一個(gè)字符 scanf(“%s”, s); //空格或回車結(jié)束(不含空格) gets(s); //回車結(jié)束,四、常見問(wèn)題,動(dòng)態(tài)數(shù)組的使用:當(dāng)處理的數(shù)據(jù)個(gè)數(shù)在編程時(shí)不確定時(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();},四、常見問(wèn)題,四、常見問(wèn)題,大數(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]);},四、常見問(wèn)題,數(shù)組的越界訪問(wèn)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、) … } }},四、常見問(wèn)題,循環(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; …… },四、常見問(wèn)題,字符串的處理:字符串在字符數(shù)組中以’\0’結(jié)束字符串長(zhǎng)度與字符數(shù)組的長(zhǎng)度不是一個(gè)概念!char s[100];int i;scanf(“%s”,

27、s);for( i=0; i<100; i++){ if( s[i]==…},四、常見問(wèn)題,字符串的比較與交換比較:有專門的函數(shù) strcmp(str1, str2)不能用“==”: str1==str2(錯(cuò)誤?。┛截悾河袑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èn)題,編程網(wǎng)格中一個(gè)常見的輸入輸出控制問(wèn)題第一行輸入一個(gè)整數(shù)n,其后有n行,每行是……輸出有n行,……int n;scanf(“%d”, &n);for( int i=0;

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

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

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

32、,Any fool can write code that a computer can understand. Good programmer write code that human can understand.——Martin Fowler,問(wèn)題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;,六、程序示例,問(wèn)題

35、1: 給定年月日,判斷該日是這年的第幾天。,//利用數(shù)組來(lái)存放每月的天數(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;,六、程序示例,問(wèn)題2: 細(xì)菌繁殖。細(xì)菌數(shù)目每天成倍增長(zhǎng)。給定起始和終止日,以及起始日細(xì)菌數(shù)目,求終止日細(xì)菌數(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;},六、程序示例,問(wèn)題2: 細(xì)菌繁殖。細(xì)菌數(shù)目每天成倍增長(zhǎng)。給定起始和終止日,以及起始日細(xì)菌數(shù)目,求終止日細(xì)菌數(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);,六、程序示例,六、程序示例,問(wèn)題3:編寫一個(gè)程序,要求用戶從鍵盤上輸入一個(gè)整數(shù),并把每位數(shù)字轉(zhuǎn)換成英文。如當(dāng)用戶輸入1024時(shí),

40、屏幕上輸出:one, zero, two, four,如何做?輸入輸出數(shù)據(jù):算法關(guān)鍵:如何確定一個(gè)整數(shù)有多少位?每位數(shù)是多少?該如何表達(dá)?,#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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論