目 录
一、问题描述..........................................2
二、基本要求..........................................3
三、数据结构设计......................................4
四、软件模块结构图....................................5
五、程序设计思想......................................7
六、程序流程图.......................................11
七、源程序...........................................16
八、调试分析.........................................30
九、测试数据.........................................31
十、用户使用手册.....................................34
十一、心得体会.......................................35
一、问题描述
在学生成绩管理中,经常会遇到求平均成绩,统计不及格学生成绩,统计优秀学生人数,以及按成绩对学生进行排名等。现假设有某个班级的若干名学生,每个学生都考试完成了4门课程,试对所有学生的成绩完成以下工作:
(1)求每门课程的平均成绩。
(2)输出所有有不及格课程的学生的学号、姓名、全部课程的成绩、平均成绩。
(3)输出所有平均分在90分以上(含90分)的学生学号、姓名。
(4)对4门课程中的任何一门,可随意抽取1门按学生成绩进行排序。
二、基本要求
对学生信息的输入完成后,实现如下功能:1、对学生信息的查找、插入、删除、修改。2、分别输出优秀学生和不及格学生的信息。3、显示每们课程的平均成绩。4、任意抽取一门课程后,可以按该课程学生成绩对学生信息进行排序。
三、数据结构的设计
为了对学生信息进行统一操作,使用了结构体这一数据结构,学生的各项数据信息都能用结构体来表示,具体如下:
struct stu
{int num;/*学号,整型变量*/
char name[50];/*姓名,长度为50的字符串数组*/
char classes[50]/*班级名称,长度为50的字符串数组*/;
double gsps_score;/*高等数学平时成绩,双精度实型变量*/
double gsks_score;/*高等数学考试成绩,双精度实型变量*/
double gszh_score;/*高等数学综合成绩,双精度实型变量*/
double dlps_score;/*电路理论平时成绩,双精度实型变量*/
double dlks_score;/*电路理论考试成绩,双精度实型变量*/
double dlzh_score;/*电路理论综合成绩,双精度实型变量*/
double yyps_score;/*英语平时成绩,双精度实型变量*/
double yyks_score;/*英语考试成绩,双精度实型变量*/
double yyzh_score;/*英语综合成绩,双精度实型变量*/
double wlps_score;/*物理平时成绩,双精度实型变量*/
double wlks_score;/*物理考试成绩,双精度实型变量*/
double wlzh_score;/*物理综合成绩,双精度实型变量*/
double pj_score;/*平均成绩,双精度实型变量*/
}student[1000];/*最多存储1000个学生数据*/
该结构体数据定义为全局变量。
四、软件模块结构图
模块功能描述:
a.主菜单控制模块:主菜单直接控制七个模块(学生信息输出模块的两个子模块直接归主菜单控制),在各模块间起到纽带的作用。在主菜单,可以通过选择进入其他模块,其他模块运行结束后也可回到主菜单继续选择。
b.学生信息录入模块:循环输入学生信息,建立临时的学生信息数据库。
c.学生信息查询模块:可选择按学号或者按姓名查询学生信息,如学生信息不存在则给出提示。
d.学生信息修改模块:查找到要修改的学生信息后,可对该学生的信息进行逐项修改。
e.学生信息删除模块:查找到要删除的学生信息后,可对其进行删除操作。
f.学生信息插入模块:在数据库末尾插入学生信息,逐项输入要插入的学生信息即可。
g.学生信息输出模块:输出优秀学生信息模块能够输出优秀学生(平均成绩大于等90分)的学号和姓名;输出不及格学生信息模块能够输出不及格学生的相关信息。
h.课程成绩统计模块:可以得到每门课程的平均成绩,还可以任意抽取一门课按单科成绩排定学生名次。
五、程序设计思想
结构化的程序设计主要靠设计和调用各模块的函数来实现。本程序设计了多个函数,每个函数自身能完成一个任务,有的函数和别的函数结合能完成更大的任务。每一个模块功能的实现其实就是对函数的调用,本说明首先介绍本程序所涉及的子函数,再介绍主函数,最后介绍程序整体的实现过程。
1.void Inputfun() 此函数较特别,它只进行输入操作,但由于此函数所包含的语句较长且需要被其他三个函数使用,为方便调用单写了一个函数。此函数在源程序中放在最前,所以在此先作说明。此函数可细分为11个小块,用来输入学生的基本数据。每小块的结构基本相同即for(;;){基本语句 +一个continue语句+基本语句+一个break语句}之所以用这个结构为了使输入的数据更加正规。比如在分数的输入中就限定了只能输入0至100之间的数值,这也符合分数录入规则。需要特别注意的是,这个函数完成了本程序中要做的两个计算。其一是在每门课的考试试成绩输入后完成了对这门课的综合成绩的加权计算(考试成绩*0.7+平时成绩*0.3);其二是在最后一门课程的综合成绩算出后,计算了该学生四门课的平均成绩。
2.void Getinformation() 此函数用来录入学生信息。它调用了void Inputfun()函数,其实它的主体部分就是void Inputfun()函数。这函数还用了一个for循环以达到循环输入的目的。
3.int Searchbynum (int no)\int Searchbyname (char na[50]) 这是两个“兄弟函数”,是按学号查找和按姓名查询模块中的两个重要函数。主要功能是根据用户输入的学号\姓名返回改学生所在的的数组下标。利用for循环嵌套一个if语句实现,若找到学生该学生信息就返回数组下标,若找不到就返回-1。
4.void Seekinformation()\void Printinformation(int x) 这两个函数关系紧密,所以一起介绍。void Seekinformation()函数利用for循环和if语句使查找中能够使用学号和姓名两种方式。如源程序所示,在用if语句确定了查找方式后先后调用了int Searchbynum (int no)\int Searchbyname (char na[50])和void Printinformation(int x)两个函数,根据int Searchbynum (int no)\int Searchbyname (char na[50])返回的数组下标,运用void Printinformation(int x)输出所查询的内容。所以
int Searchbynum (int no)\int Searchbyname (char na[50])\void Seekinformation()\void Printinformation(int x)这四个函数是查询模块的四个联系紧密的重要函数,在它们的共同作用下查询模块的功能得以实现。
5.void Modifyinformation() 此函数用于修改学生信息。基本原理就是用输入的新数据覆盖原来的老数据,达到修改的目的。本函数还调用了查找模块的函数,使修改前能按学号或姓名找到要修改的学生信息。修改过程中调用了Inputfun()函数
6.void Deleteinformation() 此函数用于删除学生信息。同样调用了查找模块的函数。删除模块的关键语句是for (i=x;i<999;i++) student[i]=student[i+1];从要删除的那一个数据开始,用后一个数据覆盖它,一直循环到最后,相当于把开始的第一个数据删除了。
7.void Insertinformaton() 此函数用于插入学生数据。由于没有用链表,所以选择插入在最后一个有效数据之后。本函数运用if(student[j].num==0)这个语句找到了最后一个有效数据之后的数组下标j,然后将数据输入到student[j]中,便完成的了插入。插入过程中,调用了Inputfun()函数。
8.void Showthefail() 此函数用于显示不及格学生的信息。能够按要求输出不及格学生的学号、姓名、各科成绩以及平均成绩。首先用这条if语句搜索该学生是否有成绩不及格,当四门课中至少有一门不及格时会输出该学生的相关信息。
9.void Stu_p() 此函数用于输出优秀学生(平均成绩大于90分)的信息,利用for循环和条件判断句输出找出相应的学生输出相关信息。
10.void Chengjitongji()此函数用于按要求统计成绩。有分别统计每门课的平均成绩的功能;还能够按每门课程的成绩对学生进行排序,使学生在该门课的表现一目了然。排序中用到了冒泡排序的方法。
9.void main() 下面对主函数作简要说明。Switch语句是函数的主体:
switch(c)/*利用switch语句集成各个功能函数*/
{
case 1 : Getinformation();break;/*获得学生信息*/
case 2 : Seekinformation();break;/*查找学生信息*/
case 3 : Modifyinformation();break;/*修改学生信息*/
case 4 : Deleteinformation();break;/*删除学生信息*/
case 5 : Insertinformaton();break;/*插入学生信息*/
case 6 : Stu_p();break;/*显示优秀学生信息*/
case 7 : Showthefail();break;/*显示不及格学生信息*/
case 8 : Chengjitongji();break;/*课程成绩的统计*/
case 0 : exit(0);/*退出*/
default: break;
}
default: break;}
通过一个数值输入函数,使用户在简单的数值输入后就可轻松调用各模块。
还使用了for (;;)使各模块能够循环调用。
11.最后对程序的整体实现过程作个简要说明。源程序中多处运用continue和break语句,同时配合scanf函数和if条件判断语句,使用户能够根据提示通过简单的数值输入来选择下一步该做什么。中文界面,用户很容易根据提示上手,简单易用。
六、程序流程图
以上为主函数流程图,主函数下八个供选择的模块只是简单的用一个执行框表示。现分别画出八个模块的流程图:
1、录入学生成绩:
2、查找学生信息:
3、修改学生信息:
4、删除学生信息:
5、插入学生信息:
6、优秀学生信息:
7、不及格学生信息:
8、成绩统计模块:
七、源程序
#include
#include
#include
#include
struct stu/*定义结构体*/
{int num;
char name[50];
char classes[50];
double gsps_score;
double gsks_score;
double gszh_score;
double dlps_score;
double dlks_score;
double dlzh_score;
double yyps_score;
double yyks_score;
double yyzh_score;
double wlps_score;
double wlks_score;
double wlzh_score;
double pj_score;
}student[1000];
int a,b,c,d,x,i,j,k,s,y,flag;
char s1[50],c1;
double f,t,gp,dp,yp,wp;
/***********************录入、修改、插入学生信息三个模块调用了输入模块*************************************/
void Inputfun()/*输入学生信息模块*/
{
for(; ;)/*设计死循环以至于在输入格式错误时可以再次输入*/
{
printf("请输入班级名称:\t"); /*输入班级名称*/
scanf("%s",&s1);
if(strlen(s1)>20)
{
printf("您输入的班级名称过长!\n");
continue;
}
strcpy(student[i].classes,s1);
break; /*格式正确后跳出死循环*/
}
for(; ;)
{
printf("请输入学号:\t");/*输入学号*/
scanf("%d",&b);
if(student[i].num<0)
{
printf("您输入的学号错误!\n");
continue;
}
student[i].num=b;
break;
}
for(; ;)
{
printf("请输入姓名:\t");/*输入姓名*/
scanf("%s",&s1);
if(strlen(s1)>20)
{
printf("您输入的姓名过长!\n");
continue;
}
strcpy(student[i].name,s1);
break;
}
for(; ;)
{
printf("请输入该生高等数学平时成绩:\t");/*输入各科平时成绩和考试成绩*/
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!请您输入合理的成绩.\n");
continue;
}
student[i].gsps_score=f;
break;
}
for(; ;)
{
printf("请输入该生高等数学考试成绩:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!请您输入合理的成绩.\n");
continue;
}
student[i].gsks_score=f;
student[i].gszh_score=student[i].gsks_score*0.7+student[i].gsps_score*0.3;/*按考试成绩70%平时成绩30%算该门课程的最终成绩*/
break;
}
for(; ;)
{
printf("请输入该生电路理论平时成绩:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!请您输入合理的成绩.\n");
continue;
}
student[i].dlps_score=f;
break;
}
for(; ;)
{
printf("请输入该生电路理论考试成绩:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!请您输入合理的成绩.\n");
continue;
}
student[i].dlks_score=f;
student[i].dlzh_score=student[i].dlks_score*0.7+student[i].dlps_score*0.3;
break;
}
for(; ;)
{
printf("请输入该生英语平时成绩:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!请您输入合理的成绩.\n");
continue;
}
student[i].yyps_score=f;
break;
}
for(; ;)
{
printf("请输入该生英语考试成绩:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!请您输入合理的成绩.\n");
continue;
}
student[i].yyks_score=f;
student[i].yyzh_score=student[i].yyks_score*0.7+student[i].yyps_score*0.3;
break;
}
for(; ;)
{
printf("请输入该生物理平时成绩:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!请您输入合理的成绩.\n");
continue;
}
student[i].wlps_score=f;
break;
}
for(; ;)
{
printf("请输入该生物理考试成绩:\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!请您输入合理的成绩.\n");
continue;
}
student[i].wlks_score=f;
student[i].wlzh_score=student[i].wlks_score*0.7+student[i].wlps_score*0.3;
student[i].pj_score=(student[i].yyzh_score+student[i].dlzh_score+student[i].gszh_score+student[i].wlzh_score)/4;/*计算每个学生的平均成绩*/
break;
}
}
/*********************************录入学生信息模块***************************************/
void Getinformation() /*获得学生信息*/
{
for (i=0;i<1000;i++)/*利用循环连续输入学生信息*/
{
if(i==0)
{
system("cls");
printf("请根据提示输入学生的信息\n\n");
}
else
printf("请输入下一个学生的信息\n\n");
Inputfun();
printf("继续请按1,返回主菜单请按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
/****************查询模块:包含四个函数,函数间有联系**********************************/
int Searchbynum (int no) /*按学号查找*/
{
for (j=0;j<1000;j++)
{
if (student[j].num==no)
{
return j;
}
}
return -1;
}
int Searchbyname (char na[50])/*按姓名查找*/
{
for (k=0;k<1000;k++)
{
if (strcmp(student[k].name,na)==0)
{
return k;
}
}
return -1;
}
void Printinformation(int x)/*输出学生信息*/
{
if (x==-1)
printf("该学生信息不存在!\n");
else
{
printf("班级:%s\n",student[x].classes);
printf("学号:%d\n",student[x].num);
printf("姓名:%s\n\n",student[x].name);
printf("高数平时成绩:%5.2f\n",student[x].gsps_score);
printf("高数考试成绩:%5.2f\n",student[x].gsks_score);
printf("高数综合成绩:%5.2f\n\n",student[x].gszh_score);
printf("电路平时成绩:%5.2f\n",student[x].dlps_score);
printf("电路考试成绩:%5.2f\n",student[x].dlks_score);
printf("电路综合成绩:%5.2f\n\n",student[x].dlzh_score);
printf("英语平时成绩:%5.2f\n",student[x].yyps_score);
printf("英语考试成绩:%5.2f\n",student[x].yyks_score);
printf("英语综合成绩:%5.2f\n\n",student[x].yyzh_score);
printf("物理平时成绩:%5.2f\n",student[x].wlps_score);
printf("物理考试成绩:%5.2f\n",student[x].wlks_score);
printf("物理综合成绩:%5.2f\n\n",student[x].wlzh_score);
printf("平均成绩:%5.2f\n",student[x].pj_score);
}
}
void Seekinformation()/*查询学生信息*/
{
for(; ;)
{
system("cls");
printf("按学号查找请按1,按姓名查找请按2\n");/*提供两种查找方式*/
scanf("%d",&a);
if(a==1)
{
system("cls");
printf("请输入要查找的学生的学号\n");
scanf("%d",&d);
x=Searchbynum (d);/*调用按学号查找函数*/
Printinformation(x);
}
else if (a==2)
{
system("cls");
printf("请输入要查找的学生的姓名\n");
scanf("%s",&s1);
x=Searchbyname (s1);/*调用按姓名查找函数*/
Printinformation(x);
}
printf("继续请按1,返回主菜单请按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
/*************************学生信息删改:包含三个相互独立的函数**********************************/
void Modifyinformation() /*修改学生信息*/
{
for(; ;)
{
system("cls");
printf("请先查找要修改的学生信息!\n\n");
printf("按学号查找请按1,按姓名查找请按2\n");/*先查找后修改*/
scanf("%d",&a);
if(a==1)
{
system("cls");
printf("请输入要查找的学生的学号\n");
scanf("%d",&d);
x=Searchbynum (d);
}
else if (a==2)
{
system("cls");
printf("请输入要查找的学生的姓名\n");
scanf("%s",&s1);
x=Searchbyname (s1);
}
if (x==-1)
printf("学生信息不存在!\n");
else
{
printf("您要修改的学生信息为:\n");
Printinformation(x);
printf("请您输入新值\n");
i=x;
Inputfun();
}
printf("继续请按1,返回主菜单请按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
void Deleteinformation() /*删除学生信息*/
{
for (;;)
{
system("cls");
printf("请先查找要删除的学生信息!\n\n");
printf("按学号查找请按1,按姓名查找请按2\n");
scanf("%d",&a);
if(a==1)
{
system("cls");
printf("请输入要查找的学生的学号\n");
scanf("%d",&d);
x=Searchbynum (d);
}
else if (a==2)
{
system("cls");
printf("请输入要查找的学生的姓名\n");
scanf("%s",&s1);
x=Searchbyname (s1);
}
if (x==-1)
printf("学生信息不存在!\n");
else
{
printf("您要删除的学生信息为:\n");
Printinformation(x);
printf("是否真的要删除该生信息?是请按1,否请按0.\n");
scanf("%d",&a);
if (a==1)
{
for (i=x;i<999;i++)
student[i]=student[i+1];/*该数组后的数组向前移动以覆盖的方式删除该数组*/
printf("删除成功!\n");
}
}
printf("继续请按1,返回主菜单请按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
void Insertinformaton() /*插入学生信息*/
{
system("cls");
for(j=0;j<1000;j++)
{
if(student[j].num==0)
{
x=j;
break;
}
}
for(i=x;i<1000;i++)
{
system("cls");
printf("请输入要插入的学生信息\n\n");
Inputfun();/*利用信息录入函数把学生信息插在末尾*/
printf("继续请按1,返回主菜单请按0.\n");
scanf("%d",&a);
if(a==0)
break;
}
}
/********各科成绩排序的四个程序********************/
void paixugs() /*排序1*/
{
struct stu temp;
for (j=1;j<1000;j++)
{
for (k=0;k<999;k++)
{
if (student[k].gszh_score
{
temp=student[k];
student[k]=student[k+1];
student[k+1]=temp;
}
}
}
system("cls");
printf("学生成绩排序表:\n\n");
for (i=0;i<1000;i++)
if (student[i].num!=0)
{
printf("学号:%d\t",student[i].num);
printf("姓名:%s\t",student[i].name);
printf("第%d名:%5.2f\n",(i+1),student[i].gszh_score);
}
printf("返回主菜单请按0\n");
scanf("%d",&a);
}
void paixudl() /*排序2*/
{
struct stu temp;
for (j=1;j<1000;j++)
{
for (k=0;k<999;k++)
{
if (student[k].dlzh_score
{
temp=student[k];
student[k]=student[k+1];
student[k+1]=temp;
}
}
}
system("cls");
printf("学生成绩排序表:\n\n");
for (i=0;i<1000;i++)
if (student[i].num!=0)
{
printf("学号:%d\t",student[i].num);
printf("姓名:%s\t",student[i].name);
printf("第%d名:%5.2f\n",(i+1),student[i].dlzh_score);
}
printf("返回主菜单请按0\n");
scanf("%d",&a);
}
void paixuyy() /*排序3*/
{
struct stu temp;
for (j=1;j<1000;j++)
{
for (k=0;k<999;k++)
{
if (student[k].yyzh_score
{
temp=student[k];
student[k]=student[k+1];
student[k+1]=temp;
}
}
}
system("cls");
printf("学生成绩排序表:\n\n");
for (i=0;i<1000;i++)
if (student[i].num!=0)
{
printf("学号:%d\t",student[i].num);
printf("姓名:%s\t",student[i].name);
printf("第%d名:%5.2f\n",(i+1),student[i].yyzh_score);
}
printf("返回主菜单请按0\n");
scanf("%d",&a);
}
void paixuwl() /*排序4*/
{
struct stu temp;
for (j=1;j<1000;j++)
{
for (k=0;k<999;k++)
{
if (student[k].wlzh_score
{
temp=student[k];
student[k]=student[k+1];
student[k+1]=temp;
}
}
}
system("cls");
printf("学生成绩排序表:\n\n");
for (i=0;i<1000;i++)
if (student[i].num!=0)
{
printf("学号:%d\t",student[i].num);
printf("姓名:%s\t",student[i].name);
printf("第%d名:%5.2f\n",(i+1),student[i].wlzh_score);
}
printf("返回主菜单请按0\n");
scanf("%d",&a);
}
void Showthefail()/*显示不及格学生的情况*/
{
system("cls");
printf("不及格的学生:\n\n");
for (i=0;i<1000;i++)
if (student[i].num!=0)
if(student[i].gszh_score<60||student[i].dlzh_score<60||student[i].yyzh_score<60||student[i].wlzh_score<60)
{Printinformation(i);printf("--------------------\n");}
printf("\n返回主菜单请按0\n");
scanf("%d",&a);
}
void Stu_p()/*优秀学生(平均分大于等于90分)信息*/
{
system("cls");
printf("平均分90以上的学生:\n\n");
for (i=0;i<1000;i++)
if (student[i].num!=0)
if(student[i].pj_score>=90)
{printf("学号:%d\n",student[i].num);
printf("姓名:%s\n\n",student[i].name);}
printf("\n返回主菜单请按0\n");
scanf("%d",&a);}
void Chengjitongji()/*按要求统计成绩*/
{int flag=0;
double gp=0,dp=0,yp=0,wp=0;
system("cls");
printf("每门课程平均成绩请按1,单科成绩排序请按2\n");
scanf("%d",&s);
if(s==1)
{
for (i=0;i<1000;i++)
{
gp+=student[i].gszh_score;
dp+=student[i].dlzh_score;
yp+=student[i].yyzh_score;
wp+=student[i].wlzh_score;
if (student[i].pj_score>0)
flag++;
}gp=gp/flag;dp=dp/flag;yp=yp/flag;wp=wp/flag;
system("cls");
printf("高等数学平均成绩:\t%5.2f\n",gp);
printf("电路理论平均成绩:\t%5.2f\n",dp);
printf("英语平均成绩:\t%5.2f\n",yp);
printf("物理平均成绩:\t%5.2f\n",wp);
printf("\n返回主菜单请按0\n");
scanf("%d",&a);}
if(s==2){
printf("请选择\n\n");
printf("高等数学成绩排序请按1\n");
printf("电路理论成绩排序请按2\n");
printf("英语成绩排序请按3\n");
printf("物理成绩排序请按4\n");
scanf("%d",&y);
if(y==1) paixugs();/*调用相应的排序函数*/
if(y==2) paixudl();
if(y==3) paixuyy();
if(y==4) paixuwl();}}
/**************************************************************************************************/
void main() /*主函数*/
{
printf("\t\t **************************************\n\n");/*开始界面*/
printf("\t\t **********学生成绩管理系统**********\n\n");
printf("\t\t **********设计者:乐骏彦**********\n\n");
printf("\t\t *********指导老师:彭春华*******\n\n");
printf("\t\t ********通信工程0902班********\n\n");
printf("\t\t ********20##年6月30日*******\n\n");
printf("\t\t **************************\n\n");
printf("\n\n\n\n");
printf("请输入系统启动口令\n");/*启动口令*/
scanf("%d",&a);
if(a!=1)
{
printf("口令错误!系统即将关闭!\n");
exit(0);
}
for (;;)
{
system("cls");
printf("请从主菜单选择您所需要的操作\n\n");/*系统主菜单*/
printf("1.首次输入学生信息请按\n");
printf("2.查找学生信息\n");
printf("3.修改学生信息\n");
printf("4.删除学生信息\n");
printf("5.插入学生信息\n");
printf("6.优秀学生信息\n");
printf("7.不及格学生信息\n");
printf("8.课程成绩统计\n");
printf("0.退出\n");
scanf("%d",&c);
switch(c)/*利用switch语句集成各个功能函数*/
{
case 1 : Getinformation();break;/*获得学生信息*/
case 2 : Seekinformation();break;/*查找学生信息*/
case 3 : Modifyinformation();break;/*修改学生信息*/
case 4 : Deleteinformation();break;/*删除学生信息*/
case 5 : Insertinformaton();break;/*插入学生信息*/
case 6 : Stu_p();break;/*显示优秀学生信息*/
case 7 : Showthefail();break;/*显示不及格学生信息*/
case 8 : Chengjitongji();break;/*课程成绩的统计*/
case 0 : exit(0);/*退出*/
default: break;
}
}
}
八、调试分析
调试程序比编写程序还要困难,花的时间也最多,对于整个程序的分析在程序设计思想一节里已经讨论过了,这里就不在赘述。而调试的过程比较繁琐对于很多小错误也没有留心去记录,这里只举出一个我映像较深的例子来说明调试的过程。例如下面这段代码(按学号查找学生信息的函数)
int Searchbynum (int no) /*按学号查找*/
{for (j=0;j<1000;j++)
{if (student[j].num==no)
{ return j;}}
return -1;}
我在刚开始时吧return -1;这句代码写到了for循环内部,编译时并没有错误,只有一条警告 “ warning C4715: 'Searchbynum' : not all control paths return a value ”,当时也没在意,然而当运行到学生信息查询模块时,只能查询第一个学生的数据,从第二个数据开始就无法查询到了。后来经过仔细检查才发现了这个错误。
通过这个例子,我明白了编程中出现语法错误机器会帮你找出,而出现逻辑错误想靠机器帮你找出的是不太可能的!所以在以后的编程中要尽量避免出现逻辑错误。
九、测试数据
如果把每一个功能的测试的结果都截图放到报告中来,将会占用很大的篇幅,所以这里只贴出在设计题目要求中着重提到的几个功能(优秀学生和不及格学生的信息输出、每门课程的平均成绩以及高等数学按学生成绩的排序)的测试的数据。此次测试输入了5名学生的成绩进行测试,其中有两人为优秀学生,有两人有不及格的记录。测试截图如下:
优秀学生信息:
不及格学生信息:
各科平均成绩:
高等数学成绩排名:
十、用户使用手册
此学生成绩管理系统为中文界面,提示清楚,界面友好,只要输入学生信息及成绩,即可自动生成优秀学生信息、不及格学生信息、各科成绩平均分、以及各科成绩排名。还可以查找、修改、插入、删除学生信息与成绩,是一个较全面的成绩管理系统。
输入学生信息及成绩时请注意以下几点:
1、输入学生姓名和班级名称时不要过长(超过50个字符),否则系统会判定为恶意输入;
2、输入学号时请不要超过10位数字,否则也会被判定为恶意输入;
3、学生成绩分为平时成绩与考试成绩,输入时请看清楚,不要混淆;
4、输入学生成绩时请出入0到100之间的数,成绩不能小于0也不能大于100;
5、本管理系统最多可存储1000个学生的信息。
十一、心得体会
课程设计即将在今天结束,从一开始拿到任务计划书的茫然,到后来开始自己慢慢摸索,再到整个程序的完成,最后到今天的这份报告,两个星期一路走来,感觉自己在程序设计方面不能说收获颇丰但至少至少没有白白浪费这两个星期的时间。虽然在编程过程中遇到了很多问题,但我还是一一克服了,在这过程中,我对程序设计有了新的认识。
这个系统对数据的要求简单,程序总体模块结构清晰,做起来应该比较简单。自以为经过深思熟虑,但当第二天提笔要在纸上写程序时,才发现自己的前一天对程序的构想是多么的幼稚可笑。程序开头要包含几个基本的头文件?怎样正确定义结构体?要定义几个全局变量才够用?单是这些基本的问题就让我无从下笔,更别说对程序的整体构想了。只能花一天时间把课本上的重要概念做一个梳理,对程序再做进一步的构想。由于平时上课不认真听,以至于我无法灵活运用指针,对链表更是一窍不通,所以在数据处理中没有使用链表,且回避了指针的使用。老师说指针是C语言的特色,没有使用指针不能不说是本次课程设计中的一大遗憾。而且我对文件的应用也不是很熟悉,所以没有设置数据保存功能,整个系统成了一次性系统,而且我也省略了部分功能,这都是我平时不认真学习照成的!
通过这次课程设计,我还深刻的体会到了实践的重要性!纸上得来终觉浅,绝知此事要躬行。老师课堂上讲的方法,如果不上机实践,就永远不可能转化为自己的能力。编程就要靠自己多懂脑,多琢磨,当一个问题被解决时那种豁然开朗的感觉,真的很好。实践出真知,这次实践中我学会了很多编程中实用的小算法(或者叫方法),相信我在以后编程中都能灵活的使用了。
编好一个程序需要缜密的逻辑思维能力和扎实的基本功,这些在现在看来我可能还不具备,通过这次课程设计,我已经有了明确努力的方向,相信这些都将不会再是问题!在这里还有感谢老师对我的指导,老师您辛苦了!
电子信息科学与技术专业课程设计题单班级_***_学生***课程名称专业课程设计_课题密码锁的设计设计要求利用visualc#作为前…
山东交通学院java语言课程设计题目学生成绩管理系统系部信息科学与电气工程学院专业信息管理及信息系统班级信管111姓名田忠平学号1…
java学生成绩管理系统课程设计报告以及代码共享Java语言课程期末作业题目第9题学生成绩管理系统学院计算机学院专业计算机科学与技…
目录摘要1第一章绪论错误未定义书签11设计目的错误未定义书签12开发工具选择错误未定义书签13开发环境错误未定义书签14本报告的主…
C语言课程设计报告一问题描述题目七学生成绩管理系统设计学生成绩信息包括学期学号班别姓名四门课程成绩语文数学英语和计算机等主要功能1…
CENTRALSOUTHUNIVERSITY数据结构课程设计报告题目学生姓名指导教师学院专业班级完成时间交通旅游图的最短路径问题摘…
课程设计说明书课程名:《数据结构课程设计》题目:一元多项式运算系统20##年1月一、课程认识数据结构课程主要是研究非数值计算的程序…
西安郵電學院数据结构课程设计报告题目校园导航系统院系名称计算机学院专业名称计算机科学与技术班级学生姓名学号8位指导教师设计起止时间…
攀枝花学院学生课程设计论文题目学生姓名学号20xx108010所在院系数学与计算机学院专业计算机科学与技术专业班级20xx级计算机…
数据结构课程设计报告学生姓名学号班级地信10901长江大学20XX.6目录1.需求分析......................…