C語言程式設計:現代方法(第2版)第三章全部習題答案

来源:https://www.cnblogs.com/windrages/archive/2018/06/02/9113861.html
-Advertisement-
Play Games

前言 本人在通過《C語言程式設計:現代方法(第2版)》自學C語言時,發現國內並沒有該書完整的課後習題答案,所以就想把自己在學習過程中所做出的答案分享出來,以供大家參考。這些答案是本人自己解答,並參考GitHub上相關的分享和Chegg.com相關資料。因為並沒有權威的答案來源,所以可能會存在錯誤的地 ...


前言

本人在通過《C語言程式設計:現代方法(第2版)》自學C語言時,發現國內並沒有該書完整的課後習題答案,所以就想把自己在學習過程中所做出的答案分享出來,以供大家參考。這些答案是本人自己解答,並參考GitHub上相關的分享和Chegg.com相關資料。因為並沒有權威的答案來源,所以可能會存在錯誤的地方,如有錯誤還希望大家能夠幫助指出。

第三章練習題和編程題答案

練習題

3.1節

1.下麵的printf函數調用產生的輸出分別是什麼?

(a)  printf("6d,%4d", 86, 1040);

(b) printf("%12.5e", 30.253);

(c) printf("%.4f", 83.162);

(d) printf("%-6.2g", .0000009979);

答:

(a) ┗━┛┗━┛┗━┛┗━┛86, 1040                   “%6d”表示右對齊、最小6個欄位寬,數字86只占了2個欄位寬,所以前面用4個空格(┗━┛)補齊。同理“%4d”也是右對齊、最小4個欄位寬,數字1040正好為4個欄位寬,所有沒有空格。
(b) 3.02530e+001                                             %12.5e”表示右對齊、最小12個欄位寬,同時小數點後顯示5位數字,因為.0253不足5位,所以小數部分末尾會添加零占位。
(c) 83.1620                                                       %.4f”表示小數點後顯示4位,因為.162不足4位,所以小數部分末尾會添加零占位。
(d) 1e-006                                                        %-6.2g”表示左對齊、最小6個欄位寬,.2表示可以顯示最大2個(去掉小數點後)有效數字。之所以顯示1e是因為數字9979只能顯示99這兩個有效數字,所有後面的7會四捨五入向前進位,這樣實際要顯示的 數字就從.0000009979變成了.0000010000,所以結果顯示為1e,如果將.2變為.3的話就會顯示為9.98e-007。在%f%e當中,如果需要捨棄小數點後部分數字,同樣會使用這種四捨五入的顯示方式。

 

2.編寫printf函數調用,以下列格式顯示float型變數x:

(a) 指數表示形式,欄位寬度8,左對齊,小數點後保留1位數字。

(b) 指數表示形式,欄位寬度10,右對齊,小數點後保留6位數字。

(c) 定點十進位表示形式,欄位寬度8,左對齊,小數點後保留3位數字。

(d) 定點十進位表示形式,欄位寬度6,右對齊,小數點後無數字。

答:

(a)  printf("%-8.1e", x);

(b)  printf("%10.6e", x);

(c)  printf("%-8.3f", x);

(d)  printf("6.0f", x);

 

3.2節

3.說明下列每對scanf格式串是否等價?如果不等價,請指出它們的差異。

(a) "%d"與" %d"

(b)"%d-%d-%d"與"%d -%d -%d"

(c)"f"與"%f "

(d)"%f,%f"與"%f, %f"

答:

(a) 等價,因為scanf在開始尋找數的時候會忽略掉空格,所以即使在前面添加任意個空格均不影響結果。

(b)不等價,雖然在開始是是scanf會忽略掉空格,但是開始讀入之後並不會忽略。所以前者%d-%d-%d中不能在“-”之間加入任何空格,否則會異常退出,而後者%d -%d -%d則可以在“-”之間加入或不加入任意個空格

(c)不等價,第二個格式串中以空格作為結尾,雖然不影響錄入%f中的數字,但是第二個格式串並不會在回車或空格後結束,它會一直等到讀入第一個非空字元時才會結束。而第一個%f會在遇到空格或回車之類的符號後就結束運行。

(d)不等價,與(b)理由相同,第一個格式串中逗號直接不能加入任何空格,而第二個則可以加入0個或n個空格。

 

4.假設scanf函數調用的格式如下:

scanf("%d%f%d", &i, &x, &j);

如果用戶錄入

10.3 5 6

調用執行後,變數i、x和j的值分別是多少?(假設變數i和變數j都是int型,而變數x是float型。)

答:

最後的結果是i=10,x=0.3,j=5,

首先因為i是int型所以scanf會讀入“10.”,但因為後面出現了小數點(“.”),而i中不能有小數點,所以只將10存入一種並將小數點“放回”去。

之後x是float型,但讀入.3後因為遇到了非數字空格,所以scanf會將.3存入x中,而將空格“放回”。

最後的變數j在讀取時會像跳過空白字元,直到遇到非空白字元5,而5之後又是非數字的空格,所以只會將5存入變數j中。

而因為此時這個scanf函數結束了,所以最後的數字6會被保留到下一次scanf函數調用時再讀取。

 

 5.假設scanf函數調用的是格式如下:

scanf("%f%d%f", &x, &i, &y);

如果用戶輸入

12.3 45.6 789

調用執行後,變數x、i和y的值分別是多少?(假設變數x和變數y都是float型,變數i是int型。)

答:

最後的結果是x=12.3,i=45,y=0.6

與上一道題類似,首先因為x是float型,所以scanf會讀入“12.3”,之後遇到空格,此時結束讀入並將12.3存入x中。

之後因為i是int型不能有小數點,所以scanf在讀入“45.6”時只會將45存入i中,並將“.6”放回。

y是float型可以有小數點,所以scanf會將上次沒有讀入的“.6”存入y中,併在遇到空格時結束這次讀入。

因為此時scanf函數已經執行完畢,所以最後的789會在下次scanf執行時才被讀入。

 

6.指出如何修改3.2節中的addfrac.c程式,使用戶可以輸入在字元/的前後都有空格的分數

答:

 1 /*只需要在原程式中的/前後各加入一個空格即可 */
 2 /* Adds two fractions */
 3 
 4 #include <stdio.h>
 5 
 6 int main(void)
 7 {
 8     int num1, denom1, num2, denom2, result_num, result_denom;
 9 
10     printf("Enter first fraction: ");
11     scanf("%d / %d", &num1, &denom1);     /*至於要在原程式中的/前後各加入一個空格即可 */ 
12 
13     printf("Enter second fraction: ");
14     scanf("%d / %d", &num2, &denom2);
15 
16     result_num = num1 * denom2 + num2 * denom1;
17     result_denom = denom1 * denom2;
18     printf("The sum is %d/%d\n", result_num, result_denom);
19 
20     return 0;
21 }

 

編程題

1.編寫一個程式,以月/日/年(即mm/dd/yy)的格式接受用戶錄入的日期信息,並以年月日(即yy/mm/dd)的格式將其顯示出來:

Enter a date (mm/dd/yyyy): 2/17/2011

You entered the date 20110217

答:

 1 /*月日年轉成年月日*/
 2 #include <stdio.h>
 3 
 4 int main(void)
 5 {
 6     int day = 0, month = 0, year = 0;
 7 
 8     printf("Enter a date (mm/dd/yyyy): ");
 9     scanf("%d/%d/%d", &month, &day, &year);
10 
11     printf("You entered the date %.2d%.2d%d", year, month, day);   /*月和日用%.2d顯示,保證月份和日期會以兩位數形式顯示 */
12 
13     return 0;
14 }

 

2.編程一個程式,對於用戶錄入的產品信息進行格式化,程式會話應類似下麵這樣:

Enter item number: 583
Enter unit price: 13.5
Enter purchase date (mm/dd/yyyy): 10/24/2010
Item  Unit       Purchase
    price     Date
583   $   13.50    10/24/2010

其中,產品編號和日期項採用左對齊方式,單位價格採用右對齊方式,允許最大取值為9999.99的美元。提示:各個列使用製表符控制。

答:

 1 /*輸入信息並顯示,產品編號和日期左對齊,價格右對齊*/
 2 
 3 #include <stdio.h>
 4 
 5 int main(void)
 6 {
 7     /* 聲明item number變數item_num,unit price變數price,日期變數day、month和year */
 8     int item_num = 0, day = 0, month = 0, year = 0;
 9     /* unit price包含小數點,所以其變數應為float型 */
10     float price = 1.0f;
11 
12     /* 用戶輸入數據,程式錄入對應變數中 */
13     printf("Enter item number: ");
14     scanf("%d", &item_num);
15     printf("Enter unit price: ");
16     scanf("%f", &price);
17     printf("Enter purchase date (mm/dd/yyyy): ");
18     scanf("%d/%d/%d", &month, &day, &year);
19 
20     printf("Item\t\tUnit\t\tPurchase\n");   /* 第一行顯示,中間通過兩個製表符\t分隔 */
21     printf("\t\tprice\t\tDate\n");          /* 第二行顯示,中間通過兩個製表符\t分隔 */
22     /* 編號和日期是左對齊,所以要在前面加上負號。價格採用%7.2f顯示,是因為最大價格是9999.99共七位,在小於七位時用空格占位,.2則是保證小數點後只顯示2位數字。 */
23     /* 日期中的.2是為了讓最少以兩位數形式顯示,年份為四位數,所以採用.4保證最少顯示四位數 */
24     printf("%-d\t\t$%7.2f\t%-.2d/%-.2d/%-.4d\n", item_num, price, month, day, year);
25 
26     return 0;
27 }

 

3.圖書用國際標準書號(ISBN)進行標識。2007年1月1日之後分配的ISBN包含13位數字(舊的ISBN使用10位數字),分為5組,如978-0-393-97950-3.第一組(GS1)目前為978或979.第二組(組標識)指明語言或者原出版社國(如0和1用於英語的國家)。第三組(出版商編號)便是出版商(393是W.W.Norton出版社的編號)。第四組(產品編號)是由出版商分配的用於識別具體哪一本書的(97950)。ISBN的末尾是一個校驗數字,用於驗證前面數字的準確性。編寫一個程式來分解用戶錄入的ISBN信息:

Enter ISBN: 978-0-393-97950-3
GS1 prefix: 978
Group identifier: 0
Publish code: 393
Item number: 97950
Check digit: 3

註意:每組中數字的個數是可變的,不能認為每組的長度都與示例一樣。用實際的ISBN值(通常放在書的封底和版權頁上)測試你編寫的程式。

答:

 1 /*ISBN分解*/
 2 
 3 #include <stdio.h>
 4 
 5 int main(void)
 6 {
 7     /* 第一組數字的變數定義為gs1,第二組數字的變數定義為group_id,第三組數字的變數定義為pub_code,第四組數字的變數定義為item_num,校驗位定義為check_d */
 8     int gs1 = 0, group_id = 0, pub_code = 0, item_num = 0, check_d = 0;
 9 
10     printf("Enter ISBN: ");
11     /* 每組數字看成一個整體,通過-來識別每組數字,並將其存入對應的變數中,這樣每組數字個數即使發生變化也能正確的顯示出來 */
12     scanf("%d-%d-%d-%d-%d", &gs1, &group_id, &pub_code, &item_num, &check_d);
13 
14     /* 直接將每組變數分別顯示出來即可 */
15     printf("GS1 prefix: %d\nGroup identifier: %d\nPublish code: %d\nItem number: %d\nCheck digit: %d\n", gs1, group_id, pub_code, item_num, check_d);
16 
17     return 0;
18 }

 

4.編寫一個程式,提示用戶以[(xxx)xxx-xxx]的格式輸入電話號碼,並以xxx.xxx.xxxx的格式顯示該號碼:

Enter phone number [(xxx) xxx-xxxx]: (404) 817-6900
You entered: 404.817.6900

答:

 1 /*輸入電話號碼(xxx) xxx-xxxx並轉換格式顯示xxx.xxx.xxxx */
 2 
 3 #include <stdio.h>
 4 
 5 int main(void)
 6 {
 7     /* 將電話號碼拆分成3組,分別定義成num1、num2和num3 */
 8     int num1 = 0, num2 = 0, num3 = 0;
 9 
10     printf("Enter phone number [(xxx) xxx-xxxx]: ");
11     /* 根據提示的格式分別將3組數字存入變數中 */
12     scanf("(%d) %d-%d", &num1, &num2, &num3);
13 
14     printf("You entered: %d.%d.%d\n", num1, num2, num3);
15 
16     return 0;
17 }

 

5.編寫一個程式,要求用戶(按任意次序)輸入從1到16的所有整數,然後用4×4矩陣的形式將它們顯示出來,再計算每行、每列和每條對角線上的和:

Enter the numbers from 1 to 16 in any order: 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1
16    3      2    13
5    10    11      8
9      6      7    12
4    15    14      1


Row sums: 34 34 34 34
Column sums: 34 34 34 34
Diagonal sums: 34 34

如果行、列和對角線上的和都一樣(如本例所示),則稱這些數組成一個幻方(magic square)。這裡給出的幻方出現於藝術家和數學家Albrecht Dürer在1514年的一幅畫中。(註意,矩陣的最後一行中間的兩個數給出了該畫的創作年代。)

答:

 1 /*輸入1到16所有整數,以4*4顯示,並計算每行、每列、和對角線的和 */
 2 
 3 #include <stdio.h>
 4 
 5 int main(void)
 6 {
 7     /* 定義十六個數字的變數,從num1到num16 */
 8     int num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0, num6 = 0, num7 = 0, num8 = 0;
 9     /* 拆成兩行定義是因為寫在一行里實在是太長了,不方便閱讀 */
10     int num9 = 0, num10 = 0, num11 = 0, num12 = 0, num13 = 0, num14 = 0, num15 = 0, num16 = 0;
11     /* 定義4×4矩陣的每行和的變數,從row1到row4 */
12     int row1 = 0, row2 = 0, row3 = 0, row4 = 0;
13     /* 定義4×4矩陣的每列和的變數,從col1到col4 */
14     int col1 = 0, col2 = 0, col3 = 0, col4 = 0;
15     /* 定義兩個對角線和的變數dia1和dia2 */
16     int dia1 = 0, dia2 = 0;
17 
18     printf("Enter the numbers from 1 to 16 in any order: ");
19     /* 將十六個數字分別存入到16個變數里 */
20     scanf("%d%d%d%d%d%d%d%d", &num1, &num2, &num3, &num4, &num5, &num6, &num7, &num8);
21     /* 同樣因為太長了,所以拆成兩行寫 */
22     scanf("%d%d%d%d%d%d%d%d", &num9, &num10, &num11, &num12, &num13, &num14, &num15, &num16);
23 
24     /* 顯示出矩陣,根據題目示例,每個數字應該保證兩個字元寬,右對齊。通過製表符來使每行和每列對齊 */
25     printf("%2d\t%2d\t%2d\t%2d\t\n%2d\t%2d\t%2d\t%2d\t\n", num1, num2, num3, num4, num5, num6, num7, num8);
26     printf("%2d\t%2d\t%2d\t%2d\t\n%2d\t%2d\t%2d\t%2d\t\n\n\n", num9, num10, num11, num12, num13, num14, num15, num16);
27 
28     /* 計算每行的和 */
29     row1 = num1 + num2 + num3 + num4;
30     row2 = num5 + num6 + num7 + num8;
31     row3 = num9 + num10 + num11 + num12;
32     row4 = num13 + num14 + num15 + num16;
33 
34     /* 計算每列的和 */
35     col1 = num1 + num5 + num9 + num13;
36     col2 = num2 + num6 + num10 + num14;
37     col3 = num3 + num7 + num11 + num15;
38     col4 = num4 + num8 + num12 + num16;
39 
40     /* 計算兩個對角線的和 */
41     dia1 = num1 + num6 + num11 + num16;
42     dia2 = num4 + num7 + num10 + num13;
43 
44     /* 顯示結果 */
45     printf("Row sums: %d  %d  %d  %d  \nColumn sums: %d  %d  %d  %d  \n", row1, row2, row3, row4, col1, col2, col3, col4);
46     printf("Diagonal sums: %d  %d  \n", dia1, dia2);
47 
48     return 0;
49 }

 

6.修改3.2節的addfrac.c程式,使用戶可以同時輸入兩個分數,中間用加好隔開:

Enter two fractions separated by a plus sign: 5/6+3/4
The sum is: 38/24

答:

 1 /*同時輸入兩個分數並計算*/
 2 
 3 #include <stdio.h>
 4 
 5 int main(void)
 6 {
 7     /* 定義兩個分數的變數,分子分別是x1和x2,分母是y1和y2 */
 8     int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
 9     /* 計算出的分子用result_num變數表示,分母用result_denom變數表示 */
10     int result_num = 0, result_denom = 0;
11 
12     printf("Enter two fractions separated by a plus sign: ");
13     /* 讀取兩個分數 */
14     scanf("%d/%d+%d/%d", &x1, &y1, &x2, &y2);
15 
16     /* 計算兩個分數的和 */
17     result_num = x1 * y2 + x2 * y1;
18     result_denom = y1 * y2;
19     printf("The sum is: %d/%d\n", result_num, result_denom);
20 
21     return 0;
22 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.String對象不可變 String對象不可變,只讀。任何指向它的引用都不能改變它的內容。改變String內容意味著創建了一個新的String對象。 String 對象作為方法參數時都會複製一份引用(不是複製對象),而引用指向的對象一直呆在單一物理位置上。 2.重載操作符和StringBuild ...
  • 可以通過修改pom文件來添加一個javax.servlet-api-3.1.0.jar的jar包,找到你的pom.xml文件添加代碼如下: <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</art ...
  • 本文分析Dubbo服務暴露的實現原理,併進行詳細的代碼跟蹤與解析。 ...
  • 這是我自己複習總結的,分享給大家,有不足和需要修改的地方,望大家指正,謝謝。 https://pan.baidu.com/s/14GrfC34CmjpnlND8MiT0YA ...
  • python中字元串對象提供了很多方法來操作字元串,功能相當豐富。 這些方法的使用說明見 "官方文檔:string methods" ,本文對它們進行詳細解釋,各位以後可將本文當作手冊。 這裡沒有模式匹配(正則)相關的功能。python中要使用模式匹配相關的方法操作字元串,需要 導入re模塊。關於正 ...
  • 1. python在讀取文件時,read(),readline()和readlines()有什麼區別? 舉例說明: 2、使用一行代碼輸出[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 3、編寫一個遞歸函數 ...
  • 假設現在已經打包了一個文件(1233444333),要將這個文件傳輸給另一方: 其中的上傳數據模塊和下載模塊可以單獨進行分裝後使用。 結果: ...
  • 時間序列深度學習:狀態 LSTM 模型預測太陽黑子 本文翻譯自《Time Series Deep Learning: Forecasting Sunspots With Keras Stateful Lstm In R》 "原文鏈接" 由於數據科學機器學習和深度學習的發展,時間序列預測在預測準確性方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...