今天我们来编程一个通讯录,内容要求是通信录可以用来存储1000个联系人的信息,具体信息分为姓名,性别,年龄,电话,地址,同时还要有各种功能:(1)添加联系人信息。(2)删除联系人信息。(3)修改联系人信息。(4)打印联系人信息。(5)查找联系人信息。(6)清空联系人信息。(7)根据姓名排序联系人信息。
首先这个题我们需要有三个部分,头文件test.h, 各种功能函数文件test.c, 主函数文件main.c 。
1.test.h
#ifndef _TEST_H_
#define _TEST_H_
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#pragma warning(disable:4996)
#define N 1000
typedef struct Stu //建立一个结构体来保存每个联系人的信息。
{
char name[20];
char sex[20];
int age;
int number[30];
char address[50];
}stu;
typedef struct People //把通讯录和人员统计放在结构体内。
{
stu num[N];
int count;
}people;
void menu1(); //修改信息的菜单函数。
void init(people *p); //初始化函数。
void my_add(people *p); //添加联系人函数。
void my_delect(people *p); //删除联系人信息函数。
void my_find(people *p); //查找联系人函数。
void my_modify(people *p); //修改联系人信息的函数。
void my_show(people *p); //展示联系人信息函数。
void my_empty(people *p); //清空联系人信息函数。
void my_sort(people *p); //排序函数。
#endif
2.test.c
#include"test.h"
void menu1() //修改函数中的菜单函数。
{
printf("*************************\n");
printf("***** 1.name *****\n");
printf("***** 2.sex *****\n");
printf("***** 3.age *****\n");
printf("***** 4.number *****\n");
printf("***** 5.address *****\n");
printf("***** 0.exit1 *****\n");
printf("*************************\n");
}
void init(people *p)
{
int count=sizeof(p->num); //开辟一个sizeof(p->num)大的空间并给其附上0.
p->count=0;
memset(p->num,0,count);
}
int find(people *p,char *pname) //用来检验输入的名字是否与通讯录中的一致。有利于后面的查找,删除,修改函数的使用。
{
int i=0;
for(i=0;i<p->count;i++)
{
if(strcmp(p->num[i].name,pname)==0) //一致的话就返回它的位置,否则返回-1。
{
return i;
}
}
return -1;
}
void my_add(people *p)
{
printf("请输入姓名:\n"); //直接添加联系人信息。
scanf("%s",p->num[p->count].name);
printf("请输入性别: \n");
scanf("%s",p->num[p->count].sex);
printf("请输入年龄: \n");
scanf("%d",&p->num[p->count].age);
printf("请输入电话: \n");
scanf("%d",&p->num[p->count].number);
printf("请输入地址: \n");
scanf("%s",p->num[p->count].address);
if(p->count>1000) //如果联系人数大于1000上限,就提醒满了。
{
printf("It is empty!\n");
}
else
{
p->count++;
}
}
void my_delect(people *p)
{
char name[20]={0};
int result=0;
int i=0;
int n=0;
printf("请输入删除人的姓名: \n");
scanf("%s",&name);
result=find(p,name); //输入想删除人的姓名。
if(result!=-1) //如果和通讯录中的一样,就进行操作,否则提示联系人不存在。
{
printf("你是否要删除该联系人?\n");
printf("删除请按1,不删除请按0\n"); //提醒用户是否确认删除信息。
scanf("%d", &n);
if (n == 1)
{
for (i = 0; i < (p->count)-1; i++)
{
p->num[i] = p->num[i + 1];
}
p->count --;
printf("删除成功\n");
}
else
{
printf("删除失败\n");
}
}
else
{
printf("你要删除的联系人不存在\n");
}
}
void my_find(people *p)
{
int i=0;
int ret=0;
char name[20];
printf("请输入查找人的姓名:\n");
scanf("%s",&name);
ret=find(p,name);
if(ret!=-1) //如果姓名一致,就展示出该联系人的信息,否则提示不存在。
{
printf("name :%s sex:%s age:%d number:%d adress:%s",p->num[ret].name,p->num[ret].sex,p->num[ret].age,p->num[ret].number,p->num[ret].address);
printf("\n");
}
else
{
printf("你要查找的联系人不存在\n");
}
}
void my_modify(people *p)
{
int i=0;
int ret=0;
int n=0;
char name[20];
printf("请输入你要修改联系人的姓名:\n");
scanf("%s",&name);
ret=find(p,name);
if(ret!=-1) //如果姓名一致进行操作。
{
printf("name :%s sex:%s age:%d number:%d adress:%s",p->num[ret].name,p->num[ret].sex,p->num[ret].age,p->num[ret].number,p->num[ret].address);
do{
menu1();
printf("请选择修改哪一项:\n");
scanf("%d",&n); //选择修改哪一项。
switch(n)
{
case 1:
printf("请输入修改后的姓名:\n");
scanf("%s",p->num[ret].name);
break;
case 2:
printf("请输入修改后的性别:\n");
scanf("%s",p->num[ret].sex);
break;
case 3:
printf("请输入修改后的年纪:\n");
scanf("%d",p->num[ret].age);
break;
case 4:
printf("请输入修改后的电话:\n");
scanf("%d",p->num[ret].number);
break;
case 5:
printf("请输入修改后的地址:\n");
scanf("%s",p->num[ret].address);
break;
case 0:
break;
default:
printf("Input error\n");
break;
}
}while(n);
}
else
{
printf("这个联系人不存在\n");
}
}
void my_show(people *p)
{
int i=0;
for(i=0;i<p->count;i++) //直接展示通讯录中所有联系人的信息。
{
printf("name :%s sex:%s age:%d number:%d adress:%s",p->num[i].name,p->num[i].sex,p->num[i].age,p->num[i].number,p->num[i].address);
}
}
void my_empty(people *p)
{
p->count=0; //将通讯录中联系人的信息清空。
}
void my_sort(people *p) //用冒泡法排序每个联系人的姓名,然后再输出每个人的所有信息。
{
int i=0;
int j=0;
for(i=0;i<p->count-1;i++)
{
for(j=0;j<p->count-1-i;j++)
{
if(strcmp(p->num[i].name,p->num[j+1].name)>0)
{
stu t;
t=p->num[j];
p->num[j]=p->num[j+1];
p->num[j+1]=t;
}
}
}
for(i=0;i<p->count;i++)
{
printf("name :%s sex:%s age:%d number:%d adress:%s",p->num[i].name,p->num[i].sex,p->num[i].age,p->num[i].number,p->num[i].address);
printf("\n");
}
}
3.main.c
#include"test.h"
people con; //定义一个参数。
void menu() //通信录的菜单。
{
printf("+++++++++++++++++++++++++++++++++++++++++\n");
printf("+++++ 1.add 2.delect +++++\n");
printf("+++++ 3.modify 4.find +++++\n");
printf("+++++ 5.show 6.empty +++++\n");
printf("+++++ 7.sort 0.exit +++++\n");
printf("+++++++++++++++++++++++++++++++++++++++++\n");
printf("Pleaese select:\n");
}
int main()
{
int select=0;
while(1){ //可以循环使用菜单。
menu();
scanf("%d",&select); //输入你想操作的选项。
switch(select) //用switch来表示各个选项的实际操作。
{
case 1:
my_add(&con); //调用添加函数。
break;
case 2:
my_delect(&con); //调用删除函数。
break;
case 3:
my_modify(&con); //调用修改函数。
break;
case 4:
my_find(&con); //调用查找函数。
break;
case 5:
my_show(&con); //调用打印函数。
break;
case 6:
my_empty(&con); //调用清空函数。
break;
case 7:
my_sort(&con); //调用排序函数。
break;
case 0: //退出程序。
exit(1);
default:
printf("Input error"); //如果输入错误会提醒。
break;
}
}
system("pause");
return 0;
}
这样我们的通讯录就完成了。