大人们总想着去解释,可他们忘了语言本来就是误会的根源。
这是我自己做的第三个小项目---通讯录项目。后期我会继续制作其他小项目并开源至博客上。 上一小项目是猜数字游戏,没看过的同学可以去看看: 有关猜数字游戏的小项目
1. 通过实战项目巩固自己对数据结构中顺序表的理解。 2. 制作一个通讯录,实现增添、删减、查找、打印、修改联系人的目的。
#define _CRT_SECURE_NO_WARNINGS
#define name_lenth 20
#define gander_num 10
#define telephone_num 20
#define address_num 20
#define MAX 100
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
//定义成员信息结构体
typedef struct PerInfo
{
char name[name_lenth];
char sex[gander_num];
int age;
char tele[telephone_num];
char addr[address_num];
}PerInfo;
//定义顺序表结构体
typedef struct Contact
{
PerInfo data[MAX];
int size;
}Contact;
//打印菜单
void nume();
//创建通讯录1
void ContactInit(Contact* con);
//销毁通讯录
void ContactDestory(Contact* con);
//增添联系人1
void ContactAdd(Contact* con);
//删除联系人1
void ContactDelete(Contact* con);
//修改联系人1
void ContactChange(Contact* con);
//查找联系人1
void ContactSearch(Contact* con);
//展示通讯录所有联系人1
void ContactShow(Contact* con);1. 在 contact.h 文件中,我们存放结构体和函数的声明,以及各种库的引用。 2. 在定义成员信息结构体时,我们使用大量宏定义,方便我们后期修改、扩容等。 3. 我们这里创建的是定容的通讯录,使用的是静态顺序表。
#include "contact.h"
//菜单函数
void nume()
{
printf("*******************************\n");
printf("********通讯录管理系统*********\n");
printf("***1.add************2.delete***\n");
printf("***3.search*********4.change***\n");
printf("***5.show**********6.destory***\n");
printf("***********0.exit**************\n");
printf("*******************************\n");
return;
}
//创建通讯录
void ContactInit(Contact* con)
{
assert(con);
con->size = 0;
memset(con->data, 0, sizeof(con->data));
return;
}
//增添联系人
void ContactAdd(Contact* con)
{
assert(con);
if (con->size == MAX)
{
printf("通讯录已满,需要进一步扩容!\n");
return;
}
else
{
printf("请输入名字:");
scanf("%s", con->data[con->size].name);
printf("请输入年龄:");
scanf("%d", &(con->data[con->size].age));
printf("请输入性别:");
scanf("%s", con->data[con->size].sex);
printf("请输入电话:");
scanf("%s", con->data[con->size].tele);
printf("请输入地址:");
scanf("%s", con->data[con->size].addr);
con->size++;
printf("增加成功\n");
}
return;
}
//删除联系人
void ContactDelete(Contact* con)
{
assert(con);
if (con->size == 0)//先要看通讯录是否为空
{
printf("通讯录为空,无法删除\n");
return;
}
printf("请输入要删除人的名字:");
char name[100] = { 0 };
scanf("%s", name);
for ( int i = 0; i < con->size; i++)
{
if (strcmp(con->data[i].name, name) == 0)//对比数据是否相同
{
for (int n = i; n< con->size; n--)
{
con->data[n] = con->data[n - 1];
}
con->size--;
printf("删除成功\n");
}
}
printf("查无此人!\n");
return;
}
//展示通讯录所有联系人
void ContactShow(Contact* con)
{
assert(con);
if (con->size == 0)
{
printf("还未存放任何通讯录成员!\n");
return;
}
else
{
int i = 0;
printf("%-15s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");
for (i = 0; i < con->size; i++)
{
printf("%-15s%-5d%-5s%-12s%-30s%\n",con->data[i].name, con->data[i].age, con->data[i].sex, con->data[i].tele, con->data[i].addr);
}
printf("打印完成\n");
}
return;
}
//查找联系人
void ContactSearch(Contact* con)
{
assert(con);
printf("请输入你要查找的联系人姓名!");
char name[20] = { 0 };
scanf("%s", name);
int i = 0;
for (i = 0; i < con->size; i++)
{
if (strcmp(con->data[i].name, name) == 0)//对比数据是否相同
{
printf("确实有此人!\n");
printf("这个人在通讯录中的序号是:%d\n", i);
printf("%-15s%-5d%-5s%-12s%-30s%\n", con->data[i].name, con->data[i].age, con->data[i].sex, con->data[i].tele, con->data[i].addr);
return;
}
}
printf("查无此人!\n");
return;
}
//修改联系人
void ContactChange(Contact* con)
{
assert(con);
char name[100];
printf("请输入要修改人的名字:");
scanf("%s", name);
for (int i = 0; i < con->size; i++)
{
if (strcmp(con->data[i].name, name) == 0)//对比数据是否相同
{
printf("请输入名字:");
scanf("%s", con->data[i].name);
printf("请输入年龄:");
scanf("%d", &(con->data[con->size].age));
printf("请输入性别:");
scanf("%s", con->data[i].sex);
printf("请输入电话:");
scanf("%s", con->data[i].tele);
printf("请输入地址:");
scanf("%s", con->data[i].addr);
printf("修改成功!\n");
}
}
printf("查无此人!\n");
return;
}
//销毁通讯录
void ContactDestory(Contact* con)
{
assert(con);
con->size = 0;
memset(con->data, 0, sizeof(con->data));
}1. 在 contact.c 文件中,我们存放各种函数的实现。 2. 我们使用指针来接受通讯录结构体,使用地址传值。 3. 在后期,我们需要不断的改进函数,使得我们的通讯录更加直接美观。
#include "contact.h"
int main()
{
system("title 通讯录");
int input = 0;
Contact con;
ContactInit(&con);
printf("This is a contact list made by HSY.");
do
{
Sleep(2000);
system("cls");
nume();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
ContactAdd(&con);
break;
case 2:
ContactDelete(&con);
break;
case 3:
ContactSearch(&con);
break;
case 4:
ContactChange(&con);
break;
case 5:
ContactShow(&con);
break;
case 6:
ContactDestory(&con);
break;
case 0:
printf("已经退出通讯录!\n");
break;
default:
printf("输入有问题,请重新输入:\n");
break;
}
} while (input);
return 0;
}1. 在 test.c 文件中,我们存放主函数,通过switch选择结构来实现。 2. 后期我们也需要在这里补充各种小细节,如:Sleep(2000);system("cls");等,来完善这个项目。
感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!