基于Linux系统下的C语言项目开发-《用户管理系统》

用户信息:

ID、昵称、密码、手机号

登录前的功能:

1、注册用户

要确认密码

2、用户登录

ID、密码(二分查找)

3、重置密码

ID、昵称、手机号全部符合

4、遍历用户

5、退出系统

登录后的功能:

1、查看信息

2、修改信息

修改昵称、修改手机号

3、修改密码

先输入旧密码、再输入新密码、再确认新密码

4、退出登录



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

typedef struct User
{
	int id;
	char name[20];
	char passwd[10];
	char phone[12];
}User;

User users[100];
size_t cnt = 0;
float msg_show_sec = 0.8;
int login_index;

// 通用的工具函数
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();
}

char* get_passwd(char* pwd,size_t size,bool is_show)
{
	clear_stdin();
	size_t index = 0;
	while(index < size-1)
	{
		pwd[index] = getch();
		if('\n' == pwd[index])
		{
			break;
		}

		if(127 == pwd[index])
		{
			if(index > 0)
			{
				index--;
				if(is_show)
				{
					printf("\b \b");
				}
			}
			continue;
		}
	
		if(is_show)
		{
			printf("*");
		}
	
		index++;
	}
	
	pwd[index] = '\0';
	printf("\n");
	return pwd;

}

void show_user_info(void)
{
	printf("%d %s %s\n",
			users[login_index].id,
			users[login_index].name,
			users[login_index].phone);
	anykey_continue();
}

void modify_user(void)
{
	puts("*****请选择要修改的信息*****");
	puts("1、修改昵称	2、修改手机号");
	switch(get_cmd('1','2'))
	{
	case '1':
		printf("请输入新的昵称:");
		get_str(users[login_index].name,sizeof(users[login_index].name));
		break;
	case '2':
		printf("请输入新的手机号:");
		get_str(users[login_index].phone,sizeof(users[login_index].phone));
		break;
	}

	printf("修改后的个人信息:");
	show_user_info();

}

void modify_passwd(void)
{
	char passwd[10];
	printf("请输入旧密码:");
	get_passwd(passwd,sizeof(passwd),true);

	if(strcmp(passwd,users[login_index].passwd))
	{
		put_str("旧密码验证错误,无法继续!",msg_show_sec);
		return;
	}
	
	printf("请输入新密码:");
	get_passwd(passwd,sizeof(passwd),true);
	
	char repasswd[10];
	printf("请确认新密码:");
	get_passwd(repasswd,sizeof(repasswd),true);
	
	if(!strcmp(passwd,repasswd))
	{
		strcpy(users[login_index].passwd,passwd);
		put_str("修改密码成功!",msg_show_sec);
		return;
	}
	
	put_str("两次输入的密码不符,修改密码失败!",msg_show_sec);

}

char menu2(void)
{
	system("clear");
	printf("id=======%d\n",login_index);
	printf("*****欢迎用户 %s 登录*****\n",users[login_index].name);
	puts("1、查看信息	2、修改信息");
	puts("3、修改密码	4、退出登录");
	return get_cmd('1','4');
}

void login_success(void)
{
	for(;;)
	{
		switch(menu2())
		{
		case '1':
			show_user_info();
			break;
		case '2':
			modify_user();
			break;
		case '3':
			modify_passwd();
			break;
		case '4':
			return; 
		}
	}
}

char menu1(void)
{
	system("clear");
	puts("*****欢迎进入用户管理模块*****");
	puts("1、注册用户	2、用户登录");
	puts("3、重置密码	4、遍历用户");
	puts("5、退出系统");
	return get_cmd('1','5');
}

void rego_user(void)
{
	if(cnt >= 100)
	{
		put_str("系统正在升级,暂停注册!\n",msg_show_sec);
		return;
	}	

	users[cnt].id = rand()%90000+10000;
	
	printf("请输入昵称:");
	get_str(users[cnt].name,sizeof(users[cnt].name));
	
	printf("请输入手机号:");
	get_str(users[cnt].phone,sizeof(users[cnt].phone));
	for(;;)
	{
		printf("请输入密码(6~9位):");
		get_passwd(users[cnt].passwd,sizeof(users[cnt].passwd),true);
	
		size_t len = strlen(users[cnt].passwd);
		if(len < 6)
			printf("输入的密码不足6位请重新输入!");
		else
			break;
	}
	
	char repasswd[10];
	printf("请确认密码:");
	get_passwd(repasswd,sizeof(repasswd),true);
	
	if(strcmp(users[cnt].passwd,repasswd))
	{
		put_str("两次输入的密码不符,添加失败!",msg_show_sec);
		return;
	}
	
	// 插入排序
	int index = cnt;
	User back = users[index];
	
	while(index > 0)
	{
		if(users[index-1].id > back.id)
			users[index] = users[index-1];
		else
			break;
		index--;
	}
	users[index] = back;
	
	cnt++;
	printf("新用户ID:%d\n",back.id);
	put_str("添加用户成功!",msg_show_sec*2);

}

int binary_search(int key)
{
	int left = 0, right = cnt-1;
	while(left <= right)
	{
		int p = (left+right)/2;
		if(users[p].id == key)
			return p;
		if(users[p].id > key)
			right = p-1;
		else
			left = p+1;
	}

	return -1;

}

void login_user(void)
{
	int id;
	printf("请输入用户id:");
	scanf("%d",&id);

	char passwd[10];
	printf("请输入用户密码:");
	get_passwd(passwd,sizeof(passwd),true);
	
	int index = binary_search(id);
	if(0 <= index && !strcmp(passwd,users[index].passwd))
	{
		put_str("登录成功!",msg_show_sec);
		login_index = index;
		login_success();
		return;
	}
	
	put_str("用户名或密码错误,请检查!",msg_show_sec);

}

void reset_user(void)
{
	int id;
	printf("请输入用户ID:");
	scanf("%d",&id);

	char name[20];
	printf("请输入用户昵称:");
	get_str(name,sizeof(name));
	
	char phone[12];
	printf("请输入用户手机号:");
	get_str(phone,sizeof(phone));
	
	int index = binary_search(id);
	if(0 <=index && !strcmp(name,users[index].name) 
				 && !strcmp(phone,users[index].phone))
	{
		strcpy(users[index].passwd,"666666");
		put_str("重置密码成功!",msg_show_sec);
		return;
	}
	
	put_str("部分信息错误,重置密码失败!",msg_show_sec);

}

void show_user(void)
{
	if(cnt <= 0)
	{
		put_str("暂无用户显示!",msg_show_sec);
		return;
	}

	for(int i=0; i<cnt; i++)
	{
		printf("%d %s %s %s\n",
				users[i].id,
				users[i].name,
				users[i].passwd,
				users[i].phone);
	}
	
	anykey_continue();

}

void save(void)
{
	FILE* fp = fopen("ms.bin","w");
	if(NULL == fp)
	{
		put_str("保存数据失败!",msg_show_sec);
		return;
	}

	int ret = fwrite(users,sizeof(users[0]),cnt,fp);
	printf("成功保存 %d 条数据!\n",ret);
	
	fclose(fp);

}

void load(void)
{
	FILE* fp = fopen("ms.bin","r");
	if(NULL == fp)
	{
		put_str("加载数据失败!",msg_show_sec);
		return;
	}

	cnt = fread(users,sizeof(users[0]),100,fp);
	printf("成功读取 %d 条数据!\n",cnt);
	
	fclose(fp);

}


int main(int argc,const char* argv[])
{
	load();
	for(;;)
	{
		switch(menu1()-'0')
		{
		case 1:
			rego_user();
			break;
		case 2:
			login_user();
			break;
		case 3:
			reset_user();
			break;
		case 4:
			show_user();
			break;
		case 5:
			save();
			return 0;
		}
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值