c语言 文件内容的重新排序问题

有一个文件medal.txt 是一个奖牌榜
1 将他显示出来
2 按照国家的首字母排序,存储并显示
3 按照总奖牌数排序 ,存储并显示
c或者c++都行
No. Nation gold silver bronze sum

1 China 199 119 98 416

2 Korea 76 65 91 232

3 Japan 48 74 94 216

#include <stdio.h>
#include <stdlib.h>
//假设要打开的文件内容全是整数(如果是浮点数参照修改)
//数据与数据之间用空格分开
//每行多少数据可以不相同

//数组从小到大排序
void sortit(int *a,int n) {
int i,j,m;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j]){
m=a[i];a[i]=a[j];a[j]=m;
}
}
//输出数组元素
void printit(int *a,int n){
int i;
for(i=0;i<n;i++){
printf("%5d",a[i]);
if (i%10==9) printf("\n"); //设置每10个换行
}
}
//从文件fp中读取n个数据到a
void getdata(FILE *fp,int *a,int n){
int i;
fseek(fp,0,0);
for(i=0;i<n;i++)
fscanf(fp,"%d",&a[i]);
}

//获取文件中整数数椐的个数
int getdatabound(FILE *fp){
int i=0,n;
fseek(fp,0,0);
while(fscanf(fp,"%d",&n)!=EOF) i++;
return i;
}
int main(){
int n,*a;
char *myfile="d:\\data.txt";
FILE *fp;
if ((fp=fopen(myfile,"r"))==NULL){
printf("打开文件%s失败\n",myfile);
return 0;
}
n=getdatabound(fp); //获取该文件中有多少整数
printf("该文件共有%d个整数\n",n);
a=(int *)malloc(sizeof(int)*n); //分配n个整数的空间
getdata(fp,a,n); //从文件fp中读取n个数据到a
fclose(fp);
printf("排序前的数组\n");
printit(a,n); //输出数组的值
printf("\n");

sortit(a,n);

printf("排序后的数组\n");
printit(a,n);
printf("\n");
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-09
#include <stdio.h>
#define NATION_MAX 256
#define LINE_MAX 1000
#define HEADER_SIZE 256
typedef struct
{
int No;
char Nation[NATION_MAX];
int gold, silver, bronze, sum;
}Medal;
int loadMedal(Medal *medals, char *header, const char *fileName)
{
int n = 0;
FILE *fp = fopen(fileName, "r");
if(!fp) return 0;
fgets(header, HEADER_SIZE, fp);
while(fscanf(fp, "%d%s%d%d%d%d", &(medals[n].No), medals[n].Nation,
&(medals[n].gold), &(medals[n].silver), &(medals[n].bronze),
&(medals[n].sum)) == 6){
n ++;
if(n >= LINE_MAX) return n;
}
fclose(fp);
return n;
}
void showMedal(Medal *medals, char *header, int nMedal, int *sorted)
{
int i, index;
fputs(header, stdout);
for(i = 0; i < nMedal; i ++) {
index = sorted[i];
printf("%d\t%s\t%d\t%d\t%d\t%d\n", medals[index].No,
medals[index].Nation, medals[index].gold,
medals[index].silver, medals[index].bronze, medals[index].sum);
}
}
void saveMedal(Medal *medals, char *header, int nMedal, int *sorted, const char *fileName)
{
int i, index;
FILE *fp = fopen(fileName, "w");
if(!fp) return;
fputs(header, fp);
for(i = 0; i < nMedal; i ++){
index = sorted[i];
fprintf(fp, "%d\t%s\t%d\t%d\t%d\t%d\n", medals[index].No,
medals[index].Nation, medals[index].gold,
medals[index].silver, medals[index].bronze, medals[index].sum);
}
fclose(fp);
}
void sortByNation(Medal *medals, int nMedal, int *sorted)
{
int i, j;
int key;
int *a = sorted;
int index;
for(j = 1; j < nMedal; j ++){
key = medals[a[j]].Nation[0];
index = a[j];
for(i = j - 1; (medals[a[i]].Nation[0] > key) && (i >= 0); i--){
a[i+1] = a[i];
}
a[i+1] = index;
}
}
void sortBySum(Medal *medals, int nMedal, int *sorted)
{
int i, j;
int key;
int *a = sorted;
int index;
for(j = 1; j < nMedal; j ++){
key = medals[a[j]].sum;
index = a[j];
for(i = j - 1; (medals[a[i]].sum > key) && (i >= 0); i--){
a[i+1] = a[i];
}
a[i+1] = index;
}
}

void resetIndex(int *sorted, int nMedal)
{
int i;
if(nMedal > LINE_MAX) return ;
for(i = 0; i < nMedal; i++){
sorted[i] = i;
}
}
int main()
{
Medal medals[LINE_MAX];
int sorted[LINE_MAX];
char header[HEADER_SIZE];
int nMedal;
nMedal = loadMedal(medals, header, "medal.txt");
resetIndex(sorted, nMedal);
showMedal(medals, header, nMedal, sorted);
sortByNation(medals, nMedal, sorted);
showMedal(medals, header, nMedal, sorted);
saveMedal(medals, header, nMedal, sorted, "bynation.txt");
sortBySum(medals, nMedal, sorted);
showMedal(medals, header, nMedal, sorted);
saveMedal(medals, header, nMedal, sorted, "bysum.txt");
return 0;
}
第2个回答  2012-05-09
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
using namespace std;
struct medal
{
int No;
char Nation[10];
int nGold;
int nSilver;
int nBronze;
int sum;
}ob[3];
void print(medal &ob, int n, ofstream &file)
{
cout << setw(12) << n;
cout << setw(12) << ob.Nation;
cout << setw(12) << ob.nGold;
cout << setw(12) << ob.nSilver;
cout << setw(12) << ob.nBronze;
cout << setw(12) << ob.sum << endl;
file << setw(16) << n;
file << setw(16) << ob.Nation;
file << setw(16) << ob.nGold;
file << setw(16) << ob.nSilver;
file << setw(16) << ob.nBronze;
file << setw(16) << ob.sum << endl;
}

void main()
{
string txt;
int i = 0, index, index1, index2;
ifstream in("medal.txt");
ofstream of1("Ca.txt");
ofstream of2("Me.txt");
if(!in && !of1 && of2)
{
cout << "Can't open the file!" << endl;
exit(0);
}
cout << setiosflags(ios::left);
cout << "The file is: " << endl;
while(in >> txt)
{
cout << setw(12) << txt;
of1 << setw(16) << txt;
of2 << setw(16) << txt;
if(txt == "sum")
{
cout << endl;
of1 << endl;
of2 << endl;
break;
}
}

while(!in.eof())
{
in >> ob[i].No;
cout << setw(12) << ob[i].No;
in >> ob[i].Nation;
cout << setw(12) << ob[i].Nation;
in >> ob[i].nGold;
cout << setw(12) << ob[i].nGold;
in >> ob[i].nSilver;
cout << setw(12) << ob[i].nSilver;
in >> ob[i].nBronze;
cout << setw(12) << ob[i].nBronze;
in >> ob[i].sum;
cout << setw(12) << ob[i].sum << endl;
i++;
}
in.close();
cout << "according the first character: " << endl;
index = 0;
for(i = 1; i < 3; i++)
{
if(ob[i].Nation[0] < ob[index].Nation[0])
index = i;
}
print(ob[index], 1, of1);

index1 = 0;
for(i = 1; i < 3; i++)
{
if(ob[i].Nation[0]> ob[index1].Nation[0])
index1 = i;
}
index2 = 3 - index - index1;
print(ob[index2], 2, of1);
print(ob[index1], 3, of1);
cout << "according to the num of medals(ascending order):" << endl;
index = 0;
for(i = 1; i < 3; i++)
{
if(ob[i].sum < ob[index].sum)
index = i;
}
print(ob[index], 1, of2);
index1 = 0;
for(i = 1; i < 3; i++)
{
if(ob[i].sum > ob[index1].sum)
index1 = i;
}
index2 = 3 - index - index1;
print(ob[index2], 2, of2);
print(ob[index1], 3, of2);
of1.close();
of2.close();
}
第3个回答  2012-05-10
#include<stdio.h>
#include<algorithm>
using namespace std;
struct C
{
char name[100];
int gold,silver,bros,sum;
};
C a[100];
bool ByCountry(C a,C b)
{
return a.name[0]<b.name[0];
}
bool BySum(C a,C b)
{
return a.sum<b.sum;
}
void out(C a[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%s\t%d\t%d\t%d\t%d\n",a[i].name,a[i].gold,a[i].silver,a[i].bros,a[i].sum);
}
}
int main()
{
int n=0;
freopen("C:\\a.txt","r",stdin);
gets(a[0].name);
while(scanf("%s",a[n].name)!=EOF)
{
scanf("%s%d%d%d%d",a[n].name,&a[n].gold,&a[n].silver,&a[n].bros,&a[n].sum);
n++;
}
sort(a,a+n,ByCountry);
out(a,n);
sort(a,a+n,BySum);
out(a,n);
return 0;
}本回答被提问者和网友采纳
第4个回答  2012-05-09
用c++的ifstream和ofstream读写txt文件,然后再自己定义个结构体存每一行的记录,用sort排序,自己针对记录写个比较字符串成员的函数对象给sort调用,就这么简单。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网