通讯录管理系统(C语言版)
通訊錄管理系統(tǒng):
- 一:靜態(tài)版本
- 1.通訊錄前期準備
- (1)菜單函數(shù)的實現(xiàn)
- (2)菜單的功能
- (3)關(guān)于聯(lián)系人結(jié)構(gòu)體的創(chuàng)建
- (4)全局變量的定義
- 2.通訊錄的功能實現(xiàn)
- (1)初始化通訊錄
- (2)添加聯(lián)系人
- (3)刪除聯(lián)系人
- (4)查找聯(lián)系人
- (4)修改聯(lián)系人
- (5)顯示聯(lián)系人
- (6)對通訊錄中聯(lián)系人的信息進行排序
- 3. 代碼呈現(xiàn)(分文件呈現(xiàn))
- (1)test.c
- (2)contact.h
- (3)contact.c
- 二:動態(tài)版本
- 1.動態(tài)版本的一些改變
- (1)ccontact.h
- (2)contact.c
- 三:文件操作版本
- 1.文件版本的改變
- (1)主函數(shù)實現(xiàn)
- (2)初始化功能實現(xiàn)
- (3)保存通訊錄中的信息
- 2.代碼的呈現(xiàn)
- (1)test.c
- (2)contact.h
- (3)contact.c
一:靜態(tài)版本
1.通訊錄前期準備
(1)菜單函數(shù)的實現(xiàn)
1.先實現(xiàn)菜單函數(shù),能夠?qū)崿F(xiàn)與用戶的交互。
代碼如下:
(2)菜單的功能
1.用switch選擇語句來實現(xiàn)各自的功能
代碼如下:
(3)關(guān)于聯(lián)系人結(jié)構(gòu)體的創(chuàng)建
1.結(jié)構(gòu)體的創(chuàng)建
第一個結(jié)構(gòu)體PeoInfo是是用來存放人的信息,第二個結(jié)構(gòu)體Contact是通訊錄的信息,data是以第一個結(jié)構(gòu)體為類型的數(shù)組,count用來記錄當前通訊錄中實際的人數(shù)。
(4)全局變量的定義
1.利用宏定義處理
代碼如下:
2.通訊錄的功能實現(xiàn)
(1)初始化通訊錄
這里用到memset函數(shù),要包含含有string.h的頭文件。
1.代碼如下:
(2)添加聯(lián)系人
void AddContact(Contact* pc) {assert(pc);if (pc->count == MAX){printf("通訊錄已滿,無法添加\n");return;}printf("請輸入名字:>");scanf("%s", pc->data[pc->count].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pc->count].age));//注意:age要傳地址加上&printf("請輸入性別:>");scanf("%s", pc->data[pc->count].sex);printf("請輸入電話:>");scanf("%s", pc->data[pc->count].tele);printf("請輸入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("增加成功\n"); }測試結(jié)果如下:
(3)刪除聯(lián)系人
1,。先查找,再刪除。
void DelContact(Contact* pc) {char name[MAX_NAME] = { 0 };assert(pc);int i = 0;if (pc->count == 0){printf("通訊錄為空,沒有信息可以刪除\n");return ;}printf("請輸入要刪除的名字\n"); scanf("%s", name);//刪除//1.查找int pos=FindByName(pc, name);if (pos == -1){printf("要刪除的人不存在\n");return;}//2.刪除for (i = pos; i < pc->count-1; i++)//100-1{pc->data[i] = pc-> data[i + 1]; //后邊元素往前覆蓋} pc->count--;printf("刪除成功"); }測試結(jié)果如下:
(4)查找聯(lián)系人
這里需要構(gòu)建一個函數(shù)FindByName,如果找到名字,就返回i,否則返回-1。
static int FindByName(Contact* pc, char name[]) {assert(pc);int i = 0;for (i = 0; i < pc->count; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1; }void SearchContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請輸入要查找的名字\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}else//2打印{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}} }測試結(jié)構(gòu)如下:
(4)修改聯(lián)系人
void ModifyContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請輸入要修改的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");return ;}printf("要修改的人的信息已經(jīng)查找到,接下來開始修改");//2.修改printf("請輸入名字:>");scanf("%s", pc->data[pos].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pos].age));//注意:age要傳地址加上&printf("請輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請輸入地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n"); }測試結(jié)果如下:
(5)顯示聯(lián)系人
遍歷,打印每一個元素即可。
void ShowContact(Contact* pc) {assert(pc);int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);} }測試代碼如下:
(6)對通訊錄中聯(lián)系人的信息進行排序
與冒泡排序差不多,如果只對名字來排序,就是比較首字母的大小。
int cmp_peo_by_name(const void* e1, const void* e2) {return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);}void SortContact(Contact* pc) {assert(pc); //void qsort(void* base, size_t nitems, size_t size, int (*compar)(const void*, const void*))qsort(pc->data, pc->count,sizeof(PeoInfo), cmp_peo_by_name);printf("排序成功"); } 或者排序也可以為: void SortContact(Contact* pc) {if (pc->count == 0){printf("通訊錄中沒有聯(lián)系人");}else{for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");} }測試結(jié)果如下:
3. 代碼呈現(xiàn)(分文件呈現(xiàn))
(1)test.c
#define _CRT_SECURE_NO_WARNINGS #include "contact.h" void menu() {printf("*****************************************\n");printf("****** 1.add 2.del *********\n");printf("****** 3.search 4.modify *********\n");printf("****** 5.show 6.sort *********\n");printf("****** 0.exit *********\n");printf("*****************************************\n"); } int main() {int input = 0; Contact con;//通訊錄//初始化通訊錄InitContact(&con);//do{menu();printf("請選擇:>");scanf("%d", &input);switch (input){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:SearchContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);break;default:printf("選擇錯誤");break;}} while (input);return 0; }(2)contact.h
#pragma once #include <stdio.h> #include <stdlib.h> #include "contact.h" #include <assert.h> #include<string.h> #define MAX 100 //總?cè)藬?shù)的大小 #define MAX_NAME 20 // 名字的長度 #define MAX_SEX 10 //性別的長度 #define MAX_TELE 12 //電話號碼的長度 #define MAX_DDR 30 //地址的長度//類型的聲明 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_DDR]; }PeoInfo;//通訊錄 typedef struct Contact {PeoInfo data[100];//存放人的信息int count;//記錄當前通訊錄中的實際人的個數(shù) } Contact;//初始化通訊錄 void InitContact(Contact* pc);//增加聯(lián)系人通訊錄 void AddContact(Contact* pc);//打印通訊錄中的信息 void ShowContact(Contact* pc);//刪除指定聯(lián)系人 void DelContact(Contact* pc);//查找聯(lián)系人 void SearchContact(Contact* pc);//修改聯(lián)系人 void ModifyContact(Contact* pc);//排序通信錄中的內(nèi)容(按照名字排序) void SortContact(Contact* pc);(3)contact.c
#define _CRT_SECURE_NO_WARNINGS #include "contact.h" //1.靜態(tài)版本 //2.動態(tài)版本 //3.文件的版本void InitContact(Contact* pc) { //初始化結(jié)構(gòu)體pc->count = 0;memset(pc->data, 0, sizeof(pc->data)); //長度為pc->data }void AddContact(Contact* pc) {assert(pc);if (pc->count == MAX){printf("通訊錄已滿,無法添加\n");return;}printf("請輸入名字:>");scanf("%s", pc->data[pc->count].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pc->count].age));//注意:age要傳地址加上&printf("請輸入性別:>");scanf("%s", pc->data[pc->count].sex);printf("請輸入電話:>");scanf("%s", pc->data[pc->count].tele);printf("請輸入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("增加成功\n"); }void ShowContact(Contact* pc) {assert(pc);int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);} }static int FindByName(Contact* pc, char name[]) {assert(pc);int i = 0;for (i = 0; i < pc->count; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1; }void DelContact(Contact* pc) {char name[MAX_NAME] = { 0 };assert(pc);int i = 0;if (pc->count == 0){printf("通訊錄為空,沒有信息可以刪除\n");return ;}printf("請輸入要刪除的名字:>\n"); scanf("%s", name);//刪除//1.查找int pos=FindByName(pc, name);if (pos == -1){printf("要刪除的人不存在\n");}else{//2.刪除for (i = pos; i < pc->count - 1; i++)//100-1{pc->data[i] = pc-> data[i + 1]; //后邊元素往前覆蓋}pc->count--;printf("刪除成功\n");} }void SearchContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請輸入要查找的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}else//2打印{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}} }void ModifyContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請輸入要修改的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");return ;}printf("要修改的人的信息已經(jīng)查找到,接下來開始修改");//2.修改printf("請輸入名字:>");scanf("%s", pc->data[pos].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pos].age));//注意:age要傳地址加上&printf("請輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請輸入地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n"); }//int cmp_peo_by_name(const void* e1, const void* e2) //{ // return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); // //} // //void SortContact(Contact* pc) //{ // assert(pc); //void qsort(void* base, size_t nitems, size_t size, int (*compar)(const void*, const void*)) // qsort(pc->data, pc->count,sizeof(PeoInfo), cmp_peo_by_name); // printf("排序成功"); //}//或者排序也可以為: void SortContact(Contact* pc) {if (pc->count == 0){printf("通訊錄中沒有聯(lián)系人");}else{for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");} }二:動態(tài)版本
1.動態(tài)版本的一些改變
1.相較于靜態(tài)的實現(xiàn),兩者的差別并不大,前者是用一個固定數(shù)組來實現(xiàn)元素的,儲存后者則是用動態(tài)申請的內(nèi)存來實現(xiàn)儲存,優(yōu)點是可以節(jié)省內(nèi)存區(qū)別在于通訊錄的初始化,這里引用了capcity容量來比較已有的容量來判斷內(nèi)存的使用量,便于擴容其次就是Add函數(shù),增加聯(lián)系人最后再對釋放的內(nèi)存進行釋放。所以以下的部分代碼是有區(qū)別的。
(1)ccontact.h
//動態(tài)版本: #pragma once #include <stdio.h> #include <stdlib.h> #include "contact.h" #include <assert.h> #include<string.h> #define DEFAULT_SZ 3 #define INC_SZ 2 //增長的個數(shù)2 #define MAX 100 //總?cè)藬?shù)的大小 #define MAX_NAME 20 // 名字的長度 #define MAX_SEX 10 //性別的長度 #define MAX_TELE 12 //電話號碼的長度 #define MAX_DDR 30 //地址的長度//類型的聲明 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_DDR]; }PeoInfo; //動態(tài)版本: typedef struct Contact {PeoInfo* data;//存放人的信息,用指針int count;//記錄當前通訊錄中的實際人的個數(shù)int capacity;//當前通訊錄的容量 } Contact;//初始化通訊錄 int InitContact(Contact* pc);//銷毀通訊錄 void DestoryContact(Contact* pc);//增加聯(lián)系人通訊錄 void AddContact(Contact* pc);//打印通訊錄中的信息 void ShowContact(Contact* pc);//刪除指定聯(lián)系人 void DelContact(Contact* pc);//查找聯(lián)系人 void SearchContact(Contact* pc);//修改聯(lián)系人 void ModifyContact(Contact* pc);//排序通信錄中的內(nèi)容(按照名字排序) void SortContact(Contact* pc);//增容 void CheckCapacity(Contact* pc);(2)contact.c
//動態(tài)版本: int InitContact(Contact* pc) //返回類型改為int {assert(pc);pc->count = 0;pc->data = (PeoInfo*)calloc(DEFAULT_SZ,sizeof(PeoInfo));//三個if (pc->data == NULL){printf("InitContact::%s\n", strerror(errno));return 1;}pc->capacity = DEFAULT_SZ;return 0; } //動態(tài)版本: void CheckCapacity(Contact* pc) {if (pc->count == pc->capacity) //(總?cè)萘?#43;新增長的空間的個數(shù))*一個元素的大小{PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){printf("AddContact::%s\n", strerror(errno));return;}else{pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}} }void DestoryContact(Contact* pc) {assert(pc);free(pc->data);pc->data = NULL; }void AddContact(Contact* pc) {assert(pc);//增容CheckCapacity(pc);//printf("請輸入名字:>");scanf("%s", pc->data[pc->count].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pc->count].age));//注意:age要傳地址加上&printf("請輸入性別:>");scanf("%s", pc->data[pc->count].sex);printf("請輸入電話:>");scanf("%s", pc->data[pc->count].tele);printf("請輸入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("增加成功\n"); }void ShowContact(Contact* pc) {assert(pc);int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);} }static int FindByName(Contact* pc, char name[]) {assert(pc);int i = 0;for (i = 0; i < pc->count; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1; }void DelContact(Contact* pc) {char name[MAX_NAME] = { 0 };assert(pc);int i = 0;if (pc->count == 0){printf("通訊錄為空,沒有信息可以刪除\n");return ;}printf("請輸入要刪除的名字:>\n"); scanf("%s", name);//刪除//1.查找int pos=FindByName(pc, name);if (pos == -1){printf("要刪除的人不存在\n");}else{//2.刪除for (i = pos; i < pc->count - 1; i++)//100-1{pc->data[i] = pc-> data[i + 1]; //后邊元素往前覆蓋}pc->count--;printf("刪除成功\n");} }void SearchContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請輸入要查找的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}else//2打印{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}} }void ModifyContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請輸入要修改的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");return ;}printf("要修改的人的信息已經(jīng)查找到,接下來開始修改");//2.修改printf("請輸入名字:>");scanf("%s", pc->data[pos].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pos].age));//注意:age要傳地址加上&printf("請輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請輸入地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n"); } //或者排序也可以為: void SortContact(Contact* pc) {if (pc->count == 0){printf("通訊錄中沒有聯(lián)系人");}else{for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");} }三:文件操作版本
1.文件版本的改變
(1)主函數(shù)實現(xiàn)
1.該版本創(chuàng)建通訊錄的時候,此處創(chuàng)建的是一個結(jié)構(gòu)體變量con,建立的是一個結(jié)構(gòu)體數(shù)組,此處結(jié)構(gòu)體變量中存儲的一方面有通訊錄中所有人的信息即data,這些信息打包成了一個數(shù)組,同時還有兩個整型變量,size存儲的是當前已經(jīng)有的元素個數(shù),而capacity存儲的是當前通訊錄的最大容量。相比之前的動態(tài)管理版本,此處增加了保存選項,同時在退出通訊錄之前都會默認進行一次保存,以防用戶在退出之前對通訊錄的信息忘記進行保存。
代碼如下:
(2)初始化功能實現(xiàn)
1.此處增加了一個LoadContact()函數(shù),是將之前文件中聯(lián)系人的信息加載到通訊錄中來,使用了文件操作函數(shù)fread()函數(shù)來對文件中的信息進行讀取,每次讀一個數(shù)據(jù)。
注意:當動態(tài)開辟的空間不夠時,要使用CheckCapacity()函數(shù)對容量進行檢查,如果容量不夠就要進行擴容。
(3)保存通訊錄中的信息
1.保存通訊錄中的信息,使用的是fwrite()函數(shù),即將通訊錄中的數(shù)據(jù)寫入到文件中去,同時使用了fopen()和fclose()進行關(guān)閉文件。最后要將文件指針置為空指針。
void SaveContact(const Contact* pc) {assert(pc);FILE* pfWrite = fopen("contact.txt","wb");if (pfWrite == NULL){perror("SaveContact");return;}//寫文件 二進制的形式int i = 0;for (i = 0; i < pc->count; i++){ //size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );fwrite(pc->data + i, sizeof(PeoInfo), 1, pfWrite);//把ptr所指向的數(shù)組中的數(shù)據(jù)寫入到給定的stream.}fclose(pfWrite); pfWrite = NULL; }2.代碼的呈現(xiàn)
(1)test.c
#define _CRT_SECURE_NO_WARNINGS #include "contact.h"//設(shè)置枚舉類型 enum Option {EXIT,ADD,DEL,SRARCH,MODIFY,SHOW,SORT };void menu() { printf("*****************************************\n");printf("****** 1.add 2.del *********\n");printf("****** 3.search 4.modify *********\n");printf("****** 5.show 6.sort *********\n");printf("****** 0.exit *********\n");printf("*****************************************\n"); } int main() {int input = 0; Contact con;//通訊錄//初始化通訊錄InitContact(&con);//do{menu();printf("請選擇:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DEL:DelContact(&con);break;case SRARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT:SaveContact(&con);DestoryContact(&con);printf("退出通訊錄\n");break;default:printf("選擇錯誤\n");break;}} while (input);return 0;}(2)contact.h
#pragma once #include <stdio.h> #include <stdlib.h> #include "contact.h" #include <assert.h> #include<string.h> #define DEFAULT_SZ 3 #define INC_SZ 2 //增長的個數(shù)2 #define MAX 100 //總?cè)藬?shù)的大小 #define MAX_NAME 20 // 名字的長度 #define MAX_SEX 10 //性別的長度 #define MAX_TELE 12 //電話號碼的長度 #define MAX_DDR 30 //地址的長度//類型的聲明 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_DDR]; }PeoInfo;//動態(tài)版本: typedef struct Contact {PeoInfo* data;//存放人的信息,用指針int count;//記錄當前通訊錄中的實際人的個數(shù)int capacity;//當前通訊錄的容量 } Contact;//初始化通訊錄 int InitContact(Contact* pc);//銷毀通訊錄 void DestoryContact(Contact* pc);//增加聯(lián)系人通訊錄 void AddContact(Contact* pc);//打印通訊錄中的信息 void ShowContact(Contact* pc);//刪除指定聯(lián)系人 void DelContact(Contact* pc);//查找聯(lián)系人 void SearchContact(Contact* pc);//修改聯(lián)系人 void ModifyContact(Contact* pc);//排序通信錄中的內(nèi)容(按照名字排序) void SortContact(Contact* pc);//增容 void CheckCapacity(Contact* pc);//保存通訊錄 void SaveContact(const Contact* pc);//加載文件的通訊錄void LoadContact(Contact* pc);(3)contact.c
#define _CRT_SECURE_NO_WARNINGS #include "contact.h" //加載文件中的信息到通訊錄 void LoadContact(Contact* pc) {FILE* pfRead = fopen("contact.txt", "rb");if(pfRead==NULL){perror("LoadContact");return; }PeoInfo tmp = { 0 };while(fread(&tmp, sizeof(PeoInfo), 1, pfRead) == 1) {//判斷容量,是否需要擴容CheckCapacity(pc);pc->data[pc->count] = tmp; // 一個一個放pc->count++; }fclose(pfRead);pfRead = NULL;}//初始化: int InitContact(Contact* pc) //返回類型改為int {assert(pc);pc->count = 0;pc->data = (PeoInfo*)calloc(DEFAULT_SZ,sizeof(PeoInfo));//三個if (pc->data == NULL){printf("InitContact::%s\n", strerror(errno));return 1;}pc->capacity = DEFAULT_SZ;//加載文件的信息到通訊錄中LoadContact(pc);return 0; } //增容 void CheckCapacity(Contact* pc) {if (pc->count == pc->capacity) //(總?cè)萘?#43;新增長的空間的個數(shù))*一個元素的大小{PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){printf("AddContact::%s\n", strerror(errno));return;}else{pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}} }void DestoryContact(Contact* pc) {assert(pc); free(pc->data);pc->data = NULL; }void AddContact(Contact* pc) {assert(pc);//增容CheckCapacity(pc);//printf("請輸入名字:>");scanf("%s", pc->data[pc->count].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pc->count].age));//注意:age要傳地址加上&printf("請輸入性別:>");scanf("%s", pc->data[pc->count].sex);printf("請輸入電話:>");scanf("%s", pc->data[pc->count].tele);printf("請輸入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("增加成功\n"); }void ShowContact(Contact* pc) {assert(pc);int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);} }static int FindByName(Contact* pc, char name[]) {assert(pc);int i = 0;for (i = 0; i < pc->count; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1; }void DelContact(Contact* pc) {char name[MAX_NAME] = { 0 };assert(pc);int i = 0;if (pc->count == 0){printf("通訊錄為空,沒有信息可以刪除\n");return ;}printf("請輸入要刪除的名字:>\n"); scanf("%s", name);//刪除//1.查找int pos=FindByName(pc, name);if (pos == -1){printf("要刪除的人不存在\n");}else{//2.刪除for (i = pos; i < pc->count - 1; i++)//100-1{pc->data[i] = pc-> data[i + 1]; //后邊元素往前覆蓋}pc->count--;printf("刪除成功\n");} }void SearchContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請輸入要查找的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}else//2打印{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}} }void ModifyContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請輸入要修改的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");return ;}printf("要修改的人的信息已經(jīng)查找到,接下來開始修改");//2.修改printf("請輸入名字:>");scanf("%s", pc->data[pos].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pos].age));//注意:age要傳地址加上&printf("請輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請輸入地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n"); }void SortContact(Contact* pc) {if (pc->count == 0){printf("通訊錄中沒有聯(lián)系人");}else{ for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");} }void SaveContact(const Contact* pc) {assert(pc);FILE* pfWrite = fopen("contact.txt","wb");if (pfWrite == NULL){perror("SaveContact");return;}//寫文件 二進制的形式int i = 0;for (i = 0; i < pc->count; i++){ //size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );fwrite(pc->data + i, sizeof(PeoInfo), 1, pfWrite);//把ptr所指向的數(shù)組中的數(shù)據(jù)寫入到給定的stream.}fclose(pfWrite); pfWrite = NULL; }總結(jié)
以上是生活随笔為你收集整理的通讯录管理系统(C语言版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OTG--miniUSB的工作原理
- 下一篇: 【C语言】自定义类型(结构体、位段、枚举