用C语言实现电话本的两种方式

第一:使用结构体数组存储联系人信息

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct person{
	char name[25];
	char qq[25];
	char num[25];
}person;
//添加一个联系人信息
void add(person *p, int *count)
{  
	int falg = 0;
	printf("请输入姓名:\n");
	scanf("%s", (*(p + *count)).name);
	printf("请输入QQ号:\n");
	scanf("%s", (*(p + *count)).qq);  
	printf("请输入电话号码:\n");  
	scanf("%s", (*(p + *count)).num); 
	*count += 1;
	printf("联系人信息已添加!\n");   
}
//显示电话本
void show(person *p, int *count)
{
	int i = 0;
	printf("共有%d个联系人信息:\n", *count);
	printf("===============================\n");
	printf("No.    姓名     QQ号     联系电话\n");
	if(*count != 0)
	{
		for(i = 0; i < *count; i++)  
		{
			printf("-----------------------------------\n");
			printf("%d", i + 1);
			printf("     %s", (*(p + i)).name);
			printf("     %s", (*(p + i)).qq);
			printf("     %s\n", (*(p + i)).num);

		}
		printf("===============================\n");

	}
	else  
	{  
		printf("电话簿内无内容!\n");  
	}  
}
//删除一个联系人
void del(person *p, int *count)
{
	int k, kk;
	printf("请输入要删除的编号:"); 
	scanf("%d", &k);
	if(k > *count || k < 1) {
		printf("序号输入错误,请重新输入!");
		goto error;
	}
	kk = k - 1;
	while (kk <= *count)//这里是个讲数组第i个元素以后的元素向前挪动,达到删除i元素的目的  
	{
		*(p + kk) = *(p + kk + 1);	
		kk++;
	}
	*count -= 1;
error: printf("\n");
}
//查找联系人
void sea(person *p, int *count)
{
	int i = 0;
	int flag = 0;
	char mz[10];
	printf("请输入要查找的用户名:");
	scanf("%s", mz);
	printf("===============================\n");
	printf("No.    姓名     QQ号     联系电话\n");
	for (i = 0; i < *count; i++)
	{
		if (!strcmp(mz, (*(p + i)).name))
		{
			printf("----------------------------------\n");
			printf("%d", i + 1);
			printf("     %s", (*(p + i)).name);
			printf("     %s", (*(p + i)).qq);
			printf("     %s\n", (*(p + i)).num);  
			flag = 1;
			printf("===============================\n");

			break;
		}
	}
	if(flag == 0)
		printf("无联系人信息!\n");
}
//修改联系人信息
void change(person *p, int *count)
{  
	int k, kk;
	printf("请输入要修改的编号:\n");
	scanf("%d", &k);
	if(k > *count || k < 1) {
		printf("序号输入错误,请重新输入!");
		goto error;
	}
	kk = k - 1;
	printf("请输入姓名:");
	scanf("%s", (*(p + kk)).name);
	printf("请输入QQ号:");
	scanf("%s", (*(p + kk)).qq);
	printf("请输入电话号码:");
	scanf("%s", (*(p + kk)).num);
	printf("第%d个人的信息已修改\n", k);
	error:printf("\n");
}
int main(){ 
	person tel[105];
	person *p = tel;
	int count = 0, n;
	while(1) {
		printf("    ****菜单****    \n");
		printf("--------------------\n");
		printf("   1.添加联系人    \n");
		printf("   2.删除联系人    \n");
		printf("   3.显示电话本    \n");
		printf("   4.查找联系人    \n");
		printf("   5.修改联系人    \n");
		printf("    0.退出系统     \n");
		printf("--------------------\n");
		printf("请选择要进行的操作(0~5)");
		scanf("%d", &n);
		if(n == 0) break;
		if(n == 1) 
			add(p, &count);
		if(n == 2){
			show(p, &count);
			del(p, &count);
		}
		if(n == 3)
			show(p, &count);
		if(n == 4)
			sea(p, &count);
		if(n == 5) {
			show(p, &count);
			change(p, &count);
		}
		if(n == 0)
			break;
	}
}

第二:存储到本地文件中

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct person{
	char name[25];
	char qq[25];
	char num[25];
}person;
//存入到文件中
void write(person p[105], int count) {
	int i;
	FILE * fp;
	char ans[30];
	puts("写入到文件!");
	puts("请输入所写入的文件名:");
	scanf("%s", ans);
	if((fp = fopen(ans, "wb")) == NULL) {
		printf("\n文件打开失败!\n");
	}
	fwrite(&count, sizeof(count), 1, fp);
	for(i = 0; i < count; i++) fwrite(&p[i], sizeof(person), 1, fp);
	fclose(fp);
}
//从文件中读取
int read(person p[105], int count) {
	FILE *fp;
	int i;
	int n = 0;
	char ans[30];
	puts("读入到文件!");
	puts("请输入所读入的文件名:");
	scanf("%s", ans);
	fp = fopen(ans, "rb");
	if(fp == NULL) {
		printf("\n通讯录文件不存在!\n"); 
	}
	fread(&n, sizeof(n), 1, fp);
	for(i = count; i < count + n; i++) fread(&p[i], sizeof(person), 1, fp);
	printf("已从文件中成功读取%d条联系人信息!\n", n);
	return n;
}


//添加一个联系人信息
void add(person *p, int *count)
{  
	int falg = 0;
	printf("请输入姓名:\n");
	scanf("%s", (*(p + *count)).name);
	printf("请输入QQ号:\n");
	scanf("%s", (*(p + *count)).qq);  
	printf("请输入电话号码:\n");  
	scanf("%s", (*(p + *count)).num); 
	*count += 1;
	printf("联系人信息已添加!\n");   
}
//显示电话本
void show(person *p, int *count)
{
	int i = 0;
	printf("共有%d个联系人信息:\n", *count);
	printf("===============================\n");
	printf("No.    姓名     QQ号     联系电话\n");
	if(*count != 0)
	{
		for(i = 0; i < *count; i++)  
		{
			printf("-----------------------------------\n");
			printf("%d", i + 1);
			printf("     %s", (*(p + i)).name);
			printf("     %s", (*(p + i)).qq);
			printf("     %s\n", (*(p + i)).num);

		}
		printf("===============================\n");

	}
	else  
	{  
		printf("电话簿内无内容!\n");  
	}  
}
//删除一个联系人
int del(person *p, int *count)
{
	show(p, count);
	int k, kk;
	printf("请输入要删除的编号:"); 
	scanf("%d", &k);
	if(k > *count || k < 1) {
		printf("序号输入错误,请重新输入!");
		return 0;
	}
	kk = k - 1;
	while (kk <= *count)//这里是个讲数组第i个元素以后的元素向前挪动,达到删除i元素的目的  
	{
		*(p + kk) = *(p + kk + 1);	
		kk++;
	}
	*count -= 1;
}
//查找联系人
void sea(person *p, int *count)
{
	int i = 0;
	int flag = 0;
	char mz[10];
	printf("请输入要查找的用户名:");
	scanf("%s", mz);
	printf("===============================\n");
	printf("No.    姓名     QQ号     联系电话\n");
	for (i = 0; i < *count; i++)
	{
		if (!strcmp(mz, (*(p + i)).name))
		{
			printf("----------------------------------\n");
			printf("%d", i + 1);
			printf("     %s", (*(p + i)).name);
			printf("     %s", (*(p + i)).qq);
			printf("     %s\n", (*(p + i)).num);  
			flag = 1;
			printf("===============================\n");

			break;
		}
	}
	if(flag == 0)
		printf("无联系人信息!\n");
}
//修改联系人信息
int change(person *p, int *count)
{  
	show(p, count);
	int k, kk;
	printf("请输入要修改的编号:\n");
	scanf("%d", &k);
	if(k > *count || k < 1) {
		printf("序号输入错误,请重新输入!");
		return 0;
	}
	kk = k - 1;
	printf("请输入姓名:");
	scanf("%s", (*(p + kk)).name);
	printf("请输入QQ号:");
	scanf("%s", (*(p + kk)).qq);
	printf("请输入电话号码:");
	scanf("%s", (*(p + kk)).num);
	printf("第%d个人的信息已修改\n", k);
}
int main(){ 
	person tel[105];
	person *p = tel;
	int count = 0, n;
	while(1) {
		printf("    ****菜单****    \n");
		printf("--------------------\n");
		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("--------------------\n");
		printf("请选择要进行的操作(0~7)");
		scanf("%d", &n);
		if(n == 0) break;
		if(n == 1) add(p, &count);
		if(n == 2) del(p, &count);
		if(n == 3) show(p, &count);
		if(n == 4) sea(p, &count);
		if(n == 5) change(p, &count);
		if(n == 6) write(tel, count);
		if(n == 7) count = read(tel, count);
		if(n == 0) break;
	}
}

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值