たけ さんが書きました:1次元以上INT_MAX-1次元以下の整数次元とはN=1,2,3.......ということですか?
整数なら大丈夫という意味ですか?すいません、用語も疎くて、、、
「整数なら大丈夫」は間違いです。なぜなら-65537も1000000000000000000も整数であり、これらの値は使えないからです。
Nとして1以上INT_MAX-1以下の数を入力できます。int型のサイズが4バイト、charのサイズが8ビットの環境では
INT_MAX-1==2147483646のことが多いと考えられます。
ただ、Nが100000を超えてくると(imaxを変えなければ)実行に長時間かかるようになるので、実用上問題ないと思います。
たけ さんが書きました:示してくれたプログラムの20行目と21行目の間にX=0;を挿入する必要がありますよね?
「示してくれたプログラム」とはどれのことですか?
自分が提示したNo.12のプログラムには必要ないはずです。
たけ さんが書きました:あと、srand((unsigned int)time(NULL));はmのfor文を回すたびに、乱数を変化させてくれるのですよね?
違います。
乱数を取得する関数は、一般にはある呼び出しとその次の呼び出しで同じ値が返らない
(もちろんたまたま同じ値のこともあるかもしれないが)ので、「乱数を変化させる」の意味がよくわからないです。
srand関数は、それを呼び出した時点で、そのあとに呼び出されるrand関数が発生させる乱数の系列を指定します。
たけ さんが書きました:srand((unsigned int)time(NULL));この中の文字の一つ一つの意味を説明していただけるとありがたいです。
一文字ごとの説明はめんどくさい上に意味がないと思うので、一トークンごとの説明で失礼します。
コード:
srand C言語標準ライブラリのsrand関数のアドレスが得られる識別子
( 直前で指定した関数(ここではsrand)を呼び出す演算子
( キャストの演算子
unsigned 符号なしの型を示す予約語
int short型以上long型以下のサイズの整数型を示す予約語
) キャストの演算子
time C言語標準ライブラリのtime関数のアドレスが得られる識別子
( 直前で指定した関数(ここではtime)を呼び出す演算子
NULL 「どこも指していない」ポインタ。よく((void*)0)と表される
) 直前で指定した関数(ここではtime)を呼び出す演算子
) 直前で指定した関数(ここではsrand)を呼び出す演算子
; C言語における文の区切りを表す記号
※今のところ仕様書を持っていないため、間違っているかもしれません
ついでにもう少しまとめた説明も書いておきます。
コード:
srand( srand関数を呼び出し、乱数系列を指定する
(unsigned int) 次の値(ここではtime関数の戻り値 : time_t型)をunsigned int型の値に変換する
time( time関数を呼び出し、1970年1月1日0時0分0秒(UTC)からの経過秒数を取得する
NULL time関数で時刻を格納する変数のアドレスを指定する
ここではNULLなので、変数を指定しない→変数に時刻を格納しない
) time関数を呼び出すためのカッコの終わり
) srand関数を呼び出すためのカッコの終わり
; C言語における文の区切り
たけ さんが書きました:srand(........の形は丸覚えで構わないですか?
特定の乱数系列を使用する必要がない場合(必要がある場合の例:占い、リプレイなど)は、丸覚えでいいと思います。
たけ さんが書きました:これは、毎実行時に異なる乱数を使うことができるというものですね。
だいたいあっていますが、time関数の仕様上前の実行から1秒経過する前に再び実行すると、同じ乱数になってしまうことがあります。
たけ さんが書きました:上に載せた私のプログラムで問題ないですか?
処理内容は大丈夫だと思います。
あとはインデントを整えれば、さらによくなると思います。