实现一个简单通讯录(增加、删除、修改、查找、打印、清空、排序、写入文件、读入内存)C语言

5 篇文章 0 订阅

通讯录可以用来存储1000个人的信息,每个人的信息包括: 
姓名、性别、年龄、电话、住址 

提供方法: 
1. 添加联系人信息 
2. 删除指定联系人信息 
3. 查找指定联系人信息 
4. 修改指定联系人信息 
5. 显示所有联系人信息 
6. 清空所有联系人 
7. 以名字排序所有联系人 
8. 保存联系人到文件 
9. 加载联系人 
 

test.h

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stddef.h>

#define FILE_PATH "C:/Users/LM/Desktop/test1"  //保存文件的路径

#pragma once

#define MAX_name 20  //姓名长度
#define MAX_sex 10   
#define MAX_phone 20
#define MAX_adress 30
#define MAX_company 20

//存入单个联系人信息的结构体
typedef struct PersonInfo
{
	char name[MAX_name];  //姓名
	char sex[MAX_sex];    //性别
	char phone[MAX_phone];  //电话
	char adress[MAX_adress];  //地址
	char company[MAX_company]; //公司
}PersonInfo;

#define MAX_SIZE 5

//通讯录结构体
typedef struct AddressBook
{
	int size;   //联系人数量
	PersonInfo* people;  //指向单个联系人结构体
}AddressBook;

AddressBook g_addr;

//通讯录菜单
int Menu();

//初始化通讯录
void InitContacts(AddressBook* addr);

//增加联系人
void AddContacts(AddressBook* addr);

//删除联系人
void DelContacts(AddressBook* addr);

//显示所有联系人
void PrintContacts(AddressBook* addr);

//查找联系人
int FindContacts(AddressBook* addr);

//更改联系人
void ModifyContacts(AddressBook* addr);

//排序联系人
void SortContacts(AddressBook* addr);

//清空通讯录
void ClearallContacts(AddressBook* addr);

//写入文件
void WriteoutContacts(AddressBook* addr);

//写入内存
void ReadinContacts(AddressBook* addr);

test.c

#include "test.h"


int Menu()
{
	int choice = 0;
	printf("======================\n");
	printf("1.添加联系人\n");
	printf("2.删除联系人\n");
	printf("3.打印联系人\n");
	printf("4.查找联系人\n");
	printf("5.修改联系人\n");
	printf("6.排序联系人\n");
	printf("7.清除所有\n");
	printf("8.写入文件\n");
	printf("9.读入内存\n");
	printf("0.退出\n");
	printf("======================\n");
	printf("请输入你的选择:");
	scanf("%d", &choice);
	return choice;
}

void InitContacts(AddressBook* addr)
{
	memset(addr->people , 0, sizeof(addr->people) * MAX_SIZE);
}


void AddContacts(AddressBook* addr)
{
	assert(addr != NULL);
	
	//CheckCapacity(&g_addr);

	printf("请输入联系人信息:\n");

	printf("姓名:");
	scanf("%s", addr->people->name);

	printf("性别:");
	scanf("%s", addr->people->sex);

	printf("电话:");
	scanf("%s", addr->people->phone);

	printf("地址:");
	scanf("%s", addr->people->adress);

	printf("公司:");
	scanf("%s", addr->people->company);

	addr->size++;
	printf("联系人个数为:%d\n", addr->size );
	printf("\n");
}

void DelContacts(AddressBook* addr)
{
	int ret = 0;
	assert(addr != NULL);
	if(addr->size  == 0)
	{
		printf("没有联系人!\n");
		return;
	}
	ret = FindContacts(&g_addr);
	if(ret != -1)
	{
		int i = ret;
		addr->people[i] = addr->people[i + 1];
		addr->size--;
		printf("删除成功!\n");
		printf("此时联系人个数为:%d\n", addr->size);
	}
	else
	{
		printf("没有找到此联系人!\n");
		return;
	}
}

void PrintContacts(AddressBook* addr)
{
	int i;
	assert(addr != NULL);
	if(addr->size  == 0)
	{
		printf("没有联系人!\n");
		return;
	}
	for(i = 0; i <= addr->size - 1; i++)
	{
		printf("姓名:%s\t", addr->people[i].name);
		printf("性别:%s\t", addr->people[i].sex);
		printf("电话:%s\t", addr->people[i].phone);
		printf("地址:%s\t", addr->people[i].adress);
		printf("公司:%s\n", addr->people[i].company);
	}
	printf("联系人总数:%d\n", i);
	printf("\n");
}

int FindContacts(AddressBook* addr)
{
	char Name[20];
	int i;
	assert(addr != NULL);
	printf("请输入要查找联系人的姓名:");
	scanf("%s", Name);
	for(i = 0; i <= addr->size - 1; i++)
	{
		if(strcmp(Name, addr->people[i].name) == 0)
		{
			printf("此联系人信息如下:\n");
			printf("姓名:%s\t", addr->people[i].name);
			printf("性别:%s\t", addr->people[i].sex);
			printf("电话:%s\t", addr->people[i].phone);
			printf("地址:%s\t", addr->people[i].adress);
			printf("公司:%s\n", addr->people[i].company);
			printf("\n");
			return i;
		}
	}
	printf("没找到此联系人!\n");
	return -1;
}

void ModifyContacts(AddressBook* addr)
{
	int ret = 0;
	assert(addr != NULL);
	if(addr->size  == 0)
	{
		printf("没有联系人!\n");
		return;
	}
	ret = FindContacts(&g_addr);
	if(ret != -1)
	{
		int i = ret;

		printf("重新输入该联系人信息!\n");

		printf("姓名:");
	    scanf("%s", addr->people[i].name);

	    printf("性别:");
	    scanf("%s", addr->people[i].sex);

	    printf("电话:");
	    scanf("%s", addr->people[i].phone);

	    printf("地址:");
	    scanf("%s", addr->people[i].adress);

	    printf("公司:");
	    scanf("%s", addr->people[i].company);
	}
	else
	{
	    printf("没有找到此联系人!\n");
		return;
	}
}

void SortContacts(AddressBook* addr)
{
	int i;
	if(addr == NULL)
	{
		printf("通讯录无联系人!\n");
		return;
	}
	for(i = 0; i < addr->size - 1; i++)
	{
		if(strcmp(addr->people[i].name, addr->people[i + 1].name) > 0)
		{
			char tem1[1024];
			char tem2[1024];
			char tem3[1024];
			char tem4[1024];
			char tem5[1024];

			strcpy(tem1, addr->people[i].name);
			strcpy(addr->people[i].name, addr->people[i + 1].name);
			strcpy(addr->people[i + 1].name, tem1);

			strcpy(tem2, addr->people[i].sex);
			strcpy(addr->people[i].sex, addr->people[i + 1].sex);
			strcpy(addr->people[i + 1].sex, tem2);

			strcpy(tem3, addr->people[i].phone );
			strcpy(addr->people[i].phone , addr->people[i + 1].phone );
			strcpy(addr->people[i + 1].phone , tem3);

			strcpy(tem4, addr->people[i].adress );
			strcpy(addr->people[i].adress , addr->people[i + 1].adress );
			strcpy(addr->people[i + 1].adress , tem4);

			strcpy(tem5, addr->people[i].company );
			strcpy(addr->people[i].company , addr->people[i + 1].company );
			strcpy(addr->people[i + 1].company , tem5);
		}
	}
}

void ClearallContacts(AddressBook* addr)
{
	assert(addr != NULL);

	free(addr->people);
	addr->people = NULL;
	addr->size = 0;
	addr->capacity = 0;
	printf("清除联系人成功!\n");
}

void WriteoutContacts(AddressBook* addr)
{
	int i;
	FILE* fp = fopen(FILE_PATH, "w");
	if(fp == NULL)
	{
		perror("error");
		return;
	}
	for(i = 0; i <= addr->size - 1 ; i++)
	{
		fwrite(&(addr->people[i]), sizeof(PersonInfo), 1, fp);
	}
	fclose(fp);
}

void ReadinContacts(AddressBook* addr)
{
	int i = 0;
	PersonInfo contact = {0};
	FILE* fp = fopen(FILE_PATH, "r");
	if(fp == NULL)
	{
		perror("error");
		return;
	}
	while(fread(&contact, sizeof(PersonInfo), 1, fp))
	{
		addr->people[i] = contact;

		//printf("此联系人信息如下:\n");
		//printf("姓名:%s\t", addr->people[i].name);
		//printf("性别:%s\t", addr->people[i].sex);
		//printf("电话:%s\t", addr->people[i].phone);
		//printf("地址:%s\t", addr->people[i].adress);
		//printf("公司:%s\n", addr->people[i].company);
		i++;
		addr->size++;
	}

	fclose(fp);
}

main.c

#include "test.h"




int main()
{
	typedef void(*pfunc_t)(AddressBook*);
	pfunc_t pfunc_table[] = {      //表驱动
		AddContacts,
		DelContacts,
		PrintContacts,
		FindContacts,
		ModifyContacts,
		SortContacts,
		ClearallContacts,
		WriteoutContacts,
		ReadinContacts
	};
	InitContacts(&g_addr);
	while(1)
	{
		int choice = Menu();
		if(choice < 0 || choice > 9)
		{
			printf("您的输入不合法,请重新输入\n");
			continue;
		}
		if(choice == 0)
		{
			printf("GOOD BYE!\n");
			break;
		}
		pfunc_table[choice - 1](&g_addr);
	}
	system("pause");
	return 0;
}

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单通讯录项目的 C 语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义最大联系人数 #define MAX_CONTACTS 100 // 定义联系人结构体 typedef struct { char name[50]; // 姓名 char phone[20]; // 电话号码 } Contact; // 定义全局变量存储联系人信息 Contact contacts[MAX_CONTACTS]; int num_contacts = 0; // 当前联系人数 // 声明函数 void add_contact(); void find_contact(); void edit_contact(); void delete_contact(); void display_contacts(); void sort_contacts(); int main() { int choice; while (1) { printf("\n1. 添加联系人\n"); printf("2. 查找联系人\n"); printf("3. 修改联系人\n"); printf("4. 删除联系人\n"); printf("5. 显示所有联系人\n"); printf("6. 按姓名排序联系人\n"); printf("0. 退出程序\n"); printf("请选择操作:"); scanf("%d", &choice); switch (choice) { case 0: printf("\n感谢使用通讯录程序,再见!\n\n"); return 0; case 1: add_contact(); break; case 2: find_contact(); break; case 3: edit_contact(); break; case 4: delete_contact(); break; case 5: display_contacts(); break; case 6: sort_contacts(); break; default: printf("\n非法操作,请重新选择!\n"); } } return 0; } // 添加联系人 void add_contact() { if (num_contacts >= MAX_CONTACTS) { printf("\n通讯录已满,无法添加联系人!\n"); return; } printf("\n请输入联系人姓名:"); scanf("%s", contacts[num_contacts].name); printf("请输入联系人电话号码:"); scanf("%s", contacts[num_contacts].phone); num_contacts++; printf("\n联系人添加成功!\n"); } // 查找联系人 void find_contact() { char name[50]; int i, found = 0; printf("\n请输入要查找的联系人姓名:"); scanf("%s", name); for (i = 0; i < num_contacts; i++) { if (strcmp(name, contacts[i].name) == 0) { found = 1; printf("\n联系人信息如下:\n"); printf("姓名:%s\n", contacts[i].name); printf("电话:%s\n", contacts[i].phone); break; } } if (!found) { printf("\n未找到该联系人!\n"); } } // 修改联系人 void edit_contact() { char name[50]; int i, found = 0; printf("\n请输入要修改的联系人姓名:"); scanf("%s", name); for (i = 0; i < num_contacts; i++) { if (strcmp(name, contacts[i].name) == 0) { found = 1; printf("\n请输入新的电话号码:"); scanf("%s", contacts[i].phone); break; } } if (!found) { printf("\n未找到该联系人!\n"); } else { printf("\n联系人修改成功!\n"); } } // 删除联系人 void delete_contact() { char name[50]; int i, found = 0; printf("\n请输入要删除的联系人姓名:"); scanf("%s", name); for (i = 0; i < num_contacts; i++) { if (strcmp(name, contacts[i].name) == 0) { found = 1; num_contacts--; for (; i < num_contacts; i++) { strcpy(contacts[i].name, contacts[i+1].name); strcpy(contacts[i].phone, contacts[i+1].phone); } break; } } if (!found) { printf("\n未找到该联系人!\n"); } else { printf("\n联系人删除成功!\n"); } } // 显示所有联系人 void display_contacts() { int i; if (num_contacts == 0) { printf("\n通讯录为空!\n"); } else { printf("\n所有联系人如下:\n"); for (i = 0; i < num_contacts; i++) { printf("%d. 姓名:%s,电话:%s\n", i+1, contacts[i].name, contacts[i].phone); } } } // 按姓名排序联系人 void sort_contacts() { int i, j; Contact temp; if (num_contacts == 0) { printf("\n通讯录为空,无法排序!\n"); return; } for (i = 0; i < num_contacts-1; i++) { for (j = i+1; j < num_contacts; j++) { if (strcmp(contacts[i].name, contacts[j].name) > 0) { temp = contacts[i]; contacts[i] = contacts[j]; contacts[j] = temp; } } } printf("\n联系人排序成功!\n"); } ``` 这是一个比较简单通讯录项目,实现了添加、查找修改删除、显示所有联系人和按姓名排序联系人等基本功能。当然,你可以根据自己的需求对代码进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值