《C语言程序设计》课程设计报告(小组)

时间:2024.4.13

东莞理工学院

《C语言程序设计》课程设计

题    目:图书信息管理系统

院    系:电子工程学院

专    业:电子信息工程

年    级:20##

班    别: 2班

指导教师:##

组    长:##

同组成员:##

目录

一、目的............................................................................................ 1

二、需求分析..................................................................................... 1

三、概要设计..................................................................................... 1

四、详细设计..................................................................................... 3

五、调试分析..................................................................................... 4

六、测试结果..................................................................................... 5

七、用户使用说明........................................................................... 12

八、课程设计总结..................................................................................12

附录:参考代码............................................................................... 13

图书信息管理系统...................................................................... 13

一  目的

本课程设计为学生提供了一个既动手又动脑,自学,查资料,独立实践的机会。将本学期课本上的理论知识和实际有机的结合起来,锻炼学生实际分析问题和解决问题的能力,提高学生适应实际、实践编程的能力,使对C语言系统编程有一个大致的了解。

二  需求分析

根据图书馆图书信息管理的需要,建立一个“图书信息管理系统”,以方便对图书的各项管理操作。开发目的如下:

1、图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。

2、图书信息管理系统,提供以下功能:

1)图书信息录入功能(图书信息用文件保存)--输入;

2)图书信息浏览功能--输出 ;

3)查询和排序功能:--算法 ;

4)按书名查询 ;

5)按作者名查询 ;

6)  按登录号从大到小排列;

7)图书信息的删除与修改

三  概要设计

  程序总体功能框架:

 

采用结构:

struct tsxx{                          //定义结构

       long dlnum;                  //定义登录号

       char bname[10];            //定义书名

       char aname[10];            //定义作者名

       char scnum[10];            //定义分类号

       char plname[10];           //定义出版社名

       char time[11];               //定义录入时间

       float price;                    //定义价格

       struct tsxx * next;          //定义指向下一个结构的首地址

};

链表结构:

《C语言程序设计》课程设计报告(小组)

各功能独立自定义的函数:

1、插入图书信息(按登录号从大到小排序):

struct tsxx * zengjia(struct tsxx * head)        //传递链表的首地址,并返回链表的首地址

2.、浏览全部的图书信息:

void Ptrint_Stu_Doc(struct tsxx *head)        //传递链表的首地址

3、查询图书信息(包括书名查询和作者名查询):

void Check(struct tsxx * head)      //传递链表的首地址

4、删除图书信息:

struct tsxx * Delete(struct tsxx * head)         //传递链表的首地址,并返回链表的首地址

5.、修改图书信息:

struct tsxx * revise(struct tsxx * head)         //传递链表的首地址,并返回链表的首地址

其他一些变量的定义:

long size;        //定义结构的大小

FILE * fp;      //定义文件指针,指向文件

struct tsxx * head;         //定义链表的首地址

struct tsxx * p;                     //定义结构指针

char choice;           //定义选择变量

四  详细设计

1、  设计思路:

首先,输入一些图书信息,申请一个结构类型的动态内存,把图书信息赋值到动态内存内,每一快动态内存存放一本图书的信息,并形成一条链表,比较登录号的大小,按登录号从大到小排列;

然后,建立并打开一个文件,把链表中的数据写入文件中,然后关闭文件;

最后,插入功能:先把所有的数据从文件中读出来,申请动态内存来存放,形成链表,输入你想要插入的图书信息,比较登录号的大小,然后把新的图书信息按照登录号的大小顺序插入链表里面,新建一个文间,把新的链表写入文件中;

浏览功能:先把所有的数据从文件中读出来,申请动态内存来存放,形成链表,然后链表头开始,把结构中的数据一个一个输出到界面上;

查询功能:先把所有的数据从文件中读出来,申请动态内存来存放,形成链表;选择你要查询的方式:1是按书名查询,2是按作者名查询。输入你的选择,判断你的查询方式。

书名查询:输入你要查询的书名,在链表中查找你这本书,然后把这本书的信息输出到界面上;

作者名查询:输入你要查询的作者名,在链表中查找对应作者名的图书的信息,并把信息输入到界面上;

修改功能:先把所有的数据从文件中读出来,申请动态内存来存放,形成链表,输入你要修改的图书的登录号,在链表中查找对应登录号的图书信息的结构,重新输入你要修改的图书的全部信息,并把这些新的图书信息赋值给找到的结构,覆盖旧的图书信息,新建一个文件,存放新的图书信息;

删除功能:先把所有的数据从文件中读出来,申请动态内存来存放,形成链表,输入你要删除的图书的登录号,在链表中查找对应登录号的图书信息的结构与前一个结构,让前一个结构的next指向对应登录号结构的下一个结构,释放动态内存,新建一个新的文件,存放新的图示信息;

2、数据结构的选择:

据图书信息表特点,决定选用链表这种数据结构(也可用其它的数据结构)来作为组成成绩数据库的基本框架。链表是最简单也是最常用的一种动态数据结构。它是对动态获得的内存进行组织的一种结构。选用链表有得好处:

1.即用即申请,不会造成内存空间的浪费;

2.是数据之间既有独立性,又便于数据的相互连系;

3.便于数据的添加及删除等优点。

3、设计思想的选择:

用模块化程序设计理念,对各个功能定义不同函数,分块处理,这样有利于后期调试及今后对功能的完善。

五  调试分析

1、把数据从文件中拿出来时,当文件是空的,它也会读数据,这时的数据时0;当文件不空时,最后的数据会被读两次。因此,这样读出来的文件就会出现一些小差错,必须做适当的调整。当文件为空,把链表的首地址head赋值为NULL,然后释放动态内存;当文件不为空时,把链表的最后第二个结构的next赋值为NULL,然后释放动态内存。

2、因为开始时定义choice为整型变量,所以只能输入整数,如果不小心输入字符数时,整个程序就出现错误,不能继续运行。因此,我们把choice重新定义成字符型,这样就可以输入字符数,所以后面用switch时,也要改成字符型。

3、一开始运行程序是,因为还没有创建文件,所以在读取文件中的数据时,就会出现“不能打开文件”的错误。因此,在一开始运行程序时必须要先创建一个文件,以后程序就会自动建立一个新的文件。

4、在作者名查询那里,一开始是当查找到一条对应的结构数据时,因为用了break,所以就直接退出了循环,因此如果一个作者有多本书是,以只能查询一本书的信息。调试后,我们把break删掉,这样它就会一直循环,直到链表的最后一条数据,它才会跳出循环。这样就能把一个作者全部的书都显示出来。

…………

六  测试结果

1、数据的输入:

新建一个文件,并把数据写入文件中:

增加功能:

查询功能:

浏览功能:

修改功能:

删除功能:

七  用户使用说明

一开始运行程序时,就会出现一个让你选择的界面,1.是增加数据,2是查询数据,3是浏览数据,4是修改数据,5是删除数据,6是输入数据,并新建一个文本存这些数据,0是退出程序。

当你输入1时,界面就会输出“Enter the static(lognum bookname authorname scorenum publishname time price):”,接着你就输入你要增加的图书的信息就可以了。

当你输入2时,就会在出现一个让你选择的界面,1是书名查询,2是作者名查询。

当你输入1时,如果文件时空的,界面就会输出“N0 Records”,如果文件不是空的,界面就会输出“Input bname:”,就着你就输入你要查询的图书的书名,如果文件中没有你要查询的这本书,界面就会输出“There isn't this static!”,当文件中有你要查询的这本书时,界面就会输出这本书的全部信息。

当你输入2时,如果文件时空的,界面就会输出“N0 Records”,如果文件不是空的,界面就会输出“Input aname:”,就着你就输入你要查询的图书的作者名,如果文件中没有你要查询的这本书,界面就会输出“There isn't this static!”,当文件中有你要查询的这本书时,界面就会输出这本书的全部信息。

当你输入3时,界面就会输出全部图书的全部信息;

当你输入4时,界面就会输出“Input the lognum:”,接着你要输入你要修改的图书的登录号,如果文件时空的,界面就会输出“Not records!”,如果文件不是空的,但没有你所输入的登录号的图书,界面就会输出“There isn't this static!”,如果文件不是空的,并且有你输入的登录号的图书,界面就会输出这本书的全部信息,很“Retype the static:”,接着你重新输入这本书的全部信息就可以了。

当你输入4时,界面就会输出“Input dlnum:”,接着你就输入你要删除的图书的登录号就可以了。

当你输入6时,界面就会输出“Enter the static(lognum bookname authorname scorenum publishname time price):”,接着你就输入你要增加的图书的信息就可以了。

当你输入0时,就退出程序

当你输入的是其他的数字或是字符时,界面就会输出“Enter error!”。

八  课程设计总结

做为这个小组的组长,我觉得我们所设计的程序今本上已经能够实现题目的要求,并且运用的链表,还用文件来存数据。但是,我觉得我们的程序还是存在着一些不足之处。首先建立一个文件是文件名和拓展名都已经被规定好的,其次是当文件为空时,程序运行时,当你输入得选择不是6是,会发生错误,所以一开始要先运行选择6,后才能运行其他选择,最后是运行查询、修改、删除功能,你输入的信息要跟文件中的一致,才能实现,如果稍有不同,就不够实现这些功能了。

另外,我想感谢我的组员,因为我们是分工合作的,他们有的负责一个功能,有的负责两个功能,而我主要是些主函数,在他们的积极配合下,我们很快就把总程序写好,并调试完毕。所以我想感谢他们的配合。因为集体的力量是强大的,只有我们的积极合作,才能够准时的完成这个课程设计。

最后,我觉得在这个课程设计的过程中,我学到了很多东西。第一是耐心,当你在调试程序中,看到了你设计的程序出现了那么多错误,或者当显示0错误0警告,却不能运行,或者是运行结果不是你所期望时,我觉得这时候最是考验耐心的时候,也只有耐心和永不言败的信念,才能支持你逆流而上,解决所有的困难。在这个过程中,我试过用了几个钟的时间找一个错误,而结果只是打错了一个定义。第二是沟通,因为我对C语言也比较熟了,有一些同学比较陌生,所以他们来问我,在我解答他们的问题是,我深刻的体会了沟通的重要性,因为只有你沟通的好,他们容易理解,你也不用浪费口舌去讲一些不必要的知识点……
程序参考代码:

/*...............................................主函数.................................................*/

#include

#include

#include

struct tsxx{                          //定义结构

       long dlnum;

       char bname[10];

       char aname[10];

       char scnum[10];

       char plname[10];

       char time[11];

       float price;

       struct tsxx * next;

};

long size;

FILE * fp;

struct tsxx * vitil(void)                //从文件中拿出数据

{

       struct tsxx * p1,* p2,* p3;

       long dlnum;

       char bname[10];

       char aname[10];

       char scnum[10];

       char plname[10];

       char time[11];

       float price;

       long i=0;

       if((fp=fopen("程序设计.txt","r"))==NULL)       //打开文件

       {

              printf("can not open file 程序设计.txt!\n");

              exit(0);

       }

       while(! feof(fp))

       {

              if(i>=1)

                     p3=p1;

              if((p1=(struct tsxx *)calloc(1,size))==NULL)

              {

                     printf("Not able to allocate memory.\n");

                     exit(1);

              }

              fscanf(fp,"%ld%s%s%s%s%s%f",&dlnum,bname,aname,scnum,plname,time,&price);

              p1->dlnum=dlnum;

              strcpy(p1->bname,bname);

              strcpy(p1->aname,aname);

              strcpy(p1->scnum,scnum);

              strcpy(p1->plname,plname);

              strcpy(p1->time,time);

              p1->price=price;

              if(i==0)

                     p2=p1;

              else

                     p3->next=p1;

              i++;

       }

       if(p2->next==p1)

              p2->next=NULL;

       else

              p3->next=NULL;

       free(p1);

       fclose(fp);      //关闭文件

       return p2;

}

void inputchoice(void)

{

       printf("\n Choice:\n");

       printf("1.Add\n");

       printf("2.Check\n");

       printf("3.Scan\n");

       printf("4.Revise\n");

       printf("5.Delect\n");

       printf("6.Enter the stactic\n");

       printf("0.Exit\n");

}

void write_to_txt(struct tsxx * head)           //写入文件

{

       struct tsxx * p;

       if((fp=fopen("程序设计.txt","w"))==NULL)

       {

              printf("can not open file 程序设计.txt!\n");

              exit(0);

       }

       for(p=head;p;p=p->next)

       {

              fprintf(fp,"%ld %s %s %s %s %s %f\n",p->dlnum,p->bname,p->aname,p->scnum,p->plname,p->time,p->price);

       }

       fclose(fp);

}

#include"check_and_delect.c"       //查询和删除

#include"zengjia.c" //增加

#include"xiugai.c"         //修改

main()

{

       struct tsxx * head=NULL,* p;

       char choice;

       size=sizeof(struct tsxx);

       inputchoice();

       scanf("%s",&choice);

       while(choice!='0')

       {

              switch(choice)

              {

                     case '1':

                            head=vitil();          //把数据从文件中取出来

                            head=zengjia(head);              //增加数据

                            write_to_txt(head);        //写入文件

                            break;

                     case '2':

                            head=vitil();          //把数据从文件中取出来

                             Check(head);        //查询

                             break;

                     case '3':

                            head=vitil();          //把数据从文件中取出来

                             Ptrint_Stu_Doc(head);        //浏览

                             break;

                     case '4':

                            head=vitil();          //把数据从文件中取出来

                            head=revise(head);        //修改

                            write_to_txt(head);

                            break;

                     case '5':

                            head=vitil();          //把数据从文件中取出来

                            head=Delete(head);        //删除

                            write_to_txt(head);

                            break;

                     case '6':

                            head=zengjia(head);

                             write_to_txt(head);

                             break;

                     default:

                            printf("Enter error!\n");

                            break;

              }

              inputchoice();

              scanf("%s",&choice);

       }

       while(head!=NULL)             //释放链表

       {

              p=head;

              head=head->next;

              free(p);

       }

}

/*......................................................增加功能...............................................*/

struct tsxx * zengjia(struct tsxx * head)        //增加数据

{

       struct tsxx * p1,* p2,*p3;

       long dlnum;

       char bname[10];

       char aname[10];

       char scnum[10];

       char plname[10];

       char time[11];

       float price;

      

       if((p1=(struct tsxx *)calloc(1,size))==NULL)

       {

              printf("Not able to allocate memory.\n");

              exit(1);

       }

       printf("Enter the static(lognum bookname authorname scorenum publishname time price):\n");

       scanf("%ld%s%s%s%s%s%f",&dlnum,bname,aname,scnum,plname,time,&price);

       p1->dlnum=dlnum;

       strcpy(p1->bname,bname);

       strcpy(p1->aname,aname);

       strcpy(p1->scnum,scnum);

       strcpy(p1->plname,plname);

       strcpy(p1->time,time);

       p1->price=price;

       p2=head;

       if(head==NULL)

       {

              head=p1;

              head->next=NULL;

       }

       else

       {

              while((p1->dlnum>p2->dlnum)&&(p2->next!=NULL))

              {

                     p3=p2;

                     p2=p2->next;

              }

              if(p1->dlnum<=p2->dlnum)

              {

                     if(head==p2)

                            head=p1;

                     else

                            p3->next=p1;

                     p1->next=p2;

              }

              else

              {

                     p2->next=p1;

                     p1->next=NULL;

              }

       }

       return head;

}

/*....................................................查询功能...................................................*/

void Check(struct tsxx * head)  //查询,书名,作者名

{

       struct tsxx * ptr;

       char a;

       char bname[10];

       char aname[10];

       printf("\n Choice:\n");

       printf("1:bname\n2:aname\n");

       scanf("%s",&a);

       if(head==NULL)                               

              printf("\nN0 Records\n");     

       else                                                   //链表非空   

       {

              switch(a)

              {

                     case '1':                                                     //按书名查询

                            printf("Input bname:");

                            scanf("%s",bname);

                    

                            for(ptr=head;ptr;ptr=ptr->next)

                            {

                                   if(strcmp(ptr->bname,bname)==0 )

                                   {

                                          printf("   dlnum   bname   aname   scnum   plname   time   price\n");

                                          printf("%5ld %10s %10s %10s %10s %10s %8f\n",ptr->dlnum,ptr->bname,ptr->aname,

                                          ptr->scnum,ptr->plname,ptr->time,ptr->price);

                                          if(ptr==NULL)

                                          printf("There isn't this static!\n");

                                   }

                            }

                    

                            break;

                     case '2':                                              //按作者名查询

                            printf("Input aname:");

                            scanf("%s",aname);

                           

                            for(ptr=head;ptr;ptr=ptr->next)

                            {

                                   if(strcmp(ptr->aname,aname)==0)

                                   {

                                          printf("   dlnum   bname   aname   scnum   plname   time   price\n");

                                          printf("%3ld %3s %3s %3s %3s %3s %3f\n",ptr->dlnum,ptr->bname,ptr->aname,

                                          ptr->scnum,ptr->plname,ptr->time,ptr->price);

                                          if(ptr==NULL)

                                                 printf("There isn't this static!\n");

                                   }

                            }

                           

                            break;

                     default:

                            printf("Enter error!\n");

                            break;

              }    

       }

}

/*..................................................浏览功能..............................................*/

void Ptrint_Stu_Doc(struct tsxx *head)//浏览

{

       struct tsxx * ptr;

       if(head==NULL)

              printf("\nNo Records\n");

       else

       {

               printf("\nThe Books Information Are: \n");

               printf(" dlnum bname aname scnum plname time price \n");

               ptr=head;

              while(ptr!=NULL)

              {

                     printf(" %ld %s %s %s %s %s %6.3f \n",ptr->dlnum,ptr->bname,ptr->aname,ptr->scnum,ptr->plname,ptr->time,ptr->price);

                     ptr=ptr->next;

              }

       }

}

/*.................................................修改功能.........................................................*/

struct tsxx * revise(struct tsxx * head)

{

       struct tsxx * p1;

       long dlnum;

       char bname[10];

       char aname[10];

       char scnum[10];

       char plname[10];

       char time[11];

       float price;

       printf("Input the lognum\n");

       scanf("%ld",&dlnum);

       if(head==NULL)

              printf("Not records!\n");

       else

       {

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

              {

                     if(p1->dlnum=dlnum)

                     {

                            printf("%ld %s %s %s %s %s %f\n",p1->dlnum,p1->bname,p1->aname,p1->scnum,p1->plname,p1->time,p1->price);

                            printf("Retype the static:\n");

                            scanf("%ld%s%s%s%s%s%f",&dlnum,bname,aname,scnum,plname,time,&price);

                            p1->dlnum=dlnum;

                            strcpy(p1->bname,bname);

                            strcpy(p1->aname,aname);

                            strcpy(p1->scnum,scnum);

                            strcpy(p1->plname,plname);

                            strcpy(p1->time,time);

                            p1->price=price;

                     }

                     break;

              }

              if(p1==NULL)

                     printf("There isn't this static!\n");

       }

       return head;

}

/*.............................................................删除功能...................................................*/

struct tsxx * Delete(struct tsxx * head)  //删除

{

       struct tsxx * ptr1,* ptr2;

       long dlnum;

       printf("Input dlnum:\n");

       scanf("%ld",&dlnum);

       if(head==NULL)           //链表空                           

              return NULL;

       else

       {

       while(head!=NULL && head->dlnum==dlnum)    //要被删除结点为表头结点   

       {

              ptr2=head;

              head=head->next;

              printf("   dlnum   bname   aname   scnum   plname   time   price\n");

              printf("%5ld %10s %10s %10s %10s %10s %8f\n",ptr2->dlnum,ptr2->bname,ptr2->aname,

                                          ptr2->scnum,ptr2->plname,ptr2->time,ptr2->price);

              free(ptr2);

       }

       //要被删除结点为非表头结点

       ptr1=head;

       ptr2=head->next;

       while(ptr2!=NULL)

       {

              if(ptr2->dlnum==dlnum)             //ptr2所指结点符合删除要求

              {

                     ptr1->next=ptr2->next;

                     printf("   dlnum   bname   aname   scnum   plname   time   price\n");

                     printf("%5ld %10s %10s %10s %10s %10s %8f\n",ptr2->dlnum,ptr2->bname,ptr2->aname,

                                          ptr2->scnum,ptr2->plname,ptr2->time,ptr2->price);

                     free(ptr2);

              }

              else

                     ptr1=ptr2;                     //ptr1后移一个节点

                     ptr2=ptr1->next;    //ptr2指向ptr1的后一个节点

       }

       }

       return head;

}

更多相关推荐:
c语言课程设计报告

C语言程序设计课程设计学生姓名学号系院专业设计论文题目学生选课系统管理完成日期20xx年6月指导教师目录一实验目的二实验内容三总体设计四详细设计五运行结果六课程设计体会一实验目的1通过课程设计加深对结构化程序设...

C语言课程设计报告

河南理工大学计算机科学与技术学院课程设计报告20XX20XX学年第一学期课程名称C语言课程设计设计题目《小学算术运算测试》学生姓名学号专业班级计算机07-2班指导教师20XX年9月12日目录1.设计任务书21.…

C语言课程设计报告范例

C语言课程设计报告设计题目专业班级学号姓名任课老师时间目录一课程设计题目及所涉及知识点二课程设计思路及设计流程图三课程设计中遇到的难点及解决办法四小结五附录原程序2一课程设计题目及所涉及知识点一课程设计题目1基...

厦门理工学院11级C语言C语言程序设计课程设计报告

C语言程序设计课程设计报告20xx20xx学年第1学期题目专业班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录一课程设计的目的与要求1二方案实现与调试221掷骰子游戏222射击游戏323汽车...

C语言程序设计课程设计报告

C语言程序设计课程设计报告20xx20xx学年第1学期专业计算机科学与技术班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录一课程设计的目的与要求3二方案实现与调试321掷骰子游戏322汽车加...

c语言程序贪吃蛇课程设计报告

山东工商学院信电学院自动111班第一组贪吃蛇课程设计报告高级语言程序设计课程设计报告ExperimentDesigningreporter课程名称高级语言程序设计英文名称CProgramExperimentDe...

C语言课程信息管理系统课程设计报告

《C语言程序设计》课程设计报告专业:班级:姓名:指导教师:二零##年十二月二十六日目录一、设计题目2二、设计目的2三、设计内容23.1需求分析23.2概要设计33.3详细设计63.5编写过程中遇到的问题及解决办…

C语言课程设计报告书样本

海南大学三亚学院C语言程序设计课程设计贪吃蛇算法专业计算机科学与技术班级计科1001姓名杨凯文题目学号指导老师李春林目录C语言程序设计课程设计11程序要求32程序分析与设计33流程图44源程序清单45调试过程1...

C语言课程设计报告—人事管理系统

人事管理系统前言:现代计算机技术的发展为人们的学习、生活、工作提供了很大的帮助,各行各业都需要特定计算系统的运用,我们需要了解这些系统是怎么样为我们服务以及他们是怎样编辑出来的。我们需要学习C语言编程,根据课堂…

C语言课程设计报告(通讯录)

设计说明书通讯录系统起止日期20xx年01月03日至20xx年01月08日学班学成生姓名级号绩XXX指导教师签字计算机与通信学院20xx年01月08日一课题任务设计一个通讯录管理系统课题的主要任务是1对通讯录信...

C语言课程设计报告 扫雷

程序课程设计基础课程设计扫雷游戏院系计算机科学技术学院计算机科学与技术师范班级师计091设计者徐群杨松徐春辉杨雷刘安然学号3224312504指导教师黄绍义20xx年12月25日1目录1概述311研究的背景及意...

简单计算器C语言课程设计报告书

C语言课程设计报告书题目:简单计算器院系:班级:学号:姓名:一、课程设计目的1.巩固和加深C语言课程的基本知识的理解和掌握2.掌握C语言编程和程序调试的基本技能3.利用C语言进行基本的软件设计4.掌握书写程序设…

c语言程序设计课程设计报告(34篇)