【精编完整版】学生成绩管理系统千行代码C语言毕业论文

更新时间:2023-04-27 23:27:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

(此文档为word格式,下载后您可任意编辑修改!)

内蒙古科技大学

本科生课程设计说明书

题目:C语言课程设计

——学生成绩管理系统

学生姓名:边峰

专业:软件工程

班级:1班

指导教师:周李涌

日期:2015年 1月 1日

内蒙古科技大学课程设计任务书

目录

内蒙古科技大学课程设计任务书 ............................................................I 目录..........................................................................................I I 第一章需求分析 .. (3)

1.1引言 (3)

1.2任务概述 (3)

1.3数据描述 (3)

1.4功能需求 (4)

1.5性能需求 (4)

1.6运行需求 (5)

1.7任务计划 (5)

第二章概要设计 (6)

2.1总体设计 (6)

2.2数据类型设计(或数据结构设计) (6)

2.3接口设计 (7)

2.4运行界面设计 (7)

第三章详细设计 (8)

3.1输入模块设计 (8)

3.2输出模块设计 (10)

3.3查找模块设计 (11)

3.4排序模块设计 (14)

3.5保存及读取模块设计 (16)

第四章测试分析 (17)

4.1测试程序执行情况 (17)

4.2出现的问题和解决的方法 (20)

第五章课程设计总结 (21)

附录:程序代码 (21)

参考文献 (46)

第一章需求分析

1.1引言

此报告完整呈现了我开发“学生成绩管理系统”的整个软件过程,包括需求分析阶段,软件设计与实现阶段和测试阶段。在需求分析阶段,明确所要开发的软件应具有的功能、性能与界面,使系统使用人员及系统开发人员能清楚地了解用户的需求,并在此基础上进一步提出概要设计说明书和完成后续设计与开发工作。在软件设计与实现阶段,进一步细化软件设计阶段得出的软件总体概貌,把它加工成在程序细节上非常接近于源程序的软件表示,然后着手于实践。最后在测试阶段检验了我们的软件的实用性,发现了许多不足。这个报告即是对最后软件的总体描述

1.2任务概述

学生成绩管理系统:

包括以下功能:

从键盘输入包括学号、姓名、各门课程成绩(不少于5门),并将其保存在磁盘文件里

打开文件后,计算每个人的总分和平均分,排序并保存

具有单项查询或多项查询的功能(即按照给定的关键字,如姓名找出满足条件的纪录)

具有插入、删除和修改功能

具有输出文件数据信息的功能

1.3数据描述

数据是关于学生的资料:包括学号、姓名、5门功课的成绩、总分、平均分。

1.4功能需求

为实现学生成绩管理系统,该程序有以下功能:

1.输入学生成绩。以插入节点的形式将输入的学生资料按总分降序插入

链表中。

2.删除学生成绩。用学号进行查找,查找到后直接删除。

3.查询学生成绩。三种查找方式,1.姓名2.学号3.分数。1.2.为精确查

找,3为范围查找,输入成绩后,查找出所有高于该成绩的学生并输

出。

4.修改学生成绩。按学号查找学生,查找后可以修改学生的所有信息,

包括学号。修改成绩后自动对总分、平均分更新。

5.排序学生成绩。排序学生成绩有三种排序方案:1.学号升序。2.总分

升序。3.总分降序

6.保存学生成绩。将学生成绩保存到student 文件内,以便下次运行程

序时读入数据。

7.科目设置。对五门科目的名称进行设置。

8.程序密码设置。程序首次运行时,设置密码。密码保存在mima.txt

文件内。以后每次运行程序都需要输入密码。

9.程序密码修改。在进入程序主界面后,可以对程序密码进行修改。修

改密码会覆盖原有的mima.txt,将新的密码保存在该文件内。

10.程序字体颜色。为了程序的美观性,在主菜单内设置了颜色功能。可

以修改程序的颜色。有9种颜色可供选择。

1.5性能需求

本程序采用动态内存申请的方式,储存学生成绩资料,尽可能的节省了所占内存空间,并且在程序结束时释放所有内存。

1.6运行需求

在输入学号是学号数值大小不大于长整型的数值范围。

姓名不超过5个中文字符、11个英文字符。

学生成绩不超过宏定义的maxscore 100 不小于minscore 0.

本程序在运行时,要求有student文件储存学生资料,mima.txt文件储存程序密码,kemu.txt文件储存科目名称。在文件不存在时,程序会自行创建这些文件以供使用。

1.7任务计划

设计一个学生成绩管理系统,来管理学生成绩。

包括以下功能:

从键盘输入包括学号、姓名、各门课程成绩(不少于5门),并将其保存在磁盘文件里

打开文件后,计算每个人的总分和平均分,排序并保存

具有单项查询或多项查询的功能(即按照给定的关键字,如姓名找出满足条件的纪录)

具有插入、删除和修改功能

具有输出文件数据信息的功能

第二章概要设计

2.1总体设计

2.2数据类型设计(或数据结构设计)

typedef struct student

{

long xuehao;

char name[12];

int chengji[N];

int zongfen;

float pingjun;

struct student*next;

} NODE;

2.3接口设计

void (); 输出主菜单

NODE* daoru (NODE *l,char kemu [][20]); 已存在信息导入void jieshu(NODE* l); 模块0 结束程序

NODE* InsertNode(NODE *");

exit(0);

}

p->next = NULL; * 为待插入节点的指针域赋值为空指针*

printf("请输入第%d位学生资料:",count);

printf("请输入学号:(输入0返回)");

scanf("%ld",&p->xuehao);

xuehao=p->xuehao;

if(p->xuehao==0)

{

free(p);

return ");

free(p);

return ");

goto w;

}

}

sum = 0;

for(i=0; i

{

sum+=(*p).chengji[i];

}

p->zongfen = sum;

p->pingjun= (float)sumN;

system("pause");

if ( > p->zongfen && pr->next != NULL)

{

temp = pr; * 在temp中保存当前节点的指针*

pr = pr->next;* pr指向当前节点的下一节点*

}printf("程序运行到此");

if (pr->zongfen <= p->zongfen)

{

if (pr == ");

ziliao = 1;

return ",kemu[0],kemu[1],kemu[2],kemu[3],kemu[4]);

while (p != NULL) * 若不是表尾,则循环打印*

{

printf("%-13ld%-8s%-8d%-8d%-8d%-8d%-6d%-6.0d%-6.1f %-3d\n",p->xuehao,

p->name,

p->chengji[0],

p->chengji[1],

p->chengji[2],

p->chengji[3],

p->chengji[4],

p->zongfen,

p->pingjun,j);* 打印第j个节点的数据*

p = p->next; * 让p指向下一个节点*

j++;

}

}

3.1查找模块设计

1.流程图

2.模块代码

* 函数的功能:菜单功能3 查询学生资料*

void FIND (NODE *;

printf("请输出查找方式:\n1.学号查找\n2.姓名查找\n3.总分查找\n======>");

c1[0] = getche();

c = atoi(c1);

printf("\n");

if(c==1)

{

printf("请输入学号:");

scanf("%ld",&xuehao);

while (p != NULL) * 若不是表尾,则循环打印*

{

if(xuehao == p->xuehao)

{

if(k)

{

printf("学号姓名%8s%8s%8s%8s%8s 总分平均分\n",kemu[0],kemu[1],kemu[2],kemu[3],kemu[4]);

}

printf("%-13ld%-8s%-8d%-8d%-8d%-8d%-6d%-6.0d%-6.1f \n",p->xuehao,

p->name,

p->chengji[0],

p->chengji[1],

p->chengji[2],

p->chengji[3],

p->chengji[4],

p->zongfen,

p->pingjun);* 打印第j个节点的数据*

k=0;

}

p = p->next; * 让p指向下一个节点*

}

if(k==1)

printf("抱歉,您查找的信息不存在!\n");

system("pause");

}

else if(c==2)

{

printf("请输入姓名:");

scanf("%s",name);

while (p != NULL) * 若不是表尾,则循环打印*

{

if(strcmp(name,p->name) == 0)

{

if(k)

{

printf("学号姓名%8s%8s%8s%8s%8s 总分平均分\n",kemu[0],kemu[1],kemu[2],kemu[3],kemu[4]);

}

printf("%-13ld%-8s%-8d%-8d%-8d%-8d%-6d%-6.0d%-6.1f \n",p->xuehao,

p->name,

p->chengji[0],

p->chengji[1],

p->chengji[2],

p->chengji[3],

p->chengji[4],

p->zongfen,

p->pingjun);* 打印第j个节点的数据*

k=0;

}

p = p->next; * 让p指向下一个节点*

}

if(k==1)

printf("抱歉,您查找的信息不存在!\n");

system("pause");

}

else if(c==3)

{

printf("请输入要查找多少分以上的学生:");

scanf("%d",&zongfen);

while (p != NULL) * 若不是表尾,则循环打印*

{

if(zongfen <=p->zongfen)

{

if(k)

{

printf("学号姓名%8s%8s%8s%8s%8s 总分平均分\n",kemu[0],kemu[1],kemu[2],kemu[3],kemu[4]);

}

printf("%-13ld%-8s%-8d%-8d%-8d%-8d%-6d%-6.0d%-6.1f \n",p->xuehao,

p->name,

p->chengji[0],

p->chengji[1],

p->chengji[2],

p->chengji[3],

p->chengji[4],

p->zongfen,

p->pingjun);* 打印第j个节点的数据*

k=0;

}

p = p->next; * 让p指向下一个节点*

}

if(k==1)

printf("抱歉,您查找的信息不存在!\n");

system("pause");

}

else

{

printf("输入有误,请重新输入!\n");

system("pause");

caidan();

printf("\n");

FIND (");

xv[0] = getche();

xv1 = atoi(xv);

while (r != NULL)

{

t = r->next;

cp = SL;

ap = NULL;

while (cp != NULL)

{

if(xv1==1)

{

if(r->xuehao < cp->xuehao)

{

break;

}

else

{

ap = cp;

cp=cp->next;

}

}

else if(xv1==2)

{

if(r->zongfen < cp->zongfen)

{

break;

}

else

{

ap = cp;

cp=cp->next;

}}

}

if (ap == NULL)

{

r->next = SL;

SL = r;

}

else

{

r->next = cp;

ap->next = r;

}

r = t;

}

printf("排序完成!\n");

return SL;

}

3.2保存及读取模块设计

1.流程图

2.模块代码

* 函数功能:菜单功能10 对新录入的学生信息进行保存* void Save(NODE* l)

{

FILE *fp;

NODE *p;

int flag=1,count=0;

fp=fopen("student","w");

if(fp==NULL)

{

printf("\n=====>提示:重新打开文件时发生错误!\n");

exit(1);

}

p=l->next;

while(p!=NULL)

{ fprintf(fp,"%ld %s %d %d %d %d %d %d %f\n",p->xuehao,p->name,p->chengji[0],p->chen gji[1],

p->chengji[2],p->chengji[3],p->chengji[4], p->zongfen, p->pingjun); p=p->next;count++;} if(flag)

{printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n",count);

ziliao = 0;system("pause");}

fclose(fp);

}

第二章测试分析

4.1测试程序执行情况

1.密码测试

先输入错误密码,在输入正确密码。

2.输入学生资料测试

3.查询学生成绩测试

4.修改学生测试

5.显示学生资料测试

6.统计学生资料测试

7.排序测试

8.密码修改测试

9.科目修改测试

10.颜色更换测试

4.2出现的问题和解决的方法

1.文件数据导入错误,导入后无法正确显示

解决方法:没有返回头指针,对daoru();函数添加了头指针的返回。

2.程序密码第一次输入错误后勿论之后输入的密码正确与否,都会提示密码错误

解决方法:第一次录入密码后没有对mi1[]数组进行清空,第二次输入的密码会不完全覆盖第一次输入的密码,在每一次判断密码是否正确后对mi1[]进行清空,这样之后录入的密码正确。

3.排序结果不正确

解决方法:排序时节点的交换出现问题,导致排序后的链表断点。更正交换代码后问题解决。

4.程序运行时如果把数字输入成字母,程序会崩溃

解决方法:对输入的数据进行判断,如果不是数字提示输入错误,重新录入。

5. 在修改信息函数中,修改学好,成绩这些用数组定义的量时没有问题可以正确修改,当修改库存数量和价格时会出现程序出错现象,而编译代码时并不提示有错,最后在仔细检查下终于发现是这2个地方忘了加取地址“&”,修改后程序可正确运

6.不存在文件时创建新文件后没有对头节点进行返回,导致其他功能不能正常运行。将头节点返回。

第三章课程设计总结

该课程设计是进入大学以来的第一个课设,通过这次的课设,我对本学期所学内容有了更深层次的了解与认识,同时我感觉到了作为一个程序员的幸苦与智慧。就我本人而言,本次课程设计编写将尽两个月。

这次课程设计,我明白了对于编写程序,解题的思路尤为重要。在编写程序之前,如果没有比较清晰的思路,根本不可能编出好的程序。就算马马虎虎的编出来,程序的逻辑性、健壮性、完善性、合理性也不会很强。在编程之前,我们应反复研究题目要求,对题目涉及的情况进行比较充分的分析,以便编写出更加符合题意的程序;其次要充分考虑各种临界情况,对一些错误的输入进行处理。因此在我们编程序之前一定要做好充分的准备,首先要理清自己的思路,然后再将思路分划成几个模块,逐块的写好算法,最后再将所有的模块有机的联系起来,组成一个完整的程序。在成功通过编译的情况下,对程序运行的结果进行系统的分析,检验其正确性,如果有错误,应立即去分析源程序的逻辑错误,直到得到正确的结果。

附录:程序代码

#include

float pingjun;

struct student*next;

} NODE;

void (); 输出主菜单

NODE* daoru (NODE *l,char kemu [][20]); 已存在信息导入

void jieshu(NODE* l); 模块0 结束程序

NODE* InsertNode(NODE *()

{

NODE *l;

l=NULL;

char mi[16]= {'0'},mi1[16]= {'0'};

char kemu [N][20];

本文来源:https://www.bwwdw.com/article/qigq.html

Top