1、一、 课程设计的内容 (1) 信息维护: 要求:学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息 (2) 信息查询: 要求:查询时可实现按姓名查询、按学号查询 (3) 成绩统计: 要求:A输入任意的一个课程名(如数学)和一个分数段(如60--70),统计出在此分数段的学生情况。 (4) 排序:能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果(使用表格的形式显示排序后的输出结果)(使用多种方法排序者,加分) (二)其它要求: (1) 只能使用C/C++语言,源程序要有适当的注释
2、使程序容易阅读 (2) 至少采用文本菜单界面(如果能采用图形菜单界面更好) (3) 学生可自动增加新功能模块(视情况可另外加分) (4)写出课程设计报告,具体要求见相关说明文档 二、课程设计的要求与数据 1、进一步掌握和利用C语言进行程设计的能力; 2、进一步理解和运用结构化程序设计的思想和方法; 3、初步掌握开发一个小型实用系统的基本方法; 4、学会调试一个较长程序的基本方法; 5、学会利用流程图或N-S图表示算法; 6、掌握书写程序设计开发文档的能力。 三、课程设计应完成的工作 1、编写完成相应题目的程序; 2、编写课程设计报告,课程设计报告的内容应包括以下6个
3、部分: 1) 需求分析:包括设计题目、设计要求以及系统功能需求分析; 2) 总体设计:包括系统总体设计框架和系统功能模块图; 3) 详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图; 4) 调试分析过程描述:包括测试数据、测试输出结果,以及对程序调试过程中存在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等,适当的包含结果截图); 5) 总结:课程设计完成了哪些功能,有没有什么扩展功能?还有哪些地方需要改进?课程设计过程中的学习体会与收获、对本次课程设计的认识以及自己的建议等内容; 6) 附录:主要源程序代码,含必要的注释。 3、答辩:在实验室建立
4、程序运行的环境,并在指导教师的监督下,独立解 决问题、运行程序和回答教师提出的问题。 目 录 1 设计目的与要求………………………………………………………………P4 2 总体设计………………………………………………………………………P4 3 详细设计………………………………………………………………………P5 3.1功能模块设计………………………………………………………………P5 3.1.1 XX功能模块(可选) …………………………………………………P5 3.1.2 YY功能模块(可选) …………………………………………………P6 3.1.3 ZZ功能模块(可选
5、)…………………………………………………P7 3.2数据结构设计……………………………………………………………P8 4调试分析 ……………………………………………………………………P9 4.1结构体……………………………………………………………………P9 4.2链表………………………………………………………………………P11 5遇到的问题及解决方法分析…………………………………………………P12 6 总结……………………………………………………………………………P13 7源文件…………………………………………………………………………P13 7.1链表…………………
6、……………………………………………………P13 7.2结构体……………………………………………………………………P28 1、目的与要求 一 目的:编制一程序实现对学生成绩的管理,让自己既动手又动脑,独立实践,将课本上的理论知识和实际应用问题进行有机结合,锻炼自己分析、解决实际问题的能力,提高自身项目开发及程序调试能力。 二 要求: 1、整个系统均用C语言实现; 2、利用指针、结构体、链表来实现学生成绩的数据结构设计; 3、系统具有输入、显示、查询(查询时可实现按姓名查询、按学号查询)、删除、排序、插入,保
7、存、读取基本功能; 4、系统的各个功能模块都用函数的形式来实现; 5、学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息; 6、可以输入任意的一个课程名(如数学)和一个分数段(如60--70),统计出在此分数段的学生情况; 7、能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果; 8、可自动增加新功能模块; 9、可以将学生信息从文件中读取出来。 2 总体设计 1、 主函数 main() 利用if-else,While循环语句和switch()实现各函数的调
8、用,系统根据输入的数字选项来调用相应的函数。 2、 菜单选择函数void menu(); 这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的13大功能,根据每个功能前面的序号进行选择。等执行完每一个函数功能后,按任‘0’键回到主界面也要通过这个函数提示来实现! 3、 自定义函数 void printstart()、void Wrong()、void Nofind()、void printc()、void printe(Node *p) 用void Wrong()来提示输入错误,用void Nofind()提示没有找到学生资料,用void printc()来输出中文,
9、用void printe(Node *p)来输出中文。 main() void Add(Link l) void Maths(Link l) void Qur(Link l) void English(Link l) void Del(Link l) void select(Link l) void Modify(Link l
10、) void Save(Link l) void Disp(Link l) void menu() void Tongji(Link l) void printc() void Chinese(Link l) void printe(Node *p) 3 详细设计 3.1功能模块设计 3
11、1.1 排序数学成绩功能模块 函数void Maths(Link l) 该函数用于对数学成绩进行降序,ll=(Link)malloc(sizeof(Node))用于做新的链表连接,如果原链表为空的话,返回;不为空的话,p=l->next;建立接点用于保存信息,对指定链表地址进行排序。流程图如图所示: Link ll ll=(Link)malloc(sizeof(Node)) 用于做新的连表 l->next==NULL 是 否 没有资料可以 p=l->next 排序 while(p)
12、 return s=(Node*)malloc(sizeof(Node)) rr=ll while(rr->next!=NULL&& rr->next->data.mgrade>=p->data.mgrade) 是 rr->next==NULL 否 rr->next=s s->next=rr->next; rr->next=s p=p
13、>next l->next=ll->next (排序完成) 3.1.2 显示学生资料功能模块 函数void Disp(Link l) 该函数负责显示学生资料,这是一个不返回值函数。 算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。流程图如图所示: 原来链表是否为空 是 否 提示没有 p指向下一结点p
14、p->next 资料可以 输出p指向的结点,即学生信息 显示 return p指向下一结点p=p->next 3.1.3 删除资料功能模块 函数void Del(Link l) 该函数用于有选择地删除学生资料,如果原来的链表为空的话,会返回;不为空的话,选择用按哪种类型删除,如果按学号删除,就输入学号,后判断是否取得地址,取得就执行删除;按名字删除就输入名字,运行同学号一样。流程图如图所示: 原链表是否为空 是 否 没
15、有资料 1 按1学号还是2按名字? 2 可以删除 输入你要删除的学号 输入你要删除的名字 P是否取得输入地址 P是否取得输入地址 是 否 否 是 Return r指向下一 Nofind() Nofind () r指向下一 结点 结点
16、 执行free(p) 执行free(p) 3.2数据结构设计(可选) 一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。一个结构体变量的指针就是该变量所占据的内存段起始地址。可以设一个指针变量,用来指向一结构体变量,此时指针变量的值是结构体的起始地址。指针量变也可以用来指向一结构体数组中的元素。 struct student { char num[10];/* 学号 */ char name[20]; char sex[4]; int cgrade; int
17、mgrade; int egrade; int totle; int ave; char neartime[10];/* 最近更新时间 */ }; typedef struct node { struct student data; struct node *next; }Node,*Link; 6 总 结 经过一个多星期的C语言课程设计,感觉自己收获不少! 首先是:要达到这样的功能,使用链表相当方便,但不容易理解,所以在这方面我很了很多的时间看课本,使C语言的知识强化了不少。 其次,在做课程设计的过程中,发现了平时很多没有注意到的问题,例如
18、返回值函数和不返回值函数两者在主函数中的调用是不同的………… 更重要的是,这次课程设计虽然花了我不少时间,但正是这些时间,让我见识到了C语言的重要性。这个学生成绩管理系统都是在自己知识范围内完成的,所以界面清晰简单,可能不是很好看,但绝对实用! 从这里我也得到一个体会,做一个程序,或者开发一个软件,应该着重从它的后台制作入手,不能做出一个中看不中用的程序或者软件。 相信这次的课程设计使我的C语言知识扎实了很多。 由于这是第一次进行设计,写文档,难免会写得不好! 7 源程序 7. 1链表 #include "stdio.h" #include "stdlib.h"
19、 #include "string.h" int shoudsave=0; /* */ struct student { char num[10];/* 学号 */ char name[20]; char sex[4]; int cgrade; int mgrade; int egrade; int totle; int ave; char neartime[10];/* 最近更新时间 */ }; typedef struct node { struct student data; struct node *next;
20、 }Node,*Link; void menu() { printf("********************************************************************************"); printf("\t1登记学生资料\t\t\t\t\t2删除学生资料\n"); printf("\t3查询学生资料\t\t\t\t\t4修改学生资料\n"); printf("\t5显示学生资料\t\t\t\t\t6统计学生资料\n"); printf("\t7排序语文成绩\t\t\t\t\t8排序数学成绩\n"); pri
21、ntf("\t9排序英语成绩\t\t\t\t\t10选出分段分数\n"); printf("\t11保存学生资料\t\t\t\t\t12帮助信息\t\t\n"); printf("\t0退出系统\t\t\t\t\t\t\t\n"); printf("********************************************************************************\n"); } void printstart() { printf("----------------------------------------------
22、\n"); } void Wrong() { printf("\n=====>提示:输入错误!\n"); } void Nofind() { printf("\n=====>提示:没有找到该学生!\n"); } void printc() /* 本函数用于输出中文 */ { printf("学号\t 姓名\t 性别 语文成绩 数学成绩 英语成绩 总分 平均分\n"); } void printe(Node *p)/* 本函数用于输出英文 */ {
23、 printf("%-12s%s\t%s\t%d\t%d\t%d\t %d\t %d\n",p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave); } Node* Locate(Link l,char findmess[],char nameornum[]) /* 该函数用于定位连表中符合要求的接点,并返回该指针 */ { Node *r; if(strcmp(nameornum,"num")==0) /*
24、按学号查询 */ { r=l->next; while(r!=NULL) { if(strcmp(r->data.num,findmess)==0) return r; r=r->next; } } else if(strcmp(nameornum,"name")==0) /* 按姓名查询 */ { r=l->next; while(r!=NULL) { if(strcmp(r->data.name,findmess)==0) return r; r=r->next; } } return 0; } v
25、oid Add(Link l) /* 增加学生 */ { Node *p,*r,*s; char num[10]; r=l; s=l->next; while(r->next!=NULL) r=r->next; /* 将指针置于最末尾 */ while(1) { printf("请你输入学号(以'0'返回上一级菜单:)"); scanf("%s",num); if(strcmp(num,"0")==0) break; while(s) { if(strcmp(s->data.num,num)==0) { printf("=
26、>提示:学号为'%s'的学生已经存在,若要修改请你选择'4 修改'!\n",num); printstart(); printc(); printe(s); printstart(); printf("\n"); return; } s=s->next; } p=(Node *)malloc(sizeof(Node)); strcpy(p->data.num,num); printf("请你输入姓名:"); scanf("%s",p->data.name); getchar(); printf("请你输入性别:");
27、 scanf("%s",p->data.sex); getchar(); printf("请你输入语文成绩:"); scanf("%d",&p->data.cgrade); getchar(); printf("请你输入数学成绩:"); scanf("%d",&p->data.mgrade); getchar(); printf("请你输入英语成绩:"); scanf("%d",&p->data.egrade); getchar(); p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrad
28、e; p->data.ave=p->data.totle / 3; /* 信息输入已经完成 */ p->next=NULL; r->next=p; r=p; shoudsave=1; } } void Qur(Link l) /* 查询学生 */ { int sel; char findmess[20]; Node *p; if(!l->next) { printf("\n=====>提示:没有资料可以查询!\n"); return; } printf("\n=====>1按学号查找\n=====>
29、2按姓名查找\n"); scanf("%d",&sel); if(sel==1)/* 学号 */ { printf("请你输入要查找的学号:"); scanf("%s",findmess); p=Locate(l,findmess,"num"); if(p) { printf("\t\t\t\t查找结果\n"); printstart(); printc(); printe(p); printstart(); } else Nofind(); } else if(sel==2) /* 姓名 */ { printf(
30、"请你输入要查找的姓名:"); scanf("%s",findmess); p=Locate(l,findmess,"name"); if(p) { printf("\t\t\t\t查找结果\n"); printstart(); printc(); printe(p); printstart(); } else Nofind(); } else Wrong(); } void Del(Link l) /* 删除 */ { int sel; Node *p,*r; char findmess[20];
31、 if(!l->next) { printf("\n=====>提示:没有资料可以删除!\n"); return; } printf("\n=====>1按学号删除\n=====>2按姓名删除\n"); scanf("%d",&sel); if(sel==1) { printf("请你输入要删除的学号:"); scanf("%s",findmess); p=Locate(l,findmess,"num"); if(p) { r=l; while(r->next!=p) r=r->next; r->next=p->next;
32、 free(p); printf("\n=====>提示:该学生已经成功删除!\n"); shoudsave=1; } else Nofind(); } else if(sel==2) { printf("请你输入要删除的姓名:"); scanf("%s",findmess); p=Locate(l,findmess,"name"); if(p) { r=l; while(r->next!=p) r=r->next; r->next=p->next; free(p); printf("\n=====>提示:该学生已经成
33、功删除!\n"); shoudsave=1; } else Nofind(); } else Wrong(); } void Modify(Link l) { Node *p; char findmess[20]; if(!l->next) { printf("\n=====>提示:没有资料可以修改!\n"); return; } printf("请你输入要修改的学生学号:"); scanf("%s",findmess); p=Locate(l,findmess,"num"); if(p) { pr
34、intf("请你输入新学号(原来是%s):",p->data.num); scanf("%s",p->data.num); printf("请你输入新姓名(原来是%s):",p->data.name); scanf("%s",p->data.name); getchar(); printf("请你输入新性别(原来是%s):",p->data.sex); scanf("%s",p->data.sex); printf("请你输入新的语文成绩(原来是%d分):",p->data.cgrade); scanf("%d",&p->data.cgrade); getc
35、har(); printf("请你输入新的数学成绩(原来是%d分):",p->data.mgrade); scanf("%d",&p->data.mgrade); getchar(); printf("请你输入新的英语成绩(原来是%d分):",p->data.egrade); scanf("%d",&p->data.egrade); p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade; p->data.ave=p->data.totle/3; printf("\n=====>提示:资料修改成功!\
36、n"); shoudsave=1; } else Nofind(); } void Disp(Link l) { int count=0; Node *p; p=l->next; if(!p) { printf("\n=====>提示:没有资料可以显示!\n"); return; } printf("\t\t\t\t显示结果\n"); printstart(); printc(); printf("\n"); while(p) { printe(p); p=p->next; } pr
37、intstart(); printf("\n"); } void Tongji(Link l) { Node *pm,*pe,*pc,*pt,*pa; /* 用于指向分数最高的接点 */ Node *r=l->next; if(!r) { printf("\n=====>提示:没有资料可以统计!\n"); return ; } pm=pe=pc=pt=pa=r; while(r!=NULL) { if(r->data.cgrade>=pc->data.cgrade) pc=r; if(r->data.mgrade>=pm->
38、data.mgrade) pm=r; if(r->data.egrade>=pe->data.egrade) pe=r; if(r->data.totle>=pt->data.totle) pt=r; if(r->data.ave>=pa->data.ave) pa=r; r=r->next; } printf("------------------------------统计结果--------------------------------\n"); printf("总分最高者:\t%s %d分\n",pt->data.name,
39、pt->data.totle); printf("平均分最高者:\t%s %d分\n",pa->data.name,pa->data.ave); printf("英语最高者:\t%s %d分\n",pe->data.name,pe->data.egrade); printf("数学最高者:\t%s %d分\n",pm->data.name,pm->data.mgrade); printf("语文最高者:\t%s %d分\n",pc->data.name,pc->data.cgrade); printstart(); } void Chinese(Link l)
40、 { Link ll; Node *p,*rr,*s; ll=(Link)malloc(sizeof(Node)); /* 用于做新的连表 */ ll->next=NULL; if(l->next==NULL) { printf("\n=====>提示:没有资料可以排序!\n"); return ; } p=l->next; while(p) { s=(Node*)malloc(sizeof(Node)); /* 新建接点用于保存信息 */ s->data=p->data; s->next=NULL; rr=ll;
41、 while(rr->next!=NULL && rr->next->data.egrade>=p->data.egrade) rr=rr->next; if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } free(l); l->next=ll->next; printf("\n=====>提示:排序已经完成!\n"); } void Maths(Link l) /*对数学排序*/ { Link ll; Nod
42、e *p,*rr,*s; ll=(Link)malloc(sizeof(Node)); /* 用于做新的连表 */ ll->next=NULL; if(l->next==NULL) { printf("\n=====>提示:没有资料可以排序!\n"); return ; } p=l->next; while(p) { s=(Node*)malloc(sizeof(Node)); /* 新建接点用于保存信息 */ s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL
43、 && rr->next->data.mgrade>=p->data.mgrade) rr=rr->next; if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } free(l); l->next=ll->next; printf("\n=====>提示:排序已经完成!\n"); } void English(Link l) /*对英语排序*/ { Link ll; Node *p,*rr,*s; l
44、l=(Link)malloc(sizeof(Node)); /* 用于做新的连表 */ ll->next=NULL; if(l->next==NULL) { printf("\n=====>提示:没有资料可以排序!\n"); return ; } p=l->next; while(p) { s=(Node*)malloc(sizeof(Node)); /* 新建接点用于保存信息 */ s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data
45、cgrade>=p->data.cgrade) rr=rr->next; if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } free(l); l->next=ll->next; printf("\n=====>提示:排序已经完成!\n"); } void select(Link l) { int i; int j,k; Node *pc =
46、 l; //用于指向分数最高的接点 Node *r=l->next; if(!r) { printf("\n=====>提示:没有资料可以筛选!\n"); return ; } printf("输入课程名1.语文2.数学3.英语"); scanf("%d",&i); if(i==1) { printf("请输入筛选分数的上限:"); scanf("%d",&j); printf("请输入筛选分数的下限:"); scanf("%d",&k
47、);
printf("------------------------------筛选结果-----------------------------------------------------------\n");
printf("学号\t 姓名\t 性别 语文成绩 数学成绩 英语成绩 总分 平均分\n");
printstart();
while(r!=NULL)
{
if(k<=(r->data.egrade)&&(r->data.egrade) 48、r);
r=r->next;
}
}
else if(i==2)
{
printf("请输入筛选分数的上限:");
scanf("%d",&j);
printf("请输入筛选分数的下限:");
scanf("%d",&k);
printf("------------------------------筛选结果-----------------------------------------------------------\n");
printf("学号\t 姓名\t 49、 性别 语文成绩 数学成绩 英语成绩 总分 平均分\n");
printstart();
while(r!=NULL)
{
if(k<=(r->data.mgrade)&&(r->data.mgrade) 50、"%d",&k);
printf("------------------------------筛选结果-----------------------------------------------------------\n");
printf("学号\t 姓名\t 性别 语文成绩 数学成绩 英语成绩 总分 平均分\n");
printstart();
while(r!=NULL)
{
if(k<=(r->data.cgrade)&&(r->data.cgrade)
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818