解释以下代码的意义do{ printf("\n设置密码,请不要超过8位:"); for(i=0;i<8 && ((pwd[i]=getch())!=13);i++) putch('*'); printf("\n再确认一次密码:"); for(i=0;i<8 && ((pwd1[i]=getch())!=13);i++) putch('*'); pwd[i]='\0'; pwd1[i]='\0'; if(strcmp(pwd,pwd1)!=0) //判断两次新密码是否一致 { printf("\n两次密码输入不一致,请重新输入!\n\n"); } else break; }while(1);
时间: 2024-02-14 20:20:49 浏览: 58
这段代码实现了设置密码并进行确认的功能。具体意义如下:
首先,使用 `printf()` 函数提示用户设置密码,并要求密码不超过8位。
然后,使用 `for` 循环和 `getch()` 函数获取用户输入的密码,并将输入的字符用星号 `*` 替代显示。
接着,再次使用 `printf()` 函数提示用户确认密码,并使用类似的方式获取用户输入的确认密码。
在获取密码和确认密码后,使用 `strcmp()` 函数判断两次输入的密码是否一致。如果不一致,使用 `printf()` 函数提示用户重新输入。
如果密码和确认密码一致,则使用 `break` 语句结束 `do-while` 循环。
整个过程会一直重复,直到用户输入正确的密码为止。
相关问题
优化代码:#include<stdio.h> #include<stdlib.h> typedef struct LNode { int code;//存放序号 int key;//存放密码 struct LNode *next; }LNode,*LinkList; void CreatList(LinkList &L,int i)//建立有i个元素的单向循环链表 { LinkList p,s; int j; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; p=L; if(i!=0) printf("请按提示输入数据元素\n\n"); for(j=0;j<i;j++) { s=(LinkList)malloc(sizeof(LNode)); s->code=j+1; printf("请输入第%d个的密码: ",j+1); scanf("%d",&s->key); p->next=s; p=s; } p->next=L->next; } void ListDelete(LinkList &L,int i,int &e)//删除链表L中第i个元素 { LinkList p; int j; for(j=0; L && j<i-1;j++) { L=L->next; } p=L->next; e=p->key; L->next=p->next; printf("出列人的序号为%d,密码为%d\n",p->code,p->key); free(p); } int main() { LinkList L; int m,n,code; CreatList(L,0); printf("请输入总人数n:\n"); scanf("%d",&n); printf("请输入报数上限m:\n"); scanf("%d",&m); CreatList(L,n); code=0; while(L) { ListDelete(L,m,code); m=code; } return 0; }
这段代码存在一些可以进行优化的地方,以下是我建议的优化点:
1. 在输入密码时,可以将提示信息放在循环外部,只输出一次,避免每次循环都输出一次。
2. 在循环链表中,可以使用尾插法来构建链表,这样可以省去找到链表尾部的步骤。
3. 在删除链表中的第i个元素时,可以先判断i的合法性,避免出现链表为空或者i超出链表长度的情况。
4. 循环链表的遍历可以使用do-while循环,这样可以保证至少执行一次,避免链表为空时循环不执行的问题。
下面是优化后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int code; // 存放序号
int key; // 存放密码
struct LNode *next;
} LNode, *LinkList;
void CreatList(LinkList &L, int i) // 建立有i个元素的单向循环链表
{
LinkList p, s;
int j;
L = (LinkList) malloc(sizeof(LNode));
L->next = L;
if (i != 0) {
printf("请按提示输入数据元素\n\n");
}
p = L;
for (j = 0; j < i; j++) {
s = (LinkList) malloc(sizeof(LNode));
s->code = j + 1;
printf("请输入第%d个的密码: ", j + 1);
scanf("%d", &s->key);
p->next = s;
p = s;
}
p->next = L;
}
void ListDelete(LinkList &L, int i, int &e) // 删除链表L中第i个元素
{
LinkList p, q;
int j;
if (i < 1) {
printf("删除位置不合法!\n");
return;
}
for (j = 0, p = L; p->next != L && j < i - 1; j++) {
p = p->next;
}
if (p->next == L || j > i - 1) {
printf("删除位置不合法!\n");
return;
}
q = p->next;
e = q->key;
p->next = q->next;
printf("出列人的序号为%d,密码为%d\n", q->code, q->key);
free(q);
}
int main()
{
LinkList L;
int m, n, code;
CreatList(L, 0);
printf("请输入总人数n:\n");
scanf("%d", &n);
printf("请输入报数上限m:\n");
scanf("%d", &m);
CreatList(L, n);
code = 0;
do {
ListDelete(L, m % n, code);
m = code;
n--;
} while (L->next != L);
return 0;
}
```
void Student(struct student stu[N]) { int i, Sid = -1; // Sid 表示当前登录学生的下标,初始值为 -1 表示未找到 char num1[] = "2021110300236"; char pass1[] = "123456"; char num[13], pass[10]; printf("请输入学号: "); scanf("%s", num); printf("请输入密码: "); scanf("%s", pass); while (Sid == -1) { // 使用 while 循环代替 goto 语句 if (strcmp(num1, num) == 0 && strcmp(pass1, pass) == 0) { Sid = i; break; } printf("账号或者密码错误!请重新输入 \n"); printf("请输入学号: "); scanf("%s", num); printf("请输入密码: "); scanf("%s", pass); }// 在这里可以使用 Sid 变量进行后续操作 } int main1() { struct student stu[N]; int n = 0; while (n < 5) { Student(stu); // 这里可以进行后续操作 n++; if (n == 5) { printf("已达到最大登录次数!\n"); break; } printf("是否继续登录?(Y/N)"); char choice; scanf(" %c", &choice); if (choice == 'N' || choice == 'n') { break; } else { continue; } } return 0; } int login2(){printf("请选择(0-4): "); scanf("%d",&n); switch(n) { case 1: Register(p); break; case 2: LookUpdatePersonal(p);break; case 3: DormitoryCnd(p); break; case 4: system("cls");Print_Map();break; case 0: n=5;break; } }优化代码
首先,我们可以将登录验证的代码进行优化,避免使用 while 循环和 goto 语句。可以使用一个变量记录当前登录学生的下标,如果登录成功,则直接进行后续操作。代码如下:
```
int Login(struct student stu[N]) {
int Sid = -1; // Sid 表示当前登录学生的下标,初始值为 -1 表示未找到
char num1[] = "2021110300236";
char pass1[] = "123456";
char num[13], pass[10];
printf("请输入学号: ");
scanf("%s", num);
printf("请输入密码: ");
scanf("%s", pass);
for (int i = 0; i < N; i++) {
if (strcmp(num1, num) == 0 && strcmp(pass1, pass) == 0) {
Sid = i;
break;
}
}
if (Sid == -1) {
printf("账号或者密码错误!\n");
}
return Sid;
}
```
其次,我们可以将主函数部分进行优化。可以在每次登录后询问用户是否继续登录,并在达到最大登录次数时提示用户。代码如下:
```
int main() {
struct student stu[N];
int n = 0, Sid;
do {
Sid = Login(stu);
if (Sid != -1) {
// 在这里可以进行后续操作
printf("登录成功!\n");
}
n++;
if (n == 5) {
printf("已达到最大登录次数!\n");
break;
}
printf("是否继续登录?(Y/N)");
char choice;
scanf(" %c", &choice);
if (choice == 'N' || choice == 'n') {
break;
}
} while (1);
return 0;
}
```
最后,我们可以将登录后的操作部分进行优化,使用 switch 语句实现菜单选择功能。代码如下:
```
int main() {
struct student stu[N];
int n = 0, Sid;
do {
Sid = Login(stu);
if (Sid != -1) {
// 在这里可以进行后续操作
printf("登录成功!\n");
while (1) {
printf("请选择(0-4): ");
scanf("%d", &n);
switch (n) {
case 1:
Register(stu, Sid);
break;
case 2:
LookUpdatePersonal(stu, Sid);
break;
case 3:
DormitoryCnd(stu, Sid);
break;
case 4:
system("cls");
Print_Map();
break;
case 0:
n = 5;
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
if (n == 5) {
break;
}
}
}
n++;
if (n == 5) {
printf("已达到最大登录次数!\n");
break;
}
printf("是否继续登录?(Y/N)");
char choice;
scanf(" %c", &choice);
if (choice == 'N' || choice == 'n') {
break;
}
} while (1);
return 0;
}
```
阅读全文