通讯录管理系统的设计与实现

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct _Person
{
	char num[20];//手机号
	char name[20];//姓名
	char QQ[20];//QQ号
	char email[20];//邮箱
	char address[50];//地址
}Person;//结构体别名叫Person

//打印联系人信息到屏幕
void Print_Person_Info(Person arr[],int n)
{
	int i;
	printf("%-10s%-15s%-15s%-20s%-20s\n","姓名","手机号","QQ","邮箱","地址");
	//按格式输出到屏幕  固定宽度
	for(i=0;i<n;i++)//遍历数组  依次打印
	{
		printf("%-10s",arr[i].name);
		printf("%-15s",arr[i].num);	
		printf("%-15s",arr[i].QQ);	
		printf("%-20s",arr[i].email);	
		printf("%-20s\n",arr[i].address);	
	}
}

//添加新的联系人到结构体数组
int Add_Person_Info(Person arr[],int n)
{
	system("cls");
	printf("请输入联系人姓名:");
	scanf("%s",arr[n].name);
	printf("请输入联系人手机号:");
	scanf("%s",arr[n].num);
	printf("请输入联系人QQ号:");
	scanf("%s",arr[n].QQ);
	printf("请输入联系人邮箱:");
	scanf("%s",arr[n].email);
	printf("请输入联系人地址:");
	scanf("%s",arr[n].address);
	printf("添加成功!\n");
	system("pause");
	return n+1;//结构体数组长度+1
}

int Delete_Person_Info(Person arr[],int n)
{
	int i,j;
	char temp[20];
	system("cls");
	printf("请输入要删除的联系人姓名:");
	scanf("%s",temp);
	
	for(i=0;i<n;i++)//遍历结构体数组
	{
		if(!strcmp(temp,arr[i].name))//如果查找到 跳出循环
			break;
	}
	if(i==n)//如果一直没有跳出循环 说明没有找到
	{
		printf("无该联系人!\n");
		system("pause");
		return n;//返回原人数
	}

	Print_Person_Info(&arr[i],1);
	printf("是否删除Y/N?:  ");
	scanf("%s",temp);
	if(!strcmp(temp,"Y")||!strcmp(temp,"y"))//如果选择Y
	{
		for(j=i;j<n;j++)//用后面的元素覆盖前面的
		{
			arr[j]=arr[j+1];
		}
		printf("删除成功!\n");
		system("pause");
		return n-1;//长度减一
	}

	printf("已取消删除!\n");
	system("pause");
	return n;
}

void Modify_Person_Info(Person arr[],int n)
{
	int i;
	char temp[20];
	Person swap;
	system("cls");
	printf("请输入要修改的联系人姓名:");
	scanf("%s",temp);
	
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,arr[i].name))
			break;
	}
	if(i==n)
	{
		printf("无该联系人!\n");
		system("pause");
		return ;
	}
	Print_Person_Info(&arr[i],1);
	
	printf("请输入联系人手机号:");
	scanf("%s",swap.num);
	printf("请输入联系人QQ号:");
	scanf("%s",swap.QQ);
	printf("请输入联系人邮箱:");
	scanf("%s",swap.email);
	printf("请输入联系人地址:");
	scanf("%s",swap.address);

	printf("是否确认修改Y/N?:  ");
	scanf("%s",temp);

	if(!strcmp(temp,"Y")||!strcmp(temp,"y"))
	{
		strcpy(swap.name,arr[i].name);
		arr[i]=swap;
		printf("修改成功!\n");
		system("pause");
		return ;
	}

	printf("已取消修改!\n");
	system("pause");
}

void Save_Person_Info(Person stu[],int n)
{
	int i;
	FILE* pFile;
	pFile= fopen("stu_info.dat","w+");
	if(pFile==NULL)//文件打开失败 返回
	{
		return;
	}
	for(i=0;i<n;i++)//依次写入到文件
	{
		fwrite(&stu[i],1,sizeof(Person),pFile);
	}
	fclose(pFile);
}

int Read_Person_Info(Person stu[])
{
	int i=0;
	FILE* pFile;
	pFile= fopen("stu_info.dat","r+");
	if(pFile==NULL)
	{
		return 0;
	}
	while(fread(&stu[i++],1,sizeof(Person),pFile));//依次读取到结构体数组  直到文件读取完毕
	fclose(pFile);
	if(i>=1)
	{
		return i-1;
	}
	return 0;
}

void Search_Person_Info(Person arr[],int n)
{
	int i,flag=0;
	char temp[20];
	system("cls");
	printf("请输入要查询的联系人姓名:");
	scanf("%s",temp);
	
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,arr[i].name))//如果名字相同
		{
			Print_Person_Info(&arr[i],1);//输出信息
			flag=1;
		}
		
	}
	if(flag==0)
	{
		printf("无该联系人!\n");
		system("pause");
		return ;
	}
	system("pause");
}

void Search_Person_Num(Person arr[],int n)
{
	int i,flag=0;
	char temp[20];
	system("cls");
	printf("请输入要查询的联系人号码:");
	scanf("%s",temp);
	
	for(i=0;i<n;i++)
	{
		if(!strcmp(temp,arr[i].num))
		{
			Print_Person_Info(&arr[i],1);//如果号码相同显示
			flag=1;
		}
		
	}
	if(flag==0)
	{
		printf("无该联系人!\n");
		system("pause");
		return ;
	}
	system("pause");
}

int Main_Menu()
{
	int choice;
	system("cls");
	printf("1:新增联系人\n");
	printf("2:删除联系人\n");
	printf("3:修改联系人\n");
	printf("4:按名字查询\n");
	printf("5:按号码查询\n");
	printf("6:按姓名显示\n");
	printf("7:按号码显示\n");
	printf("0:退出\n");
	printf("请输入选择:");
	scanf("%d",&choice);
	while(choice>7||choice<0)//判断是否输入正确
	{
		printf("请重新选择:");
		scanf("%d",&choice);
	}
	return choice;
}

void Sort_Person_Name(Person arr[],int n)//按名字进行冒泡排序
{
	int i,j;
	Person temp;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)//冒泡排序
		{
			if(strcmp(arr[i].name,arr[j].name)<0)
			{
				temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
			}
		}
	}
}

void Sort_Person_Num(Person arr[],int n)//按号码进行冒泡排序
{
	int i,j;
	Person temp;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(strcmp(arr[i].num,arr[j].num)<0)
			{
				temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
			}
		}
	}
}

int main()
{
	int choice;//记录选择
	Person per[100];//结构体数组
	int NUM=0;//记录结构体数组长度
	NUM=Read_Person_Info(per);//读取文件
	system("mode con: cols=100 lines=30");//设置屏幕大小
	do
	{
		choice=Main_Menu();//获取用户选择
		switch(choice)//根据选择进入相应功能
		{
		case 1:
			NUM=Add_Person_Info(per,NUM);//添加
			break;
		case 2:
			NUM=Delete_Person_Info(per,NUM);//删除
			break;
		case 3:
			Modify_Person_Info(per,NUM);//修改
			break;
		case 4:
			Search_Person_Info(per,NUM);//按名字查找
			break;
		case 5:
			Search_Person_Num(per,NUM);//按号码查找
			break;
		case 6:
			system("cls");//清屏
			Sort_Person_Name(per,NUM);//对名字排序
			Print_Person_Info(per,NUM);//显示信息
			system("pause");//暂停
			break;
		case 7:
			system("cls");
			Sort_Person_Num(per,NUM);//对号码排序
			Print_Person_Info(per,NUM);
			system("pause");
			break;
		}
	}while(choice!=0);
	Save_Person_Info(per,NUM);//保存到文件
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值