プログラム・プロブレム

第二回 データ型・入力(C++)


I 挨拶

初(以下H):オッス、初(はじめ)だぜ、覚えてるよな。
涼(以下S):涼(すず)です。お久しぶりです。
H:今回はデータ型の概要と入力についてだ。どんどん行くぜ。
S:まずは前回の最後に出てきたデータ型ですね。

II データ型

S:関数シグネチャの所でちょっと出てきた「int」とか「char*」とかについてです。
H:こいつらは名前の通り、データの型を表しているわけだ。数字とか文字列とか。

整数型

S:整数の型が「char」「short」「int」「long」「long long」です。
H:使える数値の範囲が違っているのと、消費するサイズが違うのがポイントだ。
S:広い範囲の数値を扱えるものほど、大きい領域を使っちゃいます。
H:それから、コンパイルする環境によってもサイズが変わる場合があるぞ。
S:今は32ビットCPUが多いですが、64ビットが主流になったら、また変わりそうですね。
H:こんな感じなのが整数型だ。通常は「int」を使ってれば十分だと思うがね。

小数型

S:続いては小数型です。これは「float」と「double」の2種類があります。
H:これもサイズと取り扱い範囲が違ってくる。一般的には「double」でいいはずだ。
S:「float」には独特の注意点があるそうですので、使う時は気を付けましょうね。

文字列型

H:そして文字列型なんだが… これはちょっと特殊な扱いになってる。
S:前回は「char*」が文字列型だと言いましたが、厳密には違います。
H:普通にイメージする文字列型は「std::string」とか「std::wstring」になるんだな。
S:ここで「普通にイメージする」っていうのは、代入したり演算したりできる事です。
H:要は数値型と同じように使いたい場合は「std::string」とかを使うってことだ。
S:前回の「char*」は、とりあえず読み込み専用の文字列型と考えてください。
H:これをしっかり理解するには「ポインタ」とか「配列」を理解する必要があるんだ。
S:この二つは C 言語や C++ 言語を勉強する時に一番つまづく場所だと言われています。
H:というわけで、文字列型はだいたい「std::string」を使っておけば何とかなる。
S:注意点は、std::string の利用には「#include <string>」が必要ってことです。
H:忘れるとコンパイルエラーで怒られるからな。

III ソースコード

S:それでは今回のサンプルコードを見てみましょう。
01:// input.cpp
02:#include <string>
03:#include <iostream>
04:int main(int argc,char* argv[])
05:{
06:  std::cout << "Input number:" << std::endl;
07:  int i = 0;
08:  std::cin >> i;
09:  std::cout << "Input +1 = " << (i+1) << std::endl;
10:
11:  std::cout << "Input word:" << std::endl;
12:  std::string str;
13:  std::cin >> str;
14:  std::cout << "Input:" << str << std::endl;
15:
16:  return 0;
17:}
H:前回よりもちょっと長いな。

S:06から09行目までが一つのまとまり、11から14行目までがもう一つのまとまりです。
H:それで10行目が空になってるわけか。目印なんだな。15行目もそうだな。
S:ええ。かたまり(ブロック)が分かりやすいように空行で分けるのはよくあります。

IV 解説

IV.a 前回の復習

01:// input.cpp
02:#include <string>
03:#include <iostream>
04:int main(int argc,char* argv[])
05:{
17:}
H:01行目は例によってファイル名のコメントか。
S:02と03行目はシステムのファイルを使うのでその宣言のインクルードです。
H:で、04行目がプログラムの内容を書くための定型句と。
S:はい。実際のプログラムは06行目から16行目になります。

IV.b 出力

06:  std::cout << "Input number:" << std::endl;
11:  std::cout << "Input word:" << std::endl;
H:06行目とか11行目は前回と同じだから、文字列の表示だな。
S:そうです。それぞれ画面に文字列を表示しています。

IV.c 入力

変数

H:そしていよいよ07行目と08行目が今回の注目ポイントだ。
S:まずは07行目です。これは「変数宣言」と呼ばれています。
H:「変数」って何かって?いい質問だ。プログラムは入力と出力と変数の計算で出来ている。
S:「変数」は「名前の書かれた箱」をイメージしてもらうと分かりやすいかもしれません。
07:  int i = 0;
H:07行目では「int」型の「i」という変数を準備して「0」で初期化してるんだが…
S:「int」は整数型でしたね。整数が入れられる「i」という名前の箱を用意して、それに0を入れます。
H:こうすることで、後から「i」の中身が変わっても同じ「i」という名前で指定できるわけだ。
S:「i = 0;」となっているので、この時点での「i」の中身は「0」となっています。

入力

08:  std::cin >> i;
H:そして、次の08行目で「std::cin >> i;」となっているわけだ。std::cin標準入力と呼ばれている。
S:出力の時に「std::cout」に「<<」で何かを渡すと表示されましたね。あれの逆です。
H:つまり「std::cin」から「>>」で「i」に何かを取ってくる。「i」は整数だから、何かは整数になる。
S:実際にプログラムを実行すると「Input number:」の次の行でプログラムが止まって見えるはずです。
H:ここで何かの数値(もちろん整数)を入力してリターンキーを押すと先へ進む。
S:「std::cin」は、普通はキーボードを指しているので、こうやってキーボードから何かを取ってきます。
H:この時点で、「i」にはキーボードから入力された数値(整数)が入れられることになる。
S:最初に入れておいた「0」は上書きされて消えてしまいますね。
H:例えばキーボードから「23」と入れてリターンしたとすると、「i」は「23」になるわけだ。

IV.d 出力ふたたび

09:  std::cout << "Input +1 = " << (i+1) << std::endl;
S:そして次の09行目ですが、ここも06行目と同様なので出力のプログラムになります。
H:問題なのは「(i+1)」の所だろうが、これは括弧が付いているので先に計算される。
S:前が「<<」なので「i+1」の結果を「<<」に渡すことになりますね。
H:さっきは「i」が「23」だったから「i+1」は計算すると「24」だな。この辺は数学と同じ感じだ。
S:結果として「Input +1 = 24」と表示されます。なんとなく想像できてた人はセンスありますよ。
H:ここまでが06から09行目までの動作になるわけだ。

IV.e 文字列の場合

文字列型の変数

S:11から14行目も似たような感じですね。違うのは変数の型が「std::string」で名前が「str」な所。
H:あとは「str = "";」になってないで「std::string str;」だけなのもポイントだな。
S:実は「std::string str = "";」でも動きます。意味はちょっと違うんですけどね。
H:とりあえずは「= なんとか」で初期化しても、名前だけで終わっちゃってもいいということだ。
S:名前だけの場合は、整数型と小数型はなんだか分からない数値で、他の型は型の規定値で初期化されます。
H:整数型と小数型は、できれば初期値を指定した方が安心できていいぞ。

表示と入力

11:  std::cout << "Input word:" << std::endl;
12:  std::string str;
13:  std::cin >> str;
14:  std::cout << "Input:" << str << std::endl;
15:
16:  return 0;
S:それで、11行目は文字列の表示ですね。もう問題無いでしょう。

H:12行目が「std::string」型の「str」の変数宣言だ。「std::string」の初期値は空文字列だな。

S:そして13行目が「std::cin >> str;」です。さっきと同じならキーボードから文字列を取ってきますが…
H:空白文字(スペースやタブ)が入っていると、ちょっと動作が期待と違うんだな、これが。
S:例えば入力が「string!」の場合は期待通りに「str」は「string!」になります。
H:ところが「I am genious.」とかだと「str」は「I」だけだったりする。しょんぼりだ。
S:これは「>>」演算子が読み込む時に、データは空白で区切られてると仮定しているためなんです。
H:とにかく、空白込みで一行まるまる読みたい時には別の方法を使わなきゃダメってことだ。
S:そういうわけで表示が「Input word:」になっていた訳です。気付いた人は偉いです。褒めてあげます。

H:その次の14行目はもう分かるよな。「str」に入った文字列(単語)を出力してるわけだ。
S:そして16行目で正常終了の 0 を返して終了ということですね。

V 終了

H:以上で今回の説明は終了だ。お疲れさん。
S:今回重要なのは「変数」の所です。これが使えないとプログラムが書けないのでしっかり覚えてください。
H:そして、なんと今回までの内容でプログラムの基本は覚えてしまったという驚愕の事実が発覚!
S:まあ、プログラムは入力・出力・変数の演算で出来ているので、そう言えなくもないです。
H:実際にはこの他に条件分岐と繰り返しの命令を覚えないと役には立たないがな。
S:それは次回以降ということですね。それでは、またお会いしましょう。

第二回 終了


一覧に戻る