C语言 | 通讯录(定长版本)

该博客介绍了一个能存储1000个人信息的通讯录系统,包括姓名、性别、年龄、电话和住址等字段。提供了添加、删除、查找、修改、显示所有联系人、清空和按姓名排序的功能。通过C语言实现,使用VS2013进行开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  实现一个通讯录:通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

vs2013(Visual Studio 2013)

  • contact.h
#ifndef _CONTACT_H_
#define _CONTACT_H_

#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 128
#define TOTAL 1000
#pragma warning(disable:4996)

//姓名、性别、年龄、电话、地址
typedef struct person{
	char name[SIZE/4];
	char sex[SIZE/8];
	int age;
	char telphone[SIZE/4];//key
	char address[SIZE];
}person_t;

typedef struct contact{
	int size;    //当前人数
	int cap;     //总容量
	person_t persons[TOTAL];
}contact_t;

void AddPerson(contact_t *ct);
void DeletePerson(contact_t *ct);
void SearchPerson(contact_t *ct);
//index==-1:show all
//index>=0:show index person
void ShowContact(contact_t *ct,int index);
void ModPerson(contact_t *ct);
void ClsContact(contact_t *ct);
void SortContact(contact_t *ct);

#endif
  • contact.c
 #include "contact.h"

//判断通讯录是否已满
static int IsFull(contact_t *ct){
	assert(ct);
	return ct->size == ct->cap;
}

//检测当前号码是否已经存在
//存在:返回-->person index
//不存在:返回-->-1
static int IsExist(contact_t *ct, const char *telphone){
	assert(telphone);
	person_t *end = ct->persons + ct->size;
	for (person_t *p = ct->persons; p < end; p++){
		if (0 == strcmp(p->telphone, telphone)){
			return p-ct->persons;//返回数组元素下标
		}
	} 
	return -1;
}
//检测当前姓名是否已经存在
//存在:返回-->person index
//不存在:返回-->-1
static int IsExist_name(contact_t *ct, const char *name){
	assert(name);
	person_t *end = ct->persons + ct->size;
	for (person_t *p = ct->persons; p < end; p++){
		if (0 == strcmp(p->name, name)){
			return p - ct->persons;//返回数组元素下标
		}
	}
	return -1;
}
//按姓名查找
static void SearchPersonNameHelper(contact_t *ct){
	assert(ct);
	char search_key[SIZE / 4];
	printf("请输入您要查找的姓名:");
	scanf("%s", search_key);
	int index = IsExist_name(ct, search_key);
	if (-1 == index){
		printf("您要查找的姓名[%s]不存在!\n",search_key);
		return;
	}
	else{ 
		ShowContact(ct, index);
	}
}
//按电话查找
static void SearchPersonTelHelper(contact_t *ct){
	assert(ct);
	char search_key[SIZE / 4];
	printf("请输入您要查找的电话号码:");
	scanf("%s", search_key);
	int index = IsExist(ct, search_key);
	if (-1 == index){
		printf("您要查找的号码[%s]不存在!\n", search_key);
		return;
	}
	else{
		ShowContact(ct, index);
	}
}

static int CompPerson(const void *x, const void *y){
	person_t *x_p = (person_t *)x;
	person_t *y_p = (person_t *)y;
	return strcmp(x_p->name, y_p->name);
}

//添加
void AddPerson(contact_t *ct)
{
	assert(ct); 
	if (IsFull(ct)){
		printf("contact is full!\n");
	}
	person_t *p = ct->persons + ct->size;
	printf("姓名:");
	scanf("%s", p->name);
	printf("电话:");
	scanf("%s", p->telphone);
	//以telephone为键值判断要插入的联系人是否已经存在
	if (IsExist(ct,p->telphone)>=0){
		printf("%s is exist!\n",p->name);
		return;
	}
	printf("性别:");
	scanf("%s", p->sex);
	printf("年龄:");
	scanf("%d", &(p->age));
	printf("地址:");
	scanf("%s", p->address);
	ct->size += 1;
	printf("add success!\n");
}

//删除
void DeletePerson(contact_t *ct){
	assert(ct);
	char del_key[SIZE / 4];
	printf("请输入您要删除的电话号码:");
	scanf("%s", del_key);
	int index = 0;
	if ((index = IsExist(ct, del_key))>=0){
		//删除
		ct->persons[index] = ct->persons[ct->size - 1];
		ct->size -= 1;
	}
	else{
		printf("您要删除的[ %s ]不存在!\n",del_key);
		return;
	}
	printf("Delete success!\n");
}

//查找
void SearchPerson(contact_t *ct){
	assert(ct);
	printf("################################\n");
	printf("##  1. 按照姓名  2. 按照电话  ##\n");
	printf("################################\n");
	int select = 0;
	printf("Please select:> ");
	scanf("%d", &select);
	switch (select){
	case 1:
		SearchPersonNameHelper(ct);
		break;
	case 2:
		SearchPersonTelHelper(ct);
		break;
	default:
		break;
	}
}

//修改
void ModPerson(contact_t *ct){
	assert(ct);
	char mod_key[SIZE / 4];
	printf("请输入您要修改的电话号码:");
	scanf("%s", mod_key);
	int index = 0;
	if ((index = IsExist(ct, mod_key)) >= 0){
		//修改特定信息
		printf("#################################\n");
		printf("##  1. 姓名           2. 性别  ##\n");
		printf("##  3. 年龄           4. 电话  ##\n");
		printf("##  5. 地址           6. 取消  ##\n");
		printf("#################################\n");
		printf("请选择要修改的信息:\n");
		int select = 0;
		scanf("%d", &select);
		switch (select){
		case 1:
			printf("请输入新的姓名:");
			scanf("%s", (ct->persons[index]).name);
			break;
		case 2:
			printf("请输入新的性别:");
			scanf("%s", (ct->persons[index]).sex);
			break;
		case 3:
			printf("请输入新的年龄:");
			scanf("%d", (ct->persons[index]).age);
			break;
		case 4:
			printf("请输入新的电话:");
			scanf("%s", (ct->persons[index]).telphone);
			break;
		case 5:
			printf("请输入新的地址:");
			scanf("%s", (ct->persons[index]).address);
		case 6:
			break;
		}
	}
	else{
		printf("您要修改的[ %s ]不存在!\n", mod_key);
		return;
	}
}

//显示
void ShowContact(contact_t *ct, int index){
	assert(ct);
	if (-1 == index){
		person_t *end = ct->persons + ct->size;
		printf("统计:%d/%d\n", ct->size, ct->cap);
		printf("-----------------------------------------------\n");
		for (person_t *p = ct->persons; p < end; p++){
			printf("|%-8s|%-1s|%-2d|%-11s|%-18s|\n", p->name, p->sex, p->age, p->telphone, p->address);
			printf("-----------------------------------------------\n");
		}
	}
	else{			
		person_t *p = ct->persons + index;
		printf("|%-8s|%-1s|%-2d|%-11s|%-18s|\n", p->name, p->sex, p->age, p->telphone, p->address);
	}
}

//清空通讯录
void ClsContact(contact_t *ct){
	assert(ct);
	ct->size = 0;  
}

//按姓名排序
void SortContact(contact_t *ct){
	assert(ct);
	qsort(ct->persons,ct->size,sizeof(person_t),CompPerson);
	printf("Sort success!\n");
}
  • main.c
#include "contact.h"
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
//7. 以名字排序所有联系人
static void Menu(){
	printf("\t\t\t#################################\n");
	printf("\t\t\t##  1. Add             2. Del  ##\n");
	printf("\t\t\t##  3. Search          4. Mod  ##\n");
	printf("\t\t\t##  5. Show            6. Cls  ##\n");
	printf("\t\t\t##  7. Sort            0. Quit ##\n");
	printf("\t\t\t#################################\n");
	printf("Please select:> ");
}
int main()
{
	contact_t ct;
	memset(&ct, 0, sizeof(ct));//清空
	ct.cap = TOTAL;
	int quit = 0;
	int select = 0;
	while (!quit){
		Menu();
		scanf("%d", &select);
		switch (select){
		case 1:
			AddPerson(&ct);
			break;
		case 2:
			DeletePerson(&ct);
			break;
		case 3:
			SearchPerson(&ct);
			break;
		case 4:
			ModPerson(&ct);
			break;
		case 5:
			ShowContact(&ct,-1);
			break;
		case 6:
			ClsContact(&ct);
			break;
		case 7:
			SortContact(&ct);
			break;
		default:
			quit = 1;
			break;
		}
	}
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值