C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄(靜態(tài)版本)的代碼分享
一、通訊錄
1.演示效果

2.完整代碼
#define _CRT_SECURE_NO_WARNINGS 1
//#include "ConTacts.h"
#include <assert.h>
#include <stdio.h>
#define MAX 30
#define NAME 20
#define TEL 20
#define ADR 30
struct PopInfo {//聲明一個(gè)結(jié)構(gòu)體用來(lái)保存?zhèn)€人信息
char name[NAME];//姓名
int age;//年齡
char tel[TEL];//手機(jī)號(hào)
char adr[ADR];//住址
};
struct Contact {
struct PopInfo data[MAX];//用結(jié)構(gòu)體數(shù)組來(lái)存儲(chǔ)多個(gè)人的信息
int sz;//用來(lái)記錄存儲(chǔ)幾個(gè)人的信息
};
void InitContact(struct Contact* con)//初始化聯(lián)系人信息
{
assert(con);
memset(con->data, 0, MAX * sizeof(struct PopInfo));
con->sz = 0;
}
void AddContact(struct Contact* con)//添加聯(lián)系人信息
{
assert(con);
printf("請(qǐng)輸入姓名:");
scanf("%s", con->data[con->sz].name);
printf("請(qǐng)輸入年齡:");
scanf("%d", &(con->data[con->sz].age));
printf("請(qǐng)輸入手機(jī)號(hào):");
scanf("%s", con->data[con->sz].tel);
printf("請(qǐng)輸入住址:");
scanf("%s", con->data[con->sz].adr);
con->sz++;
printf("成功添加聯(lián)系人!\n");
}
void ShowContact(struct Contact* con)//顯示所有聯(lián)系人信息
{
int i = 0;
printf("%-20s\t%-20s\t%-20s\t%-20s\t\n", "姓名", "年齡", "手機(jī)號(hào)", "住址");
for (i = 0; i < con->sz; i++)
{
printf("%-20s\t%-20d\t%-20s\t%-20s\t\n", con->data[i].name, con->data[i].age, con->data[i].tel, con->data[i].adr);
}
}
int Find(struct Contact* con)//根據(jù)姓名查找存放聯(lián)系人信息的數(shù)組下標(biāo)
{
char name[20];
scanf("%s", name);
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (strcmp(con->data[i].name, name) == 0)
{
return i;
break;
}
}
return -1;
}
void DelContact(struct Contact* con)//刪除指定聯(lián)系人信息函數(shù)
{
assert(con);
printf("請(qǐng)輸入你要?jiǎng)h除的聯(lián)系人姓名:");
/*char name[20];
printf("請(qǐng)輸入你要?jiǎng)h除的聯(lián)系人姓名:");
scanf("%s", name);
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (strcmp(con->data[i].name, name) == 0)
{
printf("刪除成功!\n");
con->sz--;
break;
}
}*/
int i = Find(con);
if (i == -1)
{
printf("未找到你要?jiǎng)h除的聯(lián)系人\n");
}
else
{
int j = 0;
for (j = i; j <= con->sz; j++)
{
con->data[j] = con->data[j + 1];
}
con->sz--;
printf("刪除成功!\n");
}
}
void ModContact(struct Contact* con)//修改聯(lián)系人信息
{
assert(con);
printf("請(qǐng)輸入你要修改的聯(lián)系人姓名:");
/*char name[20];
printf("請(qǐng)輸入你要修改的聯(lián)系人姓名:");
scanf("%s", name);
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (strcmp(con->data[i].name, name) == 0)
{
printf("找到要修改的聯(lián)系人!\n");
break;
}
}*/
int i = Find(con);
if (i == -1)
{
printf("未找到你要?jiǎng)h除的聯(lián)系人\n");
}
else
{
printf("請(qǐng)輸入姓名:");
scanf("%s", con->data[i].name);
printf("請(qǐng)輸入年齡:");
scanf("%d", &(con->data[i].age));
printf("請(qǐng)輸入手機(jī)號(hào):");
scanf("%s", con->data[i].tel);
printf("請(qǐng)輸入住址:");
scanf("%s", con->data[i].adr);
printf("成功修改聯(lián)系人信息!\n");
}
}
void SearchContact(struct Contact* con)//查找指定聯(lián)系人
{
assert(con);//斷言,con不能指向NULL
printf("請(qǐng)輸入你要查找的聯(lián)系人姓名:");
/*char name[20];
printf("請(qǐng)輸入你要查找的聯(lián)系人姓名:");
scanf("%s", name);
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (strcmp(con->data[i].name, name) == 0)
{
break;
}
}*/
int i = Find(con);
if (i == -1)
{
printf("沒(méi)有找到你要查找的聯(lián)系人!\n");
}
else
{
printf("%-20s\t%-20s\t%-20s\t%-20s\t\n", "姓名", "年齡", "手機(jī)號(hào)", "住址");
printf("%-20s\t%-20d\t%-20s\t%-20s\t\n", con->data[i].name, con->data[i].age, con->data[i].tel, con->data[i].adr);
}
}
int cmp_name(const void* e1, const void* e2)//qsort中的比較函數(shù)
{
return strcmp(((struct PopInfo*)e1)->name, ((struct PopInfo*)e2)->name);//只能對(duì)字符及字符串排序,如果是數(shù)字,會(huì)出錯(cuò)
}
void Sort_name_Contact(struct Contact* con)//qsort函數(shù)排序
{
qsort(con->data, con->sz, sizeof(struct PopInfo), cmp_name);
printf("排序成功\n");//名字按照字母的ASCII碼值從小到大排序
}
void ClearContact(struct Contact* con)//清空所有聯(lián)系人信息
{
char str[10];
while (1)
{
printf("確定清空通訊錄嗎?(yes/no):");
scanf("%s", str);
if (strcmp(str, "yes") == 0)
{
con->sz = 0;
printf("已清空通訊錄!\n");
break;
}
else if (strcmp(str, "no") == 0)
{
printf("已取消!\n");
break;
}
else
printf("輸入錯(cuò)誤,請(qǐng)重新輸入!\n");
}
}
enum um {//用枚舉類(lèi)型表示input的值
Exit,//Exit是常量值0,退出程序
Add,//Add是常量值1,添加聯(lián)系人信息
Del,//Del是常量值2,刪除指定聯(lián)系人信息
Mod,//3,修改聯(lián)系人信息
Search,//4,查找聯(lián)系人信息
Sort_name,//5,按照姓氏對(duì)聯(lián)系人信息排序
Show,//6,顯示聯(lián)系人信息
Clear//7,清空所有聯(lián)系人信息
};
void menu()
{
printf("*******************************\n");
printf("*** 1.添加聯(lián)系人信息 **\n");
printf("*** 2.刪除指定聯(lián)系人信息 **\n");
printf("*** 3.修改聯(lián)系人信息 **\n");
printf("*** 4.查找聯(lián)系人信息 **\n");
printf("*** 5.按照姓氏對(duì)聯(lián)系人排序 **\n");
printf("*** 6.顯示聯(lián)系人信息 **\n");
printf("*** 7.清空所有聯(lián)系人信息 **\n");
printf("*** 0.退出程序 **\n");
}
int main()
{
int input = 0;
struct Contact con;
InitContact(&con);//初始化聯(lián)系人信息
do {
menu();
printf("請(qǐng)選擇:");
scanf("%d", &input);
switch (input)
{
case Add:
AddContact(&con);//添加聯(lián)系人信息
break;//break僅退出switch語(yǔ)句,不會(huì)退出do-while循環(huán)
case Del:
DelContact(&con);//刪除指定聯(lián)系人信息
break;
case Mod:
ModContact(&con);//修改聯(lián)系人信息
break;
case Search:
SearchContact(&con);//查找指定聯(lián)系人
break;
case Sort_name:
Sort_name_Contact(&con);//按照姓氏對(duì)聯(lián)系人信息排序
break;
case Show:
ShowContact(&con);//顯示所有聯(lián)系人信息
break;
case Clear:
ClearContact(&con);//清空所有聯(lián)系人信息
break;
case Exit:
printf("退出程序\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新選擇\n");
break;
}
} while (input);
return 0;
}
二、代碼解析
1.宏定義及結(jié)構(gòu)體聲明
#include <assert.h>
#include <stdio.h>
#define MAX 30
#define NAME 20
#define TEL 20
#define ADR 30
struct PopInfo {//聲明一個(gè)結(jié)構(gòu)體用來(lái)保存?zhèn)€人信息
char name[NAME];//姓名
int age;//年齡
char tel[TEL];//手機(jī)號(hào)
char adr[ADR];//住址
};
struct Contact {
struct PopInfo data[MAX];//用結(jié)構(gòu)體數(shù)組來(lái)存儲(chǔ)多個(gè)人的信息
int sz;//用來(lái)記錄存儲(chǔ)幾個(gè)人的信息
};定義struct PopInfo結(jié)構(gòu)體用來(lái)保存聯(lián)系人的信息,再定義struct Contact,用來(lái)保存多個(gè)聯(lián)系人的信息以及記錄所存儲(chǔ)聯(lián)系人個(gè)數(shù)。
2.主菜單函數(shù)
void menu()
{
printf("*******************************\n");
printf("*** 1.添加聯(lián)系人信息 **\n");
printf("*** 2.刪除指定聯(lián)系人信息 **\n");
printf("*** 3.修改聯(lián)系人信息 **\n");
printf("*** 4.查找聯(lián)系人信息 **\n");
printf("*** 5.按照姓氏對(duì)聯(lián)系人排序 **\n");
printf("*** 6.顯示聯(lián)系人信息 **\n");
printf("*** 7.清空所有聯(lián)系人信息 **\n");
printf("*** 0.退出程序 **\n");
}
3.主函數(shù)
int main()
{
enum um {//用枚舉類(lèi)型表示input的值
Exit,//Exit是常量值0,退出程序
Add,//Add是常量值1,添加聯(lián)系人信息
Del,//Del是常量值2,刪除指定聯(lián)系人信息
Mod,//3,修改聯(lián)系人信息
Search,//4,查找聯(lián)系人信息
Sort_name,//5,按照姓氏對(duì)聯(lián)系人信息排序
Show,//6,顯示聯(lián)系人信息
Clear//7,清空所有聯(lián)系人信息
};
int input = 0;
struct Contact con;
InitContact(&con);//初始化聯(lián)系人信息
do {
menu();
printf("請(qǐng)選擇:");
scanf("%d", &input);
switch (input)
{
case Add:
AddContact(&con);//添加聯(lián)系人信息
break;//break僅退出switch語(yǔ)句,不會(huì)退出do-while循環(huán)
case Del:
DelContact(&con);//刪除指定聯(lián)系人信息函數(shù)
break;
case Mod:
ModContact(&con);//修改聯(lián)系人信息
break;
case Search:
SearchContact(&con);//查找指定聯(lián)系人
break;
case Sort_name:
Sort_name_Contact(&con);//按照姓氏對(duì)聯(lián)系人信息排序
break;
case Show:
ShowContact(&con);//顯示所有聯(lián)系人信息
break;
case Clear:
ClearContact(&con);
break;
case Exit:
printf("退出程序\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新選擇\n");
break;
}
} while (input);
return 0;
}4.查找函數(shù)
int Find(struct Contact* con)//根據(jù)姓名查找存放聯(lián)系人信息的數(shù)組下標(biāo)
{
char name[20];
scanf("%s", name);
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (strcmp(con->data[i].name, name) == 0)
{
return i;
break;
}
}
return -1;
}
根據(jù)姓名查找存放聯(lián)系人信息的數(shù)組下標(biāo),用于后來(lái)查找、刪除、修改聯(lián)系人信息時(shí)使用。
5.初始化聯(lián)系人信息
void InitContact(struct Contact* con)//初始化聯(lián)系人信息
{
assert(con);
memset(con->data, 0, MAX * sizeof(struct PopInfo));
con->sz = 0;
}
assert(con);是判斷指針con是否為空,判斷memset(con->data, 0, MAX * sizeof(struct PopInfo))是將結(jié)構(gòu)體struct Contact中struct PopInfo類(lèi)型的數(shù)組data置為0。con->sz = 0;是將所記錄的聯(lián)系人個(gè)數(shù)置為0。
6.添加聯(lián)系人信息
void AddContact(struct Contact* con)//添加聯(lián)系人信息
{
assert(con);
printf("請(qǐng)輸入姓名:");
scanf("%s", con->data[con->sz].name);
printf("請(qǐng)輸入年齡:");
scanf("%d", &(con->data[con->sz].age));
printf("請(qǐng)輸入手機(jī)號(hào):");
scanf("%s", con->data[con->sz].tel);
printf("請(qǐng)輸入住址:");
scanf("%s", con->data[con->sz].adr);
con->sz++;
printf("成功添加聯(lián)系人!\n");
}
注意在輸入年齡的時(shí)候因?yàn)槟挲g是int類(lèi)型,要用&符號(hào)取出地址,再進(jìn)行賦值。
7.顯示所有聯(lián)系人信息
void ShowContact(struct Contact* con)//顯示所有聯(lián)系人信息
{
int i = 0;
printf("%-20s\t%-20s\t%-20s\t%-20s\t\n", "姓名", "年齡", "手機(jī)號(hào)", "住址");
for (i = 0; i < con->sz; i++)
{
printf("%-20s\t%-20d\t%-20s\t%-20s\t\n", con->data[i].name, con->data[i].age, con->data[i].tel, con->data[i].adr);
}
}
printf("%-20s\t%-20s\t%-20s\t%-20s\t\n", "姓名", "年齡", "手機(jī)號(hào)", "住址")中的%-20s\t%-20s\t%-20s\t%-20s\t\n是為了讓打印聯(lián)系人信息的時(shí)候更加直觀,%-20s\t%-20s\t%-20s\t%-20s\t\n中的-是為了讓其左對(duì)齊,把-去掉可以是右對(duì)齊。
8.刪除指定聯(lián)系人信息
void DelContact(struct Contact* con)//刪除指定聯(lián)系人信息函數(shù)
{
assert(con);
printf("請(qǐng)輸入你要?jiǎng)h除的聯(lián)系人姓名:");
/*char name[20];
printf("請(qǐng)輸入你要?jiǎng)h除的聯(lián)系人姓名:");
scanf("%s", name);
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (strcmp(con->data[i].name, name) == 0)
{
printf("刪除成功!\n");
con->sz--;
break;
}
}*/
int i = Find(con);
if (i == -1)
{
printf("未找到你要?jiǎng)h除的聯(lián)系人\n");
}
else
{
int j = 0;
for (j = i; j <= con->sz; j++)
{
con->data[j] = con->data[j + 1];
}
con->sz--;
printf("刪除成功!\n");
}
}代碼中注釋部分可以在不調(diào)用 Find函數(shù)時(shí)刪除聯(lián)系人信息,在成功刪除聯(lián)系人信息后,要將存放聯(lián)系人個(gè)數(shù)的變量進(jìn)行修改。
9.修改聯(lián)系人信息
void ModContact(struct Contact* con)//修改聯(lián)系人信息
{
assert(con);
printf("請(qǐng)輸入你要修改的聯(lián)系人姓名:");
/*char name[20];
printf("請(qǐng)輸入你要修改的聯(lián)系人姓名:");
scanf("%s", name);
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (strcmp(con->data[i].name, name) == 0)
{
printf("找到要修改的聯(lián)系人!\n");
break;
}
}*/
int i = Find(con);
if (i == -1)
{
printf("未找到你要?jiǎng)h除的聯(lián)系人\n");
}
else
{
printf("請(qǐng)輸入姓名:");
scanf("%s", con->data[i].name);
printf("請(qǐng)輸入年齡:");
scanf("%d", &(con->data[i].age));
printf("請(qǐng)輸入手機(jī)號(hào):");
scanf("%s", con->data[i].tel);
printf("請(qǐng)輸入住址:");
scanf("%s", con->data[i].adr);
printf("成功修改聯(lián)系人信息!\n");
}
}10.查找指定聯(lián)系人
void SearchContact(struct Contact* con)//查找指定聯(lián)系人
{
assert(con);//斷言,con不能指向NULL
printf("請(qǐng)輸入你要查找的聯(lián)系人姓名:");
/*char name[20];
printf("請(qǐng)輸入你要查找的聯(lián)系人姓名:");
scanf("%s", name);
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (strcmp(con->data[i].name, name) == 0)
{
break;
}
}*/
int i = Find(con);
if (i == -1)
{
printf("沒(méi)有找到你要查找的聯(lián)系人!\n");
}
else
{
printf("%-20s\t%-20s\t%-20s\t%-20s\t\n", "姓名", "年齡", "手機(jī)號(hào)", "住址");
printf("%-20s\t%-20d\t%-20s\t%-20s\t\n", con->data[i].name, con->data[i].age, con->data[i].tel, con->data[i].adr);
}
}11.按照姓氏對(duì)聯(lián)系人信息排序
int cmp_name(const void* e1, const void* e2)//qsort中的比較函數(shù)
{
return strcmp(((struct PopInfo*)e1)->name, ((struct PopInfo*)e2)->name);//只能對(duì)字符及字符串排序,如果是數(shù)字,會(huì)出錯(cuò)
}
void Sort_name_Contact(struct Contact* con)//qsort函數(shù)排序
{
qsort(con->data, con->sz, sizeof(struct PopInfo), cmp_name);
printf("排序成功\n");//名字按照字母的ASCII碼值從小到大排序
}
使用 qsort 函數(shù)對(duì)其進(jìn)行排序。
12.清空所有聯(lián)系人信息
void ClearContact(struct Contact* con)//清空所有聯(lián)系人信息
{
char str[10];
while (1)
{
printf("確定清空通訊錄嗎?(yes/no):");
scanf("%s", str);
if (strcmp(str, "yes") == 0)
{
con->sz = 0;
printf("已清空通訊錄!\n");
break;
}
else if (strcmp(str, "no") == 0)
{
printf("已取消!\n");
break;
}
else
printf("輸入錯(cuò)誤,請(qǐng)重新輸入!\n");
}
}
到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄(靜態(tài)版本)的代碼分享的文章就介紹到這了,更多相關(guān)C語(yǔ)言靜態(tài)通訊錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ vector模擬實(shí)現(xiàn)的全過(guò)程
這篇文章主要給大家介紹了關(guān)于c++ vector的模擬實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
解決了個(gè)困擾了2天的問(wèn)題,定點(diǎn)運(yùn)算問(wèn)題
本文主要講解定點(diǎn)運(yùn)算問(wèn)題,需要的朋友可以參考一下。2016-06-06
C生萬(wàn)物C語(yǔ)言宏將整數(shù)二進(jìn)制位的奇偶數(shù)位交換
這篇文章主要為大家介紹了C生萬(wàn)物C語(yǔ)言使用宏將整數(shù)二進(jìn)制位的奇偶數(shù)位交換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的定時(shí)器
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的定時(shí)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
C++?OpenCV實(shí)現(xiàn)二維碼檢測(cè)功能
這篇文章主要介紹了如何利用C++?OpenCV實(shí)現(xiàn)二維碼檢測(cè)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-01-01
C++實(shí)現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的數(shù)學(xué)算法
這篇文章和大家分享一下我個(gè)人對(duì)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的想法,目前暫時(shí)更新只整數(shù)十進(jìn)制的轉(zhuǎn)換,后續(xù)會(huì)更新帶有小數(shù)的進(jìn)制轉(zhuǎn)換,代碼使用c++實(shí)現(xiàn)2021-09-09
詳解C++中遞增運(yùn)算符重載的實(shí)現(xiàn)
本文主要詳解運(yùn)算符重載里的遞增運(yùn)算符重載;遞增和遞減原理是一樣的,這里就只分享遞增的重載;提到遞增遞減,我們都知道又前置和后置兩種方法, 那今天就詳解一下前置遞增和后置遞增的細(xì)節(jié),拿捏遞增運(yùn)算符重載2022-06-06

