以最簡單的方式實現幾個C語言課程設計的常見題目,適合大一或者剛學習C語言的同學學習參考。使用Code::Blocks編譯器創建的純C項目,將其中的源碼粘貼進其他編譯器或C++項目也可直接運行。因為部分同學沒有學習過數據結構,所以盡量使用傳統的數組進行存儲,規避沒有學習過的知識點,但鼓勵大家自己改進。為了使得程序更加簡單方便閱讀,基本上沒有進行對用戶輸入的容錯,可以自己添加。
Code::Blocks安裝和使用 https://blog.csdn.net/qq_42283621/article/details/124055391?spm=1001.2014.3001.5501
項目源碼會在文章末尾給出
為了簡單,我們用一個數組data來存儲 通訊錄記錄,保存和加載的文件為“addressbook.txt”,函數均使用無參數的函數,且不考慮姓名重復問題。
共6個功能
退出系統
錄入 enter
通訊錄 為空 則提示"通訊錄空";提醒用戶輸入“姓名”和“號碼”,存入通訊錄;
刪除 del
提醒用戶輸入“姓名”,然后在通訊錄中刪除該條記錄,輸出“刪除成功”或“<姓名>不存在,刪除失敗”
顯示 list
輸出通訊錄中的所有記錄
查詢 search
提醒用戶輸入“姓名”,輸出該姓名的通訊錄信息 或者 “<姓名>不存在,查詢失敗”
保存 save
將 通訊錄 中的所有記錄寫入到 文件addressbook.txt 中,輸出“保存成功”
加載 load
將 文件addressbook.txt 中的內容加載到通訊錄中,輸出“加載成功”
首先,我們需要定義一個結構體來存儲一條記錄,存儲的內容包括 姓名 和 電話號,姓名長度是不定的,電話號是11位數(但字符數組會自動在最后添加一個’\0’作為結束標志,所以至少需要12位,當然你也可以定義一個更大的)。測試程序時使用的 姓名 用英語不要用中文,因為中文可能需要其他處理才能正常顯示
然后,定義一個數組來存儲所有的通訊錄信息,我們可以定義一個比較大的這樣可以存儲更多的信息。因為數組是固定大小的,所以我們并不知道到底里邊存入了多少條信息,可以定義一個int cnt表示通訊錄中的信息條數,初始時cnt為0表示沒有信息,當cnt與你定義的數組大小一樣大時,說明已經存滿了。
struct Item {char name[20];char phone[20]; };struct Item data[100]; int cnt = 0;然后,我們要不斷獲取用戶下一步的操作,也就是我們應該將 獲取用戶下一步操作 放入到循環中。當用戶下一步操作是“退出系統”時,退出循環,是其他時分別調用不同的函數進行相應的處理。每次循環的開始,提示用戶輸入什么數字是什么意思。
#include <stdio.h> #include <stdlib.h>struct Item {char name[20];char phone[20]; };struct Item data[100]; int cnt = 0;void enter() {}void del() {}void list() {}void search() {}void save() {}void load() {}int main() {int cmd;while(1){printf("\n\n\n請輸入下一步操作:\n");printf("\t\t0 退出系統\n");printf("\t\t1 錄入記錄\n");printf("\t\t2 刪除記錄\n");printf("\t\t3 顯示記錄\n");printf("\t\t4 查詢記錄\n");printf("\t\t5 保存記錄\n");printf("\t\t6 加載記錄\n");scanf("%d", &cmd);if (cmd == 0){printf("退出系統成功");break;}switch(cmd){case 1: enter(); break;case 2: del(); break;case 3: list(); break;case 4: search(); break;case 5: save(); break;case 6: load(); break;}}return 0; }del
刪除首先需要比較輸入的“姓名”和通訊錄中存儲的“姓名”是否是一樣的,使用int strcmp(const char *s1, const char *s2),s1和s2相同則返回0,其在頭文件#include <string.h>中。還要用到char *strcpy(char* dest, const char *src)將一個字符數組的內容復制到另一個數組,同樣在string.h中。
然后是刪除的過程,我們可以采用將要刪除的記錄后面的信息向前覆蓋的方式,下面是圖解。我們有5條記錄,cnt為5,分別位于位置0 1 2 3 4。刪除Tom,即位于3的Bob覆蓋位于2的Tom,位于4的Jack覆蓋位于3的Bob,然后將cnt-1成為4。在最后的圖上看來,Tom沒有了但Jack的信息有兩條,但是我們的cnt為4,即只有第0 1 2 3是有效的,位于4的Jack的信息在主觀上認為他被廢棄了即可。
到此為止,用到的無關文件的操作已經完成。
load和save
首先,我們先準備一個測試文件txt,使用txt文件是因為這是windows中最簡單的文件,一般是我們接觸程序操作文件的第一種文件類型。桌面上 右鍵->新建->文本文檔->重命名為addressbook,然后在其中寫入幾條測試文件。
然后,將這個文件復制到項目的根目錄里,我用的Code::Blocks,根目錄在main.cpp所在的路徑下,這樣我們可以直接使用文件名,不用在filename中寫出文件的完整路徑。
接下來,我們熟悉一下文件的相關操作:打開文件 讀文件 寫文件 關閉文件
1)打開關閉文件
? FILE *fopen(const char *filename, const char *mode)
? 參數1為文件名,參數2為模式,返回值不是NULL則證明打開成功了。我們用到的文件名為"addressbook.txt",模式在保存的是寫"w",在加載的時候讀"r"
? save中: FILE * fp; fp = fopen(“addressbook.txt”, “w”)
? load中:FILE * fp; fp = fopen(“addressbook.txt”, “r”)
?
? int fclose(FILE *stream)關閉文件
2)讀文件和寫文件
? C語言讀文件和寫文件的方法有很多,fread fwrite fgets fputs fscanf fprintf,這里我們使用fscanf和fprintf搭配,它和scanf和printf基本相同的用法,但在開始加一個文件的指針。
? int fscanf(FILE *stream, const char *format, …)
? int fprintf(FILE *stream, const char *format, …)
返回的int表示讀寫成功的個數,到這里你可能不太明白,你可以結合例子一起看。
我們定義的txt中數據的保存格式是一條記錄占一行,然后 姓名+空格+電話,所以讀的時候fscanf(fp, “%s %s”, data[cnt].name, data[cnt].phone),即將txt一行中的兩個字符串分別讀到.name和.phone中,如果這個函數返回的是2,說明我們讀成功了,cnt加一。如果不是2,說明我們讀失敗了,也就是說后面已經沒有數據了。
寫文件fprintf(fp, “%s %s\n”, data[i].name, data[i].phone);,即將.name和.phone中的數據按照格式"%s %s\n"寫入到文件中。
最后,我們來測試一下整個程序
查詢
保存,并查看文件中存的數據是否正確
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
北京到青島動車最快時間?最新的復興號高鐵G187北京南至青島北3小時40分d725次列車每天都有嗎?D725次列車是北京至青島北的空調動車組列車。這列火車每天都有。但目前停運,預計2022年11月初恢復正常運行。每天22: 42從北京站始發,途經大明湖、淄博、濰坊,次日6: 34到達青島北站。全程873公里,運行7小時52分鐘。d725次列車每天都有嗎?D725次列車每天發車。D725次列車從北京...
沈陽航空航天大學是什么學校?沈陽航空航天大學(SAU),簡稱“沈航”,是一所以航空航天為特色,以工科為主,包括工學、理學、文學、經濟學、管理學等學科的高等學府。是由教育部、航空工業集團公司和遼寧省、國防科工局和遼寧省共建,空軍依托培養預備役軍官的全國18所地方院校之一。學校創建于1952年,是原航空工業部下屬的六所本科航空院校之一。最初命名為沈陽航空工業學校,歷經東北第一工業學校、沈陽第一工業學校...
win7 directx12怎么安裝?可以安裝Directx12。網上有win10的Directx12提取安裝包。win7安裝沒有問題,但是安裝win7后還是會顯示Directx11?,F在如果想在win7上體驗Directx12,需要專門的打游戲的補丁和最新版本的顯卡驅動。目前聽說魔獸世界可以。然而,它并沒有。;這真的沒有意義。即使是win10也需要支持Directx12的軟件或游戲支持才能使用。...