見出し画像

プログラミング学習記録【2日目】

この学習記録が誰かの役に立つとは思えないが、それでもスキが来るたびに勉強の続きをしようという気にさせられる。独学を続けるきっかけになれば良いと思っている。

1.06.if文・比較演算子・論理演算子

if文はCと変わらないので割愛。
比較演算子、論理演算子は時々わからなくなるのでこの際しっかり覚えておこうと思う。

比較演算子
x == y  「xとyは等しい」
x != y   「xとyは等しくない」
x > y    「xはyより大きい」
x >= y 「xはy以上」

論理演算子
! 条件式 :条件式が偽のとき真
A & B    :条件式Aが真かつ条件式Bが真のとき真
A || B   :条件式Aと条件式Bの少なくとも片方が真

EX6.電卓を作ろう

2つの数値A,Bによる加減乗除を求めるプログラム。?、=、!が入力される可能性があるが、これはerrorとすること、除算の際Bが0のときもerrorと表示する。

#include <bits/stdc++.h>
using namespace std;
int main()
{
   int A, B;
   string op;
   cin >> A >> op >> B;
   if (op == "+")
   {
       cout << A + B << endl;
   }
   else if (op == "-")
   {
       cout << A - B << endl;
   }
   else if (op == "*")
   {
       cout << A * B << endl;
   }
   else if (op == "/")
   {
       if (B == 0)
       {
           cout << "error" << endl;
       }
       else
       {
           cout << A / B << endl;
       }
   }
   else if (op == "?" || op == "=" || op == "!")
   {
       cout << "error" << endl;
   }
}

これで提出。

画像1

次。

1.07.条件式の結果とbool型

bool型は条件の結果や状態が2つしか無いもの扱っていることを明示するために用いる。bool型って言葉初めて知った。

EX7.bool値パズル

    #include <bits/stdc++.h>
   using namespace std;
    
   int main() {
     // 変数a,b,cにtrueまたはfalseを代入してAtCoderと出力されるようにする。
     bool a = false; // true or false
     bool b = false; // true or false
     bool c = false; // true or false
    
     // ここから先は変更しないこと
    
     if (a) {
       cout << "At";
     }
     else {
       cout << "Yo";
     }
    
     if (!a && b) {
       cout << "Bo";
     }
     else if (!b || c) {
       cout << "Co";
     }
    
     if (a && b && c) {
       cout << "foo!";
     }
     else if (true && false) {
       cout << "yeah!";
     }
     else if (!a || c) {
       cout << "der";
     }
    
     cout << endl;
   }

上のプログラムをa,b,cのbool値を変えてAtCoderと出力、とのこと。
aは1つ目のif文でtrue、3つ目のif文で最後のelse-ifを発動させるため、!aはfalseなのでcはtrue、3つ目の1つ目のifは全部trueだと発動してしまいその後のelse-ifが発動しなくなってしまうので、bはfalseだと嬉しい。

#include <bits/stdc++.h>
using namespace std;
int main()
{
   // 変数a,b,cにtrueまたはfalseを代入してAtCoderと出力されるようにする。
   bool a = true;
   bool b = false;
   bool c = true;
   // ここから先は変更しないこと
   if (a)
   {
       cout << "At";
   }
   else
   {
       cout << "Yo";
   }
   if (!a && b)
   {
       cout << "Bo";
   }
   else if (!b || c)
   {
       cout << "Co";
   }
   if (a && b && c)
   {
       cout << "foo!";
   }
   else if (true && false)
   {
       cout << "yeah!";
   }
   else if (!a || c)
   {
       cout << "der";
   }
   cout << endl;
}

これで提出。

画像2

1.08.変数のスコープ

{ }の囲った部分をブロックと呼ぶ。
ブロック内で宣言した変数は、その内側のブロックでしか使えないというルールがあり、その変数が使える範囲のことをスコープと呼ぶ。
変数を宣言するブロックが異なれば、同じ名前の変数を宣言することができる。
スコープは、一度宣言した変数などの名前を別の場所でも使えるようにするためのもの。

EX8.たこ焼きセット

問題文のたこ焼きがどうたらこうたらに一瞬気を取られたが、要はものをいくらで売るか、いくつ売って合計金額はいくらになるかを算出し、コメントが有った場合そのコメントに!をつけて一緒に出力するプログラム、ということ。

#include <bits/stdc++.h>
using namespace std;
int main()
{
   int p, price, N;
   string text;
   cin >> p;
   // パターン1
   if (p == 1)
   {
       cin >> price >> N;
   }
   // パターン2
   if (p == 2)
   {
       cin >> text >> price >> N;
       cout << text << "!" << endl;
   }
   cout << price * N << endl;
}

問題文に与えられる文とはおおきく異なっても良い、とのことだったので、今回はこのようなプログラムにして提出。

画像3

正解。次。

1.09.複合代入演算子

同じ変数が2回出る代入文では、複合代入演算子を使うと短く書くことができる。+=、-=、*=、/= などと記述し、左辺に右辺を加減剰余する、というもの。
x=x+1、x=x-1はそれぞれx++、x--と書くことができ、インクリメント、デクリメントと呼ぶ。

EX9.複合代入演算子を使おう

整数x,a,bが入力される。
1. xに1を足した値
2. (1.で出力した値)に(a+b)を掛けた値
3. (2.で出力した値)に(2.で出力した値)を掛けた値
4. (3.で出力した値)から1を引いた値
の4つを1行ずつ出力するプログラムを作成する。

#include <bits/stdc++.h>
using namespace std;
int main()
{
   int x, a, b;
   cin >> x >> a >> b;

   // 1.の出力
   x++;
   cout << x << endl;

   // 2.の出力
   x *= a + b;
   cout << x << endl;

   // 3.の出力
   x *= x;
   cout << x << endl;

   // 4.の出力
   x -= 1;
   cout << x << endl;
}

これ作って初めて気がついたんだが、複合代入演算子ってこういう風に使うんだな… x=x*2 とか普通に書いてた。提出。

画像4

おーし、次。

1.10.while文

while(true)になるまで{ }内のプログラムをループする

EX10.棒グラフの出力

A、Bの2つの入力を点数として、各点数を ] の積み重ねによる棒グラフで示すもの。

#include <bits/stdc++.h>
using namespace std;
int main()
{
   int A, B;
   cin >> A >> B;

   int i = 0;
   cout << "A:";
   while (i < A)
   {
       cout << "]";
       i++;
   }
   cout << endl;
   
   cout << "B:";
   while (i < B)
   {
       cout << "]";
       i++;
   }
   cout << endl;
}

ここで自分の勘違いを発見。これを実行すると次のようになる。

10 5
A:]]]]]]]]]]
B:

つまり、i自体はmain内で使うことができるが、iの値のリセットは無い、ということだと思い、これを確認するため、次のように書き換えて実験してみた。

#include <bits/stdc++.h>
using namespace std;
int main()
{
   int A, B;
   cin >> A >> B;

   int i = 0;
   cout << "A:";
   while (i < A)
   {
       cout << "]";
       i++;
   }
   cout << endl;

   cout << i << endl;

   /* cout << "B:";
   while (i < B)
   {
       cout << "]";
       i++;
   }
   cout << endl; */
}

これを実行すると…

10 5
A:]]]]]]]]]]
10

はい、iの値はリセットしていませんでした。なぜこのような勘違いをしていたのか…スコープやらブロックの概念を間違って覚えていた。
これを踏まえて

cout << i << endl;

i = 0;

にして提出。

画像5

今日はここまでにします。
楽しかった。

この記事が気に入ったらサポートをしてみませんか?