#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();
}