C程式設計(第四版)課後習題完整版 譚浩強編著

  • 2019 年 10 月 4 日
  • 筆記

第一章:程式設計和C語言

習題

1、什麼是程式?什麼是程式設計?

答:程式就是一組電腦能識別和執行的指令。 程式設計是指從確定任務到得到結果,寫出文檔的全過程。(一般經歷6個階段:①問題分析;②設計演算法;③編寫程式;④對源程式進行編輯,編譯和連接;⑤運行程式,分析結果;⑥編寫程式文檔;)

2、為什麼需要電腦語言?高級語言的特點?

答:如同和人類交流一樣,和哪個國家的人交流就需要哪個國家的語言來作為橋樑,想要和電腦進行交流溝通也就需要電腦語言,溝通以後就能用電腦做很多事情,更好的控制電腦 更好的用電腦完成我們的目的。高級語言同自然語言相近,便於人類理解和記憶,從人類的邏輯思維角度出發的電腦語言,抽象程度大大提高,需要經過編譯成特定機器上的目標程式碼才能執行,一條高級語言的語句往往需要若干條機器指令來完成。

3、正確理解以下名詞及其含義

(1)源程式 目標程式 可執行程式

答:用高級語言編寫的程式碼程式即為源程式。

(2)程式編輯 程式編譯 程式連接

答:

(3)程式 程式模組 程式文件

答:程式就是一組電腦能識別和執行的指令。

(4)函數 主函數 被調用函數 庫函數

答:

(5)程式調試 程式測試

答:

4、 自學本書復錄A,熟悉上級運行C程式的方法,上級運行本章3個例題。

5、請參照本章列題,編寫一個C程式,輸出以下資訊:

*******************************

Very good !

*******************************

 1  #include<stdio.h>   2  int main()   3 {   4        for(int i=1;i<8;i++)   5         {   6               printf("**");   7         }   8         printf("n");   9         printf("Very Good ! n");  10  11         for(int i=1;i<8;i++)  12         {  13               printf("**");  14         }  15  16         return 0;  17  18 }   

6、編寫一個C程式,輸入a,b,c三個值,輸出其中最大者。

 1 #include <stdio.h>   2   3 int main () {   4     int max(int a,int b,int c);   5     int x=92,y=100,z=70;   6     int c=max(x,y,z);   7     printf("%dn",c);   8     return 0;   9 }  10  11 int max(int a,int b ,int c)  12 {  13     if(a>b)  14     {  15         if(a>c)  16             return a;  17         else  18             return c;  19     }  20     else if(b>c)  21     {  22         return b;  23     }else  24         return c;  25  26 }

第二章:演算法—–程式的靈魂

讀書筆記:

1、一個程式主要包括數據結構和演算法。在程式中指定用到哪些數據以及這些數據的類型和數據的組織形式就是數據結構。對操作的描述即為演算法。

2、演算法的特性:有窮性;確定性;有零個或多個輸入、輸出;有效性。

3、表示演算法的方法:自然語言表示;程式流程圖表示;N-S流程圖表示;偽程式碼表示;電腦語言表示。

4、程式流程圖的基本結構:順序結構;選擇結構;循環結構(當型循環、直到型循環)。

習題:

1、什麼是演算法?試從日常生活中找三個列子,描述他們的演算法。

答:演算法是對一個程式涉及到的操作的描述。eg1:機場過安檢:安檢口驗證登機人資訊是否一致,驗證通過將自己的行李放到行李安檢區,此時安檢人員檢查登機者,都通過允許進入候機廳。

2、什麼叫結構化的演算法?為什麼要提倡結構化的演算法?

答:由順序結構,選擇結構,循環結構構成的演算法即為結構化的演算法。結構化的演算法不存在無規律的轉向,只在本基本結構內才允許存在分支和向前或向後的跳轉。不會出現死循環,使演算法的品質得到保證和提高,所以,要提倡結構化的演算法。

3、試述3種基本結構的特點,請另外設計一種基本結構。

答:順序結構可以保證程式碼從上到下一個總的編寫邏輯結構。選擇結構能夠靈活的進行分支判斷,增強程式碼的健壯性。循環結構有效提高簡單重複率高程式的運行效率。 do{語句} while(條件);

4、

5、

6、

7、

8、用自頂向下,逐步細化的方法進行以下演算法的設計:

(1)輸出1900~2000年中是閏年的年份,符合下面兩個條件之一的年份是閏年:①能被4整除但不能被100整除 ②能被100整除且能被400整除

 1 #include <stdio.h>   2   3 int checkYear(int year){   4     if(year%100==0 && year%400==0)   5         return year;   6     else if(year%4==0 && year%100!=0)   7         return year;   8     return 0;   9 }  10  11 int main () {  12     //printf("%d",checkYear(2000));  13     int i,result;  14     for(i=1900 ;i<2001 ;i++){  15         result=checkYear(i);  16         if(result==0)  17             continue;  18         else  19             printf("%dn",result);  20     }  21 }

(2)求ax2+bx+c=0的根,分別考慮d=b2-4ac大於0、等於0和小於0這三種情況。

(3)輸入10個數,輸出其中最大的一個數。

第三章 最簡單的C程式設計—–順序程式設計

讀書筆記:

1、常量的分類:

  1. 整形常量:即常見的整數
  2. 實型常量:十進位小數形式和指數形式。指數的表達形式舉例:12.34*103 –>12.34e3 0.14E-25—->0.14*10-25
  3. 字元常量:普通字元範圍在Ascii表中、轉義字元即有特殊含義的字元:常以作為開始符號
  4. 字元串常量:用雙引號括起來的字元串,嚴格區分單引號,單引號只能表示單字元
  5. 符號常量:宏定義、#define 系列

2、變數必須先定義再使用

3、常變數用const'進行命名 eg:const float a=3.14 與符號常量#define a 3.14 的區別是:符號常量是預編譯指令,在預編譯時進行字元替換,預編譯完成後,符號常量就不存在了。常變數是佔用存儲單元,有值的,只是不可變更。

4、標識符的命名標準:只能由字母數字下劃線三種組成。數字不能作為變數名的開始。

5、數據類型:vc6.0下的變數

不同類型的數據在記憶體中佔用的存儲單元長度是不同的。使用sizeoif()函數測量類型或者變數的長度的運算符。

常見數據類型長度:short 2個位元組16位。long 4個位元組32位 。int 4個位元組32位 。一個指針 4位。

6、字元變數的輸出:當輸出值大於128時,減去128輸出對應的ASCII碼的字元。

習題:

第四章選擇結構程式設計:

讀書筆記:

習題:

1、什麼是算數運算?什麼是關係運算?什麼是邏輯運算?

答:算數運算就是數字與數字之間的加減乘除等基本算數運算。關係運算為 > 、< 、>= 、<= 、==之間的關係運算。邏輯運算為以與或非進行排列組後以後的邏輯運算。

2、C語言中如何表示「真」和「假」?系統如何判斷一個量的「真」和「假」?

答:C語言中用非零表示真,用0表示假;也可用bool類型的true和false 進行真假的表示,依賴於c的編譯器是否支援bool類型數據。在判斷一個量是否為「真」時,以0代表「假」,以非0代表「真」

3、寫出下面各邏輯表達式的值。設a=3,b=4,c=5: 1. a+b>c && b==c 2. a || b+c && b-c 3. !(a>b)&&!c || 1 4. !(x=a)&&(y=b)&&0 5. !(a+b)+c-1&&b+c/2

答:如下:

  1. 0因為a+b=7是大於c的,這個式子得1,b==c是不成立的,得0.1&&0得0。
  2. 因為&&的優先順序高於||所以,a的得值為1,||後面的那個式子不管是多少都不會影響整個式子的結果了,所以結果為1;
  3. 結果為1.原因跟上面一樣。
  4. x=a的值為1,只有當a=0時,賦值表達式的結果才為0.其他狀態都為1.所以!(a>b)為0.整個式子是由&&組成的,結果就為0了。
  5. !(a+b)+c-1=0+5-1=4!=0,所以結果為1.b+c/2 =4+5/2=6!=0,根據整數整除是向下取整的原則,所以式子結果也為1。1&&1的結果為1.

4、有三個整數a,b,c由鍵盤輸入,輸出其中最大的數:

 1 #include<stdio.h>   2 //查找輸入值的最大值   3 int findMax(int a,int b,int c){   4     if(a>b){   5         if(a>c){   6             return a;   7         }else   8             return c;   9     }else if(b>c)  10         return b;  11     else  12         return c;  13 }  14  15 void main(){  16  17     int a,b,c;//定義三個變數 a,b,c  18     printf("請輸入三個整數,並以逗號隔開!!!n");  19     scanf("%d,%d,%d",&a,&b,&c);  20     int result=findMax(a,b,c);  21     printf("最大的數為:%dn",result);  22 }

5、從鍵盤輸入一個小於1000的正數,輸出它的平方根(如平方根不是整數,則輸出其整數部分)。要求在輸入數據後檢查是否為小於1000的正數,若不是則要求重新輸入。

 1 #include<stdio.h>   2 #include<math.h>//平方根調用math類庫中的sqrt方法   3   4 void main(){   5   6     int a;   7     printf("請輸一個小於1000的正數!!!n");   8     scanf("%d",&a);   9     if(a<1000 && a>0){  10         int result=sqrt(a);  11         printf("該數的平方根為%dn",result);  12     }else  13     {  14         printf("輸入錯誤,請重新輸一個小於1000的正數!!!n");  15         main();//輸出錯誤,繼續輸入。  16     }  17  18  19 }

6、有一個函數:

寫程式,輸入x的值,輸出y相應的值。

 1 #include <stdio.h>   2 #include <math.h>   3 int main()   4 {   5     int x, y;   6     printf("Please enter x: ");   7     scanf("%d", &x);   8     if (x < 1)   9         y = x;  10     else if (x >= 1 && x <10)  11         y = 2 * x - 1;  12     else  13         y = 3 * x - 11;  14     printf("y = %dn", y);  15     return 0;  16 }

8、習題 4.8 給出一百分製成績,要求輸出成績等級『A』、『B』、『C』、『D』、『E』。90分以上為『A』,80~89分為『B』,70~79分為『C』,60~69分為『D』,60分以下為』E『。

 1 #include <stdio.h>   2   3 int main()   4 {   5     int score, g;   6     scanf("%d", &score);   7     while (score < 0 || score > 100){   8         printf("Error! Retry!n");   9         scanf("%d", &score);  10     }  11     g = score / 10; //成績除以10的商進行判斷  12     if (g >= 9)  13         printf("Grade is A!n");  14     switch(g){  15     case 0:  16     case 1:  17     case 2:  18     case 3:  19     case 4:  20     case 5: printf("Grade is E!n"); break;//成績為60以下都會執行到這裡  21     case 6: printf("Grade is D!n"); break;  22     case 7: printf("Grade is C!n"); break;  23     case 8: printf("Grade is B!n"); break;  24     }  25     return 0;  26 }

9、給一個不多於5位的正整數,要求:1. 求出它是幾位數;2. 分別輸出每一位數字;3. 按逆序輸出各位數字,例如原數為321,應輸出123。

 1 #include <stdio.h>   2   3 //計算數字的位數   4 int calcSize(int x){   5     int count=1;//cout定義為數字的位數,初始值為0   6     while(x>10){   7         x=x/10;   8         count++;   9     }  10     return count;  11 }  12  13 //判斷數字是否合法  14 bool isLeagl(int x){  15     bool flag=false;  16     if(x<0)  17         return flag;  18     if(calcSize(x)>5)  19         return flag;  20     flag=true;  21     return flag;  22 }  23  24  25 //按位輸出每一位數字(從個位開始輸出)  26 void printNumOneByOne(int x){  27     int temp;  28     int xx;  29     printf("按位輸出每一位數字(從個位開始輸出):");  30     while(x>0){  31         temp=x;  32         temp=temp%10;  33         printf("%d,",temp);  34         x=x/10;  35     }  36     printf("n");  37 }  38  39  40 //逆序輸出該數字  41 void reverseNum(int x){  42     int y;  43     for(y=0;x!=0;x=x/10 ){  44         y=y*10+x%10;  45     }  46     printf("%dn",y);  47  48 }  49 int main()  50 {  51     int x;  52     puts("請輸入一位不多於5位的正整數!!!");  53     scanf("%d",&x);  54     if(isLeagl(x)==false){  55         puts("輸入錯誤,請重新輸入一位不多於5位的正整數!!!");  56         return 0;  57     }  58     int s=calcSize(x);  59     printf("該數位數為:%dn",s);  60     printNumOneByOne(x);  61     printf("逆序後的該數字:");  62     reverseNum(x);  63 }