课程设计(C语言版)部分讲解

重点设计及编码
以下是我从整体代码中节选的登录代码

该代码可以独立运行,后缀为.c

账户 yonghu1 yonghu2
密码 yonghu1 yonghu2

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <conio.h>
#define


/**
用于从键盘中获取指定范围[n1,n2]的整数,用于选择操作
*/
int readInt(int n1,int n2){
int n;
scanf("%d",&n);
while(n<n1||n>n2){
printf("请重新输入:");
scanf("%d",&n);
}
return n;
}

/**
用于从键盘中获取'y'或'n'
*/
char readConfirmSelection(){
char c;
for(; ;) {
fflush(stdin);//消除回车的scanf的影响
scanf("%c",&c);
if(c=='y'||c=='n') {
break;
}else {
printf("选择错误,请重新输入:");
}
}

return c;

}


//用于密码的隐式输入
void mi(char word[]){

int i=0;
int is_b=0;
char c;
while(1){
c=_getch();//获取字符
if(c=='\r'){
if(is_b==1){
//为回车符前的Back符号没删除的数组最后一项作清空 ,原因不会覆盖多输入的一项,所以要清空
//举例:要想输入123456,但是输入了1234567,用Back清除7但是数组中的7没被删除,所以需将最后一项清空
//如果没有这个if,对上面的特殊情况,数组依然是1234567
//该if对最前以及中间的Back键都起作用,可使下面的'\b'和--i的操作从要覆盖当前输入的最后一项真正变成了清除当前输入的最后一项
word[i]=0;
}
break;//回车符结束输入
}else if(c=='\b'){
is_b=1;
printf("\b \b");//界面显示Back
--i;//数组索引前移,只有再次输入,才将会覆盖要Back的那项
}else{
word[i++]=c;// 输入到数组
printf("*");//显示 *
}

}

printf("\n");

}

//倒计时 ,用于输入密码错误后的等待
void daojishi (int a){

while(a>=0)
{

printf("%d ",a);
Sleep(1000);//等待1000毫秒即为1秒
a=a-1;
}

printf("\n");
}


//用户管理界面(略)
void userview(){
printf("\t\t进入\n");
printf("\t************************\n");
printf("\t************************\n");
printf("\t************************\n");
printf("\t************************\n");
printf("\t\t退出\n\n");
}

//用户登录界面

void User(){

char username[10][N] = {"yonghu1","yonghu2"}; //存储账户名 username [10]的二维数组
char password[10][N] = {"yonghu1","yonghu2"}; //存储密码 password [10]的二维数组
char name[10];//输入 账户名
char word[10];//输入 密码

int n=2;//用来记录有多少组username和password
while(1){

printf("****************用户登录系统****************\n");
printf(" 1登录\n");
printf(" 2注册\n");
printf(" 3退出\n");
printf("请选择(1-3):");
int choice;
choice=readInt(1,3);
switch(choice){
case 1:{

printf("登录\n");


int signin=0; //用于判断是否登录进去
while(1){

printf("\t请输入账户名:\n");
printf("\t账户名:");
scanf("%s",name);
printf("\n");

int i=0;//用来一一匹配name和username[i]、word和password[i]
int isThree=1;//用于判断是否输入了三次错误密码
for(i=0;i<n;i++){

if( strcmp(username[i] , name) == 0)
{
printf("\t请输入密码(%d):\n",isThree);
printf("\t密码:");
// scanf("%s",word);

mi(word); //隐式密码输入



for(isThree=1;isThree<4;isThree++){

if( strcmp( password[i] , word) == 0 )
{
printf("\n\n");
printf("\t*******************************\n");
printf("\t***** 欢迎用户\"%s\"! *****\n",name);
printf("\t*******************************\n");
printf("\n\n");

userview();//进入-->退出
signin=1;//登录进入 了
break;

}
else
{

if(isThree==3){
printf("\t密码错误超过3次\n\n");
break;
}
printf("\t密码错误,请在5秒后再次输入密码\n");
printf("\t");
daojishi(5);//等待操作
printf("\t请重新输入密码(%d)!\n",isThree+1);
printf("\t密码:");
mi(word);

if( strcmp( password[i] , word) == 0 ){

printf("\n\n");
printf("\t*******************************\n");
printf("\t***** 欢迎用户\"%s\"! *****\n",name);
printf("\t*******************************\n");
printf("\n\n");

userview();
signin=1;
break;
}
}

}
}

}


if(signin==1){//登录进去之后, userview()操作完成以后,退出输入账户的while循环 ,进入 用户登录系统的while循环
break;
}

if(i==n){//没有登录进去,for循环的i等于n
printf("\t账户名或密码错误\n");

printf("\t 1重新输入账户名\n");
printf("\t 2临时注册账户名\n");
printf("\t 3 退出\n");
printf("\t请输入:");
int selection;
selection=readInt(1,3);
if(selection==1){//进入输入账户的while循环
;
}else if(selection==2){
while(1){
printf("\t注册\n");
printf("\t输入账户名:");
scanf("%s",&username[n]);
printf("\t输入密码:");
mi(password[n]);
printf("\t请再次输入,以确认密码:");
char twiceword[18];
mi(twiceword);
if(strcmp(password[n],twiceword)==0){
printf("\t注册成功\n\n");
n++;//记录数改变,以便用于下一次注册
break;//退出注册的while循环, 进入输入账户的while循环
}else{
printf("\t确认密码失败,重新注册\n");
}

}


}else{
break;//退出输入账户的while循环 ,进入 用户登录系统的while循环
}

}



}

break;//退出switch中的case 1
}

case 2:{

while(1){
printf("\t注册\n");
printf("\t输入账户名:");
scanf("%s",&username[n]);
printf("\t输入密码:");
mi(password[n]);
printf("\t请再次输入,以确认密码:");
char twiceword[18];
mi(twiceword);
if(strcmp(password[n],twiceword)==0){
printf("\t注册成功\n\n");
n++;//记录数改变,以便用于下一次注册
break;
}else{
printf("\t确认密码失败,重新注册\n");
}

}
break;//退出switch中的case 2
}
case 3:{
printf("请确认是否退出(y或n):");
char isExit;
isExit=readConfirmSelection();
if(isExit=='y'){
return;//退出用户登录系统的while循环也退出User函数 ,进入main函数之后的操作
}


}






}
}


}

void main(){
User();
}