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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

5回答

2574閲覧

挿入ソートで昇順したい

nortordam

総合スコア25

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/07/14 08:01

編集2016/07/14 09:09
#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ケタの整数です。 恐らくループやどこかの記述が間違っているんだと思いますが、そこがどこかわかりません できればお願いします

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

C

1 for(i=0;i<(COUNT-1);i++) { 2 for(j=(COUNT-1);j>i;j--) { 3 if((*(array + j)) < (*(array + (j-1)))){ 4 temp=(*(array + j)); 5 (*(array + j))=(*(array + (j-1)))); 6 (*(array + (j-1))))=temp; 7 } 8 } 9 }

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

投稿2016/07/15 05:15

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2016/07/14 09:26

maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maiko0318

2016/07/14 09:29

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

0

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

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

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

投稿2016/07/14 08:49

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2016/07/14 08:52

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

0

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

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

投稿2016/07/14 08:32

tnd-.-b

総合スコア247

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nortordam

2016/07/14 08:41

ソートメインの部分でしょうか、ありがとうございます。訂正しましたけど、問題は変わらずセグメントフォールトでコンパイルエラーではありませんでした
tnd-.-b

2016/07/14 08:45 編集

ここもですね int i,j,tmp; … ✕ int i,j,temp; … ◯
tnd-.-b

2016/07/14 08:47

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

2016/07/14 08:48

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

2016/07/14 08:51

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

0

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

投稿2016/07/14 08:18

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nortordam

2016/07/14 08:28

一応、printfを挿入して試してみたら、getFile(data);が非VOId 関数の終わりに到達しましたという警告がでました
ttyp03

2016/07/14 08:33

その警告は良くわかりませんが…、getFileのあとのデバッグ文が出力されないということでしょうか。 例えばこんなデバッグ文の場合ですけど。 printf("getFile start\n"); getFile(data); printf("getFile end\n"); だとすれば、ファイルの行数に対して配列の数が足りてないとかですかねぇ。
nortordam

2016/07/14 08:44

配列のCOUNTの数を増やしたり減らしたりしたんですけど変わりませんでした
ttyp03

2016/07/14 08:50

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

2016/07/14 08:50

もしくはstaticをつけるか。
nortordam

2016/07/14 09:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問