ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:beibe_hosi テーブル配列の中身、出力値
困り度:
  • 困っています
お世話になっております。
C言語勉強中のものです。
一定のひもをランダムに切断し、その長さを測ろうと思っています。
前回アドバイスを頂き、ソートを使って書いてみたのですが、詰まる部分があったのでご指導いただきたいと思いました。


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

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))

  int GetRandom(int min, int max);
  int compare_int(const void* a, const void* b);
  int compare_str(const void* a, const void* b);

int main(void)
{
  int int_table[] = {GetRandom(0,10000)};
  int i;

  qsort( int_table, ARRAY_SIZE(int_table), sizeof(int), compare_int );

  for( i = 0; i < ARRAY_SIZE(int_table); ++i )
{
    printf("%d\n",int_table[i] );
}

  return 0;
}

int compare_int(const void* a, const void* b)
{ 
 return ( *(int*)a - *(int*)b );
}

int GetRandom(int min, int max)
{
    return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}

【困っている箇所】
・int int_table[]={} の中身に次のようなものを入れることで、ランダムに切ったひもを、ソートできると考えているのですが、その方法を色々ためしましたが上手くいきませんでした。このようなやり方で良いのか、その場合どのようにしたら良いか、また違うのかを教えていただきたいです。

for(i=0;i<10;i++)
{
printf("%d\n",GetRandom(0,10000));
}

・また最終的にソートしたものを比較させようと思っています。
「出力値を保存する方法」が分からないので教えて頂きたいです。

----前回ご覧になってくださった方へ----
アドバイスありがとうございました。
まだ初心者ですが、色々ご教授下さるとうれしい限りです。
質問投稿日時:08/04/17 23:04
質問番号:3955784
最新から表示回答順に表示

回答

 

回答者:yuu_yuu こんばんは、#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]);
  }
}

こんな感じでいかがでしょうか?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/21 22:13
回答番号:No.3
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:yuu_yuu まず、前回の質問を見ている人が解答をつけるとは限りません。
全部書くのが面倒でしたら前回のURLを張るなどして誘導するか、前回の内容も含め
全部書いてください。

で、解らないのが、一定の長さのひもの長さは10000固定で、切る回数は10回固定で、
切る長さがランダムというこでOKでしょうか?

また、その切るのアルゴリズムはどようなものをお考えですか?
例えば、元が10000のひもを10回切る(最終的にひもは11本)のだから、
最初は1〜9999の間で乱数を発生させ、10000から発生した乱数を引いた数と、
発生した乱数と比較し大きかった方を次に切るひもとする。。。とか
考え方は、他にもありますが。。。

以下はソース上の突っ込みです。

ココの部分コンパイル通ってますか?
int int_table[] = {GetRandom(0,10000)};

私が知らないだけで、テーブルの初期クリアで関数が(C++だから?)使えるのかも知れません。
使えるとしても、ランダムな数字が1つ入るだけだと思います。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/18 00:12
回答番号:No.2
この回答への補足指摘ありがとうございます。
前回のURLは次に貼り付けます。
http://oshiete1.goo.ne.jp/qa3949526.html

一定のひもの長さ、切る回数はこれから色々変えていこうと思っています。
ひもの長さを、int 型で定義しようとしているので、出来るだけ長くして、少数が入らないようにと考えています。

>最初は1〜9999の間で乱数を発生させ、10000から発生した乱数を引いた数と、
発生した乱数と比較し大きかった方を次に切るひもとする。。。とか

この方法も考えてみたのですが、やり方がよく分からなかったので、今回では、まずひもの位置を乱数で発生させ、その後その差を取ろうと考えていました。この方法も、また考えて生きたいと思います。

>ココの部分コンパイル通ってますか?
int int_table[] = {GetRandom(0,10000)};

この部分のコンパイルは一応問題ないようでした。
しかしながら、指摘の通りランダムの数字が1つ入るだけでした。
この部分にランダムに切った値がいくつか入るようにしたかったのですが、そのやり方がわかりませんでした。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:asuncion > このようなやり方で良いのか

コンパイル時にエラーが出ませんか?
配列の要素数はいくつほしいですか?
100個だとします。

乱数を取得する前に一度だけ、srand()か何かを使って初期化します。
初期化していないと、何度実行しても同じ結果を得るだけで、あまりおもしろくないと思います。
そういう結果でよければ、srand()は不要です。

次に、100回(配列の要素数)まわるループを構成します。
ループの中でGetRandom()を実行し、配列の所定の場所に格納します。
後はqsort()なり他の関数を使うなりで、ソートします。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/17 23:48
回答番号:No.1
この回答への補足ご解答ありがとうございます。
コンパイル時にエラーは出ませんでした。
配列の要素数はまだ考えていませんでした。

初期化はしていませんでした。time関数などを考えていましたが、後々考慮しようと思っています。初期化することで違う結果が出るのであれば、その方法も試してみたいと思います。

配列の所定の場所に格納する方法が分からず詰まってしまいました。
もう一度考えて見ます。
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示