建立一个通讯录。

今天我们来编程一个通讯录,内容要求是通信录可以用来存储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;
}
这样我们的通讯录就完成了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值