您好,登錄后才能下訂單哦!
這篇文章主要介紹“C語(yǔ)言靜態(tài)版通訊錄怎么實(shí)現(xiàn)”,在日常操作中,相信很多人在C語(yǔ)言靜態(tài)版通訊錄怎么實(shí)現(xiàn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C語(yǔ)言靜態(tài)版通訊錄怎么實(shí)現(xiàn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
本通訊錄運(yùn)用到了三個(gè)文件
test.c //測(cè)試通訊錄的相關(guān)功能
contact.h //聲明
contact.c //通訊錄的實(shí)現(xiàn)模塊
想要做通訊錄,首要任務(wù)就是要把模塊想好。
先打印一個(gè)通訊錄的界面菜單
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"); }
通訊錄的功能有7種:
增加聯(lián)系人
刪除指定聯(lián)系人
查找聯(lián)系人
修改聯(lián)系人的信息
對(duì)聯(lián)系人的排序
顯示聯(lián)系人的信息
退出通訊錄
創(chuàng)建人的信息的結(jié)構(gòu)體類(lèi)型
第一步是封裝一個(gè)人的信息的結(jié)構(gòu)體類(lèi)型
由于封裝的結(jié)構(gòu)體類(lèi)型的名字太長(zhǎng),總是寫(xiě)的話(huà)感覺(jué)太麻煩了
對(duì) struct PeoInfo進(jìn)行了typdef類(lèi)型重命名
struct PeoInfp 改成 PeoInfp
//表示一個(gè)人的信息 typedef struct PeoInfo { char name[20]; int age; char sex[5]; char tele[12]; char addr[30]; }PeoInfo;
以上的數(shù)值如果以后會(huì)經(jīng)常用到的話(huà),可以用#define 來(lái)定義,方便以后修改
#define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30
//增加通訊錄信息 void AddContact(Contact* pc) { if (DATA_MAX == pc->sz) { printf("通訊錄信息存儲(chǔ)空間已滿(mǎn)!\n"); return; } printf("請(qǐng)輸入名字:> "); scanf("%s", pc->data[pc->sz].name); printf("請(qǐng)輸入年齡:> "); scanf("%d", &(pc->data[pc->sz].age)); printf("請(qǐng)輸入性別:> "); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入電話(huà):> "); scanf("%s", pc->data[pc->sz].tele); printf("請(qǐng)輸入住址:> "); scanf("%s", pc->data[pc->sz].addr); printf("信息添加成功!\n"); pc->sz++; }
void ShowContact(const Contact* pc) { int i = 0; //姓名 年齡 性別 電話(huà) 地址 //zhangsan 20 男 123456 北京 // //打印標(biāo)題 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址"); //打印數(shù)據(jù) for (i = 0; i < pc->sz; i++) { printf("%-10s %-4d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } }
void DelContact(pContact pc) { char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("通訊錄為空,無(wú)法刪除\n"); return; } //刪除 //1. 找到要?jiǎng)h除的人 - 位置(下標(biāo)) printf("輸入要?jiǎng)h除人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要?jiǎng)h除的人不存在\n"); return; } int i = 0; //2. 刪除 - 刪除pos位置上的數(shù)據(jù) for (i = pos; i<pc->sz-1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除成功\n"); }
void SearchContact(const Contact* pc) { char name[MAX_NAME] = {0}; printf("請(qǐng)輸入要查找人的名字:>"); scanf("%s", name); //查找 int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); return; } //打印 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址"); //打印數(shù)據(jù) printf("%-10s %-4d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }
void ModifyContact(Contact* pc) { char name[MAX_NAME] = {0}; printf("請(qǐng)輸入要修改人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要修改的人不存在\n"); return; } //修改 printf("請(qǐng)輸入名字:>"); scanf("%s", pc->data[pos].name); printf("請(qǐng)輸入年齡:>"); scanf("%d", &(pc->data[pos].age)); printf("請(qǐng)輸入性別:>"); scanf("%s", pc->data[pos].sex); printf("請(qǐng)輸入電話(huà):>"); scanf("%s", pc->data[pos].tele); printf("請(qǐng)輸入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); }
//按照名字來(lái)排序 int cmp_by_name(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } void SortContact(Contact* pc) { qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name); printf("排序成功\n"); }
#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" void InitContact(Contact* pc) { pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); } void AddContact(Contact* pc) { if (pc->sz == MAX) { printf("通訊錄已滿(mǎn),無(wú)法增加\n"); return; } printf("請(qǐng)輸入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("請(qǐng)輸入年齡:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("請(qǐng)輸入性別:>"); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入電話(huà):>"); scanf("%s", pc->data[pc->sz].tele); printf("請(qǐng)輸入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("添加成功\n"); } void ShowContact(const Contact* pc) { int i = 0; //姓名 年齡 性別 電話(huà) 地址 //hengchuan 20 男 123456 北京 // //打印標(biāo)題 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址"); //打印數(shù)據(jù) for (i = 0; i < pc->sz; i++) { printf("%-10s %-4d %-5s %-12s %-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(const Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (0 == strcmp(pc->data[i].name, name)) { return i; } } return -1; } void DelContact(pContact pc) { char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("通訊錄為空,無(wú)法刪除\n"); return; } //刪除 //1. 找到要?jiǎng)h除的人 - 位置(下標(biāo)) printf("輸入要?jiǎng)h除人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要?jiǎng)h除的人不存在\n"); return; } int i = 0; //2. 刪除 - 刪除pos位置上的數(shù)據(jù) for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除成功\n"); } void SearchContact(const Contact* pc) { char name[MAX_NAME] = { 0 }; printf("請(qǐng)輸入要查找人的名字:>"); scanf("%s", name); //查找 int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); return; } //打印 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址"); //打印數(shù)據(jù) printf("%-10s %-4d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } void ModifyContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("請(qǐng)輸入要修改人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要修改的人不存在\n"); return; } //修改 printf("請(qǐng)輸入名字:>"); scanf("%s", pc->data[pos].name); printf("請(qǐng)輸入年齡:>"); scanf("%d", &(pc->data[pos].age)); printf("請(qǐng)輸入性別:>"); scanf("%s", pc->data[pos].sex); printf("請(qǐng)輸入電話(huà):>"); scanf("%s", pc->data[pos].tele); printf("請(qǐng)輸入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); } //按照名字來(lái)排序 int cmp_by_name(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } void SortContact(Contact* pc) { qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name); printf("排序成功\n"); }
#pragma once #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30 //表示一個(gè)人的信息 typedef struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; //靜態(tài)版本的設(shè)計(jì) typedef struct Contact { PeoInfo data[MAX];//存放數(shù)據(jù) int sz;//記錄通訊錄中的有效信息個(gè)數(shù) }Contact, *pContact; //初始化通訊錄 void InitContact(Contact* pc); //增加指定聯(lián)系人 void AddContact(Contact* pc); //顯示聯(lián)系人信息 void ShowContact(const Contact* pc); //刪除指定聯(lián)系人 //void DelContact(Contact* pc); void DelContact(pContact pc); //查找指定聯(lián)系人 void SearchContact(const Contact* pc); //修改通訊錄 void ModifyContact(Contact* pc); //排序通訊錄元素 void SortContact(Contact* pc);
#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("***** 0. exit ***\n"); printf("********************************\n"); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT }; int main() { int input = 0; Contact con;//通訊錄 //初始化通訊錄 //加載文件的信息到通訊錄中 InitContact(&con); do { menu(); printf("請(qǐng)選擇:>"); 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 EXIT: printf("退出通訊錄\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); return 0; }
缺點(diǎn):
通訊錄的大小是固定的 - 100個(gè)元素當(dāng)通訊錄退出后,重新運(yùn)行,之前的信息都丟了
當(dāng)前通訊錄中的信息都是保存在內(nèi)存中的,程序退出,內(nèi)存就回收了,下一次重新運(yùn)行程序,內(nèi)存重新分配,之前的數(shù)據(jù)就不見(jiàn)了
到此,關(guān)于“C語(yǔ)言靜態(tài)版通訊錄怎么實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。