基于Linux系统下的C语言训练项目——《电子通讯录》

项目介绍:

        联系人信息:

                姓名、性别、联系电话

        功能:

                1、添加联系人

                2、删除联系人

                3、修改联系人信息

                4、查询联系人

                5、显示所有联系人

                6、该通讯录最多只存储100个联系人

#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

// 通用的工具函数
void clear_stdin(void)
{
	stdin->_IO_read_ptr = stdin->_IO_read_end;
}

char* get_str(char* str,size_t size)
{
	clear_stdin();

	size_t len = strlen(fgets(str,size,stdin));
	if('\n' == str[len-1])
		str[len-1] = '\0';
	
	clear_stdin();

}

void put_str(const char* msg,float sec)
{
	printf("%s\n",msg);
	usleep(1000000*sec);
}

char get_cmd(char start,char end)
{
	clear_stdin();
	printf("---------------------------\n");
	printf("请输入指令[%c,%c]:",start,end);

	for(;;)
	{
		char cmd = getch();
		if(start <= cmd && cmd <= end)
		{
			printf("%c\n",cmd);
			return cmd;
		}
	}

}

bool yes_or_no(const char* msg)
{
	clear_stdin();
	printf("%s(y/n)?\n",msg);
	for(;;)
	{
		char cmd = getch();
		if('y' == cmd || 'Y' == cmd)
			return true;
		if('n' == cmd || 'N' == cmd)
			return false;
	}
}

void anykey_continue(void)
{
	clear_stdin();
	printf("按任意键继续...\n");
	getch();
}

// 通讯录专用的函数
const char* sex_to_str(char sex)
{
	switch(sex)
	{
	case 'w':
	case 'W':
		return "女";
	case 'm':
	case 'M':
		return "男";
	default:
		return "狗";
	}
}
char get_sex(void) 
{
	clear_stdin();
	printf("请输入性别(w女/m男):");
	for(;;)
	{
		char sex = getch();
		if('w' == sex || 'W' == sex || 'm' == sex || 'M' == sex)
		{
			printf("%s\n",sex_to_str(sex));
			return sex;
		}
	}	
}

char menu(void)
{
	system("clear");

	puts("***欢迎使用电子通讯录***");
	puts("1、添加	2、删除");
	puts("3、修改	4、查询");
	puts("5、遍历	6、退出");
	
	return get_cmd('1','6');

}

char name[100][20];
char sex [100];
char phone[100][12];
size_t cnt;
float msg_show_sec = 1.5;

void add(void)
{
	char cmd;
	do{
		

		if(cnt >= 100)
		{
			put_str("通讯录已满!",msg_show_sec);
			return;
		}
	
		printf("请输入姓名:");
		get_str(name[cnt],sizeof(name[0]));
	
		sex[cnt] = get_sex();
	
		printf("请输入电话:");
		get_str(phone[cnt],sizeof(phone[0]));
	
		bool flag = true;
		for(int i=0; i<cnt; i++)
		{
			if(!strcmp(phone[i],phone[cnt]))
			{
				flag = false;
				break;
			}
		}
	
		cnt += flag;
	
		if(flag)
			printf("添加联系人成功,");
		else
			printf("该电话已存在,添加联系人失败,");
	
		cmd = yes_or_no("是否继续");
	}while(cmd);
	
	put_str("结束添加!",msg_show_sec);

}

int query(const char* key)
{
	for(int i=0; i<cnt; i++)
	{
		if(!strcmp(phone[i],key))
			return i;
	}

	return -1;

}

void del(void)
{
	char key[12];
	

	printf("请输入要删除的联系人电话:");
	get_str(key,sizeof(key));
	
	int index = query(key);
	if(-1 == index)
	{
		put_str("未找到该联系人,无法删除!",msg_show_sec);
		return;
	}
	
	cnt--;
	strcpy(name[index],name[cnt]);
	strcpy(phone[index],phone[cnt]);
	sex[index] = sex[cnt];
	
	put_str("删除联系人成功!",msg_show_sec);

}

void mod(void)
{

}

void find(void)
{
	char key[20];
	printf("请输入要查询的关键字:");
	get_str(key,sizeof(key));

	bool flag = false;
	for(int i=0; i<cnt; i++)
	{
		if(strstr(name[i],key) || strstr(phone[i],key))
		{
			printf("%s %s %s\n",name[i],sex_to_str(sex[i]),phone[i]);
			flag = true;
		}
	}
	
	if(flag)
		anykey_continue();
	else
		put_str("该关键字未查询到联系人!",msg_show_sec);

}

void show(void)
{
	if(0 == cnt)
	{
		put_str("暂无联系人!",msg_show_sec);
		return;
	}

	for(int i=0; i<cnt; i++)
	{
		printf("%s %s %s\n",name[i],sex_to_str(sex[i]),phone[i]);
	}
	
	anykey_continue();

}

void save(void)
{
	FILE* fp = fopen("data.txt","w");
	if(NULL == fp)
	{
		puts("保存数据失败!");
		return;
	}

	for(int i=0; i<cnt; i++)
	{
		fprintf(fp,"%s %c %s\n",name[i],sex[i],phone[i]);
	}
	
	printf("成功保存 %d 条数据!\n",cnt);
	fclose(fp);

}

void load(void)
{
	FILE* fp = fopen("data.txt","r");
	if(NULL == fp)
	{
		puts("加载数据失败!");
		return;
	}

	int ret = 0;
	do{
		ret = fscanf(fp,"%s %c %s",name[cnt],&sex[cnt],phone[cnt]);
	}while(3 == ret && ++cnt);
	
	printf("成功加载 %d 条数据!\n",cnt);
	fclose(fp);

}


int main(int argc,const char* argv[])
{
	load();

	for(;;)
	{
		switch(menu())
		{
		case '1':
			add();
			break;
		case '2':
			del();
			break;
		case '3':
			mod();
			break;
		case '4':
			find();
			break;
		case '5':
			show();
			break;
		case '6':
			save();
			return 0;
		}
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值