这个通讯录存粹用到C的知识就可以,主要就是一个联系人信息结构体,再就是一个结构体数组,对结构体数组反复操作
进行增、删、查、改、排序(由于是初学者还不能对中文名进行排序)、清空写等功能。
在这里我们可以尽量写的正式一点
所以我们用contact.h头文件创建结构体和对函数进行声明
conteact.c中是主要功能的实现及代码
最后用test.c进行测试
1.头文件”contact.h”
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_MAX 20
#define SEX_MAX 5
#define PHONE_MAX 13
#define MAX_SIZE 1000
struct MyStruct //定义联系人信息的结构体
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char phone[PHONE_MAX];
char address[50];
};
struct A
{
struct MyStruct arr[MAX_SIZE]; //结构体数组
int i;
};
enum op//枚举可以让后面的Switch语句中的选择变得有意义
{
EXIT,
ADD,
DELETE,
FIND,
AMEND,
PRINT,
INIT,
SORT
};
//函数声明
void _init(struct A *p);
void add(struct A *p);
int find_place(struct A *p);
void delete(struct A *p);
void search_name(struct A *p);
void amend(struct A *p);
void sort(struct A *p);
void _print(struct A *p);
void Menu();
2.函数实现”contact.c”
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void _init(struct A *p)//对结构体成员进行初始化
{
p->i = 0;
memset(p->arr, 0, MAX_SIZE * sizeof(struct MyStruct));//这个就是将结构体数组全部初始化为0
}
void add(struct A *p)
{
printf("录入联系人信息\n");
printf("请录入联系人姓名:");
scanf("%s", p->arr[p->i].name);
printf("\n请录入联系人性别:");
scanf("%s", p->arr[p->i].sex);
printf("\n请录入联系人年龄:");
scanf("%d", &p->arr[p->i].age);
printf("\n请录入联系人电话:");
scanf("%s", p->arr[p->i].phone);
printf("\n请录入联系人住址:");
scanf("%s", p->arr[p->i].address);
p->i++;
printf("\n联系人信息录入完毕\n");
}
int find_place(struct A *p)
{
char name[NAME_MAX];
printf("请输入姓名:");
scanf("%s", name);
for (int i = 0; i < p->i; i++)
{
if (strcmp(p->arr[i].name, name) == 0)//利用strcmp对字符串的比较来找位置
{
return i;
}
}
return -1;
}
void delete(struct A *p)
{
if (p->i > 0)
{
printf("删除联系人\n");
int ret = find_place(p);
if (ret != -1)
{
for (int i = ret; i < p->i - 1; i++)//要让删除位置之后的都向前移动一位
{
p->arr[i] = p->arr[i + 1];
}
p->i--;//让总数组长度减1
printf("删除完毕\n");
}
else
{
printf("未找到此联系人\n");
}
}
else
{
printf("通讯录中无联系人");
}
}
void search_name(struct A *p)
{
int ret = find_place(p);
if (ret != -1)
{
printf("姓名:%s 性别:%s 年龄:%d 电话:%s 住址:%s\n",
p->arr[ret].name,
p->arr[ret].sex,
p->arr[ret].age,
p->arr[ret].phone,
p->arr[ret].address);
}
else
printf("未找到此联系人");
}
void amend(struct A *p)
{
printf("修改个人信息:\n");
int ret = find_place(p);
if (ret != -1)
{
printf("请输入联系人姓名:");
scanf("%s", p->arr[ret].name);
printf("\n请录入联系人性别:");
scanf("%s", p->arr[ret].sex);
printf("\n请录入联系人年龄:");
scanf("%d", &p->arr[ret].age);
printf("\n请录入联系人电话:");
scanf("%s", p->arr[ret].phone);
printf("\n请录入联系人住址:");
scanf("%s", p->arr[ret].address);
printf("修改完毕\n");
}
else
{
printf("未找到此联系人");
}
}
void sort(struct A *p)
{
//简单的冒泡排序算法运用
for (int i = 0; i < p->i - 1; i++)
{
for (int j = 0; j < (p->i - 1 - i); j++)
{
if (strcmp(p->arr[i].name, p->arr[j].name) < 0)
{
struct MyStruct tem;//定义一个结构体类型变量
tem = p->arr[i];
p->arr[i] = p->arr[j];
p->arr[j] = tem;
}
}
}
printf("\n排序完成\n");
}
void _print(struct A *p)
{
printf("\n联系人信息:\n");
int i = 0;
for (i = 0; i < p->i; i++)
{
printf("姓名:%s 性别:%s 年龄:%d 电话:%s 住址:%s\n",
p->arr[i].name,
p->arr[i].sex,
p->arr[i].age,
p->arr[i].phone,
p->arr[i].address);
}
}
void Menu()
{
printf("\n ***1 添加联系人信息 ***\n");
printf(" ***2 删除联系人信息 ***\n");
printf(" ***3 查找联系人信息 ***\n");
printf(" ***4 修改联系人信息 ***\n");
printf(" ***5 显示联系人信息 ***\n");
printf(" ***6 清空联系人信息 ***\n");
printf(" ***7 以名字排序联系人 ***\n");
printf(" ***0 退 出 通 讯 录 ***\n");
}
3.测试代码”test.c”
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void Test()
{
struct A p;
int input = 1;
_init(&p);//这里一定要注意要用地址传递的方式,要不然在不能改变数组内的信息,具体为什么就不一一说了
//另建议结构体传参时,尽量用地址传递,因为一般地址传递都比值传递的效率高
while (input)
{
Menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case ADD:
add(&p);
break;
case DELETE:
delete(&p);
break;
case FIND:
search_name(&p);
break;
case AMEND:
amend(&p);
break;
case PRINT:
_print(&p);
break;
case INIT:
p.i=0;
case SORT:
sort(&p);
break;
case EXIT:
break;
default:
break;
}
}
}
int main()
{
Test();
system("pause");
return 0;
}