c語(yǔ)言實(shí)現(xiàn)通訊錄管理系統(tǒng)詳細(xì)實(shí)例
一、前言
本文將會(huì)用c語(yǔ)言實(shí)現(xiàn)一個(gè)通訊錄的系統(tǒng),并且存儲(chǔ)若干人的信息,每個(gè)人的信息包括:姓名,性別,年齡,電話(huà)號(hào)碼,住址。此通訊錄系統(tǒng)的功能包括: 1.增加聯(lián)系人 2.刪除對(duì)應(yīng)的聯(lián)系人 3.查找聯(lián)系人 4.修改聯(lián)系人的信息 5.排序此通訊錄 6.打印出通訊錄每個(gè)人的信息
二、通訊錄的實(shí)現(xiàn)
1.關(guān)于通訊錄的前期準(zhǔn)備
(1)菜單的實(shí)現(xiàn)
首先關(guān)于一個(gè)通訊錄,建立一個(gè)菜單是很重要的,菜單能夠?qū)崿F(xiàn)和用戶(hù)的交互。
因此我們需要建立一個(gè)菜單,并且菜單立馬應(yīng)該包括通訊錄立馬該有的功能,以便于用戶(hù)的操作
代碼如下:
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.排序通訊錄=============\n");
printf("============6.打印通訊錄=============\n");
printf("============0.退出通訊錄=============\n");
printf("=====================================\n");
}
效果差不都就是這樣子
(2)關(guān)于聯(lián)系人結(jié)構(gòu)體的創(chuàng)建
這里我們需要利用結(jié)構(gòu)體來(lái)實(shí)現(xiàn)實(shí)現(xiàn)前言中的通訊錄功能以及聯(lián)系人信息,我將利用兩個(gè)結(jié)構(gòu)體來(lái)構(gòu)建我們需要的東西。
typedef struct PeoInfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}Peo;
typedef struct Contact
{
Peo con[PON_MAX];
int sz;//記錄數(shù)量
}contact;關(guān)于第一個(gè)結(jié)構(gòu)體Peo是關(guān)于個(gè)人信息的存儲(chǔ),第二個(gè)結(jié)構(gòu)體構(gòu)建了 我們需要的通訊錄,con來(lái)作為以第一個(gè)結(jié)構(gòu)體為類(lèi)型的數(shù)組,sz來(lái)記錄這個(gè)結(jié)構(gòu)體存儲(chǔ)個(gè)人信息的數(shù)量。
(3)實(shí)現(xiàn)菜單選項(xiàng)的功能
我們需要根據(jù)菜單里面的選項(xiàng)來(lái)選擇進(jìn)行我們需要實(shí)現(xiàn)的功能,比如我們想假如一個(gè)用戶(hù)信息,我們就輸入1就會(huì)進(jìn)行用戶(hù)假如的操作,我們想退出程序我們輸入0就可以退出。我選擇利用枚舉變量的形式來(lái)實(shí)現(xiàn),講操作變成數(shù)字,利用switch選擇語(yǔ)句來(lái)實(shí)現(xiàn)各自的功能。
enum Option//利用枚舉變量來(lái)定義
{
exit,//0
add,//1
del,//2
search,//3
modify,//4
sort,//5
print//6
};
void test()
{
contact con;//建立結(jié)構(gòu)體
InitCon(&con);
int input = 0;
do {
menu();
scanf("%d", &input);
switch (input)
{
case add:
AddCon(&con);
break;
case del:
DelCon(&con);
break;
case search:
SearchCon(&con);
break;
case modify:
ModifyCon(&con);
break;
case sort:
SortCon(&con);
break;
case print:
PrintCon(&con);
break;
case exit:
printf("退出程序,歡迎使用!\n");
break;
default:
printf("沒(méi)有找到此數(shù)字匹配的操作!!\n");
}
} while (input);
}(4)關(guān)于全局變量的定義
為了實(shí)現(xiàn)這些變量,并且方便后期的處理數(shù)組大小,所以我們可以利用宏來(lái)實(shí)現(xiàn)這個(gè)功能
#define NAME_MAX 20//姓名的長(zhǎng)度 #define SEX_MAX 5//性別的長(zhǎng)度 #define TELE_MAX 12//電話(huà)號(hào)碼的長(zhǎng)度 #define ADDR_MAX 30//地址長(zhǎng)度 #define PON_MAX 1000//通訊錄的大小
2、通訊錄的功能實(shí)現(xiàn)
(1)初始化通訊錄
剛剛開(kāi)始我們創(chuàng)建了通訊錄的結(jié)構(gòu)體,但是我們不難發(fā)現(xiàn),因?yàn)闆](méi)有定義的原因,他們里面存的都是隨機(jī)數(shù),因此我們需要對(duì)他們進(jìn)行初始化防止后面的失誤。初始化很簡(jiǎn)單就是把我們通訊錄結(jié)構(gòu)體里面的用戶(hù)信息的結(jié)構(gòu)體類(lèi)型的數(shù)組進(jìn)行初始化,這里我們可以淺淺用一個(gè)memset函數(shù)來(lái)實(shí)現(xiàn),當(dāng)然別忘了引用string的頭文件,然后sz的初始化很簡(jiǎn)單就是初始化為0。
void InitCon(contact* pc)
{
assert(pc);
pc->sz = 0;
memset(pc->con, 0, sizeof(pc->con));
}//初始化結(jié)構(gòu)體(2)增加聯(lián)系人
首先第一步我們完成第一步就可以創(chuàng)建關(guān)于加入聯(lián)系人的函數(shù),這個(gè)很簡(jiǎn)單我們只需要訪問(wèn)通訊錄結(jié)構(gòu)體里面的數(shù)組中的每個(gè)元素然后輸入對(duì)應(yīng)值就可以了
void AddCon(contact* pc)
{
assert(pc);
if (pc->sz == PON_MAX)
{
printf("通訊錄滿(mǎn)了?。n");
}
printf("請(qǐng)輸入姓名:>\n");
scanf("%s", pc->con[pc->sz].name);
printf("請(qǐng)輸入性別:>\n");
scanf("%s", pc->con[pc->sz].sex);
printf("請(qǐng)輸入年齡:>\n");
scanf("%d", &(pc->con[pc->sz].age));//注意年齡在這里是一個(gè)int類(lèi)型
printf("請(qǐng)輸入電話(huà)號(hào)碼:>\n");
scanf("%s", pc->con[pc->sz].tele);
printf("請(qǐng)輸入地址:>\n");
scanf("%s", pc->con[pc->sz].addr);
pc->sz++;
printf("此用戶(hù)添加成功!\n");
}
(3)打印通訊錄
打印通訊錄也很簡(jiǎn)單,利用一個(gè)for循環(huán)根據(jù)sz的大小遍歷結(jié)構(gòu)體中的數(shù)組每個(gè)元素并且打印即可
void PrintCon(const contact* pc)
{
assert(pc);
printf("%-15s %-5s %-5s %-12s %-30s\n","姓名","性別","年齡","電話(huà)","地址");
for (int i = 0; i < pc->sz; i++)
{
printf("%-15s %-5s %-5d %-12s %-30s\n", pc->con[i].name, pc->con[i].sex, pc->con[i].age, pc->con[i].tele, pc->con[i].addr);
}
}
(4)查找聯(lián)系人
查找聯(lián)系人這邊我們需要構(gòu)建一個(gè)函數(shù),這個(gè)函數(shù)需要去根據(jù)我們想要尋找的姓名去在通訊錄中尋找這個(gè)人所對(duì)應(yīng)的位置,加入找到了就可以返回對(duì)應(yīng)位置的下標(biāo),否則返回-1。找到之后就和打印通訊錄的操作差不多打印出來(lái)就好了。
int FindByName(const contact* pc, char* name)
{
assert(pc && name);
for (int i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->con[i].name, name))
return i;
}
return -1;
}//尋找或者刪除聯(lián)系人的下標(biāo)
void SearchCon(const contact* pc)
{
assert(pc);
char name[NAME_MAX];
printf("請(qǐng)輸入需要尋找用戶(hù)的名字:>\n");
scanf("%s", name);
int pos = FindByName(pc, name);//pos為要尋找的人的下標(biāo)
if (pos == -1)
{
printf("查無(wú)此人\n");
}
else
{
printf("%-15s %-5s %-5s %-12s %-30s\n", "姓名", "性別", "年齡", "電話(huà)", "地址");
printf("%-15s %-5s %-5d %-12s %-30s\n", pc->con[pos].name, pc->con[pos].sex, pc->con[pos].age, pc->con[pos].tele, pc->con[pos].addr);
}
}
(5)修改聯(lián)系人
關(guān)于修改聯(lián)系人這個(gè)內(nèi)容,大多數(shù)的代碼都是直接替換所有的內(nèi)容,這樣也會(huì)讓一些本來(lái)就不用修改的信息又被修改了一遍,很麻煩,所有我的設(shè)計(jì)是,先讓用戶(hù)查找到需要修改的這個(gè)人然后選擇是修改什么信息,然后重新輸入嘞一部分的信息,這個(gè)其實(shí)就和菜單選項(xiàng)實(shí)現(xiàn)很相似,我們需要利用枚舉變量,并且利用do...while語(yǔ)句來(lái)讓他一直循環(huán)直到輸入0為止,利用switch來(lái)根據(jù)用戶(hù)的選項(xiàng)來(lái)跳到需要的操作。
enum Con
{
ERRO,
NAME,
SEX,
AGE,
TELE,
ADDR
};
void ModifyCon(contact* pc)
{
assert(pc);
char name[NAME_MAX];
printf("請(qǐng)輸入需要修改信息用戶(hù)的名字:>\n");
scanf("%s", name);
int pos = FindByName(pc, name);//pos為要尋找的人的下標(biāo)
if (pos == -1)
{
printf("查無(wú)此人\n");
}
else
{
int num = 0;
do {
printf("請(qǐng)輸入你想修改此用戶(hù)的信息\n");
printf(" 0.退出 1.姓名 2.性別 3.年齡 4.電話(huà) 5.地址:>\n");
scanf("%d", &num);
switch (num)
{
case NAME:
printf("請(qǐng)輸入你想修改的姓名:>\n");
scanf("%s", pc->con[pos].name);
break;
case SEX:
printf("請(qǐng)輸入你想修改的性別:>\n");
scanf("%s", pc->con[pos].sex);
break;
case AGE:
printf("請(qǐng)輸入你想修改的年齡:>\n");
scanf("%d", &(pc->con[pos].age));
break;
case TELE:
printf("請(qǐng)輸入你想修改的電話(huà):>\n");
scanf("%s", pc->con[pos].tele);
break;
case ADDR:
printf("請(qǐng)輸入你想修改的地址:>\n");
scanf("%s", pc->con[pos].addr);
break;
case 0:
printf("不修改退回界面\n");
break;
default:printf("無(wú)效操作數(shù)!\n");
}
} while (num);
}
}
(6)刪除聯(lián)系人
這個(gè)操作也不算復(fù)雜,我的思路是,首先我們先利用剛剛查找的嘞個(gè)查找下標(biāo)的函數(shù),查找到我們需要尋找刪除聯(lián)系人的坐標(biāo),然后對(duì)他進(jìn)行刪除,刪除之后呢我們需要把后面的元素往前移動(dòng),這就要利用for循環(huán),但是對(duì)于for循環(huán)的次數(shù)要多加注意,因?yàn)樯圆恍⌒木蜁?huì)導(dǎo)致數(shù)組越界。
void DelCon(contact* pc)
{
assert(pc);
char name[NAME_MAX];
printf("請(qǐng)輸入需要?jiǎng)h除用戶(hù)的名字:>\n");
scanf("%s", name);
int pos = FindByName(pc, name);//pos為要尋找的人的下標(biāo)
if (pos == -1)
{
printf("查無(wú)此人\n");
}
else
{
for (int i = pos; i < pc->sz - 1; i++)
{
pc->con[i] = pc->con[i + 1];
}
pc->sz--;
printf("刪除成功!\n");
}
}
(7)排序通訊錄
這一步我們需要按照人名首字母的大小對(duì)于通訊錄進(jìn)行排序,就比如summer和banni,banni會(huì)在summer,這個(gè)排序其實(shí)和冒泡排序差不多,我們需要注意的是我們?cè)诮粨Q兩個(gè)數(shù)的時(shí)候我們需要定義的的嘞個(gè)中間數(shù)為聯(lián)系人結(jié)構(gòu)體類(lèi)型,以免出錯(cuò)
void SortCon(contact* pc)
{
if (pc->sz == 0)
{
printf("通訊錄中沒(méi)有聯(lián)系人\n");
}
else
{
for (int i = 0; i < pc->sz - 1; i++)
{
for (int j = 0; j < pc->sz - 1 - i; j++)
{
if ((strcmp(pc->con[j].name, pc->con[j + 1].name)) > 0)
{
Peo temp = pc->con[j];
pc->con[j] = pc->con[j + 1];
pc->con[j + 1] = temp;
}
}
}
printf("排序成功!\n");
}
}
這樣我們需要的一個(gè)通訊錄就這樣實(shí)現(xiàn)了!
三、關(guān)于通訊錄的優(yōu)化
這個(gè)通訊錄我們不難發(fā)現(xiàn)他有一個(gè)致命的缺點(diǎn),就是我們初始化的通訊錄大小為1000,但是當(dāng)我們存滿(mǎn)還想存元素的時(shí)候,編譯器就會(huì)給我們報(bào)錯(cuò),我們就需要繼續(xù)手動(dòng)增加空間,所以為了避免這樣我們可以利用動(dòng)態(tài)內(nèi)存分配來(lái)定義我們的通訊錄結(jié)構(gòu)體。
1、通訊錄結(jié)構(gòu)體的改進(jìn)
這邊我們可以把之前的結(jié)構(gòu)體里面的數(shù)組變成一個(gè)指針數(shù)組,并且為了考慮這個(gè)通訊錄來(lái)回刪除增加的緣故,一個(gè)sz來(lái)記錄數(shù)組元素個(gè)數(shù)是不行的,我們需要在設(shè)定一個(gè)值為數(shù)組最大的空間,當(dāng)sz和他相等的時(shí)候我們就需要擴(kuò)充這個(gè)數(shù)組。
typedef struct Contact
{
Peo* con;
int sz;//記錄數(shù)量
int max;//記錄通訊錄當(dāng)前的最大容量
}contact;2、初始化結(jié)構(gòu)體
這個(gè)初始化結(jié)構(gòu)體,我們需要sz初始化為0,并且為con這個(gè)指針開(kāi)辟一塊空間,并且賦予max一個(gè)初始值,這個(gè)初始值我們可以用宏來(lái)定義我們初始化通訊錄的大小
#define CON_MAX 3//通訊錄初始化大小
void InitCon(contact* pc)
{
assert(pc);
pc->sz = 0;
pc->max = CON_MAX;
pc->con = (Peo*)malloc(sizeof(Peo) * pc->max);
if (pc->con == NULL)
{
perror("InitContact::malloc");
return;
}
memset(pc->con, 0, pc->max * sizeof(Peo));
}3.增容
當(dāng)我們?cè)黾勇?lián)系人是sz == max的時(shí)候,我們可以利用realloc函數(shù)來(lái)實(shí)現(xiàn)擴(kuò)容,每一次擴(kuò)容兩個(gè)空間
void CheckCapacity(contact* pc)
{
//增容的代碼
if (pc->sz == pc->max)
{
Peo* tmp = (Peo*)realloc(pc->sz, (pc->max + 2) * sizeof(Peo));
if (tmp != NULL)
{
pc->sz = tmp;
}
else
{
perror("CheckCapacity::realloc");
return;
}
pc->max += 2;
printf("增容成功\n");
}
}4.釋放內(nèi)存
這邊我們可以構(gòu)建一個(gè)函數(shù)在這個(gè)程序結(jié)束之后釋放內(nèi)存
void DestroyContact(contact* pc)
{
free(pc->con);
pc->con = NULL;
pc->max = 0;
pc->sz = 0;
printf("銷(xiāo)毀成功\n");
}四、總結(jié)
這個(gè)通訊錄主要考察的是對(duì)于結(jié)構(gòu)體的訪問(wèn),還有對(duì)于結(jié)構(gòu)體的創(chuàng)建,在編碼的時(shí)候得務(wù)必細(xì)心,最后放上完整的源代碼供大家參考
#pragma once
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
//類(lèi)型的聲明
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
//通訊錄初始狀態(tài)的容量大小
#define DEFAULT_SZ 3
enum Option
{
EXIT,//0
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
PRINT
};
enum Con
{
ERRO,
NAME,
SEX,
AGE,
TELE,
ADDR
};
typedef struct PeoInfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
} PeoInfo;
typedef struct Contact
{
PeoInfo* data;//可以存放1000個(gè)人的信息
int sz;//記錄通訊中已經(jīng)保存的信息個(gè)數(shù)
int capacity;//記錄通訊錄當(dāng)前的最大容量
}Contact;
//函數(shù)的聲明
//初始化通訊錄
void InitContact(Contact* pc);
//銷(xiāo)毀通訊錄
void DestroyContact(Contact* pc);
//增加聯(lián)系人的信息
void AddContact(Contact* pc);
//打印通訊錄中的信息
void PrintContact(const Contact* pc);
//刪除指定聯(lián)系人
void DelContact(Contact* pc);
//查找指定聯(lián)系人
void SearchContact(const Contact* pc);
//保存通訊錄的信息到文件
void SaveContact(const Contact* pc);
//通訊錄排序
void SortCon(Contact* pc);
void ModifyCon(Contact* pc);
#define _CRT_SECURE_NO_WARNINGS 1
//動(dòng)態(tài)的版本
//void InitContact(Contact* pc)
//{
// assert(pc);
// pc->sz = 0;
// pc->capacity = DEFAULT_SZ;
// pc->data = (PeoInfo*)malloc(pc->capacity * sizeof(PeoInfo));
//
// if (pc->data == NULL)
// {
// perror("InitContact::malloc");
// return;
// }
// memset(pc->data, 0, pc->capacity * sizeof(PeoInfo));
//}
void CheckCapacity(Contact* pc)
{
//增容的代碼
if (pc->sz == pc->capacity)
{
PeoInfo* tmp = (PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(PeoInfo));
if (tmp != NULL)
{
pc->data = tmp;
}
else
{
perror("CheckCapacity::realloc");
return;
}
pc->capacity += 2;
printf("增容成功\n");
}
}
void LoadContact(Contact* pc)
{
//打開(kāi)文件
FILE* pf = fopen("contact.dat", "rb");
if (pf == NULL)
{
perror("LoadContact::fopen");
return;
}
//讀文件
PeoInfo tmp = { 0 };
while (fread(&tmp, sizeof(PeoInfo), 1, pf))
{
CheckCapacity(pc);
pc->data[pc->sz] = tmp;
pc->sz++;
}
//關(guān)閉文件
fclose(pf);
pf = NULL;
}
//初始化通訊錄 - 文件版本
void InitContact(Contact* pc)
{
assert(pc);
pc->sz = 0;
pc->capacity = DEFAULT_SZ;
pc->data = (PeoInfo*)malloc(pc->capacity * sizeof(PeoInfo));
if (pc->data == NULL)
{
perror("InitContact::malloc");
return;
}
memset(pc->data, 0, pc->capacity * sizeof(PeoInfo));
//加載文件信息到通訊錄中
LoadContact(pc);
}
void DestroyContact(Contact* pc)
{
free(pc->data);
pc->data = NULL;
pc->capacity = 0;
pc->sz = 0;
printf("銷(xiāo)毀成功\n");
}
void AddContact(Contact* pc)
{
assert(pc);
//靜態(tài)版本
//if (pc->sz == MAX)
//{
// printf("通訊錄已滿(mǎn),無(wú)法添加\n");
// return;
//}
//動(dòng)態(tài)的版本
CheckCapacity(pc);
//錄入信息
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 PrintContact(const Contact* pc)
{
assert(pc);
int i = 0;
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
//找到了返回下標(biāo)
//找不到返回-1
int FindByName(const Contact* pc, char name[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
void DelContact(Contact* pc)
{
assert(pc);
if (pc->sz == 0)
{
printf("通訊錄已空,無(wú)法刪除\n");
return;
}
//刪除
//1. 找到
char name[NAME_MAX] = { 0 };
printf("請(qǐng)輸入要?jiǎng)h除人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要?jiǎng)h除的人不存在\n");
return;
}
//2. 刪除
int j = 0;
for (j = pos; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("刪除成功\n");
}
void SearchContact(const Contact* pc)
{
char name[NAME_MAX] = { 0 };
printf("請(qǐng)輸入要查找人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址");
printf("%-20s %-5d %-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 SaveContact(const Contact* pc)
{
FILE* pf = fopen("contact.dat", "wb");
//回來(lái)本地建立一個(gè)contact.dat的記事本
if (pf == NULL)
{
perror("SaveContact::fopen");
return;
}
//寫(xiě)文件
int i = 0;
for (i = 0; i < pc->sz; i++)
{
fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
}
//關(guān)閉文件
fclose(pf);
pf = NULL;
}
void SortCon(Contact* pc)
{
if (pc->sz == 0)
{
printf("通訊錄中沒(méi)有聯(lián)系人\n");
}
else
{
for (int i = 0; i < pc->sz - 1; i++)
{
for (int j = 0; j < pc->sz - 1 - i; j++)
{
if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0)
{
PeoInfo temp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = temp;
}
}
}
printf("排序成功!\n");
}
}
void ModifyCon(Contact* pc)
{
assert(pc);
char name[NAME_MAX];
printf("請(qǐng)輸入需要修改信息用戶(hù)的名字:>\n");
scanf("%s", name);
int pos = FindByName(pc, name);//pos為要尋找的人的下標(biāo)
if (pos == -1)
{
printf("查無(wú)此人\n");
}
else
{
int num = 0;
do {
printf("請(qǐng)輸入你想修改此用戶(hù)的信息\n");
printf(" 0.退出 1.姓名 2.性別 3.年齡 4.電話(huà) 5.地址:>\n");
scanf("%d", &num);
switch (num)
{
case NAME:
printf("請(qǐng)輸入你想修改的姓名:>\n");
scanf("%s", pc->data[pos].name);
break;
case SEX:
printf("請(qǐng)輸入你想修改的性別:>\n");
scanf("%s", pc->data[pos].sex);
break;
case AGE:
printf("請(qǐng)輸入你想修改的年齡:>\n");
scanf("%d", &(pc->data[pos].age));
break;
case TELE:
printf("請(qǐng)輸入你想修改的電話(huà):>\n");
scanf("%s", pc->data[pos].tele);
break;
case ADDR:
printf("請(qǐng)輸入你想修改的地址:>\n");
scanf("%s", pc->data[pos].addr);
break;
case 0:
printf("不修改退回界面\n");
break;
default:printf("無(wú)效操作數(shù)!\n");
}
} while (num);
}
}
void menu()
{
printf("*****************************************\n");
printf("**** 1.增加聯(lián)系人 2.刪除聯(lián)系人 ****\n");
printf("**** 3.查找聯(lián)系人 4.修改聯(lián)系人 ****\n");
printf("**** 5.通訊錄排序 6.打印通訊錄 ****\n");
printf("**** 0.退出 ****\n");
printf("******************************************\n");
}
void test()
{
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:
ModifyCon(&con);
break;
case SORT:
SortCon(&con);
break;
case PRINT:
PrintContact(&con);
break;
case EXIT:
SaveContact(&con);
DestroyContact(&con);
printf("感謝使用\n");
break;
default:
printf("非法輸入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
感謝閱讀?。。?!
到此這篇關(guān)于c語(yǔ)言實(shí)現(xiàn)通訊錄管理系統(tǒng)的文章就介紹到這了,更多相關(guān)c語(yǔ)言通訊錄管理系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言通訊錄管理系統(tǒng)完整版
- C語(yǔ)言通訊錄管理系統(tǒng)課程設(shè)計(jì)
- C語(yǔ)言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)通訊錄管理系統(tǒng)
- 基于C語(yǔ)言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng)
- C語(yǔ)言通訊錄管理系統(tǒng)完整代碼
- C語(yǔ)言單鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng)
- C語(yǔ)言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄管理系統(tǒng)
相關(guān)文章
C++ LibCurl實(shí)現(xiàn)Web指紋識(shí)別功能
Web指紋識(shí)別是一種通過(guò)分析Web應(yīng)用程序的特征和元數(shù)據(jù),以確定應(yīng)用程序所使用的技術(shù)棧和配置的技術(shù),本文將通過(guò)C++中LibCurl庫(kù)實(shí)現(xiàn)簡(jiǎn)單是指紋識(shí)別功能,感興趣的可以了解下2023-11-11
VC實(shí)現(xiàn)對(duì)話(huà)框窗口任意分割
最近寫(xiě)MFC的程序,想在對(duì)話(huà)框里實(shí)現(xiàn)窗口的任意分割?,F(xiàn)在網(wǎng)絡(luò)資料一大抄,找個(gè)東西實(shí)在麻煩??偹氵@個(gè)很簡(jiǎn)單,很快就搞定了,寫(xiě)下來(lái)做個(gè)筆記。2015-06-06
C語(yǔ)言實(shí)現(xiàn)對(duì)bmp格式圖片打碼
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)對(duì)bmp格式圖片打碼2016-01-01
C++實(shí)現(xiàn)求動(dòng)態(tài)矩陣各元素的和
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)求動(dòng)態(tài)矩陣各元素的和,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
解析c++ 中智能指針引用計(jì)數(shù)為什么不是0原理
這篇文章主要為大家介紹了C語(yǔ)言中智能指針引用計(jì)數(shù)為什么不是0原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

