質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

挿入ソートで昇順したい

受付中

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,025

nortordam

score 12

#include <stdio.h>
#include <time.h>


// 定数宣言
#define  COUNT  100000                  // データ数を指定
#define  INFILE    "08sort.txt"         // 入力ファイルを指定
#define  SORTFILE  "out.txt"            // 出力ファイルを指定


// プロトタイプ宣言
void sort_main(int *);
void getFile(int *);
void outFile(int *);
double getFuncTime(clock_t, clock_t);


// ソート(並び替え)メイン関数
void sort_main(int *array){

     int i,j,temp;
       for(i=0;i<(COUNT-1);i++){

         for(j=(COUNT-1);j>i;j--)
       {
              if((*(array + j)) < (*(array + (j-1)))){
           temp=(*(array + j));
           (*(array + j))=(*(array + (j-1))));
           (*(array + (j-1))))=temp;
           }
      }
     }
    // ソート(並び替え)の処理を本関数で実現すること
    // 処理をまとめたい場合は,別関数を定義すること

        // *(array) = 10;                       <--   data[0] = 10;     と同じ
        // *(array + 10) = 100;         <--   data[10] = 100;   と同じ
}


// プログラムのメイン関数
int main(){
    // 変数宣言
    clock_t start,end;      // 開始&終了時間を格納
    int data[COUNT];        // ファイル内のデータを格納

    // ファイルからデータの読み込み
    getFile(data);

    // 処理開始時間の設定
    start = clock();

    // ソート関数の呼出し
    sort_main(data);

    // 処理終了時間の設定
    end = clock();

    /// 処理にかかった時間の出力
    printf("--- Sort Time is  %.2f sec. ---\n", getFuncTime(start, end));

    // 配列に保存されたデータの格納
    outFile(data);
}


void getFile(int *cur){
    FILE *fp;

    fp = fopen(INFILE, "r");
    while(fscanf(fp,"%d", cur) != EOF){
        cur++;
    }

    fclose(fp);
}

void outFile(int *cur){
    FILE *fp;
    int i;

    fp = fopen(SORTFILE, "w");

    for(i=0; i<COUNT; i++){
        fprintf(fp, "%d\n", *(cur+i));
    }

    fclose(fp);
}


double getFuncTime(clock_t start, clock_t end){
    return (double)(end-start)/CLOCKS_PER_SEC;
}


実行結果;--- Sort Time is  0.0sec. ---
```
セグメンションフォルトは08sort.txtの位置が元の場所においてあり1行多かったからでした。お騒がせして申し訳ありません。

昇順したいデータは4ケタの整数です。
恐らくループやどこかの記述が間違っているんだと思いますが、そこがどこかわかりません
できればお願いします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

0

main関数内でデバッグ文を出力してみてください。
それでどの関数で落ちてるのかがわかると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/14 17:50

    COUNTについては闇雲に変更するのではなく、きちんとテキストファイルの行数と照らし合わせてみてください。
    気になるのは、dataをローカル変数で宣言するにはサイズが大きすぎるかもしれません。
    試しにグローバル変数化してみたらどうなりますか?

    キャンセル

  • 2016/07/14 17:50

    もしくはstaticをつけるか。

    キャンセル

  • 2016/07/14 18:12

    テキストファイルの行と場所を確認したらセグメントフォールトの問題は解消しました。ありがとうございます

    キャンセル

0

発生している問題はセグメントフォールトですか?
コンパイルエラーではないですか?つまり、a.outはできていますか?

少なくとも上記コードはそのままだとコンパイルエラーです。閉じカッコが足りません。
およそ正しかろうと思える程度に修正したところ、問題なく動作しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/14 17:47

    if((*(array + j)) < (*(array + (j-1))){ … ✕
    if((*(array + j)) < (*(array + (j-1)))){ … ◯

    キャンセル

  • 2016/07/14 17:48

    ご指摘ありがとうございます。訂正しましたけどやっぱりセグメントフォールトでした

    キャンセル

  • 2016/07/14 17:51

    あらぁ、ほんとですか。すみません。あてがはずれました。

    キャンセル

0

これ、ファイルをコンパイルして実行したらセグメントフォールトエラーが起きるように読めましたが、そんなことないですよね?
カッコの数も違うし、tmp と temp などの間違いもあるし、まずコンパイルできません。

もし実行できているとしたら、それはこのソースから生まれたものではありません。
違うものを実行しているはずです。

もしかしてコンパイラ、もしくはあなたがコンパイラと思ったものが先輩の作った間違った実行ファイルということはありませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/14 17:52

    どのようにコンパイルし、どのように実行しているのか詳しく書いてみてください。

    キャンセル

0

>1行多かったからでした。
何行あってもソートできるように改造しなければ実用には耐えられませんね。
mallocでメモリーを作ってそこに入れられるようにすればこの問題は解消します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/14 18:29

    もっと言うならEOFまで読み込むのではなく、COUNTまで読むことで
    プログラムが落ちることは回避できます。
    COUNTより多かったら警告を表示して終わることも必要ですね。

    キャンセル

0

for(i=0;i<(COUNT-1);i++) {
    for(j=(COUNT-1);j>i;j--) {
      if((*(array + j)) < (*(array + (j-1)))){
        temp=(*(array + j));
        (*(array + j))=(*(array + (j-1))));
        (*(array + (j-1))))=temp;
      }
    }
  }


そもそもこれ、挿入ソートじゃない。バブルソートだ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る