AtCoderをするためにC++の勉強を始めました【入出力について】

少し前に競技プログラミングをやってみようと思いAtCoderを始めました。しかしコンテストの時間帯(土日21:00~)というのはちょうど子供を寝かしつけている時間でなかなか参加できず、放置しておりました。しかし最近の盛り上がりを受け、コンテストに出なくても問題を解くだけでプログラミングの能力を上げることができるのではないかと思い、また始めることにしました。

以前はJavaを使っていたのでそのままでもいいかと思ったのですが、競技プログラミングをしている人はC++を使う人が多いです。理由は処理速度が速いからとか。せっかくなのでこの機会にC++を勉強してみようと思い、C++での回答を見てみました。するとやはり見慣れない書き方があったので調べてみました。

あるAtCoderの回答を見ると以下のようになっています。

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    int c = a * b;
    if (c % 2 == 0) cout << "Even" << endl;
    else cout << "Odd" << endl;
}

このコードを見た時、ん?となるのは以下の部分ではないでしょうか?

cin >> a >> b;

cout << "Odd" << endl;

こちらはそれぞれ入力と出力をやっているのですが、Javaをやっていた自分にとってはなかなか見慣れない書き方です。AtCoderでは入出力は基本になるので、今回はこちらについて書きたいと思います。

出力処理


まず入出力を使うためには1行目の#include <iostream>が必要になります。これを宣言することによってcoutやendl、cinなどのオブジェクトが使えるようになります(それぞれの意味は以下でみていきます)

出力は先ほどのコードでいうと以下の部分が出力になります。

cout << "Odd" << endl;

例えばJavaでコンソール出力する時は以下のように書くと思います。

System.out.print(表示する内容);

一方C++ではcount(標準出力)に対して出力対象を<<(出力演算子)で渡すことで出力されます。

cout << "Odd" << endl;

この書き方だとOddという文字列をcout(標準出力)に渡し出力されます。また、後ろについているendlの部分(最後は小文字のエル)は改行を表しています。最後は;を忘れないようにつけます。

ちなみにこのcoutですが、厳密には

std::cout << "Hello world" << std::endl;

このように先頭にstd::と付けます。しかし using namespace std;とつけることでこのstd::は省略できます。このusing namespace std;は名前空間と呼ばれるものでこの一文で明示することでstd::とつけなくてもよくなります。競技プログラミングでは入力を少なくすると共に無駄な文がなくなり見やすくなるためよく使われているようです。

入力処理


続いて入力処理ですが、こちらはコードでいうと

cin >> a >> b;

この部分になります。cinというオブジェクトに対して>>(入力演算子)を使います。上記を実行するとコンソール上で入力待ち状態になり、最初に入力したものがaへ、次に入力したものがbへ格納されます。

コード全体の解説


ということで最後に全体のコードを見てみます。

#include <iostream>
using namespace std;
 
int main() {
    int a, b;
    cin >> a >> b;
    int c = a * b;
    if (c % 2 == 0) cout << "Even" << endl;
    else cout << "Odd" << endl;
}

まず1行目で入出力オブジェクトを使えるようにします。
2行目は名前空間ですね。
4行目のmain()は関数と呼ばれるものでこのコードを実行するとこの{}で囲まれた部分が実行されます。
5行目はaとbという変数をint型(数値をいれますよという型)で宣言しています。
6行目はaとbに対して入力を受け付けています。
7行目はaとbを掛け算してcという変数に格納しています。
8~9行目はcに対してのif文でcが偶数だったらEven、奇数だったらOddという文字を出力しています。偶数かどうかの判定はcを2で割り余りがあるかどうかで判定しています。%は余りを求めるという意味になります。

これらは基本中の基本になるためまだまだ入り口です。C++の文法を覚えつつまずは灰色を脱出できるよう精進します。

ちなみに競技プログラミングの本といえば蟻本と呼ばれる以下の本が有名ですが

初学者はこっちの本から入るのがお勧めのようです。私もこちらの本を買って勉強しようと思います。

soon
  • soon
  • 1986年生まれのjavaプログラマー。28歳の時に7年働いた販売士からプログラマーに転職をする。常駐先を転々としながら日々生きています。