您的当前位置:首页正文

图书信息管理系统实验报告书

2020-07-01 来源:爱站旅游
导读图书信息管理系统实验报告书


课 程 报 告

课 程 名 称: 程序设计实践 专 业 班 级 : 信息类1006 学 生 姓 名 :

学 号 : 201046830605 任 课 教 师 : 徐振强 学 期 :2010-2011学年第二学期

课程报告任务书

题 目 图书信息管理系统 开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。使之能提供以下基本功能: (1)图书信息录入功能(图书信息用文件保存)--输入 (2)图书信息浏览功能--输出 主要 (3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式): ①按书名查询 ②按作者名查询 ③ 按照价钱排序 ④按出版时间排序等等 内容 (4)图书信息的删除与修改 扩展功能:可以按照自己的程度进行扩展。比如(1)简单的权限处理 (2)报表打印功能(3)甚至根据自己情况,可以加上学生信息,并扩充为图书借阅系统。(4)模糊查询 (5)综合查询 (6)统计功能 比如统计处某一类别的图书信息 或 筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能。 一、提交材料应包括:(1)系统源代码 (2)课程报告 二、整个设计过程具体要求 (1)需求分析 要求学生对案例系统进行分析,设计出需要完成的功能,完善任务 要求 各个模块的调用关系; (2)设计过程 要求学生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等) (3)实现过程 要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试; (4)总结阶段 按照要求完成系统设计和实现报告,并进行总结、答辩。 报告撰写情况(30分) 系统完成情况(30分) 答辩情况(40分) 内容 规范程度 程序测试 基本功能扩展功能自述情况答辩情况 20分 5分 5分 20分 10分 10分 30分 总分 成绩 评定

成绩评定教师:

一. 需求分析

本次C语言程序设计以“图书馆管理系统”为题,题目要求开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己的当前能力进行扩充)。

基本功能包括:

(1)图书信息录入功能(图书信息用文件保存)--输入 (2)图书信息浏览功能--输出

(3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式):  ①按书名查询 ②按作者名查询 ③ 按照价钱排序 ④按出版时间排序等等

(4)图书信息的删除与修改

当然,也可以根据个人的情况进行适当的扩展:比如权限处理啊,报表打印功能,模糊查询,统计功能,或 筛选出小于指定数量库存的图书等等。

测试数据有ASCII文件tushu_list.txt提供: tushu_list.txt文件结构:(无序)

图书编号 书名 作者 出版社 类别 出版社时间 价格 -------------------------------------------------------------------- 1001 三国演义 罗贯中 民族文学出版社 小说 1585 55.5 1008 孟子 孟子 人民教育出版社 古籍 1981 23.33 1002 水浒传 施耐庵 民族文学出版社 小说 1582 48.36 1003 西游记 吴承恩 民族文学出版社 小说 1602 46.38 1006 线性代数 同济 同济大学出版社 教育 2010 19.98 1010 新视野 郑树棠 外研社 教育 2009 32.90 1007 春秋 孔子 人民教育出版社 古籍 1980 22.22 1009 时间简史 霍金 外研社 科普 1977 35.31 1004 红楼梦 曹雪芹 民族文学出版社 小说 1621 49.59 1005 高等数学 同济 同济大学出版 教育 2010 29.6

二概要设计

(1).数据结构

根据题目给定的图书信息和数据格式可知道,链表结点必须用结构体实现。故:首先建立结构体数组:

struct tushu{

};

char num[10]; 字符型图书编号 char name[20]; 字符型书名 char writer[20]; 字符型作者 char press[20]; 字符型出版社 char kind[20]; 字符型类别 double time; 双精度实型出版时间 double price; 实型价格

struct tushu *next; 用与构建连表指向下一结点

FILE *fp; 定义全局变量fp

(2).模块划分 定义全局变量:

FILE *fp; /* 定义全局变量fp*/ 函数原型清单: /*密码验证*/ void secret(); /*主菜单*/ void menu(); /*录入图书信息*/ struct tushu * Input(); /*将信息导入文件可追加*/

void fprint(struct tushu *head); /*将信息导入文件只写(可覆盖)*/ void fprint_(struct tushu *head); /*从tushu_list中读取数据构建链表*/

struct tushu * create(struct tushu * head,int *n); /*浏览全部图书信息*/

void Browse(struct tushu *head); /*统计图书数目*/

void count(struct tushu *head); /*按书名查询图书*/

void Findofname(struct tushu *head); /*按作者查询图书*/

void Findofwriter(struct tushu *head); /*按类别查询图书*/

void Findofkind(struct tushu *head); /*按出版时间排序*/

void Sort_time(struct tushu * head); /*按价格排序*/

void Sort_price(struct tushu * head); /*按图书编号排序*/

void Sort_num(struct tushu * head); /*按编号删除图书*/

struct tushu * Delete(struct tushu * head,char m[15]); /*修改图书*/

struct tushu * Revise(struct tushu *head); (3).程序总体框架

模块层次结构只确定了模块之间的关系以及函数原型,不是程序的执行步骤。程序的总体框架是程序的总体流程图。此程序并非是按照顺序逐一执行的,其中有某些程序他们之间的关系并不是递进,而是并列。所以选取一个合适的菜单是最佳方案。程序的总体框架如下:

由主函数进入程序 密码验证 未通过 通过后输出主菜单 图书馆图书管理系统 0-退出系统 6-按类别查询 1-添加新图书 7-按时间排序 2-浏览图书 8-按价格排序 3-统计图书数目 9-按编号排序 4-按书名查询 10-按编号删除图书 5-按作者查询 11-修改图书 输入对应编号 三.功能模块的详细设计

主菜单

1.函数原型,功能及形参说明 函数原型:void menu()

函数功能:实现系统的菜单调用,显示对应选项 参数说明:函数类型为空 2.程序清单

0-1-2-3-4-5-6-7-8-9-10-11-退出系统添加新图书浏览图书统计图书数目按书名查询按作者查询按类别查询按时间排序按价格排序按编号排序按编号删除图书修改图书

void menu() {

printf(\"\\n**************************************************\\n\"); } 密码验证

1.函数原型,功能及形参说明 函数原型:void secret()

函数功能:实现系统的密码验证功能

参数说明: char a[20] 20个字符以内的密码输入 system(\"cls\"); 库函数 清频 2.程序清单 void secret() {

char a[20];

printf(\"**进入图书管理系统前请先进行密码验证---\"); do{

gets(a); /*输入密码*/ system(\"cls\"); /*调用库函数清屏*/ printf(\"对不起!您输入的密码有误,请重新输入---\");

printf(\" 图书馆图书管理系统 \\n\"); printf(\"---------------------------------------------------\\n\"); printf(\" 0-退出系统 6-按类别查询 \\n\"); printf(\" 1-添加新图书 7-按时间排序 \\n\"); printf(\" 2-浏览图书 8-按价格排序 \\n\"); printf(\" 3-统计图书数目 9-按编号排序 \\n\"); printf(\" 4-按书名查询 10-按编号删除图书 \\n\"); printf(\" 5-按作者查询 11-修改图书 \\n\"); printf(\"---------------------------------------------------\\n\"); printf(\"__________________________________________________ \\n\");

}

}while(strcmp(a,\"0605\")!=0); /*单一密码“0605”*/ system(\"cls\");

printf(\" 欢迎进入图书管理系统\\n\");

添加新图书及是否保存 1.函数原型,功能及形参说明 函数原型:struct tushu * Input()

函数功能:实现图书的添加及保存(其中调用函数void fprint(struct tushu

*head);/*将信息导入文件可追加*/)

参数说明:*head 链表头结点指针 *p1,*p2 辅助结点 局外变量 2.程序清单

/*录入图书信息建立图书信息的链表*/ struct tushu * Input() {

struct tushu *p1,*p2,*head; /*建立辅助结点及头结点*/ char num; int n=0,x; system(\"cls\"); menu();

printf(\"\\n请按对应项输入图书信息以#结束:\\n\"); p1=(struct tushu *)malloc(sizeof(struct tushu)); head=p2=p1;

do{ /*使用do while语句输入图书信息*/

scanf(\"%s\

if(strcmp(p1->num,\"#\")==0)break; /*判断结束符*/ else

scanf(\"%s%s%s%s%lf%lf\

p1->name,p1->writer,p1->press,p1->kind,&p1->time,&p1->price);

}

num='#'; /*???*/ p1=(struct tushu *)malloc(sizeof(struct tushu)); p2->next=p1; p2=p1; n++;

}while(1); p1->next=NULL;

printf(\"图书信息输入结束!\\n\"); getchar();

printf(\"是否保存图书信息?(1.是/2.否):\"); scanf(\"%d\if(x==1)

fprint(head); /*调用函数保存至文件*/

else

printf(\"\\n文件没有被保存!\\n\");

return head; /*返回头指针*/

将信息导入文件可追加 1.函数原型,功能及形参说明

函数原型:void fprint(struct tushu *head) 函数功能:实现图书的保存将信息导入文件可追加 参数说明:struct tushu *head 链表头结点指针 2.程序清单

void fprint(struct tushu *head) {

struct tushu *p1;

if((fp=fopen(\"tushu_list.txt\{

printf(\"File open error!\\n\");

}

exit(0);

for(p1=head;p1->next!=NULL;p1=p1->next) /*遍历*/

fprintf(fp,\"%s\%s\%s\%s\%s\%.0lf\%lf\\n\

p1->num,p1->name,p1->writer,p1->press,p1->kind,p1->time,p1->price

);/*将图书信息写入文件*/ }

将信息导入文件不可追加 1.函数原型,功能及形参说明

函数原型:void fprint_(struct tushu *head)

函数功能:实现修改及删除后的图书保存将信息导入文件并覆盖原文件 参数说明:struct tushu *head 链表头结点指针 2.程序清单

void fprint_(struct tushu *head) {

struct tushu *p1;

if((fp=fopen(\"tushu_list.txt\{ }

for(p1=head;p1!=NULL;p1=p1->next) /*遍历*/

fprintf(fp,\"%s\%s\%s\%s\%s\%.0lf\%lf\\n\printf(\"File open error!\\n\"); exit(0);

fclose(fp); /*关闭文件*/ system(\"cls\"); menu();

printf(\"\\n图书信息已成功保存到文件 tushu_list.txt 中!\\n\"); getchar();

p1->num,p1->name,p1->writer,p1->press,p1->kind,p1->time,p1->price

);/*将图书信息写入文件*/ }

浏览图书信息

1.函数原型,功能及形参说明

函数原型:void Browse(struct tushu *head) 函数功能:实现图书信息的输出

参数说明:struct tushu *head 链表头结点指针 2.程序清单

void Browse(struct tushu *head) /*浏览全部图书信息*/ {

fclose(fp); /*关闭文件*/ system(\"cls\"); menu();

printf(\"\\n图书信息已成功保存到文件 tushu_list.txt 中!\\n\"); getchar();

char num[10]; char name[20]; char writer[20]; char press[20]; char kind[20]; double time; double price; system(\"cls\"); menu();

if((fp=fopen(\"tushu_list.txt\{ }

printf(\"File open error!\\n\"); exit(0);

printf(\"---------------------------------------------------\\n\"); printf(\"编号 书名 作者 出版社 类别 出版时间 价格\\n\"); while(!feof(fp))/*读取并输出*/ {

fscanf(fp,\"%s%s%s%s%s%lf%lf\

num,name,writer,press,kind,&time,&price);

printf(\" %s\%s\%s\%s\%s\%.0lf\%.2lf\\n\

num,name,writer,press,kind,time,price);

}

};

if(fclose(fp)) { }

printf(\"Can not close the file!\\n\"); exit(0);

从tushu_list中读取数据构建链表 1.函数原型,功能及形参说明

函数原型:struct tushu * create(struct tushu * head,int *n) 函数功能:建立图书信息单向链表

参数说明:struct tushu *head 链表头结点指针 int *n 图书数目指针 2.程序清单

struct tushu * create(struct tushu * head,int *n) {

struct tushu *p,*p1,*p2;

if((fp=fopen(\"tushu_list.txt\先安全打开目录文件*/ { }

printf(\"File open error!\\n\"); exit(0);

}

while(!feof(fp))/*读取并创建链表*/ { }

p2->next=NULL;

free(p); /*释放辅助结点所占用空间*/ (*n)--; fclose(fp); return head;

(*n)++;

p=(struct tushu *)malloc(sizeof(struct tushu)); fscanf(fp,\"%s%s%s%s%s%lf%lf\

p->num,p->name,p->writer,p->press,p->kind,&p->time,&p->price); if(head==NULL){ } else{ }

p1->next=p; p2=p1; p1=p; head=p; p1=p;

统计图书数目

1.函数原型,功能及形参说明

函数原型:void count(struct tushu *head) 函数功能:实现图书信息数目统计并输出

参数说明:struct tushu *head 链表头结点指针 n 计数 2.程序清单

void count(struct tushu *head) /*统计图书数目*/

{

int n=0;

struct tushu *p1;

head=create(head,&n); /*调用创建链表函数*/ for(p1=head;p1->next!=NULL;p1=p1->next) /*遍历*/

n++; /*计数*/

printf(\"\\n此系统统计在内的图书共有 %d 册。\\n\计算并输

出图书数目*/ }

按书名查询图书信息 1.函数原型,功能及形参说明

函数原型:void Findofname(struct tushu *head) 函数功能:实现图书信息按照书名查询并输出 参数说明:struct tushu *head 链表头结点指针 i 计数判定

char b[20]; 查找编号

2.函数流程图

Findofname head!=NULL遍历 i=0; strcmp(p->name,b) 输入目标图书名称10[b] =0 i!=0 p=p->next 未找到 输出图书信息 =0i++ !=0

3.程序清单

void Findofname(struct tushu *head) /*按书名查询图书*/

{

int i=0,n; /*i为计数判定*/ char b[20]; /*定义查找编号*/ struct tushu *p; head=create(head,&n); p=head; system(\"cls\"); menu();

printf(\"\\n请输入要查询的图书名称:\"); scanf(\"%s\while(p!=NULL){

if(strcmp(p->name,b)==0){ /*比较输入的字符串与原文件中书名*/

printf(\"\\n编号 书名 作者 出版社 类别 出版时间

价格\\n\"); }

按作者查询图书

1.函数原型,功能及形参说明

函数原型:void Findofwriter(struct tushu *head) 函数功能:实现图书信息按照图书作者查询并输出 参数说明:struct tushu *head 链表头结点指针 2.程序清单

} if(i==0)

printf(\"\\n对不起!没有找到名为《%s》的图书!\\n\

printf(\"%s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price); }

p=p->next;

i++;

void Findofwriter(struct tushu *head) {

int i=0,n; char b[20]; struct tushu *p; head=create(head,&n); p=head; system(\"cls\"); menu();

printf(\"\\n请输入要查询的图书作者姓名:\"); scanf(\"%s\while(p!=NULL){

if(strcmp(p->writer,b)==0){

printf(\"\\n编号 书名 作者 出版社 类别 出版时间

价格\\n\"); }

按类别查询图书

1.函数原型,功能及形参说明

函数原型:void Findofkind(struct tushu *head) 函数功能:实现图书信息按照图书类别查询并输出 参数说明:struct tushu *head 链表头结点指针

printf(\"%s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price); } if(i==0)

printf(\"\\n对不起!没有找到‘ %s ’所著的相关图书!\\n\ }

p=p->next;

i++;

2.程序清单

void Findofkind(struct tushu *head) {

int i=0,n; char b[20]; struct tushu *p; head=create(head,&n); p=head; system(\"cls\"); menu();

printf(\"\\n请输入您要查询的图书类别:\"); scanf(\"%s\while(p!=NULL){

if(strcmp(p->kind,b)==0){

printf(\"\\n编号 书名 作者 出版社 类别 出版时间

价格\\n\"); }

按出版时间排序

1.函数原型,功能及形参说明

函数原型:void Sort_time(struct tushu * head)

函数功能:实现图书信息按照出版时间并输出 ,但此过程并不被储存至文件

} if(i==0)

printf(\"\\n对不起!没有找到类别为‘ %s ’的图书!\\n\

printf(\"%s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price); }

p=p->next;

i++;

参数说明:struct tushu *head 链表头结点指针

struct tushu *p,*tail; 定义辅助变量用于选择排序 2.程序清单

void Sort_time(struct tushu * head) {

struct tushu *p,*tail; /*定义中间变量*/

double time;

int n;

p=(struct tushu *)malloc(sizeof(struct tushu));/*分配动态空间*/ system(\"cls\"); menu();

head=create(head,&n);

while(head->next!=NULL) /*利用选择法排序*/ {

tail=NULL;

p=head;

time=p->time; /*将链表中第一个时间赋给time*/ while(p!=NULL)

{

if((p->time)time=p->time; /*交换*/

tail=p;

p=p->next; }

tail=NULL; p=head;

while(p->next!=NULL) {

if(p->time==time){

printf(\" %s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price); }

if(p->time==time){ /*价格相同时无需比较*/

printf(\" %s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

} tail=p; p=p->next;

if(p==head)

head=head->next;

else

tail->next=p->next;

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price);

tail->next=NULL;

}

}

p=head; /*将链表赋给结构体指针*/ printf(\" %s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price);/*

浏览排序后的信息*/ }

按价格排序

1.函数原型,功能及形参说明

函数原型:void Sort_price(struct tushu * head)

函数功能:实现图书信息按价格排序并输出 ,但此过程并不被储存至文件 参数说明:struct tushu *head 链表头结点指针

struct tushu *p,*tail; 定义辅助变量用于选择排序

printf(\"按价格成功排序后输出如上(注:此过程不保存至文件):\\n\"); return;

2.程序清单

void Sort_price(struct tushu * head) {

struct tushu *p,*tail; /*定义中间变量*/

double price;

int n;

p=(struct tushu *)malloc(sizeof(struct tushu)); system(\"cls\"); menu();

head=create(head,&n);

while(head->next!=NULL) /*利用选择法排序*/ {

tail=NULL;

p=head;

price=p->price; /*将链表中第一个价格赋给price*/ while(p!=NULL)

{

if((p->price)price=p->price;

tail=p;

p=p->next; }

tail=NULL; p=head;

while(p->next!=NULL) {

if(p->price==price){

printf(\" %s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price);

}

if(p->price==price){

/*价格相同时无需比较*/

} tail=p; p=p->next;

if(p==head)

head=head->next;

else

tail->next=p->next;

printf(\" %s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price);

tail->next=NULL;

}

}

p=head; /*将链表赋给结构体指针*/ printf(\" %s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price);/*

浏览排序后的信息*/ }

按图书编号排序

1.函数原型,功能及形参说明

函数原型:void Sort_num(struct tushu * head)

函数功能:实现图书信息按图书编号排序并输出 ,但此过程并不被储存至文件 参数说明:struct tushu *head 链表头结点指针

struct tushu *p,*tail; 定义辅助变量用于选择排序 2.程序清单

printf(\"按价格成功排序后输出如上(注:此过程不保存至文件):\\n\"); return;

void Sort_num(struct tushu * head) {

struct tushu *p,*tail;

char num[20];

int n;

p=(struct tushu *)malloc(sizeof(struct tushu)); system(\"cls\"); menu();

head=create(head,&n); while(head->next!=NULL) {

tail=NULL;

p=head;

strcpy(num,p->num); while(p!=NULL)

{

if(strcmp(p->num,num)<0)

strcpy(num,p->num);

tail=p;

p=p->next; }

tail=NULL; p=head;

while(p->next!=NULL) {

if(strcmp(p->num,num)==0){

printf(\" %s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price);

}

}

}

if(p==head)

head=head->next;

else

tail->next=p->next;

tail=p; p=p->next;

fprint_(head);

按编号删除图书

1.函数原型,功能及形参说明

函数原型:struct tushu * Delete(struct tushu * head,char m[15]) 函数功能:实现图书信息按图书编号删除 ,并将删除后的信息储存至文件 参数说明:struct tushu *head 链表头结点指针 struct tushu *ptr1,*ptr2; 定义辅助变量

char m[15] 用于储存欲删除的图书编号

2.程序流程图

Delete(head,m); strcmp(head->num,m)!=0 输入要删除的图书编号 Head!=NULL ptr1=head; ptr2=head->next; P2!=NULL strcmp(ptr2->num,m) strcmp(head->num,m)==0 ptr2=head; head=head->next; free(ptr2); =0 !=0 ptr1->next=ptr2->next; free(ptr2); ptr1=ptr2; ptr2=ptr1->next; Head==NULL fprint_(head); 无图书 已删除并保存至文件

3.程序清单

struct tushu * Delete(struct tushu * head,char m[15]) {

struct tushu *ptr1,*ptr2; int n;

system(\"cls\"); menu();

printf(\"\\n请输入想要删除的图书编号:\"); scanf(\"%s\head=create(head,&n);

while((strcmp(head->num,m)==0)&&head!=NULL)

}

{ }

if(head==NULL){ }

ptr1=head; ptr2=head->next; while(ptr2!=NULL){ }

fprint_(head); system(\"cls\"); menu();

printf(\"\\n编号为‘ %s ’目标图书已被删除,并保存至文件!\\n\return head;

if(strcmp(ptr2->num,m)==0){ } else

ptr1=ptr2;

ptr1->next=ptr2->next; free(ptr2);

printf(\"无图书信息!\\n\"); return head; ptr2=head; head=head->next; free(ptr2);

ptr2=ptr1->next;

修改图书信息

1.函数原型,功能及形参说明

函数原型:struct tushu * Revise(struct tushu *head)

函数功能:以编号查找目标图书实现图书信息的各个成分的修改 ,并将修改后

的信息储存至文件

参数说明:struct tushu *head 链表头结点指针 struct tushu *ptr1,*ptr2; 定义辅助变量

char a[10] 用于储存欲修改的图书编号

2.程序清单

struct tushu * Revise(struct tushu *head) {

int n,k; char a[10];

char num[10]; /*图书编号*/

char name[20]; /*书名*/ char writer[20]; /*作者*/ char press[20]; /*出版社*/ char kind[20]; /*类别*/ double time; /*出版时间*/ double price; /*价格*/ struct tushu *p; system(\"cls\"); menu();

head=create(head,&n); p=head;

printf(\"\\n所有的图书信息如下:\\n\"); Browse(head);

printf(\"请选择您要修改的图书的编号:\"); scanf(\"%s\system(\"cls\"); while(p!=NULL){

if(strcmp(p->num,a)==0){

system(\"cls\");

printf(\"\\n*******************************************\\n\");

printf(\"1--修改图书编号 2--修改图书名称 \\n\"); printf(\"3--修改图书作 4--修改图书出版社 \\n\"); printf(\"5--修改图书类别 6--修改图书出版时间 \\n\"); printf(\"7--修改图书价格 0--停止修改 \\n\"); printf(\"********************************************\\n\");

printf(\"\\n您要修改的图书基本信息如下:\\n\");

printf(\"编号 书名 作者 出版社 类别 出版时间

价格\\n\");

printf(\"%s\%s\%s\%s\%s\%.0lf\%.2lf \\n\

p->num,p->name,p->writer,p->press,p->kind,p->time,p->price);

while(1){

printf(\"请按0-7选择需要修改的图书成分:\"); scanf(\"%d\switch(k){ case 1:

printf(\"请输入新的图书编号:\\n\"); scanf(\"%s\

strcpy(p->num,num);break;

case 2:

printf(\"请输入新的图书名称:\\n\"); scanf(\"%s\

strcpy(p->name,name);break;

case 3:

printf(\"请输入新的图书作者:\\n\"); scanf(\"%s\

strcpy(p->writer,name);break;

case 4:

}

}

}

}

printf(\"请输入新的图书出版社:\\n\"); scanf(\"%s\

strcpy(p->press,press);break;

case 5:

printf(\"请输入新的图书类别:\\n\"); scanf(\"%s\

strcpy(p->kind,kind);break;

case 6:

printf(\"请输入新的图书出版时间:\\n\"); scanf(\"%lf\p->time=time;break;

case 7:

printf(\"请输入新的图书价格:\\n\"); scanf(\"%lf\p->price=price;break;

case 0:

goto out;

default: }

printf(\"选择有误,请重新选择:\\n\");break;

p=p->next;

out:;

fprint_(head); return head;

4 调试分析

此次课程报告前后历时近一个月的时间,由最开始的感到无从下手,到今天的完品着实经历了不少曲折。中间错误自然是出了不少,但由于写作周期较长,又考略到介绍时的复杂程度,在这里仅选取个别在试验过程中印象深刻的几个问题作为调试分析案例,其他的问题在此就不一一赘诉了。 实型数据写入文件时的取地址符 原始代码(错误):

for(p1=head;p1->next!=NULL;p1=p1->next)

fprintf(fp,\"%s\%s\%s\%s\%s\%.0lf\%lf\\n\

p1->num,p1->name,p1->writer,p1->press,p1->kind,&p1->time,&p1->price); 由于错误的将“写入”理解为”写”多了一个取地址符号导致输入时是正确的数据,写入文件后则变为‘0.000000’; 正确代码(正确):

fprintf(fp,\"%s\%s\%s\%s\%s\%.0lf\%lf\\n\

p1->num,p1->name,p1->writer,p1->press,p1->kind,p1->time,p1->price); 提取文件后的链表构建

由链表构建的数据在写入文件后,原有的链表结构已被破坏,也就是说,已经不存在了链表结点。在第一次做时,在不知情的情况下无论如何也不能实现除浏览以外的任何功能。这个问题一直困扰了我近一个星期,知道后来在网上查阅相关资料后才意思到可能是链表结构已经被破坏,于是又调用了一个自定义函数create(head,&n)来实现链表的重新构建。结果很理想,接下来的统计,查询,排序等问题都迎刃而解。 函数代码如下

struct tushu * create(struct tushu * head,int *n) {

struct tushu *p,*p1,*p2;

if((fp=fopen(\"tushu_list.txt\先安全打开目录文件*/ {

printf(\"File open error!\\n\"); exit(0);

}

}

while(!feof(fp))/*读取并创建链表*/ { }

p2->next=NULL;

free(p);/*释放辅助结点所占用空间*/ (*n)--; fclose(fp); return head;

(*n)++;

p=(struct tushu *)malloc(sizeof(struct tushu)); fscanf(fp,\"%s%s%s%s%s%lf%lf\

p->num,p->name,p->writer,p->press,p->kind,&p->time,&p->price); if(head==NULL){ } else{ }

p1->next=p; p2=p1; p1=p; head=p; p1=p;

文件的属性

在输入一组数据并保存至文件后,一切功能都能正常实现,但当选择添加新图书时,问题来了。每一次添加都会把上一次添加的信息覆盖掉,为此也曾郁闷了一个钟头。左后还是在看课本时,才注意到打开文件时的属性或方式,“w”可写“r”可读“a”可写/读,后面带有“+”的则为可追加。在弄清关系后,果然很顺利 的解决了这一基本问题。

源代码:

if((fp=fopen(\"tushu_list.txt\先安全打开目录文件*/ { }

由此看来,我对课本的了解还是很服浅的,还有待于更深层次的复习一下课本基本知识。

删除文件过程中的逻辑错误

在写完删除代码时,源代码部分的任务基本上已达到90%,经历了前几个模块的写作与修改调试,自己对链表与文件的结合运用已经掌握个大概了。最基本的代码编写也已不在那么困难吗,可就在这时新的问题又出现了。在调试时每删除一本书时,列表中的最后一本书也无故失踪了。当然,在删除列表中左后一本书时不会有其他书籍信息莫名消失,

测试数据,每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?),算法的改进设想等。 printf(\"File open error!\\n\"); exit(0);

5测试结果

输入错误密码:00000

输入正确密码:0605

输入选项2浏览全部图书

输入选项1添加图书

输入选项3统计当前图书数目

输入选项4按书名查询图书

输入选项5按作者查询图书

输入选项6按类别查询图书

输入选项7按出版时间排序

输入选项8按价格排序

输入选项9按图书编号排序

输入选项10按编号删除图书

输入选项11修改图书信息

输入选项0退出系统

6 课程心得总结(小三黑体,另起一页)

×××××××××(小4号宋体,1.5倍行距)×××××××××××××××××××ׄ„„

整体要求:(打印时请删除本部分文字) 1、必须独立完成,不能互相抄袭。

2、添加页码,只使用“1”、“2”等阿拉伯数字,居中小五号字。 3、提交内容:

课程报告打印版一份(包含课程任务书,装订在封面后,也就是第二页)。 电子版:程序源代码,课程设计报告(含任务书)、课程设计报告电子版

要求由学习委员统一收齐,电子版本以学号+姓名为文件夹统一放好!于5月31日之前交任课教师

4、答辩时间:6月4日(第14周周六)

因篇幅问题不能全部显示,请点此查看更多更全内容