網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
目標(biāo):通訊錄可以存放1000個(gè)人信息,人的信息:性別名字年齡電話住址 菜單打印
1.增加聯(lián)系人
2.刪除聯(lián)系人
3.查找聯(lián)系人(修改)
4.名字排序聯(lián)系人
5.展示
6.清空
分析:
首先通訊錄存放聯(lián)系人信息,還需知曉聯(lián)系人個(gè)數(shù),因此是個(gè)結(jié)構(gòu)體類型
其次人的信息類型多,因此每個(gè)聯(lián)系人也應(yīng)為結(jié)構(gòu)體類型
說(shuō)明:
每個(gè)標(biāo)題下展示的代碼順序:test.c (主函數(shù)測(cè)試運(yùn)行)? ->? contact.h? (功能函數(shù)聲明)?->? contact.c? (功能函數(shù)實(shí)現(xiàn))
菜單打?。?/h2>
void menu()
{
printf("***************************\n");
printf("*** 1.add 2.del ***\n");
printf("*** 3.serch (modify) ***\n");
printf("*** 4.sort 5.show ***\n");
printf("*** 0.exit 6.clear ***\n");
printf("***************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("請(qǐng)選擇->");
scanf("%d",&input);
switch (input)
{
case 1:
//增加信息
break;
case 2:
//刪除
break;
case 3:
//查找(修改)
break;
case 4:
//按名字排序
break;
case 5:
//顯示聯(lián)系人信息
break;
case 6:
//清空聯(lián)系人
break;
case 0:
//退出通訊錄
break;
dafault:
break;
}
} while (input);
}
枚舉優(yōu)化:
void menu() { printf("***************************\n"); printf("*** 1.add 2.del ***\n"); printf("*** 3.serch (modify) ***\n"); printf("*** 4.sort 5.show ***\n"); printf("*** 0.exit 6.clear ***\n"); printf("***************************\n"); } int main() { int input = 0; do { menu(); printf("請(qǐng)選擇->"); scanf("%d",&input); switch (input) { case 1: //增加信息 break; case 2: //刪除 break; case 3: //查找(修改) break; case 4: //按名字排序 break; case 5: //顯示聯(lián)系人信息 break; case 6: //清空聯(lián)系人 break; case 0: //退出通訊錄 break; dafault: break; } } while (input); }
上述菜單可以用枚舉對(duì)代碼可讀性進(jìn)行優(yōu)化,改進(jìn)如下:
enum Oprion { Exit, Add, Del, Serch, Sort, Show, Clear }; void menu() { printf("***************************\n"); printf("*** 1.add 2.del ***\n"); printf("*** 3.serch (modify) ***\n"); printf("*** 4.sort 5.show ***\n"); printf("*** 0.exit 6.clear ***\n"); printf("***************************\n"); } int main() { int input = 0; do { menu(); printf("請(qǐng)選擇->"); scanf("%d",&input); switch (input) { case Add: //增加信息 break; case Del: //刪除 break; case Serch: //查找(修改) break; case Sort: //按名字排序 break; case Show: //顯示聯(lián)系人信息 break; case Clear: //清空聯(lián)系人 break; case Exit: //退出通訊錄 break; dafault: break; } } while (input); }
定義結(jié)構(gòu)體?
#define Max 1000 #define name_Max 20 #define sex_Max 5 #define addr_Max 30 #define phone_Max 12 //結(jié)構(gòu)體人的信息 typedef struct Peoinfo { char name[name_Max]; int age; char sex[sex_Max]; char addr[addr_Max]; char phone[phone_Max]; }Peoinfo; //結(jié)構(gòu)體通訊錄的信息 typedef struct Contact { Peoinfo data[1000]; //存放數(shù)據(jù) int sz; //通訊錄中有效信息的個(gè)數(shù)(里面有幾個(gè)人) }Contact;
初始化
//完善菜單主函數(shù)部分 int main() { int input = 0; Contact con;//通訊錄 InitContact(&con);//初始化通訊錄 do
//初始化通訊錄 void InitContact(Contact* pc); //初始化通訊錄 void InitContact(Contact* pc) { assert(pc); pc->sz = 0; memset(pc->data,0,sizeof(pc->data)); //將數(shù)組初始化為0 }
增加信息?
case Add: //增加信息 AddContact(&con); break; //增加信息到通訊錄 void AddContact(Contact* pc); //增加信息 void AddContact(Contact* pc) { assert(pc); if (pc->sz==Max) { printf("通訊錄滿了,無(wú)法添加\n"); return 0; } //輸入信息 printf("請(qǐng)輸入名字:"); scanf("%s",pc->data[pc->sz].name); //增加的信息應(yīng)該在原有效信息位置后,用pc->sz指向?qū)?yīng)位置 printf("請(qǐng)輸入年齡:"); scanf("%d", &(pc->data[pc->sz].age)); //age是個(gè)變量,注意需要取地址 printf("請(qǐng)輸入性別:"); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入地址:"); scanf("%s", pc->data[pc->sz].addr); printf("請(qǐng)輸入電話:"); scanf("%s", pc->data[pc->sz].phone); pc->sz++; //元素個(gè)數(shù)加一 printf("添加成功\n"); }
這里要注意通訊錄已滿的情況,并且添加信息時(shí)要注意是在原有效信息后得地址開(kāi)始添加,防止重復(fù)。
刪除信息?
case Del: //刪除 DeletContact(&con); break; //刪除 void DeletContact(Contact* pc); int FindByname(Contact*pc, char name[]) { int i = 0; for (i = 0;i<pc->sz;i++) { if (strcmp(pc->data[i].name, name)==0) { return i; } } printf("沒(méi)找到\n"); return -1; } //刪除信息 void DeletContact(Contact* pc) { char name[name_Max]; if (pc->sz == 0) { printf("通訊錄為空,無(wú)法刪除\n"); } printf("請(qǐng)輸入要?jiǎng)h除人的名字:"); scanf("%s",name); //實(shí)現(xiàn)查找函數(shù) int pos=FindByname(pc,name); //若找到返回下標(biāo),找不到則返回-1 if (pos==-1) { printf("無(wú)此人\n"); } else { //刪除--要?jiǎng)h除元素后面的元素依次向前覆蓋 int j = 0; for (j = pos;j<pc->sz-1;j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--; printf("刪除成功\n"); } }
這里要注意一個(gè)查找函數(shù),輸入名字來(lái)查找聯(lián)系人,找到才能刪除。
查找(修改)?
case Serch: printf("請(qǐng)輸入要查找人的名字:"); scanf("%s", name); FindByname(&con,name); break; //查找 int FindByname(const Contact*pc, char name[]); int FindByname(Contact*pc, char name[]) { int i = 0; for (i = 0;i<pc->sz;i++) { if (strcmp(pc->data[i].name, name)==0) { int put = 0; printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone); //找到后可以將內(nèi)容展現(xiàn)出來(lái) printf("找著了\n請(qǐng)選擇是否修改:1.是 0.否\n"); scanf("%d",&put); if (1 == put) { Modify(pc->data,i); } return i; } } printf("沒(méi)找到\n"); return -1; }
這里我將第二項(xiàng)刪除功能的查找函數(shù)進(jìn)行聲明使用,并且將修改函數(shù)加入到查找函數(shù)中,兩個(gè)功能聯(lián)合到一起,但是在使用刪除功能的時(shí)候會(huì)出現(xiàn)重復(fù),這里要注意。
修改函數(shù)如下:
//修改 void Modify(Contact* pc,int i) { int bud = 0; do { printf("請(qǐng)選擇需要修改的內(nèi)容\n1.名字 2.年齡 3.性別 4.地址 5.電話 0.取消\n請(qǐng)輸入:"); scanf("%d", &bud); switch (bud) { char chars[30] = { 0 }; case 1: { printf("請(qǐng)輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].name , chars); } break; case 2: { int num = 0; printf("請(qǐng)輸入內(nèi)容->"); scanf("%d", &num); pc->data[i].age = num; } break; case 3: { printf("請(qǐng)輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].sex , chars); } break; case 4: printf("請(qǐng)輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].addr , chars); break; case 5: { printf("請(qǐng)輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].phone , chars); } break; dafault: break; } } while (bud); }
修改用到了字符串函數(shù)strcpy
名字排序?
case Sort: Sortname(&con); break; //名字排序 void Sortname(Contact* pc); //name排序 int cmp_int(const void*e1,const void*e2) { return (strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name)); } void Sortname(Contact* pc) { qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int); ShowContact(pc); }
按名字排序這里,我用到了快速排序qsort函數(shù)來(lái)進(jìn)行。排序后調(diào)用展示函數(shù)進(jìn)行打印,來(lái)觀察排序效果。
展示信息?
case Show: //顯示 ShowContact(&con); break; //展示信息 void ShowContact(const Contact* pc); //展示信息 void ShowContact(const Contact* pc) { assert(pc); int i = 0; for (i = 0;i < pc->sz;i++) { printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone); //加負(fù)號(hào)左對(duì)齊,加/t統(tǒng)一每個(gè)元素間的距離 } }
清空聯(lián)系人?
case Clear: ClearContact(&con); break; //清空所有聯(lián)系人 void ClearContact(Contact* pc); //清空所有聯(lián)系人 void ClearContact(Contact* pc) { InitContact(pc); }
清空聯(lián)系人,相當(dāng)于再進(jìn)行一遍初始化通訊錄。
頭文件統(tǒng)一在contact.h里面包含:
#include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h>
?test.c 和 contact.c 統(tǒng)一引用頭文件 contact.h
#include "contact.h"
總程序如下
test.c
#include "contact.h" enum Oprion { Exit, Add, Del, Serch, Sort, Show, Clear }; void menu() { printf("***************************\n"); printf("*** 1.add 2.del ***\n"); printf("*** 3.serch (modify) ***\n"); printf("*** 4.sort 5.show ***\n"); printf("*** 0.exit 6.clear ***\n"); printf("***************************\n"); } int main() { int input = 0; Contact con;//通訊錄 InitContact(&con);//初始化通訊錄 do { char name[name_Max]; menu(); printf("請(qǐng)選擇->"); scanf("%d",&input); switch (input) { case Add: //增加信息 AddContact(&con); break; case Del: //刪除 DeletContact(&con); break; case Serch: printf("請(qǐng)輸入要查找人的名字:"); scanf("%s", name); FindByname(&con,name); break; //case 4: // //修改 // Modify(&con); // break; case Sort: Sortname(&con); break; case Show: //顯示 ShowContact(&con); break; case Clear: ClearContact(&con); break; case Exit: printf("退出通訊錄\n"); break; dafault: break; } } while (input); }
contact.h
//聲明 #include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h> #define Max 1000 #define name_Max 20 #define sex_Max 5 #define addr_Max 30 #define phone_Max 12 //結(jié)構(gòu)體人的信息 typedef struct Peoinfo { char name[name_Max]; int age; char sex[sex_Max]; char addr[addr_Max]; char phone[phone_Max]; }Peoinfo; //結(jié)構(gòu)體通訊錄的信息 typedef struct Contact { Peoinfo data[1000]; //存放數(shù)據(jù) int sz; //通訊錄中有效信息的個(gè)數(shù)(里面有幾個(gè)人) }Contact; //初始化通訊錄 void InitContact(Contact* pc); //增加信息到通訊錄 void AddContact(Contact* pc); //展示信息 void ShowContact(const Contact* pc); //刪除 void DeletContact(Contact* pc); //查找 int FindByname(const Contact*pc, char name[]); //名字排序 void Sortname(Contact* pc); //修改 void Modify(Contact* pc, int i); //清空所有聯(lián)系人 void ClearContact(Contact* pc);
contact.c
#include "contact.h" //初始化通訊錄 void InitContact(Contact* pc) { assert(pc); pc->sz = 0; memset(pc->data,0,sizeof(pc->data)); //將數(shù)組初始化為0 } //增加信息 void AddContact(Contact* pc) { assert(pc); if (pc->sz==Max) { printf("通訊錄滿了,無(wú)法添加\n"); return 0; } //輸入信息 printf("請(qǐng)輸入名字:"); scanf("%s",pc->data[pc->sz].name); //增加的信息應(yīng)該在原有效信息位置后,用pc->sz指向?qū)?yīng)位置 printf("請(qǐng)輸入年齡:"); scanf("%d", &(pc->data[pc->sz].age)); //age是個(gè)變量,注意需要取地址 printf("請(qǐng)輸入性別:"); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入地址:"); scanf("%s", pc->data[pc->sz].addr); printf("請(qǐng)輸入電話:"); scanf("%s", pc->data[pc->sz].phone); pc->sz++; //元素個(gè)數(shù)加一 printf("添加成功\n"); } //展示信息 void ShowContact(const Contact* pc) { assert(pc); int i = 0; for (i = 0;i < pc->sz;i++) { printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone); //加負(fù)號(hào)左對(duì)齊,加/t統(tǒng)一每個(gè)元素間的距離 } } int FindByname(Contact*pc, char name[]) { int i = 0; for (i = 0;i<pc->sz;i++) { if (strcmp(pc->data[i].name, name)==0) { int put = 0; printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone); printf("找著了\n請(qǐng)選擇是否修改:1.是 0.否\n"); scanf("%d",&put); if (1 == put) { Modify(pc->data,i); } return i; } } printf("沒(méi)找到\n"); return -1; } //刪除信息 void DeletContact(Contact* pc) { char name[name_Max]; if (pc->sz == 0) { printf("通訊錄為空,無(wú)法刪除\n"); } printf("請(qǐng)輸入要?jiǎng)h除人的名字:"); scanf("%s",name); //實(shí)現(xiàn)查找函數(shù) int pos=FindByname(pc,name); //若找到返回下標(biāo),找不到則返回-1 if (pos==-1) { printf("無(wú)此人\n"); } else { //刪除--要?jiǎng)h除元素后面的元素依次向前覆蓋 int j = 0; for (j = pos;j<pc->sz-1;j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--; printf("刪除成功\n"); } } //name排序 int cmp_int(const void*e1,const void*e2) { return (strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name)); } void Sortname(Contact* pc) { qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int); ShowContact(pc); } //修改 void Modify(Contact* pc,int i) { int bud = 0; do { printf("請(qǐng)選擇需要修改的內(nèi)容\n1.名字 2.年齡 3.性別 4.地址 5.電話 0.取消\n請(qǐng)輸入:"); scanf("%d", &bud); switch (bud) { char chars[30] = { 0 }; case 1: { printf("請(qǐng)輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].name , chars); } break; case 2: { int num = 0; printf("請(qǐng)輸入內(nèi)容->"); scanf("%d", &num); pc->data[i].age = num; } break; case 3: { printf("請(qǐng)輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].sex , chars); } break; case 4: printf("請(qǐng)輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].addr , chars); break; case 5: { printf("請(qǐng)輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].phone , chars); } break; dafault: break; } } while (bud); } //清空所有聯(lián)系人 void ClearContact(Contact* pc) { InitContact(pc); }
原文鏈接:https://blog.csdn.net/weixin_53316121/article/details/122789000
相關(guān)推薦
- 2022-10-14 yum-config-manager 命令找不到的解決方法
- 2022-12-05 Android自定義view實(shí)現(xiàn)左滑刪除的RecyclerView詳解_Android
- 2022-12-07 C語(yǔ)言程序中結(jié)構(gòu)體的內(nèi)存對(duì)齊詳解_C 語(yǔ)言
- 2021-12-08 教你如何在windows?10家庭版上安裝docker_docker
- 2022-02-01 CSS3自定義滾動(dòng)條樣式
- 2022-02-25 Oracle函數(shù)使索引列失效的解決辦法_oracle
- 2022-07-29 Linux中Vi和Vim編輯器用法詳解_linux shell
- 2022-03-24 使用Redis如何設(shè)置永久有效_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支