C語言實(shí)現(xiàn)簡易通訊錄完整流程
目標(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)體類型
說明:
每個(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("通訊錄滿了,無法添加\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í)要注意是在原有效信息后得地址開始添加,防止重復(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("沒找到\n");
return -1;
}
//刪除信息
void DeletContact(Contact* pc)
{
char name[name_Max];
if (pc->sz == 0)
{
printf("通訊錄為空,無法刪除\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("無此人\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ù),輸入名字來查找聯(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)出來
printf("找著了\n請(qǐng)選擇是否修改:1.是 0.否\n");
scanf("%d",&put);
if (1 == put)
{
Modify(pc->data,i);
}
return i;
}
}
printf("沒找到\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ù)來進(jìn)行。排序后調(diào)用展示函數(shù)進(jìn)行打印,來觀察排序效果。
展示信息?
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("通訊錄滿了,無法添加\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("沒找到\n");
return -1;
}
//刪除信息
void DeletContact(Contact* pc)
{
char name[name_Max];
if (pc->sz == 0)
{
printf("通訊錄為空,無法刪除\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("無此人\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);
}
到此這篇關(guān)于C語言實(shí)現(xiàn)簡易通訊錄完整流程的文章就介紹到這了,更多相關(guān)C語言 簡易通訊錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中設(shè)置進(jìn)程優(yōu)先順序的方法
這篇文章主要介紹了C語言中設(shè)置進(jìn)程優(yōu)先順序的方法,包括setpriority()函數(shù)和getpriority()函數(shù)以及nice()函數(shù),需要的朋友可以參考下2015-08-08
C++語言基礎(chǔ) this和static關(guān)鍵字
這篇文章主要介紹了C++語言基礎(chǔ) this和static關(guān)鍵字,需要的朋友可以參考下2020-01-01
C指針原理教程之編譯原理-小型計(jì)算器實(shí)現(xiàn)
本文給大家分享的是如何使用C語言編寫一個(gè)小型計(jì)算器的實(shí)例代碼,有需要的小伙伴可以參考下2019-02-02
C語言實(shí)現(xiàn)為無聲avi視頻添加wave音樂
這篇文章主要為大家詳細(xì)介紹了C語言如何實(shí)現(xiàn)為無聲avi視頻添加wave音樂,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-11-11
C++基于hook iat改變Messagebox實(shí)例
這篇文章主要介紹了C++基于hook iat改變Messagebox的方法,以實(shí)例形式展示了針對(duì)IAT(即導(dǎo)入地址表)以及hook的操作,有助于深入理解Windows程序設(shè)計(jì)原理,需要的朋友可以參考下2014-10-10

