学习目的:
某班最多不超过30人(具体人数由键盘输入)参加某门课程的考试,请用一维数据做函数参数编程实现学生成绩管理系统.
学习内容:
学生成绩管理系统v1.0
1.录入学生学号和成绩;
2.计算课程的总分和平均分;
3.按成绩由高到低排列出名次表;
4.按学号由小到大排出成绩表;
5.按学号查询学生排名及其考试成绩;
6.按优秀(90-100)、良好(80-90)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,统计每个类别的人数以及所占的百分比;
7.输出每个学生的学号、考试成绩。
程序实现:
#include <stdio.h>
#define STU_NUM 30 //最多30人
//期末考试题目
//显示菜单,并获得用户键盘输入的选项
int Menu(void)
{
int iSelect;
printf("\n学生成绩管理系统v1.0\n");
printf("1.录入学生学号和成绩\n");
printf("2.计算课程的总分和平均分\n");
printf("3.按成绩由高到低排列出名次表\n");
printf("4.按学号由小到大排出成绩表\n");
printf("5.按学号查询学生排名及其考试成绩\n");
printf("6.按优秀(90-100)、良好(80-90)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,统计每个类别的人数以及所占的百分比\n");
printf("7.输出每个学生的学号、考试成绩\n");
printf("8.关闭程序.\n");
printf("请您输入的选择:\n");
scanf("%d",&iSelect);
return iSelect;
}
//No.1
void ReadScore(long num[],float score[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("请您输入学生学号和成绩:");
scanf("%ld%f",&num[i],&score[i]);
}
}
//No.2
void AverSumofScore(float score[],int n)
{
int i,sum=0;
double ave;
for(i=0;i<n;i++)
sum=sum+score[i];
ave=(double)sum/n;
printf("课程的总分=%ld,平均分=%f\n",sum,ave);
}
//No.3
void DeSortbyScore(long num[],float score[],int n)
{
int i,j,k,h;
float t;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if (score[j]>score[k])
k=j;
}
if(i!=k)
{
t=score[k],h=num[k];
score[k]=score[i],num[k]=num[i];
score[i]=t,num[i]=h;
}
}
for(i=0;i<n;i++)
printf("学号:%10ld,考试成绩:%f\n",num[i],score[i]);
}
//No.4
void AsSortbyNum(long num[],float score[],int n)
{
int i,j,k,h;
float t;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if (num[j]<num[k])
k=j;
}
if(i!=k)
{
t=score[k],h=num[k];
score[k]=score[i],num[k]=num[i];
score[i]=t,num[i]=h;
}
}
for(i=0;i<n;i++)
printf("学号:%10ld,成绩:%f\n",num[i],score[i]);
//以长整形打印用%ld
}
//No.5
void SearchbyNum(long num[],float score[],int n)
{
int high=n-1,low=0,mid,c=0,pos,find=0,i,x;
printf("请输入查找学号\n");
scanf("%d",&x);
while(find==0&&low<=high)
{
mid=(high+low)/2;
if(x>num[mid])
low=mid+1;
else if(x<num[mid])
high=mid-1;
else
{
pos=mid;
find=1;
}
}
for(i=0;i<n;i++)
{
if(num[i]>num[pos])
c++;
}
printf("学号:%10ld,排名:%d,成绩:%f\n",num[pos],c+1,score[pos]);
}
//No.6
void StatisticAnalysis(long num[],float score[],int n)
{
int a=0,b=0,c=0,d=0,e=0,i;
double A,B,C,D,E;
for(i=0;i<n;i++)
{
if(score[i]>=90)
a++;
else if(score[i]>=80)
b++;
else if(score[i]>=70)
c++;
else if(score[i]>=60)
d++;
else
e++;
}
A=(double)a/n*100;
B=(double)b/n*100;
C=(double)c/n*100;
D=(double)d/n*100;
E=(double)e/n*100;
printf("优秀人数%d,百分比:%f%%\n",a,A);
printf("良好人数%d,百分比:%f%%\n",b,B);
printf("中等人数%d,百分比:%f%%\n",c,C);
printf("及格人数%d,百分比:%f%%\n",d,D);
printf("不及格人数%d,百分比:%f%%\n",e,E);
}
//No.7
void List(long num[],float score[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("学号:%10ld,成绩:%f\n",num[i],score[i]);
}
}
main()
{
int iSelectItem;
int n=0;
long num[STU_NUM];
float score[STU_NUM];
printf("请您输入具体的学生人数(n<%d):",STU_NUM);
scanf("%d",&n);
do
{
iSelectItem=Menu();
switch(iSelectItem)
{
case 1: //录入学生学号和成绩
ReadScore(num,score,n);
break;
case 2: //计算课程的总分和平均分
AverSumofScore (score,n);
break;
case 3:
DeSortbyScore(num,score,n);
break;
case 4:
AsSortbyNum(num,score,n);
break;
case 5:
SearchbyNum(num,score,n);
break;
case 6:
StatisticAnalysis(num,score,n);
break;
case 7: //打印出学生学号 和 成绩
List(num,score,n);
break;
case 8:
printf("退出程序.\n");
break;
default:
printf("输入有错误!\n");
break;
}
}while(iSelectItem!=8);
}