?前言:本通訊錄管理系統(tǒng)一共三個版本,除此文章以外還有如下倆個版本,大家可以根據(jù)需求自?。?/p>
動態(tài)分配內(nèi)測版:c語言:通訊錄管理系統(tǒng)(動態(tài)分配內(nèi)存版)-CSDN博客
文件版本:c語言:通訊錄管理系統(tǒng)(文件版本)-CSDN博客
目錄
一.大體的框架
主函數(shù)初步設(shè)計
聯(lián)系人的數(shù)據(jù)結(jié)構(gòu)設(shè)計
菜單目錄
二.初始化通訊錄內(nèi)容
三.增加聯(lián)系人
四.刪除聯(lián)系人信息
五.查詢聯(lián)系人信息
六.修改聯(lián)系人的信息
完整代碼?
Contct.h
Contact.cpp
test.cpp
一.大體的框架
我們分為 3 個文件來設(shè)計:
- Contact.h:?包含頭文件的聲明,對函數(shù)的聲明,以及宏的申明
- Contact.cpp:?通訊錄管理系統(tǒng)中具體每一個函數(shù)的實(shí)現(xiàn)
- test.cpp:?主函數(shù),根據(jù)用戶的選擇進(jìn)行調(diào)用相應(yīng)的函數(shù)
主函數(shù)初步設(shè)計
????????主函數(shù)中,我們用 do...while... 來完成用戶持續(xù)使用通訊錄管理系統(tǒng)的需求,當(dāng)用戶不想再使用通訊錄后只要輸入 0 就可以結(jié)束 do...while... 循環(huán)從而結(jié)束整個程序
? ? ? ? 后續(xù)編程中,我們只需要對各個輸入的函數(shù)進(jìn)行補(bǔ)充就可以了,同時在枚舉類型 options 中從上往下是從 0 開始的賦值,這樣更方便我們理解閱讀,增強(qiáng)了程序的可讀性
//枚舉,增加程序的可讀性
enum options
{
EXIT,
ADD,
DEL,
SEACH,
MODIFY,
SHOW
};
int main()
{
int input = 0;
//創(chuàng)建通訊錄
Contact con;
//初始化通訊錄
InitContact(&con);
do
{
menu();
printf("請輸入你的選擇: ");
scanf("%d", &input);
switch (input)
{
//增加聯(lián)系人信息
case ADD:
break;
//刪除聯(lián)系人信息
case DEL:
break;
//查找某個聯(lián)系人的信息
case SEACH:
break;
//修改某個聯(lián)系人的信息
case MODIFY:
break;
//展示通訊錄內(nèi)的每一個聯(lián)系人的信息
case SHOW:
break;
//退出通訊錄管理系統(tǒng)
case EXIT:
printf("通訊錄已退出\n");
break;
//預(yù)防非法輸入
default:
printf("輸入錯誤,請重新輸入\n");
break;
}
}while(input);
return 0;
}
聯(lián)系人的數(shù)據(jù)結(jié)構(gòu)設(shè)計
????????使用倆個結(jié)構(gòu)體來完成我們設(shè)計的需求,一個結(jié)構(gòu)體 PeopleInformation 用來保存每一個用戶的各種信息,另一個結(jié)構(gòu)體?Contact 用來保存整個通訊錄的信息,而在通訊錄的信息中就得包含每一個用戶的信息,因此我們將?PeopleInformation結(jié)構(gòu)體 嵌套在 結(jié)構(gòu)體Contact 中
? ? ? ? 使用宏定義來方便我們后續(xù)修改調(diào)整數(shù)據(jù)大小,同時也可以增加程序的可讀性
#define Name_Max 20
#define Tel_Number 12
#define Sex_Max 5
#define Address_Max 30
#define Contact_Max 100
//聯(lián)系人結(jié)構(gòu)體
typedef struct PeopleInformation
{
char name[Name_Max];
char telnumber[Tel_Number];
int age;
char sex[Sex_Max];
char address[Address_Max];
}PeoInfor;
//通訊錄結(jié)構(gòu)體
typedef struct Contact
{
PeoInfor data[Contact_Max];//存放聯(lián)系人結(jié)構(gòu)體
int size;//記錄當(dāng)前通訊錄中有多少個聯(lián)系人
}Contact;
菜單目錄
剩下的就只有根據(jù)我們的菜單目錄來設(shè)計每一個函數(shù)的具體實(shí)現(xià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.顯示全部信息 -----\n");
printf("--- 0.退出通訊錄 -----\n");
printf("-----------------------------\n");
}
二.初始化通訊錄內(nèi)容
為了方便,我們將通訊錄中每一個人的全部信息置 0
void InitContact(Contact* cp)
{
//判斷非空
assert(cp);
cp->size = 0;
memset(cp->date, 0, sizeof(cp->date));
}
三.增加聯(lián)系人
????????在增加之前先進(jìn)行判斷,首先要判斷傳入的指針非空,其次要判斷當(dāng)前情況下通訊錄是否已經(jīng)滿了,如果滿了就告訴用戶通訊錄已滿,如果沒有滿再進(jìn)行添加新的聯(lián)系人
接下來分別使用指針進(jìn)行訪問輸入就可以了,這里我們通過添加聯(lián)系人姓名進(jìn)行舉例講解:
????????首先,我們添加聯(lián)系人的函數(shù)拿到的參數(shù)是一個指針,指向通訊錄結(jié)構(gòu)體,這個結(jié)構(gòu)體中有倆個成員,一是我們要存放的數(shù)據(jù),二是當(dāng)前結(jié)構(gòu)體有多少個聯(lián)系人,那我們就需要利用這個指針在訪問我們要存放是數(shù)據(jù),所以是 cp->data 這樣的操作使我們訪問到了通訊錄結(jié)構(gòu)體的數(shù)據(jù)數(shù)組,然后我再根據(jù)數(shù)組的下標(biāo)來訪問每一個單獨(dú)的聯(lián)系人的數(shù)據(jù)
? ? ? ? 在這里利用通訊錄結(jié)構(gòu)體中的第二個成員 cp->size 來幫助我們訪問到數(shù)據(jù)數(shù)組中單個聯(lián)系人的內(nèi)容,在用 “ .?” 訪問單個聯(lián)系人的每一條成員變量,從而進(jìn)行賦值操作
void AddContact(Contact* cp)
{
//判斷非空
assert(cp);
//判斷未滿
if (cp->size == Contact_Max)
{
printf("通訊錄已滿,無法再添加新的聯(lián)系人\n");
return;
}
printf("請輸入要添加的聯(lián)系人的姓名:\n");
scanf("%s", cp->data[cp->size].name);
printf("請輸入要添加的聯(lián)系人的電話號:\n");
scanf("%s", cp->data[cp->size].telnumber);
printf("請輸入要添加的聯(lián)系人的年齡:\n");
scanf("%d", &(cp->data[cp->size].age));
printf("請輸入要添加的聯(lián)系人的性別:\n");
scanf("%s", cp->data[cp->size].sex);
printf("請輸入要添加的聯(lián)系人的住址:\n");
scanf("%s", cp->data[cp->size].address);
cp++;
printf("添加成功\n");
}
四.刪除聯(lián)系人信息
????????刪除聯(lián)系人之前我們首先需要做的就是查詢到聯(lián)系人,只有找到聯(lián)系人后,才能完成刪除的工作,因此,我們先封裝一個函數(shù)通過聯(lián)系人的姓名進(jìn)行查找,對整個結(jié)構(gòu)體數(shù)組遍歷,然后使用 strcmp 函數(shù)來比較用戶輸入的名字和我們要查找的名字,這樣就可以找出聯(lián)系人,并且返回數(shù)組的下標(biāo),如果沒有找到就返回 -1?
int FindPeople(Contact* cp, char name[])
{
assert(cp);
for (int i = 0; i < cp->size; i++)
{
if (strcmp(cp->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
????????找到要刪除的元素的位置后,我們就將整個數(shù)組從后往前覆蓋,這樣就達(dá)到了刪除聯(lián)系人的信息的目的
void DelContact(Contact* cp)
{
assert(cp);
char name[Name_Max];
if (cp->size == 0)
{
printf("通訊錄為空,無需刪除\n");
return;
}
printf("請輸入選擇刪除的聯(lián)系人的姓名:\n");
scanf("%s", name);
int ret = FindPeople(cp, name);
if (ret == -1)
{
printf("要刪除的聯(lián)系人不存在\n");
return;
}
for (int i = ret; i < cp->size; i++)
{
cp->data[i] = cp->data[i + 1];
}
cp->size--;
printf("刪除成功\n");
}
五.查詢聯(lián)系人信息
查詢在剛才查找到的基礎(chǔ)上進(jìn)行打印輸出就可以了
void SeachPeople(Contact* cp)
{
assert(cp);
char name[Name_Max];
if (cp->size == 0)
{
printf("通訊錄為空\n");
return;
}
printf("請輸入選擇查找的聯(lián)系人的姓名:\n");
scanf("%s", name);
int ret = FindPeople(cp, name);
if (ret == -1)
{
printf("要查找的聯(lián)系人不存在\n");
return;
}
//名字 年齡 性別 電話 地址
//xxx xxx xxx xxx xxx
printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");
//打印個人的信息
printf("%-20s%-5d%-5s%-12s%-30s\n", cp->data[ret].name, cp->data[ret].age, cp->data[ret].sex, cp->data[ret].telnumber, cp->data[ret].address);
}
六.修改聯(lián)系人的信息
大體思路也和上面一樣,先找到聯(lián)系人的在數(shù)組中的位置,然后再進(jìn)行修改
void ModifyContact(Contact* cp)
{
assert(cp);
char name[Name_Max];
if (cp->size == 0)
{
printf("通訊錄為空\n");
return;
}
printf("請輸入選擇修改的聯(lián)系人的姓名:\n");
scanf("%s", name);
int ret = FindPeople(cp, name);
if (ret == -1)
{
printf("要修改的聯(lián)系人信息不存在\n");
return;
}
printf("請輸入要修改的聯(lián)系人的姓名:\n");
scanf("%s", cp->data[ret].name);
printf("請輸入要修改的聯(lián)系人的電話號:\n");
scanf("%s", cp->data[ret].telnumber);
printf("請輸入要修改的聯(lián)系人的年齡:\n");
scanf("%d", &(cp->data[ret].age));
printf("請輸入要修改的聯(lián)系人的性別:\n");
scanf("%s", cp->data[ret].sex);
printf("請輸入要修改的聯(lián)系人的住址:\n");
scanf("%s", cp->data[ret].address);
printf("修改成功\n");
}
完整代碼?
Contct.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define Name_Max 20
#define Tel_Number 12
#define Sex_Max 5
#define Address_Max 30
#define Contact_Max 100
//聯(lián)系人結(jié)構(gòu)體
typedef struct PeopleInformation
{
char name[Name_Max];
char telnumber[Tel_Number];
int age;
char sex[Sex_Max];
char address[Address_Max];
}PeoInfor;
//通訊錄結(jié)構(gòu)體
typedef struct Contact
{
PeoInfor data[Contact_Max];//結(jié)構(gòu)體數(shù)組存放聯(lián)系人結(jié)構(gòu)體
int size;//記錄當(dāng)前通訊錄中有多少個聯(lián)系人
}Contact;
//目錄
void menu();
//初始化通訊錄
void InitContact(Contact* cp);
//增加聯(lián)系人
void AddContact(Contact* cp);
//刪除聯(lián)系人
void DelContact(Contact* cp);
//通過姓名進(jìn)行查找聯(lián)系人
int FindPeople(Contact* cp, char name[]);
//展示全部通訊錄信息
void ShowContact(const Contact* cp);
//查詢聯(lián)系人
void SeachPeople(Contact* cp);
//修改聯(lián)系人信息
void ModifyContact(Contact* cp);
Contact.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void menu()
{
printf("\n");
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("--- 0.退出通訊錄 -----\n");
printf("-----------------------------\n");
}
//初始化通訊錄
void InitContact(Contact* cp)
{
//判斷非空
assert(cp);
cp->size = 0;
memset(cp->data, 0, sizeof(cp->data));
}
//增加聯(lián)系人
void AddContact(Contact* cp)
{
//判斷非空
assert(cp);
//判斷未滿
if (cp->size == Contact_Max)
{
printf("通訊錄已滿,無法再添加新的聯(lián)系人\n");
return;
}
printf("請輸入要添加的聯(lián)系人的姓名:\n");
scanf("%s", cp->data[cp->size].name);
printf("請輸入要添加的聯(lián)系人的電話號:\n");
scanf("%s", cp->data[cp->size].telnumber);
printf("請輸入要添加的聯(lián)系人的年齡:\n");
scanf("%d", &(cp->data[cp->size].age));
printf("請輸入要添加的聯(lián)系人的性別:\n");
scanf("%s", cp->data[cp->size].sex);
printf("請輸入要添加的聯(lián)系人的住址:\n");
scanf("%s", cp->data[cp->size].address);
cp->size++;
printf("添加成功\n");
}
//通過姓名進(jìn)行查找聯(lián)系人
int FindPeople(Contact* cp, char name[])
{
assert(cp);
for (int i = 0; i < cp->size; i++)
{
if (strcmp(cp->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//刪除聯(lián)系人
void DelContact(Contact* cp)
{
assert(cp);
char name[Name_Max];
if (cp->size == 0)
{
printf("通訊錄為空,無需刪除\n");
return;
}
printf("請輸入選擇刪除的聯(lián)系人的姓名:\n");
scanf("%s", name);
int ret = FindPeople(cp, name);
if (ret == -1)
{
printf("要刪除的聯(lián)系人不存在\n");
return;
}
for (int i = ret; i < cp->size-1 ; i++)
{
cp->data[i] = cp->data[i + 1];
}
cp->size--;
printf("刪除成功\n");
}
//查詢聯(lián)系人
void SeachPeople(Contact* cp)
{
assert(cp);
char name[Name_Max];
if (cp->size == 0)
{
printf("通訊錄為空\n");
return;
}
printf("請輸入選擇查找的聯(lián)系人的姓名:\n");
scanf("%s", name);
int ret = FindPeople(cp, name);
if (ret == -1)
{
printf("要查找的聯(lián)系人不存在\n");
return;
}
//名字 年齡 性別 電話 地址
//xxx xxx xxx xxx xxx
printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");
//打印個人的信息
printf("%-10s%-5d%-5s%-12s%-30s\n", cp->data[ret].name, cp->data[ret].age, cp->data[ret].sex, cp->data[ret].telnumber, cp->data[ret].address);
}
//展示全部通訊錄信息
void ShowContact(const Contact* cp)
{
assert(cp);
if (cp->size == 0)
{
printf("通訊錄為空\n");
return;
}
//名字 年齡 性別 電話 地址
//xxx xxx xxx xxx xxx
printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");
for (int i = 0; i < cp->size; i++)
{
//打印每個人的信息
printf("%-10s%-5d%-5s%-12s%-30s\n",cp->data[i].name, cp->data[i].age, cp->data[i].sex, cp->data[i].telnumber, cp->data[i].address);
}
}
//修改聯(lián)系人信息
void ModifyContact(Contact* cp)
{
assert(cp);
char name[Name_Max];
if (cp->size == 0)
{
printf("通訊錄為空\n");
return;
}
printf("請輸入選擇修改的聯(lián)系人的姓名:\n");
scanf("%s", name);
int ret = FindPeople(cp, name);
if (ret == -1)
{
printf("要修改的聯(lián)系人信息不存在\n");
return;
}
printf("請輸入要修改的聯(lián)系人的姓名:\n");
scanf("%s", cp->data[ret].name);
printf("請輸入要修改的聯(lián)系人的電話號:\n");
scanf("%s", cp->data[ret].telnumber);
printf("請輸入要修改的聯(lián)系人的年齡:\n");
scanf("%d", &(cp->data[ret].age));
printf("請輸入要修改的聯(lián)系人的性別:\n");
scanf("%s", cp->data[ret].sex);
printf("請輸入要修改的聯(lián)系人的住址:\n");
scanf("%s", cp->data[ret].address);
printf("修改成功\n");
}
test.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
//枚舉,增加程序的可讀性
enum options
{
EXIT,
ADD,
DEL,
SEACH,
MODIFY,
SHOW
};
int main()
{
int input = 0;
//創(chuàng)建通訊錄
Contact con;
//初始化通訊錄
InitContact(&con);
do
{
menu();
printf("請輸入你的選擇: ");
scanf("%d", &input);
switch (input)
{
//增加聯(lián)系人信息
case ADD:
AddContact(&con);
break;
//刪除聯(lián)系人信息
case DEL:
DelContact(&con);
break;
//查找某個聯(lián)系人的信息
case SEACH:
SeachPeople(&con);
break;
//修改某個聯(lián)系人的信息
case MODIFY:
ModifyContact(&con);
break;
//展示通訊錄內(nèi)的每一個聯(lián)系人的信息
case SHOW:
ShowContact(&con);
break;
//退出通訊錄管理系統(tǒng)
case EXIT:
printf("通訊錄已退出\n");
break;
//預(yù)防非法輸入
default:
printf("輸入錯誤,請重新輸入\n");
break;
}
}while(input);
return 0;
}
????????文章來源:http://www.zghlxwxcb.cn/news/detail-714048.html
????????本次的分享就到此為止了,本文不涉及到文件操作,下篇文章,筆者將為大家?guī)砣绾瓮ㄟ^文件操作,將我們的通訊錄防止在文件中,以便我們多次重復(fù)打開和操作,如有錯誤,歡迎積極指出,感謝您的支持文章來源地址http://www.zghlxwxcb.cn/news/detail-714048.html
到了這里,關(guān)于c語言:通訊錄管理系統(tǒng)(增刪查改)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!