#include <stdio.h>//""它的查找路径是先到本地目录下查找该头文件,如果没有,就到系统目录system32下查找
//<>它的查找路径是先到系统目录下查找,如果没有,就到本地目录下查找
#define student_total 30//预编译指令,定义一个常量值
struct Student//定义学生数据类型(结构体)
{
int num;//学生学号
char name[8];//学生姓名
float normal_score;//平时成绩
float final_score;//期末成绩
float ave_score;//总评成绩=normal_score*normal_i+fianl_score*fianl_i
};
//接收学生信息函数定义
int accept_students(struct Student student[] )
{
char flag[1];//表示用户输入学生信息结束标志符号flag==y时候结束用户输入,如果未结束输入n
int sum=0;
while (flag[0]!='y')
{
printf("请输入学生学号:");
scanf("%d",&(student[sum].num));
printf("请输入学生姓名:");
scanf("%s",&(student[sum].name));
printf("请输入学生平时成绩:");
scanf("%f",&(student[sum].normal_score));
printf("请输入学生期末成绩:");
scanf("%f",&(student[sum].final_score));
printf("提示:如果输入完毕请输入小写字符y,否则请输入小写字符n\n");
scanf("%s",&flag);
sum=sum+1;
}
return sum;
}
//输出学生详细信息函数
void show_students(struct Student student[],int sum)
{
int i;
for (i=0;i<sum;i++)
{
printf("学生学号:%d",student[i].num);
printf("学生姓名:%s",student[i].name);
printf("学生平时成绩:%.1f",student[i].normal_score);
printf("学生期末成绩:%.1f",student[i].final_score);
printf("学生总评成绩:%.2f",student[i].ave_score);
printf("\n");
}
}
//计算学生总评成绩和统计各分数段人数
void datacalculate(struct Student student[],int fsdrs[],int sum,int normalpercent,int fianlpercent)
{
//1、首先计算学生总评成绩
int i;
float ave_score;
for (i=0;i<sum;i++)
{
ave_score=student[i].normal_score*normalpercent/100+student[i].final_score*fianlpercent/100;
student[i].ave_score=ave_score;
}
//2、统计各分数段人数
for (i=0;i<sum;i++)
{
if (student[i].ave_score<=59.99 && student[i].ave_score>0.00)
{
fsdrs[0]=fsdrs[0]+1;//fsdrs[0]++
}
if (student[i].ave_score>59.99 && student[i].ave_score<=79.99)
{
fsdrs[1]=fsdrs[1]+1;//fsdrs[1]++
}
if (student[i].ave_score>79.99 && student[i].ave_score<=89.99)
{
fsdrs[2]=fsdrs[2]+1;//fsdrs[2]++
}
if (student[i].ave_score>89.99 && student[i].ave_score<=100.00)
{
fsdrs[3]=fsdrs[3]+1;//fsdrs[0]++
}
}
}
void drawchart(int fsdrs[])
{
char virtualscreen[31][40];
int i,j,k,n;
//初始化虚拟屏幕
for (i=0;i<31;i++)
{
for (j=0;j<40;j++)
{
virtualscreen[i][j]=' ';
}
}
//画出x轴和y轴
for (i=0;i<39;i++)
{
virtualscreen[30][i]='-';
}
virtualscreen[30][39]='X';
for (i=1;i<30;i++)
{
virtualscreen[i][0]='|';
}
virtualscreen[0][0]='Y';
//画出各分数段柱状图
for (k=0;k<4;k++)
{
if (fsdrs[k]>0)
{
for (i=31-fsdrs[k]-1;i<30;i++)
{
for (j=k*8+4+1,n=0;n<4;j++,n++)
{
virtualscreen[i][j]='*';
}
}
}
}
//输出柱状图型
for (i=0;i<31;i++)
{
for (j=0;j<40;j++)
{
printf("%c",virtualscreen[i][j]);
}
printf("\n");
}
}
void main()
{
int normal_i,final_i;//成绩百分比,normal_i表示平时成绩百分比,fianl_i表示期末成绩百分比
/*int student_total=0;//学生总人数*/
struct Student student[student_total];//定义学生结构体数组
int sum=0;//表示用户实际输入学生总人数
int fsdrs[4]={0};//表示分数段人数
int virtualscreen[31][40];
printf("请输入计算百分比:");
scanf("%d%d",&normal_i,&final_i);//接收计算比例
//1、接收学生信息
sum=accept_students(student);
//要计算学成的成绩信息和分布
//1、计算学生总评成绩
//2、统计各分数段人数(a、不及格 b、60-80 一般 c、80-90 良好 d 90-100 优秀)
datacalculate(student,fsdrs,sum,normal_i,final_i);
printf("-----------------输出接收学生实际人数------------------\n");
printf("sum=%d\n",sum);
printf("-----------------输出学生详细信息------------------\n");
//2、输出接收学生详细信息
show_students(student,sum);
printf("-----------------输出学生总评成绩各分数段总人数------------------\n");
printf("不及格人数=%d,一般人数=%d,良好=%d,优秀=%d\n",fsdrs[0],fsdrs[1],fsdrs[2],fsdrs[3]);
//4、画出学生成绩分布图
printf("-----------------输出学生成绩分布直方图---------------------\n");
drawchart(fsdrs);
getch();
}