- ベストアンサー
昇順ソートの方法とは?
- sort.txtから読み込んだ値を昇順でソートして出力するにはどうしたらよいでしょうか?
- C言語のプログラムを使用して、sort.txtから値を読み込み、昇順でソートして出力する方法を教えてください。
- sort.txtに書かれた値を昇順でソートして出力するためのC言語のプログラムを作成したいです。具体的な手順を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス >sort.txtから読み込んだ値を >昇順でソートして出力するにはどうしたらよいでしょうか? 読み込み部分が正しくないありませんね。 ファイルに数値のみしかないならfscanf()関数を使って すべてを配列に代入してからソートすれば良いでしょう。 ・下にサンプルを載せておきます。 サンプル: int data[ 10000 ]; ←ちょっと多めに宣言 int max; // fscanfで読み込み for ( max = 0 ; max < 10000 ; max++ ){ if ( fscanf(fin,"%d\n",&data[max]) != 1 ){ break; } } // ここでソート qsort( data, max, sizeof(int), strcmp_value ); 注意事項: ・比較関数の strcmp_value は作り直して下さい。 作り方分かりますよね。 ポイントは整数値の比較ですよ。
その他の回答 (4)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >これではうまくいきませんでした。 >初心者なので、どこがダメなのかよくわかりません。 >アドバイスをお願いします。 ↑ 配列をちゃんと理解していませんね。 間違っている箇所は >fprintf(fout, "%d\n", data); の表示部分だけです。 ここさえ直せば動くでしょう。 テキスト(教本)で『配列とは』を読み直して下さい。 特に配列の内容をprintf()関数などで表示する方法を探す。 ・簡単すぎるので勘を働かせて下さい。 試行錯誤すれば初心者でも身につきます。
お礼
ありがとうございました。 皆さんのおかげで解決しました。 とても助かりました。
- yokomaya
- ベストアンサー率40% (147/366)
>fprintf(fout, "%d\n", data); 配列のdataがこれで出ます?
- yaemon_2006
- ベストアンサー率22% (50/220)
文字列じゃなきゃだめ?
補足
>文字列じゃなきゃだめ? sort.txtの数値を昇順でソートできれば別にかまいません。
- yokomaya
- ベストアンサー率40% (147/366)
根本的にqsortを使うには、そのテキストファイルの全てがメモリー上に配置されなければなりません。入れ替えするのですから。 従って配列sを一次元で確保してますが二次元にする(或いは全て一括でfreadしてポインター配列を別途確保するか)事が必要です。 まず全部をメモリーに読んで表示出来てからqsortに進みましょう。
補足
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> /* 比較関数 */ int numcmp_asc(const void *, const void *); int main(void) { FILE *fin, *fout; int i; char s[256]; int data[10000]; int max; if( (fin=fopen("sort.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } for(max = 0; max < 10000; max++){ if(fscanf(fin, "%d\n", &data[max]) != 1){ break; } } qsort(data, max, sizeof(int), numcmp_asc); fprintf(fout, "%d\n", data); fclose(fin); fclose(fout); return 0; } /** * 数値を昇順で比較します。 * @param na 比較する数値 * @param nb 比較する数値 * @return na が nb と等しい場合は 0 、 * na が nb より小さい場合は -1 以下、 * na が nb より大きい場合は 1 以上 */ int numcmp_asc(const void *na, const void *nb) { return *(int *)na - *(int *)nb; } これではうまくいきませんでした。 初心者なので、どこがダメなのかよくわかりません。 アドバイスをお願いします。