ページ 11

またまた質問です。

Posted: 2009年10月17日(土) 01:32
by sweden
学校の宿題をやっているのですが、aをn回足すってどういう風に書けばいいんでしょうか??初歩的ですいません。

Re:またまた質問です。

Posted: 2009年10月17日(土) 01:38
by 御津凪
どこまで習っているのかは質問から汲み取れませんが、
for 文を使えば可能です。

Re:またまた質問です。

Posted: 2009年10月17日(土) 01:41
by sweden
すいません。まだfor文は習っていない状態です。for文を使わなくでできる方法はあるのでしょうか?

Re:またまた質問です。

Posted: 2009年10月17日(土) 01:50
by 御津凪
他の方法には
・while 文
・goto 文
・再帰処理
がありますが、多分習っていないと思いますし。

もしかしたら、「aをn回足す」の部分の表現を言い換えたものが答えなのでは?

Re:またまた質問です。

Posted: 2009年10月17日(土) 01:58
by sweden
レスありがとうございます。while文、if文は習いました。具体的な数字は出ないのでアルファベットa,nとおいたのですが・・・。これがどうしてもわかりません。while文で考えたのですがどうしてもひらめきません。どう書けばよいのでしょうか??

Re:またまた質問です。

Posted: 2009年10月17日(土) 02:04
by 御津凪
基本的なC言語の構文の意味で出題されているのであれば、
「aをn回足す」の答えは、「a×n」と同じなので、これと同等の命令文が答えなのかもしれません。

Re:またまた質問です。

Posted: 2009年10月17日(土) 02:18
by sweden
すいません、説明不足でした。今サイコロをn回振り、出た目の平均を出す問題をやっていいるのですが、出た目をaとおいてやっているのでaはランダムに1~6まで出てくるんです。なので、出た目の合計の出し方がわからなくて困っている状態です。

Re:またまた質問です。

Posted: 2009年10月17日(土) 02:31
by 御津凪
では、おおよそ以下のような順序になります。

1. 合計を格納する変数を用意しておく。(0で初期化、ここでは仮に x とする)
2. while 文で n 回ループさせる。
3. その中で 1 ~ 6 のランダムの数値を出し、その値を x に足す。
4. x を n で割れば出た目の平均が算出される。

この方法であれば、 while 文から出た時に x は出た目の合計となるはずです。


※ところで、http://dixq.net/board/board.htmlを読みましたか?

Re:またまた質問です。

Posted: 2009年10月17日(土) 02:40
by sweden
ありがとうございます。その方法でやっているんですが、n回ループさせるってのはそうやるんでしょうか??たびたびすいません。
読んでませんでした。迷惑かけてすいません。

Re:またまた質問です。

Posted: 2009年10月17日(土) 02:44
by 御津凪
> 2. while 文で n 回ループさせる。
// 1. の処理部分
while(n > 0){
    // ループ内の処理(3. の処理部分)
    n--;
    // n--; (--n;)を習っていないのなら、
    // n -= 1; か、 n = n - 1; でも可
}
// 4. の処理部分
だいたいこんな感じです。

Re:またまた質問です。

Posted: 2009年10月17日(土) 02:48
by sweden
何回もありがとうございます!!やってみます。

Re:またまた質問です。

Posted: 2009年10月17日(土) 03:52
by sweden
やってみましたが上の方法だとnが0として定義されちゃいませんか??
答えがでません。while文の中身をのせるのでコメントお願いします。
while(n>0){
z=rand()/R15; //[0,1)-一様乱数
me=(int)(z*6)+1; //さいころの目
S=S+me;
n=n-1;
}
printf("平均は%lfです。",S/n);
}

Re:またまた質問です。

Posted: 2009年10月17日(土) 07:17
by toyo
nは繰り返したい回数で初期化しないといけませんよ
100回繰り返したいなら
n = 100;
while ( n > 0) ...

Re:またまた質問です。

Posted: 2009年10月17日(土) 13:34
by sweden
レスありがとうございます。繰り返す回数はいちばん最初にscanfで入力することになってるんです。なので困っています・・・・。

Re:またまた質問です。

Posted: 2009年10月17日(土) 15:36
by 御津凪
scanf で数字を読み込む方法は理解していますか?
scanf("%d", &n); // 入力した数字を数値として n に読み込む
あと、while 文で n を変更している( 1 ずつ引いている)ので、
ループを抜けた後は n は 0 になってしまいます。
ので、 while 文に入る前に別の変数に退避し、
平均の計算時に退避した変数を使用すると良いでしょう。

また、 S/n としていると、整数の結果を返してしまう(小数点以下が切り捨てられる)ので、
浮動小数点型(float か double)に変換して割る必要があります。
例: (double)S / n
(どちらかが浮動小数点値なら、浮動小数点として計算されます)

Re:またまた質問です。

Posted: 2009年10月17日(土) 17:05
by sweden
どうしても警告が出てしまってできません・・・・。プログラムはこんな感じです・・・。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main(){
int n,me,kaisuu;
double avereage,z,S,R15=RAND_MAX+1;//R15=2^15
srand((unsigned int) time(NULL)*314159265);
printf("さいころを振る回数を入力してください。");
scanf("%d",&n);
n=kaisuu;
S=0;
while(n>0){
z=rand()/R15; //[0,1)-一様乱数
me=(int)(z*6)+1; //さいころの目
S=S+me;
n=n-1;
}
avereage=S/kaisuu;
printf("平均は%lfです。",avereage);
}

Re:またまた質問です。

Posted: 2009年10月17日(土) 17:13
by MNS
n=kaisuu;
これは逆ではありませんか?
kaisuu = n;

Re:またまた質問です。

Posted: 2009年10月17日(土) 17:19
by sweden
できました~~!!ありがとうございます!ほんとに迷惑かけてすいませんでした。また疑問が出たらよろしくです。