输出学生成绩前三名(有并列)

这里成绩的录入文件输入和手动输入两种形式
/************************************
/*		学生:刘中华
/*		日期:2014-1-11
/*		功能:输出学生成绩前三名(有并列)
/*			
***************************************/
#include<iostream>
#include<fstream>
using namespace std;
void input_score(int &n,int *pp);
void output_score(int &n,int *pp);
void person_score(int &n,int *pp);
void main()
{
	int num=0,score[10]={0};//num装人数,score数组装分数
	int *p=score;
	input_score(num,p);//输入小组人数及成绩
	output_score(num,p);//输出最高成绩,最低成绩,以及平均成绩
	person_score(num,p);
	
}
void input_score(int &n,int *pp)
{
	int i;
	cout<<"请输入学生人数:";
	cin>>n;
	cout<<endl<<"请输入每个学生成绩:";
//********************************************************
	//for(i=0;i<n;i++)//这里换成从文件中读入
		//cin>>pp[i];
	ifstream infile;
	infile.open("myfile.txt",ios::in);
	if(!infile.is_open())
	{
		cerr<<"file not open!";
		exit(1);
	}
	for(i=0;i<n;i++)
		infile>>pp[i];
	infile.close();
	cout<<"文件读取完成"<<endl;
//********************************************************
	cout<<"成绩录入完成"<<endl;
}
void output_score(int &n,int *pp)
{
	int max=pp[0],min=pp[0],i;
	int sum=0;
	float avg=0;
	for(i=0;i<n;i++)
	{
		if(max<pp[i])
			max=pp[i];
		if(min>pp[i])
			min=pp[i];
		sum+=pp[i];
	}
	avg=sum/1.0/n;
	cout<<"最高分:"<<max<<endl;
	cout<<"最低分:"<<min<<endl;
	cout<<"平均分:"<<avg<<endl;
}
void person_score(int &n,int *pp)//先将成绩排序出来,从大到小
{
	int i,j,k=0,m=0;//循环变量
	int stu_num[10];//定义一个学号数组
	int mid;//中间变量
	for(i=0,j=1;i<n;i++,j++)//先将学号排出来,1-n
		stu_num[i]=j;
	for(i=0;i<n-1;i++)//i为趟数,j为每趟所需要的次数
	{
		for(j=n-1;j>0;j--,k++)
			if(pp[k]<pp[k+1])
			{
				mid=pp[k];//交换成绩
				pp[k]=pp[k+1];
				pp[k+1]=mid;
				mid=stu_num[k];
				stu_num[k]=stu_num[k+1];
				stu_num[k+1]=mid;//交换学号,这样才能保证学号,成绩一一对应

			}
		k=0;
	}
	cout<<"成绩按从大到小排列";
	for(i=0;i<n;i++)
		cout<<pp[i]<<"  ";
	cout<<endl;
//************************************************************************
//输出最高分,及对应学生学号,最高分学生人数
	cout<<"最高成绩为:"<<pp[0]<<"最高分学生学号为:";
	for(i=0;i<n;i++)
		if(pp[i]==pp[0])
		{
			cout<<stu_num[i]<<" ";
			m++;//m存储最高分或者最低分的人数
		}
	cout<<"最高分人数为:"<<m<<endl;
	m=0;//统计完成后要清零
//************************************************************************
//输出最低分,及对应学生学号,最高分学生人数
	cout<<"最低成绩为:"<<pp[n-1]<<"最低分学生学号为:";
	for(i=0;i<n;i++)
		if(pp[i]==pp[n-1])
		{
			cout<<stu_num[i]<<" ";
			m++;//m存储最高分的人数
		}
	cout<<"最低分人数为:"<<m<<endl;
	/*接下来输出前三名*/
//********************************************************************
	i=j=k=m=0;
	for(i=0;i<n;i++)//第一名
		if(pp[i]!=pp[0])
			break;
	cout<<"第一名学生学号为:";
	for(j=0;j<i;j++)
		cout<<stu_num[j]<<"  ";
	cout<<endl;
//**********************************************************************
	for(j=i;j<n;j++)//第二名
		if(pp[j]!=pp[i])
			break;
	cout<<"第二名学生学号为:";
	for(k=i;k<j;k++)
		cout<<stu_num[k]<<"  ";
	cout<<endl;
//******************************************************************
	for(k=j;k<n;k++)//第三名
		if(pp[k]!=pp[j])
			break;
	cout<<"第三名学生学号为:";
	for(i=j;i<k;i++)
		cout<<stu_num[i]<<"  ";
	cout<<endl;

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值