《学生成绩管理系统 C语言.doc》由会员分享,可在线阅读,更多相关《学生成绩管理系统 C语言.doc(22页珍藏版)》请在装配图网上搜索。
______________________________________________________________________________________________________________
福建工程学院计算机与信息科学系
实验报告
2012 – 2013 学年第 1 学期 任课老师: 章静
课程名称
结构化程序综合设计
班级
计算机1001
座号
3100301114
姓名
张扬文
实验题目
学生成绩管理系统
实验时间
实验开始日期:2012/2/24
报告提交日期:2012/3/10
实验目的、要求
1.该实验的课内学时是4个课时。
2.程序完成后应该完成如下基本功能:
1)用自定义结构体typedef struct设计该软件的数据结构;
2)用数组或指针链表将所有学生的数据按照学号顺序链接起来;
3)程序能够按照学号顺序输入学生的三门成绩,并计算平均成绩和总成绩。
4)程序能够显示已经输入的指定学号的学生成绩以及平均成绩和总成绩。
5)程序能够按要求显示指定分数段的学生成绩以及平均成绩和总成绩。
6)能够统计班级总人数、班级平均成绩。
7)能够增加和删除指定学生的成绩。
8)按照指定的要求以及顺序(升序或降序)显示学生成绩以及平均成绩和总成绩。
实验步骤与内容
按如下顺序写:
1、 主要设计思想;
学生成绩管理系统包含多种功能,可以输入学生成绩,删除,插入,排序,查找等等。。。输入的信息又包含学生姓名,学号,各科成绩。。所以首先要定义一个结构体:
typedef struct node
{
char id[20];
char name[15];
int score[MAXCOURSE];
int sum;
double average;
struct node *next;
}Student;
根据结构体中的内容飙血程序。
2、 主要数据结构及其解释
在此次程序设计中用了链表来实现对数据的处理,并设计了菜单界面如图,根据switch语句来对用户的选择:
3、 模块关系图;
主函数
输入学生信息
打印成绩
计算平均分和总分
查找学生成绩
插入学生成绩
显示分数段的学生
按总分平均分降序排列
菜单
4、 所有函数的简要说明;
1) 插入函数Insert_Before();主要是要重新加入学生的信息,通过头插法。
2) 计算平均分和总分Count_Score();将输入的数据计算出学生的平均分和总分。
3) 删除学生信息Del_Student();删除某个学生的成绩。
4) 按姓名查找Searchname_Student();通过输入学生的姓名找到学生的成绩。
5) 计算班级总人数people=Count_People();将总的输入学生人数打印出来。
6) 显示某分数段学生信息Section_Score();首先选择你要某科目的成绩并输入成绩的范围,按条件输出学生成绩。
7) 按总分,平均分降序排列Descend_English();将输入的全部学生成绩按总分排序。
5、 所有源代码;
/*
学生成绩管理系统 C语言
*/
#include
#include
#include
#define MAXID 10
#define MAXNAME 20
#define MAXCOURSE 3
/* 学生数据结构 */
typedef struct node
{
char id[20];
char name[15];
int score[MAXCOURSE];
int sum;
double average;
struct node *next;
}Student;
/* 头指针 */
Student *head = NULL;
/*课程名称*/
char ClassName[MAXCOURSE][20]={"数学","英语","计算机"};
/* 菜单 */
int Menu()
{
system("cls");
fflush(stdin);
printf(" 计算机1001 张扬文 3100301114 \n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("************学生成绩管理系统****************\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\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(" 9-插入学生信息到链表中\n");
printf(" 10-按总分或平均分降序排列学生成绩\n");
printf(" 0-退出\n");
return 0;
}
/*初始化*/
Student *Init()
{
int i;
Student *head;
head=(Student *)malloc(sizeof(Student));
head->next=NULL;
return head;
}
/*检查学号*/
char Check_ID(char *s)
{
int i;
if(strlen(s)==0||strlen(s)>MAXID)return 0;
for(i=0;i '0' && s[i] < '9') return 1;
}
return 0;
}
/*检查姓名*/
char Check_Name(char *s)
{
int i;
if(strlen(s)==0||strlen(s)>MAXNAME) return 0;
for(i=0; i= 'a' && s[i] < 'z') || (s[i] >= 'A' && s[i] <= 'Z'))
return 1;
}
return 0;
}
/*检查分数*/
int Check_Score(int s)
{
if( s>=0 && s<=100 ) return 1;
return 0;
}
/*检查学号是否相同*/
char Is_SameID(char *s)
{
Student *p= head->next;
while(p!=NULL)
{
if(strcmp(s,p->id)==0) return 1;
p=p->next;
}
return 0;
}
/* 输入学生信息 */
void Input_Score(Student *p)
{
/* 学号 */
printf("\n请输入学号: ");
do
{
gets(p->id);
if (!Check_ID(p->id))
{
printf("输入不正确!请重新输入学号: ");
}
else if (Is_SameID(p->id))
{
printf("存在已学号!请重新输入学号: ");
}
}while (!(Check_ID(p->id) && !Is_SameID(p->id)));
/* 姓名 */
printf("请输入姓名: ");
do
{
gets(p->name);
if (!Check_Name(p->name))
{
printf("输入不正确!请重新输入姓名: ");
}
}while (!Check_Name(p->name));
//输入成绩
int i;
for(i=0; iscore[i]);
if(!Check_Score(p->score[i]))
printf("输入成绩不正确!\n请重新输入%s成绩:",ClassName[i]);
}while(!Check_Score(p->score[i]));
}
p->average = -1;
p->sum = -1;
}
/* 头插法插入节点 */
void Insert_Before()
{
Student *s =(Student*) malloc(sizeof(Student));
Input_Score(s);
s->next = head->next;
head->next = s;
}
/*输出学生成绩信息*/
void Output_Score(Student *p)
{
int i;
printf("\n姓名:%s, 学号:%s \n",p->name,p->id);
for(i=0; iscore[i]);
}
printf("总分:%d 平均分:%.2f \n",p->sum,p->average);
}
/*删除节点q*/
void Del_Node(Student *q)
{
Student *p=head;
while(p->next!=q)
{
p=p->next;
}
p->next=q->next;
free(q);
}
/*插入学生成绩*/
void Insert_List()
{
int x;
printf("输入你要插入的学生数:");
scanf("%d",&x);
while(x!=0)
{
getchar();
Student *p =(Student*) malloc(sizeof(Student));
printf("\n请输入学号: ");
do
{
gets(p->id);
if (!Check_ID(p->id))
{
printf("输入不正确!请重新输入学号: ");
}
else if (Is_SameID(p->id))
{
printf("存在已学号!请重新输入学号: ");
}
}while (!(Check_ID(p->id) && !Is_SameID(p->id)));
/* 姓名 */
printf("请输入姓名: ");
do
{
gets(p->name);
if (!Check_Name(p->name))
{
printf("输入不正确!请重新输入姓名: ");
}
}while (!Check_Name(p->name));
//输入成绩
int i;
for(i=0; iscore[i]);
do{
if(!Check_Score(p->score[i]))
printf("输入成绩不正确!请重新输入%s成绩:",ClassName[i]);
}while(!Check_Score(p->score[i]));
}
p->average = -1;
p->sum = -1;
p->next = head->next;
head->next = p;
x--;
}
}
/*按学号查找*/
Student *Search_ID(char *id)
{
Student *p=head->next;
while(p!=NULL)
{
if(strcmp(p->id,id)==0)break;
p=p->next;
}
return p;
}
/*按姓名查找节点*/
Student *Search_Name(char *name)
{
Student *p=head->next;
while(p!=NULL)
{
if(strcmp(p->name,name)==0)break;
p=p->next;
}
return p;
}
/*输出链表*/
void Output_List()
{
Student *p;
p=head->next;
while(p!=NULL)
{
Output_Score(p);
p=p->next;
}
}
/*删除指定学生信息*/
void Del_Student()
{
Student *p;
fflush(stdin);
char str[15];
char judge[10];
printf("请输入要删除的学生的 学号或姓名:");
do{
gets(str);
if(!(Check_ID(str)||Check_Name(str)))
{
printf("输入错误!请重新输入:");
}
}while(!(Check_ID(str)||Check_Name(str)));
//判断是否为学号还是姓名
if(str[0]>'0'&&str[0]<'9')
{
p=Search_ID(str);
if(p==NULL)
{
printf("此学号不存在!\n");
}
else
{
Output_Score(p);
printf("是否要删除此学号!(确认按y,任意键取消):");
gets(judge);
if(strcmp(judge,"y")==0)
{
Del_Node(p);
printf("删除成功!");
}
}
}
else
{
p=Search_Name(str);
if(p==NULL)
{
printf("此姓名不存在!\n");
}
else
{
Output_Score(p);
printf("是否要删除此姓名!(确认按y,任意键取消):");
gets(judge);
if(strcmp(judge,"y")==0)
{
Del_Node(p);
printf("删除成功!");
}
}
fflush(stdin);
}
}
/* 退出 */
void Quit()
{
Student *p;
p=head->next;
while(p != NULL)
{
Quit(p->next);
free(p);
}
exit(0);
}
/*计算个人平均分和总分*/
void Count_Score()
{
Student *p;
int i;
p=head->next;
while(p!=NULL)
{
for(i=0;isum = p->sum + p->score[i];
}
p->average = p->sum * 1.0 / MAXCOURSE;
p=p->next;
}
}
/*计算班级总人数*/
int Count_People()
{
Student *p;
int people=0;
p=head->next;
while(p!=NULL)
{
people=people+1;
p=p->next;
}
return people;
}
/*计算班级平均分*/
void Count_Mark()
{
Student *p;
int m;
float avecla=0;
p=head->next;
while(p!=NULL)
{
avecla=avecla+p->sum;
p=p->next;
}
m=Count_People();
printf("班级平均分为:%.2f",avecla/m);
}
/*根据某科成绩段显示成绩*/
void Section_Score()
{
char x;
int m,n,i,flag=0;
Student *p;
p=head->next;
printf("请输入指定分数段的科目(A:数学 B:英语 C:计算机):\n");
scanf("%c",&x);
printf("请输入你要显示的分数段(从n到m):");
scanf("%d",&n);
scanf("%d",&m);
switch(x)
{
case 'A': while(p!=NULL)
{
if(n <= p->score[0] && p->score[0]<= m)
{
flag=1;
printf("\n姓名:%s, 学号:%s \n",p->name,p->id);
for(i=0; iscore[i]);
}
printf("总分为:%d 平均分:%.2f\n",p->sum,p->average);
}
p = p->next;
}
break;
case 'B': while(p!=NULL)
{
flag=1;
if(n <= p->score[1] && p->score[1]<= m)
{
printf("\n姓名:%s, 学号:%s \n",p->name,p->id);
for(i=0; iscore[i]);
}
printf("总分为:%d 平均分:%.2f\n",p->sum,p->average);
}
p = p->next;
}
break;
case 'C': while(p!=NULL)
{
flag=1;
if(n <= p->score[2] && p->score[2] <= m)
{
printf("\n姓名:%s, 学号:%s \n",p->name,p->id);
for(i=0; iscore[i]);
}
printf("总分为:%d 平均分:%.2f\n",p->sum,p->average);
}
p = p->next;
}
break;
default:
printf("输入无效!\n");
fflush(stdin);
}
if(flag==0)
printf("在%d到%d的分数段学生为零!");
}
/*比较成绩大小*/
Student *Descby_English(Student *Newhead,Student *sort)
{
Student *p,*q;
p=Newhead;
while(p!=NULL)
{
if(sort->sum > p->sum)
break;
q=p;
p=p->next;
}
if(p==Newhead)
{
sort->next = p;
return sort;
}
else
{
q->next = sort;
sort->next = p;
return Newhead;
}
}
/*按总分或平均分降序排列*/
void Descend_English()
{
Student *p,*q,*Newhead;
int i,j=1,people;
Newhead = NULL;
p = head;
while(p != NULL)
{
q = p->next;
Newhead = Descby_English(Newhead,p);
p = q;
}
if(p == head)
printf("学生信息库为空!!!\n");
else
{
p = Newhead->next;
people=Count_People();
printf("按总分和平均分排序如下:\n");
while(p!=NULL)
{
if(j<=people)
{
printf("第%d名 ",j);
printf("姓名:%s 学号:%s ",p->name,p->id);
for(i=0; i<=people-1;i++)
{
printf("%s:%d ",ClassName[i],p->score[i]);
}
printf("总分:%d 平均分:%.2f ",p->sum,p->average);
}
j++;
printf("\n");
p=p->next;
}
}
}
/*按姓名查找学生成绩*/
void *Searchname_Student()
{
char name[10];
int i=0;
Student *p=head->next;
getchar();
printf("请输入你要查找的学生姓名:");
do{
gets(name);
if(!Check_Name(name))
printf("输入姓名不正确!重新输入:");
}while(!Check_Name(name));
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
Output_Score(p);
i=1;
}
p=p->next;
}
if(i==0)
{
printf("找不到此姓名!");
}
}
/*按学号查找学生成绩*/
void *SearchID_Student()
{
char id[10];
int i=0;
Student *p=head->next;
getchar();
printf("请输入你要查找的学生学号:");
do{
gets(id);
if(!Check_ID(id))
printf("输入学号不正确!重新输入:");
}while(!Check_ID(id));
while(p!=NULL)
{
if(strcmp(p->id,id)==0)
{
Output_Score(p);
i=1;
}
p=p->next;
}
if(i==0)
{
printf("找不到此学号!");
}
}
/*主函数*/
void main()
{
int x,n,people;
Student *q;
Menu();
while(1)
{
printf("\n请输入命令编号: ");
scanf("%d", &x);
switch(x)
{
case 1: //初始化
head = Init();
printf("初始化成功!!!\n");
break;
case 2: //输入成绩
printf("输入序号:");
scanf("%d",&n);
getchar();
while(n!=-1)
{
Insert_Before();
printf("输入序号:");
scanf("%d",&n);
getchar();
}
break;
case 3: //计算平均分和总分
Count_Score();
printf("计算平均分和总分成功!");
break;
case 4: //打印出所有成绩
Output_List();
break;
case 5: Del_Student();
break;
case 6: //按姓名查找学生成绩
Searchname_Student();
break;
case 7: //按学号查找学生成绩
SearchID_Student();
break;
case 8: //计算班级人数
people=Count_People();
printf("班级总人数为:%d \n",people);
break;
case 9: /*插入学生成绩*/
Insert_List();
break;
case 10: /*显示某科分数段的学生*/
getchar();
Section_Score();
break;
case 11: /*按总分或平均分降序排列*/
Descend_English();
break;
case 0: /*结束*/
Quit();
break;
default:printf("输入错误!\n\n");
}
}
}
试验过程记录
记录试验中遇到的困难及解决方法;
实验结果记录以及与预期结果比较以及分析
记录每次实验结果以及分析情况
初始化
输入学生成绩
计算平均分 总分
打印学生成绩
删除学生成绩
查找学生成绩
插入学生成绩
显示某分数段学生成绩
总结以及心得体会
实验总体还是比较顺利,但也遇到了一些困难,通过与同学交流和查找资料已经解决了。
在做实验之前,一定要把课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时久听不懂,这会使实验难度加大,浪费做实验的宝贵时间。
做实验一定要亲力亲为,务必要将每个细节,每个步骤弄清楚,弄明白,还要复习,思考。这样,你的印象才深刻,才记得牢固,否则,过后就忘了还不如不做。
每次的实验都让我受益非浅,这次课程设计更使我有了更大的收获。明白了字符串的很多操作算法的编写和理解,并且查阅了大量的资料,对字符串的相关知识有了很大的了解。
期间遇到了很多的问题,其实我觉得编写程序,调试,遇到问题耐心的查错,总会有解决办法的,比较困难的错误其实是能够运行之后结果不稳定,有时候对,有时候错,这样的问题往往是程序设计的算法的问题,虽然这次程序没有太复杂的算法,但是一些小的地方没有考虑到,往往会给运行结果造成很多难以解释的错误。我觉得我的程序在经过很多种情况的测试后,基本上能满足我自己的要求了,可能还有很多不完善的地方,但是确实收获了很多东西,随着以后的学习运用,估计会有更深入的认识。
指导老师评阅意见
指导老师: 年 月 日
填写内容时,可把表格扩大。实验的源程序代码(要有注释)附在表后。
THANKS !!!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求
欢迎您的下载,资料仅供参考
-可编辑修改-
链接地址:https://www.zhuangpeitu.com/p-1557134.html