/*
设计一个无人超市会员注册系统程序,要求至少实现如下功能:
打印欢迎登录信息,提示用户选择进入以下功能:
- 新用户注册
- 用户登录
- 退出系统
新用户注册要求:
(1) 用户名必须为英文字母或英文字母+数字,其他字符判断为非法用户名,总长度不超过20个字符。
(2) 手机号码必须为11位数字,其他字符判断为非法。
(3) 密码不低于6位,总长度不超过20个字符,低于6位或者超过20位判断为非法,注册要求输入2次密码,判断2次输入是否一致。
(4) 新用户注册赠送100元。
(5) 新用户会员类型默认为普通会员,没有折扣。
(6) 新用户会员类型默认为账号正常状态。
用户登录要求:
(1)输入用户名或者手机号码均可登录。
(2)密码输入错误超过5次,将账号状态改为锁定。
(3)登录后显示用户数据,包括用户名,手机号码,余额,会员类型,账号状态。
(4)可以进入充值功能,充值10000元,自动升级为银卡会员;充值50000元自动升级为金卡会员。充值成功后提示当前的会员状态和享受的折扣。
退出系统:提示欢迎下次光临等礼貌用语。
交互界面:整体美观整洁,便于用户操作。
*/
下面附上代码 哪里不懂的或者可以改进的可以请私信我~
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define NUM 50
typedef struct Users{
float balance; //余额
int memberType; //会员类型,0表示普通会员,1表示银卡会员,2表示金卡会员
float discount[3]; //普通会员没折扣,银卡会员9折,金卡会员8折
int userState; //账号状态,0表示正常,1表示锁定
char name[22]; //用户名
char mobileNumber[12]; //手机号码
char password[21]; //密码
} User;
User user[NUM] = {0,0,{1,0.9,0.8},0}; //初始化
int count_user = 0; //存储注册用户的数量
void regist(); //注册模块
void login(); //登录模块
void login_judge(int); //登录检测及用户操作
int main()
{
int option;
printf("欢迎光临 X X 超市\n"); //欢迎语
while(1){ //当用户未选择退出系统时一直循环
printf("\n请输入数字选择以下功能:\n\n1. 新用户注册\n\n2. 用户登录\n\n3. 退出系统\n\n");
scanf("%d",&option);
while(option < 1||option > 3){ //检测操作数
printf("您的输入有误,请重新输入哦(1 , 2 or 3)\n");
fflush(stdin); //清除缓冲区
scanf("%d",&option);
}if(option == 1){
regist();
}else if(option == 2){
login();
}else{ //结束语
printf("\n\n感谢您的使用 ^_^ ,欢迎下次再来哦 !\n");
break;
}
}
return 0;
}
void regist(){
int len_name,len_num,i,len_pswd; //定义长度变量用于检验用户的输入
char flag_alnum = 1 ; //作为用户名是否仅为字符和数字的标志
char test[21]; //用来存储用户第一次输入的密码,方便与下次输入进行比较
printf("注册界面\n\n");
// 输入用户名
printf("(温馨提示:用户名必须为英文字母或英文字母+数字,总长度不超过20个字符)\n\n请输入用户名:");
scanf("%s",user[count_user].name);
len_name = strlen(user[count_user].name);
for(i = 0;i < len_name;i++){ //检测用户名是否仅为字符和数字
if(!isalnum(user[count_user].name[i])){
flag_alnum = 0;
break;
}
}while( len_name > 20 ){ //检测用户名长度
printf("您的输入有误!!总长度不超过20个字符,请重新输入:\n\n");
scanf("%s",user[count_user].name);
len_name = strlen(user[count_user].name);
}while(!flag_alnum){
flag_alnum = 1;
printf("您的输入有误!!请输入英文字母或英文字母+数字\n\n");
scanf("%s",user[count_user].name);
if(!isalnum(user[count_user].name[i])){
flag_alnum = 0;
break;
}
}
printf("\n您输入的用户名为:%s",user[count_user].name);
// 输入手机号码
printf("\n\n(温馨提示:手机号码必须是11位数字)\n\n请输入您的手机号码:");
scanf("%s",user[count_user].mobileNumber);
len_num = strlen(user[count_user].mobileNumber);
while(len_num != 11){ //检测手机号长度
printf("您的输入有误!!手机号码必须是11位 请重新输入:\n\n");
scanf("%s",user[count_user].mobileNumber);
len_num = strlen(user[count_user].mobileNumber);
}
printf("\n您输入的手机号码为:%s",user[count_user].mobileNumber);
// 输入密码
printf("\n\n(温馨提示:密码长度应不低于6个字符,且不超过20个字符)\n\n请输入密码:");
re: scanf("%s",test); //添加一个re标签,若用户两次密码不同则会到此处重新输入
len_pswd = strlen(test);
while( len_pswd > 20||len_pswd < 6 ){//密码长度检测
printf("您的输入有误!!总长度不低于6个字符,且不超过20个字符,请重新输入:\n\n");
scanf("%s",test);
len_pswd = strlen(test);
}
printf("\n请再次输入密码:");
scanf("%s",user[count_user].password);
if(strcmp(test,user[count_user].password) == 0){
printf("\n密码设置成功!");
}else{
printf("您输入的密码与上次不符!请重新输入:");
goto re;
}
printf("\n\n注册中···请稍等片刻");
printf("\n\n注册成功!\n\n");
user[count_user].balance = 100;
count_user++; //用于储存下一名用户
}
void login(){
int option;
printf("登陆界面\n\n");
printf("请选择登录方式:1:用户名登录 2:手机号登录\n\n");
scanf("%d",&option);
while(option != 1 && option != 2){
printf("您的输入有误,请重新输入哦( 1 or 2 )\n");
scanf("%d",&option);
}
login_judge(option); //登录判断及用户操作
}
void login_judge(int option){
char opname[2][10] = {"用户名","手机号"};
char membertype[3][9] = {"普通会员","银卡会员","金卡会员"};
char temp[21];
char state[2][5] = {"正常","异常"};
int flag = 0,count_input = 1;
int i,k,operation; //k用来储存该用户在结构体数组中的下标
float recharge = 0,temp_recharge = 0,payment = 0; // 充值金额
printf("\n请输入您的%s:",opname[option-1]);
scanf("%s",temp);
while(flag == 0){
printf("\n您输入的%s为:%s\n\n",opname[option-1],temp);
if(option == 1){
for(i = 0; i <= count_user;i++){
if(strcmp(temp,user[i].name) == 0){
k = i;
flag = 1;
break;
}else{
printf("该%s未注册!请重新输入:",opname[option-1]);
scanf("%s",temp);
}
}
}if(option == 2){
for(i = 0; i <= count_user;i++){
if(strcmp(temp,user[i].mobileNumber) == 0){
k = i;
flag = 1;
break;
}else{
printf("该%s未注册!请重新输入:\n",opname[option-1]);
scanf("%s",temp);
}
}
}
}
if(user[k].userState == 1){ //账户处于锁定状态则不允许登录
printf("您的帐户已锁定,请持身份证到前台客服解锁!\n");
return ;
}
printf("请输入密码:");
scanf("%s",temp); //错误达到5次则自动锁定账户
while(count_input <= 5 && strcmp(temp,user[k].password) != 0){
if(count_input == 5){
printf("\n您输入错误的次数已达到5次,账号已自动锁定!请持身份证到前台客服解锁!\n");
user[k].userState = 1;
return ;
}else{
printf("\n密码输入错误!请重新输入:");
scanf("%s",temp);
count_input++;
}
}
printf("\n\n登陆中···请稍等片刻\n\n");
printf("登陆成功!\n\n");
while(operation != 4){
printf("\n请输入数字选择以下功能:\n\n1. 查看用户信息\n\n2. 充值\n\n3. 付款\n\n4. 退出登录\n\n");
scanf("%d",&operation);
while(operation < 1 || operation > 4){
printf("您的输入有误,请重新输入哦(1 2 3 or 4)\n");
}if(operation == 4){
return ;
}else if(operation == 1){
printf("用户名:%s\n手机号码:%s\n余额:%.2f\n会员类型:%s\n",user[k].name,user[k].mobileNumber,user[k].balance,membertype[user[k].memberType],state[user[k].userState]);
}else if(operation == 2){
printf("请输入充值金额:") ;
scanf("%f",&temp_recharge);
user[k].balance += temp_recharge;
recharge += temp_recharge;
if(recharge >= 10000 ){ //达到一定金额则升级会员
if(recharge >= 50000 ){
user[k].memberType = 2;
printf("\n恭喜您升级为黄金会员,付款可以享受8折优惠\n");
}else{
user[k].memberType = 1;
printf("\n恭喜您升级为白金会员,付款可以享受9折优惠\n");
}
}
}else if(operation == 3){
printf("请输入付款金额:") ;
scanf("%f",&payment);
if(payment > user[k].balance){
printf("抱歉!您的余额不足!请充值\n");
}else{
printf("支付成功!原支付金额为:%.2f 会员优惠金额为:%.2f\n",payment,payment*(1-user[k].discount[user[k].memberType]));
user[k].balance -= payment*(1-user[k].discount[user[k].memberType]);
}
printf("您当前的余额为:%.2f\n",user[k].balance);
}
}
}
下面是效果图: