20##年第二阶段课程设计成果报告
实训项目: 程序设计技术课程设计
学号: 姓名:
专业:
实训日期:20##年6月 27 日至20##年7月8日
指导教师: 实训成绩:
江西财经大学信息管理学院
一、 问题概述
(对问题背景及主要实现的功能进行简要说明。)
随着图书馆图书的不断增加,图书管理的难度也随之加大,一个好的图书馆图书信息管理系统,能够使图书管理工作简便,有条不紊。通过C语言学习,我们已经能够完成基本的C语言编程,此次实训,是将学习和实践结合,充分感受C语言解决实践问题的魅力。此次编写的图书馆信息管理系统,能够实现基本的图书管理功能。它包括图书库的创建,打印图书信息表,录入新图书,修改图书信息,删除图书信息,借书,还书。图书库包含图书的各方面信息,编号,类型,作者,出版社,总数,剩余量等等,并且打印图书信息表。录入,修改,删除这些功能都是对图书库的操作。借书,还书这两项最重要的功能也都能很好的实现。把此系统应用于图书馆的图书管理,能使图书馆的各项工作便捷,可靠的完成。
二、 系统目标
(主要是对系统技术目标和要求)
欢迎界面、主菜单、系统管理功能、图书信息管理、借阅功能模块、
其中系统管理功能包括系统管理员添加、删除、修改信息以及用管理员身份登录系统等功能。
图书信息管理包括新增图书、修改图书、删除图书、等功能。
借阅功能模块包括借书功能、还书功能、查询已借图书、查询过期未还图书,其中借书还书功能可以按图书编号信息进行操作。
三、 设计的过程及步骤
1、需求分析
(描述系统需求,既详细分析系统需求和功能)
根据题目要求,应当把图书信息用结构体形式输入,再定义一个全局变量和文件指针进行整个程序的运行,然后把图书信息送到文件中,所以应该提供一个结构体和文件的输入输出等操作;在程序中需实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现;另外还需提供键盘式选择菜单实现功能,在运行时达到所要目的。
2、设计文件结构
(设计文件结构,并扼要说明设计缘由)
此系统根据所要实现的功能,使用的函数等综合考虑,设计了两个,图书信息文件(tushu.red),借还书文件(borrow.red),录入新图书,修改,删除图书等一些操作时在图书信息文件上运行,借还书功能则在借还书文件上运行,同时也要在图书信息文件上运行。两个文件相互结合,使各个功能很好的实现了,运用C语言的文件功能,也是整个程序的主线。
3、设计系统功能图
(根据需求分析结果和文件结构,应用结构化分析与设计技术设计功能结构图,如下图所示)
4、函数设计
( 详细分析每一个子模块的子功能,定义主要的子函数原型,并对每一个函数的功能加以说明)
此系统主要有7个功能,也就有主要的7个函数,他们分别是
void shan() //删除图书信息
void xiu() //修改图书信息
void putin() //录入新图书
void print() //打印图书信息表
void returned() //还书
void books() //创建图书文件
void borrowed() //借书
其中每一个函数都用到了两个结构体,它们分别是:
struct tushu
{
char bianhao1[10];
char bianhao2[10];
char leixing[20];
char shuming[50];
char chubanshe[50];
char writer[20];
long zongshu;
long shengyu;
}shu;
struct books
{
char bianhao1[10];
char bianhao2[10];
long nian;
long borrowmonth;
long borrowday;
long returnedmonth;
long returnedday;
long limittime;
char student[10];
}book;
四、 实训成果
(对自己的最后的实验成果进行概括)
经过长达9天的编写,修改,运行,最后完成时,预想的功能都能比较好的实现。下面是各个功能运行的界面:
进入界面 :
功能选择界面 :
录入新图书界面 :
还有各个功能各种界面,这里就不一一列出了。
五、 实训心得与体会
此次系统编程,我感受很多,从开始编程时的迷茫,到修改时的烦躁,再到运行时的无奈,最后是成功时无法表达的喜悦和兴奋。每一步都是自己努力走过来的,虽然这个过程比较辛苦,但是现在回过头去想想,这几天还是过得很有意义和价值的。大家都说编程最需要的是耐心,我这次是深有体会,程序刚开始编,满身都是信心和兴趣,到修改的时候,检查一遍又一遍,修改一次有一次还是无法成功运行,这个时候只有耐心才能坚持完成。同时,编程时,会发现许多以前学的概念都记错了,这时候要找出课本重新温习,所以这也是一个不断学习的过程。还有,编程时不能太死板,要实现一个功能其实都会有很多种算法,我们应边做边学习新的方法。对于我的不足之处,要实现一个功能时,我总是第一遍编程实现后,就不愿意在深探究下去,这种惰性很不适合做编程工作。
总而言之,通过此次C语言实践编程,使我对C语言的兴趣更加浓厚,也对C语言的实践应用更加了解,充分感受到了它的魅力,同时也明白了自身在这方面工作的优势和不足。
六、 附录
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct tushu
{
char bianhao1[10];
char bianhao2[10];
char leixing[20];
char shuming[50];
char chubanshe[50];
char writer[20];
long zongshu;
long shengyu;
}shu;
struct books
{
char bianhao1[10];
char bianhao2[10];
long nian;
long borrowmonth;
long borrowday;
long returnedmonth;
long returnedday;
long limittime;
char student[10];
}book;
void shan() //删除图书信息
{
FILE *fp;
int i=0,j,n,m,l;
char booknum[20];
struct tushu tu[1000];
if((fp=fopen("tushu.txt","r"))==NULL)
{
printf("can not open the tushu.txt.\n");
exit(0);
}
while(fread(&tu[i],sizeof(shu),1,fp))
{
i++;
m=i;
}
printf("要删除几本书:");
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
printf("输入图书编号2:");
gets(booknum);
for(j=0;j<m;j++)
if(strcmp(booknum,tu[j].bianhao2)==0)
break;
if(j<m)
{
for(l=0;l<m;l++)
if(strcmp(tu[j].bianhao1,tu[l].bianhao1)==0)
{
tu[l].zongshu--;
tu[l].shengyu--;
}
for(j;j<m;j++)
tu[j]=tu[j+1];
}
else
{
printf("输入有误 重新输入\n");
i--;
}
}
if((fp=fopen("tushu.txt","w"))==NULL)
{
printf("can not open the tushu.txt.\n");
exit(0);
}
for(i=0;i<m-n;i++)
fwrite(&tu[i],sizeof(shu),1,fp);
printf("删除成功!!");
}
void xiu() //修改图书信息
{
FILE *fp;
int i=0,m,n;
char booknum[20],numchar[20];
struct tushu tu[1000];
if((fp=fopen("tushu.txt","r"))==NULL)
{
printf("can not open the borrow.txt.\n");
exit(0);
}
while(fread(&tu[i],sizeof(shu),1,fp))
{
i++;
m=i;
}
if((fp=fopen("tushu.txt","w"))==NULL)
{
printf("can not open the borrow.txt.\n");
exit(0);
}
printf("要修改几本书:");
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
printf("输入要修改的图书编号2:");
gets(booknum);
for(i=0;i<m;i++)
{
if(strcmp(booknum,tu[i].bianhao2)==0)
break;
}
if(i<m)
{
printf("》》》输入修改后的\n\n");
printf("》》》输入编号1:");
gets(tu[i].bianhao1);
printf("\n");
printf("》》》编号2:");
gets(tu[i].bianhao2);
printf("\n");
printf("》》》类型:");
gets(tu[i].leixing);
printf("\n");
printf("》》》书名:");
gets(tu[i].shuming);
printf("\n");
printf("》》》出版社:");
gets(tu[i].chubanshe);
printf("\n");
printf("》》》作者:");
gets(tu[i].writer);
printf("\n");
printf("》》》总数:");
gets(numchar);
printf("\n");
tu[i].zongshu=atol(numchar);
printf("》》》剩余:");
gets(numchar);
printf("\n");
tu[i].shengyu=atol(numchar);
}
else
printf("输入有误\n");
for(i=0;i<m;i++)
fwrite(&tu[i],sizeof(shu),1,fp);
}
fclose(fp);
}
void putin() //录入新图书
{
char numchar[20];
FILE *fp;
int i=0,m,n;
struct tushu tu[1000];
if((fp=fopen("tushu.txt","r"))==NULL)
{
printf("can not open the borrow.txt.\n");
exit(0);
}
while(fread(&tu[i],sizeof(shu),1,fp))
{
i++;
m=i;
}
if((fp=fopen("tushu.txt","w"))==NULL)
{
printf("can not open the borrow.txt.\n");
exit(0);
}
for(i=0;i<m;i++)
{
fwrite(&tu[i],sizeof(shu),1,fp);
}
printf("要录入几本书:");
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
printf("\n");
printf("》》》输入编号1:");
gets(shu.bianhao1);
printf("\n");
printf("》》》编号2:");
gets(shu.bianhao2);
printf("\n");
printf("》》》类型:");
gets(shu.leixing);
printf("\n");
printf("》》》书名:");
gets(shu.shuming);
printf("\n");
printf("》》》出版社:");
gets(shu.chubanshe);
printf("\n");
printf("》》》作者:");
gets(shu.writer);
printf("\n");
printf("》》》总数:");
gets(numchar);
printf("\n");
shu.zongshu=atol(numchar);
printf("》》》剩余:");
gets(numchar);
printf("\n");
shu.shengyu=atol(numchar);
fwrite(&shu,sizeof(shu),1,fp);
}
fclose(fp);
}
void print() //打印图书信息表
{
FILE *fp;
if((fp=fopen("tushu.txt","r"))==NULL)
{
printf("can not open the tushu.txt.\n");
exit(0);
}
puts("_______________________________________________________________________");
puts("-----------------------------------------------------------------------");
puts("| 编号1 | 编号2 | 类型 | 书名 | 作者 | 出版社 | 总数 | 剩余 |");
fseek(fp,0L,SEEK_SET);
while(fread(&shu,sizeof(shu),1,fp)==1)
printf(" %-9s%-10s%-10s%-10s%-10s%-10s%-10ld%-10ld\n",shu.bianhao1,shu.bianhao2,shu.leixing,shu.shuming,shu.writer,shu.chubanshe,shu.zongshu,shu.shengyu);
}
void returned() //还书
{
FILE *fp;
int i=0,m,flag=0,j;
char booknum[20];
struct books book1[1000];
if((fp=fopen("borrow.txt","r"))==NULL)
{
printf("can not open the borrow.txt.\n");
exit(0);
}
while(fread(&book1[i],sizeof(book),1,fp))
{
i++;
m=i;
}
if((fp=fopen("borrow.txt","w"))==NULL)
{
printf("can not open the borrow.txt.\n");
exit(0);
}
printf("输入要还的图书编号2:");
gets(booknum);
for(j=0;j<m;j++)
{
if(strcmp(booknum,book1[j].bianhao2)==0)
{
flag=1;
break;
}
}
if(flag)
{
flag=0;
printf("输入还书月份:");
scanf("%ld",&book1[i].returnedmonth);
printf("输入还书日期:");
scanf("%ld",&book1[i].returnedday);
getchar();
for(j=0;j<m;j++)
fwrite(&book1[i],sizeof(book),1,fp);
}
else
printf("输入有误\n");
fclose(fp);
}
void books() //创建图书文件
{
FILE *fp;
char numchar[50],ch='y';
if((fp=fopen("tushu.txt","wt"))==NULL)
{
printf("can not open the tushu.txt.\n");
exit(0);
}
while(ch=='y'||ch=='Y')
{
printf("\n");
printf("》》》输入编号1:");
gets(shu.bianhao1);
printf("\n");
printf("》》》编号2:");
gets(shu.bianhao2);
printf("\n");
printf("》》》类型:");
gets(shu.leixing);
printf("\n");
printf("》》》书名:");
gets(shu.shuming);
printf("\n");
printf("》》》出版社:");
gets(shu.chubanshe);
printf("\n");
printf("》》》作者:");
gets(shu.writer);
printf("\n");
printf("》》》总数:");
gets(numchar);
printf("\n");
shu.zongshu=atol(numchar);
printf("》》》剩余:");
gets(numchar);
printf("\n");
shu.shengyu=atol(numchar);
fwrite(&shu,sizeof(shu),1,fp);
do{
printf("have another book record(y/n)?:");
gets(numchar);
ch=numchar[0];
}while(!(ch=='y'||ch=='n'||ch=='Y'||ch=='N'));
}
fclose(fp);
}
void borrowed() //借书
{
struct tushu tu[1000];
struct books book1[1000];
FILE *fp,*fq;
char numchar[50];
int i=0,j,m1,m2,n,flag=0,x;
printf("借几本书:");
scanf("%d",&x);
getchar();
if((fq=fopen("tushu.txt","r"))==NULL)
{
printf("can not open the tushu.txt.\n");
exit(0);
}
while(fread(&tu[i],sizeof(shu),1,fq))
{
i++;
m1=i;
}
if((fp=fopen("borrow.txt","r"))==NULL)
{
printf("can not open the borrow.txt.\n");
exit(0);
}
while(fread(&book1[i],sizeof(book),1,fp))
{
i++;
m2=i;
}
for(i=0;i<x;i++)
{
printf("\n");
printf("输入编号2:");
gets(numchar);
for(j=0;j<m1;j++)
{
if(strcmp(numchar,tu[j].bianhao2)==0)
{
n=j;
flag=1;
break;
}
}
if(flag)
{
printf("\n");
printf("输入正确\n\n");
flag=0;
strcpy(book.bianhao2,numchar);
printf("》》》输入编号1"); gets(book.bianhao1); printf("\n");
printf("》》》借书年份:"); gets(numchar); printf("\n"); book.nian=atol(numchar);
printf("》》》借书月份:"); gets(numchar); printf("\n"); book.borrowmonth=atol(numchar);
printf("》》》借书日期:"); gets(numchar); printf("\n"); book.borrowday=atol(numchar);
printf("》》》还书月份:"); gets(numchar); printf("\n"); book.returnedmonth=atol(numchar);
printf("》》》还书日期:"); gets(numchar); printf("\n"); book.returnedday=atol(numchar);
printf("》》》期限:"); gets(numchar); printf("\n"); book.limittime=atol(numchar);
printf("》》》学生学号:"); gets(book.student); printf("\n");
if((fp=fopen("borrow.txt","w"))==NULL)
{
printf("can not open the borrow.txt.\n");
exit(0);
}
fwrite(&book,sizeof(book),1,fp);
for(j=0;j<m2;j++)
{
fwrite(&book1[j],sizeof(book),1,fp);
}
for(j=0;j<m1;j++)
{
if(strcmp(tu[n].bianhao1,tu[j].bianhao1)==0)
tu[j].shengyu--;
}
if((fq=fopen("tushu.txt","w"))==NULL)
{
printf("can not open the tushu.txt.\n");
exit(0);
}
for(j=0;j<m1;j++)
{
fwrite(&tu[j],sizeof(shu),1,fq);
}
}
else
{
printf("输入错误\n");
i--;
}
}
fclose(fq);
fclose(fp);
}
void main()
{
int flag=1;
char a[20];
puts("┌──────────────────────────┐");
puts("│ │");
puts("│ │");
puts("│ │");
puts("│ │");
puts("│ │");
puts("│ 欢迎使用图书信息管理系统 │");
puts("│ │");
puts("│ │");
puts("│ │");
puts("│ │");
puts("│ █████ │");
puts("│ █田█田█ │");
puts("│ █田█田█ │");
puts("│ █田█田█. │");
puts("│ █田█田█. │");
puts("│ █████ │");
puts("│ ◢██□██◣. │");
puts("│ │");
puts("│ │");
puts("│ 请选择您需要的功能 : │");
puts("│ │");
puts("│ (直接键入对应数字) │");
puts("│ │");
puts("│ │");
puts("│ │");
puts("│ 1.图书创建 │");
puts("│ │");
puts("│ 2.打印图书信息表 │");
puts("│ │");
puts("│ 3.图书追加与录入 │");
puts("│ │");
puts("│ 4.修改图书信息 │");
puts("│ │");
puts("│ 5.删除图书信息 │");
puts("│ │");
puts("│ 6.借书 │");
puts("│ │");
puts("│ 7.还书 │");
puts("│ │");
puts("│ │");
puts("│ │");
puts("│ │");
puts("│ │");
puts("│ │");
puts("└──────────────────────────┘");
while(flag)
{
flag=0;
scanf("%s",a);
getchar();
if(strcmp(a,"3")==0)
putin();
else if(strcmp(a,"1")==0)
books();
else if(strcmp(a,"6")==0)
borrowed();
else if(strcmp(a,"2")==0)
print();
else if(strcmp(a,"7")==0)
returned();
else if(strcmp(a,"4")==0)
xiu();
else if(strcmp(a,"5")==0)
shan();
else
{
printf("输入错误 请重新输入:");
flag=1;
}
}
}