程序:
void book_del(void) { int n;
page_title(\注销旧书\
if((n=search_book())!=-1) books[n].id=0; printf(\该书已注销.\\n\ return_confirm(); } ? 借出模块
分析:该模块功能应体现为用户输入图书序号,若有书则要求输入账号。
流程图:
让用户输入信息:借出 返回菜单 显示记录 是否有记录 提示没找到 输入借阅图书序号 图3.2.4 借出模块流程图 程序:
void book_out(void) {int n,s,l,d;
page_title(\借阅图书\
8
if((n=search_book())!=-1&&books[n].store>0) {printf(\请输入借书证序号:\ scanf(\
printf(\请输入可借天数:\ scanf(\ for(l=0;l<10;l++) {if(books[n].usr[l]==0) {books[n].usr[l]=s; books[n].days[l]=d; break; } } books[n].store--; }
if(n!=-1&&books[n].store==0) printf(\此书已经全部借出.\\n\ return_confirm(); }
? 归还模块
分析:该模块功能应体现为方便用户归还图书 流程图: 显示记录 是否有记录 提示没找到 输入归还图书序号 返回菜单 让用户输入信息:入库 图3.2.5 归还模块流程图
9
程序:
void book_in(void) { int n,s,l;
page_title(\归还图书\
if((n=search_book())!=-1&&books[n].store printf(\天\\n\ printf(\请输入借书证序号:\ scanf(\ for(l=0;l<10;l++) {if(books[n].usr[l]==s) { books[n].usr[l]=0; books[n].days[l]=0; break; } } books[n].store++; } if(n!=-1&&books[n].store==books[n].total) printf(\全部入藏.\\n\ return_confirm(); } 10 ? 公共函数 定义结构体: struct BOOK { int id,usr[10],total,store,days[10],zt; char name[31],author[21]; }books[100]; void page_title(char *menu_item) { printf(\欢迎使用图**********\\n\\n- %s -\\n\\n\ void return_confirm(void) { printf(\按任意键返回……\\n\} void state(int n) {if(books[n].total!=0) printf(\printf(\} 书馆管理系统11 第四章 调试与测试 首先用一组简单的数据对程序进行调试,是否各函数有出错现象。然后用复杂数据对程序进行调试。直到确定程序对正常数据没有错误为止。 第二,当数据测试时,程序错误,要首先找到出错的函数,对函数中各个变量进行观察,有时变量很多,循环多重不要急,对各个数据的观察,对程序的调试有很大的帮助。你也可以先对几个变量熟悉后,在多重循环里,确定正确的数据,将其跳过调试,对有疑问的数据循环进行仔细观察。虽然这是比较省力气的活,但对复杂的数据错误并不是很有效,所以仔细观察每个数据的变化对调试的成功与否有决定性作用! 第三,测试时,根本的错误并不一定在运行错误的函数内,或许在前面的函数内已经奠定了这些错误数据的基础,需要反过头来,对所有的的函数进行一项项的调试!从程序运行的第一个函数开始调试。按照程序运行的步骤下去。一个个的确定函数的正确性,每确定一个函数,在以后的调试中可以减少对该函数的调试次数,或者直接跳到下一个函数。所谓的各个击破便是如此。对头文件中的各个函数的返回值和它所要传入的参变量及其功能更是需要注意。 第四,调试时,需要对错误缩小范围,从整个程序到指定函数,再到指定区域,再到指定行,在对程序缩小范围或对编译没通过的程序缩小错误范围时可以用\来进行调试,确定正常范围,缩小错误范围。 12