1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          通訊錄管理系統的設計與實現

          來源:互聯網轉載 時間:2023-09-10 06:32:15

          以最簡單的方式實現幾個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個功能

        1. 退出系統

        2. 錄入 enter

          通訊錄 為空 則提示"通訊錄空";提醒用戶輸入“姓名”和“號碼”,存入通訊錄;

        3. 刪除 del

          提醒用戶輸入“姓名”,然后在通訊錄中刪除該條記錄,輸出“刪除成功”或“<姓名>不存在,刪除失敗”

        4. 顯示 list

          輸出通訊錄中的所有記錄

        5. 查詢 search

          提醒用戶輸入“姓名”,輸出該姓名的通訊錄信息 或者 “<姓名>不存在,查詢失敗”

        6. 保存 save

          將 通訊錄 中的所有記錄寫入到 文件addressbook.txt 中,輸出“保存成功”

        7. 加載 load

          將 文件addressbook.txt 中的內容加載到通訊錄中,輸出“加載成功”

        8. 總體框架

          首先,我們需要定義一個結構體來存儲一條記錄,存儲的內容包括 姓名 和 電話號,姓名長度是不定的,電話號是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; }

          函數實現

        9. 先寫enter和list,然后可以進行簡單的測試
        10. void enter() {if (cnt == 0)printf("通訊錄空\n");printf("輸入:姓名 電話\n");scanf("%s %s", data[cnt].name, data[cnt].phone);++cnt;//通訊錄數目+1 }void list() {printf("\t\t姓名\t\t電話\n");for (int i = 0; i < cnt; ++i){printf("\t\t%s\t\t%s\n", data[i].name, data[i].phone);} }
        11. 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的信息在主觀上認為他被廢棄了即可。

        12. void del() {char tName[20];printf("輸入:姓名\n");scanf("%s", tName);for (int i = 0; i < cnt; ++i){if (strcmp(tName, data[i].name) == 0){for (int j = i; j < cnt - 1; ++j){strcpy(data[j].name, data[j + 1].name);strcpy(data[j].phone, data[j + 1].phone);}printf ("刪除成功\n");--cnt;break;}else if (i == cnt - 1)printf ("%s不存在,刪除失敗\n", tName);} }
        13. search就是一個簡單的遍歷,用到的函數在del中都有
        14. void search() {char tName[20];printf("輸入:姓名\n");scanf("%s", tName);for (int i = 0; i < cnt; ++i){if (strcmp(tName, data[i].name) == 0){printf("\t\t姓名\t\t電話\n");printf("\t\t%s\t\t%s\n", data[i].name, data[i].phone);break;}else if (i == cnt - 1)printf ("%s不存在,查詢失敗\n", tName);} }

          到此為止,用到的無關文件的操作已經完成。

        15. 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"寫入到文件中。

        16. void save() {FILE *fp;if ((fp = fopen("addressbook.txt", "w")) != NULL){for (int i = 0; i < cnt; ++i)fprintf(fp, "%s %s\n", data[i].name, data[i].phone);fclose(fp);printf("保存成功\n");}else{printf("保存失敗\n");} }void load() {FILE *fp;if ((fp = fopen("addressbook.txt", "r")) != NULL){while (fscanf(fp, "%s %s", data[cnt].name, data[cnt].phone) == 2){++cnt;}fclose(fp);printf("加載成功\n");}else{printf("加載失敗\n");} }

          總體效果

          最后,我們來測試一下整個程序

        17. 加載 顯示
        18. 錄入 顯示
        19. 刪除 顯示
        20. 查詢

        21. 保存,并查看文件中存的數據是否正確

        22. 附錄

          #include <stdio.h> #include <stdlib.h> #include <string.h>struct Item {char name[20];char phone[20]; };struct Item data[100]; int cnt = 0;void enter() {if (cnt == 0)printf("通訊錄空\n");printf("輸入:姓名 電話\n");scanf("%s %s", data[cnt].name, data[cnt].phone);++cnt;//通訊錄數目+1 }void del() {char tName[20];printf("輸入:姓名\n");scanf("%s", tName);for (int i = 0; i < cnt; ++i){if (strcmp(tName, data[i].name) == 0){for (int j = i; j < cnt - 1; ++j){strcpy(data[j].name, data[j + 1].name);strcpy(data[j].phone, data[j + 1].phone);}printf ("刪除成功\n");--cnt;break;}else if (i == cnt - 1)printf ("%s不存在,刪除失敗\n", tName);} }void list() {printf("\t\t姓名\t\t電話\n");for (int i = 0; i < cnt; ++i){printf("\t\t%s\t\t%s\n", data[i].name, data[i].phone);} }void search() {char tName[20];printf("輸入:姓名\n");scanf("%s", tName);for (int i = 0; i < cnt; ++i){if (strcmp(tName, data[i].name) == 0){printf("\t\t姓名\t\t電話\n");printf("\t\t%s\t\t%s\n", data[i].name, data[i].phone);break;}else if (i == cnt - 1)printf ("%s不存在,查詢失敗\n", tName);} }void save() {FILE *fp;if ((fp = fopen("addressbook.txt", "w")) != NULL){for (int i = 0; i < cnt; ++i)fprintf(fp, "%s %s\n", data[i].name, data[i].phone);fclose(fp);printf("保存成功\n");}else{printf("保存失敗\n");} }void load() {FILE *fp;if ((fp = fopen("addressbook.txt", "r")) != NULL){while (fscanf(fp, "%s %s", data[cnt].name, data[cnt].phone) == 2){++cnt;}fclose(fp);printf("加載成功\n");}else{printf("加載失敗\n");} }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("退出系統成功\n");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; }

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          北京到青島動車最快時間?最新的復興號高鐵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的軟件或游戲支持才能使用。...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>