• ベストアンサー

IF文 教えてください (BASIC)

1, 2, 3, 4 のいずれかの値を取る3つの乱数 x, y, z を同じ行に表示させ,さらに x=y=z=1 のときは「大当」, x=y=z≠1 のときは「当」, x, y, z のうち2つだけが一致したときは「惜」, 上記以外の場合は「残念」 と表示するプログラム ELSEIF文を用い,IF文およびEND IF文は1回で済ませる。 乱数x,y,zを表示することと IF文が分かりません。 RANDOMIZE FOR n=1 TO 3       PRINT INT (RND*4)+1; NEXT n

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> PRINT INT (RND*4)+1; こうしてRNDを直接表示してしまったら、後から計算に使ったりはできません (次にRNDを使ったら、新しい乱数が使われるので) 変数や配列に保存しましょう。 > ELSEIF文を用い,IF文およびEND IF文は1回で済ませる。 構造は簡単です。 問題中に日本語で書いてある条件を、プログラミング言語に翻訳するだけです。 もし x=y=z=1 のときは   「大当」と表示, そうではなく、もし x=y=z≠1 のときは   「当」と表示, そうではなく、もし x, y, z のうち2つだけが一致したときは   「惜」と表示, そうではなかったら   「残念」 と表示 少し難しいのは、条件の書き方です。 数学と違って、 「x=y=z=1」とは書けません、「A=B」「A<>B」といった「2つの値の比較」しかできません。 なので、 元の式を 「2つの値の比較」 と「『かつ』『または』『ではない』」といった論理演算との組み合わせで表現します。 例えば 「x=y=z=1」 は x=y かつ y=z かつ z=1 です。 「x, y, z のうち2つだけが一致」 は 「xとyが一致で zとは一致しない」または「yとzが一致で xとは一致しない」または「zとxが一致で yとは一致しない」 となります。 これをそのまま書けば、とりあえずはできます。 ここで、IF~ELSEIF~ELSE~END IF の性質を応用します。 このIF~ELSEIFには「上から順番に評価して、最初に条件が一致したものが実行される」という性質があります。 x=y=z≠1 の判定をしている、ということは、上の「 x=y=z=1」ではない、ということです。 このELSEIF で、 x=y=z の判定だけをします。 本来なら、x=y=zの時は x=y=z=1 x=y=z≠1 の2通りの可能性がありますが、=1の場合は、上のIFで一致するので、このELSEIFは実行されません。 つまり「x=y=z」だけ判定すれば、必ず「x=y=z≠1」になっている、ということです。 同様に、それまでの条件を考えれば「二つだけ一致」も判定を省略できます。

rider88
質問者

お礼

丁寧な解説、ありがとうございました。

関連するQ&A

  • Visual Basicで単語帳をつくりたい

    こんにちは!Visual Basicを使って単語帳をつくらなければならいのですが、作り方がさっぱりです。 現在このような感じになっていて実行ができないのですが どうすればいいのでしょうか? 単語は6つあります。 Sub French2() For I = 1 To 6 X = Int(Rnd * 4) + 1 Z = Cells(X, 1) + "は?" Y = InputBox(Z) If Y = Cells(X, 2) Then Z = "当たり!" MsgBox (Z) Next For I = 5 To 6 X = Int(Rnd * 5) + 6 Z = Cells(X, 1) + "は?" Y = InputBox(Z) If Y = Cells(X, 2) Then Z = "その調子!" Else Z = "残念!" MsgBox (Z) End If End Sub さらに工夫を施さなければならないのですが本当に分らないので困っています。回答お願いします!

  • 乱数の発生 Randomizeを入れた方が良いのか

    VBAについて教えてください。 --------------------------- Sub Randomizeを入れた場合() Dim intMax As Integer Dim intMin As Integer Randomize intMin = 1 intMax = 10 Debug.Print Int((intMax - intMin + 1) * Rnd + intMin) End Sub --------------------------- Sub Randomizeを入れていない場合() Dim intMax As Integer Dim intMin As Integer intMin = 1 intMax = 10 Debug.Print Int((intMax - intMin + 1) * Rnd + intMin) End Sub --------------------------- 上記二つのマクロを実行しても 同じような結果が得られる気がするのですがRandomizeは必要なのでしょうか? 一つのサブプロシージャーの中で1回しか乱数を発生させないのなら Randomizeを使って乱数を初期化する必要はないのですか?

  • VBA と JIS Full BASIC

     下のJIS Full Basic スタイルとだいたい同じようなコードを VBA で書いたのですが   Z = Sqr(x^2 + y^2) のところでエラーが出ます。どこがおかしいのでしょうか。 Function gcd(a, b)   Do While b <> 0    r = a Mod b    a = b    b = r   Loop   gcd = a End Function Rem 既約なピタゴラス数を求める Sub Pythagoras()  LAST = 200   LAST = 200   For x = 1 To LAST    For y = x + 1 To LAST      Z = Sqr(x^2 + y^2)      'ここでコンパイルエラーが出る      If Int(Z) = Z Then       If gcd(x, y) = 1 And gcd(x, z) = 1 And gcd(y, z) = 1 Then         Debug.Print x & ", " & y & ", " & z       End If      End If    Next y   Next x End Sub ---------------------------- JIS Full Basic スタイルのコード REM ピタゴラス数 FUNCTION gcd(a,b)   DO WHILE b <> 0    LET r = MOD(a,b)    LET a = b    LET b = r   LOOP   LET gcd = a END FUNCTION LET LAST = 200 FOR x = 1 TO LAST   FOR y = x + 1 TO LAST    LET z = SQR(x^2+y^2)    IF INT(z) = z THEN      IF gcd(x,y) = 1 AND gcd(x,z) = 1 AND gcd(y,z) = 1 THEN       PRINT x,y,z      END IF    END IF   NEXT y NEXT x END

  • 乱数 IFステートメント

    Debug.Print Int((11 - 8 + 1) * Rnd + 8) 「これって8~11までの乱数を発生させますよ」 という意味であってますか? そして、 Sub a() Dim 文字数 As Long 文字数 = Int((11 - 8 + 1) * Rnd + 8) If 8 >= 文字数 <= 10 Then MsgBox 文字数 & "は、8~10の間です" End If End Sub を実行すると、11でも MsgBox 文字数 & "は、8~10の間です" が表示されてしまいます。 「8~10の間なら」メッセージボックスを表示するには、 If 8 >= 文字数 <= 10 Then の部分をどうすればいいですか?

  • 乱数の利用

    僕の通う中学校では、乱数を利用してプログラムを作成することになりました。そしてプログラムを作りましたがステートメントがないと出てきます。どう解決すればよいでしょうか?これがプログラムです。 Dim a,b,c,d,e,f,g a=msgbox("幸せですか?",4) if a=6 then const b="運勢" randomize b=int(rnd*10) select case b case 0,1,2 c=messagebox("吉でした。彼女はいますか?",4) if c=6 then msgbox"90%",,b elseif c=7 then msgbox"60%",,b end if case 3,4,5 d=msgbox("凶でした。友達はいますか?",4) if d=6 then msgbox"60%",,b elseif d=7 then msgbox"20%",,b end if case 6,7 e=msgbox("末吉でした。",4) if e=6 then msgbox"60%",,b elseif e=7 then msgbox"40%",,b end if case 8 f=msgbox("大凶でした。夢はありますか?",4) if f=6 then msgbox"30%",,b elseif f=7 then msgbox"10%",,b end if case else msgbox"100%",,b end if elseif a=7 msgbox"0%" end select

  • 乱数について(Rnd関数)

    すみません。質問があります。 VBAを用いてパチスロシミュレータを作成しているのですが 乱数が偏っている気がしてなりません。 乱数はRnd関数を用いて0~65535の範囲で生成しています。 もちろん初期化時にRandomizeも用いています。 毎ゲーム開始時にそのゲームで必要な乱数を4つ r1 = Int(Rnd() * 65536) r2 = Int(Rnd() * 65536) r3 = Int(Rnd() * 65536) r4 = Int(Rnd() * 65536) というように生成しています。 それらの乱数を用いて複雑なモード移行などを行っているのですが、 ある条件下でr1のあるビットが1になりやすいというような現象が起こります。 乱数に法則性があることは不思議ではないんですが、Rnd関数による乱数っていうのは多少複雑な処理をしただけでこのような不具合が出る可能性があるのでしょうか。 私のプログラムに問題があるとは思うのですが、「もしかして、乱数のせいかも?」という疑念を抱いてデバッグするのはつらいものがあるので。 ですので、 ・変な使い方をすれば目に見えて偏る可能性もある。 という意見の方はその「変な使い方」というのを具体的に教えていただけないでしょうか? また、そのような意見の方がしばらくいらっしゃらない場合はRnd関数による乱数は実用上問題なく使えると解釈したいと思います。 よろしくおねがいします。

  • 乱数で・・・

       ラベル10枚に1~10までを乱数を入れたいのです ただしダブらない どうすればいいのでしょうか?? 自分で考えたのですがバグがあります ※コマンドをクリック ※クローンは用意済み Private Sub Command1_Click() Dim a(0 To 9) For i = 0 To 9 a(i) = Int(Rnd * 10)+1  For b = 0 To 9   If a(i) = a(b) Then     If i <> b Then     a(i) = Int(Rnd * 10) + 1     End If   End If   Next b Next i For c = 0 To 9 Label1(c).Caption = a(c) Next c End Sub バグの原因はなんとなくわかるのですがどうすればいいのか分かりません 素人ですいません。

  • if文について

    ソートのプログラムにおいて昇順・降順を選択して表示させるプログラムを書いてるのですが 下記のように記述するとエラーが出てしまいます。 よく調べたのですがエラー表示もよくわからないものなのでした。 どのようにすればうまく動くようになるのでしょうか? #include <stdio.h> #define swap(type, x, y) do {type t = x; x = y; y = t; } while (0) void bubble(int a[], int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) if (a[j - 1] > a[j]) swap(int, a[j - 1], a[j]); } } void bubble2(int a[], int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) if (a[j - 1] < a[j]) swap(int, a[j - 1], a[j]); } } int main(void) { int i; int x[7]; int nx = sizeof(x) / sizeof(x[0]); int select; printf("%d個の整数を入力せよ。\n", nx); for (i = 0; i < nx; i++) { printf("x[%d] : ", i); scanf("%d", &x[i]); } printf("昇順ですか降順ですか? 0:昇順/1:降順 >"); scanf("%d",&select); if (select == 0) bubble(x, nx); puts("昇順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); else bubble2(x, nx); puts("降順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); return (0); }

  • VBA AからZで乱数を発生させたい

    Sub AからZで乱数を発生させる() Dim 最大値 As Integer Dim 最小値 As Integer Randomize 最小値 = 1 最大値 = 10 Debug.Print Int((最大値 - 最小値 + 1) * Rnd + 最小値) End Sub --------------------------------------------------------- これを実行すると、1から10の間で乱数を発生させられるのですが、 AからZの間で乱数を発生させたい場合は、 このコードをどのようにすればいいでしょうか? アドバイスよろしくお願いします。

  • BASICでモンテカルロ法

    モンテカルロ法で円周率の推定値を計算することを最近習ったのですが、定積分でもそれが可能なのを知り、どうやってプログラムを組めばいいのか分からず、困っています。 例えば、定積分∫[0→1]x^2dx=1/3~0.333([0→1]というのは、積分範囲です。)をモンテカルロ法で計算すると、どういうプログラムを組めばいいのでしょうか? わかる範囲で書いてみたのですが…積分の範囲をどうやってプログラミングすればいいのか、いまいち分かりませんでした。 教えていただけると、助かります。よろしくお願いします。 RANDOMIZE INPUT n SET WINDOW -0.1,1.1, -0.1,1.1 DRAW GRID SET POINT STYLE 1 LET sumin=0 FOR i=0 TO n LET x=RND LET y=RND SET POINT STYLE 2 IF y<x*x THEN SET POINT COLOR 4 LET sumin=sumin+1 END IF ! PRINT USING "(%.####, %.####)": x,y PLOT POINTS: x,y NEXT i PRINT 1*1*sumin/n END