プロが教えるわが家の防犯対策術!

std::vector<std::string> に自分の好きなものの言葉を入れていってください。
例えば,std::vector<std::string> birds; に,"メジロ", "キジバト", ...と入れていく。
その後,そのベクターの中に特定の何かがあるかどうかを確かめるプログラムを書いてください。(例えば "オナガ" があるか)

だれか詳しい方教えていただけませんか

質問者からの補足コメント

  • うーん・・・

    まだ全然できていないんです。
    std::vector<std::string> birds;の中にどうやって入れるのかもわからないし、特定のものを探し出すのもわかっていないです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/04/22 20:02
  • うーん・・・

    このプログラムの中にある¥は何を表しているのでしょうか

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/04/23 12:42
  • ありがとうございます。いい勉強になりました。
    このプログラムの中のどこかに鳥の名前を入力すればよいのでしょうか。

    それと鳥の名前が入力した鳥の一致したら「一致しました。」一致しなかったら「一致しませんでした。」と出したいのですが、どうしたらよいでしょうか

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/04/23 16:04
  • 改造というのは付け足すのですか?それとも書き直すのですか?

    No.4の回答に寄せられた補足コメントです。 補足日時:2022/04/23 18:47
  • つらい・・・

    本当に申し訳ありません。ここまで教えていただいてヒントまで出していただいたにもかかわらず自分の力でこのプログラムを書き直して、画像のような結果を出すことができませんでした。
    頭が悪くてすいません。
    もしよろしければ書き直した場合のプログラムと解説をお願いしてもよろしいでしょうか

    No.5の回答に寄せられた補足コメントです。 補足日時:2022/04/23 23:21
  • うーん・・・

    ./a.out (a.out) メジロ キジバト オナガ と入力すると
    一致しませんでした。と出てきてしまうのですが、どうしたらいいのでしょうか。

    No.6の回答に寄せられた補足コメントです。 補足日時:2022/04/24 03:28
  • うーん・・・

    Microsoft Visual Studioを使ってやっているのですが、目的の単語の入力ができないんですよね。
    a.out メジロ キジバト オナガ
    一致しませんでした。
    コードも間違いはないはずなんですが、

    画像は張りたいのですが、ずっと読み込み中のままで張れません。ごめんなさい

    No.8の回答に寄せられた補足コメントです。 補足日時:2022/04/24 15:54

A 回答 (9件)

> 自分の力でこのプログラムを書き直して、画像のような結果を出すことができませんでした。



ん?
いや、#4のプログラムは修正済みですよ。そのまま打てばよろしい。
良く見れば#2のプログラムから「既に変わってる」のが分かると思うんですが。
#4のプログラムをそのまま打って下さい。そうすれば画像の通りになるでしょう。

> もしよろしければ書き直した場合のプログラムと解説をお願いしてもよろしいでしょうか

#4のプログラムにコメントつけていきます。

#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

int main(int argc, char* argv[]) {
 // コマンドライン引数で受け取った文字列の配列の長さ(argc)のベクタを用意する。
 std::vector<std::string> birds(argc);
 // 入力される文字列の為の「容器」を用意する。
 std::string name {};
 // コマンドライン引数はCで言う「文字配列」なので、それをC++のstringへと変換する。
 for (int i = 1; i < argc; i++) {
  birds[i] = std::string(argv[i]);
 }
 // ユーザー入力を受け取る
 std::cin >> name;
 /* std::any_of はユーザー入力で得たstringがbirdsと名付けられたstringのベクタに含まれてるかどうか調べる => https://cpprefjp.github.io/reference/algorithm/a …
返り値は「発見」した時1、見つからなかった場合は0となる。
この結果を用いて三項演算子( https://acceliv.com/2021/05/clang-ternary-operator )で出力用文字列を選ぶ。
結果、std::any_ofが1を返せば「一致しました」、0を返せば「一致しませんでした」が選ばれる。 */
 std::cout << (std::any_of(birds.begin(), birds.end(),  \ // この辺改造
             [&](const std::string& elem) \
             { return elem == name; }) ? \
       "一致しました。" : "一致しませんでした。") << std::endl;
}
この回答への補足あり
    • good
    • 0

> Microsoft Visual Studioを使ってやっているのですが、目的の単語の入力ができないんですよね。



となるとそれはVisual Studioの問題でしょう。
DOS窓かPowerShellで試したらどうなりますか?

ザーッと検索かけてみると、Visual Studio系でC++プログラムを開発する際、プログラム内でcin使ってる時に「入力を受け付けない」って事象がチラホラ書かれてるんですが、その現象ですかね。

まぁ、だから面倒でもDOS窓かPowerShellを別に立ち上げて、作ったプログラムを走らせてみるか、Visual Studio内でターミナル(端末)走らせてそっちでプログラム動かすか、とか言う手になるんじゃないかしらん。
もうこの辺なると、全然プログラミング自体とは関係ない話に突っ込んでるんですが。

参考ページを貼っておくので、該当する現象と照らし合わせて見て下さい。

Visual Studio 開発者コマンド プロンプトと開発者用 PowerShell:
https://docs.microsoft.com/ja-jp/visualstudio/id …

【C++】[VSCode]Code Runnerで標準入力(cin)のプログラムを実行する:
https://www.l08084.com/entry/2019/12/09/203814

再度C++でのcinの問題:
https://social.msdn.microsoft.com/Forums/vstudio …
    • good
    • 0

> ./a.out (a.out) メジロ キジバト オナガ と入力すると一致しませんでした。

と出てきてしまうのですが、どうしたらいいのでしょうか。

それこそ、スクショ撮って貼ってくれれば嬉しいんですが。
どうなってんだかハッキリ分かるんで。

ちなみに、僕の写真で

./a.out メジロ キジバト オナガ

って先頭に./が付いてるのは使ってるPCのOSがLinuxだからです。OSの要請でそうなってる。
Windowsならフツーに

a.out メジロ キジバト オナガ

と端末で打って(メジロとキジバトとオナガの間にはキチンと半角スペースが入る)、その後目的の単語を入力すればいい筈なんですがね。

あと、考えられるのが

1. ソースコードの打ち間違い
2. 使ってる端末(DOS窓/PowerShell)の文字コードがおかしい

って可能性があるんですが、どうなんだろう。
「このプログラミング誰か教えてください」の回答画像8
この回答への補足あり
    • good
    • 0

「\」について勘違いする人がひょっとするといるかもしれないので指摘しておく.



「\」にはいろいろな意味があるが #2 のように使う場合には
その (0個以上の空白につづく: C++23) 「直後」の改行とともに消え去って次の行と連結する
という効果を持つ. だから, 「長い行」を短く切るために使うことができる... んだけど, ここでは行を切っても全く問題なく処理されるので, 実はここの「\」に意味はない. この手の「\」が本質的に要求されるのは「プリプロセッサ処理の都合上 1行にしなければならない」場合に限られる (「1つのトークンをぶちぶち区切って複数行にばらまく」という頭のおかしい場合にも影響するけどこれは「本質」ではない).

あと, 規格上は
「\ の (あとに 0個以上の空白があってその: C++23) 直後に改行がある」場合に連結する
ことになっているので, #4 ないし #6 は規格違反.
    • good
    • 0

> 改造というのは付け足すのですか?それとも書き直すのですか?



書き直しです。
この回答への補足あり
    • good
    • 0

> このプログラムの中のどこかに鳥の名前を入力すればよいのでしょうか。



コマンドライン引数やってないの?
単にプログラム(例えばコンパイルしたらa.outだったとして)に引数として鳥の名前をテキトーに複数与えればいいだけ、です。

プログラムの起動例(プログラム起動時に複数の鳥の名前も入力する):

a.out メジロ キジバト オナガ

> 鳥の名前が入力した鳥の一致したら「一致しました。」一致しなかったら「一致しませんでした。」と出したいのですが、どうしたらよいでしょうか

一部分改造して下さい。

// ここから

#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

int main(int argc, char* argv[]) {
 std::vector<std::string> birds(argc);
 std::string name {};
 for (int i = 1; i < argc; i++) {
  birds[i] = std::string(argv[i]);
 }
 std::cin >> name;
 std::cout << (std::any_of(birds.begin(), birds.end(),  \ // この辺改造
             [&](const std::string& elem) \
             { return elem == name; }) ? \
       "一致しました。" : "一致しませんでした。") << std::endl;
}
「このプログラミング誰か教えてください」の回答画像4
この回答への補足あり
    • good
    • 0

> このプログラムの中にある¥は何を表しているのでしょうか



改行用途です。
プログラムの一行がやたら長くなるのを避ける為、「ここでプログラムの途中だけど改行しますよ」と教える為に使います。
そうすれば、コンパイラが「改行」を無視して「以降も継続して一行になってる」と解釈してくれます。
この回答への補足あり
    • good
    • 0

#include <vector>


#include <string>
#include <algorithm>
#include <iostream>

int main(int argc, char* argv[]) {
 std::vector<std::string> birds(argc);
 std::string name {};
 for (int i = 1; i < argc; i++) {
  birds[i] = std::string(argv[i]);
 }
 std::cin >> name;
 std::cout << std::boolalpha << \
  std::any_of(birds.begin(), birds.end(),        \
        [&](const std::string& elem)      \
        { return elem == name; }) << std::endl;
}
この回答への補足あり
    • good
    • 0

どこまでできていて, どこで何に困っている?

この回答への補足あり
    • good
    • 0

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