版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算概論 之 C語言程序設計,期終總結,關于考試,時間:2011年1月4日下午3:10~5:00(請?zhí)崆?0分鐘到) 地點:計算中心機房(平時上機地)請將學生證放到桌面上關于用戶和IP綁定:考試時,每個人都只能用自己的帳戶在同一臺機器上登錄,否則將被鎖定,不能繼續(xù)考試!,復習:講義,基本概念及基本語法 多閱讀以前的源代碼 解決問題的思路 計算,計算過程中變量的值及其變化 循環(huán)過程中的當前循環(huán)、循環(huán)的跳出 通過中間變量來記
2、錄一些狀態(tài) ……,關于考試,一、關于工程的創(chuàng)建,1、每一個程序(有一個main()函數),都應創(chuàng)建一個工程。2、我們創(chuàng)建的工程(Project)類型為:Win32 Console Application。3、工程的命名要有規(guī)律可循,工程文件存放的文件夾位置應為Z盤上以你自己的學號命名的文件夾。4、新建的應用程序(Application)類型為: A “Hello World” Application,,,,,創(chuàng)建工程,工程類型
3、,工程名稱,工程文件存放位置,,一、關于工程的創(chuàng)建,如果創(chuàng)建的應用程序類型為“Hello World” Application ,則VC++編程環(huán)境會為你創(chuàng)建所有所需源文件及程序框架,你只需對源程序文件進行修改即可: 你要修改的源程序文件為“工程名.cpp” 程序框架不要變動 將語句 printf(“Hello World!”); 刪除,加上自己的代碼即可,,將工程視圖切換到File View,,修改與工程名同名的源文件,,編譯時
4、請選擇Build,,編輯你的程序,,程序框架不要修改,,,,二、關于程序的錯誤修改及調試,當程序編譯出現(xiàn)錯誤時,不要驚慌,編譯結果輸出窗口已經為你指明了程序的出錯行及錯誤原因,可以據此來修改程序錯誤。 修改錯誤時,應從出錯信息中的第一條開始,用鼠標雙擊該條信息,程序源文件窗口就將定位到出錯行。 很多時候,程序編譯后會出很多錯誤,但很可能是由第一個錯誤衍生而來的,改完第一個錯誤后,再編譯時其他錯誤就不再出現(xiàn)了。所以,應該每
5、修改完一個錯誤后就編譯一次。,二、關于程序的錯誤修改及調試,{,,這里少了一個“{”。,雙擊第一行,定位錯誤及了解錯誤原因!,二、關于程序的錯誤修改及調試,當程序編譯通過后,在程序執(zhí)行時,由于程序算法及其他原因,執(zhí)行結果有可能不正確,這時從源程序表面上就很難發(fā)現(xiàn)錯誤,而是需要對程序進行跟蹤調試。 在跟蹤調試過程中,可以一步一步執(zhí)行程序語句,在每一條語句執(zhí)行后,可以查看相關變量的值,以判斷和預期結果是否相符;也可以了解程序的執(zhí)行順
6、序,看它是否和預期的程序流程相符。 當然,在跟蹤調試前,還需要確定一下程序可能從哪里出錯,設置一個斷點,讓程序在此停止自動運行,由我們手動一步一步發(fā)出程序執(zhí)行命令。如果不能確定程序是從哪里出錯,則可以將斷點設置在程序的第一條語句處。,設置程序斷點,,,,跟蹤方式執(zhí)行程序,,查看變量值,,當前程序執(zhí)行停留在此行,,程序手動執(zhí)行 進入函數 一步一步執(zhí)行 從函數中執(zhí)行出來 執(zhí)行到光標所在行,三、程序設計的基本過程,目標:利用計
7、算機來解決問題 過程: 創(chuàng)建一個新工程:每一個問題,都創(chuàng)建一個工程 創(chuàng)建一個源文件:只用一個源文件 編寫源程序:預編譯、函數聲明、main()函數,其他函數 編譯鏈接、修改錯誤 運行、調試,三、問題求解的基本步驟,目標:給出解決問題的程序 步驟: 分析問題,明確輸入和輸出的數據 確定數據的表示方法(數據類型、數據結構及相應變量) 尋找解決問題的算法(包括明確中間過程所使用的數據) 編寫程序,三、問題求解的基本步驟,
8、求2個整數的和,輸入數據:兩個整數?先要定義2個整數變量輸出數據:一個整數?定義1個整數變量,來存放2個數的和算法:先從鍵盤輸入2個整數,將這2個數相加,并賦給相應的變量,最后將和輸出。,#include int main(){ int a, b, c; scanf(“%d%d”, &a, &b); c = a + b; printf(“%d”, c); return 0;
9、},四、常見問題,標準輸入輸出的使用: scanf():用于從鍵盤中輸入數據,賦給變量 printf():將希望輸出的內容顯示在屏幕上(一行一行地顯示),先定義變量,再利用scanf()函數給該變量輸入相應的數據,最后才能使用該變量。int a, b, c;scanf(“%d%d”, &a, &b);c = a + b;,printf()函數可以將變量的內容以及其他的提示信息輸出到屏幕上。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]);輸入字符串:(兩者會產生沖突,不要一起使用) scanf(“%s”, s); 或者
11、 gets(s); 輸出字符: printf(“%c”, s[i]); 輸出字符串: printf(“%s”, s); 或者 puts(s);,數值的表達范圍不同的數據類型,其表達范圍是不同的,也是有限的浮點數精度float和 double 的計算精度不同,double的精度要高2.33和2.33f在計算機內是不同的整數的除法得到的仍是整數,小數部分舍去,如:1/2 =0, 5/2 =2。
12、若需要得到小數部分,則需要進行強制類型轉換:(float)1/2,或者1.0/21/2*(a+b+c+d)運算符“=”和“==”這是兩個完全不同的運算符,前者是賦值,后者是比較if(x=2) … if(x= =2) …,四、常見問題,字符常量的表達 x = a; (錯誤,此事a被當作變量名) x = ‘a’; (正確) if(x==a) …
13、 if(x==‘a’) …漏大括號, 本應在一起執(zhí)行的程序結果只執(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語句,導致后續(xù)不該執(zhí)行的
15、分支語句也執(zhí)行;case子句后面應該是整型常量,包括字符。 變量初始化:沒有初始化就引用,導致結果錯誤,尤其對于數組問題?!白詣?chuàng)”表達式:注意關系表達式和邏輯表達式的使用方法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)先級,導致
16、該用括號的地方沒用括號:盡可能地使用括號! 不會處理輸出格式,比如要求輸出一組數,中間用逗號間隔,則很多同學不知道怎么能做到最后一個數后面不跟逗號 先打印第一個元素,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ī)范,導致代碼不夠清晰,可讀性不好。 欠缺獨立解決問題的意識,比如在碰到問題時不知道先查閱講義、參考書等,四、常見問題,編譯錯誤的解決指定行前后,錯誤的原因充分利用調試工具debug特定的輸入變量的的當前值表達式的當前值程序的執(zhí)行順序,四、常見問題,不同類型數據的混
19、合運算:整型數據和浮點數據的混合運算double a;a = 75/100*7.5; //a = ?a = 0.6*(2/3); //a = ?,四、常見問題,此時a的結果都為0!,四、常見問題,數組讀入問題 int a; scanf(“%d”, &a); int s[100][100]; scanf(“%d”, &s[i][j]); //一次讀
20、入一個整數 char s[80]; scanf(“%c”, &s[i]); //一次讀入一個字符 scanf(“%s”, s); //空格或回車結束(不含空格) gets(s); //回車結束,四、常見問題,動態(tài)數組的使用:當處理的數據個數在編程時不確定時 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();},四、常見問題,四、常見問題,大數組的定義:應定義為全局變量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]);},四、常見問題,數組的越界訪問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; …… },四、常見問題,字符串的處理:字符串在字符數組中以’\0’結束字符串長度與字符數組的長度不是一個概念!char s[100];int i;scanf(“%s”,
27、s);for( i=0; i<100; i++){ if( s[i]==…},四、常見問題,字符串的比較與交換比較:有專門的函數 strcmp(str1, str2)不能用“==”: str1==str2(錯誤?。┛截悾河袑iT的函數 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); },四、常見問題,編程網格中一個常見的輸入輸出控制問題第一行輸入一個整數n,其后有n行,每行是……輸出有n行,……int n;scanf(“%d”, &n);for( int i=0;
29、 i<n; i++ ){ scanf(“…”, …); …… printf(“…”, …); },“程序提交后輸出為空”有幾個原因: 1、對于某些測試用例,程序確實沒有輸出(考慮不夠全面); 2、程序超時;3、程序運行時有錯誤,還沒有輸出就結束了(有些錯誤,在VC環(huán)境中是不會出現(xiàn)的, 但在編程網格中是會出錯的。比如數組的越界訪問),五、編程網格的常見問題,五、編程網格的常見問題,為什么我的程序在V
30、C中正確,但在PG上不對?你的程序對變量未正確地初始化你分配的數組大小太小了,無法處理大測試數據程序對特殊情形的處理不正確程序判斷語句中該使用“ == ”的地方使用了“ =”,五、編程網格的常見問題,為什么我的程序在VC中編譯正確,但在PG上是Compile Error?main函數定義為void main()了,應該為int main()程序中使用了strlwr和strupr等函數(strlwr和strupr不是ANSI
31、C的標準函數)忘記了相應的#include多了一行VC專用的#include "stdafx.h",五、編程網格的常見問題,為什么我的程序編譯不通過?強制類型轉換應為(int)a,而不是int(a)#define 語句中使用了等號:#define PAI = 3.14159對浮點數使用了求余數運算符%,C語言中%只能用于整數間的運算for循環(huán)語句的循環(huá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: 給定年月日,判斷該日是這年的第幾天。,//利用數組來存放每月的天數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: 細菌繁殖。細菌數目每天成倍增長。給定起始和終止日,以及起始日細菌數目,求終止日細菌數目。,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: 細菌繁殖。細菌數目每天成倍增長。給定起始和終止日,以及起始日細菌數目,求終止日細菌數目。,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:編寫一個程序,要求用戶從鍵盤上輸入一個整數,并把每位數字轉換成英文。如當用戶輸入1024時,
40、屏幕上輸出:one, zero, two, four,如何做?輸入輸出數據:算法關鍵:如何確定一個整數有多少位?每位數是多少?該如何表達?,#include #include int main(){ int a, b, p; int len; //a的位數 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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論