ページ 11

lvalue required as ...

Posted: 2010年7月04日(日) 12:00
by タマ
学校の宿題で、患者が100人いる病院の平均診察時間を入力して、乱数を用いて診察時間を計算、
10人おきに改行して時間を表示するプログラムを作っています。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
srand((unsigned)time(NULL));
int kanja;
double kanjawait=0;
double kakuritu;
double ransu;
int wait;
double x=(double)rand()/RAND_MAX;
printf("平均診察時間は?(整数で):");
scanf("%d",&wait);
kakuritu=1/wait;
ransu=0+(double)(rand()*1-0+1.0)/(1.0+RAND_MAX);
while(kanja=0;kanja<100;kanja++)
{
while(ransu<kakuritu)
{
kanjawait++;
}
kanjawait++;
printf("%d ",kanjawait);
kanjawait=0;
if(kanja%10=9)
{
printf("\n");
}
}
return(0);
}

出力例:
2 16 2 8 2 11 26 3 3 2
34 11 25 26 4 24 2 7 7 22
3 4 31 13 14 2 21 6 23 21
3 9 6 20 25 2 4 8 2 2
13 12 9 3 4 12 5 4 18 9
7 28 4 4 24 34 2 2 2 7
9 3 11 4 7 12 7 4 2 12
10 33 12 5 14 4 2 7 9 7
23 4 2 7 3 4 5 6 58 3
5 5 16 23 4 30 5 10 5 11

これをコンパイルすると、 if(kanja%10=9)  の部分で、
lvalue required as left operand of assignmentなるものが出てきます。
一体どういう意味なのでしょうか?

Re:lvalue required as ...

Posted: 2010年7月04日(日) 12:03
by パコネコ
>lvalue required as left operand of assignmentなるものが出てきます。
これの意味はわかりませんが
if(kanja%10=9)はわざとですか?

Re:lvalue required as ...

Posted: 2010年7月04日(日) 12:11
by パコネコ
ワイのやつが(スタディCが)ダメなだけだと思いますが。
RAND_MAXって自分で定義するんじゃないんですね…
>srand((unsigned)time(NULL));
これも宣言の前に置けるんですか?

Re:lvalue required as ...

Posted: 2010年7月04日(日) 12:17
by パコネコ
>lvalue required as left operand of assignment
「左オペランドまたは割り当てとして必要な左辺値」
翻訳ソフト?によるとこうなるらしいです
左辺値を聞かれているのでやはり「=」が足りないのが原因だと思います

Re:lvalue required as ...

Posted: 2010年7月04日(日) 12:26
by Dixq (管理人)
RAND_MAXはrand()で返す値の最大値です。
stdlib.hにあるので、includeすれば使えます。

>>srand((unsigned)time(NULL));
>これも宣言の前に置けるんですか?

C++だと変数宣言は途中でも可能です。
スタディCがC++に対応しているかどうかは解りませんが、C++でコンパイルすると可能になるでしょう。

Re:lvalue required as ...

Posted: 2010年7月04日(日) 12:34
by パコネコ
スタディCはC言語のみだと思う…画像の回転とか縮小とかできないこと多いですが、使いやすいんですよね
DX?はうまく起動できなくてまだ使えていません…自分で作ったファイルだとすぐビルドできませんとか、exeが多いとか文句言われてしまって…簡単なものを作るときはすごく使いズらいです。
>C++だと変数宣言は途中でも可能です
そういえば、聞いたことがありましたね。C++だったんですか~途中でかけるやつ
==================
勉強不足で
===============
大変失礼しました。
画像

Re:lvalue required as ...

Posted: 2010年7月04日(日) 13:43
by タマ
>lvalue required as left operand of assignment
=を足したらエラーが消えました、ありがとうございます。

if(kanja%10=9)は、while文の中で最初の値がkanja=0となっているので
10個おきに行を移るには余りが9の時に改行するというつもりです。(0,1,2,3,4,5,6,7,8,9)

今度はwhile(kanja=0;kanja<100;kanja++)で、
expected ')' before ';' tokenと出てきました。
付近の')'が足りないと思い、直前の文章を
ransu=0+(double)(rand()*1-0+1.0/(1.0+RAND_MAX));
と最後の方に')'を足してみましたが駄目でした。

Re:lvalue required as ...

Posted: 2010年7月04日(日) 13:53
by fatens
とりあえず、whileではなくforでは。

Re:lvalue required as ...

Posted: 2010年7月04日(日) 15:25
by タマ
ありがとうございます。コンパイルが通るようになりました。
また少し文を変えてみました。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
srand((unsigned)time(NULL));
int kanja;
int kanjawait=0;
double kakuritu;
int wait;
double x=(double)rand()/RAND_MAX;
printf("平均診察時間は?(整数で):");
scanf("%d",&wait);
kakuritu=1/wait;
for(kanja=0;kanja<100;kanja++)
{
while(x>kakuritu)
{
kanjawait++;
}
kanjawait++;
printf(" %d",kanjawait);
kanjawait=0;
if(kanja%10==9)
{
printf("\n");
}
}
return(0);
}

以前のwhile(x<kakuritu)の状態だと全部1になってしまうので符号を逆にしたのですが、
今度は診察時間を入力した後に動かなくなってしまいます。

Re:lvalue required as ...

Posted: 2010年7月04日(日) 15:31
by シエル
while(x>kakuritu)
{
kanjawait++;
}

↑このループを抜けてないと思われます。

Re:lvalue required as ...

Posted: 2010年7月04日(日) 16:51
by box
> kakuritu=1/wait;

この文に問題があります。
例えば、waitに2が入っているとすると、
右辺の計算は1/2という整数同士の割り算となり、
結果は0です。0.5ではありません。
このため、kakurituには0.5ではなく0が入ります。
そういう結果をお望みではないと思います。

Re:lvalue required as ...

Posted: 2010年7月04日(日) 20:54
by タマ
while(x>kakuritu)においてxとkakurituの両方が整数になっているのだろうと思い、
kakurituの方をkakuritu=1.00/wait;に、
int wait;をdouble wait;に変えたところ、うまく100人分表示されました。
ですが、またしても全部1になっています。乱数が0~1の範囲で動いてないのでしょうか?

Re:lvalue required as ...

Posted: 2010年7月04日(日) 21:32
by box
> int wait;をdouble wait;に変えたところ、うまく100人分表示されました。

平均診察時間は、そもそも整数であることが前提ではないのですか?
もし前提であるなら、それを崩してはいけませんね。

Re:lvalue required as ...

Posted: 2010年7月04日(日) 23:14
by タマ
int wait;が理想的ですが、そうすると実行した際に、
ループから抜け出せなくなってしまうのですが何か良い方法はありますか?

Re:lvalue required as ...

Posted: 2010年7月04日(日) 23:16
by パコネコ
キャストとかいうのはダメなんですか?
ループの中で…これも前提崩してますかね?

Re:lvalue required as ...

Posted: 2010年7月05日(月) 18:13
by タマ
とりあえずdouble wait;のままにしておきます。

double x=(double)rand()/RAND_MAX;
この文は「0から1までの乱数を作る」の意味で合っているでしょうか?

Re:lvalue required as ...

Posted: 2010年7月05日(月) 21:47
by タマ
自己解決しました。いくつかの()内で乱数を何度も読み込ませたらうまく出来ました。
このプログラムの提出が今日の22:00までなのでとても嬉しいです。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
srand((unsigned)time(NULL));
int kanja,wait,kanjawait;
double x=(double)rand()/RAND_MAX;
printf("平均診察時間は?(整数で):");
scanf("%d",&wait);
for(kanja=0;kanja<100;kanja++)
{
kanjawait=1;
while(x>1.0/wait)
{
kanjawait++;
x=(double)rand()/RAND_MAX;
}
printf(" %d",kanjawait);
x=(double)rand()/RAND_MAX;
if(kanja%10==9)
{
printf("\n");
}
}
return(0);
}

Re:lvalue required as ...

Posted: 2010年7月05日(月) 21:58
by シエル
まさにギリギリですねwおめでとうございます!