⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chenrunhua.c

📁 用C语言实现了一个简单的电话管理系统
💻 C
字号:
//两个关键:1.不能用scanf函数,否则误打空格,系统将崩溃。2.选择菜单时,不能用简单的int或char输入,否则
//系统也将会崩溃
//一个不常见语句:goto起到输入不合法时,转向重新输入的功能。此语句应注意:此语句内容中不能包含定义
//成分
#include<stdio.h>
#include<conio.h>//引入getche()实现只接受一个字符
#include<string.h>
#include<malloc.h>
#include<ctype.h>
#define DEBUG 0//调试把0改为1
typedef struct PhoneUser{
	char username[20];
	char useraddress[30];
	char num[12];
	struct PhoneUser *pnext;//必须
}PhoneUser;
void main()
{
	//声明函数部分
	PhoneUser *adduser(PhoneUser *phead);
	void edituser(PhoneUser *phead);
	PhoneUser *deluser(PhoneUser *phead);
	void phonefind(PhoneUser *phead);
	void namefind(PhoneUser *phead);
	void userview(PhoneUser *phead);
	//定义变量
	PhoneUser * phead=NULL;
	char type;
	//提示用户信息
	printf("\t\t★★★★★★电话号码目录系统★★★★★★\n");
	do
	{
	printf("\n\t\t\t 1:添加新电话用户\n");
	printf("\t\t\t 2:修改电话用户的信息\n");
	printf("\t\t\t 3:删除已有电话用户的信息\n");
	printf("\t\t\t 4:根据电话号码查询电话用户信息\n");
	printf("\t\t\t 5:根据用户名称查询电话用户信息\n");
	printf("\t\t\t 6:显示所有电话用户信息\n");
	printf("\t\t\t 7:退出\n");
	printf("请选择:");
	//接受第一个字符进行操作
	type=getche();
	switch(type)
	{
		//添加新用户
	case '1':
		phead=adduser(phead);break;
		//修改用户信息
	case '2':
		edituser(phead);break;
		//删除用户
	case '3':
		phead=deluser(phead);break;
		//根据电话号码查询
	case '4':
		phonefind(phead);break;
		//根据用户名查询
	case '5':
		namefind(phead);break;
	case '6':
		//显示所有用户
		userview(phead);break;
		//退出
	case '7':
        printf("\n");
		break;
	default:
		printf("\n输入错误,请重新选择!\n");
	}
	}while(type!='7');
}
//第二阶段
//1添加新用户函数
PhoneUser *adduser(PhoneUser *phead)
{
	PhoneUser *ptemp=NULL,*p;
	unsigned int i=0;//unsinged与strlen匹配
	char ch;
#if DEBUG
	printf("\n现在正在调试添加函数!!!\n");
#endif
    //输入用户名不超过20个字符且不含空格
InputUsername:
	//每次必须重新分配空间
	ptemp=(PhoneUser *)malloc(sizeof(PhoneUser));
	//分配不成功,转向主函数
	if(ptemp==NULL)
		return phead;
	printf("\n请输入新增用户名称(最多20个字符且不含空格):");
	gets(ptemp->username);
	if(strlen(ptemp->username)>20||strlen(ptemp->username)==0)
	{
		printf("用户名输入错误,请重新输入!\n\n");
		goto InputUsername;
	}
	else
	{
		for(i=0;i<strlen(ptemp->username);i++)
			if(ptemp->username[i]==' ')
			{
				printf("用户名输入错误,请重新输入!\n\n");
				goto InputUsername;
			}
	}
	//输入家庭地址不超30个字符且不含空格
InputUseraddress:
	printf("\n请输入新增用户家庭住址(最多30个字符且不含空格):");
	gets(ptemp->useraddress);
	if(strlen(ptemp->useraddress)>30||strlen(ptemp->useraddress)==0)
	{
		printf("家庭地址输入错误,请重新输入!\n\n");
		goto InputUseraddress;	
	}
	else
	{	
		for(i=0;i<strlen(ptemp->useraddress);i++)
			if(ptemp->useraddress[i]==' ')
			{
				printf("家庭地址输入错误,请重新输入!\n\n");
				goto InputUseraddress;
			}
	}
	//严格控制电话号码
	//电话号码必须是7位数字且不含空格
InputNum:
	printf("\n请输入新增用户电话号码(7位数字):");
	gets(ptemp->num);
	if(strlen(ptemp->num)!=7)
	{
		printf("对不起,电话号码必须是7位,请重新输入!\n\n");
		goto InputNum;
	}
	else
	{
		//电话号码必须全是数字
		for(i=0;i<strlen(ptemp->num);i++)
		{
			if(!(ptemp->num[i]>='0'&&ptemp->num[i]<='9'))
			{
				printf("对不起,电话号码必须全是数字,请重新输入!\n\n");
				goto InputNum;
			}
		}
		//电话号码不能重复
		p=phead;
		while(p)
		{
			if(strcmp(p->num,ptemp->num)==0)
			{
				printf("对不起,电话号码不能重复,请重新输入!\n\n");
				goto InputNum;
			}
			p=p->pnext;
		}
	}
	ptemp->pnext=NULL;
	if(phead==NULL)
		phead=ptemp;
	else
	{
		p=phead;
		while(p->pnext!=NULL)
			p=p->pnext;
		p->pnext=ptemp;
	}
	//添加成功后,反溃信息
	printf("新用户记录成功添加:");
	printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
	printf("添加成功!!!\n\n");
	//用户可选择退出或继续添加
    printf("你还要添加吗?(Y/N或任意键退出):");
	ch=getche();
	if(ch=='Y'||ch=='y')
		goto InputUsername;
	else
		return phead;
}
//第三阶段
//2修改用户信息函数
//注:电话号码不修改,如你不想要这个号码,你可以删除,再重新添加
void edituser(PhoneUser *phead)
{
	PhoneUser *ptemp=phead;
	char num[8],ch;
	unsigned int i=0;
#if DEBUG
	printf("\n现在正在调试修改函数!!!\n");
#endif

	//如果暂无用户,则自动退出系统
	if(ptemp==NULL)
	{
		goto out;
	}
	//电话号码是修改信息的令牌
InputNum:
	printf("\n你要修改信息用户的电话号码:");
	gets(num);
	ptemp=phead;
	while(ptemp)
	{
		if(strcmp(ptemp->num,num)==0)
		{
		    printf("你要修改用户的全部信息:\n");
			printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
			//得令牌后,进行修改
			//修改用户名
InputUsername:
			printf("请输入修改后的用户名(小于20位且不含空格):");
			gets(ptemp->username);
			if(strlen(ptemp->username)>20||strlen(ptemp->username)==0)
			{
				printf("用户名输入错误,请重新选择添加!\n\n");
				goto InputUsername;
			}
			else
			{
				for(i=0;i<strlen(ptemp->username);i++)
					if(ptemp->username[i]==' ')
					{
						printf("用户名输入错误,请重新选择添加!\n\n");
						goto InputUsername;
					}
			}
			//修改家庭地址
InputUseraddress:
			printf("请输入修改后的用户地址(小于30位且不含空格):");
			gets(ptemp->useraddress);
			if(strlen(ptemp->useraddress)>30||strlen(ptemp->useraddress)==0)
			{
				printf("家庭地址输入错误,请重新输入!\n\n");
				goto InputUseraddress;	
			}
			else
			{	
				for(i=0;i<strlen(ptemp->useraddress);i++)
					if(ptemp->useraddress[i]==' ')
					{
						printf("家庭地址输入错误,请重新输入!\n\n");
						goto InputUseraddress;
					}
			}
			//显示修改后信息
			printf("你修改的信息为:");
			printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
			printf("修改成功!!\n\n");
			//选择退出或继续修改
			printf("你是否继续修改(Y/N或任意键退出):");
			ch=getche();
			if(ch=='Y'||ch=='y')
				goto InputNum;
			break;
		}
		ptemp=ptemp->pnext;
	}
	//没有得到令牌
	if(ptemp==NULL)
	{
		printf("没有此用户,输入信息有误!!!\n");
		printf("你是否继续修改(Y/N或任意键退出):");
		ch=getche();
		if(ch=='Y'||ch=='y')
		goto InputNum;
	}
	//还没有用户
	if(phead==NULL)
	{
out:
	printf("\n还没有用户!!!\n\n");
	}
}
//3删除用户函数
//注:为了避免误删除,在删除前,再进行一次确认
PhoneUser *deluser(PhoneUser *phead)
{
	PhoneUser *ptemp=phead,*p;
	char num[8],ch;
	int flag=0;
#if DEBUG
	printf("\n现在正在调试删除函数!!!\n");
#endif
    if(phead==NULL)
	{
		flag=1;
		goto out;
	}
	//确认删除
	printf("\n请确实要删除电话用户吗?(Y/N或任意键退出):");
	ch=getche();
	if(ch=='Y'||ch=='y')
	{
		//获取令牌
		while(ptemp)
		{
InputNum:
			if(phead==NULL)
			{
				flag=1;
				goto out;
			}
			ptemp=phead;
			printf("\n请输入你要删除用户的电话号码:");
			gets(num);
			if(strcmp(ptemp->num,num)==0)
			{
				printf("你要删除用户的全部信息:\n");
				printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
				p=phead;
				if(phead==ptemp)
				{
					phead=ptemp->pnext;
					break;
				}
				while(1)
				{
					if(p->pnext==ptemp)
					{
						p->pnext=ptemp->pnext;
						break;
					}
					p=p->pnext;
				}
				break;
			}
			ptemp=ptemp->pnext;
		}
		//没有令牌
		if(ptemp==NULL)
		{
			printf("没有此用户,输入信息有误!!!\n\n");
			//可以再删除,也可以退出
			printf("你还要继续删除吗?(Y/N或任意键退出):");
			ch=getche();
			if(ch=='Y'||ch=='y')
				goto InputNum;
		}
		else
		{
			printf("删除成功!!!\n\n");
			//可以删除,也可以退出
			printf("你还要继续删除吗?(Y/N或任意键退出):");
			ch=getche();
			if(ch=='Y'||ch=='y')
				goto InputNum;
		}
	}
	if(flag==1)
	{
out:
	printf("\n还没有用户!!!\n\n");
	}
	return phead;
}
//4根据电话号码查询函数
void phonefind(PhoneUser *phead)
{
	PhoneUser *ptemp=phead;
	char phone[20],ch;
#if DEBUG
	printf("\n现在正在调试电话号码查询函数!!!\n");
#endif

	if(ptemp==NULL)
	{
		goto out;
	}
InputNum:
	printf("\n你要查询用户信息的电话号码:");
	gets(phone);
	while(ptemp)
	{
		if(strcmp(ptemp->num,phone)==0)
		{
			printf("这是你要查询用户的全部信息:\n");
			printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
			printf("查询成功!!!\n\n");
			//选择继续查询或退出
			printf("你还继续查询吗?(Y/N或按任意键退出):");
		    ch=getchar();
			if(ch=='Y'||ch=='y')
				goto InputNum;
			break;
		}
		ptemp=ptemp->pnext;
	}
	if(ptemp==NULL)
	{
		printf("没有此电话号码,输入信息有误!!!\n");
		//选择继续查询或退出
		printf("你还继续查询吗?(Y/N或按任意键退出):");
		ch=getche();
		if(ch=='Y'||ch=='y')
			goto InputNum;
	}
	if(phead==NULL)
	{
out:
		printf("\n还没有用户!!!\n\n");
	}
}
//5根据用户名查询函数
void namefind(PhoneUser *phead)
{
	PhoneUser *ptemp=phead;
	char name[20],ch;
#if DEBUG
	printf("\n现在正在调试用户名查询函数!!!\n");
#endif

	if(ptemp==NULL)
	{
		goto out;
	}
InputUsername:
	printf("\n你要查询用户信息的用户名:");
	gets(name);
	while(ptemp)
	{
		if(strcmp(ptemp->username,name)==0)
		{
			printf("这是你要查询用户的全部信息:\n");
			printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
			printf("查询成功!!!\n\n");
			//选择继续查询或退出
			printf("你还继续查询吗?(Y/N或任意键退出):");
			ch=getche();
			if(ch=='Y'||ch=='y')
				goto InputUsername;
			break;
		}
		ptemp=ptemp->pnext;
	}
	if(ptemp==NULL)
	{
		printf("没有此用户,输入信息有误!!!\n");
		//选择继续查询或退出
		printf("你还继续查询吗?(Y/N或任意键退出):");
		ch=getche();
		if(ch=='Y'||ch=='y')
			goto InputUsername;
	}
	if(phead==NULL)
	{
out:
	printf("\n还没有用户!!!\n\n");
	}
}
//第四阶段
//6显示所有用户函数
void userview(PhoneUser *phead)
{
	PhoneUser *ptemp=phead;
#if DEBUG
	printf("\n现在正在调试显示用户函数!!!\n");
#endif

	//还没有用户,无条件退出
	if(ptemp==NULL)
		printf("\n还没有用户!!!\n\n");
	else
	{
	printf("\n这是所有用户信息:\n");
	while(ptemp)
	{
		printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
		ptemp=ptemp->pnext;
	}
	printf("\n");
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -