**
适合大学生课设的通讯录
一.通讯录实现步骤
1. 详解做法思路
首先,通讯录需要一个人的基本信息,像姓名,电话,住址,年龄等等,,所以对于一个对象我们需要创建结构体来存储这些信息
typedef struct information
{
char name[NAME_MAX];
int age;
char phone[PHONE_MAX];
char address[ADDESS_MAX];
}information;
由于有很多人的信息,所以我们需要定义一个数组,类型就是我们上面定义的这个结构体类型,但是我们因为要记录有多少个人(对于方便增删查改来说),所以要定义一个变量来记录我们现在数组里有多少人
information pb[100]; int sz = 0;
但是想一想是不是我们一修改信息,sz也会发生改变,所以我们为了方便,把它两合并在一起,在封装一个结构体:Contact
typedef struct Contact
{
information data[MAX];
int sz;
}Contact;
这样我们就更加方便了,然后就基本确定类型了,接下来就是操作了
2.通讯录的初始化
对于通讯录要初始化,我们可一个存放信息的数组初始化,可以采用一个函数:memset函数:void *memset( void *dest, int c, size_t count );
这个函数参数:dest这个指针是代表要进行操作的起始地址,第二个参数c代表的是要初始化为啥,像初始化为0,'X’等等都可以,第三个参数count代表要改变多少个字节,这个size_t类型,实际上是unsigned int类型,所以我们初始化可以使用这个函数,对于sz也一定要初始化为0,因为代表元素个数,对于初始化我闷=们需要定义一个函数,然后参数是我们定义的Contact一个指针变量
void InitContact(Contact* pc);
void InitContact(Contact* pc)
{
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
}
3.通讯录增加操作
对于通讯录增加操作就需要先判断是否有空间存储,即判断sz是否于定义的数组最大值MAX是否相同
if (pc->sz == MAX)
{
printf("通讯录满了");
return;
}
然后不满的话,就进行增加的操作,具体如下:
void AddContact(Contact* pc)
{
if (pc->sz == MAX)
{
printf("通讯录满了");
return;
}
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].phone));
printf("请输入住址\n");
scanf("%s", &(pc->data[pc->sz].address));
pc->sz++;
}
4.通讯录删除操作
删除操作的话,我们这里是通过输入要删除人的名字来找到此人进行删除,先看代码:
void del(Contact* pc)
{
printf("请输入要删除的名字\n");
getchar();
char arr[100] = { 0 };
gets(arr);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, arr)==0)
{
int j = 0;
for (j = i; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
break;
}
}
}
解释上述代码:gets这个函数是输入一个字符串的函数,需要用到的头文件为: #include<string.h> ;它与scanf的区别就是scanf遇见空格后后面的就不进行读入了,而gets会读入后面的。然后有用到了一个strcmp函数,这个函数的功能就是比较字符串,它比较的是字符串的ascll码值,这个函数以及其他内存的函数我会在写一篇文章来具体详解,最后讲一下删除的原理:采用的是覆盖的原理。就是当找到目标时,这个下标的后面进行往前覆盖即可,这样要删除的就被覆盖了,而且也没有破环顺序
注意:pc->sz一定要减1,因为删除了一个人了
5.通讯录查找操作
这个查找在删除操作中用到了,所以不讲解了,直接看代码:
void research(Contact* pc)
{
printf("请输入要查找的名字\n");
getchar();
char arr[100] = { 0 };
gets(arr);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name,arr)==0)
{
printf("%s\n", pc->data[i].name);
printf("%d\n", pc->data[i].age);
printf("%s\n", pc->data[i].phone);
printf("%s\n", pc->data[i].address);
break;
}
}
}
我这个代码有一个繁琐的问题就是,像删除,修改都会先查找,所以大家可以自己定义一个查找函数,这样就不用在删除,修改操作再次写有关查找的代码了
6.通讯录修改操作
修改同理删除操作:具体代码如下:
void change(Contact* pc)
{
printf("请输入要修改人的名字\n");
getchar();
char arr[100] = { 0 };
gets(arr);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, arr)==0)
{
printf("请输入姓名\n");
scanf("%s", &(pc->data[i].name));
printf("请输入年龄\n");
scanf("%d", &(pc->data[i].age));
printf("请输入电话\n");
scanf("%s", &(pc->data[i].phone));
printf("请输入住址\n");
scanf("%s", &(pc->data[i].address));
break;
}
}
}
二.通讯录完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_MAX 20
#define MAX 1000
#define ADDESS_MAX 30
#define PHONE_MAX 30
typedef struct information
{
char name[NAME_MAX];
int age;
char phone[PHONE_MAX];
char address[ADDESS_MAX];
}information;
typedef struct Contact
{
information data[MAX];
int sz;
}Contact;
void InitContact(Contact* pc);
void AddContact(Contact* pc);
void Pintf(Contact* pc);
void research(Contact* pc);
void del(Contact* pc);
void change(Contact* pc);
void print(Contact* pc);
void InitContact(Contact* pc)
{
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
}
void AddContact(Contact* pc)
{
if (pc->sz == MAX)
{
printf("通讯录满了");
return;
}
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].phone));
printf("请输入住址\n");
scanf("%s", &(pc->data[pc->sz].address));
pc->sz++;
}
void Pintf(Contact* pc)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%s\n", pc->data[i].name);
printf("%d\n", pc->data[i].age);
printf("%s\n", pc->data[i].phone);
printf("%s\n", pc->data[i].address);
}
}
void research(Contact* pc)
{
printf("请输入要查找的名字\n");
getchar();
char arr[100] = { 0 };
gets(arr);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, arr) == 0)
{
printf("%s\n", pc->data[i].name);
printf("%d\n", pc->data[i].age);
printf("%s\n", pc->data[i].phone);
printf("%s\n", pc->data[i].address);
break;
}
}
}
void del(Contact* pc)
{
printf("请输入要删除的名字\n");
getchar();
char arr[100] = { 0 };
gets(arr);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, arr) == 0)
{
int j = 0;
for (j = i; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
break;
}
}
}
void change(Contact* pc)
{
printf("请输入要修改人的名字\n");
getchar();
char arr[100] = { 0 };
gets(arr);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, arr) == 0)
{
printf("请输入姓名\n");
scanf("%s", &(pc->data[i].name));
printf("请输入年龄\n");
scanf("%d", &(pc->data[i].age));
printf("请输入电话\n");
scanf("%s", &(pc->data[i].phone));
printf("请输入住址\n");
scanf("%s", &(pc->data[i].address));
break;
}
}
}
void print(Contact* pc)
{
int i = 0;
printf("%12s %5s %6s %8s\n", "姓名", "年龄", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%12s %5d %6s %8s\n", pc->data[i].name, pc->data[i].age, pc->data[i].phone, pc->data[i].address);
}
}
void meau()
{
printf("**************** 通讯录 ********************\n");
printf("************** 1.add ********************\n");
printf("************** 2.delete ********************\n");
printf("************** 3.research ********************\n");
printf("************** 4.change ********************\n");
printf("************** 5.print ********************\n");
printf("************** 0.exit ********************\n");
}
int main()
{
Contact p;
InitContact(&p);
int a = 0;
do
{
meau();
scanf("%d", &a);
switch (a)
{
case 1:AddContact(&p); break;
case 2:del(&p); break;
case 3:research(&p); break;
case 4: change(&p);
case 5: print(&p); break;
default:break;
}
} while (a);
}
#define _CRT_SECURE_NO_WARNINGS 1 这个如果你用的VS就加上,如果用的Dev就不需要了