江西科技师范大学
课 程 报 告
课 程 名 称: 程序设计实践 专 业 班 级 :
学 生 姓 名 : 学 号 : 任 课 教 师 : 学 期 :
课程报告任务书
1
题 目 图书信息管理系统 开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。使之能提供以下基本功能: (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分 总分 成绩 评定 成绩评定教师:
2
1 需求分析
随着当今社会发展,信息化水平逐步提高,对图书管理有了新的要求,因此,编写一个信息管理系统是十分必要的。
为了满足图书管理的要求,通过计算机技术给图书管理人员和读者借、还书带来便利。使用C语言编写图书管理系统。本系统主要实现图书信息管理的功能,通过此系统可对图书馆库存图书信息进行管理和维护操作。实现了图书馆内管理的一般功能,包括查询、添加、删除、修改图书信息等。所设计的系统以菜单方式工作,为用户提供清晰的使用提示,依据用户的选择来进行各种处理,并且在此过程中能够尽可能的兼容用户使用过程中可能出现的异常情况。图书信息包括编号、书名、作者、出版社、出版日期、价格、库存数量等。图书信息的录入和显示要求有一定的规范格式,录入的图书信息用文件形式保存,并可以对其进行浏览、查询、修改、删除等基本操作。整个程序实现链表操作,对图书信息的操作逐个进行,一个图书信息的更改不应影响其他的图书记录。
2 概要设计
1,设计表示:
(1)、整个系统除了主函数外,另外还有各种功能子函数,利用无限次循环语句while()和选择语句swithch()实现各个子函数的调用,系统根据输入的数字选项来调用相应的函数,以实现相应的功能。主要实现了图书的密码设置、录入、存储、查询、添加、删除、修改、排序等功能。
(2) void Main_menu();这是一个指针函数,它主要实现了链表的创建,并且在创建过程中从文件读取信息到链表中,以用于后面其他函数的操作。
(3) void mainFind()、void Delete()、void change()、void write()、struct node * read()、void Sorting_order()、#define S 123、#define A 123456这六个函数时整个图书管理系统的全部菜单函数。void Delete()、void change()、void write()、struct node * read()、在此可以选择删除、修改、保存,读取图书,排序等操作。void mainFind();为查询系统的菜单,在此可以选择按书名、编号、作者等方式进行查询图书。#define S 123、#define A 123456分别是学生登陆和管理员登陆的密码。
(4) void Print();这个函数为图书的遍历,浏览所有的图书。
(5) void Find_booknumber()、void Find_bookname()、void Find_author()、void Find_press();这三个函数为查询图书信息函数,void Find_booknumber();按书号查询、; void Find_bookname()按书名查询、void Find_author() ;按作者查询、void Find_press();
3
按出版社查找。
(6)void Sorting_booknumber(),按书号排序。void Sorting_price(),按价格排序。 void Sorting_publication_date(),按出版日期排序。void Sorting_number(),按馆藏数量排序。 3.实现注释:
这个实用的小型图书管理程序程序以链表操作完成,并实现文件信息的录入和保存等功能。实现了图书管理的基本功能,包括了图书的录入、存储、查询、添加、删除、修改、排序等功能。查询时可按书名、编号、作者等方式查询,找到后输出这本书的所有信息。在添加图书信息后,还增加了链表排序操作,并输出整个链表,方便用户检查信息。系统中主要的数据结构就是图书的信息,包含编号、书名、作者、出版社、出版时间、价格、馆藏数量等,在处理过程中各项可以作为一本图书的不同属性来进行处理。
3 详细设计
1-1 定义变量 struct node{ };
struct node * head = NULL;//在此定义一个全局变量head,其它函数就不需要再返回head;但这样做,程序中的函数的可用性就不是太高 int Total = 0; //记录图书总数 1-2函数的定义
void Creat();//录入图书信息
struct node* Insert(struct node* p,struct node* head0);//插入图书信息 void Delete();//删除图书信息
4
int book_number;//书号 char book_name[25];//书名 char press[50];//出版社 char author[20];//作者 int price;//价格
char publication_date[20];//出版日期 int number;//馆藏数量 struct node * next;
void change();//修改图书信息 void write();//保存图书信息 struct node * read();//读取图书信息 void amend(struct node * p);//辅助修改选项 void Print();//遍历图书信息
void Print_by_one(struct node * p);//单项遍历 void Main_menu();//登陆界面
void Administrator_menu0();//第一次进入系统的管理员菜单 void Administrator_menu1();//第n次进入系统的管理员菜单 void Student_menu();//学生菜单 void mainFind();//查找菜单 void Find();//精确查找图书 void Find0();//模糊查找图书
int str(char a[],char b[]);//模糊查找函数 void Find_booknumber();//按书号查找 void Find_booknumber0();//按书号模糊查找 void Find_bookname();//按书名查找 void Find_bookname0();//按书名模糊查找 void Find_author(); //按作者查找 void Find_author0(); //按作者模糊查找 void Find_press(); //按出版社查找 void Find_press0(); //按出版社模糊查找
char *transform(char str[] ,int n);//将整数转化为字符存入字符数组返回 void Sorting_order();//排序
void Sorting_help(struct node* p1,struct node* p2);//辅助排序 void Sorting_booknumber();//按书号排序 void Sorting_price();//按价格排序
void Sorting_publication_date();//按出版日期排序 void Sorting_number();//按馆藏数量排序 #define S 123 //学生密码 #define A 123456//管理员密码
5
int T = 0;//选择菜单 1-3信息的录入
void Creat()//录入图书信息 {
struct node *tail,*p;
int book_number;//书号 char choice;
printf(\"该操作将清除书库中所有书目的信息!\\n\"); printf(\"\\n\\\你想继续操作吗?(Y/N)\\n\"); while(1) {
printf(\"请选择:\"); if(scanf(\"%c\{ } else {
6
getchar();
if(choice == 'Y'||choice == 'y'){ }
else if(choice == 'N'||choice == 'n') { } else{ }
printf(\"请按要求输入!\\n\"); continue; system(\"cls\"); return; system(\"cls\"); break;
}
}
printf(\"输入的不是字母,请按照要求重新输入!\\n\"); continue;
printf(\"\\\提示:请输入你要输入的数据,当书号为数字'0'时结束!\\n\\n\"); printf(\"请输入书号:\"); scanf(\"%d\
getchar();//吸收回车符,清空缓冲区,这样才能正常执行清屏操作 while(book_number != 0) {
p = (struct node *)malloc(sizeof(struct node)); printf(\"请输入书名:\");
scanf(\"%s\printf(\"请输入作者:\");
scanf(\"%s\printf(\"请输入出版社:\"); scanf(\"%s\printf(\"请输入价格:\");
scanf(\"%d\printf(\"请输入出版时间:\");
scanf(\"%s\printf(\"请输入馆藏数量:\"); scanf(\"%d\putchar('\\n');
p->book_number = book_number; p->next = NULL; if(head == NULL) {
head = tail = p;
} else
7
{ }
tail->next = p; tail = p;
Total++;
printf(\"请输入书号:\");
}
scanf(\"%d\}
printf(\"\\\\图书信息录入成功!\\n\\n\");
1-4按编号查询
void Find_booknumber()//按书号查找 {
int book_number; struct node *p1,*p2;
printf(\"请输入你要查找的图书书号:\");
scanf(\"%d\
printf(\"\\\\n你要找的书为:\\n\");
printf(\"\\---------------------------------------------------------------\\n\"); printf(\"\\| 书号| 书名| 作者| 出版社| 价格| 出版时间| 馆藏数量|\\n\");
printf(\"\\---------------------------------------------------------------\\n\");
if(head->book_number == book_number) { }
p1 = head;
p2 = head->next; while(p2 != NULL) {
if(p2->book_number == book_number)
Print_by_one(head);
{
8
}
}
}
Print_by_one(p2); p1 = p2; p2 = p2->next;
else { }
p1 = p2; p2 = p2->next;
1-5按出版时间排序
void Sorting_publication_date()//按出版日期排序 {
struct node *p1,*p2,*p3,*p4,*p5,*p6,*p7; int x=1;
for(p1=head;p1->next!=NULL;p4=p1,p1=p1->next) {
p3=p1;
for(p2=p1->next,p5=p7=p2;p2!=NULL;p7=p2,p2=p2->next) { }
if(p3!=p1) {
if(strcmp(p3->publication_date , p2->publication_date) > 0) { }
p3=p2; p5=p7;
if(x&&p1==head) {
9
}
}
p6=p1->next; p1->next=p3->next; p3->next=p6; p5->next=p1; head=p3; p1=p3; x=0;
else { }
p6=p1->next; p1->next=p3->next; p3->next=p6; p4->next=p3; p5->next=p1; p1=p3;
}
}
4 调试分析
问题1:对于函数是否返回函数值,并怎样返回指针?
解答:对于void开头的函数,没有返回值,在程序中可以直接调用。有指针返回值的函
数,直接返回指针名。
问题2:在使用变量前,指针变量和一般变量如何初始化?
解答:在使用一般变量前,忘记初始化,例如:定义n,在下面程序循环中,没有替n附初值,结果导致乱码。指针变量*p,在不同情况下,p值要赋予NULL或head。 问题3:指针之间的传递赋值如何辨别顺序?最终返回值又是哪一个?
解答:指针的传递赋值是从赋值号的右端赋值于赋值号的左端。例如:p=head,表示指针p指向head的位置。最终的返回值应该是赋值号左端的指针。
10
5 测试结果
登录系统
图书的查找
11
图书信息的录入
12
按价格排序
13
浏览图书信息
14
6 课程心得总结
在这一个学期的实践中,通过编写这个图书管理系统,我体会到了c语言学习的实用性。将理论和实践结合在一起,用先进的计算机工具方便人们的生活。
C语言程序的编写首先要从大局考虑,把自己编写整个程序的思想都写在草稿上,这样有助于自己编写程序,在编写时要完善注释,方便其他人理解程序。编写的程序从理论上来说并没有错,但以上机就问题不断。甚至有些课本上的知识照搬不变,也不能得到正确的结果。有时一个程序改了一遍又一遍,但就是不能成功,编程显得枯燥乏味,看似简单的程序题,在调试时却屡屡出错。经反复的修改后,结果正确了,这时所有的乏味都显得那么无力,一切都是值得的。
开发一套系统,最重要的是细心,并且思考要全面,结合实际,充分考虑到客户的需求和现实意义。不管什么系统,只用运用到实际应用中,才具有先现实意义。 所以c语言程序的实用性很强,我们以后还要更加努力认真地学习编程语言。
15
因篇幅问题不能全部显示,请点此查看更多更全内容