计算一个数据文件的“中位数”(median)。大于中位数的数据元素和小于中位数的数据元素相比,两者在数量上是一样的。考虑到本题的宗旨,我们假定数据已经排序(升序排列)。如果文件所含数字的数量为奇数,中位数就是文件中间的那个元素;如果文件所含数字的数量为偶数,中位数就是中间那两个元素的平均数。你需要打开文件,统计其中包含多少个数字,然后关闭文件,计算文件的中间位置,然后再次打开文件,计数到你需要的数据项,在计算中位数。
#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
int account_median(ifstream& messy_file);
void get_median(ifstream& messy_file,int n);
void get_median(ifstream& messy_file,int n1,int n2);
int main()
{
int sum;
//文件中数字的个数
int median;
//字数为奇数个的中位数
int median1,median2;
//字数为偶数个的中间两个数
ifstream fin;
//输入流
ofstream fout;
//输出流,不过这次没有用到
fin.open("infile.txt");
//打开文件
if(fin.fail())
{
cout<<"Input file opening failed.\n";
exit(1);
}
sum=account_median(fin);
//计算文件中的个数
fin.close();
//关闭文件一会再重新打开
//fout.close();
fin.open("infile.txt");
if(fin.fail())
{
cout<<"Input file opening failed.\n";
exit(1);
}
// fout.open("outfile.txt");
// if(fout.fail())
// {
// cout<<"Output file opening failed.\n";
// exit(1);
// }
if(sum%2==0)
{
median1=sum/2;
median2=median1+1;
get_median(fin,median1,median2);
}
else
{
median=(sum+1)/2;
get_median(fin,median);
}
fin.close();
// fout.close();
cout<<"End of program.\n";
return 0;
}
int account_median(ifstream& messy_file)
{
int n=0;
int next;
while(messy_file>>next)
{
n++;
}
return n;
}
void get_median(ifstream& messy_file,int n)
//计算个数为奇数的中位数
{
int number=1;
int next;
while(messy_file>>next)
{
if(number==n)
{
cout<<"中位数:"<<next<<endl;
break;
}
number++;
}
}
void get_median(ifstream& messy_file,int n1,int n2)
//计算个数为偶数的中位数
{
int number=1;
int next;
int sum1,sum2;
while(messy_file>>next)
{
if(number==n1)
{
sum1=next;
messy_file>>next;
sum2=next;
cout<<"中位数:"<<double(sum1+sum2)/2<<endl;
break;
}
number++;
}
}