3067徐永贺课程设计报告.docx

上传人:b****2 文档编号:17182765 上传时间:2023-04-24 格式:DOCX 页数:16 大小:293.32KB
下载 相关 举报
3067徐永贺课程设计报告.docx_第1页
第1页 / 共16页
3067徐永贺课程设计报告.docx_第2页
第2页 / 共16页
3067徐永贺课程设计报告.docx_第3页
第3页 / 共16页
3067徐永贺课程设计报告.docx_第4页
第4页 / 共16页
3067徐永贺课程设计报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

3067徐永贺课程设计报告.docx

《3067徐永贺课程设计报告.docx》由会员分享,可在线阅读,更多相关《3067徐永贺课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。

3067徐永贺课程设计报告.docx

3067徐永贺课程设计报告

学生成绩管理系统

本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。

本程序中涉及结构体、单链表、文件等方面的知识。

通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握利用单链表存储结构实现对学生成绩管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。

一、问题定义

创建一个学生成绩管理系统。

假设系统中每个学生记录只包括班级、学号、姓名、性别、数学成绩、英语成绩、计算机成绩、总分、平均分、名次等信息。

程序的运行效果如下图所示,选择任意菜单后,实现相应功能。

图1.1学生成绩管理系统功能需求

二、系统设计

2.1总体设计

采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。

 

图2.1学生成绩管理系统功能模块图

本成绩管理系统要求采用单链表实现,如上图2.1所示,它由如下五大功能模块组成:

●输入记录模块。

完成将数据存入单链表的工作。

记录可以从以二进制形式存储的数据文件中读入,也可从键盘逐个输入学生记录。

学生记录由学生的基本信息和成绩信息字段构成。

当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中,将记录逐条复制到单链表中。

●查询记录模块。

完成在单链表中查找满足相关条件的学生记录。

在此成绩管理系统中,用户可以按照学生的班级、学号、名次或姓名在单链表中进行查找。

若找到该学生的记录,则返回指向该学生的记录的指针。

否则返回一个值为NULL的空指针,并打印出未找到该学生记录的提示信息。

●更新记录模块。

完成对学生记录的维护。

在此成绩管理系统中,它实现了对学生记录的删除和排序操作,并将修改后的数据存入源数据文件。

●统计记录模块。

完成对各门功课最高分和不及格人数的统计。

●输出记录模块。

一是实现对学生记录的存盘,即将记录写入数据文件中;二是实现将记录信息以表格的形式在屏幕上打印出来。

2.2详细设计

2.2.1数据结构设计

●学生成绩信息结构体

#ifndefH_STUDENT_HH/*如果H_STUDENT_HH没有定义*/

#defineH_STUDENT_HH/*那就定义H_STUDENT_HH*/

#include

#include

#include

#defineLENsizeof(structmessage_student)/*一个结构体数组元素的长度*/

#definenumsubs3/*学科数目*/

typedefstructmessage_student/*结构体定义*/

{

charnumber[6];/*学号*/

charnumber1[6];/*班级*/

charname[20];/*学生姓名*/

charsex[4];/*性别*/

floatsubject[numsubs];/*科目*/

floatscore;/*总分*/

floataverage;/*平均分*/

intindex;

}student;

externintnumstus;/*学生数目*/

externstudent*pointer;/*指向结构体数组*/

externintlens;

intmenu_select();/*声明函数*/

intdakaiwenjian(studentstu[]);/*打开文件*/

intchaxunjilu(studentstud[]);/*查询记录*/

intcunchujilu(studentstud[]);/*存储记录*/

voidhuanying();/*欢迎界面*/

voidxianshijilu1();/*显示记录*/

voidshowtable();/*显示桌面*/

voidpaixu(studentstu[]);/*排序*/

voidshanchujilu(studentstu[],inti);/*删除*/

voidtianjiajilu(studentstud[]);/*添加记录*/

voidxianshijilu(studentstud[],intn1,intn2);/*显示记录*/

voidxiugaijilu(studentstud[]);/*修改记录*/

voidjishu(studentstud[]);/*为记录计数*/

voidpaixunum(studentstud[]);/*为记录排序*/

voidpaixunum2(studentstud[]);/*为记录排序*/

voidpaixuname(studentstud[]);/*为记录排序*/

voidpaixuname2(studentstud[]);/*为记录排序*/

voidpaixujishu(studentstud[]);/*为记录排序*/

voidpaixujishu2(studentstud[]);/*为记录排序*/

voidtongjishuju(studentstud[]);/*统计记录*/

voidxianshijilu1();/*显示记录*/

2.2.2主控main()函数执行流程

 

本成绩管理系统根据按键判断。

在判断键值时,有效的输入为本0至8之间的任意数值,其他输入都被视为错误按键。

若输入为0(即变量select=0),它会继续判断,如果对记录进行过更新操作,那么是否已经保存过新的数据,若没有,则全局变量saveflage=1,系统会提示用户是否需要进行数据存盘操作,用户输入y或n,系统会自动进行存盘操作后再执行退出成绩管理系统的操作。

若选择1,则调用tianjiajilu函数,执行增加学生记录操作;

若选择2,则调用chaxunjilu函数,执行查询学生记录操作;

若选择3,则首先调用chaxunjilu函数,执行查询学生记录操作,查找出学生纪录后再调用shanchujilu函数,执行删除学生记录操作;

若选择4,则调用sort函数,执行按降序排序学生记录操作;

若选择5,则调用tongjishuju函数,执行统计学生记录操作;

若选择6,则调用dakaiwenjian函数,打开一个已储存的文件;

若选择8,则调用cunchujilu函数,执行将学生记录存入数据文件的操作;

若选择0,break,退出系统;

若输入为0~9之外的值,default,给出按键错误的提示"输入错误,请输入数字0~8:

"。

2.2.3函数功能描述

●函数名:

strcmp

功 能:

串比较

用 法:

intstrcmp(char*str1,char*str2);

程序例:

#include

#include

intmain(void)

 {

   char*buf1="aaa",*buf2="bbb",*buf3="ccc";

   intptr;

   ptr=strcmp(buf2,buf1);

   if(ptr>0)

      printf("buffer2isgreaterthanbuffer1\n");

   else

      printf("buffer2islessthanbuffer1\n");

   ptr=strcmp(buf2,buf3);

   if(ptr>0)

      printf("buffer2isgreaterthanbuffer3\n");

   else

      printf("buffer2islessthanbuffer3\n");

   return0;

 }

●函数名:

getchar

功 能:

从stdin流中读字符

用 法:

intgetchar(void);

程序例:

#include

intmain(void)

{

  intc;

  /*Notethatgetcharreadsfromstdinand

     islinebuffered;thismeansitwill

     notreturnuntilyoupressENTER.*/

  while((c=getchar())!

='\n')

     printf("%c",c);

  return0;

}

●函数名:

gets

功 能:

从流中取一字符串

用 法:

char*gets(char*string);

程序例:

#include

intmain(void)

{

  charstring[80];

  printf("Inputastring:

");

  gets(string);

  printf("Thestringinputwas:

%s\n",

  string);

  return0;

}

●函数名:

fopen

功 能:

打开一个流

用 法:

FILE*fopen(char*filename,char*type);

程序例:

#include

#include

#include

intmain(void)

{

   char*s;

   chardrive[MAXDRIVE];

   chardir[MAXDIR];

   charfile[MAXFILE];

   charext[MAXEXT];

   intflags;

   s=getenv("COMSPEC");/*getthecomspecenvironmentparameter*/

   flags=fnsplit(s,drive,dir,file,ext);

   printf("Commandprocessorinfo:

\n");

   if(flags&DRIVE)

      printf("\tdrive:

%s\n",drive);

   if(flags&DIRECTORY)

      printf("\tdirectory:

%s\n",dir);

   if(flags&FILENAME)

      printf("\tfile:

%s\n",file);

   if(flags&EXTENSION)

      printf("\textension:

%s\n",ext);

   return0;

}

●函数名:

fscanf

功 能:

从一个流中执行格式化输入

用 法:

intfscanf(FILE*stream,char*format[,argument...]);

程序例:

#include

#include

intmain(void)

{

  inti;

  printf("Inputaninteger:

");

  /*readanintegerfromthe

     standardinputstream*/

  if(fscanf(stdin,"%d",&i))

     printf("Theintegerreadwas:

%i\n",

            i);

  else

  {

     fprintf(stderr,"Errorreadingan\

             integerfromstdin.\n");

     exit

(1);

  }

  return0;

}

●函数名:

fgetc

功 能:

从流中读取字符

用 法:

intfgetc(FILE*stream);

程序例:

#include

#include

#include

intmain(void)

{

  FILE*stream;

  charstring[]="Thisisatest";

  charch;

  /*openafileforupdate*/

  stream=fopen("DUMMY.FIL","w+");

  /*writeastringintothefile*/

  fwrite(string,strlen(string),1,stream);

  /*seektothebeginningofthefile*/

  fseek(stream,0,SEEK_SET);

  do

  {

     /*readacharfromthefile*/

     ch=fgetc(stream);

     /*displaythecharacter*/

     putch(ch);

  }while(ch!

=EOF);

  fclose(stream);

  return0;

}

●函数名:

fprintf

功 能:

传送格式化输出到一个流中

用 法:

intfprintf(FILE*stream,char*format[,argument,...]);

程序例:

/*Programtocreatebackupofthe

  AUTOEXEC.BATfile*/

#include

intmain(void)

{

  FILE*in,*out;

  if((in=fopen("\\AUTOEXEC.BAT","rt"))

      ==NULL)

  {

     fprintf(stderr,"Cannotopeninput\

      file.\n");

     return1;

  }

  if((out=fopen("\\AUTOEXEC.BAK","wt"))

      ==NULL)

  {

     fprintf(stderr,"Cannotopenoutput\

      file.\n");

     return1;

  }

  while(!

feof(in))

     fputc(fgetc(in),out);

  fclose(in);

  fclose(out);

  return0;

}

●函数名:

strcpy

功 能:

串拷贝

用 法:

char*strcpy(char*str1,char*str2);

程序例:

#include

#include

intmain(void)

 {

   charstring[10];

   char*str1="abcdefghi";

strcpy(string,str1);

   printf("%s\n",string);

   return0;

 }

三、总结

为期三周的高级语言程序设计结束了。

这学期后期,我们被通知要进行三周的课程设计。

当时有点懵,感觉学的东西很少,很零散,不知该怎么联到一起,就要课程设计,是不是太难为我们了。

第一天基本上都是在看书,把基本知识再熟悉一边。

老师发过来20道设计题目题,但我们几乎不知道怎样完成这些任务,不过任务中还附带着一些设计样例,从这几道样例上我得到了不少启发,然后我们组把整个程序的思路理清了,开始着手写程序。

第一周结束的时候,我感觉自己收获挺大的,从一开始的迷茫,不知道从何下手到把程序中的几个模块编写出来,心里挺开心的。

但是,到了第二周,我们由不得不再次陷入困境。

在整个程序的编写过程中。

最难的就是修改和删除这两个模块,这也是我们第二周要解决的重点问题。

开始编写修改和删除时,很头疼,去向其他人寻求帮助,在别人的帮助和提示下,我编完了修改程序,但编译时老出错,修改后的内容将文本内的信息全部覆盖了。

困难之时,老师,帮助了我我们,完成了修改和删除。

这样的话,整个程序基本上全部完成了,就剩下完善工作了。

我们组写了两个程序,最后,两个程序相互组合,互补,大功告成

虽然设计时完成了,但是我觉得其中还是由一些不足之处:

1.字符。

程序中一些对长字符串的输入显示效果不好。

2.重名的情况。

由于考虑的不周全,没有设计遇到重名和学号重合的情况该怎么处理。

3.选择单一。

我们设计的程序中,只设计了按名字选择,进行操作,忽略了重名的情况。

整个程序完成了,还有很多不完善的地方,希望自己以后办事的时候要认真,仔细,考虑周全。

短短的三周课程设计结束了,但是这段时间里,我又学到了更多C知识,如:

对象数组,string类,文件流等,同时我也被提醒以后办事的时候要认真,仔细,考虑周全。

,也看到了团队精神和互帮互助的重要性。

这一点会让我终生受益。

通过三周的课程设计,我觉得自己肚子里的墨水多了,收获也挺大的,这三周过的挺充实!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1