case 5: char num[15] = ""; printf("请输入要查找的学生学号:"); scanf("%s",num); STU *result = Search_num(num); if(result != NULL){ printf("查找到的学生信息为:\n"); STU *temp = result->next; result->next = NULL; Output(result); result->next = temp; }else{ printf("未找到该学生信息.\n"); } break;
时间: 2024-02-14 08:32:09 浏览: 21
这段代码是一个案例中的一部分,它的功能是根据输入的学生学号在链表中查找对应的学生信息并输出。
首先,定义了一个字符数组 `num`,用于存储用户输入的学生学号。
然后,通过 `printf` 函数提示用户输入要查找的学生学号。
接下来,使用 `scanf` 函数将用户输入的学号存储到 `num` 数组中。
然后,调用 `Search_num` 函数,在链表中查找对应学号的学生信息,并将结果赋值给 `result` 指针。
接着,通过判断 `result` 是否为 NULL 来判断是否找到了对应的学生信息。如果找到了,就输出学生信息:
- 首先,创建一个临时指针 `temp`,将 `result` 的下一个节点赋值给它,并将 `result` 的下一个节点置为 NULL,以防止输出时打印整个链表。
- 然后,调用 `Output` 函数输出 `result` 指针指向的学生信息。
- 最后,将 `result` 的下一个节点恢复为原来的值,以保持链表的完整性。
如果未找到对应的学生信息,则输出提示信息"未找到该学生信息"。
最后,使用 `break` 语句跳出循环。
请注意,这段代码只是一个片段,可能还有其他函数和变量在上下文中定义。
相关问题
void Student(struct student stu[N]){ int i,n=0; struct student *p; p=stu; char num1[]="2021110300236"; char pass1[]="123456"; input:printf("请输入学号:"); char num[13]; scanf("%s",&num); printf("请输入密码:"); char pass[10]; scanf("%s",&pass); for(i=0;i<sum;i++) { //printf("%d\n%s\t%s\n%s\t%s\n",i,num,pass,stu[i].num,stu[i].pass); if(strcmp(num1,num)==0 && strcmp(pass1,pass)==0){ Sid=i; break; } } if(i==sum){ printf("你输入错误,请重新输入!\n"); goto input; } while(n<5) {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; } } }优化这个代码
这段代码可以进行如下优化:
1. 将 `input` 标签和 `goto` 语句替换为 `while` 循环和 `break` 语句,避免使用 `goto` 语句。
2. 使用 `fgets` 函数代替 `scanf` 函数,以避免缓冲区溢出的问题。
3. 使用 `strcmp` 函数比较字符串时,应该将常量字符串放在前面,以提高效率。
4. 使用 `const` 修饰常量字符串参数,以增加代码的可读性和安全性。
5. 在 `switch` 语句中加上 `default` 标签,处理无效的输入。
6. 增加一些注释,以增加代码的可读性。
改进后的代码如下:
```c
void Student(struct student stu[N]) {
int i, n = 0;
struct student *p = stu;
const char num1[] = "2021110300236";
const char pass1[] = "123456";
char num[13], pass[10];
while (1) {
printf("请输入学号:");
fgets(num, sizeof(num), stdin);
printf("请输入密码:");
fgets(pass, sizeof(pass), stdin);
// 去除 num 和 pass 的换行符
num[strcspn(num, "\n")] = '\0';
pass[strcspn(pass, "\n")] = '\0';
for (i = 0; i < sum; i++) {
if (strcmp(num1, num) == 0 && strcmp(pass1, pass) == 0) {
Sid = i;
break;
}
}
if (i == sum) {
printf("你输入错误,请重新输入!\n");
} else {
break;
}
}
while (n < 5) {
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;
default:
printf("无效的输入,请重新选择!\n");
break;
}
}
}
```
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;
}
```