实现效果如下图:
此C语言通讯录用来存储1000个人的信息,每个成员的信息包括有姓名、性别、年龄、电话、住址。
这次我们C语言通讯录V1.0提供的功能有:
1、添加联系人
2、删除联系人
3、修改联系人
4、查看所有联系人的信息
5、以名字排序所有联系人
7、清空所有联系人
8、退出系统
总体过程实现:
首先定义一个结构体,存储其中一位成员的信息,信息包括姓名、性别、年龄、电话和住址。
通讯录所实现的各个功能进行封装函数。
看过了C语言扫雷的朋友应该知道有C语言扫雷有三个部分,所以C语言通讯录的实现也包括了三个部分。
通讯录的实现包括三个部分:
1总体框架——头文件的实现
2具体的函数的功能实现——封装函数
3测试部分
头文件部分代码实现如下:
test.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 20
#define ADD_MAX 50
#define MAX_SIZE 1000
struct contact
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char address[ADD_MAX];
};
struct A {
struct contact arr[MAX_SIZE];
int i;
};
void Print_menu();
void Add(struct A*con);
int dedelete_contact(struct A*con);
int revise_contact(struct A *pcon);
void print_contact(struct A *con);
int find_position(struct A*pcon);
int find_contact(struct A*pcon);
void _init_contact(struct A *pcon);
void put_empty(struct A *pcon);
void sort_name(struct A *pcon);
函数部分代码实现如下:
contact.c
#include"test.h"
//添加联系人的信息
void Add(struct A*con)
{
printf("请输入名字:");
scanf("%s", con->arr[con->i].name);//char类型在scanf中不需要取地址符
printf("请输入性别:");
scanf("%s", con->arr[con->i].sex);
printf("请输入年龄:");
scanf("%d",&(con->arr[con->i].age));//int类型在scanf中需要输入取地址符
printf("请输入电话:");
scanf("%s", con->arr[con->i].tele);
printf("请输入地址:");
scanf("%s", con->arr[con->i].address);
con->i++;
printf("添加完毕!\n");
}
//删除联系人
int dedelete_contact(struct A*pcon)
{
int i = 0;
int ret = find_position(pcon);//通过查找函数的返回值来确定
printf("删除联系人\n");
if (ret != -1)
{
for (i = ret; i < pcon->i - 1; i++)//通过后面的数据覆盖前面的数据达到删除数据的目的
{
pcon->arr[i] = pcon->arr[i + 1];
}
pcon->i--;
return 1;
}
else
printf("没有找到此联系人,无法删除此联系人\n");
return 0;
}
//修改联系人的信息
int revise_contact(struct A *pcon)
{
int ret = find_position(pcon);
if (ret != -1)
{
printf("请输入需要修改联系人的信息:\n");
printf("请输入名字:");
scanf("%s", pcon->arr[ret].name);
printf("请输入性别:");
scanf("%s", pcon->arr[ret].sex);
printf("请输入年龄:");
scanf("%d", &(pcon->arr[ret].age));
printf("请输入电话号码:");
scanf("%s", pcon->arr[ret].tele);
printf("请输入地址:");
scanf("%s", pcon->arr[ret].address);
return 1;
}
else
printf("没有找到需要修改的联系人!!\n");
return 0;
}
//查看所有联系人的信息
void print_contact(struct A *con)
{
int i = 0;
printf("打印所有联系人的信息\n");
printf("%-10s%-5s%-5s%-15s%-20s\n", "name", "sex", "age", "tele", "address");
for (i = 0; i < con->i ; i++)
{
printf("%-10s%-5s%-5d%-15s%-20s\n", con->arr[i].name, con->arr[i].sex, con->arr[i].age,
con->arr[i].tele, con->arr[i].address);
}
printf("\n");
}
//搜索联系人的位置
int find_position(struct A*pcon)
{
int i = 0;
char name[20];
printf("请输入需要查找联系人的名字:");
scanf("%s", name);
for (i = 0; i < pcon->i; i++)
{
if (strcmp(pcon->arr[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//搜索联系人的信息
int find_contact(struct A*pcon)
{
printf("查找联系人\n");
int ret = find_position(pcon);
if (ret != -1)
{
printf("姓名:%s\n",pcon->arr[ret].name);
printf("性别:%s\n",pcon->arr[ret].sex);
printf("年龄:%d\n",pcon->arr[ret].age);
printf("电话号码:%s\n",pcon->arr[ret].tele);
printf("地址:%s\n",pcon->arr[ret].address);
return 1;
}
else
printf("没有找到此联系人!!\n");
return 0;
}
//清空所有联系人
void put_empty(struct A *pcon)
{
printf("清空联系人\n");
memset(pcon->arr, 0, 1000 * sizeof(struct contact));
pcon->i = 0;
}
//以名字排序所有联系人
void sort_name(struct A *pcon)
{
printf("排序\n");
char ch = 0;
int i = 0;
int j = 0;
printf("请选择排序方式(‘<’代表由z->a,'>'代表由a->z):");
fflush(stdin);
scanf("%c", &ch);
int flag = 0;
if (ch == '>')
{
for (i = 0; i < pcon->i; i++)
{
flag = 0;
for (j = 0; j < pcon->i - i - 1; j++)
{
if (strcmp(pcon->arr[j].name, pcon->arr[j + 1].name)>0)
{
struct contact tmp = { 0 };
tmp = pcon->arr[j];
pcon->arr[j] = pcon->arr[j + 1];
pcon->arr[j + 1] = tmp;
flag = 1;
}
}
if (flag == 0)
break;
}
}
else if (ch == '<')
{
for (i = 0; i < pcon->i; i++)
{
flag = 0;
for (j = 0; j < pcon->i - i - 1; j++)
{
if (strcmp(pcon->arr[j].name, pcon->arr[j + 1].name)<0)
{
struct contact tmp = { 0 };
tmp = pcon->arr[j];
pcon->arr[j] = pcon->arr[j + 1];
pcon->arr[j + 1] = tmp;
flag = 1;
}
}
if (flag == 0)
break;
}
}
else
printf("选择错误,请返回重新选择:\n");
printf("排序结束!\n");
}
void _init_contact(struct A *pcon)
{
pcon->i = 0;
memset(pcon->arr, 0, MAX_SIZE * sizeof(struct contact));
}
void Print_menu()
{
printf("*************************************************\n");
printf("********* 通讯录 v1.0 **********\n");
printf("********* 1、添加联系人 **********\n");
printf("********* 2、删除联系人 **********\n");
printf("********* 3、修改联系人 **********\n");
printf("********* 4、查看所有联系人 **********\n");
printf("********* 5、搜索联系人的信息 **********\n");
printf("********* 6、以名字排序所有联系人 **********\n");
printf("********* 7、清空所有联系人 **********\n");
printf("********* 8、退出系统 **********\n");
printf("*************************************************\n");
}
测试部分代码如下:
test.c
#include "test.h"
void test()
{
struct A con;
int input = 1;
_init_contact(&con);
while(input)
{
Print_menu();
printf("请选择序号:");
scanf("%d", &input);
switch(input)
{
case 1:
Add(&con);
break;
case 2:
dedelete_contact(&con);
break;
case 3:
revise_contact(&con);
break;
case 4:
print_contact(&con);
break;
case 5:
find_contact(&con);
break;
case 6:
sort_name(&con);
break;
case 7:
put_empty(&con);
break;
case 8:
break;
default:
break;
}
}
}
int main()
{
test();
system("pause");
return 0;
}
总结:虽然这是通讯录的第一个版本,但是让我对于函数的运用和结构体的运用有了一个很深刻的印象。从第一个小程序C语言扫雷到现在的C语言通讯录,我对于C语言的一些运用方面感觉更加的成熟,虽然写这个程序中遇到了一些麻烦,但是我希望各位都可以自己去想,多思考才可以学的更加深刻。最后,如有不对,请多指教。