見出し画像

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

バイト

あまりバイトで起こったことを口外するのは良くないので誰とは言わないが、私はイベントの運営のバイトをしていて、先日、とあるアーティストのライブのお手伝いをすることになった。こういった業界ではかなり有名なバンドだったのだが、朝早くから本人様も来て、一緒に設営や撤去まで作業を行ってくれたのだ。
ここまでやってくれるアーティストはなかなかいなくて、無名なバンドでも手伝いにわざわざ来ることは少ない。お手伝いを雇うことに対価を支払っているわけで、ライブ自体体力のいるものだと思うので、それは当たり前のことなのだが、名前の通るようになった今でも手伝いを率先して行う姿は非常に痺れた。
そんな人柄もあってか、ライブは大盛況だったわけだが、セキュリティとして会場内に入っていた自分は(音だけしか聞けなかったが)心奪われてしまい、その日稼いだバイト代でそのアーティストのアルバムを今日買ってきてしまった。
そういうわけでテンションぶち上げなわけである。
ぜひ今度は客としてライブに参戦させてもらいたい。

1.15.関数

関数は自分で作成することもでき、これを関数を定義すると呼ぶ。
返り値はreturn 返り値;で指定する。

返り値の型 関数名(引数1の型 引数1の名前, 引数2の型 引数2の名前, ...) {
 処理
}

例;

int my_min(int x, int y) {

 if (x < y) {
   return x;
 }

 else {
   return y;
 }

}

このとき、my_minはint型で定義され、引数はx, y、if文内のreturn後ろのx, yがそれぞれの場合の返り値となる。
main文などでSTL関数と同じように呼び出すことができる。
返り値がない関数の場合、返り値の型にvoidを指定する。
返り値がvoid型の関数のreturnは

return;

と書く。
関数を自分で定義するのは、プログラムの重複が避けられたり、処理の塊に名前をつけられる、といったことの他に、再帰関数が書ける、といった利点が挙げられる。
関数の処理はreturn文に到達した時点で終了する。

EX15.三人兄弟へのプレゼント

3人兄弟それぞれのテストの和の積がプレゼントの予算になるらしいので、テストの点数を受け取って、予算を出力するプログラムを作る。
3人兄弟のAくんが途中までプログラムを書いてくれたのでこれを利用するらしい。

    #include <bits/stdc++.h>
   using namespace std;
    
   // 1人のテストの点数を表す配列から合計点を計算して返す関数
   // 引数 scores: scores.at(i)にi番目のテストの点数が入っている
   // 返り値: 1人のテストの合計点
   int sum(vector<int> scores) {
     // ここにプログラムを追記
   }
    
   // 3人の合計点からプレゼントの予算を計算して出力する関数
   // 引数 sum_a: A君のテストの合計点
   // 引数 sum_b: B君のテストの合計点
   // 引数 sum_c: C君のテストの合計点
   // 返り値: なし
   void output(int sum_a, int sum_b, int sum_c) {
     // ここにプログラムを追記
   }
    
   // -------------------
   // ここから先は変更しない
   // -------------------
    
   // N個の入力を受け取って配列に入れて返す関数
   // 引数 N: 入力を受け取る個数
   // 返り値: 受け取ったN個の入力の配列
   vector<int> input(int N) {
     vector<int> vec(N);
     for (int i = 0; i < N; i++) {
       cin >> vec.at(i);
     }
     return vec;
   }
    
   int main() {
     // 科目の数Nを受け取る
     int N;
     cin >> N;
    
     // それぞれのテストの点数を受け取る
     vector<int> A, B, C;
     A = input(N);
     B = input(N);
     C = input(N);
    
     // プレゼントの予算を出力
     output(sum(A), sum(B), sum(C));
   }

まずそれぞれのブロックで何が起こっているのかを読み解く。

N
A1 A2 ⋯ AN
B1 B2 ⋯ BN
C1 C2 ⋯ CN

で入力が与えられるので、最初のブロックは一人目の点数を配列として受け取って、その合計点を返り値とするプログラム。
ここは配列の数分forで関数を回して、適当な変数に合計点をぶち込んで行けばいいので、配列の数を.size()で取得して、

    int sum(vector<int> scores) {
     int total = 0;
     for (int i = 0; i < scores.size(); i++) {
         total += scores.at(i);
     }
     return total;
   }

という感じに関数を作ってみた。
次にoutput関数の中身だが、ここではsum関数で返り値にした3人それぞれの合計点の積を出力すれば良いので、簡単に

    void output(int sum_a, int sum_b, int sum_c) {
       cout << sum_a * sum_b * sum_c << endl;
   }

としておいた。main文を覗いてみてもこれで問題なさそう。

   #include <bits/stdc++.h>
   using namespace std;
    
   // 1人のテストの点数を表す配列から合計点を計算して返す関数
   // 引数 scores: scores.at(i)にi番目のテストの点数が入っている
   // 返り値: 1人のテストの合計点
   int sum(vector<int> scores) {
     int total = 0;
     for (int i = 0; i < scores.size(); i++) {
         total += scores.at(i);
     }
     return total;
   }
    
   // 3人の合計点からプレゼントの予算を計算して出力する関数
   // 引数 sum_a: A君のテストの合計点
   // 引数 sum_b: B君のテストの合計点
   // 引数 sum_c: C君のテストの合計点
   // 返り値: なし
   void output(int sum_a, int sum_b, int sum_c) {
       cout << sum_a * sum_b * sum_c << endl;
   }
    
   // -------------------
   // ここから先は変更しない
   // -------------------
    
   // N個の入力を受け取って配列に入れて返す関数
   // 引数 N: 入力を受け取る個数
   // 返り値: 受け取ったN個の入力の配列
   vector<int> input(int N) {
     vector<int> vec(N);
     for (int i = 0; i < N; i++) {
       cin >> vec.at(i);
     }
     return vec;
   }
    
   int main() {
     // 科目の数Nを受け取る
     int N;
     cin >> N;
    
     // それぞれのテストの点数を受け取る
     vector<int> A, B, C;
     A = input(N);
     B = input(N);
     C = input(N);
    
     // プレゼントの予算を出力
     output(sum(A), sum(B), sum(C));
   }

コンパイルも成功したので提出。

画像1

今回で第1章が終了となる。意外と時間がかかってしまった。
時間のあるうちにしっかりと勉強を進めておきたい。
そろそろ頭の良さそうな問題も解いていきたいところ。

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