收藏 分销(赏)

数据结构专业课程设计学生成绩标准管理系统.docx

上传人:二*** 文档编号:4514721 上传时间:2024-09-26 格式:DOCX 页数:41 大小:835.66KB 下载积分:5 金币
下载 相关 举报
数据结构专业课程设计学生成绩标准管理系统.docx_第1页
第1页 / 共41页
本文档共41页,全文阅读请下载到手机保存,查看更方便
资源描述
课 程 设 计 报 告 ] 课程名称 数据结构 课题名称 学生成绩管理系统 专 业 通信工程 班 级 1301 学 号 0302 姓 名 momom 指导老师 张鏖烽 彭帧 黄哲 7月 2日 湖南工程学院 课 程 设 计 任 务 书 课程名称 数据结构 课 题 学生成绩管理系统 专业班级 通信工程1301 学生姓名 momom 学 号 0302 指导老师 张鏖烽 彭帧 黄哲 审 批 张鏖烽 任务书下达日期 6月 29日 任 务 完成日期 7月 5日 目 录 一、课程设计分析 4 1.课程设计目标: 4 2.课程设计题目 4 3.需求分析 5 二、概要设计 5 三、具体设计 6 四、调试分析 11 (1)调试过程中碰到问题 11 (2)经验和体会 11 五、用户使用说明 12 六、测试结果 13 七、附录 18 八、课程设计评分表 37 一、课程设计分析 1.课程设计目标: 课程设计是对学生一个全方面综合训练,是和课堂听讲、自学和练习相辅相成必不可少一个教学步骤。通常,实习题中问题比平时习题复杂得多,也更靠近实际。实习着眼于原理和应用结合点,使读者学会怎样把书上学到知识用于处理实际问题,培养软件工作所需要动手能力;其次,能使书上知识变“活”,起到深化了解和灵活掌握教学内容目标。平时练习较偏重于怎样编写功效单一“小”算法,而实习题是软件设计综合训练,包含问题分析、总体结构设计、用户界面设计、程序设计基础技能和技巧,多人合作,以至一整套软件工作规范训练和科学作风培养。 2.课程设计题目 【课题】 学生成绩管理系统 【问题描述】 依据自己这个学期课程表,设计一个成绩管理系统管理自己班成绩;每个学生统计包含学号、姓名、每门课程成绩、总分和加权平均分。 【基础要求】 一个完整成绩管理系统应含有以下功效: (1)输入:成绩录入; (2)输出:输出成绩表; (3)插入:在成绩表中合适位置插入某个学生成绩; (4)删除:在成绩表中删除某个学生成绩; (5)查找:依据某个关键字查找某个学生成绩; (6)排序:依据某一个或某多个关键字进行排序; (7)筛选:依据某个关键字筛选出符合一些条件数据; 【测试数据】 用本班成绩总表作为测试数据。 3.需求分析 此次课程设计题目是学生成绩管理系统,要求能够存入学生,学生信息包含学生学号、姓名、每科成绩和平均成绩和加权平均成绩等。该系统关键有以下七个功效,即对学生信息进行:输入、输出、插入、删除、查找、排序、筛选等功效。 对学生进行操作能够有很多思绪,而我选择是单链表村学生信息那一条思绪,即设置一个单链表,其中节点数据域保留学生基础信息。因为我们学号比较长,用整型数据无法保留,所以我定义char型字符串来保留学号和姓名。用一个数组来保留学生每一科成绩,另外在定义一个总分和平均分变量。定义学生以下:typedef struct Student { char mun[12]; //学号 char name[20]; //姓名 float score[8]; //成绩 float all_score; //总分 float ave_score; //加权平均分 struct Student *next; }LinkList; 二、概要设计 本程序采取链表方法将每一个学生设置成为一个链表中数据节点,节点中有字符型mun[12](学号)、name[20](姓名)、浮点型数据score[8](放置每一科成绩数组)、all_score(总分)和ave_score(加权平均分)。 主函数中在实施成绩管理系统之前会先创建一个链表,并调用void InitList (LinkList *&L)函数来初始化链表;以后进入菜单选择项选择功效进行操作,主程序步骤图以下: 三、具体设计 1、添加学生: 2、输出学生: 创建节点s LinkList *p=L->next; 输入学生信息,计算总分和加权分 for(m=1;m<=总人数&&p!=NULL;m++) r->next=s;r=s;(尾插法插入链表) 输出学生信息,p=p->next count=count+1;学生总数加1 3、插入学生 4、删除学生 输入要插入位置 数字选择删除方法 scanf("%d",&w); 按编号删除和学号删除 调用插入函数 1编号 调用Delete_Student Insert_Student(h,w); 2学号 调用Locate_Student找到 学生位置,在用Delete_Student 步骤图以下: Insert_Student 函数 Delete_Student函数步骤图: Locate_Student函数步骤图和以下:Locate_Student1步骤图类似,不再反复了 5查找学生:调用Seek_Student函数,分为按学号查找和按姓名查找 1按编号 调用Locate_Student函数返回i在调用Out_one_Student输出第i个学生 2 按姓名调用Locate_Student1函数返回i在调用Out_one_Student输出第i个学生 6排序函数 调用Queue_Student函数:其中有按学号,总分,各科成绩排序 我这里采取是冒泡排序法进行排序,分别定义了两个节点指针q指向头指针p指向q下一个节点,在进入双重循环进行比较排序 步骤图以下: 排序方法全部类似,知识比较数据不一样,所以就没有一一画出来了 7 筛选 创建另一个链表r用于存筛选出来学生,并调用output_Student函数输出 筛选程序步骤图以下: 筛选程序又分为1 按总分选 2 全部及格人 3 按各科成绩 1 而总分筛选关键是输入一个数值,判定数据是否大于输入数据,大于全部输出 2 去不多个人经过比较每一科成绩是否全部大于60分,大于就选出插入新链表并输出 3 各科成绩话是只比较其中一科来创建链表并输出 其比较步骤图全部如上图所表示,这里便不再一一画出来了。 四、调试分析 (1)调试过程中碰到问题是怎样处理和对设计和实现回顾讨论和分析 在调试过程中碰到第一个问题是输出学生问题,因为输出问题,其中总是发觉输出乱码,找了很久,以后最终发觉是输入时出了问题,因为姓名我定义了字符串型,而字符串长度我定义了20,在创建节点时候我却把name[20]给了学生节点,造成输出时地址错误而输出乱码。 第二个问题是查找,我开始一直想不到怎么把查找到学生输出,以后想了很久,找到了方法,我先经过查找关键字去找到该学生是在链表那个位置,在经过返回位置值来输出想要输出那个学生,所以就定义了Locate_Student和Out_one_Student来完成查找功效。 第三个问题是筛选功效实现,我原来想经过比较,将符合关键字学生筛选出来在输出,结果发觉输出函数是已经定义成一次性全部输出形式。造成我一直想不到好方法来进行这个功效代码编写。以后经过老师指导,我知道了一个新方法来编写,就是经过创建一个新学生链表来存已经筛选出来学生。然后在经过输出函数来将新链表进行输出,这么就能够达成筛选目标。 改善方法:现在想了一下,其实能够将输出函数进行改善,改成一个一个学生输出形式,在经过一个判定语句进行选择性输出,用这个输出方法能够降低代码量,而达成一样效果。 第四个问题是主函数问题,因为我想让主函数看起来简练一点,就把主函数分成两部分,一部分用于选择操作,另一部分用于进行选择好操作,可是这么一来却出现了问题,就是输出数据以后无法暂停在输出界面,而是闪了一下就退出来进入主界面了,这个问题我开始认为是输出函数问题,结果我去改了输出函数,结果还是无法停留。以后知道原因了,主函数退出switch循环以后会立即回到主菜单界面,到时无法停在输出界面。我在主函数最终加一个system(“pause”)以后才打到能够观察到地方。 改善方法:能够将主函数定义成一个,不用分开,去掉for(;;)这个循环会好点。 (2)经验和体会 此次课程设计题目我一开始看到时候认为很轻易就能做出来,所以只是大约想了一下思绪,就直接开始了,其实这个试验能够用次序表做会思绪更清楚部分,我没有选择次序表来做,因为我在单链表这一部分有点模糊,所以想挑战一下用单链表来做。这个程序每一个代码全部是我经过一步一步分析写出来,在编写过程中碰到了很多阻碍,很多自己无法预知错误,在不停找错过程中,我感觉到自己在c语言这首先不足,对算法精髓还不是很了解, 对于单链表操作也不是很熟练,尤其是在节点指针多起来时候会有点乱,甚至搞不清指针到底指向哪里了。 然而,在编程过程中,一次次测试失败,再一次次修更正确却让我慢慢熟悉了数据结构部分使用方法,逐步知道要编写一个系统,需要多种功效协调才能算一个系统,而每一个功效有需要很多函数之间相互联络来调用和支撑。同时要想将课程设计完成好,就需要主动提问,碰到不懂地方能够找老师或同学相互交流经验,这么才会愈加有效率完成课设。 经过这一段时间课设,我学到不仅仅是数据结构想关知识,也知道了团体协作关键性,知道学习需要真正扎实去学习,这么才能真正学到知识,并灵活利用这些所学知识。 五、用户使用说明 1、添加学生功效:进入系统后先选择1回车即可进入输入界面,然后根据提醒输入学生学号、姓名和数据结构、数字信号处理、数字电子技术基础分数在按回车,假如还想再继续添加就按1继续,不然能够按任何键退出。 2、输出学生:用户在输入完学生数据后既能够按2输出所输入全部学生 3、插入学生:用户需在主界面按3即能够进入插入界面,此时能够按数字键在选择要插入位置,如输入1即能够将要插入学生插入到第一个位置,能够在主界面输入2进行查看是否插入到指定位置。 4、删除学生:用户能够在主界面输入4进入删除,在经过选择编号来删除要删除学生。 5、查找:查找查找功效有按学号和姓名查找,如按一进入学号查找,能够输入要查找学号,回车即能够输出要查找学生。 6、排序:排序能够经过学号,总分,和各科成绩,输入1能够按学号从小到大排序,输入2能够按总分从小到大进行排序,输入3能够进入科目选择,再按1进行数据结构排序,2进行数字型号处理排序,3进行数电排序。 7、筛选:能够按1进入总分筛选,进入以后输入筛选多少分以上人,输入分数,如:200,即可输出全部大于200分学生;在筛选界面输入2能够输出全部及格学生;按3能够进入各科成绩筛选,再按1选出全部数据结构及格学生、再按2选出全部数字信号处理及格学生、再按3选出全部数字电子技术基础及格学生。 8、退出:退出程序只需要在主界面按0再回车即能够退出程序。 六、测试结果 1、添加学生: 2、输出学生: 3、 插入学生: 4、删除学生: 5、查找学生: 6、排序 7、筛选 0、退出程序: 七、附录 #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h> int count =0; //统计学生人数 typedef struct Student { char mun[12]; //学号 char name[20]; //姓名 float score[8]; //成绩 float all_score; //总分 float ave_score; //加权平均分 struct Student *next; }LinkList; void InitList (LinkList *&L) //初始化链表 { L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL; } void Creat_Student (LinkList *&L) //输入学生并添加到链表里面 { LinkList *r=L,*s; int i=0,j=1; float all=0,ave,a[8]; while(j==1) { while(r->next!=NULL) r=r->next; s=(LinkList *)malloc(sizeof(LinkList)); s->next=NULL; printf("输入学生学号、姓名、每科成绩\n"); printf("学号:"); scanf("%s",&s->mun); printf("姓名:"); scanf("%s",&s->name);/*数据结构3.0、数字信号处理4.0、数字电子技术基础2.5 这里只输入三门成绩作为示范*/ for(i=0;i<3;i++) { if(i==0) { printf("输入数据结构分数\n"); scanf("%f",&a[i]); s->score[i]=a[i]; } if(i==1) { printf("输入数字信号处理分数\n"); scanf("%f",&a[i]); s->score[i]=a[i]; } if(i==2) { printf("输入数字电子技术基础分数\n"); scanf("%f",&a[i]); s->score[i]=a[i]; } } all=a[0]+a[1]+a[2]; s->all_score=all; ave=(a[0]*3.0+a[1]*4.0+a[2]*2.5)/9.5; s->ave_score=ave; r->next=s; r=s; count=count+1; printf("是否继续?(按1继续,其它退出。)"); scanf("%d",&j); } } void output_Student (LinkList *&L,int n) //输出全部学生 { LinkList *p=L->next; if(p==NULL) { printf("没有学生成绩!请添加学生。。。\n"); return; } printf("\t\t 学生成绩表 \n"); printf("编号 学号 姓名 数据结构 数字信号 数字电路 总分 加权平均分\n"); int m; for(m=1;m<=n&&p!=NULL;m++) { printf("%-5d%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f %-10.1f\n",m,p->mun,p->name,p->score[0],p->score[1],p->score[2],p->all_score,p->ave_score); p=p->next; } } void Delete_Student(LinkList *&L,int i) //删除第i个学生 { int j=0; LinkList *p=L,*q; if (i<=0) { printf("没有找到该学生"); return; } while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) { printf("没有找到该学生"); return ; } else { q=p->next; if(q==NULL) return ; p->next=q->next; free(q); count=count-1; printf("删除成功!\n"); return; } } int Locate_Student(LinkList *L,char* mun) //按学号定位,返回第i个学生 { int i=1; LinkList *p=L->next; while(p!=NULL&&strcmp(p->mun,mun)!=0) { i++; p=p->next; } if(p==NULL) return (0); else return (i); } int Locate_Student1(LinkList *L,char* name) //按姓名定位,返回第i个学生 { int i=1; LinkList *p=L->next; while(p!=NULL&&strcmp(p->name,name)!=0) { i++; p=p->next; } if(p==NULL) return (0); else return (i); } void Queue_Subject(LinkList *&L) //不一样科目排序 { int i; LinkList *q,*p,*t1,*t2; printf("请输入科目标代号:1 数据结构 2 数字信号处理 3 数电\n请输入:"); scanf("%d",&i); if(i>=1||i<=3) { for(q=L;q->next!=NULL;q=q->next) for(p=q->next;p->next!=NULL;p=p->next) { if(q->next->score[i-1]>p->next->score[i-1]) { if(q->next==p) { t1=p->next; p->next=p->next->next; t1->next=q->next; q->next=t1; p=t1; } else { t1=p->next; t2=q->next; p->next=p->next->next; q->next=q->next->next; t1->next=q->next; q->next=t1; t2->next=p->next; p->next=t2; } } } } else { printf("没有找到该科目!\n"); return; } } void Queue_Student(LinkList *&L) //排序函数 { int i,j=1; printf("1、根据学号 2、总分3、按各科分排序\n请输入:"); scanf("%d",&i); LinkList *q,*p,*t1,*t2; switch(i) { case 1: //学号排序 for(q=L;q->next!=NULL;q=q->next) for(p=q->next;p->next!=NULL;p=p->next) { if(strcmp(q->next->mun,p->next->mun)==1) { if(q->next==p) { t1=p->next; p->next=p->next->next; t1->next=q->next; q->next=t1; p=t1; } else { t1=p->next; t2=q->next; p->next=p->next->next; q->next=q->next->next; t1->next=q->next; q->next=t1; t2->next=p->next; p->next=t2; } } } break; case 2: //总分排序 for(q=L;q->next!=NULL;q=q->next) for(p=q->next;p->next!=NULL;p=p->next) { if(q->next->all_score>p->next->all_score) { if(q->next==p) { t1=p->next; p->next=p->next->next; t1->next=q->next; q->next=t1; p=t1; } else { t1=p->next; t2=q->next; p->next=p->next->next; q->next=q->next->next; t1->next=q->next; q->next=t1; t2->next=p->next; p->next=t2; } } } break; case 3: Queue_Subject(L); //科目排序 break; } } void Out_one_Student(LinkList *L,int i) //输出第i个学生 { int j=0; LinkList *p=L; while(j<i) { j++; p=p->next; } printf("%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f %-10.1f\n",p->mun,p->name,p->score[0],p->score[1],p->score[2],p->all_score,p->ave_score); } int Seek_Student(LinkList *L) //查找学生 1 按学号查找 2 按姓名查找 { int m; printf("1 按学号查找 2 按姓名查找 3 退出\n请输入:"); scanf("%d",&m); switch(m) { case 1: char a[12]; printf("输入学号:"); scanf("%s",&a); return (Locate_Student(L,a)); //返回学号查找到值 break; case 2: char b[20]; printf("输入姓名:"); scanf("%s",&b); return(Locate_Student1(L,b)); break; case 3: break; } } void Filter_Student(LinkList *&L) //筛选 { LinkList *s,*p=L->next,*r,*q; int y,count2=0; printf("1 按总分选 2 全部及格人 3 按各科成绩 4 退出\n请输入:"); scanf("%d",&y); switch(y) { case 1: s=(LinkList *)malloc(sizeof(LinkList)); q=s; int i; float all; printf("您要总分多少分以上人,请输入:"); scanf("%f",&all); for (i=0;i<count;i++,p=p->next) { if (p==NULL) { printf("没有"); return; } if(p->all_score>all) { r=(LinkList *)malloc(sizeof(LinkList)); strcpy(r->mun,p->mun); strcpy(r->name,p->name); r->score[1]=p->score[1]; r->score[2]=p->score[2]; r->score[0]=p->score[0]; r->all_score=p->all_score; r->ave_score=p->ave_score; q->next=r; q=q->next; q->next=NULL; count2++; } } output_Student(s,count2); free(s); break; case 2: s=(LinkList *)malloc(sizeof(LinkList)); q=s; int j; for (j=0;j<count;j++,p=p->next) { if (p==NULL) { printf("没有"); return; } if(p->score[0]>59&&p->score[1]>59&&p->score[2]>59) { r=(LinkList *)malloc(sizeof(LinkList)); strcpy(r->mun,p->mun); strcpy(r->name,p->name); r->score[1]=p->score[1]; r->score[2]=p->score[2]; r->score[0]=p->score[0]; r->all_score=p->all_score; r->ave_score=p->ave_score; q->next=r; q=q->next; q->next=NULL; count2++; } } output_Student(s,count2); free(s); break; case 3: s=(LinkList *)malloc(sizeof(LinkList)); q=s; int k,x; printf("选择 1 数据结构及格 2 数字信号处理及格 3 数电及格\n"); printf("请输入:"); scanf("%d",&x); for (k=0;k<count;k++,p=p->next) { if (p==NULL) { printf("没有"); return; } if(p->score[x-1]>59) { r=(LinkList *)malloc(sizeof(LinkList)); strcpy(r->mun,p->mun); strcpy(r->name,p->name); r->score[1]=p->score[1]; r->score[2]=p->score[2]; r->score[0]=p->score[0]; r->all_score=p->all_score; r->ave_score=p->ave_score; q->next=r; q=q->next; q->next=NULL; count2++; } } output_Student(s,count2); free(s); break; case 4: break; } } bool Insert_Student(LinkList *&L,int i) //插入学生 { int j=0; LinkList *p=L,*s; if (i<=0) { printf("对不起,没有该位置!\n"); return false; } while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) { printf("对不起,没有该位置!\n"); return false; } else { s=(LinkList *)malloc(sizeof(LinkList)); s->next=NULL; float all,ave,score; printf("输入学生学号、姓名、每科成绩\n"); printf("学号:"); scanf("%s",&s->mun); printf("姓名:"); scanf("%s",&s->name); for(i=0;i<3;i++) { if(i==0) { printf("输入数据结构分数\n"); scanf("%f",&score); s->score[i]=score; } if(i==1) { printf("输入数字信号处理分数\n"); scanf("%f",&score); s->score[i]=score; } if(i==2) { printf("输入数字电子技术基础分数\n"); scanf("%f",&score); s->score[i]=score; } } all=s->score[1]+s->score[2]+s->score[0]; s->all_score=all; ave=(s->score[0]*3.0+s->score[1]*4.0+s->score[2]*2.5)/9.5; s->ave_score=ave; s->next=p->next; p->next=s; count++; printf("插入成功\n"); return true; } } int menu_select() /*菜单选择程序*/ { int c; do{ system("cls"); printf("\n\t 欢迎使用学生成绩管理系统 \n"); printf("\t 1. 添加学生 \n"); printf("\t 2. 输出学生 \n"); printf("\t 3. 插入学生 \n"); printf("\t 4. 删除学生 \n"); printf("\t 5. 查找学生 \n"); printf("\t 6. 排序 \n"); printf("\t 7. 筛选 \n"); printf("\t 0. 退出程序 \n"); printf("\t **************************\n"); printf("\t 请您选择(0-7):"); scanf("%d",&c); } while(c<0||c>7); return(c); } void main() { LinkList *h; InitList(h); //初始化 for(;;) { switch(menu_select()) { case 1: //添加学生 Creat_Student(h); //添加学生 break; case 2: output_Student(h,count); //输出全部学生 break; case 3: //插入 int w; printf("输入插入位置,位置为大于或等于
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服