第1章
ソースプログラムとソースファイル 画面 表示 行 。大文字 小文字 区別 、 使 、 示 打 込 。 ▼ プログラム中の余白や"などの記号を全角文字で打ち込んではいけません(記号文字の読み方 は、p.5 の Table 1-1 にまとめています)。余白の部分は、スペース・タブ・リターン(エンター) のキーを使って打ち込みます。 なお、環境によっては、逆斜線= \の代わりに円記号¥を使う日本独自の文 字コード体系が採用されています。みなさんの環境に応じて、必要ならば読みかえてください。 私 人間 、 ・数字・記号 構成 《文字 並 》 作成 。 ソースプログラム(source program) 呼 、 格納 ソースファイル(source file) 呼 。 打 込 、
mondai11.cpp
適当 名前 与 上 保存 。 、拡張子.cpp
.c
.cc
.C
処理系 。 環境 応 、必要 変更 。 ▼ sourceは、 もとになるもの という意味です。処理系は、C++ プログラムの開発に必要なソ フトウェアのことです。Microsoft Visual C++、GNU C++ など数多くの処理系があります。プログラムの実行 C++ 、C言語 Simula 作 、 指向 言語 。 、C++ 直接理解 実行 。 、 コンパイル リンク 作業 行 、実行プログラム 作成 必要 。 私 人間 読 書 《文字 並 》 、 理解
1
並 《 並 》 変換 。 ▼ ビット(bit)は、binary digit(2進数字)の略であり、または1の値をもつデータ単位です。 1ビットでは、と1の 2 種類の数を表せます。 手順 実行方法 処理系 異 、 参照 作業 行 。 実行結果 初めてのC++プログラム。 画面に出力しています。 問題1-1 ▶ 『新版 明解C++ 入門編』 List 1-1(p.4) コンソール画面に『初めてのC++プログラム。』と『画面に出力しています。』を、連続して一行 ずつ表示するプログラムを作成せよ。 // 画面への出力を行うプログラム #include <iostream> using namespace std; int main() { cout << "初めてのC++プログラム。\n"; cout << "画面に出力しています。\n"; }画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
完了 実行 。 、実行結果(左 内) 示 、 画面 出力 行 。 ▼ ソースプログラムに綴つづり間違いなどがあると、コンパイルエラーが発生し、その旨の診断メッ セージ(diagnostic message)が表示されます。その際は、打ち込んだプログラムをよく読み直して、 ミスを取り除いた上で、再度コンパイル・リンクの作業を試みましょう。 // 画面への出力を行うプログラム /* 画面への出力を行うプログラム */ ヘッダとインクルード 次 行 、以下 表明 行 指令 。 画面 入出力 行 (処理実現 部品 群) 関 情報 格納<iostream>
内容 取 込 。#
include
指令 行 、<iostream>
内容 入 。 結果、入 出力 利用 必要 情報 手 入 。<iostream>
他 、<string>, <iomanip>, <cstdlib>
提供 。 ヘッダ(header) 呼 。< >
中iostream
string
名 。#
include
指令 内容 取 込 、インクルードする(include) 。 コメント(注釈) 先頭行//
始 。連続 2個 記号//
、 行 以降 、 《読 手》 伝 。 表明 (Fig.1-1ⓐ)。 、 、 対 注釈=コメント(comment) 。他人 作成 適切 書 、読 理解 。 、自分 作 永遠 記憶 不可能 、 記入 作成者自身 重要 。 有無 内容 、 動作 影響 与 。作成者自身 含 《読 手》 伝 、簡潔 言葉(日本語 英語 ) 記述 。 、/*
*/
囲 記述法 。開始 表/*
終了 表*/
同一行 、図ⓑ 複数行 記述 効果的 。 ▼ この記述法を使う場合は、コメントを閉じるための*/を、/*と書き間違えたり、書き忘れた りしないように注意しましょう。 Fig.1-1 コメントの二つの形式 ⓐ //形式 … 行末までがコメント ⓑ /* … */形式 … 複数行にまたがれるインクルード指令の欠如 前問 、
#
include <iostream>
指令 削除 。 、実行 。 関 重要 情報 格納 。 利用 、 不可欠 。 実行結果 コンパイルエラーとなるた め実行できません。 問題1-2 ▶ 『新版 明解C++ 入門編』 演習 1-1(p.7) 前問のプログラムのヘッダ<iostream>をインクルードする指令が欠如していると、どうなるで あろうか。プログラムをコンパイルして検証せよ。 // 画面への出力を行うプログラム(#include指令が欠如) using namespace std; int main() { cout << "初めてのC++プログラム。\n"; cout << "画面に出力しています。\n"; } 改行 文字列 中\n
《改行文字》 表 特別 表記 。改行文字 出力 、 続 表示 、次 行 先頭 行 。 、 『初 C++ 。』 表示 、 行 改 『画面 出力 。』 表示 。 ▼ 二つの文字\とnが表すのは、《改行文字》という単一4 4 4文字です。改行文字のように、目に 見える文字として表記が不可能あるいは困難な文字は、\で始まる拡張表記によって表します。 コンソール画面への出力とストリーム 画面 含 、 外部 対 入出力 、ストリーム(stream) 利用 。 、文字 流 川 (Fig.1-2)。外部 入出力 、文字 流 川 経由 行 。 網 部 利用cout
、 画面 結 付 、標準出力ストリーム(standard output stream) 呼 。 出力 、文
字 挿入 行 。 挿入 指示 、左向 不等
号
<
二 並<<
。 記号 、挿入子(inserter) 呼 。▼ これ以降、コンソール画面のことを、単に「画面」と呼ぶことにします(coutは シーアウト と発音します。contとかcountと書き間違えないようにしましょう)。
なお、二つの<は連続しなければなりません。<と<のあいだにスペースやタブを入れないよ うにしましょう。ヘッダ名iostreamは入出力ストリーム(input-output stream)の略です。 文字列リテラル
"
初めてのC++
プログラム。\n
"
"ABC"
、二重引用符"
囲 文字 並 、 文字列リテラル(string literal) 呼 、 《文字 並 》 表 。▼ リテラルとは、『文字どおりの』『文字で表された』という意味です。なお、coutに挿入した ときに画面に"が表示されることはありません。
画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
Table 1-1 記号文字の読み方 記号 読み方 + プラス符号、正符号、プラス、たす - マイナス符号、負符号、ハイフン、マイナス、ひく * アステリスク、アスタリスク、アスター、かけ、こめ、ほし / スラッシュ、スラ、わる \ 逆斜線、バックスラッシュ、バックスラ、バック ※ JIS コードでは¥ ¥ 円記号、円、円マーク % パーセント . ピリオド、小数点文字、ドット、てん , コンマ、カンマ : コロン、ダブルドット ; セミコロン ' 単一引用符、一重引用符、引用符、シングルクォーテーション " 二重引用符、ダブルクォーテーション ? 疑問符、はてな、クエッション、クエスチョン ! 感嘆符、エクスクラメーション、びっくりマーク、びっくり、ノット & アンド、アンパサンド ~ チルダ、なみ、にょろ ※ JIS コードでは-(オーバライン) - オーバライン、上線、アッパライン ^ アクサンシルコンフレックス、ハット # シャープ、ナンバー _ 下線、アンダライン、アンダバー、アンダスコア = 等号、イクオール、イコール | 縦線 < > 小(大)なり、左(右)向き不等号 ( ) 左(右)括弧、左(右)丸括弧、左(右)小括弧、パーレン { } 左(右)波括弧、左(右)中括弧、ブレイス [ ] 左(右)角括弧、左(右)大括弧、ブラケット 注意‼ ▼ 注意:日本語版の MS-Windows などでは、逆斜線\の代わりに円記号¥を使います。たとえば、 本プログラムの網かけ部は、以下のようになります。 cout << "初めてのC++プログラム。¥n"; cout << "画面に出力しています。¥n"; みなさんの環境に応じて、必要ならば読みかえるようにしてください。 本書では、最後に改行文字を出力する場合は 『ABC』と表示 と表現して、最後に改行文字を 出力しない場合は 「ABC」と表示 と表現します。 Fig.1-2 コンソール画面への出力とストリーム cout << "ABC"; 挿入子 文字列リテラル ABC 標準出力ストリーム cout 挿入された文字がストリームを流れていく。std名前空間とusing指令
問題 1-1 、using 指令(using directive)
using namespace std;
削除 。 指令 、以下 表明 。
std
名前空間(name space) 使 。 名前空間 第 9 章 学習 、現在 段階 理解 必要 。 、C++ 提供 標準4 4 利用 必要 《決 文句》 覚 。 ▼ stdは standard(標準)に由来します。 問題1-3 ▶ 『新版 明解C++ 入門編』 演習 1-2(p.7)問題 1-1(p.2)のプログラムから、using指令を削除して、coutをstd::coutに変更したプログラ ムを作成せよ。 実行結果 初めてのC++プログラム。 画面に出力しています。 // 画面への出力を行うプログラム(using指令を利用しない:解答例A) #include <iostream> int main() { std::cout << "初めてのC++プログラム。\n"; std::cout << "画面に出力しています。\n"; } // 画面への出力を行うプログラム(using指令を利用しない:解答例B) #include <iostream> int main() { std::cout << "初めてのC++プログラム。\n" << "画面に出力しています。\n"; }
本
using
指令 省略 場合 、cout
std
::cout
変更。 、本
std
::cout
、単cout
書 、 。 、二 例 示 。 ▫解答例A 出力 二 文 行 (問題 1-1 同 )。 ▼ 文については、次問で学習します。 ▫解答例B 出力 一 文 行 (最初 出力 箇所 付 注意 )。出力cout
対 複数個 挿入子<<
連続 適用 、先頭側(左側) 順 出力 利用 。 、以下 、一行 。 std::cout << "初めてのC++プログラム。\n" << "画面に出力しています。\n";画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
main関数 本体 部分 抜 出 、Fig.1-3 ( 、 削除 前 、正 示 )。部分 main 関数(main function) 呼 。
main
関数 C++本体 。 起動 実行 、
main
関数中 文(statement) 順次4 4実行 。 ▼ int main()や{ }は、後の章で学習しますので、いずれも《決まり文句》として覚えましょう。 なお、 関数 については、第 6 章以降で詳しく学習します。 実行結果 コンパイルエラーとなるた め実行できません。 問題1-4 ▶ 『新版 明解C++ 入門編』 演習 1-3(p.9) 文の終端を示すセミコロン;が欠如しているとどうなるか。プログラムをコンパイルして検証せ よ。 // 画面への出力を行うプログラム(文の終端のセミコロンが欠如) #include <iostream> using namespace std; int main() { cout << "初めてのC++プログラム。\n" cout << "画面に出力しています。\n" } Fig.1-3 プログラムの実行と main 関数 int main() { cout << "初めてのC++プログラム。\n"; cout << "画面に出力しています。\n"; } main関数内の文が 順次実行される。 main関数 文 図中 示main
関数 二 文 。文 実行単位 。日本語 文 末尾 句点 。 置 同様 、C++ 文 末尾;
必要 (例外 )。 本 、文 末尾 必要;
欠如 、 。 ▼ コメントは文ではありません。《コメント文》といった文は存在しません。自由形式記述 本 、1文字表示 改行文字 出力 、名前 1 行 1文字 表示 。 、C++ 、「 各行 、 決 桁位置 記述 。」 制約 受 。自由 桁位置 記述 自由 形式( free formatted) 許 。自由 、 制限 。 ▪単語の途中に空白類文字を入れてはいけない
int
,main
,cout,
<<, //, /*, */
、 『単語』 。 途中 空白類文字(空白文字・改行文字・水平 文字・垂直 文字・書式送 文字) 入 。 ▪文字列リテラルの途中で改行してはいけない 文字 並 二重引用符"
囲 文字列"
…"
、一種 単語 。 、途中 改行 。 、空白類文字 隣接 文字列 、連結 単一 文字列 。 利用 、本 、以下 実現 。 cout << "柴\n田\n" // 姓 "望\n洋\n"; // 名 二 文字列"
柴\n
田\n
"
"
望\n
洋\n
"
連結 1個 文字列 。 、 、二 文字列 注釈 構 。 翻訳 最初 段階 、注釈 1 個 空白 文字 置換 。 、空白類文字 注釈 総称 、空白類(white space) 。 長 文字列 、空白類(空白類文字 注釈) 、分割 表記 。 ▼ 連結される文字列リテラルは 2 個に限られるわけではありません。たとえば、空白類をはさ んだ 3 個の文字列リテラル"ABCD" "EFGH" "IJKL"も、きちんと連結されて 1 個の文字列リテラ ル"ABCDEFGHIJKL"となります。 問題1-5 ▶ 『新版 明解C++ 入門編』 演習 1-4(p.14) 1行に1文字ずつ自分の名前を表示するプログラムを作成せよ。 実行結果 柴 田 望 洋 // 1行に1文字ずつ自分の名前を表示 #include <iostream> using namespace std; int main() { cout << "柴\n田\n望\n洋\n"; }画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
空の行の出力 姓 名 改行文字 表 拡張表記 2 個並 (網 部)。姓 表示 後 、改行文字 2 個出力 、姓 名 1行 。 自由形式記述と前処理指令 自由形式記述 、 一 制限 。 ▪前処理指令の途中で改行してはいけない先頭
#
文字#
include
指令 前処理指令(preprocessing directive) 呼。前処理指令 、単一行 書 原則 。途中 改行 必要 場合 、 以下 、行末 逆斜線
\
書 。 #include \ <iostream> ▼ 逆斜線文字と改行文字が連続していると、コンパイルの最初の段階で、それらの2文字が取り 除かれる(その結果、次の行とつながる)ことになっています。そのため、逆斜線\は、改行文 字の直前4 4に置かなければなりません。 問題1-6 ▶ 『新版 明解C++ 入門編』 演習 1-5(p.14) 1行に1文字ずつ自分の名前を表示するプログラムを作成せよ。姓と名のあいだを 1 行あける こと。 // 1行に1文字ずつ自分の名前を表示(姓と名のあいだを1行あける) #include <iostream> using namespace std; int main() { cout << "柴\n田\n\n望\n洋\n"; } 実行結果 柴 田 望 洋 インデントmain
関数 中 書 文 、左 数 5桁目 記述 ( 、 )。{ }
、 文 、日本語 段落 (詳細 次章 学習 )。段落中 記述 右 数桁 書 、 構造 。 余白 インデント(段付 /字下 ) 、 用 記述 インデンテーション 呼 。 本書 、4 桁 与 表記 。 ▼ すなわち、左側の余白は、階層の深さに応じて , 4, 8, 12, … 個分の空白となります。以下に 示すのは、問題 3-21(p.102)のプログラムの一部です。for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) // n個の'*'を表示 cout << '*';
cout << '\n'; }
問題1-7 ▶ 『新版 明解C++ 入門編』 演習1-6(p.19) 二つのint型変数に63と18を代入した上で、その合計と平均を求めて表示するプログラムを作 成せよ。小数部をもつ実数値を変数に代入するとどうなるのかの確認も行うこと。 実行結果 xの値は63です。 yの値は18です。 合計は81です。 平均は4です。 // 二つの変数xとyの合計と平均を表示 #include <iostream> using namespace std; int main() { int x; // xはint型の変数 int y; // yはint型の変数 x = 63; // xに63を代入 y = 18; // yに18を代入 cout << "xの値は" << x << "です。\n"; // xの値を表示 cout << "yの値は" << y << "です。\n"; // yの値を表示 cout << "合計は" << x + y << "です。\n"; // xとyの合計を表示 cout << "平均は" << (x + y) / 2 << "です。\n"; // xとyの平均を表示 } 変数と宣言 二 変数 値 代入 、 合計 平均 表示 。 変数 、数値 格納 《箱》 。 箱 値 入 、 箱 存在 限 値 保持 。 、値 書 取 出 自由 。 中 複数 箱 、 何 箱 分 。箱 《名前》 困 。 、変数 使 、箱 作 、名前 与 宣言(declaration) 必 要 。㆒ 、
x
y
名前 変数 宣言 宣言文(declaration statement) 。int
『整数』 意味 語句 integer 由来 。 宣言 、名前x
変数(箱) 、名前y
変数(箱) 作 (Fig.1-4)。 変数x
y
保持 値 整数 限 。3.5
小数部 実数値 扱 。 、int
型(type) 性質 。int
型 、 型 作 変数x
int
型 実体 。 ■ ㆒ ■ ㆓ ■ 叅 ■ ㆕ Fig.1-4 変数と宣言 int x ; 型 変数名 ・整数値のデータを格納する。 ・いつでも値を出し入れできる。 ・名前が与えられている。 型 intという型から作られた変数 x int 生成 y 生成 int y ;画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
Fig.1-5 int 型変数への値の代入 、二 以上 変数 一度 宣言 。以下 、各変 数名 文字,
区切 宣言 。 int x, y; // int型の変数xとyをまとめて宣言 、解答 、各変数 個別 宣言 、個々 宣言 対 注釈 記入 、宣言 追加 削除 容易 ( 行 数 増 )。 ▼ int以外にもたくさんの型が提供されます。型に関する詳細は第 4 章以降で学習します。また、 名前の与え方に関する規則は次章で学習します。 xの値は63です。 yの値は18です。 合計は81です。 平均は4です。 y x 63 18 x = 63; y = 18; 代入 代入 代入演算子 二 変数 値 入 ㆓ 着目 。 使=
、右辺 値 左 辺 代入 指示 記号 、代入演算子(assignment operator) 呼 。 Fig.1-5ⓐ 示 、変数x
63
代入 、変数y
18
代入 。 代入演算子 、数学 『x
63
等 』 『y
18
等 』 解釈 4 4 注意 。 ▼ 演算子の詳細は、次章で学習します。なお、代入演算子には、演算と代入を同時に行う複合形 式のものもあります。 整数リテラル18
63
、整数 表 定数 整数リテラル(integer literal) 呼 。 ▼ 整数リテラル18は単一の数値じゅう1はち8で、文字列リテラル"18"は 2 個の文字いち1とはち8が並んだも のです。整数リテラルの詳細は、第 4 章で学習します。 y x 63.7 18.9 x = 63.7; y = 18.9; 代入 代入 ※小数部は切り捨てられる。 ⓐ整数を代入 ⓑ実数を代入 ㆓ 以下 書 (図ⓑ)。 x = 63.7; // xに63.7を代入 y = 18.9; // yに18.9を代入 、右 示 実行結果 得 。int
型 変数 実数値 代入 、小 数部 切 捨 (四捨五入 注意 )。 18 63 63 18変数の値の表示 変数 格納 値 、 取 出 。叅 、変数 値 取 出 表 示 。変数
x
値 表示 様子 示 Fig.1-6 。cout
挿入 二 文字列"x
の値は"
"
です。\n
"
、画面 表示 (\n
《改行文字》 出力 )。 一方、文字列 4 4 4 4x
、変数名「x
」 表示 。変 数 値 「63
」 表示 。 Fig.1-6 ストリームへの変数の値の出力 63 cout << "xの値は" << x << "です。\n"; xの値は 63 です。 xの値を取り出す。 x 算術演算子と演算のグループ化 ㆕ 表示 、x
y
合計x
+ y
、平均(x
+ y) / 2
。 平均 求 計算 、式x
+ y
( )
囲 。( )
、優先的 演算 行 記号 。Fig.1-7ⓐ 示 、x
+ y
加算 行 、2
割 除算 行 。 記号/
除算 行 記号 。 図ⓑ 、( )
x
+ y / 2
、x
y
/ 2
和 求 。私 日常行 計算 同 、加減算 乗除算 優先 。 ▼ すべての演算子と優先順位は、次章で学習します。 Fig.1-7 ( ) による演算順序の変更 除算が後で行われる。 加算が後で行われる。 ( x + y ) / 2 加算が先に行われる。 除算が先に行われる。 ⓐ xとyの平均を求める ⓑ xに−を加えるy2 x + y / 2 ① ② ② ① 、 整数/
整数 演算 、小数部(小数点以下 部分) 切 捨 。 実行結果 示 、63
18
平均値4.5
4
。画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
問題1-8 ▶ 『新版 明解C++ 入門編』 演習1-7(p.19) 三つのint型変数に値を代入し、それらの合計と平均を求めるプログラムを作成せよ。 実行結果 xの値は63です。 yの値は18です。 zの値は34です。 合計は115です。 平均は38です。 三値の合計と平均 前問 、二 変数 合計 平均 求 。本問 、変数 三 増 。 行 、前問 、基本的 同一 。 変数と初期化 // 三つの変数xとyとzの合計と平均を表示 #include <iostream> using namespace std; int main() { int x; // xはint型の変数 int y; // yはint型の変数 int z; // zはint型の変数 x = 63; // xに63を代入 y = 18; // yに18を代入 z = 34; // zに34を代入 cout << "xの値は" << x << "です。\n"; // xの値を表示 cout << "yの値は" << y << "です。\n"; // yの値を表示 cout << "zの値は" << z << "です。\n"; // zの値を表示 cout << "合計は" << x + y + z << "です。\n"; // xとyとzの合計を表示 cout << "平均は" << (x + y + z) / 3 << "です。\n"; // xとyとzの平均を表示 } xの値は6936です。 yの値は2358です。 zの値は-3597です。 合計は5697です。 平均は1899です。 本 、変数 値 代入 網 部 削除 実験 。 部分 削除 上 、 ・実行 。 、三 変数 妙 値 表示 。 ▼ この値は、実行環境や処理系によっても異なりますし、同一環境であっても、プログラムを実 行するたびに異なる値となる可能性があります。なお、実行時 発生 、 実行 中断 場合 。 変数 生成 際 、不定値 値 入 。 、値 設定 変数 値 取 出 演算 行 、思 結果 。 ▼ ただし、静的記憶域期間をもつ変数に限り、その生成時に自動的にが入れられます。詳しく は第 6 章で学習します。問題1-9 ▶ 『新版 明解C++ 入門編』 演習1-8(p.21) 二つのint型変数を63と18で初期化した上で、その合計と平均を求めて表示するプログラムを 作成せよ。初期化子として小数部をもつ実数値を与えるとどうなのかの確認も行うこと。 実行結果 xの値は63です。 yの値は18です。 合計は81です。 平均は4です。 初期化を伴う宣言 変数 入 値 事前 分 、 値 最初 変数 入 。本 、 方針 基 作 。 網 部 宣言 、変数
x
変数y
63
18
値 初期化(initialize) 。Fig.1-8 示 、変数 宣言=
記号以降 部分 、変数 生成時 入 値 指定 、初期化子(initializer) 呼 。 // 二つの変数xとyの合計と平均を表示(変数を明示的に初期化) #include <iostream> using namespace std; int main() { int x = 63; // xはint型の変数(63で初期化) int y = 18; // yはint型の変数(18で初期化) cout << "xの値は" << x << "です。\n"; // xの値を表示 cout << "yの値は" << y << "です。\n"; // yの値を表示 cout << "合計は" << x + y << "です。\n"; // xとyの合計を表示 cout << "平均は" << (x + y) / 2 << "です。\n"; // xとyの平均を表示 } Fig.1-8 初期化を伴う宣言 int x = 63 ; 初期化子 変数が生成される際に 入れる値を設定する。 初期化子節 ▼ 標準 C++ では、=記号を含めた = 63 が初期化子と呼ばれ、=記号より右側の 63 は初期化子 節(initializer clause)と呼ばれます。ただし、C言語を含めた、他のプログラミング言語では、 後者を初期化子と呼ぶのが一般的です。本書でも、文法的な厳密性が要求されない文脈では、後 者のことを初期化子と呼びます。 初期化と代入 本 行 《初期化》 、 行 《代入》 、値 入 4 4 4 4 4 異 。以下 理解 (Fig.1-9)。 ▪初期化:変数 生成 値 入 。 ▪代 入:生成済 変数 値 入 。 ▼ 本書では、初期化を指定する記号=を細字で示し、代入演算子=を太字で示すことによって区 別しやすくしています。画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
▼ 本問のような、短く単純なプログラムでは、代入と初期化の違いは大きくありません。ただし、 第 10 章以降の《クラス》を用いたプログラムでは、その違いが明確になります。 網 部 以下 書 。 int x = 63.7; // xを63.7で初期化 int y = 18.9; // yを18.9で初期化 xの値は63です。 yの値は18です。 合計は81です。 平均は4です。 Fig.1-9 初期化と代入 int x = 63; ⓐ 初期化 ⓑ 代入 x x = 63; x 変数の生成時に値を入れる。 生成済みの変数に値を入れる。 63 int 63 生成 、右 示 実行結果 得 。int
型 変数 実数 値 初期化 、小数部 切 捨 分 (代入 場合 同 。 四捨五入 注意 )。 C++の誕生1980年頃、AT&T 研究所 Bjarne Stroustrup 博士 事象駆動型
記述 、C 言語 拡張 言語 作 。 、クラス
付きの C(C with classes) 呼 言語 、Simula67 取 入
指向 基礎 概念 、強力 関数引数型 機能 。後 C++ 呼 言語 、C 言語 Simula67 両親 言語 。 1983年 、仮想関数 演算子多重定義 機能 導入 。 後、Rick Mascitti 、C++( ) 名称 与 。 、 言語 名前 C 後 ++ 記号 付加 。 、 ++ 、C 言語 演算子 一 、以下 機能 。
値 1単位 増 。 D 比 、C++ 名称 控 目 。C言語 拡 張 、 異 言語 示 。Stroustrup 博士 、C言語 対 敬意 払 表 考 。
問題1-10 ▶ 『新版 明解C++ 入門編』 演習1-9(p.27) キーボードから読み込んだ整数値をそのまま反復して表示するプログラムを作成せよ。 実行例 整数値:7 Ÿ 7と入力しましたね。 キーボードからの入力 整数値 読 込 、 値 反復表示 。 入力 数値 変数 格納 網 部 。 初登場
cin
(一般 発音 ) 、 結 付 標準入力ストリーム(standard input stream) 。 、
cin
対 適用>>
、 入力 文字 取 出 働 抽出子(extractor) 。入力
cin
流 文字 数値 取 出 、 値 変数 格納様子 示 Fig.1-10 。
▼ プログラムからusing指令を削除する場合、cinはstd::cinとしなければなりません(cout の場合と同じです)。 Fig.1-10 キーボードからの入力とストリーム cin >> x; 抽出子 変数 1 2 3 cin 標準入力ストリーム x 123
Table 1-2 加減演算子(additive operator)
x + y xにyを加えた結果を生成。 x - y xからyを減じた結果を生成。 ▼ int型では無限に大きな(あるいは小さな)値を表現できないため、キーボードから入力する 値は問題 4-4(p.132)の実行によって得られる範囲に収まっていなければなりません。また、 アルファベットや記号文字など数字以外の文字を入力しないようにしましょう。 // キーボードから読み込んだ整数値をそのまま反復して表示 #include <iostream> using namespace std; int main() { int x; // 読み込む値 cout << "整数値:"; // xの値の入力を促す cin >> x; // xに整数値を読み込む cout << x << "と入力しましたね。\n"; // xの値を反復して表示 }
画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
問題1-11 ▶ 『新版 明解C++ 入門編』 演習1-10(p.27) キーボードから読み込んだ整数値に1を加えた値と1を減じた値を出力するプログラムを作成 せよ。 実行例 整数値:7 Ÿ 1を加えた値は17です。 1を減じた値は-3です。 // キーボードから読み込んだ整数値の 1の値を表示 #include <iostream> using namespace std; int main() { int x; // 読み込む値 cout << "整数値:"; // xの値の入力を促す cin >> x; // xに整数値を読み込む cout << "1¢を加えた値は" << x + 1 << "です。\n"; // 1を加えた値を表示 cout << "1¢を減じた値は" << x - 1 << "です。\n"; // 1を減じた値を表示 } 演算子とオペランド 、加算 行+
、減算 行-
、乗算 行*
、除算 行/
記号 利用 。 記号 演算子(operator) 呼 、演算 対 象 式 オペランド(operand) 呼 。 、x
y
和 求 式x
+ 1
、演算子+
、x
1
二 (Fig.1-11)。 Fig.1-11 演算子とオペランド x + 1 オペランド(演算の対象となる式) オペランド 演算子(演算を行う記号) ※左側のオペランドを第1オペランドあるいは左オペランドと呼び、 右側のオペランドを第2オペランドあるいは右オペランドと呼ぶ。 四則演算 利用 演算子+, -, *, /, %
、算術演算子(arithmetic operator) 呼 。算術演算子 概略 、Table 1-2(左 ) Table 1-3 。 二 演算子 。 演算子 、2項演算子(binary operator) 呼 。 、2項演算子 、 一 単項演算子(unary operator) 、 三 3項演算子(ternary operator) 。Table 1-3 乗除演算子(multiplicative operator)
x * y xにyを乗じた値を生成。
x / y xをyで割った商を生成(x, yともに整数であれば小数点以下は切り捨てる)。 x % y xをyで割った剰余を生成(x, yともに整数でなければならない)。
問題1-12 キーボードから読み込んだ整数値の最下位桁を表示するプログラムを作成せよ。 実行例 整数値:3176 Ÿ 最下位桁は6です。 // キーボードから読み込んだ整数値の最下位桁を表示 #include <iostream> using namespace std; int main() { int n; // 読み込む値 cout << "整数値:"; // nの値の入力を促す cin >> n; // nに整数値を読み込む cout << "最下位桁は" << n % 1 << "です。\n"; // nの最下位桁を表示 } 剰余 本 、除算 剰余 求
%
演算子 利用 。 、3176
1
割 剰余6
。 、変数n
読 込 値 負 場合 、 。 、除算 行/
演算子%
演算子 演算結果 、処理系 異 。 ▪オペランドが両方とも正符号 処理系 、商 剰余 正 値 。例 示 。 ▪オペランドの少なくとも一方が負符号/
演算子 結果 代数的 商以下 最大 整数 代数的 商以上 最小 整数 、処理系 依存 。以下 例 示 。x
y
符号 無関係 (y
限 )、(x
/ y) * y + x % y
値x
一致 。 本 実行 、変数n
読 込 数値-3176
、最下位桁 表示 、-6
4
。 * 前 Table 1-3 示 、剰余 求%
演算子 整数型 。実数型%
演算子 適用 。 x / y x % y 正 ÷正 x = 22でy = 5 4 2 x / y x % y 負 ÷負 x = -22でy = -5 45 -23}
どちらになるかは処理系依存 負 ÷正 x = -22でy = 5 -4 -2}
どちらになるかは処理系依存 -5 3 正 ÷負 x = 22でy = -5 -4 2}
どちらになるかは処理系依存 -5 -3画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
問題1-13 ▶ 『新版 明解C++ 入門編』 演習1-11(p.27) 二つの実数値を読み込み、その和と平均を求めて表示するプログラムを作成せよ。 実行例 xとyの値:7.5 5.25 Ÿ 合計は12.75です。 平均は6.375です。 実数値の取扱い 整数 表int
型 、小数部 実数 扱 、既 学習 。 実数 、double
型 扱 。本 、変数x
y
double
型 。 連続した読込み 挿入子<<
cout
連続適用 複数 値 一度 出力 。抽出子>>
cin
対 連続適用 、複数 変数 値 一度 読 込 。 二 変数x
y
読込 行 網 部 。 抽出子>>
連続適 用 場合 、先頭側(左側) 変数 順 値 読 込 。 抽出子>>
使 入力 、 ・ ・改行 空白文字 読 飛 。 示 実行例 、二 数値7.5
5.25
文字 入 。 、7.5
x
入力 、5.25
y
入力 。 文字 読 飛 、 7.5 5.25 Ÿ7.5
前 入 、7.5
5.25
複数 入 、5.25
後 入 。 、改行文字 読 飛 利用 、以下 数値 ( ) 打 込 。 7.5 Ÿ 5.25 Ÿ 小数部 値 打 込 際 、小数点 含 、 以降 省略 。5.
、5
入力 、5.
入力 、5.
入力 。 // 二つの実数値を読み込んで和と平均を表示 #include <iostream> using namespace std; int main() { double x; // 加える値 double y; // 加える値 cout << "xとyの値:"; // xとyの値の入力を促す cin >> x >> y; // xとyに実数値を読み込む cout << "合計は" << x + y << "です。\n"; // xとyの合計を表示 cout << "平均は" << (x + y) / 2 << "です。\n"; // xとyの平均を表示 }問題1-14 ▶ 『新版 明解C++ 入門編』 演習1-12(p.27) 三角形の底辺と高さを読み込んで、その面積を表示するプログラムを作成せよ。 実行例 底辺:7.8 Ÿ 高さ:3.2 Ÿ 面積は12.48です。 // 三角形の底辺と高さから面積を求めて表示 #include <iostream> using namespace std; int main() { double width; // 底辺 double height; // 高さ
cout << "底辺:"; cin >> width; // 底辺を読み込む cout << "高さ:"; cin >> height; // 高さを読み込む double area = width * height / 2.; // 底辺
cout << "面積は" << area << "です。\n"; // 面積を表示 } 浮動小数点リテラル 本 、三角形 面積
(
底辺*
高)
/ 2.
求 。2.
、小数部 実数 表 定数 浮動小数点リテラル( floating-point literal) 呼 。 ▼ これ以降は、次問(右ページ)の解説です。 定値オブジェクト 半径 r 球 表面積 体積 求 公式 以下 示 (π 円周率 。)。4
▪表面積 … 4π r2
▪体 積 … −π r3
3 値 、以下 示 式 求 。
▪表面積 …
4
* 3.14 * r * r
▪体 積 …
4
* 3.14 * r * r * r / 3
、円周率π3.14
、3.1415926535
… 無限 続 値 。円周 長 面積 正確 求 、3.14
3.1416
3.14159
変 。 場合、変更 2箇所 。 、大規模 数値計算 、 中3.14
数百箇所 。 《置換》機能 使 、3.14
3.14159
変更 容易 。 、円周率 値 、3.14
使 箇所 中 。 箇所 、置換 対象 外 必要 。 、 選択的4 4 4 4置換 要求 。 効力 発揮 、値 書 定値オブジェクト(const object) 。網 部 宣言 付
const
、変数PI
3.14
初期化 定値 。
▼ オブジェクト については、第 4 章で学習します。現時点では、『変数』を意味する専門用語 である、と理解しておくとよいでしょう。
画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
問題1-15 球の半径を読み込んで、その表面積と体積を表示するプログラムを作成せよ。 実行例 球の半径:5.7 Ÿ 表面積は4¢8.¢74です。 体 積は775.341です。 本 、円周率 必要 計算 変数PI
値 利用 。定値 利用 、以下 。 値の管理を一箇所に集約できる 円周率 値3.14
、変数PI
初期化子 与 。 他 値(3.14159
) 変 場合 、 変更 一箇所 。 上 置換操作 失敗 、3.14
3.14159
混在 、 防 。 プログラムが読みやすくなる 中 、数値 変数名PI
円周率 参照 、 読 。 中 埋 込 数値 、何 表 理解 。 定値 宣言 名前 与 。 本 、定値 変数名 大文字 、const
普 通 変数 見分 。 * 定値 値 書 。 、宣言時 必 初期 化子 与 。以下 、 。const double PI; // コンパイルエラー(初期化子が欠如)
PI = 3.14; // コンパイルエラー(constオブジェクトに対する代入) ▼ constは、オブジェクトの型の属性を指定する cv 修飾子の一つです。cv 修飾子には、const の他にvolatileがあります。 // 球の半径から表面積と体積を求めて表示 #include <iostream> using namespace std; int main() { const double PI = 3.14; // 円周率 double r; // 半径 cout << "球の半径:"; // 半径の入力を促す cin >> r; // 半径を読み込む cout << "表面積は" << 4 * PI * r * r << "です。\n"; cout << "体 積は" << 4 * PI * r * r * r / 3 << "です。\n"; }
問題1-16 ▶ 『新版 明解C++ 入門編』 演習1-13(p.30) 以下に示すプログラムを作成せよ。 ▪ 1 桁の正の整数値(すなわち 1以上 9以下の値)をランダムに生成して表示。 ▪ 1 桁の負の整数値(すなわち-9以上-1以下の値)をランダムに生成して表示。 ▪ 2 桁の正の整数値(すなわち1以上99以下の値)をランダムに生成して表示。 実行例 1桁の正の乱数:4です。 1桁の負の乱数:-7です。 2桁の正の乱数:93です。 乱数の生成 乱数 生成 表示 。乱数 、 生成 値 。生成 、1桁 2桁 値 。 中 ㆒ ㆓ 叅 、乱数 生成 必要 《決 文句》 。 ▼ ㆓は必ず叅より前に置く必要があります。 ■ ㆒ ■ ㆓ // 1桁あるいは2桁の乱数を生成 #include <ctime> #include <cstdlib> #include <iostream> using namespace std; int main() { srand(time(NULL)); // 乱数の種を設定 cout << "1桁の正の乱数:" << 1 + rand() % 9 << "です。\n"; cout << "1桁の負の乱数:" << -1 - rand() % 9 << "です。\n"; cout << "2桁の正の乱数:" << 1 + rand() % 9 << "です。\n"; } ■叅 Table 1-4 単項の算術演算子(正符号演算子と負符号演算子) +x xそのものの値を生成。 -x xの符号を反転した値を生成。 肝心 叅 。
rand()
書 部分 、¢
以上 整数値 乱数 (負 )。生成 乱数 大 値 可能性 、9
9
割 剰余 利用 、以下 求 。▪1桁 正 乱数 …
1
∼8
加 値(1
∼9
)。▪1桁 負 乱数 …
-1
∼8
減 値(-1
∼-9
)。▪2桁 正 乱数 …
1
∼89
加 値(1
∼99
)。 ▼ 非負の整数値を9で割った剰余は以上8以下の整数値となり、9で割った剰余は以上89 以下の整数値となります。 単項の算術演算子-1
-
、2項演算子 単項演算子 。Table 1-4 示 、演算 子+
-
、単項演算子版 。単項+
演算子 、 値 生 成 、単項-
演算子 、 符号 反転 値 生成 。画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
Column 1-1 乱数の生成について 乱数の生成に必要な㆒、㆓、叅は、現時点では理解する必要はありません。後半の章まで学習が 進んでから本 Column を読むとよいでしょう。乱数を生成するrand関数が返却するのは、以上RAND_MAX以下の値です。<cstdlib>ヘッダで 定義されるRAND_MAXの値は処理系に依存しますが、少なくとも32,767であることが保証されます。
さて、以下に示すのは、二つの乱数を生成するプログラム部分です。 #include <cstdlib>
using namespace std;
// … 中略…
int x = rand(); // 以上RAND_MAX以下の乱数を生成 int y = rand(); // 以上RAND_MAX以下の乱数を生成 cout << "xの値は" << x << "で、yの値は" << y << "です。\n"; このプログラムを実行すると、xとyは異なる値として表示されます。 ところが、このプログラムを何度実行しても常に同じ値が表示されます(xとyの値は異なるの ですが、xの値は毎回同じになり、yの値も毎回同じになります)。 このことは、生成される乱数の系列、すなわちプログラム中で 1 回目に生成される乱数、2 回目 に生成される乱数、3 回目に生成される乱数、… が決まっていることを示しています。たとえば、 ある処理系では、常に以下の順で乱数が生成されます。 16,838 5,758 1,113 17,515 31,51 5,627 … というのも、rand関数は 種たね を利用した計算によって乱数を生成しているからです。 種 の値 がrand関数の中に埋め込まれているため、毎回同じ系列の乱数が生成されるのです。
種の値を変更するのがsrand関数です。たとえば、srand(5)とかsrand(23)と呼び出すだけで、 種の値を変更できます。 もっとも、このように定数を渡してsrand関数を呼び出しても、その後にrand関数が生成する 乱数の系列は決まったものとなってしまいます。先ほど例を示した処理系では、種を5に設定す ると、生成される乱数は以下のようになります。 22,715 22,43 16,275 21,417 4,96 9, … そのため、srand関数に与える引数は、ランダムな乱数でなければなりません。しかし、『乱数 を生成する準備のために乱数が必要である』というのも、おかしな話です。 そこで、よく使われる手法の一つが、srand関数に対して《現在の時刻》を与える方法です。プ ログラムは以下のようになります。 #include <ctime> #include <cstdlib> using namespace std; // … 中略… srand(time(NULL)); // 現在の時刻から種を決定 int x = rand(); // 以上RAND_MAX以下の乱数を生成 int y = rand(); // 以上RAND_MAX以下の乱数を生成 cout << "xの値は" << x << "で、yの値は" << y << "です。\n"; time関数が返却するのはtime_t型で表現された《現在の時刻》です。プログラムを実行するた びに時刻は変わるわけですから、その値を種にすると、生成される乱数の系列もランダムなものと なります(time関数については、p.364の Column 11-3 で学習します)。 なお、rand関数が生成するのは、擬似4 4乱数と呼ばれる乱数です。擬似乱数は、乱数のように見 えますが、ある一定の規則に基づいて生成されます。擬似乱数と呼ばれるのは、次に生成される数 値の予測がつくからです。本当の乱数は、次に生成される数値の予測がつきません。
問題1-17 ▶ 『新版 明解C++ 入門編』 演習1-14(p.30) キーボードから読み込んだ整数値プラスマイナス5の範囲の整数値をランダムに生成して表示す るプログラムを作成せよ。たとえば、キーボードから読み込んだ値が1であれば、95以上15以 下の乱数を生成して表示すること。 実行例 整数値:1¢¢ Ÿ その値の 5の乱数を生成しました。それは13です。 // キーボードから読み込んだ整数値プラスマイナス5の範囲の乱数を生成して表示 #include <ctime> #include <cstdlib> #include <iostream> using namespace std; int main() { srand(time(NULL)); // 乱数の種を設定 int n; // キーボードから読み込む値 cout << "整数値:"; cin >> n; // 整数値を読み込む cout << "その値の 5の乱数を生成しました。それは" << n - 5 + rand() % 11 << "です。\n"; } 一定範囲の乱数の生成 読 込 整数値
5
範囲 乱数 生成 。乱数 出力 、網 部 式 値 。 実行例 、変数n
読 込 値1
、n
- 5
95
。95
対 、以上11
未満(以上1
以下) 乱数 加95
以上15
以下 整数 。 標準C++ C言語 C++ 言語 国際的 規格 各国 国内規格 、以下 機関 標準規格 制定 。国 際 規 格:国際標準化機構(ISO:International Organization for Standardization)
米国 規格:米国国内規格協会(ANSI:American National Standards Institute)
日本 規格:日本工業規格(JIS:Japanese Industrial Standards)
体裁 細 点 異 除 、 (基本的 )同一 。
現在、C++ 規格 第2版 制定 。
▪第1版:1998 年 制定 規格 。ANSI 規格 ISO 規格 、JIS 規格 。
▪第2版:第1版 対 小改訂 施 規格 。2003 年 ANSI ISO規格 制定 、 同時 JIS 規格 制定 。本書 解説 C++ 、 規
画 面 へ の 出 力 と キ ー ボ ー ド か ら の 入 力
1
問題1-18 姓と名のイニシャルを読み込んで挨拶するプログラムを作成せよ。 実行例 姓のイニシャルは:S Ÿ 名のイニシャルは:B Ÿ ♪こんにちはB.S.さん。 // イニシャルを読み込んで挨拶 #include <iostream> using namespace std; int main() {char initial1, initial2;
cout << "姓のイニシャルは:"; cin >> initial1; cout << "名のイニシャルは:"; cin >> initial2;
cout << "\aこんにちは" << initial2 << "." << initial1 << ".さん。\n"; } char型と文字の読込み 文字 読 込 。 文字 表
char
型 。抽出子>>
改行 空白文字 読 飛 、 入力 空白文字 変数 格納 。各変数 読 込 、空白以外 最初 文字 。 、□□S
( 2個 後S
) 入力 、読 込S
。 ▼ char型の詳細は、第 4 章で学習します。 警報 文字列 中\a
《警報》 表 拡張表記 。cout
対 警報文字 挿入 、視覚的 聴覚的 注意 促 、 実行環境 、 音 鳴 (画面 点滅 実行環境 )。 ▼ 本書の実行例では、警報を♪と表記します。 標準C C++ 親 C言語 標準規格 、以下 示 二 版 。 ▪第1版:1989 年 ANSI 規格 制定 、翌 1990 年 ISO規格 制定 。 JIS規格 制定 1993年 。ANSI 制定年 C89 呼 。 ▪第2版:1999 年 ANSI ISO規格 制定 、2003 年 JIS規格 制定 。ANSI ISO 制定年 C99 呼 。
新 制定 第2版 、第1版 互換性 乏 、 使
実情 。本書 、第1版 第2版共通 内容 『標準C』 呼 、第1版 該当 内容 『C89』、第2版 該当 内容 『C99』 呼 。
問題1-19 キーボードから姓と名を読み込んで挨拶するプログラムを作成せよ。 文字列 単一 文字 、文字 並 文字列 読 込 表示 。 文字列 扱
string
型 。 型 利用時 、<string>
必要 覚 。 ▼ もしプログラム冒頭に using namespace std; の指令がなければ、プログラム中のすべてのstringをstd::stringに変更する必要があります。coutの場合と同じです。
抽出子
>>
読込 、空白文字 読 飛 。 、文字列 途中 空白文字 入 入力 実行例 、"
柴"
last
読 込 、"
田"
first
読 込 。 含 1行分全体 読 込 、網 部 以下 。 getline(cin, last); // 姓を読み込む(スペースも読み込む) getline(cin, first); // 名を読み込む(スペースも読み込む)getline(cin,
変数名)
、 含 文字列 読込 行 。 ( ) 前 打 込 文字 、文字列型 変数last
first
格納 。 * 以下 示 、string
型 変数 初期化 代入 行 部分 。 変数s1
、"ABC"
初期化 後 、"FBI"
代入 。表示 、代入後 文字列 。 string s1 = "ABC"; // 初期化 string s2 = "XYZ"; // 初期化 s1 = "FBI"; // 代入(値を書きかえる) cout << "文字列s1は" << s1 << "です。\n"; // 表示 cout << "文字列s2は" << s2 << "です。\n"; // 表示 実行例㆒ 姓は:柴田Ÿ 名は:望洋Ÿ こんにちは柴田望洋さん。 実行例㆓ 姓は:柴 田Ÿ 名は:こんにちは柴田さん。 文字列s1はFBIです。 文字列s2はXYZです。 // 姓と名を読み込んで挨拶 #include <string> #include <iostream> using namespace std; int main() {string last, first;
cout << "姓は:"; cin >> last; cout << "名は:"; cin >> first;
cout << "こんにちは" << last << first << "さん。\n"; }