目录
前言
学习了这么长时间的C语言,越来越让我有想写一些项目的冲动,今天我就带了通讯录的模拟及实现
一、思路阶段
既然要写一个通讯录,我们就要想一个通讯录应该有对联系人的增删查改的基本功能,同时通讯录是没有大小限制的,所以我们想到了动态开辟一个通讯录数组。
通讯录中的基本元素一个人,我们希望储存他的姓名,年龄,性别,年龄,地址等基本信息,我们就想到了可以通过创建一个·结构体,将一个人的基本元素打包在一起。同时往大了看,一个通讯录有很多个人,通讯录需要记录每一个人和当前的人数,我们就想到了,和描述一个人同样的原理,用一个结构体来解决它,但是前面我们想到要使用动态开辟,所以通讯录结构体中存放的是一个指针,然后在main函数中创建通讯录结构体,既然是一个不限容量的通讯录,所以后面必定会出现要给通讯录扩容的情况,所以要单独写一个函数来判断通讯录需不需要扩容。
然就要分模块来实现各个功能
首先是增加联系人的功能,我们需要预先开辟能够容纳2~3人的空间,然后找到那个人,将当前联系人的信息分别输入进去,使通讯录中记录联系人个数的变量自增。
其次是实现查找联系人的功能,因为它他重要了,这个功能是删查改联系人的基础,你必须先能够找到那个人,才能进行下一步操作,查找联系人,我们先让他能够按联系人姓名来查找,并且需要写一个循环来能够使用户反复查找,并留出出口然后用户自己选择是否继续查找
查找完,我们就想到了,查找完,我们用户需要知道它的信息,所以就需要打印出通讯录成员,而打印十分简单我们只需要遍历一遍通讯录就可以了,这个是没有什么简便方法。然后就到了,删除联系人了,删除:我们先打印出所有的联系人,然后让用户自己输入想要删除联系人的姓名,已被删除的下标为起点,我们让后面的通讯录成员向前移动1位,然后使记录通讯录联系人多少的变量减一。最复杂的是修改联系人,我们可以修改联系人的姓名,年龄,地址,电话号。因此我们还需要一个菜单供用户选择,修改,还是要让用户输入联系人姓名,我们遍历通讯录寻找这个联系人,区分找到了和找不到两种情况,这时就需用循环,让用户自己决定是否退出修改,因为修改可能要修改不只一个信息。最后是退出程序,退出我们需要主动释放前面动态内存开辟的空间。
二、代码实现
1.game.h
#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
typedef struct People//定义一个人
{
char name[10];
char sex[3];
int age;
char addr[20];
int tele[12];
}People;
typedef struct Contact//创建通讯录by动态开辟
{
People* data;//动态开辟联系人
int capacity;//联系人最大容量
int sz;//当前通讯录的人数
}Contact;
//通讯录菜单选项
enum choce
{
Exit,
Add,
Del,
Find,
Print,
Modification
};
//修改联系人菜单选项
enum Del
{
EXIT,
name,
age,
addr,
sex,
tele,
};
//函数声明
//初始化通讯录
void InitContact(Contact* pc);
//增加联系人
void AddContact(Contact* pc);
//查找联系人
void SearchContact(Contact* pc);
//打印联系人
void PrintContact(Contact* pc);
//修改联系人
void ModificationContact(Contact* pc);
//退出通讯录
void ExitContact(Contact* pc);
//找到联系人返回联系袭人下标
int FindPeople(const Contact* pc, char *name);
//删除联系人
void DelContact(Contact* pc);
//修改联系人菜单
void menu2();
//检查通讯录是否已满
void checkcapacity(Contact* pc);
2.game.c
#include"game.h"
//初始化通讯录
void InitContact(Contact* pc)
{
assert(pc);
pc->data = (People*)malloc(sizeof(Contact)*3);
if (pc->data == NULL)
{
perror("malloc");
return;
}
pc->capacity = 3;
pc->sz = 0;
memset(pc->data, 0, sizeof(People)*(pc->capacity));
}
//增加联系人
void AddContact(Contact* pc)
{
assert(pc);
checkcapacity(pc);
printf("请输入联系人的姓名\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入联系人的年龄\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入联系人的性别\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入联系人的电话号码\n");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入联系人的地址\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("添加成功\n");
}
//查找联系人
void SearchContact(Contact* pc)
{
assert(pc);
printf("请输入要查找的联系人姓名\n");
char name[12] = { 0 };
scanf("%s", name);
int i = FindPeople(pc, name);
if (i!=-1)
{
printf("%-5s%-2c%-2d%-5s%-5s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
}
else
{
printf("无法找到该联系人\n");
}
}
//检查通讯录是否已满
void checkcapacity(Contact*pc)
{
assert(pc);
if (pc->capacity == pc->sz)
{
Contact* ptr = (Contact*)realloc(pc->data, sizeof(Contact) * (pc->capacity + 2));
if (ptr == NULL)
{
perror("checkcapacity recalloc");
return;
}
pc = ptr;
pc->capacity += 2;
}
}
//退出程序,并销毁通讯录,释放内存
void ExitContact(Contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
pc->capacity = 0;
pc->sz = 0;
printf("退出成功\n");
}
3.test.c
#include"game.h"
void menu1()
{
printf("\n");
printf("*************************\n");
printf("*** 1.add 2.del ***\n");
printf("*** 3.find 4.print ***\n");
printf("*** 5.modification ***\n");
printf("*** 0. exit ***\n");
printf("*************************\n");
printf("\n");
}
int main()
{
int input = 0;
//创建联系人
Contact con;
//通讯录初始化
InitContact(&con);
do
{
menu1();
printf("请选择:> \n");
scanf("%d", &input);
switch (input)
{
case Add:
AddContact(&con);
break;
case Del:
DelContact(&con);
break;
case Find:
SearchContact(&con);
break;
case Print:
PrintContact(&con);
break;
case Modification:
ModificationContact(&con);
break;
case Exit:
ExitContact(&con);
printf("退出通讯录\n");
break;
default:
printf("操作无效,请重新选择\n");
break;
}
} while (input);
return 0;
}
总结
以上就是通讯录的思路及其代码的实现