プロが教える店舗&オフィスのセキュリティ対策術

やりたいこと
20枚のカードから7枚を無作為に選んで結果を表示
その後その七枚の中に 熟慮,熟慮1,熟慮2が含まれていた場合にその3枚をたして確率を求め表示といったようなものを作りたいです。作ろうと思ったきっかけとかはおいといてください。
計算式などを書いたのですが表示されなくて困っております。どなたか途中まででいいので書いてくださると助かります。




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


int main(void){

int i,j;
int 瞬唱の魔道士 = 0,瞬唱の魔道士1 = 0,瞬唱の魔道士2 = 0, ボーラスの占い師 = 0,
ボーラスの占い師1 = 0,ボーラスの占い師2 = 0,修復の天使 = 0,修復の天使1 = 0,
修復の天使2 = 0, 霊異種 = 0, 中略 = 0, 中略1 = 0,灼熱の槍 = 0,灼熱の槍1 = 0,
熟慮 =0,熟慮1 =0,熟慮2 =0,アゾリウスの魔除け= 0,アゾリウスの魔除け1= 0,
アゾリウスの魔除け2= 0;
srand((unsigned int)time(NULL));
for(j = 0; j <= 6; j++){
i = rand() % 20+1;//


//分布を知るためにカウントしていく
if(i == 1)
瞬唱の魔道士++;

if(i == 2)
瞬唱の魔道士1++;

if(i == 3)
瞬唱の魔道士2++;

if(i == 4)
ボーラスの占い師++;

if(i == 5)
ボーラスの占い師1++;

if(i == 6)
ボーラスの占い師2++;

if(i == 7)
修復の天使 ++;

if(i == 8)
修復の天使1 ++;

if(i == 9)
修復の天使2 ++;

if(i == 10)
霊異種 ++;

if(i == 11)
中略 ++;

if(i == 12)
中略1 ++;


if(i == 13)
灼熱の槍 ++;

if(i == 14)
灼熱の槍1 ++;

if(i == 15)
熟慮 ++;

if(i == 16)
熟慮1 ++;

if(i == 17)
熟慮2 ++;

if(i == 18)
アゾリウスの魔除け ++;


if(i == 19)
アゾリウスの魔除け1 ++;


if(i == 20)
アゾリウスの魔除け2 ++;

}


printf("瞬唱の魔道士:%d\n", 瞬唱の魔道士);
printf("瞬唱の魔道士:%d\n", 瞬唱の魔道士1);
printf("瞬唱の魔道士:%d\n", 瞬唱の魔道士2);
printf("ボーラスの占い師:%d\n", ボーラスの占い師);
printf("ボーラスの占い師:%d\n", ボーラスの占い師1);
printf("ボーラスの占い師:%d\n", ボーラスの占い師2);
printf("修復の天使:%d\n", 修復の天使);
printf("修復の天使:%d\n", 修復の天使1);
printf("修復の天使:%d\n", 修復の天使2);
printf("霊異種:%d\n", 霊異種);
printf("中略:%d\n", 中略);
printf("中略:%d\n", 中略1);
printf("灼熱の槍:%d\n", 灼熱の槍);
printf("灼熱の槍:%d\n", 灼熱の槍1);

printf("熟慮:%d\n", 熟慮);
printf("熟慮:%d\n", 熟慮1);
printf("熟慮:%d\n", 熟慮2);
printf("アゾリウスの魔除け:%d\n", アゾリウスの魔除け);
printf("アゾリウスの魔除け:%d\n", アゾリウスの魔除け1);
printf("アゾリウスの魔除け:%d\n", アゾリウスの魔除け2);

return 0;
}

A 回答 (3件)

#1の補足を見て。


どうやら、日本語を変数に使えるコンパイラだと理解しました。


> - ほかのなにか? 確率の部分が表示されなくて困ってます。

この「表示されない」とは、文字通りの「表示されない」なのでしょうか?
だとしたら、添付されたプログラムに、確率計算している部分も、それを表示している部分もありません。「表示されない」のが正しい動作です。
確率を計算して、それを出力するように、プログラムに追加してください。


もし、計算部分、表示部分が作ってあって、その結果と、予想してる結果とが違うのなら、プログラムに間違いがあります。
どのように計算をやって、どんな結果が出ているのでしょうか?

予想として
(熟慮 + 熟慮1 + 熟慮2) / 7
など と計算していて、「結果がいつも0になる」のではないでしょうか?

あるいは
printf("確率 %f\n", (熟慮 + 熟慮1 + 熟慮2) / 7 ) ;
等とやって、「値が変」なのではないでしょうか?


Cの演算の原則として「整数型+整数型=整数型」「整数型 / 整数型 = 整数型(小数点以下切り捨て)」となります。
・ (熟慮 + 熟慮1 + 熟慮2) は int + int + intなので、intとなります。
・単に「7」と書いた場合、これは int 型の7 になります。
全体でint / int なので、答えは int になります。
確率の性質を考えれば、ほとんどの場合で 0 になります。100%のときだけ 1 です。

小数点以下の値を扱うには、浮動小数点型(double,float)を使用します。
intをこれらの型に変換するには、型変換(キャスト)を用います。
今回の場合、合計は整数のままで問題ないので、割り算をdoubleで行うように
(double)(熟慮 + 熟慮1 + 熟慮2) / 7
とします。 double / int は、自動でdouble / double として計算されます。


printf("確率 %f\n", (熟慮 + 熟慮1 + 熟慮2) / 7 ) ;
こちらの場合、計算結果がintなのは同じですが、別の問題があります。
printfに指定する引数は、 %の書式と一致させる必要があります。しかし、一致していない場合でも、コンパイルエラーにはなりません。(警告が出る場合はありますが、エラーにはなりません)
C言語の仕様の問題で、printfでは、引数の型を判断することができないのです。そのため、%の書式から、その指定した型だと断定して値を取り出そうとします。

%fはdouble型を要求します。それに対して、引数はintです。
このとき、int→doubleの変換は行われません。
intの数値のメモリ上での表現を、そのままdoubleのメモリ上の表現だと解釈してしまいます。
また、一般に、doubleはintよりもサイズが大きいです。intで足りない部分は、メモリの後の領域(そこに、何があるかはわかりません)まで勝手に使ってしまいます。
このため、引数で指定した値とはまったく違う値が出力されることがあります。



確率計算そのものについては、「何に対する何の確率」なのかが不明なので、例示できません。

この回答への補足

double ave( double 熟慮, double 熟慮1, double 熟慮2);



double ave(double 熟慮 ,double 熟慮1, double 熟慮2)
{
double wk;
wk=(熟慮+熟慮1+熟慮2)/60;
return wk;
}

書いてみたり

printf("計算:%d%f\n",(熟慮+熟慮1+熟慮2)/60);


してました
納得のいく回答を書いていらしていたのでベストアンサーにしておきます

補足日時:2013/08/09 16:22
    • good
    • 0

一般的なCコンパイラでは、変数名に日本語は使えません。


表示されないどころか、コンパイルもできません。

日本語が使える特殊なコンパイラだとすると、問題無さそうに見えるので、「実行できたけど、その結果を確認できない」ということが考えられます
例: Visual Studioで実行すると。一瞬DOS窓が開いて結果が出力されるが、実行終了と同時にDOS窓が閉じるので、内容を確認できない
    • good
    • 0

> 計算式などを書いたのですが表示されなくて困っております。



「表示されない」とは?
- コンパイルエラー?
- 何ひとつ出力されない?
- 結果がデタラメ?
- ほかのなにか?

> どなたか途中まででいいので書いてくださると助かります。

あなた途中まで書いてるやないですか。

この回答への補足

コンパイルエラー? ×
- 何ひとつ出力されない? × ランダムに表示されます
- 結果がデタラメ? ×
- ほかのなにか? 確率の部分が表示されなくて困ってます。

補足日時:2013/08/09 14:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!