競技プログラミングを始めて2か月。私のC++経験歴も2か月になり、そろそろ文章に書くほどの内容を身に付けたと思うのでぼちぼち書いていきます。今回は基本入出力のお話をします。
##基本入力
C++で入力を行うときは、cinを使ってあげる。演算子>>とかとても直感的かつ書きやすいので良い。それ以前にCを少し書いていたことがあったので、この楽さに初め感動した。
cin >> n; //入力を変数nに格納
こんな感じに連続して入力を受け取ることもできる。
cin >> input1 >> input2;
int型だろうと、char型だろうと、string型だろうと基本何でもこの形で入力を受け取れる。注意は空白で前の入力と次の入力を区切っていること。なので、競技プログラミング以外の場面などで空白以外の例えばカンマでの区切りの入力を受け取るのに苦労したり、入力の文字列に空白が含まれてたりすると思わぬ結果が出る。カンマ区切りで受け取りたい場合は、string型で受け取ってあげて、splitとかしてあげるといいらしい。(知らんけど)
cin >> string; //入力が"abc def"だと受け取るのは"abc"のみ
cin >> a >> b; //入力が1,2のときa=1,b=0とかになる
幸運なことにC++はCとの互換性があるので、Cでのようにscanfを使ってあげるとカンマ区切りも受け取れる。こんな感じ。
//入力が1,2など(整数),(整数)で与えられる場合
int main(){
int a, b;
scanf("%d,%d",&a,&b); //a=1, b=2
return 0;
}
ただこれにも面倒くさい点はあって、この入力方式は入力されるものの型だったり、変数のアドレスを意識していないと詰むことがある。今回だったら%dみたいな%(入力の型に応じた文字)だったり、アドレス演算子&だったり。
複数の入力をまとめて入力したいときには配列を作ってあげて、for文をぶん回す。例えば、数値配列だとこんな感じ。
int main(){
int n, i;
cin >> n;
int a[n];
for(i=0; i<n; i++){
cin >> a[i];
}
return 0;
}
実はこれC++のルール的にはアウトな書き方らしい。どうも配列の要素数の定義に変数を使うとまずいらしい。が、そんな事細かいことは競技プログラミングでは関係ない。実務ではまずいが。
##基本出力
出力をするときにはcoutを使うこのときの演算子<<の向きに注意。
特に何も考えずに出力できるのはいい。
cout << n; //変数nの値を出力
このときに複数の出力をしても、空白などで区切られない。文字列の出力には便利だが、数値の出力には不便といった感じ。
a = 1;
b = 2;
cout << a << b; //出力結果:12
cout << a << ' ' << b; //出力結果:1 2
cout << a+b; //出力結果:3
coutも同様に面倒くささ回避のために、代わりにprintf()を使ってあげることもできる。
//a=1, b=2のとき
printf("%d %d",a,b); //出力結果:1 2
printf("%d,%d",a,b); //出力結果:1,2
printf("%d",a+b); //出力結果:3
これも出力の型に気を付けないといけないのはscanfと同様。だけどこっちは、アドレス演算子&がいらない。これはC言語が値渡ししているのに関係しているのだと思う。(詳細は割愛)
##終わりに
今回はC++での基本入出力のお話でしたが、暇とネタがあれば言語に関わらず投稿していきたいと思います。ではでは。