浙大版《C語言程序設計》第四版(何欽銘顏暉)第5章 函數 習題答案
你也可以上程序咖(
chengxuka.com),打開大學幕題板塊,不但有答案,講解,還可以在線答題。

一、選擇題
1.在 C 語言程序中,若對函數類型未加顯式說明,則函數的隱含類型為( )。
A. void
B. double
C. char
D. int
答:D
解析:在不返回結果的函數定義中,void 不能省略;否則,函數類型被默認定義為 int 。
2.以下正確的說法是( )。
A.實參與其對應的形參共同佔用一個存儲單元
B.實參與其對應的形參各佔用獨立的存儲單元
C.只有當實參與其對應的形參同名時才佔用一個共同的存儲單元
D.形參是虛擬的,不佔用內存單元
答:B
解析:按照 C 語言的規定,在參數傳遞過程中,將實參的值複製給形參。所以他們各自佔用獨立的存儲單元。
3.以下不正確的說法是( )。
A.實參可以是常量、變量或表達式
B.實參可以是任何類型
C.形參可以是常量、變量或表達式
D.形參應與對應的實參類型一致
答:B
解析:實參和形參一一對應,數量應相同,順序應一致。實參可以是常量、變量或表達式。
4.在函數調用 Fume(exp1, exp2+exp3, exp4*exp5) 中,實參的數量是( )。
A.3
B.4
C.5
D.語法錯誤
答:A
解析:參數使用逗號分割,所以題目中是3個參數。
5.下列程序的輸出結果是( )。
fun(int a, int b, int c){c = a * b;}int main(void){int c;fun(2, 3, c);printf("%dn", c);return 0;}
A.0
B.1
C.6
D.無法確定
答:D
解析:在 main() 中,變量 c 並沒有初始值,因為它是局部變量,在沒有初始化的時候,系統會分配隨機值。在調用函數時,這裡將數值 2,3,c 作為實參傳遞給形參 a,b,c。在函數中 c 的值為 a *b 是 6,但是不影響 main() 中變量 c 的值。main() 中的打印變量 c 的值,還是最初系統分配的那個隨機值。
6.以下程序的運行結果是( )。
int x = 5, y = 6;void incxy(){x++;y++;}int main(void){int x = 3;incxy();printf("%d,%dn", x, y);return 0;}
A.3,6
B.4,7
C.3,7
D.6,7
答:C
解析:
首先分析變量,第一行定義了兩個變量 x 和 y ,值分別是 5 和 6 。這是兩個全局變量。就是在所有的函數中都可以使用。然後是自定義函數 incxy() ,裡面就 2 行代碼,x++ 和 y++。然後是 main(),而實際上程序是從 mian() 函數開始執行,這裡先定義了一個變量,也叫 x ,初始值為 3,然後調用自定義函數 incxy(),執行函數後,x 和 y 分別子增 1,這裡的 x 和 y 也就是上面的全局變量,所以自定義函數執行結束後,全局變量 x 和 y 的值分別是 6 和 7 。自定義函數結束後,main() 繼續向下執行,打印 x 和 y 的值,那麼這個 x ,是哪個呢?根據 C 語言的規則,當一個函數中,局部變量和全局變量名相同的時候,那麼函數中操作的是局部變量,所以打印的是 main() 裡面定義的局部變量 x 的值為 3,而 y,在main() 沒有定義,那麼自然就是全局變量 y 值為 7。
二、填空題
1.下列程序的輸出結果為( )。
int funp(int m);int main(void){int n;for(n=1; n<10; n++)if(funp(n)==1)printf("%d#", n);return 0;}int funp( int m){int i;if(m==2||m==3)return 1;if(m<2|| m%2==0)return 0;for(i=3; i<m; i=i+2)if(m%i==0)return 0;return 1;}
答:2#3#5#7#
解析:
main() 中主要就是一個 for 循環,變量 n 的值從 1 累加到 10後,結束循環。
第一次循環 n 為 1,循環條件成立,執行循環體,循環裡是一個 if 語句,if 條件是一個函數調用 funp(),判斷函數的返回值是否為 1。將 n 的值為 1,作為參數,傳遞給自定義函數,形參 m 的值就是 1。該函數中,當 m 的值為 1 時第一個 if 語句條件不成立, 第二個 if語句條件成立,因為 m < 2,函數返回 0。回到 main() 的循環中,if 語句的條件就不成立了。然後 n++,n的值為 2。
第二次循環 n 為 2,循環條件成立,執行循環體,判斷 if 語句的條件,調用函數,傳入的實參的值為 2。那麼在自定義函數中 m 的值就是 2。第一個 if 語句條件成立,自定義函數返回值為 1。回到 main() 的循環中, if 語句的條件成立,打印 2#。然後 n++,n 的值為3。
第三次循環 n 為 3,循環條件成立,執行循環體,判斷 if 語句的條件,調用函數,傳入的實參的值為 3。那麼在自定義函數中 m 的值就是 3。第一個 if 語句條件成立,自定義函數返回值為 1。回到 main() 的循環中, if 語句的條件成立,打印 3#。然後 n++,n 的值為4。
第四次循環 n 為 4,循環條件成立,執行循環體,判斷 if 語句的條件,調用函數,傳入的實參的值為 4。那麼在自定義函數中 m 的值就是 4。第一個 if 語句條件不成立,第二個 if 語句條件成立,自定義函數返回值為 0。回到 main() 的循環中,if 語句的條件就不成立了。然後 n++,n的值為 5。
第五次循環 n 為 5,循環條件成立,執行循環體,判斷 if 語句的條件,調用函數,傳入的實參的值為 5。那麼在自定義函數中 m 的值就是 5。第一個 if 語句條件不成立,第二個 if 語句條件也不成立,進入 for 循環,整個循環結束也沒有返回值,那麼執行最後的return 1。回到 main() 的循環中, if 語句的條件成立,打印 5#。然後 n++,n 的值為6。
往下依次類推。。。
2.判斷正整數的各位數字是否按從小到大排列。輸入一批正整數(以零或負數為結束標誌),判斷每個數從高位到低位的各位數字是否按值從小到大排列。要求定義和調用函數 fun( m) 判斷 m 中各位數字是否按值從小是小到大排列,滿足條件返回 1 ,否則返回 0。請填空。
_________________;int main(void){int n;scanf("%d", &n);while (n > 0){if (_________________){printf("%d 中各位數字按從小到大排列n", n);}else{printf("%d 中各位數字沒有按從小到大排列n", n);}scanf("%d", &n);}return 0;}int fun(_________________){int cur_digit, old_digit = m % 10;while (m > 10){_________________;cur_digit = m % 10;if (cur_digit >= old_digit){return 0;}_________________;}return 1;}
答:
int fun(int m)
fun(n)
int m
m = m / 10
old_digit = cur_digit
解析:
因為函數的定義在下面,那首先需要函數聲明,所以第一行先聲明函數。在 main() 的 if 語句中調用函數。這個自定義函數是需要傳入參數的,所以第三個空是定義參數 m。自定義函數里的思路就是循環獲取數值的每個位上的數字,判斷是否從小到大排序。
3.輸出 Yes 或 No 。輸入字符 'y' ,或 'Y' ,則在屏幕上輸出字符串 "Yes. " ; 輸入其他字符,則在屏幕上輸出字符串 "No! " 。要求定義和調用函數 YesNo(ch) ,當 ch 為 'y' 或 'Y' 時輸出 "Yes. " ,當 ch 為其他字符時輸出 "No! " 。請填空。
void YesNo(_________________){switch (ch){case 'y':case 'Y':_________________default:_________________}}int main(void){char ch;printf("Please input a character: n");ch = getchar();_________________return 0;}
答:
char ch
printf("Yes."); break;
printf("No!");
YesNo(ch);
解析:
自定義函數,主要是用來判斷輸入的字符是否是 y 或者 Y 的。所以需要通過參數傳入,那麼在定義函數的時候需要形參,所以第一個空是定義參數。然後進行判斷字符是否是 y 或 Y。如果是打印 "Yes. ",其他的字符都打印 "No! ",那麼寫在 default 裡就可以了。最後在 main() 中調用該函數。
三、程序設計題
題目1:使用函數計算分段函數的值:輸入 x ,計算並輸出下列分段函數 f(x) 的值。要求定義和調用函數 sign(x) 實現該分段函數。試編寫相應程序。
$$
f(x)= begin{cases} 1 & (x gt 0) \ 0 & (1 = 0) \ -1 & (x lt 0) end{cases}
$$
答案代碼:
#include <stdio.h>int sign(int x){int f;if (x < 0){f = -1;}else if (x > 0){f = 1;}elsef = 0;return f;}int main(void){// 習題(5.3.1)/*使用函數計算分段函數的值:輸入 x ,計算並輸出下列分段函數 f(x) 的值。要求定義和調用函數 sign(x) 實現該分段函數。*/int x, y;printf("input x:");scanf("%d", &x);y = sign(x);printf("f(x) = %dn", y);return 0;}
運行結果:

題目2:使用函數求奇數和:輸入一批正整數(以零或負數為結束標誌),求其中的奇數和。要求定義和調用函數 even(n) 判斷數的奇偶性,當 n 為偶數時返回 1 ,否則返回 0。試編寫相應程序。
答案代碼:
#include <stdio.h>int even(int n){if (n % 2 == 0){return 1;}elsereturn 0;}int main(void){// 習題(5.3.2)/*使用函數求奇數和:輸入一批正整數(以零或負數為結束標誌),求其中的奇數和。要求定義和調用函數 even(n) 判斷數的奇偶性,當 n 為偶數時返回 1 ,否則返回 0。*/int n, sum = 0;printf("input n:n");while (n > 0){scanf("%d", &n);if (even(n) == 0) //調用函數返回值為0時,奇數和。當even(n)==1時,偶數和。{sum += n;}}printf("sum= %dn", sum);return 0;}
運行結果:

題目3:使用函數計算兩點間的距離:給定平面任意兩點座標 (x1, y1) 和 (x2, y2) , 求這兩點之間的距離 (保留 2 位小數) 。要求定義和調用函數 dist(x1, y1, x2, y2)計算兩點間的距離。試編寫相應程序。
答案代碼:
#include <stdio.h>#include <math.h>double dist(double x1, double y1, double x2, double y2){double s = 0;s = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));return s;}int main(void){// 習題(5.3.3)/*使用函數計算兩點間的距離:給定平面任意兩點座標 (x1, y1) 和 (x2, y2) ,求這兩點之間的距離 (保留 2 位小數) 。要求定義和調用函數 dist(x1, y1, x2, y2)計算兩點間的距離。*/double x1, y1, x2, y2, dis;printf("input x1,y1,x2,y2:");scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);dis = dist(x1, y1, x2, y2);printf("兩點之間的距離是: %.2lfn", dis);return 0;}
運行結果:

題目4:利用函數計算素數個數並求和:輸入兩個正整數 m 和 n ( 1≤m, n≤500), 統計並輸出 m 和 n 之間的素數的個數以及這些素數的和。要求定義並調用函數 prime(m) 判斷 m 是否為素數。試編寫相應程序。
答案代碼:
#include <stdio.h>#include <math.h>//判斷m是否為素數int prime(int m){int j;// 質數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。if (m == 1){return 0;}// 判斷除 1 外的自然數for (j = 2; j <= sqrt(m); j++){if (m % j == 0){return 0;}}return 1;}int main(void){// 習題(5.5.4)/*利用函數計算素數個數並求和:輸入兩個正整數 m 和 n ( 1≤m, n≤500),統計並輸出 m 和 n 之間的素數的個數以及這些素數的和。要求定義並調用函數 prime(m) 判斷 m 是否為素數。*/int m = 1, n = 100, i, sum = 0, count = 0;printf("input m,n(m>=1,n<=500):");scanf("%d%d", &m, &n);for (i = m; i <= n; i++) //將i的值傳到自定義函數里{if (prime(i) == 1){sum += i;count++;}}printf("%d~%d 之間的素數個數為 %d,和為 %dn", m, n, count, sum);return 0;}
運行結果:

題目5:使用函數統計指定數字的個數:讀入一個整數,統計並輸出該數中 “2” 的個數。要求定義並調用函數 countdigit( number, digit),它的功能是統計整數 number 中數字 digit 的個數。例如,countdigit( 12 292, 2) 的返回值是 3 。試編寫相應程序。
答案代碼:
#include <stdio.h>int countdigit(int number, int digit){int count = 0;while (number > 0){if (number % 10 == 2){count++;}number = number / 10;}return count;}int main(void){// 習題(5.3.5)/*使用函數統計指定數字的個數:讀入一個整數,統計並輸出該數中 “2”的個數。要求定義並調用函數 countdigit( number, digit),它的功能是統計整數 number 中數字 digit 的個數。例如,countdigit( 12 292, 2) 的返回值是 3 。*/int number, digit = 2, count;printf("input number:");scanf("%d", &number);count = countdigit(number, digit);printf("%d 中的 %d 的個數為 %dn", number, digit, count);return 0;}
運行結果:

題目6:使用函數輸出水仙花數:輸入兩個正格數 m 和 n (1≤m, n≤1000) 輸出 m~n 之間的所有滿足各位數字的立方和等於它本身的數。要求定義並調用函數 is(number) 判斷 number 的各位數字之立方和是否等於它本身。試編寫相應程序。
答案代碼:
#include <stdio.h>#include <math.h>int is(int number){int x, sum, y;y = number;sum = 0;do{x = y % 10;sum += pow(x, 3);y = y / 10;} while (y > 0);if (sum == number){return sum;}elsereturn 0;}int main(void){// 習題(5.5.6)/*使用函數輸出水仙花數:輸入兩個正格數 m 和 n (1≤m, n≤1000) 輸出 m~n 之間的所有滿足各位數字的立方和等於它本身的數。要求定義並調用函數 is(number) 判斷 number 的各位數字之立方和是否等於它本身。*/int m, n, i, result = 0;printf("input m,n(m>=1,n<=1000):");scanf("%d%d", &m, &n);for (i = m; i <= n; i++){result = is(i);if (result >= m && result <= n){printf("%dn", result);}}return 0;}
運行結果:

題目7:使用函數求餘弦函數的近似值:輸入精度口,用下列公式求 cosx 的近似值,精確到最後項的絕對值小於 e 。 要求定義和調用函數 funcos(e,x) 求餘弦函數的近似值。試編寫相應程序。
$$
cosx = frac{x^0}{0!}-frac{x^2}{2!}+frac{x^4}{4!}-frac{x^6}{6!}+...
$$
答案代碼:
#include <stdio.h>#include <math.h>double fact(int n){int i;double f = 1;for (i = 1; i <= n; i++){f *= i;}return f;}double fumcos(double e, double x){int flag = 1, i = 0;double cosx = 0, item = 1; // item 必須為1,才能進while循環 。cosx為0,則直接從第一項開始累加while (fabs(item) >= e){item = flag * pow(x, i) / fact(i);cosx += item;i += 2;flag = -flag;}cosx += item;return cosx;}int main(void){// 習題(5.5.7)/*使用函數求餘弦函數的近似值:輸入精度口,用下列公式求 cosx 的近似值,精確到最後項的絕對值小於 e 。要求定義和調用函數 funcos(e,x) 求餘弦函數的近似值。*/double e, x, sum;printf("input e,x:");scanf("%lf%lf", &e, &x);sum = fumcos(e, x);printf("cosx = %lfn", sum);return 0;}
運行結果:

題目8:輸入一個正整數 n ,輸出 n 行空心的數字金字塔。要求定義和調用曬數hollow_pyramid(n) 輸出 n 行空心的數字金字塔。當 n=5 時,5 行空心的數字金字塔如下所示。
12 233 44555555555
答案代碼:
#include <stdio.h>void hollow_pyramid(int n){int i, j;for (i = 1; i < n; i++) //共n-1行{for (j = 1; j <= n - i; j++) //上三角空格{printf(" ");}printf("%d", i); //左斜下數字,只打印一個數字,不用在內循環裡if (i == 1){printf("n");continue;}for (j = 1; j <= 2 * (i - 1) - 1; j++) //中間三角空格 .i=2時,j=1;i=3時,j=3{printf(" ");}printf("%d", i); //右斜下數字printf("n");}for (j = 1; j <= 2 * n - 1; j++) //底層數字{printf("%d", n);}printf("n");}int main(void){// 習題(5.3.8)/*輸入一個正整數 n ,輸出 n 行空心的數字金字塔。要求定義和調用曬數hollow_pyramid(n) 輸出 n 行空心的數字金字塔。*/int n;printf("input n:");scanf("%d", &n);hollow_pyramid(n);return 0;}
運行結果:

版权声明:浙大版《C語言程序設計》第四版(何欽銘顏暉)第5章 函數 習題答案内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系 删除。
本文链接:https://www.fcdong.com/f/a177979236194453f45414453d213f4f.html