どうもはじめまして、アイスメガネと申します。
ただの感想記事です。簡単な問題でも面白いなぁ~と思ったので書き残しておこうと思います。
プログラムは学校の授業でやっていたので関数を使って方程式を解く、くらいのことはできるが、腰を据えてしっかりと学習したことはなかったので最近勉強をし始めました。
ただ簡単なプログラムでも動かなかったりするので何が悪いのかを考えるのが面白いんだな、というのが最近よくわかってきました。
今回間違えた簡単なプログラム
今回間違えたのは、読み込んだ数字まで、カウントアップするというプログラム。
ただし条件は、「表示するのは偶数のみ」という問題。
それでもいったんは詰む俺氏。これが間違えたやつ。
#include <iostream>
int main()
{
int no,i;
do {
printf("正の整数を入力してください。:");
scanf_s("%d",&no);
} while (no<0);
i= 0;
if (no > 0) {
while (i <= no) { //iがno以下ならば、実行し続ける。
if (no % 2 == 0) {
printf("%d ", i++);
}
}
printf("\n");
}
}
ちなみに元のただカウントアップするだけのプログラムは以下のもの。
#include <iostream>
int main()
{
int no;
printf("正の整数を入力してください。:");
scanf_s("%d",&no);
int i=0;
while (i<=no) {
printf("%d ",i++);
}
printf("\n");
}
入力してるのに0しか表示されないから、何が間違って表示されないのかと考えていたら、ただ「i++」の位置が間違っているだけでした。
if (no % 2 == 0) {
printf("%d ", i++);
}
ここに入れたら最初に読み込まれるのは必ず1割る2、つまりあまり1になりますね。
今条件式は「余りが0になった時」ですからそもそも「i++」されなず動かなくなっちゃいますよね。。
簡単なのに結構時間かかってしまった。。
正解のプログラム
正しく動いたプログラムはこんな感じでした。
#include <iostream>
int main()
{
int no,i;
do {
printf("正の整数を入力してください。:");
scanf_s("%d",&no);
} while (no<0);
i= 1;
if (no > 0) {
while (i <= no) { //iがno以下ならば、実行し続ける。
if ((i % 2) == 0) {
printf("%d ", i);
}
i++;
}
printf("\n");
}
return 0;
}
もとのただカウントアップするプログラムはiがすべて表示されるので、printf関数内にi++として入れられるけど、表示が限定される場合はそうはできない、ということなんですね。
iはあくまで0(修正して1)から入力した数まで動く、ただし表示は条件が付く、そういうことだったんですねぇ、、、
どこがどこを指しているのか、計算の動きと表示の動きを別々に考えることができているか?
この辺も大事なんだなぁ、と学びました。
まとめ
ただただ関数を作って処理を行う、ということならほどほどにはできますが、こういった本で勉強しなおすと、まだまだプログラムを組むための思考力が足りないなと思し知らされますね。。
もっと数こなそうと思います。
ちなみに今回使った参考書はこれです。こんな感じの基礎的な問題から入れるので私みたいな初心者にはぴったりでした。
https://amzn.to/3etLvCf
例題も多いのも個人的に気に入りました。
以前買った別のものは、わかりやすいけどあんまり身にはならなかったので。。。
それでは。