プログラミング学習記録【8日目】
断捨離
大学に入ってから、ものを買う機会は増えたが、増えたものを減らす努力を怠って来た。結果、必要が物がどこにあるかもわからない始末である。必要なときにないからまた買ってしまい、またものが増えてしまう。つい先日、ホッチキスの替芯を探していてふと思ったのだ。探しものもできないこんな世の中じゃ、と。
そして今日、色々調べて断捨離(もどき)をやってみた。やってみると、本当に必要なものは両手で数えるくらいしかなくて、逆に捨てる方法に迷ってしまう始末だ。世の中が便利になり、新しいものが出るたびに物を増やしてしまっては、自分の周りを煩雑にしてしまうだけだと気付かされた。
本当に必要なものを必要なだけ持っているのは、こだわりが強い人みたいで、どことなくかっこいい。
2.01.ループの書き方と範囲for文
ループの書き方は以下の手順でプログラムを書くと良い。
1. ループを使わないで書く
2. パターンを見つける
3. ループで書き直す
C++には配列の要素に対する処理を完結に書くことができる範囲for文という構文が用意されている。
for (配列の要素の型 変数名 : 配列変数) {
// 各要素に対する処理
}
例えば
for (int x : a) {
cout << x << endl;
}
というソースコードの場合、
配列関数aから1つ取り出してxという変数にコピー → xの値を出力 →次の要素をxにコピー → xの値を出力 → …
というループとなり、すべての要素を取り出し終わるとループを抜ける。
この範囲for文はコンテナと呼ばれるデータ型に対して使うことができる。他にも文字列string型はコンテナの一種なので、範囲for文を用いることができる。
EX16.隣り合う同じ値を探す
5つの要素が与えられ、同じ値の要素が隣り合っていれば”Yes”を、なければ”No”を出力するプログラムを作る。
存在する場合としない場合でifの場合分けをして、その時の判定としてjudgeを用意、これにtrueかfalseがはいって
if(judge)
とすれば出力の場合分けが楽なのでこれを用いる。
judge=falseとしておいて、隣り合う要素があったときだけjudge=trueとすればif文が減らせるので、定義の際
bool judge = false
としておく。
この問題でループするのは、判定する要素と判定で、判定回数は5この要素の隣同士を判定するので4回。よってループ文は
for(int i = 0; i < 4; i++){
if(data.at(i) = data.at(i + 1)){
judge = true;
}
}
とすれば良い。これを組み込みつつ、最後の出力まで作ったプログラムがこちら。
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> data(5);
for (int i = 0; i < 5; i++) {
cin >> data.at(i);
}
// dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する
bool judge = false;
for (int i = 0; i < 4; i++)
if (data.at(i) = data.at(i + 1)){
judge = true;
}
}
if(judge){
cout << "Yes" << endl;
}
else{
cout << "No" << endl;
}
}
無事コンパイルできたので提出。
できてない…
どこができてないのか見ようと思い詳細を確認。
全部やん。
なにかおかしいところはないかコードを眺めながらぽちぽち実行もしてみて考えること数分。
…あ!最初のifのところ、data.at(i) = data.at(i + 1) になってる!そりゃ全部正解になっちゃうな笑。==に書き直して再提出。
また…
そもそも、全部WAになっちゃうのはおかしくないか?
…はい。問題は最後まで確認しましょう。
YesではなくYES。
NoではなくNO。
明日はもっと早い時間から始めようと思う。あと問題文は最後まで読む。