《C程式設計語言》-第3章-習題

来源:http://www.cnblogs.com/GShell-Hzn/archive/2017/06/21/7061968.html
-Advertisement-
Play Games

由於第3章第一題網上有很多種非常優秀的解法,我就不貼出來了,大家不妨自己探索。 練習3-2 編寫一個函數escape(s,t),將字元串t複製到字元串s中,併在複製過程中將換行符、製表符等不可見字元分別轉換成'\n'、'\t'等相應的可見的轉義字元序列。要求使用switch語句。再編寫一個具有相反功 ...


  由於第3章第一題網上有很多種非常優秀的解法,我就不貼出來了,大家不妨自己探索。

  練習3-2 編寫一個函數escape(s,t),將字元串t複製到字元串s中,併在複製過程中將換行符、製表符等不可見字元分別轉換成'\n'、'\t'等相應的可見的轉義字元序列。要求使用switch語句。再編寫一個具有相反功能的函數,在複製過程將轉義字元序列轉換成實際字元。

先解釋一下兩個run函數和兩個escape分別實現上述兩個功能:

 1 #include <stdio.h>
 2 
 3 void escape(char s[], char t[]);
 4 void escape2(char s[], char t[]);
 5 
 6 void runEscape() {
 7     char testT[100] = "Hello,\ni am a\nGOOD\tBOY\t!!!!\n";
 8     char testS[100] = "Bye,\t littal Max!\n";
 9 
10     printf("T:%sS:%s", testT, testS);
11     escape(testS, testT);
12     printf("Now,");
13     printf("T:%sS:%s", testT, testS);
14 }
15 void runEscape2() {
16     char testS[100] = "Hello,\ni am a\nGOOD\tBOY\t!!!!\n";
17     char testT[100] = "Bye,\t littal Max!\n";
18 
19     printf("T:%sS:%s", testT, testS);
20     escape2(testS, testT);
21     printf("Now,");
22     printf("T:%sS:%s", testT, testS);
23 }
24 void escape(char s[], char t[]) {
25     int i = 0;
26     int j = 0;
27 
28     while (t[i] != '\0') {
29         switch (t[i])
30         {
31         case '\t':
32             s[j++] = '\\';s[j++] = 't';
33             break;
34         case '\n':
35             s[j++] = '\\'; s[j++] = 'n';
36             break;
37         default:
38             s[j++] = t[i];
39             break;
40         }
41 
42         i++;
43     }
44     s[j] = '\0';
45 }
46 void escape2(char s[], char t[]) {
47     int i = 0;
48     int j = 0;
49 
50     while (t[i] != '\0') {
51         if (t[i]=='\\')
52         {
53             switch (t[i+1])
54             {
55             case 't':
56                 s[j++] = '\t'; i++;
57                 break;
58             case 'n':
59                 s[j++] = '\n'; i++;
60                 break;
61             default:
62                 s[j++] = t[i];
63                 break;
64             }
65         }
66         else 
67             s[j++] = t[i];
68         i++;
69     }
70     s[j] = '\0';
71 }

  練習3-3 編寫函數expand(s1,s2),將字元串s1中類似於a-z一類的速記符號在字元串s2中擴展為等價多的完整列表abc...xyz。該函數可以處理大小寫字母和數字,並可以處理a-b-c、a-z0-9與-a-z等類似情況。作為前導和尾隨的-字元原樣排印。

 1 #include <stdio.h>
 2 
 3 void expand(char s1[], char s2[]);
 4 
 5 void runExpand() {
 6     char testS[100] = "0-9\na-z\nA-Z\na-b-c\na-a\na-Z\n";
 7     char testT[100] = "Bye, littal Tester!\n";
 8 
 9     printf("T:%sS:%s", testT, testS);
10     expand(testS, testT);
11     printf("\nNow,\n");
12     printf("T:%sS:%s", testT, testS);
13 }
14 
15 
16 void expand(char s1[], char s2[]) {
17     int i = 0;
18     int j = 0;
19 
20     while (s1[i] != '\0') {
21         if (s1[i] == '-'&&s1[i + 1] != '\0' && i > 0) {
22             char head = s1[i - 1];
23             char tail = s1[i + 1];
24 
25             if ('a' <= head&&head <= 'z'&&head < tail
26                 &&'a' <= tail&&tail <= 'z') {
27                 for (; head + 1 <= tail;) {
28                     s2[j++] = head + 1;
29                     head++;
30                 }
31             }
32             else if ('A' <= head&&head <= 'Z'&&head < tail
33                 &&'A' <= tail&&tail <= 'Z') {
34                 for (; head + 1 < tail;) {
35                     s2[j++] = head + 1;
36                     head++;
37                 }
38             }
39             else if ('0' <= head&&head <= '9'&&head < tail
40                 &&'0' <= tail&&tail <= '9') {
41                 for (; head + 1 < tail;) {
42                     s2[j++] = head + 1;
43                     head++;
44                 }
45             }
46             else
47                 s2[j++] = '-';
48         }
49         else
50             s2[j++] = s1[i];
51         
52         i++;
53     }
54 }

  練習3-4 在數的對二補碼表示中,我們編寫的itoa函數不能處理最大的負數,即n等於-2字長-1的情況。請解釋原因。修改該函數,使它在任何機器上運行時都能列印出正確的值。

解釋的原因我寫在註釋代碼裡面了~~

#include <stdio.h>

void reverse(char s[]);
void itoa(int n, char s[]);

void runItoa() {
    int testn = -1987654321;
    char test[100];

    itoa(testn, test);
    printf("test:%s", test);
}
/*不能正確處理最大負數的原因在於其二進位數形式為10000...如果
對其進行n=-n運算,n將變成0,這顯然是不符合我們期望的。因此我
們可以進行檢測,如果它是這個特殊的最大負數則將其變為無符號數。*/
    
void itoa(int n, char s[]) {
    int i, sign;
    sign = n;

    if (((unsigned)sign << 1) == 0)
        n = (unsigned)n;
    else if (sign < 0)
        n = -n;
    i = 0;
    do {
        s[i++] = n % 10 + '0';
    } while ((n /= 10) > 0);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}

void reverse(char s[]) {
    int i = 0;
    int j = 0;
    char c[1000];

    while (s[i] != '\0') 
        c[i] = s[i++];
    while (i > 0)
        s[j++] = c[--i];
    s[j] = '\0';
}

  練習3-5 編寫函數itob(n,s,b)將整數n轉換為以b為底的數。 並將轉換結果以字元的形式保存到字元串s中。

#include <stdio.h>


void reverse(char s[]);
void itob(int n, char s[], int);

void runItob() {
    int testn = 1987654321;
    char test[100];

    itob(testn, test, 10);
    printf("test:%s", test);
}

void itob(int n, char s[], int b) {
    int i = 0;

    do {
        s[i++] = n % b + '0';
    } while ((n /= b) > 0);
    s[i] = '\0';

    reverse(s);
}

練習3-6  修改itoa函數,使得該函數可以接收三個參數。第三個參數為最小欄位寬度。為了保證轉換後結果至少具有第三個參數指定的最小寬度,必要時在結果左邊填充一定的空格。

 1 #include <stdio.h>
 2 
 3 void reverse(char s[]);
 4 void itoa2(int n, char s[], int width);
 5 
 6 void runItoa2() {
 7     int testn = -1987654321;
 8     char test[100];
 9 
10     itoa2(testn, test,20);
11     printf("test:%send\n", test);
12 }
13 
14 void itoa2(int n, char s[], int width) {
15     int i, sign;
16     sign = n;
17 
18     if (((unsigned)sign << 1) == 0)
19         n = (unsigned)n;
20     else if (sign < 0)
21         n = -n;
22     i = 0;
23     do {
24         s[i++] = n % 10 + '0';
25     } while ((n /= 10) > 0);
26     if (sign < 0)
27         s[i++] = '-';
28     while (width - i > 0) {
29         s[i++] = ' ';
30     }
31     s[i] = '\0';
32     reverse(s);
33 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 代碼如下: 題目的意思是通過一個函數將列表的列表顯示在組織良好的表格中,每列右對齊 ''' apples Alice dogs oranges Bob catscherries Carol moose banana David goose ''' #輸出每一列右對齊 我想不應該是字元串最後一個對齊麽 ...
  • 從數塔頂層出發,每個結點可以選擇向左走或向右走,要求一直走到塔底,使得走過的路徑上的數值和最大。 #include <iostream> #include <cstdio> using namespace std; const int N = 100; // 下麵這個函數實現的是更新最大值,o賦值為 ...
  • 什麼是Maven? 安裝Maven環境: 下載地址:https://maven.apache.org/download.cgi Maven3.3+JDK1.7以上版本 下載windows版本 解壓到本地即可,對其中的文件夾進行講解 bin目錄:包含mvn的運行腳本 boot目錄:包含一個類載入器的框 ...
  • Lucene是apache軟體基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟體開發人員提供一個簡單易用的工具包. 粘貼這句話的意思 ...
  • #文件內容 lisilock = open("lock_info.txt", "r+",encoding="utf-8")lock_line = lock.readline()lock_list = lock_line.split(",")print(lock_list)y = lock_line. ...
  • 函數式編程1.簡化代碼,2,調用方便,修改方便3.調用參數,形參數,與位置參數。關鍵參數,位置參數只能發在關鍵參數之後4.預設參數5.參數組(*args) 元組參數6 接受字典 ( **kwargs) 當同時使用時必須放到參數的最後程式運行的從文件的上邊到下邊的運行局部變數 一個變數只在函數中生效。... ...
  • 工具:python2.7 相關包:traits-4.6.0-cp27-cp27m-win32.whl, VTK-7.1.1-cp27-cp27m-win32.whl, mayavi-4.5.0+vtk71-cp27-cp27m-win32.whl 下載地址:http://www.lfd.uci.ed ...
  • 模塊 1. 模塊的分類 模塊,又稱構件,是能夠單獨命名並獨立地完成一定功能的程式語句的集合(即程式代碼和數據結構的集合體)。 (1)自定義模塊 自己定義的一些可以獨立完成某個功能的一段程式語句,可以是一個文件,也可以是一個目錄。 (2)第三方模塊 是由其他人寫的一些程式語句,我們可以用它來實現自己的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...