こんにちは! mnbd(@mnbbbbbd)です。
AIZU ONLINE JUDGEの「ITP1_9_A 単語の検索」を解いてみましたので、その回答と解説をご紹介いたします。
プログラミング初心者なので、もっといい回答があるに違いありません。
あくまでも「動作はする」サンプルとしてご覧ください。
問題文
1つの単語 W と文章 T が与えられます。T の中にある W の数を出力するプログラムを作成して下さい。
文章 T に含まれるスペースまたは改行で区切られた文字列を単語 Ti とします。すべての Ti において単語 W と同じになるものを数えて下さい。
なお、大文字と小文字は区別しません。
Constraints
・Wの文字列の長さは10を超えない
・Wに含まれる文字はすべてアルファベット小文字である
・Tの1行あたりの文字列の長さは1000を超えない
Input
1行目に単語 W が与えられます。
続いて、複数の行にまたがった文章与えられます。END_OF_TEXT という文字列が文章の終わりを示します。
Output
単語 W の数を出力して下さい。
https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/9/ITP1_9_A
回答
#include <bits/stdc++.h>
using namespace std
int main() {
string w, t;
cin >> w;
int count = 0;
while(cin >> t) {
if(t == "END_OF_TEXT") {
break;
}
transform(t.begin(), t.end(), t.begin(), ::tolower);
if(t == w) {
count++;
}
}
cout << count << endl;
return 0;
}
解説
ワード用の変数wとテキスト用の変数tをそれぞれstring型、カウント数をint型で確保します。
ループで変数tにテキストの一単語を読み込み、小文字に変換して、変数wと同じか判定して、同じならカウントしてます。
この問題では、入力の終わりを「END_OF_TEXT」で指定されているので、それでループを抜けます。
ハマったポイント
transform関数のところでコンパイルエラーが出てハマりましました。
具体的にはtransform関数の最後の引数です。
実際に上記の書き方ですと、「::tolower」と指定すべきでした。
私はそこで「tolower」と指定したり、「using namespace std;」を消して「std::tolower」と指定したりしましたが、うまくいきませんでした。
いろいろネットで調べていたところ、transform関数では「std::tolower」となっているケースが多かったため、余計にわかりませんでした。
学んだこと
ハマリポイントに重なりますが、transform関数の引数について学びました。
まとめ
AIZU ONLINE JUDGEの「ITP1_8_C リング」を解いてみましたので、その回答と解説をご紹介いたします。
以上です。
読んでいただきありがとうございました!