专业技能训练报告
学 院: 计算机学院、软件学院 课程名称: C 程序设计综合实践 专业班级: 计算机科学与技术 学生姓名:学号:学生姓名: 学号:
指导教师:完成时间:2014年6月25日
目录
目录 . .............................................................................................................................. 1 第1部分 实训题目与要求 . ...................................................................................... 2
1. 问题提出 . ...................................................................................................................... 2 2. 功能要求 . ..................................................................................................................... 2 3. 任务分工 . ..................................................................................................................... 2 第2部分 设计实训题目功能 . .................................................................................. 2
1. 总体设计 . ..................................................................................................................... 2 2. 算法设计 . ..................................................................................................................... 3 3. 数据结构 . ..................................................................................................................... 6 4. 程序代码设计 . ............................................................................................................. 7 5. 测试与调试 . ............................................................................................................... 22 第3部分 实训总结 . ................................................................................................ 26
1. 个人总结 . ................................................................................................................... 26 2. 结束语 . ....................................................................................................................... 26 附录A 程序清单 . ..................................................................................................... 27 附录B 用户使用说明书 . ......................................................................................... 44 参考文献 . .................................................................................................................... 44 《C 程序设计综合实践》评分表 . ............................................................................ 45
第1部分 实训题目与要求
1. 问题提出
在音像图书租借管理业务中,借与还、新进与报废音像图书是较典型的工作,一直以来,人们都是使用传统的人工方式进行管理,无论是对顾客还是销售人员来说,都很不方便。为了轻松、准确、高效地管理,特开发本管理系统以提高管理效率。
2. 功能要求
本音像图书租借管理系统主要应用于小型的音像图书店中,方便管理员对大量的音像图书信息进行查询、增加、保存、删除等操作。
音像图书租借管理系统可分为六部分:创建音像图书库、租借音像图书、归还音像图书、购进音像图书、报废音像图书和音像图书库概况。
3. 任务分工
程序的编写基本由同学完成,同学负责编写主函数;Word 文档的部分基本由同学完成,同学负责测试与调试部分。
第2部分 设计实训题目功能
1. 总体设计
2. 算法设计
3. 数据结构
系统数据类型:整型int ,字符型char ,结构体struct ;
struct date{
//租借&归还日期
int year; char ch1; int month;
char ch2;
int day;
};
struct library{ //音像图书库 };
struct borrower{ //租借者信息 };
char uname[100]; struct date borrow; int money; struct date back; char bianhao[10]; char bianhao[10]; char name[100]; int price; int amount; int shengyu;
int rent;
4. 程序代码设计
(1)创建音像图书库
void build_book() {
char ch[10],op; struct library a; FILE *fp1=NULL; fflush(stdin);
fp1=fopen("d:\\Library.txt","a"); if(fp1==NULL) { }
printf("\n文件打开错误!\n"); exit(0);
printf("\n 请输入音像图书的编号:"); scanf("%s",a.bianhao); strcpy(ch,a.bianhao);
if(ch[0]!='B'&&ch[0]!='V'&&ch[0]!='R') { }
printf(" 非法输入!\n");
printf(" 请按任意键重新输入!"); op=getchar();op=getchar(); build_book();
printf(" 请输入音像图书的名称:"); scanf("%s",a.name);
printf(" 请输入音像图书的原价:"); scanf("%d",&a.price);
printf(" 请输入音像图书的原数量:"); scanf("%d",&a.amount);
printf(" 请输入音像图书的剩余数量:"); scanf("%d",&a.shengyu);
if(a.amount
printf(" 原数量不得小于剩余数量!请重新输入!\n");
printf(" 请输入音像图书的原数量:");
scanf("%d",&a.amount);
printf(" 请输入音像图书的剩余数量:");
scanf("%d",&a.shengyu);
}
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu);
if(fclose(fp1)){
printf("不能关闭文件!\n");
}
}
printf("\n 创建音像图书《%s》成功!\n",a.name); printf("\n 输入任意键继续!\n"); op=getchar();op=getchar();
打开名为Library.txt 的文件,将音像图书的编号、名称、原价、原数量和剩余数量写入文件中,然后关闭文件。
(2)租借音像图书
void borrow_book() {
if((fp1=fopen("d:\\borrow.txt","a"))==NULL){ }
printf("文件打开错误!\n"); exit(0);
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 struct borrower c={0}; char ch[10]={0},op; int n=0,m=0; FILE *fp1; FILE *fp2; fflush(stdin);
if((fp2=fopen("d:\\Library.txt","r"))==NULL){
}
printf("文件打开错误!\n"); exit(0);
printf("请输入您的姓名: ");
scanf("%s",c.uname);
printf("请输入租借的书的编号: "); scanf("%s",c.bianhao);
printf("请输入租借的日期(年/月/日): ");
scanf("%d%c%d%c%d",&c.borrow.year,&c.borrow.ch1 ,&c.borrow.month,&c.borrow.ch2,&c.
borrow.day);
strcpy(ch,c.bianhao);
fprintf(fp1,"%s\t%s\t%d%c%d%c%d
",c.uname ,c.bianhao,c.borrow.year,c.borrow.ch1,c.borrow.month,c.borrow.ch2,c.borrow.day);
p1=b;
fscanf(fp2,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
} for(p1=b;p1bianhao)==0) { } p2=p1; m=1; break; p1++; n++; while(feof(fp2)==0) { if(m==0) { printf("无此音像图书!\n"); printf("输入任意键继续!\n");
op=getchar();op=getchar();
} else if((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu==0)) { printf("\n此音像图书已全部借出!\n"); printf("输入任意键继续!\n");
op=getchar();op=getchar();
} else if((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu!=0)) {
printf("应交的押金额为 %d 元!",(p2->price)*3); c.money=(p2->price)*3; p2->shengyu=p2->shengyu-1; fprintf(fp1,"%d\n",c.money); fclose(fp1); fclose(fp2); printf("\n输入任意键继续!\n"); op=getchar();op=getchar(); if((fp2=fopen("d:\\Library.txt","w"))==NULL){ } for(p1=b;p1bianhao,p1->name,p1->price,p1->amount,p1->shengyu);
fclose(fp2);
}
打开borrow.txt 和Library.txt 文件, 将租借者的姓名、租借的书的编号和租借日期写入borrow.txt 文件中,计算并显示应交押金,同时把押金写入borrow.txt 文件该租借者的信息中,并且Library.txt 文件中相应音像图书数量减少。然后关闭文件。
(3)归还音像图书
void back_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组
struct borrower c={0},d[Max]={0},*p3=NULL,*p4=NULL; char ch[10]={0},ch1[100],op; int day,n1=0,n2=0,m=0,rent,money_1; int x,i; int month_day[2][13]={ {0,31,28,31,30,31,30,31,31,30,31,30,31},
}; FILE *fp1; FILE *fp2; fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
} printf("文件打开错误!\n"); exit(0); if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ } printf("请输入您的名字: "); scanf("%s",c.uname); printf("请输入归还的书的编号: "); scanf("%s",c.bianhao); printf("请输入归还的日期(年/月/日): "); scanf("%d%c%d%c%d",&c.back.year,&c.back.ch1,&c.back.month,&c.back.ch2,&c.back.day); strcpy(ch,c.bianhao); strcpy(ch1,c.uname); //在文件中寻找被借的书 p1=b; p3=d; while(feof(fp1)==0) { printf("文件打开错误!\n"); exit(0); } p1++; n1++;
{ fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.ch1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
} p3++; n2++;
for(p1=b;p1
if(strcmp(ch,p1->bianhao)==0) { p2=p1;
break;
for(p3=d;p3bianhao)==0&&strcmp(ch1,p3->uname)==0) { } p4=p3; m=1; break; }
//当输入的姓名或者借书的编号错误时
if(m==0) { printf("您没有借书记录!\n");
printf("输入y 重新填写资料,输入n 返回上一菜单!\n");
scanf(" %c",&op); if(op=='y') back_book(); if(op=='n') { } system("cls"); main() ;
);
printf("\n此音像图书名为《%s》 \n",p2->name); if((fp1=fopen("d:\\Library.txt","w"))==NULL){ } p2->shengyu =p2->shengyu+1; for(p1=b;p1bianhao ,p1->name,p1->price ,p1->amount ,p1->shengyu
if(p4->borrow.year==c.back.year) { } if(p4->borrow.month==c.back.month) else { } day=month_day[x][p4->borrow.month]-p4->borrow.day; for(i=p4->borrow.month+1;iborrow.day; //计算租借的总天数 x=(p4->borrow.year%4==0&&p4->borrow.year%100!=0||p4->borrow.year%400==0); day=day+c.back.day;
printf("一共租借了 %d 天!\n",day);
if(ch[0]=='B')
rent=day; if(ch[0]=='V')
if(ch[0]=='R') rent=day*3;
if(rent>=p3->money)
money_1=0; if(rentmoney) money_1=p3->money-rent;
printf("已交押金 %d 元,应交租金 %d元,应退金额 %d 元\n",p4->money,rent,money_1);
fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.cfclose(fp1); fclose(fp2); //删除租借者的信息 p3=d; n1=0; if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ } printf("文件打开错误!\n"); exit(0); while(feof(fp2)==0) { h1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
} fclose(fp2); for(p3=d;p3uname)==0) { p4=p3; p3++; n2++;
break;
}
{ printf("文件打开错误!\n"); exit(0); } for(p3=d;p3uname,p3->uname)==0) else continue;
fprintf(fp1,"%s %s %d%c%d%c%d %d",p3->uname ,p3->bianhao,p3->borrow.year,p3->borrow.ch1,p3->borrow.month,p3->borrow.ch2,p3->borrow.day,p3->money);
} printf("成功删除 %s 的信息!\n",p4->uname); printf("按任意键结束!"); op=getchar();op=getchar();
fclose(fp2);
}
打开borrow.txt 和Library.txt 文件,输入归还者的姓名、归还的书的编号和归还日期,计算租借天数,显示已交押金、应交租金、应退金额;将borrow.txt 中相应租借者的信息删除,Library.txt 中相应音像图书的数量增加。然后关闭文件。
(4)购进音像图书
void buy_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 char ch[10]={0},ch1[100]={0},op; int n=0,m=1,number; FILE *fp1; fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ printf("文件打开错误!\n"); exit(0);
printf("请输入购进音像图书的编号: "); scanf("%s",a.bianhao);
strcpy(ch,a.bianhao);
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
} fclose(fp1); for(p1=b;p1bianhao)==0) { p2=p1; strcpy(ch1,p1->name ); p1++; n++; p1=b; while(feof(fp1)==0) {
m=0;
if(m) { if((fp1=fopen("d:\\Library.txt","a"))==NULL){ printf("文件打开错误!\n"); exit(0); } printf("请输入要购进音像图书的名称: "); scanf("%s",a.name); printf("请输入要购进音像图书的原价: ");
scanf("%d",&a.price);
printf("请输入要购进音像图书的数量: ");
} break;
} else { if((fp1=fopen("d:\\Library.txt","w"))==NULL){ printf("文件打开错误!\n"); exit(0); } printf("此书已存在!\n"); printf("请输入要购进图书的数量: "); scanf("%d",&number); printf("购进音像图书《%s》成功!",a.name ); a.shengyu=a.amount; fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu); fclose(fp1); printf("购进音像图书《%s》成功!",ch1);
p2->amount =p2->amount +number;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu);
} p2->shengyu=p2->shengyu+number; for(p1=b;p1
printf("按任意键结束!");
op=getchar();op=getchar();
fclose(fp1);
}
打开Library.txt 文件,写入购进音像图书的编号,若音像图书已存在,则只输入购进数量;并在文件中添加原有音像图书的数量,若不存在,则输入新音像图书的名称、原价及数量,并添加到文件中,然后关闭文件。
(5)报废音像图书
void scrap_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 char ch[10]={0},op;
FILE *fp1; fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ } printf("文件打开错误!\n"); exit(0);
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
printf("请输入要报废的书的编号: "); scanf("%s",a.bianhao ); p1=b; while(feof(fp1)==0) { } p1++; n++; for(p1=b;p1bianhao)==0) { } p2=p1; m=0; break; fclose(fp1); if(m) printf("本音像图书库不存在此书!\n"); else if(p1->amount!=p1->shengyu) printf("《%s》已被借出,不能报废!\n",p1->name); else if(p1->amount==p1->shengyu)
if((fp1=fopen("d:\\Library.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0); }
for(p1=b;p1
if(p1->bianhao ==p2->bianhao) else
continue;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu);
}
}
printf("《%s》已成功报废!\n",p2->name); fclose(fp1);
printf("按任意键结束!"); op=getchar();op=getchar();
打开Library.txt 文件,写入需要报废的音像图书的编号,若要报废的音像图书已被借出,则不能进行报废,然后关闭文件。
(6)音像图书库概况
void storage_book() {
struct library a={0},b[Max]={0},*p1=NULL; //b为结构数组 char ch[10],op; int n=0,X,Y,Z,x,y,z; FILE *fp1; fflush(stdin); X=Y=Z=x=y=z=0;
p1=b;
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ }
while(feof(fp1)==0)
printf("文件打开错误!\n"); exit(0);
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
printf("本图书库一共有图书 %d 本,其中被借 %d 本;\n本图书库一共有VCD %d 个, }
for(p1=b;p1
strcpy(ch,p1->bianhao); if(ch[0]=='B') { }
X=X+p1->amount;
x=x+p1->amount-p1->shengyu; p1++; n++;
if(ch[0]=='V') }
{ }
if(ch[0]=='R') { }
Z=Z+p1->amount;
z=z+p1->amount-p1->shengyu; Y=Y+p1->amount;
y=y+p1->amount-p1->shengyu;
其中被借 %d 个;\n本图书库一共有录像带 %d 卷,其中被借 %d 卷!\n",X,x,Y,y,Z,z);
printf("按任意键结束!");
op=getchar(); fclose(fp1); }
打开Library.txt 文件,输出音像图书库中图书、VCD 和录像带各自的数量,同时输出图书、VCD 、录像带各自借出的数量。然后关闭文件。
完整程序请参见附录A
5. 测试与调试
表1 创建音像图书库测试用例
表2 租借音像图书测试用例
表3 归还音像图书测试用例
表4 购进音像图书测试用例
表5 报废音像图书库测试用例
表6 音像图书库概况测试用例
第3部分 实训总结
1. 个人总结
课程设计是培养学生综合运用所学知识发现、提出、分析和解决实际问题, 锻炼实践能力的重要环节, 是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学生来说掌握计算机开发技术是十分重要的。
回顾起此次课程设计,让我们感慨颇多。从拿到题目到完成整个编程,从理论到实践,几个星期的日子里,不仅巩固了以前学过的知识,而且学到了很多在书本上没有学到过的知识,也懂得集体团队的重要性。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践结合起来,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说是困难重重,毕竟第一次做这样的课程设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体等。通过这次课程设计之后,一定把以前所学过的知识重新温故。
本软件还是存在一些不足之处的,比如说在算租借天数的时候,为了方便计算所以只能计算同一年的租借天数,即租借跟归还必须要在同一年,这是本系统还需改进的地方。
2. 结束语
这次的课程设计得以完成,离不开老师和同学们的帮助,在此,对在编程中给予我们帮助的同学和老师表示衷心的感谢。
#include #define Max 100 #include #include
struct date{ int year; char ch1; int month;
char ch2;
int day; };
struct library{ char bianhao[10]; char name[100]; int price; int amount; int shengyu;
};
struct borrower{ 附录A 程序清单
//租借&归还日期 //音像图书库 //租借者信息
char uname[100];
char bianhao[10]; struct date borrow; int money;
struct date back;
int rent; };
void build_book(); //创建音像图书库 void borrow_book(); //租借音像图书 void back_book(); //归还音像图书 void buy_book(); //购进音像图书 void scrap_book(); //报废音像图书 void storage_book(); //图书库存储概况
int borrow_day(struct borrower e); //计算租借的天数 int main(void) { char choice; char op;
do{
printf(" ------------------------------------------- \n\n"); printf(" 请输入选项编号(0-6) \n\n");
printf(" ------------------------------------------- \n\n");
printf(" . 1--创建音像图书库 printf(" . 2--租借音像图书 printf(" . 3--归还音像图书 printf(" . 4--购进音像图书 printf(" . 5--报废音像图书库 printf(" . 6--音像图书库概况 printf(" . 0--退出系统 printf(" ------------------------------------------- \n"); scanf(" %c",&choice); switch(choice)
{
case '1':build_book(); break;
\n");
\n"); \n"); \n"); \n"); \n"); \n\n");
}
}
case '2':borrow_book(); break; case '3':back_book(); break; case '4':buy_book(); break; case '5':scrap_book(); break; case '6':storage_book(); break; case '0':break;
default:printf("\n 没有选项为%c的选项!\n",choice);
printf("\n 请输入任意键继续!"); op=getchar();op=getchar();system("cls");
}while(choice!='0');
printf("\n感谢使用本软件!已正常退出,按任意键结束。\n"); return 0;
//创建音像图书库 void build_book() {
char ch[10],op; struct library a; FILE *fp1=NULL; fflush(stdin);
fp1=fopen("d:\\Library.txt","a"); if(fp1==NULL) { }
printf("\n 请输入音像图书的编号:"); scanf("%s",a.bianhao); strcpy(ch,a.bianhao);
printf("\n文件打开错误!\n"); exit(0);
if(ch[0]!='B'&&ch[0]!='V'&&ch[0]!='R')
} printf(" 非法输入!\n"); printf(" 请按任意键重新输入!"); op=getchar();op=getchar(); build_book(); printf(" 请输入音像图书的名称:"); scanf("%s",a.name); printf(" 请输入音像图书的原价:"); scanf("%d",&a.price); printf(" 请输入音像图书的原数量:"); scanf("%d",&a.amount); printf(" 请输入音像图书的剩余数量:"); scanf("%d",&a.shengyu); if(a.amount
printf(" 请输入音像图书的原数量:");
scanf("%d",&a.amount); printf(" 请输入音像图书的剩余数量:");
scanf("%d",&a.shengyu);
} fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu); if(fclose(fp1)){ } printf("\n 创建音像图书《%s》成功!\n",a.name); printf("\n 输入任意键继续!\n"); op=getchar();op=getchar(); system("cls"); printf("不能关闭文件!\n"); exit(0);
//租借音像图书
void borrow_book()
{
if((fp1=fopen("d:\\borrow.txt","a"))==NULL){ } printf("文件打开错误!\n"); exit(0); struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 struct borrower c={0}; char ch[10]={0},op; int n=0,m=0; FILE *fp1; FILE *fp2; fflush(stdin);
if((fp2=fopen("d:\\Library.txt","r"))==NULL){
} printf("文件打开错误!\n"); exit(0);
printf("请输入您的姓名: ");
scanf("%s",c.uname); printf("请输入租借的书的编号: "); scanf("%s",c.bianhao); printf("请输入租借的日期(年/月/日): "); scanf("%d%c%d%c%d",&c.borrow.year,&c.borrow.ch1 ,&c.borrow.month,&c.borrow.ch2,&c.borrow.day);
strcpy(ch,c.bianhao); fprintf(fp1,"%s\t%s\t%d%c%d%c%d
",c.uname ,c.bianhao,c.borrow.year,c.borrow.ch1,c.borrow.month,c.borrow.ch2,c.borrow.day);
p1=b;
while(feof(fp2)==0) {
fscanf(fp2,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); } for(p1=b;p1bianhao)==0) { } p2=p1; m=1; break; p1++; n++; if(m==0) { printf("无此音像图书!\n"); printf("输入任意键继续!\n");
op=getchar();op=getchar();
} else if((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu==0)) { printf("\n此音像图书已全部借出!\n"); printf("输入任意键继续!\n");
op=getchar();op=getchar();
} else if((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu!=0)) { printf("应交的押金额为 %d 元!",(p2->price)*3); c.money=(p2->price)*3; p2->shengyu=p2->shengyu-1; fprintf(fp1,"%d\n",c.money);
fclose(fp2); printf("\n输入任意键继续!\n"); op=getchar();op=getchar(); if((fp2=fopen("d:\\Library.txt","w"))==NULL){ } for(p1=b;p1bianhao,p1->name,p1->price,p1->amount,p1->shengyu); system("cls");
fclose(fp2);
}
//归还音像图书
void back_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组
struct borrower c={0},d[Max]={0},*p3=NULL,*p4=NULL; char ch[10]={0},ch1[100],op; int day,n1=0,n2=0,m=0,rent,money_1; int x,i; int month_day[2][13]={ }; FILE *fp1; FILE *fp2; {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}
if((fp1=fopen("d:\\Library.txt","r"))==NULL){
fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.cfscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); } while(feof(fp2)==0) { p1++; n1++; } if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ } printf("请输入您的名字: "); scanf("%s",c.uname); printf("请输入归还的书的编号: "); scanf("%s",c.bianhao); printf("请输入归还的日期(年/月/日): "); scanf("%d%c%d%c%d",&c.back.year,&c.back.ch1,&c.back.month,&c.back.ch2,&c.back.day); strcpy(ch,c.bianhao); strcpy(ch1,c.uname); //在文件中寻找被借的书 p1=b; p3=d; while(feof(fp1)==0) { printf("文件打开错误!\n"); exit(0); printf("文件打开错误!\n"); exit(0); h1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
} n2++;
for(p1=b;p1
if(strcmp(ch,p1->bianhao)==0) { p2=p1;
break;
for(p3=d;p3bianhao)==0&&strcmp(ch1,p3->uname)==0) { } p4=p3; m=1; break; }
//当输入的姓名或者借书的编号错误时
if(m==0) { printf("您没有借书记录!\n");
printf("输入y 重新填写资料,输入n 返回上一菜单!\n");
} scanf(" %c",&op); if(op=='y') back_book(); if(op=='n') { } system("cls"); main() ; printf("\n此音像图书名为《%s》 \n",p2->name); if((fp1=fopen("d:\\Library.txt","w"))==NULL){ printf("文件打开错误!\n");
);
} p2->shengyu =p2->shengyu+1; for(p1=b;p1bianhao ,p1->name,p1->price ,p1->amount ,p1->shengyu
if(p4->borrow.year==c.back.year) { } if(p4->borrow.month==c.back.month) else { } day=month_day[x][p4->borrow.month]-p4->borrow.day; for(i=p4->borrow.month+1;iborrow.day; //计算租借的总天数 x=(p4->borrow.year%4==0&&p4->borrow.year%100!=0||p4->borrow.year%400==0); day=day+c.back.day;
printf("一共租借了 %d 天!\n",day);
if(ch[0]=='B')
rent=day; if(ch[0]=='V') rent=day*2; if(ch[0]=='R') rent=day*3;
if(rent>=p3->money)
money_1=0;
money_1=p3->money-rent;
printf("已交押金 %d 元,应交租金 %d元,应退金额 %d 元\n",p4->money,rent,money_1);
fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.cfclose(fp1); fclose(fp2); //删除租借者的信息 p3=d; n1=0; if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ } printf("文件打开错误!\n"); exit(0); while(feof(fp2)==0) { h1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
} fclose(fp2); for(p3=d;p3uname)==0) { p4=p3; p3++; n2++;
break;
} if((fp2=fopen("d:\\borrow.txt","w"))==NULL) { printf("文件打开错误!\n"); exit(0); }
{ if(strcmp(p4->uname,p3->uname)==0) else continue;
fprintf(fp1,"%s %s %d%c%d%c%d %d",p3->uname ,p3->bianhao,p3->borrow.year,p3->borrow.ch1,p3->borrow.month,p3->borrow.ch2,p3->borrow.day,p3->money);
}
printf("成功删除 %s 的信息!\n",p4->uname);
printf("按任意键结束!");
op=getchar();op=getchar();
system("cls");
fclose(fp2);
}
//购进音像图书
void buy_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL;
char ch[10]={0},ch1[100]={0},op;
int n=0,m=1,number;
FILE *fp1;
fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){
printf("文件打开错误!\n");
exit(0);
}
printf("请输入购进音像图书的编号: ");
scanf("%s",a.bianhao);
strcpy(ch,a.bianhao);
if(ch[0]!='B'&&ch[0]!='V'&&ch[0]!='R')
//b为结构数组
} printf(" 非法输入!\n"); printf(" 请按任意键重新输入!"); op=getchar();op=getchar(); buy_book(); p1=b; while(feof(fp1)==0) { fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); } fclose(fp1); for(p1=b;p1bianhao)==0) { p2=p1; strcpy(ch1,p1->name ); p1++; n++;
m=0;
if(m) { if((fp1=fopen("d:\\Library.txt","a"))==NULL){ printf("文件打开错误!\n"); exit(0); } printf("请输入要购进音像图书的名称: "); scanf("%s",a.name); printf("请输入要购进音像图书的原价: ");
scanf("%d",&a.price);
} break;
printf("请输入要购进音像图书的数量: ");
scanf("%d",&a.amount); } else {
if((fp1=fopen("d:\\Library.txt","w"))==NULL){ printf("文件打开错误!\n"); exit(0); }
printf("此书已存在!\n");
printf("请输入要购进图书的数量: "); scanf("%d",&number);
printf("购进音像图书《%s》成功!",a.name ); a.shengyu=a.amount;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu); fclose(fp1);
printf("购进音像图书《%s》成功!",ch1);
p2->amount =p2->amount +number;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu); }
p2->shengyu=p2->shengyu+number; for(p1=b;p1
printf("按任意键结束!");
op=getchar();op=getchar(); system("cls");
fclose(fp1); } //报废音像图书 void scrap_book() {
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 char ch[10]={0},op;
FILE *fp1; fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ }
printf("文件打开错误!\n"); exit(0);
printf("请输入要报废的书的编号: "); scanf("%s",a.bianhao ); p1=b;
while(feof(fp1)==0) {
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); }
for(p1=b;p1
if(strcmp(a.bianhao,p1->bianhao)==0) { }
p2=p1; m=0; break; p1++; n++;
fclose(fp1); if(m)
printf("本音像图书库不存在此书!\n");
else
if(p1->amount!=p1->shengyu)
printf("《%s》已被借出,不能报废!\n",p1->name);
else
if(p1->amount==p1->shengyu)
if((fp1=fopen("d:\\Library.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0); }
for(p1=b;p1
if(p1->bianhao ==p2->bianhao) else
continue;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu); }
}
printf("《%s》已成功报废!\n",p2->name); fclose(fp1);
printf("按任意键结束!"); op=getchar();op=getchar(); system("cls");
//图书库存储概况 void storage_book() {
struct library a={0},b[Max]={0},*p1=NULL; //b为结构数组 char ch[10],op; int n=0,X,Y,Z,x,y,z; FILE *fp1; fflush(stdin); X=Y=Z=x=y=z=0;
p1=b;
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ }
while(feof(fp1)==0)
printf("文件打开错误!\n"); exit(0);
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); }
for(p1=b;p1
strcpy(ch,p1->bianhao); if(ch[0]=='B') { }
X=X+p1->amount;
x=x+p1->amount-p1->shengyu; p1++; n++;
if(ch[0]=='V') }
{ }
if(ch[0]=='R') { }
Z=Z+p1->amount;
z=z+p1->amount-p1->shengyu; Y=Y+p1->amount;
y=y+p1->amount-p1->shengyu;
printf("本图书库一共有图书 %d 本,其中被借 %d 本;\n本图书库一共有VCD %d 个,其
中被借 %d 个;\n本图书库一共有录像带 %d 卷,其中被借 %d 卷!\n",X,x,Y,y,Z,z);
printf("按任意键结束!");
op=getchar();
system("cls");
fclose(fp1); }
附录B 用户使用说明书
一、硬件环境:普通计算机。
二、软件环境:要用到编译语言VC++6.0;支持各种Windows 操作系统。 三、使用方法:打开系统,根据提示输入即可使用。 四、注意事项:
1、使用过程中显示的选项都为必填选项;
2、输入音像图书的编号时注意用B_**、V_**和R_**分别表示图书、VCD 和录像带的编号。
参考文献
何钦铭,颜晖. C语言程序设计[M]. 2版. 北京:高等教育出版社,2012.
《C 程序设计综合实践》评分表
指导教师签名:
日 期:_2013年6月25日_
专业技能训练报告
学 院: 计算机学院、软件学院 课程名称: C 程序设计综合实践 专业班级: 计算机科学与技术 学生姓名:学号:学生姓名: 学号:
指导教师:完成时间:2014年6月25日
目录
目录 . .............................................................................................................................. 1 第1部分 实训题目与要求 . ...................................................................................... 2
1. 问题提出 . ...................................................................................................................... 2 2. 功能要求 . ..................................................................................................................... 2 3. 任务分工 . ..................................................................................................................... 2 第2部分 设计实训题目功能 . .................................................................................. 2
1. 总体设计 . ..................................................................................................................... 2 2. 算法设计 . ..................................................................................................................... 3 3. 数据结构 . ..................................................................................................................... 6 4. 程序代码设计 . ............................................................................................................. 7 5. 测试与调试 . ............................................................................................................... 22 第3部分 实训总结 . ................................................................................................ 26
1. 个人总结 . ................................................................................................................... 26 2. 结束语 . ....................................................................................................................... 26 附录A 程序清单 . ..................................................................................................... 27 附录B 用户使用说明书 . ......................................................................................... 44 参考文献 . .................................................................................................................... 44 《C 程序设计综合实践》评分表 . ............................................................................ 45
第1部分 实训题目与要求
1. 问题提出
在音像图书租借管理业务中,借与还、新进与报废音像图书是较典型的工作,一直以来,人们都是使用传统的人工方式进行管理,无论是对顾客还是销售人员来说,都很不方便。为了轻松、准确、高效地管理,特开发本管理系统以提高管理效率。
2. 功能要求
本音像图书租借管理系统主要应用于小型的音像图书店中,方便管理员对大量的音像图书信息进行查询、增加、保存、删除等操作。
音像图书租借管理系统可分为六部分:创建音像图书库、租借音像图书、归还音像图书、购进音像图书、报废音像图书和音像图书库概况。
3. 任务分工
程序的编写基本由同学完成,同学负责编写主函数;Word 文档的部分基本由同学完成,同学负责测试与调试部分。
第2部分 设计实训题目功能
1. 总体设计
2. 算法设计
3. 数据结构
系统数据类型:整型int ,字符型char ,结构体struct ;
struct date{
//租借&归还日期
int year; char ch1; int month;
char ch2;
int day;
};
struct library{ //音像图书库 };
struct borrower{ //租借者信息 };
char uname[100]; struct date borrow; int money; struct date back; char bianhao[10]; char bianhao[10]; char name[100]; int price; int amount; int shengyu;
int rent;
4. 程序代码设计
(1)创建音像图书库
void build_book() {
char ch[10],op; struct library a; FILE *fp1=NULL; fflush(stdin);
fp1=fopen("d:\\Library.txt","a"); if(fp1==NULL) { }
printf("\n文件打开错误!\n"); exit(0);
printf("\n 请输入音像图书的编号:"); scanf("%s",a.bianhao); strcpy(ch,a.bianhao);
if(ch[0]!='B'&&ch[0]!='V'&&ch[0]!='R') { }
printf(" 非法输入!\n");
printf(" 请按任意键重新输入!"); op=getchar();op=getchar(); build_book();
printf(" 请输入音像图书的名称:"); scanf("%s",a.name);
printf(" 请输入音像图书的原价:"); scanf("%d",&a.price);
printf(" 请输入音像图书的原数量:"); scanf("%d",&a.amount);
printf(" 请输入音像图书的剩余数量:"); scanf("%d",&a.shengyu);
if(a.amount
printf(" 原数量不得小于剩余数量!请重新输入!\n");
printf(" 请输入音像图书的原数量:");
scanf("%d",&a.amount);
printf(" 请输入音像图书的剩余数量:");
scanf("%d",&a.shengyu);
}
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu);
if(fclose(fp1)){
printf("不能关闭文件!\n");
}
}
printf("\n 创建音像图书《%s》成功!\n",a.name); printf("\n 输入任意键继续!\n"); op=getchar();op=getchar();
打开名为Library.txt 的文件,将音像图书的编号、名称、原价、原数量和剩余数量写入文件中,然后关闭文件。
(2)租借音像图书
void borrow_book() {
if((fp1=fopen("d:\\borrow.txt","a"))==NULL){ }
printf("文件打开错误!\n"); exit(0);
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 struct borrower c={0}; char ch[10]={0},op; int n=0,m=0; FILE *fp1; FILE *fp2; fflush(stdin);
if((fp2=fopen("d:\\Library.txt","r"))==NULL){
}
printf("文件打开错误!\n"); exit(0);
printf("请输入您的姓名: ");
scanf("%s",c.uname);
printf("请输入租借的书的编号: "); scanf("%s",c.bianhao);
printf("请输入租借的日期(年/月/日): ");
scanf("%d%c%d%c%d",&c.borrow.year,&c.borrow.ch1 ,&c.borrow.month,&c.borrow.ch2,&c.
borrow.day);
strcpy(ch,c.bianhao);
fprintf(fp1,"%s\t%s\t%d%c%d%c%d
",c.uname ,c.bianhao,c.borrow.year,c.borrow.ch1,c.borrow.month,c.borrow.ch2,c.borrow.day);
p1=b;
fscanf(fp2,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
} for(p1=b;p1bianhao)==0) { } p2=p1; m=1; break; p1++; n++; while(feof(fp2)==0) { if(m==0) { printf("无此音像图书!\n"); printf("输入任意键继续!\n");
op=getchar();op=getchar();
} else if((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu==0)) { printf("\n此音像图书已全部借出!\n"); printf("输入任意键继续!\n");
op=getchar();op=getchar();
} else if((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu!=0)) {
printf("应交的押金额为 %d 元!",(p2->price)*3); c.money=(p2->price)*3; p2->shengyu=p2->shengyu-1; fprintf(fp1,"%d\n",c.money); fclose(fp1); fclose(fp2); printf("\n输入任意键继续!\n"); op=getchar();op=getchar(); if((fp2=fopen("d:\\Library.txt","w"))==NULL){ } for(p1=b;p1bianhao,p1->name,p1->price,p1->amount,p1->shengyu);
fclose(fp2);
}
打开borrow.txt 和Library.txt 文件, 将租借者的姓名、租借的书的编号和租借日期写入borrow.txt 文件中,计算并显示应交押金,同时把押金写入borrow.txt 文件该租借者的信息中,并且Library.txt 文件中相应音像图书数量减少。然后关闭文件。
(3)归还音像图书
void back_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组
struct borrower c={0},d[Max]={0},*p3=NULL,*p4=NULL; char ch[10]={0},ch1[100],op; int day,n1=0,n2=0,m=0,rent,money_1; int x,i; int month_day[2][13]={ {0,31,28,31,30,31,30,31,31,30,31,30,31},
}; FILE *fp1; FILE *fp2; fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
} printf("文件打开错误!\n"); exit(0); if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ } printf("请输入您的名字: "); scanf("%s",c.uname); printf("请输入归还的书的编号: "); scanf("%s",c.bianhao); printf("请输入归还的日期(年/月/日): "); scanf("%d%c%d%c%d",&c.back.year,&c.back.ch1,&c.back.month,&c.back.ch2,&c.back.day); strcpy(ch,c.bianhao); strcpy(ch1,c.uname); //在文件中寻找被借的书 p1=b; p3=d; while(feof(fp1)==0) { printf("文件打开错误!\n"); exit(0); } p1++; n1++;
{ fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.ch1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
} p3++; n2++;
for(p1=b;p1
if(strcmp(ch,p1->bianhao)==0) { p2=p1;
break;
for(p3=d;p3bianhao)==0&&strcmp(ch1,p3->uname)==0) { } p4=p3; m=1; break; }
//当输入的姓名或者借书的编号错误时
if(m==0) { printf("您没有借书记录!\n");
printf("输入y 重新填写资料,输入n 返回上一菜单!\n");
scanf(" %c",&op); if(op=='y') back_book(); if(op=='n') { } system("cls"); main() ;
);
printf("\n此音像图书名为《%s》 \n",p2->name); if((fp1=fopen("d:\\Library.txt","w"))==NULL){ } p2->shengyu =p2->shengyu+1; for(p1=b;p1bianhao ,p1->name,p1->price ,p1->amount ,p1->shengyu
if(p4->borrow.year==c.back.year) { } if(p4->borrow.month==c.back.month) else { } day=month_day[x][p4->borrow.month]-p4->borrow.day; for(i=p4->borrow.month+1;iborrow.day; //计算租借的总天数 x=(p4->borrow.year%4==0&&p4->borrow.year%100!=0||p4->borrow.year%400==0); day=day+c.back.day;
printf("一共租借了 %d 天!\n",day);
if(ch[0]=='B')
rent=day; if(ch[0]=='V')
if(ch[0]=='R') rent=day*3;
if(rent>=p3->money)
money_1=0; if(rentmoney) money_1=p3->money-rent;
printf("已交押金 %d 元,应交租金 %d元,应退金额 %d 元\n",p4->money,rent,money_1);
fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.cfclose(fp1); fclose(fp2); //删除租借者的信息 p3=d; n1=0; if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ } printf("文件打开错误!\n"); exit(0); while(feof(fp2)==0) { h1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
} fclose(fp2); for(p3=d;p3uname)==0) { p4=p3; p3++; n2++;
break;
}
{ printf("文件打开错误!\n"); exit(0); } for(p3=d;p3uname,p3->uname)==0) else continue;
fprintf(fp1,"%s %s %d%c%d%c%d %d",p3->uname ,p3->bianhao,p3->borrow.year,p3->borrow.ch1,p3->borrow.month,p3->borrow.ch2,p3->borrow.day,p3->money);
} printf("成功删除 %s 的信息!\n",p4->uname); printf("按任意键结束!"); op=getchar();op=getchar();
fclose(fp2);
}
打开borrow.txt 和Library.txt 文件,输入归还者的姓名、归还的书的编号和归还日期,计算租借天数,显示已交押金、应交租金、应退金额;将borrow.txt 中相应租借者的信息删除,Library.txt 中相应音像图书的数量增加。然后关闭文件。
(4)购进音像图书
void buy_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 char ch[10]={0},ch1[100]={0},op; int n=0,m=1,number; FILE *fp1; fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ printf("文件打开错误!\n"); exit(0);
printf("请输入购进音像图书的编号: "); scanf("%s",a.bianhao);
strcpy(ch,a.bianhao);
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
} fclose(fp1); for(p1=b;p1bianhao)==0) { p2=p1; strcpy(ch1,p1->name ); p1++; n++; p1=b; while(feof(fp1)==0) {
m=0;
if(m) { if((fp1=fopen("d:\\Library.txt","a"))==NULL){ printf("文件打开错误!\n"); exit(0); } printf("请输入要购进音像图书的名称: "); scanf("%s",a.name); printf("请输入要购进音像图书的原价: ");
scanf("%d",&a.price);
printf("请输入要购进音像图书的数量: ");
} break;
} else { if((fp1=fopen("d:\\Library.txt","w"))==NULL){ printf("文件打开错误!\n"); exit(0); } printf("此书已存在!\n"); printf("请输入要购进图书的数量: "); scanf("%d",&number); printf("购进音像图书《%s》成功!",a.name ); a.shengyu=a.amount; fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu); fclose(fp1); printf("购进音像图书《%s》成功!",ch1);
p2->amount =p2->amount +number;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu);
} p2->shengyu=p2->shengyu+number; for(p1=b;p1
printf("按任意键结束!");
op=getchar();op=getchar();
fclose(fp1);
}
打开Library.txt 文件,写入购进音像图书的编号,若音像图书已存在,则只输入购进数量;并在文件中添加原有音像图书的数量,若不存在,则输入新音像图书的名称、原价及数量,并添加到文件中,然后关闭文件。
(5)报废音像图书
void scrap_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 char ch[10]={0},op;
FILE *fp1; fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ } printf("文件打开错误!\n"); exit(0);
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
printf("请输入要报废的书的编号: "); scanf("%s",a.bianhao ); p1=b; while(feof(fp1)==0) { } p1++; n++; for(p1=b;p1bianhao)==0) { } p2=p1; m=0; break; fclose(fp1); if(m) printf("本音像图书库不存在此书!\n"); else if(p1->amount!=p1->shengyu) printf("《%s》已被借出,不能报废!\n",p1->name); else if(p1->amount==p1->shengyu)
if((fp1=fopen("d:\\Library.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0); }
for(p1=b;p1
if(p1->bianhao ==p2->bianhao) else
continue;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu);
}
}
printf("《%s》已成功报废!\n",p2->name); fclose(fp1);
printf("按任意键结束!"); op=getchar();op=getchar();
打开Library.txt 文件,写入需要报废的音像图书的编号,若要报废的音像图书已被借出,则不能进行报废,然后关闭文件。
(6)音像图书库概况
void storage_book() {
struct library a={0},b[Max]={0},*p1=NULL; //b为结构数组 char ch[10],op; int n=0,X,Y,Z,x,y,z; FILE *fp1; fflush(stdin); X=Y=Z=x=y=z=0;
p1=b;
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ }
while(feof(fp1)==0)
printf("文件打开错误!\n"); exit(0);
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu);
printf("本图书库一共有图书 %d 本,其中被借 %d 本;\n本图书库一共有VCD %d 个, }
for(p1=b;p1
strcpy(ch,p1->bianhao); if(ch[0]=='B') { }
X=X+p1->amount;
x=x+p1->amount-p1->shengyu; p1++; n++;
if(ch[0]=='V') }
{ }
if(ch[0]=='R') { }
Z=Z+p1->amount;
z=z+p1->amount-p1->shengyu; Y=Y+p1->amount;
y=y+p1->amount-p1->shengyu;
其中被借 %d 个;\n本图书库一共有录像带 %d 卷,其中被借 %d 卷!\n",X,x,Y,y,Z,z);
printf("按任意键结束!");
op=getchar(); fclose(fp1); }
打开Library.txt 文件,输出音像图书库中图书、VCD 和录像带各自的数量,同时输出图书、VCD 、录像带各自借出的数量。然后关闭文件。
完整程序请参见附录A
5. 测试与调试
表1 创建音像图书库测试用例
表2 租借音像图书测试用例
表3 归还音像图书测试用例
表4 购进音像图书测试用例
表5 报废音像图书库测试用例
表6 音像图书库概况测试用例
第3部分 实训总结
1. 个人总结
课程设计是培养学生综合运用所学知识发现、提出、分析和解决实际问题, 锻炼实践能力的重要环节, 是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学生来说掌握计算机开发技术是十分重要的。
回顾起此次课程设计,让我们感慨颇多。从拿到题目到完成整个编程,从理论到实践,几个星期的日子里,不仅巩固了以前学过的知识,而且学到了很多在书本上没有学到过的知识,也懂得集体团队的重要性。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践结合起来,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说是困难重重,毕竟第一次做这样的课程设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体等。通过这次课程设计之后,一定把以前所学过的知识重新温故。
本软件还是存在一些不足之处的,比如说在算租借天数的时候,为了方便计算所以只能计算同一年的租借天数,即租借跟归还必须要在同一年,这是本系统还需改进的地方。
2. 结束语
这次的课程设计得以完成,离不开老师和同学们的帮助,在此,对在编程中给予我们帮助的同学和老师表示衷心的感谢。
#include #define Max 100 #include #include
struct date{ int year; char ch1; int month;
char ch2;
int day; };
struct library{ char bianhao[10]; char name[100]; int price; int amount; int shengyu;
};
struct borrower{ 附录A 程序清单
//租借&归还日期 //音像图书库 //租借者信息
char uname[100];
char bianhao[10]; struct date borrow; int money;
struct date back;
int rent; };
void build_book(); //创建音像图书库 void borrow_book(); //租借音像图书 void back_book(); //归还音像图书 void buy_book(); //购进音像图书 void scrap_book(); //报废音像图书 void storage_book(); //图书库存储概况
int borrow_day(struct borrower e); //计算租借的天数 int main(void) { char choice; char op;
do{
printf(" ------------------------------------------- \n\n"); printf(" 请输入选项编号(0-6) \n\n");
printf(" ------------------------------------------- \n\n");
printf(" . 1--创建音像图书库 printf(" . 2--租借音像图书 printf(" . 3--归还音像图书 printf(" . 4--购进音像图书 printf(" . 5--报废音像图书库 printf(" . 6--音像图书库概况 printf(" . 0--退出系统 printf(" ------------------------------------------- \n"); scanf(" %c",&choice); switch(choice)
{
case '1':build_book(); break;
\n");
\n"); \n"); \n"); \n"); \n"); \n\n");
}
}
case '2':borrow_book(); break; case '3':back_book(); break; case '4':buy_book(); break; case '5':scrap_book(); break; case '6':storage_book(); break; case '0':break;
default:printf("\n 没有选项为%c的选项!\n",choice);
printf("\n 请输入任意键继续!"); op=getchar();op=getchar();system("cls");
}while(choice!='0');
printf("\n感谢使用本软件!已正常退出,按任意键结束。\n"); return 0;
//创建音像图书库 void build_book() {
char ch[10],op; struct library a; FILE *fp1=NULL; fflush(stdin);
fp1=fopen("d:\\Library.txt","a"); if(fp1==NULL) { }
printf("\n 请输入音像图书的编号:"); scanf("%s",a.bianhao); strcpy(ch,a.bianhao);
printf("\n文件打开错误!\n"); exit(0);
if(ch[0]!='B'&&ch[0]!='V'&&ch[0]!='R')
} printf(" 非法输入!\n"); printf(" 请按任意键重新输入!"); op=getchar();op=getchar(); build_book(); printf(" 请输入音像图书的名称:"); scanf("%s",a.name); printf(" 请输入音像图书的原价:"); scanf("%d",&a.price); printf(" 请输入音像图书的原数量:"); scanf("%d",&a.amount); printf(" 请输入音像图书的剩余数量:"); scanf("%d",&a.shengyu); if(a.amount
printf(" 请输入音像图书的原数量:");
scanf("%d",&a.amount); printf(" 请输入音像图书的剩余数量:");
scanf("%d",&a.shengyu);
} fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu); if(fclose(fp1)){ } printf("\n 创建音像图书《%s》成功!\n",a.name); printf("\n 输入任意键继续!\n"); op=getchar();op=getchar(); system("cls"); printf("不能关闭文件!\n"); exit(0);
//租借音像图书
void borrow_book()
{
if((fp1=fopen("d:\\borrow.txt","a"))==NULL){ } printf("文件打开错误!\n"); exit(0); struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 struct borrower c={0}; char ch[10]={0},op; int n=0,m=0; FILE *fp1; FILE *fp2; fflush(stdin);
if((fp2=fopen("d:\\Library.txt","r"))==NULL){
} printf("文件打开错误!\n"); exit(0);
printf("请输入您的姓名: ");
scanf("%s",c.uname); printf("请输入租借的书的编号: "); scanf("%s",c.bianhao); printf("请输入租借的日期(年/月/日): "); scanf("%d%c%d%c%d",&c.borrow.year,&c.borrow.ch1 ,&c.borrow.month,&c.borrow.ch2,&c.borrow.day);
strcpy(ch,c.bianhao); fprintf(fp1,"%s\t%s\t%d%c%d%c%d
",c.uname ,c.bianhao,c.borrow.year,c.borrow.ch1,c.borrow.month,c.borrow.ch2,c.borrow.day);
p1=b;
while(feof(fp2)==0) {
fscanf(fp2,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); } for(p1=b;p1bianhao)==0) { } p2=p1; m=1; break; p1++; n++; if(m==0) { printf("无此音像图书!\n"); printf("输入任意键继续!\n");
op=getchar();op=getchar();
} else if((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu==0)) { printf("\n此音像图书已全部借出!\n"); printf("输入任意键继续!\n");
op=getchar();op=getchar();
} else if((strcmp(ch,p2->bianhao)==0)&&(p2->shengyu!=0)) { printf("应交的押金额为 %d 元!",(p2->price)*3); c.money=(p2->price)*3; p2->shengyu=p2->shengyu-1; fprintf(fp1,"%d\n",c.money);
fclose(fp2); printf("\n输入任意键继续!\n"); op=getchar();op=getchar(); if((fp2=fopen("d:\\Library.txt","w"))==NULL){ } for(p1=b;p1bianhao,p1->name,p1->price,p1->amount,p1->shengyu); system("cls");
fclose(fp2);
}
//归还音像图书
void back_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组
struct borrower c={0},d[Max]={0},*p3=NULL,*p4=NULL; char ch[10]={0},ch1[100],op; int day,n1=0,n2=0,m=0,rent,money_1; int x,i; int month_day[2][13]={ }; FILE *fp1; FILE *fp2; {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}
if((fp1=fopen("d:\\Library.txt","r"))==NULL){
fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.cfscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); } while(feof(fp2)==0) { p1++; n1++; } if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ } printf("请输入您的名字: "); scanf("%s",c.uname); printf("请输入归还的书的编号: "); scanf("%s",c.bianhao); printf("请输入归还的日期(年/月/日): "); scanf("%d%c%d%c%d",&c.back.year,&c.back.ch1,&c.back.month,&c.back.ch2,&c.back.day); strcpy(ch,c.bianhao); strcpy(ch1,c.uname); //在文件中寻找被借的书 p1=b; p3=d; while(feof(fp1)==0) { printf("文件打开错误!\n"); exit(0); printf("文件打开错误!\n"); exit(0); h1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
} n2++;
for(p1=b;p1
if(strcmp(ch,p1->bianhao)==0) { p2=p1;
break;
for(p3=d;p3bianhao)==0&&strcmp(ch1,p3->uname)==0) { } p4=p3; m=1; break; }
//当输入的姓名或者借书的编号错误时
if(m==0) { printf("您没有借书记录!\n");
printf("输入y 重新填写资料,输入n 返回上一菜单!\n");
} scanf(" %c",&op); if(op=='y') back_book(); if(op=='n') { } system("cls"); main() ; printf("\n此音像图书名为《%s》 \n",p2->name); if((fp1=fopen("d:\\Library.txt","w"))==NULL){ printf("文件打开错误!\n");
);
} p2->shengyu =p2->shengyu+1; for(p1=b;p1bianhao ,p1->name,p1->price ,p1->amount ,p1->shengyu
if(p4->borrow.year==c.back.year) { } if(p4->borrow.month==c.back.month) else { } day=month_day[x][p4->borrow.month]-p4->borrow.day; for(i=p4->borrow.month+1;iborrow.day; //计算租借的总天数 x=(p4->borrow.year%4==0&&p4->borrow.year%100!=0||p4->borrow.year%400==0); day=day+c.back.day;
printf("一共租借了 %d 天!\n",day);
if(ch[0]=='B')
rent=day; if(ch[0]=='V') rent=day*2; if(ch[0]=='R') rent=day*3;
if(rent>=p3->money)
money_1=0;
money_1=p3->money-rent;
printf("已交押金 %d 元,应交租金 %d元,应退金额 %d 元\n",p4->money,rent,money_1);
fscanf(fp2,"%s%s%d%c%d%c%d%d",p3->uname ,p3->bianhao,&p3->borrow.year,&p3->borrow.cfclose(fp1); fclose(fp2); //删除租借者的信息 p3=d; n1=0; if((fp2=fopen("d:\\borrow.txt","r"))==NULL){ } printf("文件打开错误!\n"); exit(0); while(feof(fp2)==0) { h1,&p3->borrow.month,&p3->borrow.ch2,&p3->borrow.day,&p3->money);
} fclose(fp2); for(p3=d;p3uname)==0) { p4=p3; p3++; n2++;
break;
} if((fp2=fopen("d:\\borrow.txt","w"))==NULL) { printf("文件打开错误!\n"); exit(0); }
{ if(strcmp(p4->uname,p3->uname)==0) else continue;
fprintf(fp1,"%s %s %d%c%d%c%d %d",p3->uname ,p3->bianhao,p3->borrow.year,p3->borrow.ch1,p3->borrow.month,p3->borrow.ch2,p3->borrow.day,p3->money);
}
printf("成功删除 %s 的信息!\n",p4->uname);
printf("按任意键结束!");
op=getchar();op=getchar();
system("cls");
fclose(fp2);
}
//购进音像图书
void buy_book()
{
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL;
char ch[10]={0},ch1[100]={0},op;
int n=0,m=1,number;
FILE *fp1;
fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){
printf("文件打开错误!\n");
exit(0);
}
printf("请输入购进音像图书的编号: ");
scanf("%s",a.bianhao);
strcpy(ch,a.bianhao);
if(ch[0]!='B'&&ch[0]!='V'&&ch[0]!='R')
//b为结构数组
} printf(" 非法输入!\n"); printf(" 请按任意键重新输入!"); op=getchar();op=getchar(); buy_book(); p1=b; while(feof(fp1)==0) { fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); } fclose(fp1); for(p1=b;p1bianhao)==0) { p2=p1; strcpy(ch1,p1->name ); p1++; n++;
m=0;
if(m) { if((fp1=fopen("d:\\Library.txt","a"))==NULL){ printf("文件打开错误!\n"); exit(0); } printf("请输入要购进音像图书的名称: "); scanf("%s",a.name); printf("请输入要购进音像图书的原价: ");
scanf("%d",&a.price);
} break;
printf("请输入要购进音像图书的数量: ");
scanf("%d",&a.amount); } else {
if((fp1=fopen("d:\\Library.txt","w"))==NULL){ printf("文件打开错误!\n"); exit(0); }
printf("此书已存在!\n");
printf("请输入要购进图书的数量: "); scanf("%d",&number);
printf("购进音像图书《%s》成功!",a.name ); a.shengyu=a.amount;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",a.bianhao,a.name,a.price,a.amount,a.shengyu); fclose(fp1);
printf("购进音像图书《%s》成功!",ch1);
p2->amount =p2->amount +number;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu); }
p2->shengyu=p2->shengyu+number; for(p1=b;p1
printf("按任意键结束!");
op=getchar();op=getchar(); system("cls");
fclose(fp1); } //报废音像图书 void scrap_book() {
struct library a={0},b[Max]={0},*p1=NULL,*p2=NULL; //b为结构数组 char ch[10]={0},op;
FILE *fp1; fflush(stdin);
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ }
printf("文件打开错误!\n"); exit(0);
printf("请输入要报废的书的编号: "); scanf("%s",a.bianhao ); p1=b;
while(feof(fp1)==0) {
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); }
for(p1=b;p1
if(strcmp(a.bianhao,p1->bianhao)==0) { }
p2=p1; m=0; break; p1++; n++;
fclose(fp1); if(m)
printf("本音像图书库不存在此书!\n");
else
if(p1->amount!=p1->shengyu)
printf("《%s》已被借出,不能报废!\n",p1->name);
else
if(p1->amount==p1->shengyu)
if((fp1=fopen("d:\\Library.txt","w"))==NULL)
{
printf("文件打开错误!\n");
exit(0); }
for(p1=b;p1
if(p1->bianhao ==p2->bianhao) else
continue;
fprintf(fp1,"%s\t%s\t%d\t%d\t%d\n",p1->bianhao,p1->name,p1->price,p1->amount,p1->shengyu); }
}
printf("《%s》已成功报废!\n",p2->name); fclose(fp1);
printf("按任意键结束!"); op=getchar();op=getchar(); system("cls");
//图书库存储概况 void storage_book() {
struct library a={0},b[Max]={0},*p1=NULL; //b为结构数组 char ch[10],op; int n=0,X,Y,Z,x,y,z; FILE *fp1; fflush(stdin); X=Y=Z=x=y=z=0;
p1=b;
if((fp1=fopen("d:\\Library.txt","r"))==NULL){ }
while(feof(fp1)==0)
printf("文件打开错误!\n"); exit(0);
fscanf(fp1,"%s%s%d%d%d",p1->bianhao,p1->name,&p1->price,&p1->amount,&p1->shengyu); }
for(p1=b;p1
strcpy(ch,p1->bianhao); if(ch[0]=='B') { }
X=X+p1->amount;
x=x+p1->amount-p1->shengyu; p1++; n++;
if(ch[0]=='V') }
{ }
if(ch[0]=='R') { }
Z=Z+p1->amount;
z=z+p1->amount-p1->shengyu; Y=Y+p1->amount;
y=y+p1->amount-p1->shengyu;
printf("本图书库一共有图书 %d 本,其中被借 %d 本;\n本图书库一共有VCD %d 个,其
中被借 %d 个;\n本图书库一共有录像带 %d 卷,其中被借 %d 卷!\n",X,x,Y,y,Z,z);
printf("按任意键结束!");
op=getchar();
system("cls");
fclose(fp1); }
附录B 用户使用说明书
一、硬件环境:普通计算机。
二、软件环境:要用到编译语言VC++6.0;支持各种Windows 操作系统。 三、使用方法:打开系统,根据提示输入即可使用。 四、注意事项:
1、使用过程中显示的选项都为必填选项;
2、输入音像图书的编号时注意用B_**、V_**和R_**分别表示图书、VCD 和录像带的编号。
参考文献
何钦铭,颜晖. C语言程序设计[M]. 2版. 北京:高等教育出版社,2012.
《C 程序设计综合实践》评分表
指导教师签名:
日 期:_2013年6月25日_