通讯录——结构体指针数组实现

本文介绍了一个简易的通讯录管理系统的设计与实现,该系统使用C语言编写,具备添加、查询、修改、删除联系人及排序等功能,并针对现有不足提出了改进方向。

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

 实现功能有:

1.新建,添加联系人,在达到上限时输出book full!(存储上限可以通过改变宏定义里MAXSIZE的值来实现,为了测试方便,目前的 MAXSIZE = 3)

2.查看当前通讯录内所有联系人

3.以名字为索引查找联系人

4.以名字为索引修改联系人

5.以名字为索引删除联系人

6.按名字ASCII码值从小到大排序

7.按下按键esc退出

8.十分贴心地把字体调成了红色。

不足:

1.选择功能时必须键盘输入选项然后回车才有效。预想操作应该是按下对应按键直接实现功能,不用按回车,也不会在屏幕显示按下了哪个按键。

2.没能实现在添加联系人时,和上面一样按ESC不回车不显示直接退出。

3.在打印联系人列表时用sleep()函数暂留3秒,没能实现在打印出联系人列表后按任意键退出当前画面。、

4.输入的联系人名字是中文时,不会按拼音顺序排序

5.在每个功能界面快刷新的时候输入字符会影响到下次功能选择。

6.删除功能不完善,删除后再打印联系人信息列表,信息展示不对。

7.没有输入错误反馈不完善

 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#define MAXSIZE 3
#define ENTER 0x0d
#define ESC 0x1b
#define NEW '1'
#define SHOW '2'
#define FIND '3'
#define MODIFY '4'
#define DELETE '5'
#define SORT '6'
#define EXIT ESC

typedef struct
{
	char name[20];
	char tel[20];
}RECODER;

int person = 0;
//欢迎界面
void welcome()
{
	system("clear");
	printf("\n\n\n\033[1;33;40m----------------------------------------------------\n\n\n\n");
	printf("%20sWelcome\n"," ");
	printf("\n\n\n----------------------------------------------------\n");
	sleep(2);
}
//功能菜单
void menu()
{
	system("clear");
	printf("\n\n\n----------------------------------------------------\n");
	printf("\n%10s%-10s%10s%-10s\n"," ", "1.New"," ","2.Show");
	printf("\n%10s%-10s%10s%-10s\n"," ", "3.Find"," ","4.Modify");
	printf("\n%10s%-10s%10s%-10s\n"," ", "5.Delete"," ","6.Sort");
	printf("%15sPress <ESC> exit\n"," ");
	printf("----------------------------------------------------\n");
}
//新建、添加联系人
void AddInfo(RECODER *recoder[])
{
	char ch;
	if(person == MAXSIZE)
	{
		printf("\nBOOK FULL!\n");
		sleep(1);
		return;
	}
	printf("Please TYPE:\n");
	while(1)
	{
		if(person == MAXSIZE)
		{
			printf("\nBOOK FULL!\n");
			sleep(1);
			break;
		}
		recoder[person] = (RECODER *)malloc(sizeof(RECODER));
		printf("    Name: ");
		scanf("%s", recoder[person]->name);
		printf("    Tel : ");
		scanf("%s", recoder[person]->tel);
		printf("\n");
		printf("Quit<ESC> Continue<ENTER> \n");
		scanf("%c", &ch);
		scanf("%c", &ch);
		fflush(stdout);
		if(ch == ESC)
		{
			break;
		}
		printf("\n");
		person++;
	}
}
//查询、修改、删除
/* Find: choice = 0, Modify: choice = 1, Delete: choice = 2*/
void Find_Modify_Delete(RECODER *recoder[], int choice)
{
	char name[20];
	int index;
	int index_d;
	printf("Press name:");
	scanf("%s", name);
	printf("Find result:\v");
	for(index = 0; index < person; index++)
	{
		if( ! strcmp(recoder[index]->name, name) )
		{
			printf("%s %s\n", recoder[index]->name, recoder[index]->tel);
			sleep(1);
			if(choice == 1)
			{
				printf("Please TYPE:\n");
				printf("    %s's new Tel : ", recoder[index]->name);
				scanf("%s", recoder[index]->tel);
				printf("\n");
			}
			else if(choice == 2)
			{
				for(index_d = index; index_d < person - 1; index_d++)
				{
					//strcpy(recoder[index_d]->name, recoder[index_d + 1]->name);
					//strcpy(recoder[index_d]->tel, recoder[index_d + 1]->tel);
					recoder[index_d] = recoder[index_d + 1];
				}
				free(recoder[index_d]);
				recoder[index_d] = NULL;
				person--;
				printf("Delete success\n");
				sleep(1);
			}
		}
	}
	sleep(1);
}
//打印联系人信息列表
void ShowAll(RECODER *recoder[])
{
	int index;
	printf("\t%-20s %-20s\n","Name", "Telphone number");
	for(index = 0; index < person; index++)
	{
		printf("\t%-20s %-20s\n", recoder[index]->name, recoder[index]->tel);
	}
	sleep(3);
}
//排序
void Sort(RECODER *recoder[])
{
	int index_1;
	int index_2;
	RECODER *tmp;
	for(index_1 = 0; index_1 < person; index_1 ++)
	{
		for(index_2 = 0; index_2 < person - 1 - index_1; index_2++)
		{
			if(strcmp(recoder[index_2]->name, recoder[index_2 + 1]->name) > 0)
			{
				tmp = recoder[index_2];
				recoder[index_2] = recoder[index_2 + 1];
				recoder[index_2 + 1] = tmp;
			}
		}
	}
	printf("Sort success\n");
	sleep(1);
}


int main()
{
	RECODER *recoder[MAXSIZE];
	char choice;

	welcome();
	while(1)
	{
		menu();
		scanf("%c", &choice);
		switch(choice)
		{
			case NEW:
				AddInfo(recoder);
				break;
			case SHOW:
				ShowAll(recoder);
				break;
			case FIND:
				Find_Modify_Delete(recoder, 0);
				break;
			case MODIFY:
				Find_Modify_Delete(recoder, 1);
				break;
			case DELETE:
				Find_Modify_Delete(recoder, 2);
				break;
			case SORT:
				Sort(recoder);
				break;
			case EXIT:
				exit(0);
				break;
		}
	}
	return 0;
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值