C语言实现的通讯录

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
//#define _CRT_SECURE_NO_WARNINGS
struct person
{
	char num[20];		//手机号
	char name[20];		//姓名
	char email[20];		//邮箱
	char address[50];	//地址
};

int menu()//菜单
{
	int choice;
	//显示页面
	system("cls");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                 欢迎使用通讯录管理系统                 |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                   1-新增联系人                         |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                   2-删除联系人                         |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                   3-修改联系人                         |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                   4-按名字查询联系人                   |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                   5-按号码查询联系人                   |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                   6-按姓名显示                         |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                   7-按号码显示                         |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                   8-显示全部联系人                     |\n");
	printf("\t\t\t\t---------------------------------------------------------\n");
	printf("\t\t\t\t|                   9-保存文件                           |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t|                   0-退出程序                           |\n");
	printf("\t\t\t\t----------------------------------------------------------\n");
	printf("\t\t\t\t请选择功能:");
	scanf_s("%d", &choice);
	while (choice > 9 || choice < 0)//判断是否输入正确
	{
		printf("请重新选择:");
		scanf_s("%d", &choice);
	
	}
	return choice;
}

int add_person(struct person arr[], int n)		//添加联系人函数 
{
	system("cls");				//清屏 
	printf("请输入联系人姓名:");
	scanf_s("%s", arr[n].name,sizeof(arr[n].name));//输入个人信息
	printf("请输入联系人手机号:");
	scanf_s("%s", arr[n].num,sizeof(arr[n].num));
	printf("请输入联系人邮箱:");
	scanf_s("%s", arr[n].email,sizeof(arr[n].email));
	printf("请输入联系人地址:");
	scanf_s("%s", arr[n].address,sizeof(arr[n].address));
	printf("添加成功!\n");
	system("pause");			//暂停界面 
	return n + 1;
}

void print_person(struct person arr[], int n)//从首地址开始打印n个人的信息
{
	int i;
	printf("%-15s%-15s%-15s%-15s\n", "姓名","手机号", "邮箱", "地址");
	for (i = 0; i < n; i++)
	{
		printf("%-15s", arr[i].name);
		printf("%-15s", arr[i].num);
		printf("%-15s", arr[i].email);
		printf("%-15s", arr[i].address);
		printf("\n");
	}
}

int delete_person(struct person arr[], int n)//删除联系人函数
{
	int i, j;
	char temp[20];
	char judge[10];
	system("cls");//清屏
	printf("请输入要删除的联系人:");
	scanf_s("%s", temp,sizeof(temp));
	for (i = 0; i < n; i++)//搜索该联系人
	{
		if (!strcmp(temp, arr[i].name))
			break;//找到后下标i后跳出
	}
	if (i == n)
	{
		printf("没有该联系人!");
		system("pause");
		return n;
	}
	print_person(&arr[i], 1);//打印该联系人的信息
	printf("是否删除'Y'or'N':");
	scanf_s("%s",judge,sizeof(judge));//输入确认命令
	if (strcmp(judge, "y") == 0 || strcmp(judge,"Y")==0)//判断是否执行删除操作
	{
		for (j = i; j < n; j++)//i元素后元素整体前移,作抽象删除
		{
			arr[j] = arr[j + 1];
		}
		printf("删除成功!\n");
		system("pause");//暂停界面
		return (n - 1);//返回联系人个数n-1
	}
	else
	{
		printf("已取消删除\n");
		system("pause");
		return n;
	}
}

void modify_person(struct person arr[], int n)//修改联系人信息函数
{
	int i;
	char temp[20];
	char judge[10];
	struct person arr0;			//临时储存 
	system("cls");
	printf("请输入要修改的联系人:");
	scanf_s("%s", temp,sizeof(temp));//输入要修改联系人的名字
	for (i = 0; i < n; i++)//搜索该联系人并得到下标i
	{
		if (strcmp(temp, arr[i].name) == 0)
			break;
	}
	if (i == n)
	{
		printf("无该联系人!");
		system("pause");
		return;
	}
	print_person(&arr[i], 1);//输出该联系人信息
	printf("请重新输入联系人手机号:\n");
	scanf_s("%s", arr0.num,sizeof(arr[n].num));
	printf("请重新输入联系人地址:\n");
	scanf_s("%s", arr0.address,sizeof(arr[n].address));
	printf("请重新输入联系人手机号:\n");
	scanf_s("%s", arr0.email, sizeof(arr[n].email));
	printf("是否确认修改Y/N?:\n  ");
	scanf_s("%s", judge,sizeof(judge));//输入口令判断是否执行修改操作
	if (strcmp(judge, "y") == 0 || strcmp(judge, "Y") == 0)
	{
		strcpy_s(arr0.name, arr[i].name);
		arr[i] = arr0;
		printf("修改成功!\n");
		system("pause");
		return;
	}
	else
	{
		printf("已取消修改!");
		system("pause");
		return;
	}
}
void search_person_name(struct person arr[], int n)//搜索函数
{
	int i;
	char temp[20];
	system("cls");
	printf("请输入要查询的联系人:");
	scanf_s("%s", temp,sizeof(temp));
	for (i = 0; i < n; i++)
	{
		if (strcmp(arr[i].name, temp) == 0)
		{
			break;
		}
	}
	if (i == n)
	{
		printf("未查找到该联系人!\n");
		system("pause");
		return;
	}
	print_person(&arr[i], 1);
	system("pause");
	return;
}
void search_person_num(struct person arr[], int n)
{
	int i;
	char temp[20];
	system("cls");
	printf("请输入要查询的电话号码:");
	scanf_s("%s", temp);
	for (i = 0; i < n; i++)
	{
		if (strcmp(arr[i].num,temp) == 0)
			break;
	}
	if (i == n)
	{
		printf("未查找到该联系人!\n");
		system("pause");
		return;
	}
	print_person(&arr[i], 1);
	system("pause");
}

void sort_person_name(struct person arr[], int n)//按名字字母排序函数
{
	int i, j;
	struct person temp;
	system("cls");
	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;
			}
		}
	}

	return;
}

void sort_person_num(struct person arr[], int n)//按电话号码排序
{
	int i, j;
	struct person temp;
	system("cls");
	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;
			}
		}
	}

	return;
}

void save_file(struct person arr[], int n)//保存文件函数
{
	int i;
	FILE* fp=NULL;//用来接收地址
	fopen_s(&fp,"dly.dat", "w+");
	if (fp == NULL)//文件为空
	{
		return;
	}
	for (i = 0; i < n; i++)//依次写入到文件
	{
		fwrite(&arr[i], sizeof(struct person), 1, fp);
	}
	fclose(fp);//关文件
}

int read_file(struct person arr[])//读取文件
{
	int i = 0;
	FILE *fp=NULL;
	 fopen_s(&fp,"dly.dat", "r+");//打开文件得地址
	if (fp == NULL)
	{
		return 0;
	}
	while (fread(&arr[i++], sizeof(struct person), 1, fp));//依次读取文件
	fclose(fp);//关闭文件
	if (i >= 1)
	{
		return i - 1;//返回联系人个数
	}
	return 0;
}

int main()
{
	system("color 1E");
	SetConsoleTitle("鲤鱼的通讯录");//修改控制台窗口名称
	int choice;
	int num = 0;						//记录结构体数组长度 
	struct person per[100];	//定义结构体数组 
	for (int i = 0; i < 100; i++)//初始化数组,否则在vs中乱码
	{
		memset(per[i].address, '\0',sizeof(per[i].address));
		memset(per[i].email, '\0', sizeof(per[i].email));
		memset(per[i].name, '\0', sizeof(per[i].name));
		memset(per[i].num, '\0', sizeof(per[i].num));
	}
	num = read_file(per);//初始化通讯录联系人个数
	do
	{
		choice = menu();
		switch (choice)
		{
		case 1:
			num = add_person(per, num);		//添加 num=n
			break;
		case 2:
			num=delete_person(per, num);			//删除
			break;
		case 3:
			modify_person(per, num);			//修改
			break;
		case 4:
			search_person_name(per, num);	//按名字查找
			break;
		case 5:
			search_person_num(per, num);		//按号码查找
			break;
		case 6:
			sort_person_name(per, num);		//对名字排序
			print_person(per, num);
			system("pause");
			break;
		case 7:
			sort_person_num(per, num);		//对号码排序
			print_person(per, num);
			system("pause");
			break;
		case 8:
			system("cls");
			print_person(per, num);//全部显示
			system("pause");
			break;
		case 9:
			system("cls");
			save_file(per, num);//保存文件
			printf("保存成功!");
			system("pause");
			break;
		case 0:
			printf("\t谢谢使用!\n");
			exit(0);//退出程序
		}
	} while (choice != 0);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值