} else if (strcmp(p1->borrow[i].borrow_book_num, "0") == 0) { printf("\n请输入你要归还图书的日期:"); scanf("%s", lim_date); strcpy(p1->borrow[p1->right].borrow_book_num, bo_num); //记录所借书号,并且借书数目加一,现存量减一 strcpy(p1->borrow[p1->right].limit_date, lim_date); p1->right++; p0->book_xc--; printf("\n读者编号%s借书完毕!按任意键继续下步操作..", p1->reader_num); goto END; } END: system("pause"); system("cls"); }
时间: 2024-04-20 16:26:47 浏览: 103
这段代码是用于处理读者归还图书的情况,并更新相应的记录和库存。以下是代码的解释:
1. 使用`else if`条件语句,判断当前借书记录数组中的某个位置是否为空(`strcmp(p1->borrow[i].borrow_book_num, "0") == 0`)。如果该位置为空,表示该读者还未借过该位置对应的图书。
2. 输出提示信息"请输入你要归还图书的日期:",并使用`scanf`函数获取用户输入的归还日期,存储在变量`lim_date`中。
3. 使用`strcpy`函数将待归还的图书编号和归还日期分别存储到读者的借书记录数组中(`p1->borrow[p1->right].borrow_book_num, bo_num`和 `p1->borrow[p1->right].limit_date, lim_date`)。然后将借书数目加一(`p1->right++`)。
4. 同时,将对应图书的库存减一(`p0->book_xc--`)。
5. 输出借书完成的提示信息"读者编号%s借书完毕!按任意键继续下步操作..",其中%s会被替换为读者的编号。
6. 使用`goto`语句跳转到代码结尾的标签`END`。
7. 标签`END`后面的代码会清屏并暂停程序的执行,以便用户继续下一步操作。
需要注意的是,同样建议避免使用`goto`语句来跳转到标签`END`,可以使用更合适的控制结构来处理代码流程。此外,为了代码的可读性和可维护性,可以考虑将部分代码封装成函数进行调用。
相关问题
} else if (p1->right >= Max) { printf("\n不好意思,借书数目已满!不能借书!\n按任意键返回...."); goto END; } else if (strcmp(p1->borrow[0].borrow_book_num, "0") != 0) { //此读者若已经借书,再判断此读者是否要借两本一样的书 for (i = 0; i < Max; i++) { //遍历一次读者所借的书,如果发现有重复,则结束 if (strcmp(p1->borrow[i].borrow_book_num, bo_num) == 0) { printf("\n抱歉!同一个读者不能同借两本相同的书!\n"); goto END; } }
这段代码是用于检查读者借书数量、是否已借相同书籍的情况。下面是代码的说明:
1. 使用`else if`条件语句,首先判断当前节点的已借书籍数量是否达到最大限制(`p1->right >= Max`)。如果满足这个条件,表示读者已经借满书籍,输出相应的提示信息"不好意思,借书数目已满!不能借书!",并跳转到代码结尾的标签`END`。
2. 接下来是另一个`else if`条件语句,判断当前节点的第一个借书记录的图书编号是否为"0"。如果不为"0",说明读者已经借过书,并且需要进一步判断是否借了相同的书籍。
3. 使用`for`循环遍历读者已借书籍的记录数组。如果发现其中有与待借图书编号相同的记录(`strcmp(p1->borrow[i].borrow_book_num, bo_num) == 0`),则输出提示信息"抱歉!同一个读者不能同时借两本相同的书!",并跳转到代码结尾的标签`END`。
需要注意的是,同样建议避免使用`goto`语句来跳转到标签`END`,可以使用更合适的控制结构来处理错误情况。
void kaishi(struct student *head) { FILE *fp; struct student *p1; char num[30]; int flag = 0; printf("输入学号,输入后开始计时!\n"); scanf("%s", &num); p1 = head->next; while (p1) { if (strcmp(p1->num, num) == 0) { printf("输入正确,请继续\n "); flag++; break; } p1 = p1->next; } if (flag == 0) { printf ("该学号不存在!\n"); getchar(); printf ("---按任意键返回主菜单---\n"); getchar(); return ; } else { printf("您的档案信息为:学号:%s 姓名:%s 余额:%.2f\n", p1->num, p1->name, p1->money); } if (p1->money >= 6) { printf("计时已开始!\n"); t_start = time(NULL); } else { printf("余额不足,请续钱!(选择功能选项6进行续钱)\n"); } }
好的,下面是对这段代码的注释:
```
void kaishi(struct student *head) { // 定义函数 kaishi,参数为学生信息链表的头指针
FILE *fp; // 定义文件指针 fp
struct student *p1; // 定义学生信息指针 p1
char num[30]; // 定义字符串类型变量 num,用于存储输入的学号
int flag = 0; // 定义整型变量 flag,用于判断学号是否存在
printf("输入学号,输入后开始计时!\n"); // 提示用户输入学号
scanf("%s", &num); // 读取用户输入的学号
p1 = head->next; // 将 p1 指向第一个学生信息节点
while (p1) { // 遍历学生信息链表
if (strcmp(p1->num, num) == 0) { // 如果找到输入的学号
printf("输入正确,请继续\n "); // 提示用户输入正确
flag++; // 标记学号存在
break; // 跳出循环
}
p1 = p1->next; // 指向下一个学生信息节点
}
if (flag == 0) { // 如果学号不存在
printf ("该学号不存在!\n"); // 提示用户该学号不存在
getchar(); // 清空缓冲区
printf ("---按任意键返回主菜单---\n"); // 提示用户按任意键返回主菜单
getchar(); // 等待用户按键
return ; // 返回函数调用处
} else { // 如果学号存在
printf("您的档案信息为:学号:%s 姓名:%s 余额:%.2f\n", p1->num, p1->name, p1->money); // 输出学生信息
}
if (p1->money >= 6) { // 如果学生余额充足
printf("计时已开始!\n"); // 提示用户计时已开始
t_start = time(NULL); // 记录计时开始时间
} else { // 如果学生余额不足
printf("余额不足,请续钱!(选择功能选项6进行续钱)\n"); // 提示用户余额不足,需要续钱
}
}
```
阅读全文