• 検索結果がありません。

新版 明解C++入門編

N/A
N/A
Protected

Academic year: 2021

シェア "新版 明解C++入門編"

Copied!
35
0
0

読み込み中.... (全文を見る)

全文

(1)

C++ C++ C++

C++ C++ C++

C++ C++ C++

C++ C++ C++

C++ C++ C++

C++ C++ C++

第 1 章

画面に表示を行ったりキーボードから数値や文字を読み込んだりするプログ ラムを通じて、C++ に慣れましょう。 C++ の歴史 ソースプログラムとプログラムの実行 #include指令によるヘッダのインクルード using指令 コメント(注釈) 自由形式記述とインデント main関数 文 入出力ストリームと挿入子・抽出子 改行と警報

型(int 型、double 型、char 型)

文字列リテラル・整数リテラル・浮動小数点リテラル 変数の宣言 文字列と string 型 初期化と代入 演算子とオペランド 定値オブジェクト 算術演算子 乱数の生成

画面への出力と

キーボードからの

入力

(2)

1

Fig.1-1 C++とその両親

1-1

C++

歴史

まずは、C++ の歴史を簡単に学習しましょう。 1983

、仮想関数 演算子多重定義

機能 導入

後、Rick

Mascitti

、C++(

名称 与

言語 名前

C

++

記号 付加

++

、C

言語 演算子 一

、以下 機能

値 1単位

D

、C++

名称 控 目

。C言語 拡

言語

。Stroustrup

博士

、C言語 対

敬意 払

、現実

C++

存在

。1983

C++

大学

頒布 始

、1985

年 商業

Release 1.0

販売 開始

Stroustrup

博士自身

1986

年 出版

The C++ Programming Language*

Release 1.0

相当

C++

解説書

、限定公開

導入 、若干 改良 施

Release 1.1 1.2

相次

発表

後、多重継承

追加

、大幅 改良 行

Release 2.0

Stroustrup

博士 、1990

Margaret A. Ellis

共著

The Annotated C++ Reference Manual**

C++ C

Simula 67 C++

歴史

1980

年頃、AT&T

研究所

Bjarne Stroustrup

博士 事象駆動型

記述

、C

言語 拡張

言語 作

、クラス

付きの

C(C with classes) 呼

言語

、Simula67

取 入

指向 基礎

概念 、強力 関数引数型

機能

。後

C++

言語 、C

言語

Simula67

両親

言語

(3)

C

+

+

1-1

発表

C++

完全 文法書

、Release 2.1

相当

例外処理 、今後追加

試行的 機能

紹介

。Release 3.0

正式 導入

Stroustrup

博士 、1997

年 、

The C++ Programming Language Third Edition***

、新

C++

解説

標準

C

標準

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++

格 基

、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』 呼

* 邦訳:斎藤信男訳『 言語C++』, ,1988 ** 邦訳:足立高德ら訳『注解C++ 』, ,1992 *** 邦訳:㈱ /長尾高弘訳『 言語C++第3版』, ,1998

(4)

1

1-2

まずは

画面に表示

コンピュータで処理を行ったときは、その結果を何らかの形で人間に伝えることになります。 本節では、コンソール画面への表示を行うことによって、コンピュータから人間に情報を伝え る方法を学習します。 ▼ プログラム中の余白や

"

などの記号を全角文字で打ち込まないよう注意しましょう。余白の部 分は、スペース・タブ・リターン(エンター)のキーを使って打ち込みます。 なお、本書に示すプログラムは、ホームページからダウンロードできます(p.v)。各プログラ ムリストの右上に示しているのは、ディレクトリ名を含むファイル名です。 C++

・数字・記号

構成

/, \, #, {, }, <, >, (, ), ", ;

数多

記号 使

▼ C++のプログラムで利用する記号文字の読み方は、p.11 の Table 1-1 にまとめています。なお、 環境によっては、逆斜線=

\

の代わりに円記号

¥

を使う日本独自の文字コード 体系が採用されています。みなさんの環境に応じて、必要ならば読みかえてください。 本書では、みなさんが読みやすく理解しやすくなるよう、青文字、斜体字、太字、太斜体字な どを使い分けてプログラムを表記しています。

ソースプログラムとソースファイル

人間 、

《文字 並 》

作成

ソースプログラム(source program) 呼 、

格納

ソースファイル

(source file) 呼

▼ sourceは、 もとになるもの という意味です。ソースプログラムは、原始プログラムと呼ば れることもあります。

コンソール

画面への出力

最初 作

画面 表示 行

使

、List 1-1

打 込

。大文字

小文字、半角文字 全角文字 区別

// 画面への出力を行うプログラム #include <iostream> using namespace std; int main() { cout << "初めてのC++プログラム。\n"; cout << "画面に出力しています。\n"; } 実行結果 初めてのC++プログラム。 画面に出力しています。 List 1-1 chap 1/list 1 1.cpp

(5)

1-2

Fig.1-2 プログラムの作成から実行まで

打 込

list11.cpp

名前 保存

、拡張子

.cpp

.c

.cc

.C

処理系

環境

、必要

変更

▼ 処理系とは、C++ プログラムの開発に必要なソフトウェアのことです。Microsoft Visual C++、 GNU C++など数多くの処理系があります。

プログラムの

実行

、C++

直接理解

実行

、Fig.1-2 示

コンパイル

リンク

作業 行

、実行プログラム 作成

必要

人間 読 書

《文字 並 》 、

理解



1

並 》 変換

▼ ビット(bit)は、binary digit(2進数字)の略であり、



または

1

の値をもつデータ単位です。 1ビットでは、



1

の 2 種類の数を表せます(1 進数の 1 桁では

, 1, 2,

, 9

の 1 種類 の数を表せますね。それが



1

だけに制限されていると考えましょう)。

手順

実行方法 処理系

参照

作業 行

▼ ソースプログラムに綴つづり間違いなどがあると、コンパイルエラーが発生し、その旨の診断メッ セージ(diagnostic message)が表示されます。その際は、打ち込んだプログラムをよく読み直して、 ミスを取り除いた上で、再度コンパイル・リンクの作業を試みましょう。

完了

実行

、実行結果(左

内) 示

画面

出力 行

文字の並び ビットの並び コンパイル・リンクなど ソースプログラム 実行プログラム 理解(読む) 作成(書く) 理解・実行 int main() { // ... } 11111111 11111111111 1111111111 11111111111 11111111

(6)

1

重 要 重 要 // 画面への出力を行うプログラム /* 画面への出力を行うプログラム */ #include <iostream>

コメント

(注釈)

先頭行

//

。連

2

記号

//

以降 、

《読 手》 伝

表明

注釈

=コメント(comment)

有無 内容 、

動作 影響 与

。作成者自身 含

読 手 伝

、簡潔 言葉(日本語 英語

) 記述

他人 作成

適切

、読

理解

、自分 作

永遠 記憶

不可能

記入 作成者自身

重要

ソースプログラムには

、作成者自身を含めた《読み手》に伝えるべきコメントを

簡潔に記入せよ。

/*

*/

囲 記述法

。開始 表

/*

終了 表

*/

同一行

、右

複数行

記述 効果的

▼ この記述法を使う場合は、コメントを閉じるための

*/

を、

/*

と書き間違えたり、書き忘れた りしないように注意しましょう。本書では、コメントを青文字で表記します。

ヘッダとインクルード

次 行 、以下 表明 行

画面

入出力 行

(処理実現

部品

群) 関

情報 格納

<iostream>

内容 取 込

Fig.1-3

#

include

指令 行 、

<iostream>

内容

結果、入出力

利用 必要 情報 手 入

<iostream>

他 、文字列 扱

<string>

提供

ヘッ

ダ(header) 呼

< >

iostream

string

#

include

指令

内容

取 込

、インクルードする(include)

ヘッダにはライブラリに

関する重要な情報が格納されている。プログラムで利用

(7)

1-2

Fig.1-3 #include指令によるヘッダのインクルード ▼ ヘッダファイルではなく4 4 4 4、単にヘッダと呼ばれるのは、個々のヘッダが、単独のファイルとし て提供されるとは限らないからです。事実、文字の並びであるテキストファイルではなく、コン パイル済みの特殊な形式でヘッダを提供する処理系もあります。 なお、単独のファイルとして提供される場合でも、<iostream>のファイル名が

iostream

であ るとは限りません(iostream.hや

iostream.hpp

といった名前かもしれません)。 using namespace std; #include <iostream> int main() { // ... } 入出力を行うためのライブラリに        関する種々の情報 (cout や cin の宣言など) <iostream> ヘッダ この行はヘッダの内容と入れかえられる。 インクルード std

名前空間の利用

#

include

次 行 、

using

指令 呼

指令

指令 、以下

表明

std

名前空間(name space) 使

名前空間

9

章 学習

、現在 段階 理解

必要

、C++

提供

標準

4 4

利用 必要 《決

文句》

std

は standard(標準)に由来します。

using namespace std;

指令 省略可能

、省略

場合 、

cout

std

::cout

変更

▼ その理由は、第 9 章で学習します。 演習1-1 ヘッダ<iostream>をインクルードする指令が欠如していると、どうなるであろうか。プログラム をコンパイルして検証せよ。 演習1-2

List 1-1(p.4)のプログラムからusing指令を削除して、coutをstd::coutに変更したプログラム

(8)

1

重 要 Fig.1-4 コンソール画面への出力とストリーム

コンソール

画面への出力とストリーム

画面

出力 行

箇所 理解

画面 含 、

外部 対

入出力

、ストリーム(stream)

利用

、文字 流

(Fig.1-4)。

外部への入出力は、文字が流れる川であるストリームを経由して行う。

cout

画面 結 付

、標準出力ストリーム(standard

output stream

) 呼

出力 、文字 挿入

4 4 4 4

挿入

指示

、 左向

不等号

<

二 並

<<

記号 、挿入子(inserter)

▼ 二つの

<

は連続しなければなりません。<と

<

のあいだにスペースやタブを入れないようにし ましょう。 ▼ 以下、コンソール画面のことを、単に「画面」と呼ぶことにします。

ヘッダ名

iostream

は入出力ストリーム(input

-

output stream)の略です。また、

cout

は シー アウト と発音します。contとか

count

と書き間違えないようにしましょう。 cout << "ABC"; 挿入子 文字列リテラル ABC 標準出力ストリーム cout

文字列リテラル

"

初めてのC

++

プログラム

\n

"

"ABC"

、二重引用符

"

文字 並

文字列リテラル(string literal) 呼

《文字 並 》 表

▼ リテラルとは、『文字どおりの』『文字で表された』という意味です。本書では、文字列リテラ ルを

"

少し薄い黒文字

"

で表記します。 二重引用符

"

は、文字列リテラルの開始と終了を表す記号です。coutに挿入したときに画面 に

"

が表示されることはありません。文字列リテラルの詳細は、第 8 章で学習します。 cout << "初めてのC++プログラム\n"; cout << "画面に出力しています。\n"; 挿入された文字がストリームを流れていく。

(9)

1-2

重 要 重 要 Fig.1-5 プログラムの実行とmain関数

改行

文字列

\n

《改行文字》 表 特別 表記

。改行文字 出力

続 表示 、次 行 先頭

「初

C++

。」 表示

行 改

「画面 出力

。」 表示

▼ 二つの文字

\

n

が表すのは、《改行文字》という単一4 4 4文字です。改行文字のように、目に 見える文字として表記が不可能あるいは困難な文字は、\で始まる拡張表記によって表します。 拡張表記の詳細は、第 3 章で学習します。 int main() { cout << "初めてのC++プログラム\n"; cout << "画面に出力しています。\n"; } main関数内の文が 順次実行される。

部分

main

関数(main function) 呼

起動

実行

main

関数中 文(statement) 順次

4 4

実行

C++

のプログラムの

本体は

main

関数である。プログラム実行時には、その中の

文が順次実行される。

int main()

{ }

は、後の章で学習しますので、いずれも《決まり文句》として覚えましょう。 なお、 関数 については、第 6 章以降で詳しく学習します。

main

関数

。文

実行単位

日本語 文 末尾 句点 。 置

同様 、C++

文 末尾

;

必要

(例外

)。

文は、原則としてセミコロンで終わる。

▼ コメントは文ではありません。《コメント文》といった文は存在しません。 演習1-3 文の終端を示すセミコロン;が欠如しているとどうなるか。プログラムをコンパイルして検証せよ。 main関数 main

関数

本体

部分 抜 出

Fig.1-5

(10)

1

画面

出力 一

List 1-2

、出力

cout

複数個 挿入子

<<

連続

適用

先頭側(左側)

順 出力

警報

文字列

\a

《警報》 表 拡張表記

cout

警報文字 挿入

、視覚的

聴覚的 注意 促

実行環境

(画面 点滅

実行環境

)。

▼ 本書の実行例では、警報を♪と表記します。

文字列

2

個 改行文字

\n

。「初

C++

。」

改行文字

、「画面 出力

。」 次 行 表示

確認

▼ これ以降、最後に改行文字を出力する場合は 『

ABC

』と表示 と表現して、最後に改行文字を 出力しない場合は 「

ABC

」と表示 と表現することにします。

ストリームへの

連続した出力

List 1-3

、二

挨拶「

。」 『

。』 連続

表示

// 文字列リテラル内の改行文字\nの働きを確認 #include <iostream> using namespace std; int main() { cout << "初めてのC++プログラム\n画面に出力しています。\n"; } List 1-2 chap 1/list 1 2.cpp // 挿入子<<を連続適用して画面に出力 #include <iostream> using namespace std; int main() { cout << "\aはじめまして" << "こんにちは\n"; } 実行結果 ♪はじめまして。こんにちは。 List 1-3 chap 1/list 1 3.cpp 警報 実 行 結 果 初めてのC++プログラム。 画面に出力しています。 改行

(11)

1-2

Table 1-1 記号文字の読み方 記号 読み方 + プラス符号、正符号、プラス、たす - マイナス符号、負符号、ハイフン、マイナス、ひく * アステリスク、アスタリスク、アスター、かけ、こめ、ほし / スラッシュ、スラ、わる \ 逆斜線、バックスラッシュ、バックスラ、バック  ※JISコードでは¥ ¥ 円記号、円、円マーク % パーセント . ピリオド、小数点文字、ドット、てん , コンマ、カンマ : コロン、ダブルドット ; セミコロン ' 単一引用符、一重引用符、引用符、シングルクォーテーション " 二重引用符、ダブルクォーテーション ( 左括弧、左丸括弧、左小括弧、パーレン ) 右括弧、右丸括弧、右小括弧、パーレン { 左波括弧、左中括弧、ブレイス } 右波括弧、右中括弧、ブレイス [ 左角括弧、左大括弧、ブラケット ] 右角括弧、右大括弧、ブラケット < 小なり、左向き不等号 > 大なり、右向き不等号 ? 疑問符、はてな、クエッション、クエスチョン ! 感嘆符、エクスクラメーション、びっくりマーク、びっくり、ノット & アンド、アンパサンド ~ チルダ、なみ、にょろ   ※JISコードでは-(オーバライン) - オーバライン、上線、アッパライン ^ アクサンシルコンフレックス、ハット # シャープ、ナンバー _ 下線、アンダライン、アンダバー、アンダスコア = 等号、イクオール、イコール | 縦線

記号文字の読み方

C++

利用

記号文字 読 方 Table 1-1 示

示 読 方 、通称・略称・俗称 含

▼ 注意:日本語版の MS-Windows などでは、逆斜線

\

の代わりに円記号

¥

を使います。たとえば、 List 1-3 の表示を行う文は、以下のようになります。 cout << "¥aはじめまして。" << "こんにちは。¥n"; みなさんの環境に応じて、必要ならば読みかえるようにしてください。 注意‼

(12)

1

自由形式記述

List 1-4

、List 1-1(p.4) 本質

同等

、実行結果 同

一部

言語 「

各行 、

桁位置

記述

。」

制約 課

、C++

制約

。自由 桁位置

記述

自由形式( free formatted) 許

、思

自由 (?)記述

自由

制限

単語の途中に空白類文字を入れてはいけない

int

main

cout,

<<,

//

,

/*

,

*/

『単語』

途中

文字列リテラルの途中で改行してはいけない

文字 並

二重引用符

"

文字列

"

"

、一種 単語

、左下 示

、途中 改行

中 長 文字列

記述

必要

場合 、文字列

" "

、右下 示

記述

/* 画面への出力を行うプログラム */ #include <iostream> using namespace std; int main( ) { cout << "初めてのC++プログラム\n"; cout << "画面に出力しています。\n" ; } 実行結果 初めてのC++プログラム。 画面に出力しています。 List 1-4 chap 1/list 1 4.cpp 読みにくいけれども正しいプログラム ma in

空白類文字(空白文字・改行文字・水平

文字・垂直

文字・

書式送 文字) 入

、右

記述

cout << "初めての++プログラム\n"; cout << ""初めての++プログラム" \n";

、空白類文字

隣接

文字列

、連結

単一

文字列

(13)

1-2

重 要

List 1-5

確認

文字列

"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

"abcdefghijklmnopqrstuvwxyz

\n

"

連結

1

個 文字列

、実行結果

、本

、二

文字列

注釈

翻訳

最初

段階 、注釈

1

個 空白文

字 置換

、空白類文字 注釈 総称 、空白類(white space)

長い文字列リテラルは、空白類(空白類文字と注釈)をはさんで、分割して表記

できる

▼ 連結される文字列リテラルは 2 個に限られるわけではありません。たとえば、空白類をはさ んだ 3 個の文字列リテラル

"ABCD" "EFGH" "IJKL"

も、きちんと連結されて 1 個の文字列リテラ ル

"ABCDEFGHIJKL"

となります。

前処理指令の途中で改行してはいけない

自由形式

、先頭

#

文字

#

include

指令 特別扱

指令 前処理指令(preprocessing directive) 呼

。前処理指令

#

include

指令 他

、後 章 学習

#

define

指令

#

if

指令

前処理指令 、原則

、単一行 中 書

。途中 改行

場合 、行末 逆斜線

\

// 空白類をはさむ文字列リテラルが連結されることの確認 #include <iostream> using namespace std; int main() { cout << "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // 空白類をはさんで並んだ "abcdefghijklmnopqrstuvwxyz\n"; // 文字列リテラルは連結される } List 1-5 chap 1/list 1 5.cpp 実 行 結 果 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz #include <iostream> #include \ <iostream> ▼ 逆斜線文字と改行文字が連続していると、コンパイルの最初の段階で、それらの2文字が取り 除かれる(その結果、次の行とつながる)ことになっています。そのため、逆斜線

\

は、改行文 字の直前4 4に置かなければなりません。

(14)

1

インデント

最初 示

List 1-1

(p.4)

一度

main

関数 中

文 、

5桁目

記述

{ }

、日本語

段落

(詳細 次章 学習

)。段落中 記述 右 数桁

構造

余白

インデント

(段付 /字下 )

記述

インデンテーション

本書

、4

表記

(Fig.1-6)。

▼ すなわち、左側の余白は、階層の深さに応じて , 4, 8, 12, … 個分の空白となります。 Fig.1-6 ソースプログラム中のインデント int main() {

for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) cout << setw(3) << i * j; cout << '\n'; } } ここに示しているのは、第 3 章で学習する List 3-13(p.106)の一部です。 『九九の表』を出力します。 ▼ インデントは、タブキーとスペースキーのいずれでもタイプできます。ただし、エディタやそ の設定によっては、タブをタイプした文字と、保存したソースファイル上の文字とが一致しない ことがあります。 演習1-4 右に示すように、1行に1文字ずつ名前を表示するプログラムを作成せよ。表示 するのは、著者の名前ではなく、自分の名前とすること。 演習1-5 右に示すように、1行に1文字ずつ名前を表示するプログラムを作成せよ。姓と 名のあいだは1行あけることとし、自分の名前を表示すること。 柴 田 望 洋 柴 田 望 洋 階層の深さに応じてインデント(段付け/字下げ)する。

(15)

1-2

Column 1-1

デバッグとコメントアウト

プログラムの欠陥や誤りのことをバグ(bug)といいます。また、バグを見つけたり、その原因 を究明したりする作業が、デバッグ(debug)です。 デバッグの際に、『この部分が間違っているかもしれない。もしこの部分がなかったら、実行時 の挙動はどう変化するだろうか。』と試しながらプログラムを修正することがあります。その際に、 プログラムの該当部を削除してしまうと、もとに戻すのが大変な作業となります。 そこで、よく使われるのが《コメントアウト》という手法です。コメントとしてではなくプログ ラムとして記述されている部分を、コメントにしてしまうのです。 プログラムを以下のように書きかえて実行してみましょう。青文字の部分がコメントとみなされ ますから、『初めての C++ プログラム。』は表示されなくなります。 行の先頭に 2 個のスラッシュ記号//を書くだけで、その行全体をコメントアウトできるわけです。 プログラムをもとに戻すのも簡単です。//を消すだけです。 なお、複数行にわたってコメントアウトする際は、以下に示すように/* … */形式を使うとよ いでしょう。 なお、コメントアウトされたプログラムは、読み手にとって紛らわしく、誤解されやすいものと なります。というのも、コメント化の根拠が、その部分が不要になったためなのか、何らかのテス トを目的とするものなのか、などが分からないからです。 コメントアウトの手法は、あくまでもその場しのぎのための一時的な手段と割り切って使いま しょう。 なお、#if指令を用いると、よりよい方法でのコメントアウトが実現できます。Column 11-7 (p.415)で学習します。 // 画面への出力を行うプログラム #include <iostream> using namespace std; int main() { // cout << "初めてのC++プログラム。\n"; cout << "画面に出力しています。\n"; } 実 行 結 果 画面に出力しています。 List 1C-1 chap 1/list 1c 1.c // 画面への出力を行うプログラム #include <iostream> using namespace std; int main() { /* cout << "初めてのC++プログラム。\n"; cout << "画面に出力しています。\n"; */ } 実 行 結 果 何も表示されません。 List 1C-2 chap 1/list 1c 2.c

(16)

1

Fig.1-7 ストリームへの文字列リテラルと整数値の出力

1-3

変数

画面への出力法が分かりましたので、単純な計算を行って、その結果を表示するプログラム を作ってみましょう。

整数リテラル

18

63

、整数 表 定数

整数リテラル(integer literal) 呼

▼ 整数リテラル

18

は単一の数値じゅう

1

8

はちで、文字列リテラル

"18"

は 2 個の文字いち

1

とはち

8

が並んだも のです。整数リテラルの詳細は、第 4 章で学習します。

演算結果の出力

出力 様子 示

Fig.1-7

cout

挿入

文字列

"18

63

和は

"

"

です

\n

"

、画面

表示

\n

《改行文字》

出力

)。

一方、文字列

4 4 4 4

18

+ 63

表示

。整

数 整数 加算

結果

81

表示

演算結果の出力

足 算 行

結果 表示

。List 1-6 示

整数値

18

63

和 求

表示

cout << "1863の和は" << 18 + 63 << "です。\n"; 18と63の和は 81 です。 演算結果が表示される 実 行 結 果 18と63の和は81です。 List 1-6 chap 1/list 1 6.cpp // 二つの整数値1863の和を求めて表示 #include <iostream> using namespace std; int main() { cout << "1863和は" << 18 + 63 << "です\n"; }

(17)

1-3

重 要 Fig.1-8 変数と宣言

変数

18

63

以外 数値 和 求

。数値 変更

際 、

手 加

作業 必要

。値

自由 出

《変数》 使

解放

変数の宣言

変数

、数値 格納

《箱》

箱 値 入

箱 存在

限 値 保持

、値 書

取 出

自由

中 複数 箱

。箱

《名前》

、変数 使

、箱 作

、名前 与

宣言(declaration) 必

x

名前 変数 宣言

宣言文(declaration statement) 、次

int

『整数』

意味 語句

integer

由来

宣言

、名前

x

変数(箱) 作

(Fig.1-8)。

変数を使うときは、まず宣言をして名前を与えよ。

変数

x

保持

値 整数 限

3.5

小数部

数値 扱

int

型(type) 性質

int

変数

x

int

型 実体

int

以外にもたくさんの型が提供されます。型に関する詳細は第 4 章以降で学習します。また、 名前の与え方に関する規則は次章で学習します。

、二 以上 変数 一度

宣言

。以下

文字

,

区切

宣言

int x ; 型 変数名 ・整数値のデータを格納する。 ・いつでも値を出し入れできる。 ・名前が与えられている。 型 intという型から作られた変数 int x; // xという名前をもつint型変数の宣言 int x, y; // int型の変数xyをまとめて宣言 x int 生成

(18)

1

Fig.1-9 変数への値の代入 y x

変数

x

y

63

18

代入

合計 平均 表示

。List 1-7 示

▼ 二つの変数を 1 行にまとめてint x, y;と宣言せず、個別に宣言しています。このほうが、個々 の宣言に対する注コメ釈ントが記入しやすくなり、宣言の追加や削除が容易になります(ただしプログラ ムの行数は増えてしまいます)。

代入演算子 、数学

x

63

y

18

』 解釈

4 4

注意

▼ 演算子については、p.22 で学習します。なお、代入演算子には、演算と代入を同時に行う複合 形式のものもあります。 63 18 x = 63; y = 18; 代入 代入 List 1-7 chap 1/list 1 7.cpp

代入演算子

変数 値 入

着目

使

=

、右辺 値 左

辺 代入

指示

記号

、代入演算子(assignment operator) 呼

Fig.1-9

、変数

x

63

代入

、変数

y

18

代入

■ ㆒ ■ ㆓ ■ 叅 // 二つの変数xyの合計と平均を表示 #include <iostream> using namespace std; int main() { int x; // xint型の変数 int y; // yint型の変数 x = 63; // x63を代入 y = 18; // yに18を代入 cout << "xの値は" << x << "です。\n"; // xの値を表示 cout << "yの値は" << y << "です。\n"; // yの値を表示 cout << "合計は" << x + y << "です\n"; // xyの合計を表示 cout << "平均は" << (x + y) / 2 << "です\n"; // xyの平均を表示 } 実 行 結 果 xの値は63です。 yの値は18です。 合計は81です。 平均は4です。

(19)

1-3

Fig.1-11

( )による

演算順序の変更 Fig.1-10 ストリームへの変数の値の出力 63

変数の値の表示

変数 格納

値 、

取 出

、変数 値 取 出

。変数

x

値 表示

様子 示

Fig.1-10

cout

に挿入する

x

は文字列リテラルではありませんから、画面に表示されるのは、変数名4 4 4で ある「x」ではなく、その値4である「63」です。

、 整数

/

整数

演算

、小数部(小数点以下 部分) 切 捨

実行結果 示

63

18

平均値

4.5

4

演習1-6 List 1-7のプログラムを変更して、小数部をもつ実数値をxyに代入するプログラムを作成せよ。 その実行結果から、int型変数が整数値のみしか扱えないことを確認すること。 演習1-7 三つのint型変数に値を代入し、それらの合計と平均を求めるプログラムを作成せよ。 除算が後で行われる。 加算が後で行われる。

算術演算子と演算のグループ化

表示

x

y

合計

x

+ y

、平均

(x

+ y) / 2

平均 求

計算

、式

x

+ y

( )

( )

、優先的 演算

記号

。Fig.1-11

x

+ y

加算 行

2

割 除算 行

記号

/

除算 行 記号

( )

x

+ y / 2

x

y

/ 2

和 求

。私

日常行

計算 同

、加減算

乗除算

優先

すべての演算子と優先順位は、Table 2-10(p.76)で学習します。 cout << "xの値は" << x << "です。\n"; xの値は 63 です。 ( x + y ) / 2 加算が先に行われる。 除算が先に行われる。 ⓐ xとyの平均を求める ⓑ xに−を加えるy2 x + y / 2 ① ② ② ① xの値を取り出す。 x

(20)

1

重 要 Fig.1-12 初期化を伴う宣言

変数と初期化

、変数 値 代入

部分 削除

実験

。List 1-8 実行

変数

x

y

妙 値

実行結果

▼ この値は、実行環境や処理系によっても異なります(実行時エラーが発生して、プログラムの 実行が中断される場合もあります)。また、同一環境であっても、プログラムを実行するたびに 異なる値となる可能性があります。

変数 生成

際 、不定値

値 入

、値 設定

変数

値 取 出

演算 行

、思

結果

▼ ただし、静的記憶域期間をもつ変数に限り、その生成時に自動的に



が入れられます。詳しく は第 6 章(p.226)で学習します。 int x = 63 ; 初期化子 変数が生成される際に 入れる値を設定する。 // 二つの変数xyの合計と平均を表示(変数は不定値) #include <iostream> using namespace std; int main() { int x; // xint型の変数(不定値となる) int y; // yint型の変数(不定値となる) cout << "x値は" << x << "です\n"; // xの値を表示 cout << "yの値は" << y << "です。\n"; // yの値を表示 cout << "合計は" << x + y << "です\n"; // xyの合計を表示 cout << "平均は" << (x + y) / 2 << "です。\n"; // xyの平均を表示 } 実行結果一例 xの値は6936です。 yの値は2358です。 合計は9294です。 平均は4647です。 List 1-8 chap 1/list 1 8.cpp 初期化子節 ▼ 標準 C++ では、=記号を含めた = 63 が初期化子と 呼ばれ、=記号より右側の 63 が初期化子節4(initializer clause)と呼ばれます。ただし、C言語を含めた、他の プログラミング言語では、後者を初期化子と呼ぶのが 一般的です。本書でも、文法的な厳密性が要求されな い文脈では、後者のことを初期化子と呼びます。

初期化を伴う宣言

変数 入

値 事前 分

値 最初

変数 入

修正

List 1-9

部 宣言

、変数

x

変数

y

63

18

値 初期化(initialize)

。Fig.1-12 示

、変数 宣言

=

記号以降 部分 、変数 生成

時 入

値 指定

、初期化子(initializer) 呼

変数の宣言時には、初期化子を与えて確実に初期化するとよい。

(21)

1-3

Fig.1-13 初期化と代入

初期化と代入

《初期化》 、List 1-7(p.18) 行

《代入》 、値 入

4 4 4 4 4

。以下

理解

(Fig.1-13)。

▪初期化:変数 生成

値 入

▪代 入:生成済

変数 値 入

▼ ここに示したような、短く単純なプログラムでは、代入と初期化の違いは大きくありません。 ただし、第 10 章以降の《クラス》を用いたプログラムでは、その違いが明確になります。 なお、本書では、初期化を指定する記号=を細字で示し、代入演算子=を太字で示すことによっ て区別しやすくしています。 int x = 63; ⓐ 初期化 ⓑ 代入 x x = 63; x 演習1-8 int型の変数に実数値の初期化子を与えるとどうなるか。プログラムを作成して確認せよ。 変数の生成時に値を入れる 生成済みの変数に値を入れる 実 行 結 果 xの値は63です。 yの値は18です。 合計は81です。 平均は4です。 List 1-9 chap 1/list 1 9.cpp 63 int 63 // 二つの変数xyの合計と平均を表示(変数を明示的に初期化) #include <iostream> using namespace std; int main() { int x = 63; // xint型の変数(63で初期化) int y = 18; // yint型の変数(18で初期化) cout << "x値は" << x << "です\n"; // xの値を表示 cout << "yの値は" << y << "です。\n"; // yの値を表示 cout << "合計は" << x + y << "です\n"; // xyの合計を表示 cout << "平均は" << (x + y) / 2 << "です。\n"; // xyの平均を表示 } 生成

(22)

1

Fig.1-14 キーボードからの入力とストリーム

1-4

キーボードからの

入力

変数を使うことの最大のメリットは、自由に値を入れたり出したりできることです。本節で は、キーボードから読み込んだ値を変数に入れる方法などを学習します。

キーボードからの

入力

整数値 読 込

加算・減算・乗算・除算

結果 表示

List 1-10

入力

数値 変数 格納

初登場

cin

(一般

発音

) 、

結 付

標準入

力ストリーム(standard input stream)

cin

適用

>>

入力

文字 取 出 働

抽出子(extractor)

入力

cin

文字 数値

取 出 、

値 変数 格納

様子 示

Fig.1-14

int

型では無限に大きな(あるいは小さな)値を表現できないため、キーボードから入力す る値は List 4-1(p.129)の実行によって得られる範囲に収まっていなければなりません。また、 アルファベットや記号文字など数字以外の文字を入力しないようにしましょう。 cin >> x; 抽出子 変数 1 2 3 cin 標準入力ストリーム x

演算子とオペランド

使

、減算 行

-

、乗算 行

*

、除算 剰余

%

。演算 行

+

-

記号 演算子(operator) 呼 、

演算 対象

オペランド

(operand) 呼

x

y

和 求

x

+ y

、演算子

+

x

y

(Fig.1-15)。

利用

演算子

+, -, *, /, %

概略

、Table 1-2

Table 1-3

演算子 、一般 算術演算子(arithmetic operator)

(23)

1-4

Fig.1-15 演算子とオペランド

Table 1-2 加減演算子(additive operator)

x + y xyを加えた結果を生成。

x - y xからyを減じた結果を生成。

Table 1-3 乗除演算子(multiplicative operator)

x * y xyを乗じた値を生成。 x / y xyで割った商を生成(x, yともに整数であれば小数点以下は切り捨てる)。 x % y xyで割った剰余を生成(x, yともに整数でなければならない)。

演算子

演算子 、2項演算子(binary

operator

) 呼

2項演算子

単項演算子(unary operator) 、

3項演算子(ternary operator)

// 二つの整数値を読み込んで加減乗除した値を表示 #include <iostream> using namespace std; int main() { int x; // 加減乗除する値 int y; // 加減乗除する値 cout << "xyを加減乗除します。\n"; cout << "xの値:"; // xの値の入力を促す cin >> x; // xに整数値を読み込む cout << "yの値:"; // yの値の入力を促す cin >> y; // yに整数値を読み込む cout << "x + y" << x + y << "です。\n"; // x + yの値を表示 cout << "x - y" << x - y << "です\n"; // x - yの値を表示 cout << "x * y" << x * y << "です。\n"; // x * yの値を表示 cout << "x / y" << x / y << "です\n"; // x / yの値を表示(商) cout << "x % y" << x % y << "です\n"; // x % yの値を表示(剰余) } 実 行 例 xとyを加減乗除します。 xの値:7 Ÿ yの値:5 Ÿ x + yは12です。 x - yは2です。 x * yは35です。 x / yは1です。 x % yは2です。 List 1-10 chap 1/list 11 .cpp x + y オペランド(演算の対象となる式) オペランド 演算子(演算を行う記号) ※左側のオペランドを第1オペランドあるいは左オペランドと呼び、  右側のオペランドを第2オペランドあるいは右オペランドと呼ぶ。

(24)

1

連続した読込み

挿入子

<<

cout

連続適用

複数 値 一度 出力

。抽出子

>>

cin

連続適用

、複数 変数 値 一度 読 込

使

List 1-11

変数

x

y

読込

抽出子

>>

連続適

場合 、先頭側(左側) 変数

順 値 読 込

抽出子

>>

使

入力

・改行

空白文字 読 飛

示 《実行例》

、二

整数値

7

5

文字 入

7

x

入力

5

y

入力

文字 読 飛

7 5 Ÿ

7

7

5

複数

5

、改行文字 読 飛

利用

、以下

数値

) 打 込

7 Ÿ 5 Ÿ ▼ 負の値に

/

演算子や

%

演算子を適用した演算結果は処理系に依存します。Column 1-2(p.27) で学習します。 実行例 xとyを加減乗除します。 xとyの値:7 5 Ÿ x + yは12です。 x - yは2です。 x * yは35です。 x / yは1です。 x % yは2です。 List 1-11 chap 1/list 111.cpp // 二つの整数値を読み込んで加減乗除した値を表示 #include <iostream> using namespace std; int main() { int x; // 加減乗除する値 int y; // 加減乗除する値 cout << "xy加減乗除します。\n"; cout << "xy値:"; // xyの値の入力を促す cin >> x >> y; // xyに整数値を読み込む cout << "x + y" << x + y << "です\n"; // x + yの値を表示 cout << "x - y" << x - y << "です。\n"; // x - yの値を表示 cout << "x * y" << x * y << "です\n"; // x * yの値を表示 cout << "x / y" << x / y << "です\n"; // x / yの値を表示(商) cout << "x % y" << x % y << "です。\n"; // x % yの値を表示(剰余) }

(25)

1-4

重 要

変数

b

宣言

着目

、(

main

関数 途中

)必要

箇所 変数 宣言

原則

変数は必要になった時点で宣言せよ。

変数

b

-a

初期化

-

演算子 単項演算子

符号 反転

値 生成

値 求

加減演算子(p.23)

演算子

-

、単項演算子版 2項演算子版 二

、演算子

+

単項演算子版

。冗長

使

+a

a

演算子 利用

、㆓

部分 以下

実現

単項版 演算子

+

-

概略 Table 1-4 示

Table 1-4 単項の算術演算子(正符号演算子と負符号演算子) +x xそのものの値を生成。 -x xの符号を反転した値を生成。

単項の算術演算子

整数値 読 込

値 符号 反転

値 表示

List 1-12

List 1-12 chap 1/list 112.cpp 実 行 例 ㆒ 整数値:7 Ÿ 7の符号を反転した値は-7です。 実行例 整数値:-15 Ÿ -15の符号を反転した値は15です。 cout << +a << "の符号を反転した値は" << b << "です。\n"; ■ ㆒ ■ ㆓ // 整数値を読み込んで符号を反転した値を表示 #include <iostream> using namespace std; int main() { int a; // 読み込む値 cout << "整数値:"; // 値の入力を促す cin >> a; // aに整数値を読み込む int b = -a; // aの符号を反転した値でbを初期化 cout << a << "の符号を反転した値は" << b << "です。\n"; }

(26)

1

重 要

実数値の読込み

整数 表

int

型 、小数部

実数 扱

p.17

学習

実数 、

double

List 1-13

、二

実数値 読 込

加減乗除

▼ 小数部のない値を打ち込む際は、小数点を含めて、それ以降は省略できます。たとえば

5.

は、

5

と入力しても、5.と入力しても、5.と入力してもよいことになっています。

剰余 求

。Table 1-3(p.23) 示

、剰余 求

%

演算子

整数型

。実数型

%

演算子

適用

実数型のオペランドに

%

演算子を適用することはできない。

、以下 文 追加

// 二つの実数値を読み込んで加減乗除した値を表示 #include <iostream> using namespace std; int main() { double x; // 加減乗除する値 double y; // 加減乗除する値 cout << "xy加減乗除します。\n"; cout << "xの値:"; // xの値の入力を促す cin >> x; // xに実数値を読み込む cout << "y値:"; // yの値の入力を促す cin >> y; // yに実数値を読み込む cout << "x + y" << x + y << "です\n"; // x + yの値を表示 cout << "x - y" << x - y << "です。\n"; // x - yの値を表示 cout << "x * y" << x * y << "です。\n"; // x * yの値を表示 cout << "x / y" << x / y << "です\n"; // x / yの値を表示 } 実行例 xとyを加減乗除します。 xの値:7.5 Ÿ yの値:5.25 Ÿ x + yは12.75です。 x - yは2.25です。 x * yは39.375です。 x / yは1.42857です。 List 1-13 chap 1/list 113.cpp cout << "x % y" << x % y << "です\n"; // コンパイルエラー

以降、原則

、整数

int

型 変数 表 、実数

double

型 変数 表

実数の剰余を求める方法は、List 2-16(p.63)で学習します。また、実数を表すための浮動小 数点型に関する詳細は、第 4 章で学習します。

(27)

1-4

演習1-9 右に示すように、キーボードから読み込んだ整数値をそのまま反 復して表示するプログラムを作成せよ。 演習1-10 右に示すように、キーボードから読み込んだ整数値に1を加え た値と1を減じた値を出力するプログラムを作成せよ。 演習1-11 右に示すように、二つの実数値を読み込み、その合計と平均を求 めて表示するプログラムを作成せよ。 演習1-12 右に示すように、三角形の底辺と高さを読み込んで、その面積を 表示するプログラムを作成せよ。 整数値:7 Ÿ 1を加えた値は17です。 1を減じた値は-3です。 xの値:7.5 Ÿ yの値:5.25 Ÿ 合計は12.75です。 平均は6.375です。 三角形の面積を求めます。 底辺:7.8 Ÿ 高さ:3.2 Ÿ 面積は12.48です。

Column 1-2

除算の演算結果

除算を行う/演算子と%演算子の演算結果は、処理系によって異なります。 ▪ 両方 正符号 すべての処理系で、商も剰余も正の値となります。例を示します。 ▪ 少 一方 負符号 /演算子の結果が 代数的な商以下の最大の整数 と 代数的な商以上の最小の整数 のいずれ となるのかは、処理系に依存します。以下に例を示します。 ※xyの符号とは無関係に(yでない限り)、(x / y) * y + x % yの値は、xと一致します。 x / y x % y 正 ÷正   x = 22y = 5 4 2 x / y x % y 負 ÷負   x = -22y = -5 45 -23

}

どちらになるかは処理系依存 負 ÷正   x = -22y = 5 -4 -2

}

どちらになるかは処理系依存 -5 3 正 ÷負   x = 22y = -5 -4-5 -32

}

どちらになるかは処理系依存 整数値:7 Ÿ 7と入力しましたね。

Table 1-2 加減演算子( additive operator ) x + y x に y を加えた結果を生成。

参照

関連したドキュメント

回転に対応したアプリを表示中に本機の向きを変えると、 が表 示されます。 をタップすると、縦画面/横画面に切り替わりま

Then pass into the next column which is the (q + 1)th column, put 1 at the second row of this column and repeat the process until we have only p − 2 rows for going down (then we

(1) テンプレート編集画面で、 Radius サーバ及び group server に関する設定をコマンドで追加して「保存」を選択..

QRコード読込画面 が表示されたら、表 示された画面を選択 してウインドウをアク ティブな状態にした 上で、QRコードリー

工場設備の計測装置(燃料ガス発熱量計)と表示装置(新たに設置した燃料ガス 発熱量計)における燃料ガス発熱量を比較した結果を図 4-2-1-5 に示す。図

パキロビッドパックを処方入力の上、 F8特殊指示 →「(治)」 の列に 「1:する」 を入力して F9更新 を押下してください。.. 備考欄に「治」と登録されます。

◆第2計画期間末までにグリーンエネルギー証書等 ※1 として発行 ※2

次に、14 ページの下の表を御覧ください。表 5.2-1 に計画建築物の概要を示してござい ます。区域面積は約 2.4ha、延床面積は約 42 万 m 2