1、装订线长 春 大 学 课程设计纸目 录一 设计题目1二 设计目的1三 算法思想分析1四 算法描述与实现1五 结论1一、 设计题目实验内容成绩分析问题问题描述录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。需求分析(1)通过键盘输.入各学生的多门课程的成绩,建立相应的文件input.dat。(2)对文件input.dat中的数据进行处理,要求具有如下功能:1) 按各门课程成绩排序,并生成相应的文件输出。2) 计算每人的平均成绩,按平均成绩排序,并生成文件。3) 求出各门课程的平均成绩、最高分、最低分、不及格人数、6069分人数、7079分人数、8089分人数、90分以上人数。4) 根据姓
2、名或学号查询某人的各门课成绩,重名情况也能处理。(3)界面美观。二、 设计目的 了解软件工程中的一些系统分析,模块分析,代码设计的概念,实现学生成绩管理系统的录入、查询、删除、统计等基本操作,使用单链表结构实现学生成绩管理,了解数据库管理的基本功能,掌握C语言中的结构体、指针、函数(系统函数、自定义函数)、文件操作等知识。通过对系统的分析和设计,进一步巩固C语言的学习,以提高对开发环境的进一步认识和综合编程能力。三、算法思想分析 1,、基本思想 建立一个学生成绩管理系统能够实现每位学生的成绩的录入、删除、修改、查找、排序按成绩降序排序等功能。 2、 原理 首先定义项目的数据结构然后将每个功能写
3、成一个函数来完成对数据的操作然后完成主函数以验证各个函数功能并得出运行结果最后调试改进3、 概要设计int right(STD *h,int i); / 查看学号 i 是否存在void newstu(STD *h); / 新增一个学生STD *find(STD *h,char nam); / 查找姓名为nam的学生,返回该学生上一结点的地址STD *find(STD *h,char num); / 查找学号为mum的学生,返回该学生上一结点的地址void show(STD *p,int i); / 输出结点p的信息,若 i=0 只输出姓名和学号,i=1,输出全部信息void show(STD
4、*h); / 按提示输出学生的信息void intoscores(STD *h); / 按提示录入学生的成绩void sort(STD *h,int a,int b); /*对学生信息排序,a为0以数学成绩为关键字排序 a=1-4为英语成绩、计算机成绩、总成绩、学号。b=0为降序,b=1为升序*/void cjjpx(STD *h); / 按提示对学生信息排序void tjcj(STD *h); / 统计学生成绩void del(STD *h); / 按提示删除学生int into(STD *h); / 从文件中读数据放在头结点为h的链表中int save(STD *h); / 将头结点为h的
5、链表数据保存在文件中4、 存储结构 struct STD /学生信息链表char name20; /姓名int number; /学号int scores4; /各科成绩struct STD *next;/指向下一结点的指针;struct STDD / 记录数据char name20;/姓名int number; /学号int scores4; /各科分数;5、 流程图 p=h-nextwhile(p!=NULL)Student.number=p-number?YNreturn(0);p=p-next;return(1);int right(STD *h,STDD student); /判断学
6、号student.number是否存在void newstu(STD *h) STD *find(STD *h,char name)/添加一个新学生 /以姓名为关键字STD *p=h;STDD student;while(p-next!=NULL)p=p-next;输入学生学号scanf(“%d”,&student.number);while(right(h,student)=0)输入学生学号scanf(“%d”,&student.number)scanf(“%s”,q-name);q=(STD *)malloc(sizeof(STD);q-number=student.number;for(
7、i=0;iscoresi=0;p-next=q;q-next=NULL;STD *p=h;while(p-next!=NULL)YNreturn (p);p=p-next;return (p);strcmp(name,p-name)=0 ? STD *find(STD *h,char name) /以学号为关键字STD *p=h;while(p-next!=NULL)YNreturn (p);p=p-next;return (p);p-number=num?void intoscores(STD *h) / 录入学生的成绩STD *p; STDD student; int i; char xz
8、;xz=getch();xzxz=1;xz=1;scanf(“%d”,&student.number);p=find(h,student.number);p-next!=NULL;YN输入成绩存放在p-next中p=h-next;while(p!=NULL)show(p,0);输入成绩放入p中;p=p-next;录 入 成 绩 结 束提示没有该学号void show(STD *h) /输出学生信息STD *p; STDD student; char xz; inti=0;xz=getch();xzxz=1;xz=2;xz=1;xz=2;xz=getch();xzscanf(“%d”,&stud
9、ent.numberscanf(“%s”,&student.namep=find(h,student.number;p-next!=NULLYNshow(p-next,1);p=find(h,student.number;while(p!=NULL)show(p-next,1);p=find(p-next,student.namep=h-next;while(p!=NULL)show(p,1);p=p-next;输 出 结 束void tjcj(STD *h) /学生信息统计STD *p=h-next; int av54,sum4,i,k=0,mix4,max4; for(i=0;i4;i+)
10、for(k=0;k5;k+)avki=0;sumi=0; mixi=100;maxiwile(p!=NULL)for(i=0;inext信息统计结束void sort(STD *h,int a,int b) /对学生信息按要求进行排序int i; STD student; STD *p=h,*q;b=0?while(p-next!=NULL);q=p-next;while(q-next!=NULL) a=4?YNp-next-number q-next-numberYNp-next-scoresa q-next-scoresaYN交换p、q下一结点的数据q=q-next;p=p-nextwhi
11、le(p-next!=NULL;)while(p-next!=NULL;) a=4?q=p-next;while(q-next!=NULL)NYp-next-number next-numberY交换p、q下一结点的数据交换p、q下一结点的数据p=p-next;排 序 完 成Np-next-scoresa next-scoresaq=q-next;NY交换p、q下一结点的数据void del(STD *h) /删除学生STD *p,*q;int xz;int i;xz=getch();xzxz=2scanf(“%d”,&i);p=find(p,i);p!=NULLYNq=p-next;p-ne
12、xt=q-next;free(q);while(p-next!=NULL)q=p-next;p-next=q-next;free (q);删 除 完 成四、算法描述与实现1、上机调试与程序实现2、源代码 / 成绩分析问题.cpp #include#include#include#includestruct STD /学生成绩链表char name20; /学生姓名int number; /学生学号int scores4; /学生成绩struct STD *next; /指向下一学生结点;struct STDD /学生结点char name20;int number;int scores4;in
13、t right(STD *h,STDD student)STD *p; /定义结点p,使之在链表中遍历p=h-next; /p指向头结点的下一个结点开始遍历while(p!=NULL) /判断p是否为空if(student.number=p-number)/否p不为空再判断学号是否相同return (0); /若学号相同,返回0p=p-next; /若学号不同,p指向下一结点继续比较return (1); /若学号都没相同的,返回1。void newstu(STD *h)STDD students; /定义STDD结构体变量students来存储一些数据int i; /定义整型变量STD *p
14、,*q; /定义STDD链表结点p=h; /p指向头结点while(p-next!=NULL) /找到最后一个结点p=p-next;system(cls & title 学生注册);printf(nnn);printf( nn);printf( 请输入要注册学生的学号 );scanf(%d,&students.number); /输入注册的学号while(right(h,students)=0) /判断该学号是否存在,若存在,就重新输入printf(an 学号有重复,请重新输入 按任意键继续 );getch();system(cls & title 学生注册);printf(nnn);prin
15、tf( nn);printf( 请输入要注册学生的学号 );scanf(%d,&students.number);printf(n 请输入要注册学生的姓名 );q=(struct STD *)malloc(sizeof(STD);/给q分配内存scanf(%s,q-name); /输入姓名q-number=students.number; /将输入的学号存入q中for(i=0;iscoresi=0;p-next=q; /将q联结在p的后面q-next=NULL; /q为最后一结点printf(nn);printf( nn);printf( 你注册以以上信息的学生 按任意键返回 );getch(
16、);printf(n );void show(STD *p,int i)if(i=0) /若i=0只输出姓名和学号printf( 学号 %d 姓名 %s n,p-number,p-name);else /若i=0输出全部信息printf( %3d %6s %4d %4d %4d %4d %4.1fn,p-number,p-name,p-scores0,p-scores1,p-scores2,p-scores3,(p-scores3*1.0)/3);STD *find(STD *h,char name)STD *p=h; /定义链表指针使之对成绩链表进行遍历while(p-next!=NULL)
17、 /只要p不为最后一结点if(strcmp(p-next-name,name)=0)/比较姓名return (p); /若姓名一样,返回该姓名的上一结点pp=p-next; /若不一样,p向下继续搜索return (p); /若都不一样,返回最后一结点pSTD *find(STD *h,int num)STD *p;p=h;while(p-next!=NULL)if(p-next-number=num)return (p);p=p-next;return (p);void show(STD *h)system(cls & title 查看成绩);STD *p; /定义链表指针STDD stud
18、ent; /定义记录变量char xz; /定义字符xz来进行菜单的选择int i=0; /定义整型常量iprintf(nn);printf( nn);printf( 成 绩 查 看 nn);printf( nn);printf( 1 : 查 看 全 部nn);printf( 2 : 查 看 单 个nn);printf( 0 : 返 回nn);printf( nn);printf( 输入你的选择 :);xz=getch();switch(xz) /判断xz的值case 1:system(cls);p=h-next;printf(nn);printf( nn);if(p!=NULL)printf
19、( 学 号 姓 名 语 文 数 学 计算机 总 分 平均分nn);while(p!=NULL) /只要p不为空,输出该结点的信息show(p,1);p=p-next; /指向下一结点i+;if(i=0)printf( 没 有 学 生n);else printf(n 一共输出了 %d 名学生的信息,i);printf(nn);printf( nn);printf( 按 任 意 键 返 回 );getch();break;case 2:system(cls);printf(nn);printf( nn);printf( 成 绩 查 看 nn);printf( nn);printf( 1 : 学 号
20、nn);printf( 2 : 姓 名nn);printf( 0 : 返 回nn);printf( nn);printf( 输入你的选择 :);xz=getch();switch(xz)case 1:system(cls);printf(nnnn);printf( nn);printf( 请输入学号 );scanf(%d,&student.number);/输入要输出学生的学号p=find(h,student.number); /以学号为关键字查找if(p-next!=NULL) /只要p的下一结点不为空,输出p的下一结点的信息printf( 学 号 姓 名 语 文 数 学 计算机 总 分 平
21、均分nn);show(p-next,1);elseprintf( 没 有 该 学 生 n);printf(nn);printf( nn);printf( 按 任 意 键 返 回 );getch();break;case 2:system(cls);printf(nnnn);printf( nn);printf( 请输入姓名 );scanf(%s,student.name);/输入姓名p=find(h,student.name); /经姓名为关键字查找if(p-next!=NULL) /p的下一结点是否为空printf( 学 号 姓 名 语 文 数 学 计算机 总 分 平均分nn);while(
22、p-next!=NULL)i+;show(p-next,1);/输出p的下一结点的信息p=find(p-next,student.name);/从p下一结点开始继续搜索,看是还有学生为该名,有则输出if(i=0)printf( 没 有 该 学 生n);else printf(n 一共输出了 %d 名学生的信息,i);printf(nn);printf( nn);printf( 按 任 意 键 返 回 );getch();break;void intoscores(STD *h)int i;char xz; /记录选择的菜单编号STDD student; /记录信息STD *p; /对链表进行遍
23、历system(cls & title 成绩输入);printf(nnn);printf( nn);printf( 成 绩 录 入nn);printf( nn);printf( 1: 录 入 全 部 学 生 成 绩nn);printf( 2: 录 入 单 个 学 生 成 绩nn);printf( 0: 返 回nn);printf( nn);printf( 请 输 入 你 的 选 择 );xz=getch();printf(%c,xz);system(cls);printf(nnn);printf( nn);printf( 成 绩 录 入nn);printf( nn);switch(xz) /判
24、断输出菜单的编号case 1:p=h-next; /p指向头结点的下一结点i=0;while(p!=NULL) /p是否为空show(p,0); /输出p的姓名和学号,下面按提示输入成绩printf(n);printf( 请输入数学成绩 );scanf(%d,&p-scores0);while(p-scores0100 | p-scores00)/若成绩不正确,重新输入printf( 请输入数学成绩 );scanf(%d,&p-scores0);printf( 请输入英语成绩 );scanf(%d,&p-scores1);while(p-scores1100 | p-scores10)prin
25、tf( 请输入英语成绩 );scanf(%d,&p-scores1);printf( 请输入计算机成绩 );scanf(%d,&p-scores2);while(p-scores2100 | p-scores20)printf( 请输入计算机成绩 );scanf(%d,&p-scores2);p-scores3=p-scores0+p-scores1+p-scores2;/计算总分p=p-next; /指向下一结点继续输入成绩i+;printf(n);printf( 你一共录入了 %d 名学生的成绩nn ,i);printf( nn);printf( 按 任 意 键 返 回 );getch()
26、;break;case 2:printf( 请输入要录入学生的学号 );scanf(%d,&student.number); /输入学生的学号p=find(h,student.number); /找到为该学号的学生printf(n);show(p-next,0); /输出学生姓名,学号printf(n);printf( 请输入数学成绩 );/输入成绩scanf(%d,&p-next-scores0);while(p-next-scores0100 | p-next-scores00)printf( 请输入数学成绩 );scanf(%d,&p-next-scores0);printf( 请输入英
27、语成绩 );scanf(%d,&p-next-scores1);while(p-next-scores1100 | p-next-scores10)printf( 请输入英语成绩 );scanf(%d,&p-next-scores1);printf( 请输入计算机成绩 );scanf(%d,&p-next-scores2);while(p-next-scores2100 | p-next-scores20)printf( 请输入计算机成绩 );scanf(%d,&p-next-scores2);p-next-scores3=p-next-scores0+p-next-scores1+p-nex
28、t-scores2;break;void sort(STD *h,int a,int b)int i;STDD student; /定义记录变量STD *p,*q; /定义链表变量p=h; /从头开始if(b=0) /若b=0,为升序while(p-next!=NULL) /只要p不为最后一结点q=p-next; /q为p的下一结点while(q-next!=NULL) /q不为最后一结点if(a=4) /若a=4,则以学号为关键字排序if(p-next-number q-next-number) /比较学号的大小,满足则交接两者student.number=p-next-number;p-next-number=q-next-number;q-next-number=student.number;strcpy(student.name,p-next-name);strcpy(p-next-name,q-next-name);strcpy(q-next-name,student.name);for(i=0;inext-scoresi;p-next-scoresi=q-next-scoresi;q-next-scoresi=student.scoresi;