1. 前言
不知道有多少同學正在自學C/C++, 無論你是一個在校學生, 還是已經是上班族. 如果你想從事或即將從事軟件開發這個行業, C/C++都是一個幾乎必須要接觸的系統級程序開發語言. 雖然現在有Rust更安全的系統級編程語言作為C/C++的替代, 但作為入門, C應該還是要好好學的. C最早由B語言改進而來. 不出意外你應該已經想到了C/UNIX都是貝爾實驗室的里奇和湯普遜所開發. 一個C影響了后來一系列開發語言, 一個UNIX影響了后來一系列操作系統. K&R C就是經典C, 那時C還沒有標準化, 還沒有ANSI標準, 所以K&R就是早期的C標準.
確切的說 K&R C?指的是由 C 語言創始人?Dennis Ritchie?和?Brian Kernighan?在其經典著作《The C Programming Language》(1978年第一版)中描述的早期 C 語言標準。也被稱為 "經典 C" 或 "傳統 C". Brian Kernighan 就是 K&R C中的K, Hello World程序就是他首先使用的.?當然這本書有第2版, 引入了一些ANSI的C標準. 這本書的練習題除部分少量的過時外, 大部分編程題還是很值得自己實踐練習的.我這有兩道練習題, 自己寫了一下, 雖然不難, 但如果是初學者, 還是可以自己寫完, 再看看別人的, 多參考學習.
寫這些編程題有個感覺, 就像造車, 發動機要自己造, 變速箱要自己造, 底盤也要自己造, 外觀要自己設計, 一切細節都要詳細了解, 沒有封裝, 除了少量標準庫函數可用, 一切要自己動手寫. 就算是標準庫中的函數, 你也完全根據它的功能, 自己去實現, 自己來封裝. 那些大師早期哪有現成的庫, 都是他們自己寫的. 所以要多動手去寫, 去實現自己的版本.
第 1 章內容不多, 盡量用本章介紹的內容來完成作業.
2. 練習 1 - 12 習題及代碼
下面是兩個練習題:
練習1-12? 編寫一個程序, 以每行一個單詞的形式打印其輸入.
下面是代碼, 因為很短, 所以沒有加注釋, 另外輸入中如果有多個空白符 (制表, 空格), 會忽略:
#include <stdio.h>int main(void)
{int ch;while ((ch = getchar()) != EOF) {if (ch != ' ' && ch != '\t' && ch != '\n') {putchar(ch);} else {if (ch == '\n') { putchar(ch);} else {while ((ch = getchar()) == ' ' || ch == '\t') {continue;}putchar('\n');putchar(ch);}}}return 0;
運行結果:
3. 練習 1 - 13?習題及代碼
下面這道題在我的另幾篇文章已實現垂直方向的直方圖, 有興趣的同學可以看另幾篇文章.
練習1-13? 編寫一個程序, 打印輸入中單詞的直方圖. 水平方向的直方圖比較容易繪制, 垂直方向的直方圖則要困難些.
下面是代碼 (代碼有一些問題,有興趣的同學可以改進):
#include <stdio.h>
#define MAX 20 /*統計最長為20個字符的單詞*/
#define MAXNUM 26 /*某個長度最多統計25個*/void initwords(int *pw, int len);
void countwords(int *pw, int len);
void printhtgm(int *pw, int len);
void putpatterns(char ch, int n, int width);
void putspaces(int n);
void putline(int n);
void printXnum(int n);
int main(void)
{int words[MAX + 1]; /*統計最長20個字符的單詞*/initwords(words, MAX + 1); /*初始化單詞數量數組*/countwords(words, MAX + 1); /*統計輸入各長度?司數量*/printhtgm(words, MAX + 1); /*打印水平直方圖*/return 0;
}/*初始化單詞數量數組*/
void initwords(int *pw, int len)
{int i;for (i = 1; i < len; i++) { pw[i] = 0; }
}/*統計各長度單詞數量*/
void countwords(int *pw, int len)
{int ch, wordlen, wordin;wordlen = wordin = 0;while ((ch = getchar()) != '#') {if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {if (wordin == 0) { wordin = 1; }if (wordlen < len - 1) { wordlen++; }} else if (ch == ' ' || ch == '\t' || ch == '\n') {if (wordin == 1) {wordin = 0;if (pw[wordlen] < MAXNUM - 1) { pw[wordlen]++; }wordlen = 0;}}}if (pw[wordlen] < MAXNUM - 1) { pw[wordlen]++; }
}/*打印水平直方圖*/
void printhtgm(int *pw, int len)
{int i;putline(2);putspaces(5);putchar('Y');putline(1);for (i = len - 1; i > 0; i--) {putspaces(3);printf("%2d", i);putchar('|');putpatterns('*', pw[i], 2);putline(1);}putspaces(5);putchar('+');putpatterns('-', MAXNUM * 2, 1);putchar('>');putspaces(1);putchar('X'); putline(1);printXnum(20);putline(2);
}/*打印X軸數字*/
void printXnum(int n)
{if (n < 1 || n > MAXNUM) { return; }int i;putspaces(6);for (i = 1; i <= n; i++) { if (i >= 10) { putchar(' '); }printf("%2d", i); }
}/*打印直方圖案*/
void putpatterns(char ch, int n, int width)
{if (n < 1 || n > MAXNUM * 2) { return; }int i;for (i = 0; i < n; i++) {putspaces(width - 1); putchar(ch); }
}/*打印Y軸縮進*/
void putspaces(int n)
{int i;for (i = 0; i < n; i++) {putchar(' ');}
}/*空格打印*/
void putline(int n)
{int i;for (i = 0; i < n; i++) { putchar('\n'); }
}
運行結果:
下面是輸入一些測試單詞
下面是輸入歌曲 << The day you went away? >> 的歌詞結果:
4. 結語
喜歡就點贊收藏, 您的支持是我創作的動力.