2

最大の入力ファイルからデータを処理する必要があります。次のような 100,000 行:

2014269619 サリー・クレア・スミス 女性 95

ID 番号、名前 (2 ~ 3 語)、性別、試験の点数です。タブで区切られています。

最大の配列を作成する必要があります。これらの属性ごとに 100,000 の長さ。また、入力ファイル内の最初の数字は、そのファイルの行数になります。そこで、長さ 100,000 の配列を作成します。

配列を設定したら、特定の関数を使用して名前のアルファベット順 (昇順) で名前を並べ替え、出力ファイルに入れます。ただし、この特定の機能を使用する必要はありません。

ここでの私の課題は、指定された関数が名前を並べ替えますが、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

基本的に、次のことについて助けが必要です。

  • 入力ファイルから配列にデータを抽出して、並べ替えが個々の配列だけでなくすべての行に適用されるようにします (したがって、行全体が並べ替えられます)。
  • int 配列に対して getline を機能させる方法を見つける
  • データを出力ファイルに出力しますが、問題にはなりません。
  • これはすべて、構造体、ベクトル、マップを使用せずに、配列を使用して行う必要があります。

他のライブラリは問題ありません。

4

1 に答える 1

1

技術的に言えば、このコードは有効な標準 C++ ではなく、コンパイラ拡張機能 (特に gcc スタイルのもの) に依存しています。

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

したがって、有効な標準コードにするには、new. ただし、表示されたコードがコンパイルされ、このプロジェクトには十分であることを期待しているため、それは無視します。

  • int 配列に対して getline を機能させる方法を見つける

項目はタブで区切られているため (私が知る限り)、実際に行う必要があるのは次のとおりです。

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

ソート部分に関しては、2 つの解決策があります。

  1. コメントで提案されているように、インデックス テーブルを並べ替えます。
  2. sort 関数では、スワップすると、すべてのアイテムがスワップされます。

インデックス テーブルの並べ替えは次のようになります。

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 に答える