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

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

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

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

Q&A

解決済

1回答

889閲覧

複数の文字列をランダムに表示する方法

mol

総合スコア32

C++

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

0グッド

0クリップ

投稿2017/08/10 12:07

編集2017/08/10 12:08

こんばんは。もうすぐくる就職試験に備えて面接ソフトを作りたいのですが、ヘッダファイルにある質問を、毎回ランダムな順番で表示する方法が分かりません。どなたかいい方法をご存じないでしょうか。

###ヘッダーファイルhahahah.h

C++

1#include <iostream> 2#include <string> 3 4using namespace std; 5 6class 質問 7{ 8public: 9 string sibo = "\n当社を志望した理由はなんですか\n"; 10 string san = "\n三年間頑張ったことはなんですか\n"; 11 string news = "\n最近のニュースで関心のあるものはありますか?\n"; 12 string scho = "\n校長先生の名前はなんですか\n"; 13 string cho = "\nあなたの長所はどんなところですか\n"; 14 string tan = "\nではあなたの短所はどんなところですか\n"; 15 string toku = "\nあなたの学校について教えてください\n"; 16 void chotan(); 17 void situmon(); 18}obj; 19 20void 質問::chotan() 21{ 22 cout << cho; 23 Sleep(20000); 24 cout << tan; 25 Sleep(20000); 26} 27 28 29void 質問::situmon() 30{ 31 cout << sibo; 32 Sleep(60000); 33 cout << san; 34 Sleep(60000); 35 cout << news; 36 Sleep(60000); 37 cout << scho; 38 Sleep(10000); 39 obj.chotan(); 40}; 41

###ソースファイル

C++

1#include <iostream> 2#include <string> 3#include <windows.h> 4 5#include "hahahah.h" 6 7using namespace std; 8 9int main() 10{ 11 string a; 12 cout << "模擬面接を行います。準備ができたら[a]を入力してください\n"; 13 cin >> a; 14 15 if (a == "a") 16 { 17 cout << "模擬面接を開始します。\n"; 18 cout << "出身校とお名前を教えてください\n"; 19 20 obj.situmon(); 21 22 23 cout << "\n最後に何か質問はありますか\n"; 24 cout << "\n以上で面接は終了です。お疲れ様でした。\n"; 25 } 26 27 else cout << "無効なキーです:-("; 28 return 0; 29}

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問をstd::arrayで管理して、添え字をランダム指定すればよいと思います。

C++

1#include <array> 2#include <cstdlib> 3#include <iostream> 4#include <random> 5#include <string> 6 7namespace mol { 8 std::array<std::string, 7> questions = { 9 "当社を志望した理由はなんですか", 10 "三年間頑張ったことはなんですか", 11 "最近のニュースで関心のあるものはありますか?", 12 "校長先生の名前はなんですか", 13 "あなたの長所はどんなところですか", 14 "ではあなたの短所はどんなところですか", 15 "あなたの学校について教えてください" 16 }; 17} 18 19int main(void) { 20 std::random_device rnd_dev; // 後述の注意書きをご覧ください。 21 while(true) { 22 std::cout << mol::questions[rnd_dev() % 7] << std::endl; 23 } 24 25 system("PAUSE"); 26 return EXIT_SUCCESS; 27}

かなり簡潔に書きました。適宜改良して使ってください。
乱数の質に(多分)課題がありますし、質問者様のコードのようにスリープはしません。

※yumetodo様が乱数の利用について大変重要な情報を寄せてくださっています。
当該のコメントも併せてごらんいただけるようお願いいたします。


anndonut様のご指摘を受けて
std::arrayではなくstd::vectorを用いた方が、後々の改良の際に便利です。
どうせなのでクラス化もしました。雑なので改良の余地は大いにありますが、参考になれば幸いです。

C++

1class Question { 2private: 3 const std::vector<std::string> questions = { 4 "当社を志望した理由はなんですか", 5 "三年間頑張ったことはなんですか", 6 "最近のニュースで関心のあるものはありますか?", 7 "校長先生の名前はなんですか", 8 "あなたの長所はどんなところですか", 9 "ではあなたの短所はどんなところですか", 10 "あなたの学校について教えてください" 11 }; 12 std::random_device rndDev; // 前述の注意書きをご覧ください。 13 14public: 15 std::string getRandomQuestion(void) { 16 return questions[rndDev() % questions.size()]; 17 } 18};

using namespace stdは使わない方がいいですよ。
名前空間のメリットをぶち壊すことになります。

投稿2017/08/10 12:12

編集2017/08/10 18:57
LouiS0616

総合スコア35660

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

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

mol

2017/08/10 12:43

回答ありがとうございます! 稚拙な質問で申し訳ないんですが、教えていただいたコードにSleep関数は入れられますか?
mol

2017/08/10 12:45

あとusing namespace stdが、調べてみたところ、いろいろデメリットがあるみたいですね。当たり前のように使っていたので気づきませんでした。次からは名前空間にも配慮してコードを書こうと思います。
LouiS0616

2017/08/10 12:48

Sleepは入れられますよ。 クラスQuestionにgetRandomQuestionメソッドを作り、呼び出し側が出力/スリープする設計が素直かと思います。
LouiS0616

2017/08/10 12:50

色んな入門書に、当たり前のように書いてありますからね... using namespaceが。
mol

2017/08/10 12:55

入れられるんですね、よかった~(´∀`)
mol

2017/08/10 12:58

そうですね、参考書を改めて読んでみましたが、全部ついてましたよ、using namespace...。
LouiS0616

2017/08/10 12:59

悪しき慣習だと思います。
mol

2017/08/10 13:13

始めたばかりだと何も分かりませんからね...。関数だけでなく、そういうのも教わりたかったです。 あと教えていただいたコードなんですが、無限ループになってしまって、止める方法が分かりません。どうすればいいですか?
LouiS0616

2017/08/10 13:25

上限を決めるのが楽かと思います。
anndonut

2017/08/10 14:31

個人的にはvector::push_backを使う方が好きかなと。7というマジックナンバーを直さないとならないのはあまりいいことだとは思えないので。
LouiS0616

2017/08/10 14:36

おっしゃる通りだと思います。 今回は出来るだけ簡単に見えるコードを書きたかったのでarrayを用いましたが、私も日頃はvectorを使っています。 速度面でarrayの方が勝るのですが、普通にアプリケーションを組む分には無視できますものね。
LouiS0616

2017/08/10 14:37

vectorを用いる場合も回答に追記しておきます。 コメントありがとうございます。
yumetodo

2017/08/10 17:11

入門書に出てきた関数などは片っ端から https://cpprefjp.github.io で調べる癖をつけるといいかもしれませんね。現存する多くのC++本はほぼ例外なくなんかしらの問題を抱えているので鵜呑みにしないことが耐雪です
LouiS0616

2017/08/10 18:46 編集

ご指摘ありがとうございます、非常に勉強になります。 私自身乱数を用いたプログラムの作成経験があまりなく、半ば誤魔化す形で『乱数の質に(多分)課題があります』と表記しました。 もう少し検討して適切な方法を用いるか、あるいは疑似コードで表現すべきだったと反省しております。 コメントを参照する旨、回答に追記しておきます。
yumetodo

2017/08/10 18:53

なおstd::array VS std::vectorの話ですが、個人的にはtemplate化してrandom_access_iteratorに対する操作に抽象化したい思いがありますが今は眠いのでコードは書かないでおきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問