2

我需要处理来自最大输入文件的数据。100,000 行,如下所示:

2014269619 Sally Clare Smith 女 95

这些是身份证号、姓名(2 或 3 个字)、性别和考试成绩。由制表符分隔。

我必须创建一个最大值数组。每个属性的长度为 100,000。此外,输入文件中的第一个数字将是该文件中的行数。所以,我创建了长度为 100,000 的数组。

一旦我设置了一个数组,我将使用给定的函数按 Name 的字母字符串顺序(升序)对名称进行排序,然后将它们放入输出文件中。但是,我不需要使用此特定功能。

我的挑战是,尽管给定函数对姓名进行排序,但它不会将 ID、性别和分数与姓名一起移动,从而导致数据库无用。

我尝试按以下方式对第一部分(设置数组)进行操作,但这似乎是错误的:

#include <iostream>
#include <fstream>
using namespace std;

void  ordering_sort( double  x[],  int  length)
{   
    int  i,  j,  k;
    double  t;

    for  (i=0;  i<length-1;  ++i)  {        
        k = i;       //find next smallest elm, x[k]

        for  (j=i+1;  j< length;  ++j)
            if  (x[k] > x[j])  k = j;

        //swap x[i] with x[k] 
        t = x[i];   x[i] = x[k];  x[k] = t;   
    }
}


int main () {

    ifstream fin;
    ofstream fout;

    fin.open("input.txt");
    fout.open("output.txt");

    if (fin.fail()) {
        cout << "Fail to open inout.txt" << endl;
        exit(1);
    }

    int ID [100000];
    string name [100000];
    string gender [100000];
    int score [100000];

    int y = 0;

    // In the following part, I am trying to extract the information into the different arrays,
    // one by one, increasing the number of the element from 0 up till x. 
    // Problem is that getline does not work for int arrays but I must use int.

    for (int y=0 ; y<x, y++) {
        getline(fin, ID [y], '\t'); // This does not work.
        getline(fin, name [y], '\t');
        getline(fin, gender [y], '\t');
        getline(fin, score [y], '\t'); //This does not work either.
        break;
    }

    ordering_sort( name,  int  length)

    // trying to use the function, which will not work as of now

基本上,我需要帮助:

  • 将输入文件中的数据提取到数组中,确保排序将应用于每一行,而不仅仅是单个数组(因此整行将被排序)
  • 找到一种方法让 getline 为 int 数组工作
  • 我会将数据输出到输出文件中,但这应该不是问题。
  • 所有这些都必须使用数组来完成,而不是使用结构、向量、映射。

其他图书馆都很好。

4

1 回答 1

1

从技术上讲,这段代码不是有效的标准 C++,它依赖于编译器扩展(特别是 gcc 风格的)

int ID [x];
string name [x];
string gender [x];
int score [x];

因此,要使其成为有效的标准代码,您必须使用new. 但我将忽略这一点,因为我希望您显示的代码可以编译,这对于这个项目来说已经足够了。

  • 找到一种方法让 getline 为 int 数组工作

由于这些项目由标签分隔(据我所知),因此您实际需要做的就是:

cin >> ID[y]; 
getline(cin, name[y], '\t');
... 
cin >> score[y];

至于排序部分,有两种解决方案:

  1. 正如评论中所建议的,您对索引表进行排序。
  2. 在您的排序功能中,当您交换时,您交换所有项目。

索引表的排序是这样的:

if (score[index[i]] > score[index[j]]) swap(index[i], index[j]);

交换一切方法将是这样的:

if (score[i] > score[j])
{
     swap(ID[i], ID[j]);
     swap(name[i], name[j]);
     swap(gender[i], gender[j]);
     swap(score[i], score[j]);
}
于 2013-04-19T09:14:06.663 回答