摘要:因此,我們可以將聯(lián)系人信息和通訊錄中已有聯(lián)系人信息保存在一個(gè)結(jié)構(gòu)體中,這樣后面操作我們就不用每次傳入兩個(gè)變量,即聯(lián)系人信息和當(dāng)前有效信息個(gè)數(shù)。
目錄
經(jīng)過一段c語言的學(xué)習(xí),我們可以嘗試著寫一個(gè)簡單的通訊錄,并實(shí)現(xiàn)簡單的功能。
首先我們需要初始化一個(gè)通訊錄,因?yàn)槊總€(gè)通訊錄的聯(lián)系人都會(huì)包括姓名、年齡、性別、電話、地址這五個(gè),因此我們構(gòu)建一個(gè)聯(lián)合體:
//描述人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};
但是在增加聯(lián)系人的時(shí)候,我們必須知道通訊錄中的聯(lián)系人是否數(shù)量已經(jīng)達(dá)到上限,如果達(dá)到上限,則無法添加聯(lián)系人。
因此,我們可以將聯(lián)系人信息和通訊錄中已有聯(lián)系人信息保存在一個(gè)結(jié)構(gòu)體中,這樣后面操作我們就不用每次傳入兩個(gè)變量,即聯(lián)系人信息和當(dāng)前有效信息個(gè)數(shù)。
//通訊錄struct Contact { struct PeoInfo data[MAX];//1000個(gè)人信息放在data數(shù)組中 int sz;//記錄當(dāng)前通訊錄有效信息個(gè)數(shù)};
定義好變量之后,我們要將通訊錄初始化,即將里面起始人個(gè)數(shù)設(shè)置為0
void InitContact(struct Contact* pc){ pc->sz = 0;//默認(rèn)沒有信息 memset(pc->data, 0, sizeof(pc->data));}
這里我們用到了memset函數(shù),而這里需要引用的庫函數(shù)的頭文件我們在后面指出。
在增加聯(lián)系人之前,我們必須先判斷通訊錄中聯(lián)系人數(shù)量是否已滿,如果滿了,達(dá)到上限,我們則無法添加,最后我們一定要sz+1.
void AddContact(struct Contact* pc){ //增加一個(gè)人的聯(lián)系信息 if (pc->sz == MAX) { printf("通訊錄滿了/n"); } else { printf("請輸入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("請輸入年齡:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("請輸入性別:>"); scanf("%s", pc->data[pc->sz].sex); printf("請輸入電話:>"); scanf("%s", pc->data[pc->sz].tele); printf("請輸入地址:>"); scanf("%s", pc->data[pc->sz].addr); printf("添加成功/n"); pc->sz++; }}
首先,我們要先輸入被刪聯(lián)系人的名字,并在通訊錄中查找是否存在此人的名字。因?yàn)楹竺嫖覀冞€要使用查找聯(lián)系人這個(gè)功能,因此我們在這里構(gòu)建一個(gè)函數(shù):
如果找到了此人,我們刪除此聯(lián)系人的方法有兩種
方法一:我們用待刪除聯(lián)系人后面的聯(lián)系人的信息對其前面的信息進(jìn)行逐一覆蓋
?方法二:我們找到要?jiǎng)h除的聯(lián)系人之后,用最后一個(gè)人的信息覆蓋要?jiǎng)h除的聯(lián)系人信息。
?上面兩種方法中,第二種方法顯然移動(dòng)次數(shù)更少,但我們還是選擇第一種方法,因?yàn)榈诙N方法會(huì)改變聯(lián)系人的先后順序,最后記得要sz-1
int Fidname(char name[NAME_MAX], const struct Contact * pc){ //查找要?jiǎng)h除的聯(lián)系人名字的下標(biāo) int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i;//找到了返回下標(biāo) } else return -1;//找不到的情況 }}void DelContact(struct Contact* pc){ //刪除一個(gè)聯(lián)系人的信息 char name[NAME_MAX]; printf("請輸入要?jiǎng)h除聯(lián)系人的姓名:>"); scanf("%s", name); //查找名字 int pos = Findname(name, pc);//找到了返回下標(biāo) if (pos == -1) { printf("查無此人/n"); } else { int j = 0; for (j = pos; j < pc->sz - 1; j++) { pc->data[j] = pc->data[j+1]; } printf("刪除成功/n"); pc->sz - 1;//通訊錄中聯(lián)系人信息-1 }}
我們先輸入要查找的聯(lián)系人名字,找到之后將其打印
void SearchContact(const struct Contact *pc){ //查找聯(lián)系人并打印信息 char name[NAME_MAX]; printf("請輸入要查找的聯(lián)系人姓名/n"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("查無此人/n"); } else { //打印該聯(lián)系人的全部內(nèi)容 printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); printf("%15s/t%5d/t%8s/t%15s/t%30s/n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }}
先輸入要修改的聯(lián)系人名字,找到之后將其修改就行
void ModifyContact(struct Contact* pc){ //修改指定的聯(lián)系人信息 char name[NAME_MAX]; printf("請輸入要查找的聯(lián)系人姓名/n"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("查無此人/n"); } else { printf("請輸入姓名/n"); scanf("%s", pc->data[pos].name); printf("請輸入年齡/n"); scanf("%d", pc->data[pos].age); printf("請輸入性別/n"); scanf("%s", pc->data[pos].sex); printf("請輸入電話/n"); scanf("%s", pc->data[pos].tele); printf("請輸入地址/n"); scanf("%s", pc->data[pos].addr); printf("修改成功/n"); }//就是將該聯(lián)系人信息重新錄入}
首先我們遍歷數(shù)組data[1000]中的所有元素,之后循環(huán)sz次,打印數(shù)組所有信息
void ShowContact(struct Contact* pc){ //顯示所有的聯(lián)系人 printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%15s/t%5d/t%8s/t%15s/t%30s/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); }}
使用qsort函數(shù)進(jìn)行排序
//先實(shí)現(xiàn)一個(gè)冒泡排序函數(shù)int Comname(const void* e1, const void* e2){ return strcmp((const char*)e1, (const char*)e2);}void SortContact(struct Contact* pc){ //通過名字排序通訊錄中聯(lián)系人的先后順序 qsort(pc->data, pc->sz, sizeof(struct PeoInfo), Comname);}
void Empty(struct Contact *pc){ pc->sz=0; return;}
首先我們創(chuàng)建一個(gè)test.c文件,實(shí)現(xiàn)簡單的通訊錄框架
#define _CRT_SECURE_NO_WARNINGS 1#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("***** 7. empty 0. exit **/n"); printf("*******************************/n");}enum Option{ EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT, Empty};int main(){ int input = 0; //創(chuàng)建一個(gè)通訊錄 struct Contact con; //初始化通訊錄 InitContact(&con); do { menu(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case ADD: AddContact(&con); break; case DEL: DelContact(&con); break; case SEARCH: SearchContact(&con); break; case MODIFY: ModifyContact(&con); break; case SHOW: ShowContact(&con); break; case SORT: SortContact(&con); break; case EMPTY: EmptyContact(&con) break; case EXIT: printf("退出通訊錄/n"); default: printf("選擇錯(cuò)誤/n"); break; } } while (input); return 0;}
其次我們創(chuàng)建一個(gè)contact.h來存放函數(shù)的聲明和一些庫函數(shù)的頭文件,以及結(jié)構(gòu)體的定義
#pragma once#define NAME_MAX 30#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 30#define MAX 1000#include #include #include //描述人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};//通訊錄struct Contact { struct PeoInfo data[MAX];//1000個(gè)人信息放在data數(shù)組中 int sz;//記錄當(dāng)前通訊錄有效信息個(gè)數(shù)};//初始化通訊錄void InitContact(struct Contact* pc);//增加聯(lián)系人void AddContact(struct Contact*pc);//刪除一個(gè)聯(lián)系人的信息void DelContact(const struct Contact* pc);//查找聯(lián)系人并打印信息void SearchContact(const struct Contact *pc);//修改指定聯(lián)系人信息void ModifyContact(struct Contact* pc);//顯示所有的聯(lián)系人void ShowContact(struct Contact* pc);//通過名字排序通訊錄中聯(lián)系人的先后順序void SortContact(struct Contact* pc);//清空所有聯(lián)系人void Empty(struct Contact *pc)
最后我們創(chuàng)建一個(gè)contact.c文件來寫出對頭文件中函數(shù)的具體實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void InitContact(struct Contact* pc){ pc->sz = 0;//默認(rèn)沒有信息 memset(pc->data, 0, sizeof(pc->data));}void AddContact(struct Contact* pc){ //增加一個(gè)人的聯(lián)系信息 if (pc->sz == MAX) { printf("通訊錄滿了/n"); } else { printf("請輸入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("請輸入年齡:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("請輸入性別:>"); scanf("%s", pc->data[pc->sz].sex); printf("請輸入電話:>"); scanf("%s", pc->data[pc->sz].tele); printf("請輸入地址:>"); scanf("%s", pc->data[pc->sz].addr); printf("添加成功/n"); pc->sz++; }}int Fidname(char name[NAME_MAX], const struct Contact * pc){ //查找要?jiǎng)h除的聯(lián)系人名字的下標(biāo) int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i;//找到了返回下標(biāo) } else return -1;//找不到的情況 }}void DelContact(struct Contact* pc){ //刪除一個(gè)聯(lián)系人的信息 char name[NAME_MAX]; printf("請輸入要?jiǎng)h除聯(lián)系人的姓名:>"); scanf("%s", name); //查找名字 int pos = Findname(name, pc);//找到了返回下標(biāo) if (pos == -1) { printf("查無此人/n"); } else { int j = 0; for (j = pos; j < pc->sz - 1; j++) { pc->data[j] = pc->data[j+1]; } printf("刪除成功/n"); pc->sz - 1;//通訊錄中聯(lián)系人信息-1 }}void SearchContact(const struct Contact *pc){ //查找聯(lián)系人并打印信息 char name[NAME_MAX]; printf("請輸入要查找的聯(lián)系人姓名/n"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("查無此人/n"); } else { //打印該聯(lián)系人的全部內(nèi)容 printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); printf("%15s/t%5d/t%8s/t%15s/t%30s/n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }}void ModifyContact(struct Contact* pc){ //修改指定的聯(lián)系人信息 char name[NAME_MAX]; printf("請輸入要查找的聯(lián)系人姓名/n"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("查無此人/n"); } else { printf("請輸入姓名/n"); scanf("%s", pc->data[pos].name); printf("請輸入年齡/n"); scanf("%d", pc->data[pos].age); printf("請輸入性別/n"); scanf("%s", pc->data[pos].sex); printf("請輸入電話/n"); scanf("%s", pc->data[pos].tele); printf("請輸入地址/n"); scanf("%s", pc->data[pos].addr); printf("修改成功/n"); }//就是將該聯(lián)系人信息重新錄入}void ShowContact(struct Contact* pc){ //顯示所有的聯(lián)系人 printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%15s/t%5d/t%8s/t%15s/t%30s/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); }}//先實(shí)現(xiàn)一個(gè)冒泡排序函數(shù)int Comname(const void* e1, const void* e2){ return strcmp((const char*)e1, (const char*)e2);}void SortContact(struct Contact* pc){ //通過名字排序通訊錄中聯(lián)系人的先后順序 qsort(pc->data, pc->sz, sizeof(struct PeoInfo), Comname);}void Empty(struct Contact *pc){ pc->sz=0; return;}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/120807.html
摘要:準(zhǔn)備數(shù)據(jù)結(jié)構(gòu)這個(gè)以對一個(gè)簡單的通訊錄進(jìn)行插入查詢更新刪除記錄為例,中包含和兩個(gè)字段下載還沒出官方的驅(qū)動(dòng)包,是現(xiàn)在比較流行的第三方包,能找到的相關(guān)資料也比較多。準(zhǔn)備實(shí)現(xiàn)對的增刪改查操作,先想了下怎么寫測試案例。查找,通過查找該條記錄。 環(huán)境聲明:go version go1.11MongoDB server version 4.0.3 背景 這是我第一次接觸golang和MongoDB,...
摘要:本篇文章將用語言代碼實(shí)現(xiàn)一個(gè)通訊錄管理系統(tǒng),本片文章博主將會(huì)運(yùn)用到架構(gòu)提,枚舉,動(dòng)態(tài)內(nèi)存開辟和文件操作等。這里存放數(shù)據(jù)的結(jié)構(gòu)是線性表。這個(gè)指針就可以通過動(dòng)態(tài)開辟內(nèi)存來調(diào)整存放信息的大小。擴(kuò)容成功這樣就實(shí)現(xiàn)了檢查通訊錄是否需要擴(kuò)容的函數(shù)。 ...
摘要:文章目錄前言前言一建立文件二編寫函數(shù)三調(diào)試運(yùn)行四成果展示五代碼匯總總結(jié)前言通訊錄是我們?nèi)粘J謾C(jī)中常見的功能之一,綜合語言中結(jié)構(gòu)體,循環(huán),條件語句,動(dòng)態(tài)內(nèi)存分配等等知識(shí)點(diǎn),我們對手機(jī)通訊錄進(jìn)行一個(gè)簡單的實(shí)現(xiàn),下面我們開始講解準(zhǔn)備工作利用語 文章目錄 前言一、建立文件二、編寫函數(shù)三、調(diào)試運(yùn)...
??C語言通訊錄管理系統(tǒng)(簡易版)?? ?一、通訊錄?二、菜單實(shí)現(xiàn)和用戶交互?三、主函數(shù)????1.enum選項(xiàng)????2.switch判斷 ?四、定義聯(lián)系人和通訊錄????1.定義聯(lián)系人結(jié)構(gòu)體????2.定義通訊錄結(jié)構(gòu)體????3.定義結(jié)構(gòu)體變量 ?五、通訊錄初始化?六、新增聯(lián)系人?七、查找聯(lián)系人?八、刪除聯(lián)系人?九、修改聯(lián)系人?十、查看所有聯(lián)系人?十一、清空所有聯(lián)系人?十二、以名字排序所有...
摘要:前言我們需要用語言模擬一個(gè)通訊錄可以用來存儲(chǔ)個(gè)人的信息每個(gè)人的信息包括姓名電話性別住址年齡功能包括新增聯(lián)系人查找聯(lián)系人刪除聯(lián)系人修改聯(lián)系人查看所有聯(lián)系人以名字排序所有聯(lián)系人注此版本不包含其他內(nèi)容,后續(xù)會(huì)出更加全面的升級(jí)版本通訊錄語言簡易版 前言: 我們需要用C語言模擬一個(gè)通訊錄可以用來存...
閱讀 3076·2021-10-27 14:16
閱讀 2885·2021-09-24 10:33
閱讀 2293·2021-09-23 11:21
閱讀 3236·2021-09-22 15:14
閱讀 823·2019-08-30 15:55
閱讀 1685·2019-08-30 15:53
閱讀 1754·2019-08-29 11:14
閱讀 2195·2019-08-28 18:11