小说管理系统
发布时间:2020-04-14 01:49:49
发布时间:2020-04-14 01:49:49
课 程 设 计
报 告
题目:小说管理系统
题目:小说管理系统
一、 课程设计目的
掌握C语言的课程设计结构,语法规则,编程方法,达到独立编程能力,为以后的学习,设计大型应用系统打下坚实的基础。
二、课程设计内容
通过结构体、数组、文件等的应用,设计了一个小型的小说管理系统。
三、需求分析
该小说管理系统,具有最基本的功能:
1:通过输入和存储小说编号、小说名称、小说种类、小说总评、完结日期;
2:将输入信息输出;
3:通过输入小说名称或小说编号查询出所要的信息;
4:添加小说信息;
5;输入想要修改的小说的名称、种类、总评,可以将任一小说信息修改;
6:通过输入要删除小说的编号或名称,可删除此小说的全部信息;
7:可按照小说编号或完结日期对小说信息进行排序;
四、概要设计
1)、系统结构图
对系统进行分析,给出结构图
word/media/image1.gif
word/media/image2.gifword/media/image3.gifword/media/image4.gifword/media/image5.gifword/media/image6.gif
word/media/image7.gifword/media/image8.gifword/media/image9.gifword/media/image10.gif
2)模块功能简介:
1、 输入模块:输入要存储的信息,最多只能存入15个信息。
2、 输出模块:输出已经输入的信息。
3、 添加模块:添加一些信息到存储系统。
4、 修改模块:将已存储的名称、种类、总评这些信息进行修改。
5、查询模块:
(1)按名称查询函数:通过输入小说名称,若该名称在存储信息中,则将输出关于该小说的所有信息,若不存在,则输出没有关于此小说的信息;
(2)按编号查询函数:输入编号在存储信息中,则输出关于该编号小说的所有信息,若无,则输出没有关于此编号的信息;
(3)返回主菜单:返回系统主菜单。
6、删除模块:
(1)按编号删除:通过输入编号将该小说信息全部删除,若无该小说信息,则告知无关于此编号的小说信息;
(2)按名称删除:通过输入名称将小说信息全部删除,若无该小说信息,则告知无关于此名称的小说信息;
(3)返回主菜单:返回系统主菜单。
五.详细设计及运行结果
主函数:
word/media/image11.gif
word/media/image12.gif
1 2 3 0
word/media/image13.gif
word/media/image12.gifword/media/image14.gifword/media/image15.gifword/media/image12.gif
word/media/image16.gif
六.调试情况,设计技巧及体会
这次C语言的实习,自己最大的感受是无知.知识总是在用的时候才知道匮乏,以前觉得自己C语言考试过了,就是合格了,对自己要求太低,以至于这次实习遇到很大的麻烦.
这个程序是我按照书上例题程序模仿编写的,当程序写完后,运行时发现有许多错误,我请教老师和同学,对程序进行了耐心细致的修改,经过一番努力,程序里的错误终于被全部纠正了。但程序没有错误不代表它能正常运行,
基础知识不够扎实是我最大的问题,对很多知识点是只知其一,不知其二,或是只知其然而不知其所以然,C语言程序的编写和运行是非常具有科学性的,没有正确掌握C语言编写的风格和规则,要编译成功较为复杂的程序真的是困难重重.正所谓”无以规矩,不成方圆”,对待科学文化知识没有一个严谨求实的态度,只能让自己在在成功路上举步为艰.
但一份耕耘一份收获,两个星期的C语言实习,我又重新拾起了渐以模糊的C语言知识和概念,通过上机调试程序,不但熟悉了C语言的一些基本知识,而且熟练了上机实践,通过实践,又掌握了一些在书本上学不到的解决实际问题的方法,此外,也将学过的计算机基础知识做了一次复习,这次实习确实是一次非常珍贵的实习.我明确了以后的方向和目标,再也不会荒废时间了.
七.参考文献
C语言程序设计(第二版) 王曙燕/主编
八.附录
源代码
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "conio.h"
#define MAX 15
int sum; /*记录小说个数*/
/*日期结构体类型*/
struct date
{
int year;
int month;
int day;
};
/*小说信息结构体类型*/
struct novel_type
{
int num;
char name[20];
char kind[20];
float score;
struct date time;
}novel[MAX];/*存放MAX部小说信息记录的结构体数组*/
/*函数声明*/
int input_message();
void output_message();
int add_message();
int delet_by_name();
int delet_by_num();
int renew_message();
int inquire_name();
int inquire_num();
int inquire_message();
int sort_num();
int sort_time();
int sort_message();
int read_message();
/*保存信息*/
save_message(int sum)
{
FILE *fp;/*定义文件指针*/
int i;
if((fp=fopen("book.txt","wb"))==NULL)
{
printf("读文件错误!\n");
return 0;
}
for(i=0;i
if(fwrite(&novel[i],sizeof(struct novel_type),1,fp)!=1)
printf("写文件错误!\n");
fclose(fp);
return 0;
}
/*主函数*/
main()
{
int choice;
sum=read_message();
do
{
printf("\n\n\n ***********小说信息管理系统***********\n\n");
printf(" 1.录入小说信息\n\n");
printf(" 2.浏览小说信息\n\n");
printf(" 3.更新小说信息\n\n");
printf(" 4.小说信息排序\n\n");
printf(" 5.查询小说信息\n\n");
printf(" 0.退出系统\n\n");
printf(" 请选择(0--5): \n\n\n");
printf(" ---------------------");
scanf("%d",&choice);
switch(choice)
{
case 1: input_message();break;
case 2: output_message();break;
case 3: renew_message();break;
case 4: sort_message();break;
case 5: inquire_message();break;
case 0: break;
}
}while(choice!=0);
save_message(sum);
printf("\n --以上小说信息已保存!-- (文件名:book.txt) \n");
return 0;
}
/*输入模块*/
input_message()
{
int i=0,s=MAX;
printf("\n\n 录入小说信息 (最多%d部)\n",s);
printf("\n");
do
{
printf("\n 第%d部小说",i+1);
printf("\n\n 编号:");
scanf("%d",&novel[i].num);
if(novel[i].num==0) break;
printf("\n 名称:");
scanf("%s",novel[i].name);
printf("\n 种类:");
scanf("%s",novel[i].kind);
printf("\n 总评:");
scanf("%f",&novel[i].score);
printf("\n 完结日期(yyyy-mm-dd):");
scanf("%d-%d-%d",&novel[i].time.year,&novel[i].time.month,&novel[i].time.day);
i++;
}while(i
printf("\n --%d部小说信息输入完毕!--\n",i);
sum=i;
printf("\n 按任意键返回主菜单!");
return 0;
}
/*读取信息*/
int read_message()
{
FILE *fp;
int i=0;
if((fp=fopen("book.txt","rb"))==NULL)/*打开文件*/
{
printf("\n\n*****暂时还没有任何库存信息,按任意键进入主菜单选择基本信息的录入!****\n");
return 0;
}
while(!feof(fp))
{
fread(&novel[i],sizeof(struct novel_type),1,fp);
if(novel[i].num==0) break;
else i++;
}
fclose(fp);/*关闭文件*/
return(i);
}
/*小说信息浏览*/
void output_message()
{
int i;
printf("\n\n ****小说信息表**** \n\n");
printf("\n");
printf(" 编号-------名称-------种类-------总评-------完结日期 \n\n");
for(i=0;i
printf(" %5d %12s %8s %10f %7d-%2d-%2d\n",novel[i].num,novel[i].name,novel[i].kind,novel[i].score,novel[i].time.year,novel[i].time.month,novel[i].time.day);
}
/*添加小说信息*/
add_message()
{
int i=sum,flag=0;
char choice,ch;
printf("\n\n 添加一本小说的信息\n");
printf("\n");
do
{
novel[i].num=++sum;
printf("\n 编号:");
scanf("%d",&novel[i].num);
printf("\n 名称:");
scanf("%s",novel[i].name);
printf("\n 种类:");
scanf("%s",novel[i].kind);
printf("\n 总评:");
scanf("%f",&novel[i].score);
printf("\n 完结日期(yyyy-mm-dd):");
scanf("%d-%d-%d",&novel[i].time.year,&novel[i].time.month,&novel[i].time.day);
printf("\n\n\n 要继续吗? (Y/N) ");
ch=getchar();
choice=getchar();
i++;
if(choice=='y'||choice=='Y')
{
printf("\n 继续! \n");
flag=1;
}
else flag=0;
}while(flag==1);
printf("\n 按任意键返回主菜单!");
return 0;
}
/*按小说名称删除*/
int delet_by_name()
{
int i=0,k,flag;char ch,delet_name[20];
char choice;
do
{
printf("\n 输入要删除的小说名称:");
scanf("%s",delet_name);
for(i=0;i
{
if(strcmp(novel[i].name,delet_name)==0)
{
k=i;
for(k=i;k
novel[k]=novel[k+1];
sum=MAX-1;
}
if(i==MAX)
{
printf("\n 无该小说信息!");
return 0;
}
}
printf("\n\n 要继续删除吗?(Y/N)");
ch=getchar();
choice=getchar();
if(choice=='Y'||choice=='y')
{
flag=1;
printf("\n 继续!\n");
}
else flag=0;
}while(flag==1);
printf("\n 删除完毕!");
return 0;
}
/*按小说编号删除*/
int delet_by_num()
{
int i,j,delet_num,flag,b=0;
char ch;
char choice;
do
{
printf(" 输出要删除的小说编号:");
scanf("%d",&delet_num);
for(i=0;i
{
if(novel[i].num==delet_num&&novel[i].num!=0)
{
for(j=i;j
{novel[j]=novel[j+1];}
sum--;
break;
}
else b++;
}
printf("\n");
printf(" 编号-------名称-------种类-------总评-------完结日期 \n\n");
for(i=0;i
{
printf(" %5d %12s %8s %10f %7d-%2d-%2d\n",novel[i].num,novel[i].name,novel[i].kind,novel[i].score,novel[i].time.year,novel[i].time.month,novel[i].time.day);
printf("\n");
}
if(sum==b)
{
printf("\n 无该小说信息!");
return 0;
}
printf("\n\n 要继续删除吗?(Y/N)");
ch=getchar();
choice=getchar();
if(choice=='Y'||choice=='y')
{
flag=1;
printf("\n 继续! \n");
}
else flag=0;
}while(flag==1);
printf("\n 删除完毕! ");
return 0;
}
/*删除模块*/
int delet_message()
{ int choice;
do
{ printf("\n\n --------- 删除小说信息 ---------\n\n\n");
printf(" 1.按小说名称删除\n\n");
printf(" 2.按小说编号删除\n\n");
printf(" 0.返回主菜单\n\n");
printf(" 请选择(0-2)\n\n;");
scanf("%d",&choice);
switch(choice)
{ case 1: delet_by_name();break;
case 2: delet_by_num();break;
case 0: break;
}
}while(choice!=0);
save_message(sum);
return 0;
}
/*修改模块*/
revise_message()
{ int i=0,choice,revise_num,flag;
do
{ printf("\n 请输入要修改的小说编号:");
scanf("%d",&revise_num);
for(i=0;i
if(novel[i].num==revise_num)
{ printf("\n ---小说信息---\n");
printf("\n");
printf(" 编号-------名称-------种类-------总评-------完结日期 \n\n");
printf(" %5d %12s %8s %10f %7d-%2d-%2d\n",novel[i].num,novel[i].name,novel[i].kind,novel[i].score,novel[i].time.year,novel[i].time.month,novel[i].time.day);
printf("\n 您要修改哪一项?\n");
printf("\n 1.名称\n");
printf("\n 2.种类\n");
printf("\n 3.总评\n");
printf("\n 请选择(1-3):");
scanf("%d",&choice);
switch(choice)
{case 1:printf("\n 输入修改后的名称:");
scanf("%s",novel[i].name); break;
case 2:printf("\n 输入修改后的种类:");
scanf("%s",novel[i].kind); break;
case 3:printf("\n 输入修改后的总评:");
scanf("%f",&novel[i].score); break;
}
printf("\n");
printf(" 编号-------名称-------种类-------总评-------完结日期 \n\n");
printf(" %5d %12s %8s %10f %7d-%2d-%2d\n",novel[i].num,novel[i].name,novel[i].kind,novel[i].score,novel[i].time.year,novel[i].time.month,novel[i].time.day);
break;
}
if(i==sum)
{ printf("\n 该小说不存在!");
return 0;
}
printf("\n\n 继续修改吗? (Y/N) ");
choice=getchar();
if(choice=='Y'||choice=='y')
{flag=1;
printf("\n 继续!\n");
}
else flag=0;
}while(flag==1);
printf("\n 按任意键返回主菜单!");
return 0;
}
/*更新模块*/
renew_message()
{ int choice;
do
{ printf("\n\n\n **********更新小说信息**********\n\n");
printf(" 1.添加小说信息\n\n");
printf(" 2.删除小说信息\n\n");
printf(" 3.修改小说信息\n\n");
printf(" 0.返回主菜单\n\n");
printf(" 请选择(0-3):");
scanf("%d",&choice);
switch(choice)
{case 1:add_message();break;
case 2:delet_message();break;
case 3:revise_message();break;
case 0:break;
}
}while(choice!=0);
return 0;
}
/*按名称查询*/
inquire_name()
{
int i;
char inquire_name[10];
printf("\n 输入要查询的小说名称:");
scanf("%s",inquire_name);
for(i=0;i
if(strcmp(novel[i].name,inquire_name)==0&&novel[i].num!=0)
{ printf("\n ---%s小说信息--- \n",novel[i].name);
printf("\n");
printf(" 编号-------名称-------种类-------总评-------完结日期 \n\n");
printf(" %5d %12s %8s %10f %7d-%2d-%2d\n",novel[i].num,novel[i].name,novel[i].kind,novel[i].score,novel[i].time.year,novel[i].time.month,novel[i].time.day);
}
if(i==sum)
printf("\n 该小说信息不存在!");
return 0;
}
inquire_num() /*按编号查询*/
{
int i,j=0;
int inquire_num;
printf("\n 请输入要查询的小说编号:");
scanf("%d",&inquire_num);
for(i=0;i
if(novel[i].num==inquire_num&&novel[i].num!=0)
{
printf("\n ---%d号小说信息--- \n",novel[i].num);
printf("\n");
printf(" 编号-------名称-------种类-------总评-------完结日期 \n\n");
printf(" %5d %12s %8s %10f %7d-%2d-%2d\n",novel[i].num,novel[i].name,novel[i].kind,novel[i].score,novel[i].time.year,novel[i].time.month,novel[i].time.day);
}
else j++;
if(j==sum)
printf("\n\n 该小说信息不存在!");
return 0;
}
/*查询模块*/
inquire_message()
{ int choice;
do
{ printf("\n\n\n **********查询小说信息**********\n\n");
printf(" 1.按小说名称查询\n\n");
printf(" 2.按小说编号查询\n\n");
printf(" 0.返回主菜单\n\n");
printf(" 请选择(0-2):");
scanf("%d",&choice);
switch(choice)
{case 1:inquire_name();break;
case 2:inquire_num();break;
case 0:break;
}
}while(choice!=0);
return 0;
}
/*按编号排序*/
sort_num()
{ int i,j;
struct novel_type t;
for(i=0;i
for(j=i+1;j
if(novel[i].num>novel[j].num)
{t=novel[i];
novel[i]=novel[j];
novel[j]=t;
}
printf("\n\n\n按编号排序后的的顺序:\n\n");
printf("\n");
printf(" 编号-------名称-------种类-------总评-------完结日期 \n\n");
for(i=0;i
printf(" %5d %12s %8s %10f %7d-%2d-%2d\n",novel[i].num,novel[i].name,novel[i].kind,novel[i].score,novel[i].time.year,novel[i].time.month,novel[i].time.day);
return 0;
}
/*按完结日期排序*/
sort_time()
{ int i,j;
struct novel_type t;
for(i=0;i
for(j=i+1;j
if(novel[i].time.year>novel[j].time.year)
{ t=novel[i];
novel[i]=novel[j];
novel[j]=t;
}
else if(novel[i].time.year==novel[j].time.year)
if(novel[i].time.month>novel[j].time.month)
{ t=novel[i];
novel[i]=novel[j];
novel[j]=t;
}
else if(novel[i].time.month==novel[j].time.month)
if(novel[i].time.day>novel[j].
time.day)
{ t=novel[i];
novel[i]=novel[j];
novel[j]=t;
}
printf("\n\n\n按完结日期排序后的顺序:\n\n");
printf("\n");
printf(" 编号-------名称-------种类-------总评-------完结日期 \n\n");
for(i=0;i
printf(" %5d %12s %8s %10f %7d-%2d-%2d\n",novel[i].num,novel[i].name,novel[i].kind,novel[i].score,novel[i].time.year,novel[i].time.month,novel[i].time.day);
return 0;
}
/*排序模块*/
sort_message()
{ int choice;
do
{ printf("\n\n\n **********小说排行信息**********\n\n");
printf(" 1.按编号排序\n\n");
printf(" 2.按完结日期排序\n\n");
printf(" 0.返回主菜单\n\n");
printf(" 请选择(0-2):");
scanf("%d",&choice);
switch(choice)
{case 1: sort_num(); break;
case 2: sort_time(); break;
case 0: break;
}
}while(choice!=0);
return 0;
}