質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

2回答

427閲覧

Visual studio C++

kk3taro

総合スコア6

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/07/29 08:35

Visual studio C++でサイコロを50回振り、1〜6の数字が何回出たかを調べるということをやろうとしています。

#include "stdafx.h"
#include <time.h>
#include <iostream>
#include <string>
using namespace std;

int main()
{
int N[50], kazu[7];
int count[6 + 1] = { 0 };//さいころの目 1~6ごとのカウント
for (int J = 1; J <= 50; J++) { N[J] = 0; };
kazu[1] = 0;
kazu[2] = 0;
kazu[3] = 0;
kazu[4] = 0;
kazu[5] = 0;
kazu[6] = 0;
kazu[7] = 0;

//乱数生成の準備
srand((unsigned)time(NULL));
//50個の乱数を表示する
for (int i = 1; i <= 50; ++i) {
N[i] = rand() % 6 + 1;
if (N[i] == 1) { kazu[i] = kazu[1] + 1; }
if (N[i] == 2) { kazu[i] = kazu[2] + 1; }
if (N[i] == 3) { kazu[i] = kazu[3] + 1; }
if (N[i] == 4) { kazu[i] = kazu[4] + 1; }
if (N[i] == 5) { kazu[i] = kazu[5] + 1; }
if (N[i] == 6) { kazu[i] = kazu[6] + 1; }
if (N[i] == 7) { kazu[i] = kazu[7] + 1; }
cout << N[i] << " " << kazu[i] << "¥n";
};
return 0;
}

このコードでやっていて、1が1回出現するたびに増やす2が1回出るたびに〜〜という感じにやろうと思ってましたが、全く上手くいきません…

どうすればいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bull

2019/07/29 09:00

最終的に欲しいのは 1~6 の出た回数ですよね。 とすると、N の役割は何でしょうか? Nを配列にする必要はありますか?
guest

回答2

0

C/C++では配列を

c++

1int N[50];

と宣言したら、その配列の添字は0~49までになります。

なので、

c++

1for (int i = 0; i < 50; i++)

でfor文を回さないとだめです。
どうしても[1]~[50]でアクセスしたければ

C++

1int N[51];

と宣言すればできます。
-858993460 とかの数値が表示されるのは、配列をオーバーアクセスしているためです。(運良く暴走してないだけ)

投稿2019/07/29 08:52

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

多分これでなおるはず・・・

if (N[i] == 1) { kazu[i] = kazu[1] + 1; }
if (N[i] == 2) { kazu[i] = kazu[2] + 1; }
if (N[i] == 3) { kazu[i] = kazu[3] + 1; }
if (N[i] == 4) { kazu[i] = kazu[4] + 1; }
if (N[i] == 5) { kazu[i] = kazu[5] + 1; }
if (N[i] == 6) { kazu[i] = kazu[6] + 1; }
if (N[i] == 7) { kazu[i] = kazu[7] + 1; }

if (N[i] == 1) { kazu[1] = kazu[1] + 1; }
if (N[i] == 2) { kazu[2] = kazu[2] + 1; }
if (N[i] == 3) { kazu[3] = kazu[3] + 1; }
if (N[i] == 4) { kazu[4] = kazu[4] + 1; }
if (N[i] == 5) { kazu[5] = kazu[5] + 1; }
if (N[i] == 6) { kazu[6] = kazu[6] + 1; }
if (N[i] == 7) { kazu[7] = kazu[7] + 1; }

色々まずそう。
とりあえず動きそうな感じに修正するとこんな感じ。

cpp

1#include <iostream> 2#include <time.h> 3#include <stdio.h> 4using namespace std; 5 6int main() 7{ 8int N[50], kazu[7]; 9int count[6 + 1] = { 0 };//さいころの目 1~6ごとのカウント 10for (int J = 1; J <= 50; J++) { N[J] = 0; }; 11kazu[1] = 0; 12kazu[2] = 0; 13kazu[3] = 0; 14kazu[4] = 0; 15kazu[5] = 0; 16kazu[6] = 0; 17//kazu[7] = 0; // int N[50], kazu[7];と定義されてるのでkazu[7]にアクセスしちゃだめ 18 19//乱数生成の準備 20srand((unsigned)time(NULL)); 21//50個の乱数を表示する 22for (int i = 1; i <= 50; ++i) { 23N[i] = rand() % 6 + 1; 24if (N[i] == 1) { kazu[1] = kazu[1] + 1; } 25if (N[i] == 2) { kazu[2] = kazu[2] + 1; } 26if (N[i] == 3) { kazu[3] = kazu[3] + 1; } 27if (N[i] == 4) { kazu[4] = kazu[4] + 1; } 28if (N[i] == 5) { kazu[5] = kazu[5] + 1; } 29if (N[i] == 6) { kazu[6] = kazu[6] + 1; } 30//if (N[i] == 7) { kazu[7] = kazu[7] + 1; } // ここいらない 31}; 32for(int i=1;i<=6;i++){ 33cout << kazu[i] << endl; 34} 35return 0; 36}

投稿2019/07/29 08:41

編集2019/07/29 09:04
yokuda

総合スコア138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kk3taro

2019/07/29 08:45

やってみたんですけど、実行結果(回数)が-858993460 とか出て来てしまいました…
yokuda

2019/07/29 08:49

なるほど・・・ よく見てみると、いろいろ怪しいところがありました。 たとえば、iが50のとき以下のコードが実行された場合、Nとkazuのサイズをオーバーしてアクセスしてしまいますね。 cout << N[i] << " " << kazu[i] << "¥n";
yokuda

2019/07/29 08:50

サイコロの出目をカウントするfor文と集計を表示するfor文を分けたほうがいいでしょう。
yokuda

2019/07/29 08:56

とりあえず動きそうな感じに修正するとこんな感じ。 #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main() { int N[50], kazu[7]; int count[6 + 1] = { 0 };//さいころの目 1~6ごとのカウント for (int J = 1; J <= 50; J++) { N[J] = 0; }; kazu[1] = 0; kazu[2] = 0; kazu[3] = 0; kazu[4] = 0; kazu[5] = 0; kazu[6] = 0; //kazu[7] = 0; // int N[50], kazu[7];と定義されてるのでkazu[7]にアクセスしちゃだめ //乱数生成の準備 srand((unsigned)time(NULL)); //50個の乱数を表示する for (int i = 1; i <= 50; ++i) { N[i] = rand() % 6 + 1; if (N[i] == 1) { kazu[1] = kazu[1] + 1; } if (N[i] == 2) { kazu[2] = kazu[2] + 1; } if (N[i] == 3) { kazu[3] = kazu[3] + 1; } if (N[i] == 4) { kazu[4] = kazu[4] + 1; } if (N[i] == 5) { kazu[5] = kazu[5] + 1; } if (N[i] == 6) { kazu[6] = kazu[6] + 1; } //if (N[i] == 7) { kazu[7] = kazu[7] + 1; } // ここいらない }; for(int i=1;i<=6;i++){ cout << kazu[i] << endl; } return 0; }
yokuda

2019/07/29 08:58

アドバイスするとすれば、 * countが使われていないので不要 * 使わなくて済む変数はできるだけ作らない このコードをもう少しスリムに書くとこんな感じになります。 #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main(void){ int count[7]={0}; srand((unsigned)time(NULL)); for(int i=0;i<50;i++){ count[rand()%6+1]++; } for(int i=1;i<=6;i++){ cout << count[i] << endl; } return 0; }
yokuda

2019/07/29 09:02

ちなみに、Visual Studioを使っているのであれば、デバッグでステップ実行が簡単にできるので、 一度、そこで挙動を見てみるのもおすすめですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問