- ベストアンサー
C言語でテーブル配列の中身をソートする方法
- C言語でテーブル配列の中身をソートする方法について教えてください。
- ランダムに切断されたひもの長さを測るために、C言語でテーブル配列をソートする必要があります。どのようにすればいいのか教えてください。
- ソートされたテーブル配列を比較させる方法が分からず困っています。ソート結果を保存する方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> このようなやり方で良いのか コンパイル時にエラーが出ませんか? 配列の要素数はいくつほしいですか? 100個だとします。 乱数を取得する前に一度だけ、srand()か何かを使って初期化します。 初期化していないと、何度実行しても同じ結果を得るだけで、あまりおもしろくないと思います。 そういう結果でよければ、srand()は不要です。 次に、100回(配列の要素数)まわるループを構成します。 ループの中でGetRandom()を実行し、配列の所定の場所に格納します。 後はqsort()なり他の関数を使うなりで、ソートします。
その他の回答 (2)
- yuu_yuu
- ベストアンサー率41% (34/81)
こんばんは、#2です。 前回の質問確認させていただきました。 前の質問の#2の方の回答は、ランダムに発生させたひもの切る位置をテーブルに保存後ソートし 切る位置の差からひもの長さを求めると言った回答がでしたが、この考えでよろしいですか? >>「出力値を保存する方法」が分からないので教えて頂きたいです。 との事ですが、あまり難しく考えず、変数へ代入すれば良いだけです。 切る回数は10回、ひもの長さ100000固定とします。 ※同じ箇所をたまたま2回以上で切った場合の制御は考えていません。長さ0のひもが表示される。 その他、細かい仕様は質問者様が考えてください^^ #define CUT_COUNT = 10 #define HIMO_LENGTH = 100000 int main(void) { int int_table[CUT_COUNT]; // ひもを切る位置を保存する領域 int himo_table[CUT_COUNT+1]; // ひもの長さを保存する領域 int i; // ループカウンタ int iWork; // ワーク領域 // 初期クリア memset(int_table,0,sizeof(int_table)); memset(himo_table,0,sizeof(himo_table)); for( i = 0; i < CUT_COUNT; i++ ) { // ひもの切る位置をランダムに10個作成 int_tabel[i] = GetRandom(0,HIMO_LENGTH); } // int_tabelを昇順でソートする。 ソートのロジックは面倒なので割愛^^; iWork=0; for( i = 0; i < CUT_COUNT; i++ ) { // ひもの長さを計算しテーブルに保存 himo_table[i] = int_tabel[i] - iWork; iWork = int_tabel[i]; } // 最後のひもの長さ計算しテーブルに保存 himo_table[CUT_COUNT] = HIMO_LENGTH - int_tabel[CUT_COUNT-1]; for( i = 0; i < CUT_COUNT+1; i++ ) { // ひもの長さを画面出力 printf("ひも番号[%d] ひもの長さ[%d]", i+1, himo_table[i]); } } こんな感じでいかがでしょうか?
- yuu_yuu
- ベストアンサー率41% (34/81)
まず、前回の質問を見ている人が解答をつけるとは限りません。 全部書くのが面倒でしたら前回のURLを張るなどして誘導するか、前回の内容も含め 全部書いてください。 で、解らないのが、一定の長さのひもの長さは10000固定で、切る回数は10回固定で、 切る長さがランダムというこでOKでしょうか? また、その切るのアルゴリズムはどようなものをお考えですか? 例えば、元が10000のひもを10回切る(最終的にひもは11本)のだから、 最初は1~9999の間で乱数を発生させ、10000から発生した乱数を引いた数と、 発生した乱数と比較し大きかった方を次に切るひもとする。。。とか 考え方は、他にもありますが。。。 以下はソース上の突っ込みです。 ココの部分コンパイル通ってますか? int int_table[] = {GetRandom(0,10000)}; 私が知らないだけで、テーブルの初期クリアで関数が(C++だから?)使えるのかも知れません。 使えるとしても、ランダムな数字が1つ入るだけだと思います。
補足
指摘ありがとうございます。 前回のURLは次に貼り付けます。 http://oshiete1.goo.ne.jp/qa3949526.html 一定のひもの長さ、切る回数はこれから色々変えていこうと思っています。 ひもの長さを、int 型で定義しようとしているので、出来るだけ長くして、少数が入らないようにと考えています。 >最初は1~9999の間で乱数を発生させ、10000から発生した乱数を引いた数と、 発生した乱数と比較し大きかった方を次に切るひもとする。。。とか この方法も考えてみたのですが、やり方がよく分からなかったので、今回では、まずひもの位置を乱数で発生させ、その後その差を取ろうと考えていました。この方法も、また考えて生きたいと思います。 >ココの部分コンパイル通ってますか? int int_table[] = {GetRandom(0,10000)}; この部分のコンパイルは一応問題ないようでした。 しかしながら、指摘の通りランダムの数字が1つ入るだけでした。 この部分にランダムに切った値がいくつか入るようにしたかったのですが、そのやり方がわかりませんでした。
補足
ご解答ありがとうございます。 コンパイル時にエラーは出ませんでした。 配列の要素数はまだ考えていませんでした。 初期化はしていませんでした。time関数などを考えていましたが、後々考慮しようと思っています。初期化することで違う結果が出るのであれば、その方法も試してみたいと思います。 配列の所定の場所に格納する方法が分からず詰まってしまいました。 もう一度考えて見ます。