C Primer Plus 第6版 編程練習——第13章(下)

8.編寫一個程序,以一個字符和任意文件名作為命令行參數。如果字符后面沒有參數,該程序讀取標
淮輸入;否則,程序依次打開每個文件并報告每個文件中該字符出現的次數。文件名和字符本身也要一同報告。程序應包含錯誤檢查,以確定參數數量是否正確和是否能打開文件。如果無法打開文件,程序應報告這一情況,然后繼續處理下一個文件。

int main(int argc, char* argv[])
{system("chcp 65001");if (argc < 2){fprintf(stderr, "用法: %s <文件1> [文件2] [文件3] ...\n", argv[0]);}else{if (argc == 2){char buf[1024];printf("請輸入字符串:\n");scanf_s("%s", buf, 1024);int count = 0;for (int i = 0;i < strlen(buf);i++){if(buf[i] == argv[1][0])count++;}printf("字符%c出現的次數為%d\n", argv[1][0], count);}else{for (int i = 2;i < argc;i++){FILE* fp = NULL;fopen_s(&fp, argv[i], "rb");if(fp == NULL)printf("文件%s打開失敗\n", argv[i]);else{int count = 0;char buf[1024];while (fgets(buf, sizeof(buf), fp) != NULL){for (int i = 0;i < strlen(buf);i++){if (buf[i] == argv[1][0])count++;}}printf("字符%c再文件%s中出現的次數為%d\n", argv[1][0], argv[i], count);fclose(fp);}}}}return 0;
}

9.修改程序清單 13.3 中的程序,從1開始,根據加入列表的順序為每個單詞編號。當程序下次運行時,確保新的單詞編號接著上次的編號開始。

#define MAX 41
int main(void)
{FILE *fp;char words[MAX];int lineNo = 0;fopen_s(&fp, "wordy", "r");if (fp){while (fgets(words, MAX, fp) != NULL){ lineNo++;}fclose(fp);}fopen_s(&fp, "wordy", "a+");if (fp == NULL)fprintf(stdout, "Can't open \"wordy\" file.\n");else{puts("Enter words to add to the file; press the #");puts("Key at the beginning of a line to terminate.");while ((fscanf_s(stdin, "%40s", words, 41) == 1) && (words[0] != '#'))fprintf(fp, "%d %s\n", ++lineNo, words);rewind(fp);while (fscanf_s(fp, "%d %s", &lineNo, words, 41) == 2)printf("%d %s\n", lineNo, words);puts("Done.");fclose(fp);}
}

10.編寫一個程序打開一個文本文件,通過交互方式獲得文件名。通過一個循環,提示用戶輸入一個文件位置。然后該程序打印從該位置開始到下一個換行符之前的內容。用戶輸入負數或非數值字符可以結束輸入循環。

int main()
{system("chcp 65001");puts("請輸入文件名:");char filename[256];FILE *fp;scanf_s("%s", filename, 256);fopen_s(&fp, filename, "r");if (fp == NULL){puts("無法打開文件!");}else{puts("請輸入要打印的位置(負數或非數字退出):");int pos;while (scanf_s("%d", &pos) == 1 && pos >= 0){fseek(fp, pos, SEEK_SET);puts(fgets(filename, 256, fp));puts("請輸入要打印的位置(負數或非數字退出):");}}fclose(fp);return 0;
}

11.編寫一個程序,接受兩個命令行參數。第1個參數是一個字符串,第2個參數是一個文件名。然后該程序查找該文件,打印文件中包含該字符串的所有行。因為該任務是面向行而不是面向字符的,所以要使用fgets()而不是getc()。使用標準C庫函數strstr()(11.5.7節簡要介紹過)在每一行中查找指定字符串。假設文件中的所有行都不超過255個字符。

int main(int argc, char* argv[])
{system("chcp 65001");if (argc < 2){fprintf(stderr, "用法: %s <字符串> <文件名>\n", argv[0]);}else{FILE *fp;fopen_s(&fp, argv[2], "rb");if (fp){ char buf[1024];while (fgets(buf, sizeof(buf), fp)){if (strstr(buf, argv[1])){printf("%s\n", buf);}}fclose(fp);}elsefprintf(stderr, "無法打開文件 %s\n", argv[2]);}return 0;
}

12.創建一個文本文件,內含20行,每行30個整數。這些整數都在0~9之間,用空格分開。該文件是用數字表示一張圖片,0~9表示逐漸增加的灰度。編寫一個程序,把文件中的內容讀入一個20X30的int數組中。一種把這些數字轉換為圖片的粗略方法是:該程序使用數組中的值初始化一個20X31的字符數組,用值0對應空格字符,1對應點字符,以此類推。數字越大表示字得所占的空間越大。例如,用#表示9。每行的最后一個字符(第31個)是空字符,這樣該數組包含了20個字符串。最后,程序顯示最終的圖片(即,打印所有的字符串),并將給果存儲在文本文件中。例如,下面是開始的數據:
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 5 2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 1 9 8 5 4 5 2 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 0 4 5 2 0 0 0 0 0 0 0 0
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 4 5 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 1 9 8 5 0 0 0 4 5 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 1 9 8 5 0 0 0 0 4 5 2 0 0 0 0 0
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
9 9 9 9 0 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 3 9 9 9 9 9 9 9 9
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 2 2 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 3 3 0 0 0 0 0 0 5 8 9 9 8 5 0 5 6 1 1 1 1 6 5 0 0 0
0 0 0 0 4 4 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 5 5 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
根據以上描述選擇特定的輸出字符,最終輸入如下:
# ? ? ? ? *%##%*'
# ? ? ? *%##%**'
*%.#%*~*'
# ? ? ? *%##%* ~*'
# ? ? ? ? *%##%* ?~*'
*%.#%* ? ~*'
*%.#%* ? ?~*'
*************%##%*************
%%%%%%%%%%%%*%##%*%%%%%%%%%%%%
#### ################:########
%%%%%%%%%%%%*%##%*%%%%%%%%%%%%
*************%##%*************
*%##%*
*%##%* ? ?==
'' ? ? ?*%##%* ?*= ?=*
:: ? ? ?*%##%* *=....=*
~~ ? ? ?*%##%* ?*= ?=*
** ? ? ?*%##%* ? ?==
*%##%*
*%##%*

int main(int argc, char* argv[])
{const char imgChar[] = { ' ', '.', '\'', ':', '~', '*', '=', '-', '%', '#'};char arr[20][31] = { 0 };FILE* fp;fopen_s(&fp, "img.txt", "rb");if(fp == NULL)printf("open file error!");else{char ch;int row = 0;int col = 0;while ((ch = getc(fp)) != EOF){if (ch >= '0' && ch <= '9'){arr[row][col++] = ch;}else if (ch == '\n'){row++;col = 0;}}fclose(fp);fopen_s(&fp, "imgout.txt", "wb+");for (int i = 0; i < 20; i++){for (int j = 0; j < 30; j++){arr[i][j] = imgChar[arr[i][j] - '0'];printf("%c", arr[i][j]);if (fp){fputc(arr[i][j], fp);}}printf("\n");if(fp){fputc('\n', fp);}}if(fp)fclose(fp);}return 0;
}

13.用變長數組(VLA)代替標準數組,完成編程練習12。

int main(int argc, char* argv[])
{const char imgChar[] = { ' ', '.', '\'', ':', '~', '*', '=', '-', '%', '#'};char **arr;FILE* fp;fopen_s(&fp, "img.txt", "rb");if(fp == NULL)printf("open file error!");else{int total_rows = 0;int max_cols = 0;char buf[1024];while (fgets(buf, 1024, fp)){total_rows++;int cols = strlen(buf) / 2;if (cols > max_cols)max_cols = cols;}rewind(fp);arr = (char**)malloc(total_rows * sizeof(char*));for (int i = 0; i < total_rows; i++){arr[i] = (char*)malloc(max_cols * sizeof(char));}char ch;int row = 0;int col = 0;while ((ch = getc(fp)) != EOF){if (ch >= '0' && ch <= '9'){arr[row][col++] = ch;}else if (ch == '\n'){row++;col = 0;}}fclose(fp);fopen_s(&fp, "imgout.txt", "wb+");for (int i = 0; i < total_rows; i++){for (int j = 0; j < max_cols; j++){arr[i][j] = imgChar[arr[i][j] - '0'];printf("%c", arr[i][j]);if (fp){fputc(arr[i][j], fp);}}printf("\n");if(fp){fputc('\n', fp);}}for (int i = 0; i < total_rows; i++){free(arr[i]);}free(arr);if(fp)fclose(fp);}return 0;
}

14.數字圖像,尤其是從字宙飛船發回的數字圖像,可能會包含一些失真。為編程練習12添加消除失真的函數。該函數把每個值與它上下左右相鄰的值作比較,如果該值與其周圍相鄰值的差都大于1,則用所有相鄰值的平均值(四舍五入為整數)代替該值。注意,與邊界上的點相鄰的點少于個,所以做特殊處理。

void remove_distortion(char** array, int rows, int cols) {// 創建臨時數組保存原始值int** temp = (int**)malloc(rows * sizeof(int*));for (int i = 0; i < rows; i++) {temp[i] = (int*)malloc(cols * sizeof(int));for (int j = 0; j < cols; j++) {temp[i][j] = array[i][j];}}// 遍歷所有點(包括邊界)for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {int current = temp[i][j];int neighbor_count = 0;   // 實際相鄰點數量int neighbor_sum = 0;     // 相鄰點值總和int all_diff_gt1 = 1;     // 假設所有差值>1// 檢查上鄰居if (i > 0) {int up = temp[i - 1][j];neighbor_sum += up;neighbor_count++;if (abs(current - up) <= 1) all_diff_gt1 = 0;}// 檢查下鄰居if (i < rows - 1) {int down = temp[i + 1][j];neighbor_sum += down;neighbor_count++;if (abs(current - down) <= 1) all_diff_gt1 = 0;}// 檢查左鄰居if (j > 0) {int left = temp[i][j - 1];neighbor_sum += left;neighbor_count++;if (abs(current - left) <= 1) all_diff_gt1 = 0;}// 檢查右鄰居if (j < cols - 1) {int right = temp[i][j + 1];neighbor_sum += right;neighbor_count++;if (abs(current - right) <= 1) all_diff_gt1 = 0;}// 如果存在相鄰點且所有差值>1,則替換當前值if (neighbor_count > 0 && all_diff_gt1) {// 計算平均值(四舍五入)double avg = (double)neighbor_sum / neighbor_count;array[i][j] = (int)round(avg);}}}// 釋放臨時數組內存for (int i = 0; i < rows; i++) {free(temp[i]);}free(temp);
}
int main(int argc, char* argv[])
{const char imgChar[] = { ' ', '.', '\'', ':', '~', '*', '=', '-', '%', '#'};char **arr;FILE* fp;fopen_s(&fp, "img.txt", "rb");if(fp == NULL)printf("open file error!");else{int total_rows = 0;int max_cols = 0;char buf[1024];while (fgets(buf, 1024, fp)){total_rows++;int cols = strlen(buf) / 2;if (cols > max_cols)max_cols = cols;}rewind(fp);arr = (char**)malloc(total_rows * sizeof(char*));for (int i = 0; i < total_rows; i++){arr[i] = (char*)malloc(max_cols * sizeof(char));}char ch;int row = 0;int col = 0;while ((ch = getc(fp)) != EOF){if (ch >= '0' && ch <= '9'){arr[row][col++] = ch;}else if (ch == '\n'){row++;col = 0;}}fclose(fp);remove_distortion(arr, total_rows, max_cols);fopen_s(&fp, "imgout.txt", "wb+");for (int i = 0; i < total_rows; i++){for (int j = 0; j < max_cols; j++){arr[i][j] = imgChar[arr[i][j] - '0'];printf("%c", arr[i][j]);if (fp){fputc(arr[i][j], fp);}}printf("\n");if(fp){fputc('\n', fp);}}if(fp)fclose(fp);}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90910.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90910.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

王樹森推薦系統公開課

github&#xff1a;https://github.com/wangshusen/RecommenderSystem b站&#xff1a;推薦系統公開課——8小時完整版&#xff0c;講解工業界真實的推薦系統_嗶哩嗶哩_bilibili 知乎上一個比較全面的筆記&#xff1a;https://zhuanlan.zhihu.com/p/678664853 我的筆記&…

<RT1176系列11>DMAMUX解讀

1、概述DMA&#xff08;直接內存訪問&#xff0c;DIrect Memory Access&#xff09;工作原理&#xff1a;DMA控制器直接在內存和外設之間傳輸數據&#xff0c;而不需要CPU的干預。優點&#xff1a;極大地提高了數據傳輸效率&#xff0c;釋放CPU資源。適合大批量數據傳輸&#x…

【MySQL】MySQL 緩存方案

一、MySQL主從同步 1.1 主從同步是什么 MySQL 主從同步是一種數據復制機制&#xff0c;通過該機制可以實現將主數據庫&#xff08;Master&#xff09;的 DDL&#xff08;數據定義語言&#xff09;和 DML&#xff08;數據操縱語言&#xff0c;如 update、insert、delete&#x…

base64.b64encode(f.read()).decode(‘utf-8‘)作用

base64.b64encode(f.read()).decode(utf-8) 的作用是將文件內容&#xff08;通常是二進制文件&#xff09;編碼為一個 UTF-8 格式的字符串。下面逐步解釋這個過程&#xff1a;f.read()&#xff1a;讀取文件 f 中的內容。這將返回文件的二進制數據。base64.b64encode()&#xff…

集合框架學習

目錄 集合體系結構 Collection的常用方法 Collection的遍歷方式 迭代器 增強for Lambda表達式 集合框架概述 集合體系結構 單列集合 Collection代表單列集合,每個元素(數據)只包含一個值 雙列集合 Map代表雙列集合,每個元素包含兩個值(鍵值對) Collection集合特點 Li…

經典算法題解析:從思路到實現,掌握核心編程思維

算法是編程的靈魂&#xff0c;也是面試中的重點考察內容。本文精選了幾道經典算法題&#xff0c;涵蓋字符串處理、鏈表操作、樹遍歷等常見場景&#xff0c;通過詳細解析幫助你理解算法設計思路與實現細節&#xff0c;提升解題能力。一、無重復字符的最長子串題目描述給定一個字…

【Unity游戲】——1.俄羅斯方塊

搭建場景 使用任意方塊、純色瓦片或者其他圖形作為背景&#xff0c;設置其大小與目標大小一致或者更大&#xff0c;設置左下角為場景頂點&#xff0c;并放置在&#xff08;0&#xff0c;0&#xff09;處。調整攝像機至合適位置。 制作游戲預制體 每個方塊預制體包含有4個小方…

【C++進階】---- 二叉搜索樹

1.二叉搜索樹的概念 ?叉搜索樹?稱?叉排序樹&#xff0c;它或者是?棵空樹&#xff0c;或者是具有以下性質的?叉樹: ? 若它的左?樹不為空&#xff0c;則左?樹上所有結點的值都?于等于根結點的值 ? 若它的右?樹不為空&#xff0c;則右?樹上所有結點的值都?于等于根結…

基于 OpenCV 與 sklearn 的數字識別:KNN 算法實踐

在計算機視覺領域&#xff0c;數字識別是一個經典問題&#xff0c;廣泛應用于郵政編碼識別、車牌識別等場景。本文將介紹如何使用 OpenCV 進行圖像處理&#xff0c;并結合 KNN&#xff08;K 近鄰&#xff09;算法實現數字識別&#xff0c;同時對比 OpenCV 內置 KNN 與 scikit-l…

利用徑向條形圖探索華盛頓的徒步旅行

利用徑向條形圖探索華盛頓的徒步旅行 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import pandas as pdfrom matplotlib.cm import ScalarMappable from matplotlib.lines import Line2D from mpl_toolkits.axes_grid1.inset_locator impor…

火狐瀏覽器中國特供版關閉,如何下載 Firefox 國際版?如何備份數據?

火狐瀏覽器中國特供版關閉&#xff0c;如何下載 Firefox 國際版&#xff1f;如何備份數據&#xff1f;各位火狐老用戶注意了&#xff01;7 月 27 日北京謀智火狐正式發布公告&#xff1a;2025 年 9 月 29 日 24:00 起&#xff0c;中國特供版賬戶服務將徹底關閉&#xff0c;所有…

C語言操作符詳解:從基礎到進階

在C語言中&#xff0c;操作符是構建表達式的基礎&#xff0c;掌握各類操作符的用法、優先級及特性&#xff0c;對寫出高效且正確的代碼至關重要。本文將系統梳理C語言操作符的核心知識點&#xff0c;包含實例代碼與詳細解析&#xff0c;助你徹底搞懂操作符。 1. 操作符的分類 C…

鴻蒙平臺運行Lua腳本

1. 目標 使用 rust 在移動端實現 Lua 腳本的運行。 2. 核心步驟 [Rust Host App]│├── [mLua VM] (通過 mlua 或 rlua 庫嵌入)│ ├── 獨立Lua狀態&#xff08;隔離執行&#xff09;│ ├── 受限標準庫&#xff08;禁用危險函數&#xff09;│ └── 內存/CPU限…

【Ubuntu】發展歷程

Ubuntu 是一個基于 Debian 的 Linux 發行版&#xff0c;由 Canonical 公司開發和維護。它以其易用性、穩定性和強大的社區支持而著稱。以下是 Ubuntu 從發布以來的主要版本和發展歷程&#xff1a;1. Ubuntu 4.10 "Warty Warthog" (2004)發布日期&#xff1a;2004年10…

k8s下springboot-admin 監控服務部署,客戶端接入

踩坑及解決以下問題 1、客戶端監控信息不顯示,需要暴露監控檢查接口路徑 2、服務端不顯示客戶端日志,需要啟用日志,并指定日志路徑 3、解決在k8s下,客戶端多實例注冊id相同,如2個實例只顯示一個 整體架構 springboot-admin 由服務端和客戶端組成 服務端負責 1、提供 We…

git刪除遠程分支和本地分支

1. git刪除遠程分支 git push origin --delete [branch_name]2. 刪除本地分支 2.1 git branch -d 會在刪除前檢查merge狀態&#xff08;其與上游分支或者與head&#xff09;。 git branch -d [branch_name] 2.2 git branch -D 直接刪除 git branch -D 是 git branch --delete…

Go 的時間包:理解單調時間與掛鐘時間

Go 的時間包&#xff1a;理解單調時間與掛鐘時間 &#x1f4c5; 引言 Go 語言自版本 1.9 起在 time.Time 中同時支持 “掛鐘時間&#xff08;wall?clock&#xff09;” 和 “單調時間&#xff08;monotonic clock&#xff09;”&#xff0c;用于分別滿足時間戳與時間間隔測量…

Android啟動時間優化大全

1 修改Android mksh默認的列長度 不修改這個參數&#xff0c;adb shell后&#xff0c;輸入超過80個字符&#xff0c;就不能看到完整的命令行。external/mksh/src/sh.h EXTERN mksh_ari_t x_cols E_INIT(80); EXTERN mksh_ari_t x_lins E_INIT(24);2 Kernel優化 2.1 內核驅動模塊…

matplotlib.pyplot: 底層原理簡析與進階技巧

文章目錄 1 底層實現原理 1.1 核心架構 1.1 渲染流程 2 基礎用法 2.1 基本繪圖 2.2 多子圖系統 2.3 高階用法 2.3.1 自定義Artist對象 2.3.2 高級動畫技術 2.3.3 事件處理系統 2.3.4 混合渲染技術 3 性能優化技巧 4 擴展模塊 5 總結 5.1 底層原理關鍵點 5.2 進階技巧 1 底層實現…

深入理解現代前端開發中的 <script type=“module“> 與構建工具實踐

引言&#xff1a;模塊化開發的演進在早期的前端開發中&#xff0c;JavaScript 缺乏原生的模塊化支持&#xff0c;開發者不得不依賴 IIFE&#xff08;立即調用函數表達式&#xff09;或第三方庫&#xff08;如 RequireJS&#xff09;來實現代碼組織。隨著 ES6&#xff08;ES2015…