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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

417閲覧

C++で1〜52までの数字を返す関数です。

Giovannaaa

総合スコア10

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/10 08:12

C++ ```### 前提・実現したいこと ここに質問の内容を詳しく書いてください。 C++で1〜52までの数字を返す関数が分かりません。 条件が重複しないようにと、数字がなくなった場合は0を返すのと、実行するたびに違う数字がでることです。 ■■な機能を実装中に以下のエラーメッセージが発生しました。 ### 発生している問題・エラーメッセージ

エラーメッセージ

### 該当のソースコード int draw(void) { const int NUMBER =52; static int a[NUMBER]; int t=0; int card=0; int total; int b; for(int i=0;i<NUMBER;i++){ a[i]=i+1; } srand(time(NULL)); total=NUMBER; for(int i=0;i<NUMBER;i++) { t=rand()%NUMBER+1; card=a[i]; a[i]=a[t]; a[t]=card; total--; } return t; } ```ここに言語名を入力 C++

試したこと

main関数は省いています。
このソースコードを試したのですができません。

補足情報(FW/ツールのバージ### ヘディングのテキストョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2020/07/10 08:23

提示のコードではどういう動作をしてどういう不具合があるんでしょうか
Giovannaaa

2020/07/10 08:28

error: called object type ‘int’ is not a function or function pointer. と出ます。 そのエラーコードは drawnumber = draw()と出ます。
dodox86

2020/07/10 08:36

「該当のソースコード」に書かれたコードは、ご自分で書いたものですか?そうでないならば、理解されていますか? > static int a[NUMBER]; があるので、何となく「一回生成した1から52までの数字を格納しておく配列」のように思います。未完成なint draw()関数を完成させろ、と言う問題なのではありませんか?
Giovannaaa

2020/07/10 08:41

助言してもらいながら作ったものですので、あまり理解はできておりません。 すみません。 はい。そうだと思います。
dodox86

2020/07/10 09:37

既に2件、回答をいただいているのと、ご提示のdraw()関数が意味不明(<ごめんなさい)なので私は回答は控えますが、本欄にコメントした責任として書くと、draw()で恐らくやりたかったこととしては、 (1) draw()が呼び出されるたびに1~52のいずれかの値を生成して、static int a[NUMBER];に収める。その値は取得済みなので、次に呼び出されたときは使わない。 (2) draw()が初めて呼び出されたとき、1~52の乱数を作成してstatic int a[NUMBER];の全てに収めておく。あとは呼び出されるたびに最初のa[0]から~a[51]の値を返す。 ような動きを目指していたのだと思います。助言されながら作った、と言うことですので、上記は既に説明済みであったのかもしれません。あるいは違う方法かもしれませんが。 ※以降はコメントを控えます。
Giovannaaa

2020/07/10 09:52

はい。説明不足ですみません。 ありがとうございました。
guest

回答3

0

ベストアンサー

そのエラーを出している、drawの呼び出し箇所を書かないと。
省略しているmain関数の部分がないとダメでしょう。

ぱっと見、
変数totalが無意味になっている。
returnでtを返したら途中の処理の意味がない。
これをヒントに頑張ってください。

なにを書いているのか分からないのならば整理しましょう。
最初のforループは何をしているのか、次のforループは何をしているのか。
そもそもdraw関数は何を期待しているのかを考えましょう。
結果、それぞれでなにをしたいのか箇条書きをして組み立てるとよいと思います。

投稿2020/07/10 10:03

編集2020/07/10 10:05
ardin

総合スコア555

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

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

Giovannaaa

2020/07/10 10:29

分かりました。ありがとうございます。
guest

0

こんなカンジ?

C++

1#include <iostream> 2#include <vector> 3#include <algorithm> 4#include <numeric> 5#include <random> 6 7class deck { 8 std::vector<int> body_; 9public: 10 deck() : body_(52,0) { 11 std::iota(body_.begin(), body_.end(), 1); // 1, 2, 3 ... 52 で埋めて 12 std::mt19937 gen(std::random_device{}()); 13 std::shuffle(body_.begin(), body_.end(), gen); // かき混ぜる 14 } 15 int draw() { 16 int num = 0; 17 // 空でないならひとつ取り出す 18 if ( !body_.empty() ) { 19 num = body_.back(); 20 body_.pop_back(); 21 } 22 return num; 23 } 24}; 25 26int main() { 27 deck d; 28 for ( int i = 0; i < 55; ++i ) { 29 std::cout << d.draw() << ' '; 30 } 31}

投稿2020/07/10 09:13

episteme

総合スコア16612

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

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

Giovannaaa

2020/07/10 09:28

丁寧にありがとうございます。
dodox86

2020/07/11 01:08 編集

コンパイラによってはコンパイル時オプションでC++11を明示しないとコンパイルエラーになってしまうようなので、試す際にびっくりしてしまうかもしれませんね。(私はビックリしてしまいました。。。汗)
guest

0

提示されたコードとは無関係な話になりますが…

「現実世界でカードを配る状況」を模倣するのがわかりやすいのではないでしょうか.
すなわち,最初にシャッフルして,あとは1枚ずつ取り出していく.


コードの雰囲気を示しますが,シャッフルするところは自身で解決してください.
「C言語 配列 シャッフル」とか「C言語 配列 ランダムシャッフル」とかで検索すれば,方法論はすぐ見つかると思うので.

C

1unsigned char Cards[52]; 2unsigned char NextIndexForCards = 0xFF; 3 4//デックの初期化 5void Initialize_Deck() 6{ 7 unsigned char i; 8 NextIndexForCards = 0; 9 for( i=0; i<52; ++i ){ Cards[i] = i+1; } 10 11 //TODO : ここで配列Cardsの内容を適当にシャッフルする 12} 13 14//デックから1枚カードを引く. 15//カードが残っていない場合は0を返す. 16int Draw_Card() 17{ 18 if( NextIndexForCards >= 52 )return 0; 19 return (int)Cards[ NextIndexForCards++ ]; 20}

投稿2020/07/10 08:26

編集2020/07/10 09:07
fana

総合スコア11996

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

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

Giovannaaa

2020/07/10 08:31

失礼ですが、それはどういうソースコードになるのでしょうか?
fana

2020/07/10 09:08

雰囲気を追記しました. 最初に Initialize_Deck() を呼んで初期化し,以降,Draw_Card()でカードを引いていく感じです.
Giovannaaa

2020/07/10 09:29

丁寧にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問