学生成绩管理系统C语言.docx
《学生成绩管理系统C语言.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统C语言.docx(29页珍藏版)》请在冰点文库上搜索。
学生成绩管理系统C语言
福建工程学院计算机与信息科学系
实验报告
2012 – 2013 学年第1学期 任课老师:
章静
课程名称
结构化程序综合设计
班级
计算机1001
座号
3100301114
姓名
张扬文
实验题目
学生成绩管理系统
实验时间
实验开始日期:
2012/2/24
报告提交日期:
2012/3/10
实验目的、要求
1.该实验的课内学时是4个课时。
2.程序完成后应该完成如下基本功能:
1)用自定义结构体typedefstruct设计该软件的数据结构;
2)用数组或指针链表将所有学生的数据按照学号顺序链接起来;
3)程序能够按照学号顺序输入学生的三门成绩,并计算平均成绩和总成绩。
4)程序能够显示已经输入的指定学号的学生成绩以及平均成绩和总成绩。
5)程序能够按要求显示指定分数段的学生成绩以及平均成绩和总成绩。
6)能够统计班级总人数、班级平均成绩。
7)能够增加和删除指定学生的成绩。
8)按照指定的要求以及顺序(升序或降序)显示学生成绩以及平均成绩和总成绩。
实验步骤与内容
按如下顺序写:
1、主要设计思想;
学生成绩管理系统包含多种功能,可以输入学生成绩,删除,插入,排序,查找等等。
。
。
输入的信息又包含学生姓名,学号,各科成绩。
。
所以首先要定义一个结构体:
typedefstructnode
{
char id[20];
charname[15];
intscore[MAXCOURSE];
intsum;
doubleaverage;
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<stdio.h>
#include
#include<string.h>
#defineMAXID10
#define MAXNAME20
#defineMAXCOURSE3
/*学生数据结构*/
typedefstructnode
{
charid[20];
charname[15];
intscore[MAXCOURSE];
intsum;
doubleaverage;
structnode*next;
}Student;
/*头指针*/
Student*head=NULL;
/*课程名称*/
char ClassName[MAXCOURSE][20]={"数学","英语","计算机"};
/*菜单*/
intMenu()
{
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()
{
inti;
Student*head;
head=(Student *)malloc(sizeof(Student));
head->next=NULL;
returnhead;
}
/*检查学号*/
char Check_ID(char*s)
{
int i;
if(strlen(s)==0||strlen(s)>MAXID)return 0;
for(i=0;i{
if(s[i] >'0'&&s[i]<'9')return1;
}
return0;
}
/*检查姓名*/
charCheck_Name(char*s)
{
int i;
if(strlen(s)==0||strlen(s)>MAXNAME)return0;
for(i=0;i<strlen(s);i++)
{
if((s[i]>= 'a'&& s[i]<'z') ||(s[i]>='A'&& s[i] <='Z'))
return1;
}
return0;
}
/*检查分数*/
intCheck_Score(ints)
{
if(s>=0&&s<=100)return1;
return0;
}
/*检查学号是否相同*/
charIs_SameID(char*s)
{
Student*p= head->next;
while(p!
=NULL)
{
if(strcmp(s,p->id)==0) return1;
p=p->next;
}
return0;
}
/*输入学生信息*/
voidInput_Score(Student*p)
{
/*学号 */
printf("\n请输入学号:
");
do
{
gets(p->id);
if(!
Check_ID(p->id))
{
printf("输入不正确!
请重新输入学号:
");
ﻩﻩ}
ﻩﻩelseif(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));
//输入成绩
inti;
for(i=0; i<MAXCOURSE;i++)
{
do{
printf("请输入%s成绩:
",ClassName[i]);
scanf("%d",&p->score[i]);
if(!
Check_Score(p->score[i]))
printf("输入成绩不正确!
\n请重新输入%s成绩:
",ClassName[i]);
}while(!
Check_Score(p->score[i]));
}
p->average = -1;
p->sum=-1;
}
/*头插法插入节点*/
voidInsert_Before()
{
Student*s=(Student*) malloc(sizeof(Student));
Input_Score(s);
s->next=head->next;
head->next= s;
}
/*输出学生成绩信息*/
voidOutput_Score(Student*p)
{
int i;
printf("\n姓名:
%s,学号:
%s \n",p->name,p->id);
for(i=0; i<MAXCOURSE;i++)
{
printf("%s成绩:
%d",ClassName[i],p->score[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);
}
/*插入学生成绩*/
voidInsert_List()
{
intx;
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("输入不正确!
请重新输入学号:
");
ﻩﻩ }
elseif(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));
//输入成绩
inti;
for(i=0;i<MAXCOURSE;i++)
{
fflush(stdin);
printf("请输入%s成绩:
",ClassName[i]);
scanf("%d",&p->score[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;
}
returnp;
}
/*按姓名查找节点*/
Student*Search_Name(char *name)
{
Student *p=head->next;
while(p!
=NULL)
{
if(strcmp(p->name,name)==0)break;
p=p->next;
}
return p;
}
/*输出链表*/
voidOutput_List()
{
Student*p;
p=head->next;
while(p!
=NULL)
{
Output_Score(p);
p=p->next;
}
}
/*删除指定学生信息*/
voidDel_Student()
{
Student*p;
fflush(stdin);
char str[15];
charjudge[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);
}
}
/* 退出*/
voidQuit()
{
Student*p;
p=head->next;
while(p!
=NULL)
{
Quit(p->next);
free(p);
}
exit(0);
}
/*计算个人平均分和总分*/
void Count_Score()
{
Student*p;
inti;
p=head->next;
while(p!
=NULL)
{
for(i=0;i<MAXCOURSE;i++)
{
p->sum= p->sum+p->score[i];
}
p->average=p->sum*1.0/ MAXCOURSE;
p=p->next;
}
}
/*计算班级总人数*/
intCount_People()
{
Student *p;
intpeople=0;
p=head->next;
while(p!
=NULL)
{
people=people+1;
p=p->next;
}
returnpeople;
}
/*计算班级平均分*/
voidCount_Mark()
{
Student*p;
intm;
floatavecla=0;
p=head->next;
while(p!
=NULL)
{
avecla=avecla+p->sum;
p=p->next;
}
m=Count_People();
printf("班级平均分为:
%.2f",avecla/m);
}
/*根据某科成绩段显示成绩*/
voidSection_Score()
{
charx;
intm,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;i {
printf("%s成绩:
%d",ClassName[i],p->score[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;i {
printf("%s成绩:
%d",ClassName[i],p->score[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;i<MAXCOURSE;i++)
{
printf("%s成绩:
%d",ClassName[i],p->score[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;
returnNewhead;
}
}
/*按总分或平均分降序排列*/
void Descend_English()
{
Student*p,*q,*Newhead;
inti,j=1,people;
Newhead= NULL;
p=head;
while(p !
= N