您好,登錄后才能下訂單哦!
今天小編給大家分享一下如何使用C語言代碼實現通訊錄功能的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
首先創建一個test.c文件用來測試并且實現通訊錄的功能
通訊錄需要顯示一個菜單來讓用戶具體選擇哪個功能,那么在test.c文件中就需要打印出來一個菜單,如下代碼:
#include <stdio.h> void menu() { printf("***********************************\n"); printf("****** 1.add 2.del ******\n"); printf("****** 3.search 4.modify ******\n"); printf("****** 5.sort 6.empty ******\n"); printf("****** 7.print 0.exit ******\n"); printf("***********************************\n"); } int main() { //通訊錄:1.add 2.del 3.search 4,modify 5.sort 6.empty 7.print 0.exit do { menu(); } while (0); return 0; }
接著就要讓用戶選擇輸入某個數組來使用通訊錄的功能,這時就可以用一個switch開關來實現了,如下代碼:
int input = 0; do { menu(); printf("請選擇功能>:"); scanf("%d", &input); switch (input) { case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; case 0: break; default: printf("請重新輸入\n"); break; } } while (input);
在while循環的條件判斷部分直接寫input,這樣選擇輸入0的時候就直接跳出循環了,輸入其他數字可以繼續使用通訊錄的功能。
case后面跟著的都是數字,有時候調試代碼的時候比較容易忘記這個數字表示的是什么意思,所以這個時候可以用創建一個枚舉類型來定義對應的枚舉常量。
創建一個contact.h文件來放類型的定義,函數的聲明。
然后把枚舉類型在里面進行聲明
enum input { Exit, add, sub, search, modify, sort, empty, print };
之后要在主文件中調用這個頭文件
#include "contact.h"
同時可以把#include <stdio.h>這些庫函數的引用都放到contact.h這個文件當中,這樣要引用新的庫函數時只需要在contact.h這個文件中添加就可以了。
這樣switch開關中的代碼就可以改成這樣了:
switch (input) { case add: break; case sub: break; case search: break; case modify: break; case sort: break; case empty: break; case print: break; case Exit: break; }
然后開始用函數去實現每一個函數的功能,首先是添加功能,在添加之前,還得需要一個空的通訊錄,來存放添加進去的通訊人的數據,而通訊人的數據有姓名,年齡,性別,電話號碼,地址這些數據,都是一些不同類型的值,這時可以聲明一個結構體類型來包含這些成員
好,切到contact.h文件來聲明一個結構體類型:
typedef struct People { char name[20]; int age; char sex[5]; char phone[20]; char address[30]; } People;
同時還對這個類型重命名了一下,方便后續使用這個結構體類型,這是需要考慮到通訊錄存放數據多少的問題,如果address里面存放的內容放不下了,這是就需要對數組的大小進行更改,那這時就要先找到這個結構體類型才能更改了,如果代碼寫的比較多的話就會比較亂,所以可以用#define定義的標識符常量來定義這些值,以后要改的話就只需要找到#define就可以了
如下代碼:
#define NameMax 20 #define SexMax 5 #define PhoneMax 20 #define AddressMax 30
typedef struct People { char name[NameMax]; int age; char sex[SexMax]; char phone[PhoneMax]; char address[AddressMax]; } People;
因為這里是不同類型的值的定義,所以用#define來定義而不用枚舉類型來定義,因為枚舉類型是用來列舉相同類型的值的,比如前面的通訊錄功能都是屬于通訊錄的功能一類的值
下一步,通訊錄不只存放一個人的數據,所以需要用這個結構體類型來創建一個數組,假設這個通訊錄可以存放1000個人的數據,同時還能記錄其中已存放了多少個人
那么可以在主函數中這么寫:
int main() { //通訊錄:1.add 2.del 3.search 4,modify 5.sort 6.empty 7.print 0.exit People contact[1000]; int num;
對于這個通訊錄和這個通訊人的數量,這兩個變量可以兩者之間是由聯系的,那么此時就可以再聲明一個結構體類型來包含這兩個成員。
切到contact.h文件:
typedef struct Contact { People people[1000]; int num; } Contact;
聲明好這個通訊錄類型之后,需要在主文件中用這個類型創建一個變量,同時對變量的內容進行初始化
int main() { //通訊錄:1.add 2.del 3.search 4,modify 5.sort 6.empty 7.print 0.exit Contact contact; InitialContact(&contact);
切到contact.h文件聲明函數:
//函數的聲明 //通訊錄初始化 void InitialContact(Contact* pc);
此時創建一個contact.c文件來實現函數的內容:
切到contact.c文件:
#include "contact.h" void InitialContact(Contact* pc) { memset(pc, 0, sizeof(*pc)); }
要記得引這個contact.h頭文件
在對通訊錄的內容進行完初始化之后,可以開始往里面添加通訊人的信息了,再聲明一個函數:
test.c:
case add: printf("添加通訊人\n"); AddPeople(&contact); break;
contact.h:
//添加通訊人 void AddPeople(Contact* pc);
contact.c:
void AddPeople(Contact* pc) { if (pc->num == 1000) { printf("通訊錄已滿\n"); return; } printf("請輸入姓名>:"); scanf("%s", pc->people[pc->num].name); printf("請輸入年齡>:"); scanf("%d", &pc->people[pc->num].age); printf("請輸入性別>:"); scanf("%s", pc->people[pc->num].sex); printf("請輸入電話>:"); scanf("%s", pc->people[pc->num].phone); printf("請輸入地址>:"); scanf("%s", pc->people[pc->num].address); pc->num++; }
輸入完成之后,要記得讓通訊人數量+1
接下來可以嘗試顯示一下通訊錄中的通訊人信息了
contact.h:
//顯示通訊人信息 void PrintContact(const Contact* pc);
contact.c:
void PrintContact(const Contact* pc) { printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年齡", "性別", "電話", "地址"); int i = 0; for (i = 0; i < pc->num; i++) { printf("%-20s %-20d %-20s %-20s %-20s\n", pc->people[i].name, pc->people[i].age, pc->people[i].sex, pc->people[i].phone, pc->people[i].address); } }
在前面打印個通訊人列表修飾一下
test.c:
case print: printf("顯示通訊人信息\n"); PrintContact(&contact); break;
接下來,開始實現通訊錄的刪除功能:
可以通過讓用戶輸入某個人的名字來刪除這個人在通訊錄中的信息,刪除功能的實現分為兩步,第一步,是需要找到這個人,第二步,刪除這個人在通訊錄中的信息
contact.h:
//刪除通訊人信息 void SubPeople(Contact* pc);
contact.c:
int FindByName(Contact* pc, const char* name) { //遍歷每一個contact結構體中people數組成員中的已存放數據的每一個結構體 int i = 0; for (i = 0; i < sizeof(pc->num); i++) { if (strcmp(pc->people[i].name, name) == 0) { return i;//找到了返回對應結構體的下標 } } return -1;//找不到就返回-1 } void SubPeople(Contact* pc) { if (pc->num == 0)//先判斷通訊錄中有無存儲信息 { printf("通訊錄已清空\n"); return; } //1.找到 printf("請輸入要刪除的人的姓名;>"); char name[NameMax]; scanf("%s", name); int ret = FindByName(pc, name);//用以接收放回的數組下標 if (ret == -1) { printf("找不到要刪除的人\n"); return;//讓函數直接返回 } //2.刪除 //從找到的那個下標位置開始,后面的數組元素(通訊人結構體)依次往前賦值 int j = 0; for (j = ret; j < pc->num - 1; j++) { pc->people[j] = pc->people[j + 1]; } printf("刪除成功\n"); pc->num--;//通訊人數量-1 }
test.c:
case sub: SubPeople(&contact); break;
每完成一個功能,都要去嘗試運行一下,看有沒有bug,否則最后才去找bug可能會比較麻煩。
在刪除功能中,用到了一個自己寫的FindByName函數,然后在接下來的通訊錄查找功能實現中,同樣也要依賴這個函數,不僅如此,在通訊錄修改功能中,也要用到這個函數,而這個函數的實現是為了刪除、查找和修改功能而聲明的,所以可以不用寫在contact.h頭文件中進行聲明。
下面,來開始實現查找功能:
contact.h:
//查找通訊人 void SearchPeople(const Contact* pc);
contact.c:
void SearchPeople(const Contact* pc) { //查找 printf("請輸入要查找的人的姓名;>"); char name[NameMax]; scanf("%s", name); int ret = FindByName(pc, name);//用以接收放回的數組下標 if (ret == -1) { printf("找不到要查找的人\n"); return;//讓函數直接返回 } //顯示 printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年齡", "性別", "電話", "地址"); printf("%-20s %-20d %-20s %-20s %-20s\n", pc->people[ret].name, pc->people[ret].age, pc->people[ret].sex, pc->people[ret].phone, pc->people[ret].address); }
test.c:
case search: SearchPeople(&contact); break;
查找功能已經實現了,接下來就要實現修改功能了,先通過通訊人的姓名找到需要修改的結構體對應的下標,然后重新對這個結構體進行賦值就可以了
contact.h:
//修改通訊人信息 void ModifyPeople(Contact* pc);
contact.c:
void ModifyPeople(Contact* pc) { //查找 printf("請輸入要修改的人的姓名;>"); char name[NameMax]; scanf("%s", name); int ret = FindByName(pc, name);//用以接收放回的數組下標 if (ret == -1) { printf("找不到要修改的人\n"); return;//讓函數直接返回 } //修改 printf("請輸入要修改的姓名>:"); scanf("%s", pc->people[ret].name); printf("請輸入要修改的年齡>:"); scanf("%d", &pc->people[ret].age); printf("請輸入要修改的性別>:"); scanf("%s", pc->people[ret].sex); printf("請輸入要修改的電話>:"); scanf("%s", pc->people[ret].phone); printf("請輸入要修改的地址>:"); scanf("%s", pc->people[ret].address); }
test.c:
case modify: ModifyPeople(&contact); break;
接下來可以開始實習通訊錄的排序功能了,這里就按照年齡來進行一個排序,用到qsort這個函數,其中cmp函數需要自己去寫
contact.h:
//排序 void SortByAge(Contact* pc);
contact.c:
int cmp(const void* e1, const void* e2) { Contact* p1 = (Contact*)e1; Contact* p2 = (Contact*)e2; if (p1->people[0].age > p2->people[1].age) { return 1; } else if (p1->people[0].age < p2->people[1].age) { return -1; } else { return 0; } } void SortByAge(Contact* pc) { if (pc->num == 0) { printf("通訊錄已清空\n"); return; } int num = pc->num; int width = sizeof(pc->people[0]); qsort(pc->people, num, width, cmp); }
test.c:
case sort: printf("按照年齡排序\n"); SortByAge(&contact); PrintContact(&contact); break;
到這里通訊錄的功能就只剩下清空了,可以用到一開始的初始化函數InitialContact
test.c:
case empty: printf("清空通訊錄\n"); InitialContact(&contact); break;
現在通訊錄的功能已經全部實現了
可是這個通訊錄的功能還是有點不太好,就是通訊錄默認的大小就是存放1000個人的數據,那么能不能創建一個可以隨著添加人數的增加而變大的通訊錄呢?鑒于最近學習了動態內存管理,所以對通訊錄的功能做出了一點改進
對結構體類型的修改:
contact.h
typedef struct Contact { People* people; int num; int capacity;//通訊錄的容量 } Contact;
contact.c:
對InitialContact函數的修改:
void InitialContact(Contact* pc) { pc->people = (People*)calloc(3, sizeof(People)); if (pc->people == NULL) { perror("calloc"); return; } pc->num = 0; pc->capacity = 3; }
對AddPeople函數的修改:
void AddPeople(Contact* pc) { if (pc->num == pc->capacity) { pc->people = realloc(pc->people, (pc->capacity + 2) * sizeof(People)); if (pc->people == NULL) { perror("realloc"); return; } pc->capacity += 2; } printf("請輸入姓名>:"); scanf("%s", pc->people[pc->num].name); printf("請輸入年齡>:"); scanf("%d", &pc->people[pc->num].age); printf("請輸入性別>:"); scanf("%s", pc->people[pc->num].sex); printf("請輸入電話>:"); scanf("%s", pc->people[pc->num].phone); printf("請輸入地址>:"); scanf("%s", pc->people[pc->num].address); pc->num++; }
對排序函數中cmp函數的修改:
int cmp(const void* e1, const void* e2) { People* p1 = (People*)e1; People* p2 = (People*)e2; if (p1->age > p2->age) { return 1; } else if (p1->age < p2->age) { return -1; } else { return 0; } }
test.c:
部分修改:
case empty: printf("清空通訊錄\n"); FreeContact(&contact); break;
case Exit: FreeContact(&contact); break;
如下是完整的代碼:
contact.h:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> //類型的聲明 #define NameMax 20 #define SexMax 5 #define PhoneMax 20 #define AddressMax 30 enum input { Exit, add, sub, search, modify, sort, empty, print }; typedef struct People { char name[NameMax]; int age; char sex[SexMax]; char phone[PhoneMax]; char address[AddressMax]; } People; typedef struct Contact { People* people; int num; int capacity;//通訊錄的容量 } Contact; //函數的聲明 //通訊錄初始化 void InitialContact(Contact* pc); //添加通訊人 void AddPeople(Contact* pc); //顯示通訊人信息 void PrintContact(const Contact* pc); //刪除通訊人信息 void SubPeople(Contact* pc); //查找通訊人 void SearchPeople(const Contact* pc); //修改通訊人信息 void ModifyPeople(Contact* pc); //排序 void SortByAge(Contact* pc); //銷毀通訊錄 void FreeContact(Contact* pc);
contact.c:
#include "contact.h" void InitialContact(Contact* pc) { pc->people = (People*)calloc(3, sizeof(People)); if (pc->people == NULL) { perror("calloc"); return; } pc->num = 0; pc->capacity = 3; } void AddPeople(Contact* pc) { if (pc->num == pc->capacity) { pc->people = realloc(pc->people, (pc->capacity + 2) * sizeof(People)); if (pc->people == NULL) { perror("realloc"); return; } pc->capacity += 2; } printf("請輸入姓名>:"); scanf("%s", pc->people[pc->num].name); printf("請輸入年齡>:"); scanf("%d", &pc->people[pc->num].age); printf("請輸入性別>:"); scanf("%s", pc->people[pc->num].sex); printf("請輸入電話>:"); scanf("%s", pc->people[pc->num].phone); printf("請輸入地址>:"); scanf("%s", pc->people[pc->num].address); pc->num++; } void PrintContact(const Contact* pc) { printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年齡", "性別", "電話", "地址"); int i = 0; for (i = 0; i < pc->num; i++) { printf("%-20s %-20d %-20s %-20s %-20s\n", pc->people[i].name, pc->people[i].age, pc->people[i].sex, pc->people[i].phone, pc->people[i].address); } } int FindByName(Contact* pc, const char* name) { //遍歷每一個contact結構體中people數組成員中的已存放數據的每一個結構體 int i = 0; for (i = 0; i < sizeof(pc->num); i++) { if (strcmp(pc->people[i].name, name) == 0) { return i;//找到了返回對應結構體的下標 } } return -1;//找不到就返回-1 } void SubPeople(Contact* pc) { if (pc->num == 0)//先判斷通訊錄中有無存儲信息 { printf("通訊錄已清空\n"); return; } //1.找到 printf("請輸入要刪除的人的姓名;>"); char name[NameMax]; scanf("%s", name); int ret = FindByName(pc, name);//用以接收放回的數組下標 if (ret == -1) { printf("找不到要刪除的人\n"); return;//讓函數直接返回 } //2.刪除 //從找到的那個下標位置開始,后面的數組元素(通訊人結構體)依次往前賦值 int j = 0; for (j = ret; j < pc->num - 1; j++) { pc->people[j] = pc->people[j + 1]; } printf("刪除成功\n"); pc->num--;//通訊人數量-1 } void SearchPeople(const Contact* pc) { //查找 printf("請輸入要查找的人的姓名;>"); char name[NameMax]; scanf("%s", name); int ret = FindByName(pc, name);//用以接收放回的數組下標 if (ret == -1) { printf("找不到要查找的人\n"); return;//讓函數直接返回 } //顯示 printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年齡", "性別", "電話", "地址"); printf("%-20s %-20d %-20s %-20s %-20s\n", pc->people[ret].name, pc->people[ret].age, pc->people[ret].sex, pc->people[ret].phone, pc->people[ret].address); } void ModifyPeople(Contact* pc) { //查找 printf("請輸入要修改的人的姓名;>"); char name[NameMax]; scanf("%s", name); int ret = FindByName(pc, name);//用以接收放回的數組下標 if (ret == -1) { printf("找不到要修改的人\n"); return;//讓函數直接返回 } //修改 printf("請輸入要修改的姓名>:"); scanf("%s", pc->people[ret].name); printf("請輸入要修改的年齡>:"); scanf("%d", &pc->people[ret].age); printf("請輸入要修改的性別>:"); scanf("%s", pc->people[ret].sex); printf("請輸入要修改的電話>:"); scanf("%s", pc->people[ret].phone); printf("請輸入要修改的地址>:"); scanf("%s", pc->people[ret].address); } int cmp(const void* e1, const void* e2) { People* p1 = (People*)e1; People* p2 = (People*)e2; if (p1->age > p2->age) { return 1; } else if (p1->age < p2->age) { return -1; } else { return 0; } } void SortByAge(Contact* pc) { if (pc->num == 0) { printf("通訊錄已清空\n"); return; } int num = pc->num; int width = sizeof(People); qsort(pc->people, num, width, cmp); } void FreeContact(Contact* pc) { free(pc->people); pc->people = NULL; pc->num = 0; pc->capacity = 0; }
test.c:
#include "contact.h" void menu() { printf("***********************************\n"); printf("****** 1.add 2.del ******\n"); printf("****** 3.search 4.modify ******\n"); printf("****** 5.sort 6.empty ******\n"); printf("****** 7.print 0.exit ******\n"); printf("***********************************\n"); } int main() { //通訊錄:1.add 2.del 3.search 4,modify 5.sort 6.empty 7.print 0.exit //創建通訊錄 Contact contact; //初始化通訊錄 InitialContact(&contact); int input = 0; do { menu(); printf("請選擇功能>:"); scanf("%d", &input); switch (input) { case add: printf("添加通訊人\n"); AddPeople(&contact); break; case sub: SubPeople(&contact); break; case search: SearchPeople(&contact); break; case modify: ModifyPeople(&contact); break; case sort: printf("按照年齡排序\n"); SortByAge(&contact); PrintContact(&contact); break; case empty: printf("清空通訊錄\n"); FreeContact(&contact); break; case print: printf("顯示通訊人信息\n"); PrintContact(&contact); break; case Exit: FreeContact(&contact); break; default: printf("請重新輸入\n"); break; } } while (input); return 0; }
以上就是“如何使用C語言代碼實現通訊錄功能”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。