1

名前の後に名前の優先度である数字が続くテキストファイルがあります。今、テキストファイルを優先度でソートして新しいファイルを書き込もうとしています。

old
name1 1
name2 2
name3 3
name4 1
name5 1
name6 2 
name7 1
name8 3

new
name 1 1
name4 1
name5 1
name2 2
name6 2
name3 3
name8 3

古いテキストファイルを配列で取得することに成功しましたが、その配列を優先順位でソートすることに固執しています。ファイルを再度ループする必要はありません。配列を並べ替えてから、並べ替えられた新しい配列を新しいテキスト ファイルに書き込みたいだけです。どのように進めればよいですか??

コード

   #include <stdio.h>
   #include <stdlib.h>


typedef struct{
    int p;
    char *name;
}names;

int main(void){
    FILE *old= fopen("old.txt", "r");
    FILE *new = fopen("new.txt", "w");

    char n[10];
    int i =0;

    names *name= malloc(sizeof(names));

    for(i; i<count; i++){
        int p;

        char *n= malloc(sizeof(char) * 4); 
        fscanf(old, "%s %i", n, &p); 

        names[i].name= n; 
        names[i].p= p;

    }
    int j=0;

    for(i=0; i < count;i++){

    }

    return 0;
}
4

2 に答える 2

1

qsort()標準ライブラリ関数を使用してソートする必要があります。

job並べ替えを行うには、2 つの構造を比較する関数を実装する必要があります。

ここに1つの試みがあります:

static int compare_jobs(const void *a, const void *b)
{
  const job *ja = a, *jb = b;

  return ja->prio < jb->prio ? -1 : ja->prio > jb->prio;
}

これを適切に呼び出して (ドキュメントを読んでください!)、配列をループして、その内容を新しいファイルに書き込む必要があります。

于 2013-08-27T07:56:59.310 に答える
1

qsort()制約の 1 つが独自の並べ替えアルゴリズムを作成することであるために使用できないと仮定すると、次のようになります。

並べ替えるには何が必要ですか?の配列job

並べ替える必要があるキーは何ですか? job.prio.

では、どのように並べ替えるのですか?一般的な選択、挿入、または (eek) バブル ソートで十分です。(ただし、バブル ソート ルートをたどる場合は、少なくともセクシーにして、カクテル シェーカー ソートを実行してください。) 2 つjob.prioの を比較するだけです。どちらも であるため難しくありません。必要に応じて、配列内のintそれぞれの構造体の場所を交換します。 job.

これは、機能する選択ソートアルゴリズムです。Google で他にもたくさん見つけることができます。

void selectionSort (job* jobs, int size) {

    int smallest;
    job temp;

    for (int i = 0; i < size - 1; i++) {
        smallest = i;
        for (int walk = i + 1; walk <= size - 1; walk++) {
            if (jobs[walk].prio < jobs[smallest].prio)
                smallest = walk;
        }  // end inner loop
        temp = jobs[i];
        jobs[i] = jobs[smallest];
        jobs[smallest] = temp;
    }   // end outer loop
    return;
}

かなり単純です。これは、古い選択ソートと同じです。しかし、選択ソートは退屈です。選択ソートにより、配列内の要素を交換する方法の一般的なアイデアが得られるようになったので、挿入ソートを実行してみてください。

人々が指摘したように、コードには他の問題があることに注意してください。配列内の 1 つのジョブだけにスペースを割り当てていますが、8 つ必要です。のような未定義の変数がeersteあります。1 回は として、もう 1 回は の配列nameとして 2 回宣言しています。クリーンアップがたくさんありますが、課題を完了するのに十分なアイデアがあることを願っています。char*char

于 2013-08-27T09:17:16.307 に答える