|  |
================================================================================
Load of Developers C++ Language ---- Vol. 4 I-ichirow Suzuki
================================================================================
Index
Vol.4
1 画面への出力とキーボードからの入力
2 プログラムの流れの分岐
3 プログラムの流れの繰り返し
4 数と文字とストリーム入出力
C++はCを拡張したプログラム言語です。C++にはCの全てが含まれ、さらにオブジェクト指向プログラ
ミング(OOP:ObjectOrientedProgramming)をサポートしています。
その上、多くの点が改良され、数多くの機能を持っているので、オブジェクト指向プログラミングと
の関係を考慮に入れなくても「改良されたC:として使う事が出来ます。
ごく一部の例外を除いてC++はCのスーパーセットです。
C++はCの強固な基礎の上に築かれ、Cの持つ強力さ、格調の高さ、柔軟さを損なう事無く、さらに多く
の新しい機能が付け加えられました。
Cについて持っている知識は全てC++でも通用します。強化された機能を理解するには相当の時間と努力
が要求されるでしょうが、C++でのプログラミングによって払った努力を上回る見返りが得られる事は
間違いありません。
既に熟読したCプログラマでCでプログラムを書くことが出来なければC++を学ぶことは出来ません。
Cでプログラムを書けない方はこのドキュメントを読む前にCプログラムを習得する必要があります。
////////////////////////////////////////////////////////////////////////////////////////
1 画面への出力とキーボードからの入力
##############################################################################
Q1-1 画面に対して以下の表示を行うプログラムを作成せよ。
初めてのC++プログラム
画面に対して出力を行っています。
***********************************
View
初めてのC++プログラム
画面に対して出力を行っています。
#######################################################
Answer
#include
int main(void) {
cout << "初めてのC++プログラム\n" ;
cout << "画面に対して出力を行っています。\n" ;
return(0) ;
} // End main() ;
C++では「文字が流れる河」と見なす事の出来る”ストリーム”を用いて、入出力を実現します。
cout << "ABC" ; // 出力ストリームcout に"ABC"を挿入
によって "ABC"という文字列(文字の並び)を画面に出力します。
この様に挿入演算子(insertion operator)と呼ばれる << はストリームに対して文字を流し込んで
出力を行います。
2重引用符 " で囲まれた文字列の事を、文字列リテラル(string literal)と呼びます
文字列リテラル内で利用されている\nは改行文字を意味するエスケープシーケンスです。
この文字を出力すると、それに続く出力は、次の行の先頭から行われる事になります。
入出力の機能を利用する際は、それに関する種種の情報が格納されているの内容を
"include"指令で取り込まなければなりません。
この様なファイルをヘッダ(header)と呼び、#include指令によって、ヘッダの内容を取り込む事を
「インクルードする」と言います。
数値を格納するために「オブジェクト(object)」(変数)を使います。
キーボードから読み込んだ値を、オブジェクトに格納する方法を予習しておきましょう
キーボードからの入力は、入力ストリーム cin からの取り出しを行う事によって実現します。
キーボードから読み込んだ整数値を、 int型のオブジェクトxに格納するには以下の様にします。
int x ;
cin >> x ; キーボードから読み込んだ整数値をxに格納する
尚、>> という記号は、抽出演算子(extraction operator)と呼ばれます。
コンパイル
人間が文字の並びとして作成するソースプログラムをそのまま実行する事は出来ません
コンパイルやリンクなどの作業を行って、0と1の並び、即ちビットの並びである実行プログラムに
変換する事によって、初めて実行出来る様になるのです。
##############################################################################
Q2 キーボードから2つの整数値を読み込み、最初の値から2番目の値を引いた値を出力するプログ
ラムを作成せよ。
***********************************
View
xを入力して下さい : 56
yを入力して下さい : 24
x - y は32です。
#########################################
Answer
#include
int main(void) {
int x ; // Declaration statement Integer object x
int y ; // Declaration statement Integer object y
cout << "x を入力して下さい : \n" ; // extraction operator C in
cin >> x ; // insertion operator C out
cout << "y を入力して下さい : \n" ;
cin >> y ;
cout << "x - y は" << x - y << "です。\n" ;
return(0) ;
} // End main() ;
型とオブジェクト
整数値を格納する為にオブジェクト(変数)を利用するには
int x ; // Declaration statement Integer object x
と言う宣言が必要であり、この様な文を特に宣言文(declaration statement) と呼び
ます。
intは整数を表す型(type)の名前ですが、その他にも実数を表すdouble,文字を表すchar
等の型があります。
各オブジェクトに対しては、名前を与える事によって、使い分けを行います。
このプログラムでは2行に分けてxとyを宣言していますが、1つにまとめて、次の様に
宣言する事も出来ます。
int x, y ;
##############################################################################
Q1-3 キーボードから読み込んだ正の整数値の下1桁の数字を表示するプログラムを作成せよ
**************************************
View
正の整数値を入力して下さい :1998
その数の下1桁の数字は 7 です。
###########################################################
Answer
#include
int main(void) {
int x ;
cout << "正の整数値を入力して下さい :" ;
cin >> x ;
cout << "その数の下1桁の数字は" << x % 10 <<"です。\n" ;
return(0) ;
} // End main() ;
和、差、積、商、剰余を求める演算子 +, -, *, /, % をまとめて算術演算子と呼びます。
下一桁の数字を求める
整数値の下1桁の数字は、その数を10で割った剰余ですね。
1997 / 10 = 199 あまり 7
##############################################################################
Q1-4 キーボードから2つの実数値を読み込み、その和、差、積、商を表示するプログラムを作成せよ。
*******************************************
View
xを入力して下さい :15
xを入力して下さい :5
x + y = 20
x - y = 10
x * y = 75
x / y = 3
############################################################
Answer
#include
int main(void) {
double x, y ; // 浮動小数点型
cout << "xを入力して下さい :" ;
cin >> x ;
cout << "yを入力して下さい :" ;
cin >> y ;
cout << "x + Y = " << x + y << "\n" ;
cout << "s - y = " << x - y << "\n" ;
cout << "x * y = " << x * y << "\n" ;
cout << "x / y = " << x / y << "\n" ;
return(0) ;
} // End main() ;
演算子の優先度
各演算子にはその演算と、他の演算のいずれを先に実行すべきかの指標になる優先度が
与えられています。
a + b * c
は a + (b * c) と解釈され後ろに書かれている乗算が優先的に行われます。
演算の順序を変更する必要があれば、優先的に行いたい式を()で囲みます。
a + bの演算を先に行いたいのであれば、
(a + b) * c
とします。
##############################################################################
Q1-5 int型とdouble型及びそのオブジェクトの大きさを表示するプログラムを作成せよ
*********************************************
View
int型の大きさ:4
変数aの大きさ:4
double型の大きさ:8
変数xの大きさ: 8
###############################################################
Answer
#include
int main(void) {
int a ;
double x ;
cout << "int型の大きさ:" << sizeof(int) << '\n' ;
cout << "変数aの大きさ:" << sizeof(a) << '\n' ;
cout << "double型の大きさ:" << sizeof(double) << '\n' ;
cout << "変数xの大きさ: " << sizeof(x) << '\n' ;
return(0) ;
} // End main() ;
sizeof演算子
型やオブジェクトの大きさを調べるための演算子が、sizeof演算子(sizeof operator)です。
その大きさは「char型の大きさを1としたときに、その何倍であるか」によって表されます。
出力の最後に書かれている'\n'は文字定数(character constant)であり、文字列リテラルではあり
ません。
##############################################################################
Q1-6 整数定数(23)及び浮動小数点定数(1.2)の大きさを表示するプログラムを作成せよ。
*****************************************
View
整数定数(23)の大きさ:4
浮動小数点数(1.2)の大きさ:8
################################################################
Answer
#include
int main(void) {
cout << "整数定数(23)の大きさ:" << sizeof(23) << '\n' ;
cout << "浮動小数点数(1.2)の大きさ:" << sizeof(1.2) << '\n' ;
return(0) ;
} // End main() ;
プログラム中で使われる23や1.2等は、値を変える事の出来ない物であるため、定数(constant)と
呼ばれます。
定数にも型があり、23とか50と言った定数は整数定数(integer constant)と呼ばれ、1.2や3.14など
の定数は浮動小数点定数(floating constant)と呼ばれます。
コメント
// 以降に書かれている内容や、/* */の間に書かれている内容はコメント(comment)と呼ばれ、
作成者を含め、プログラムの読み手に理解して欲しい事柄を示す物です。
コメントを書くことやその内容によって、プログラムの動作が変わるといったことはありません。
簡潔な言葉を用いて、読みやすい注釈を書く習慣を付けましょう。
自由形式記述
C++のプログラムは自由形式の記述が出来るようになっています。
即ち、ソースプログラム上の自由な位置にプログラムを記述できるのです。
#include int main(void) {cout<<"整数定数(23)の大きさ:"<< sizeof(23) <<'\n' ;
return(0) ;} // End main() ;
極端に書けばこの様な形でも良いわけです。ただしとても読みづらいですね。
##############################################################################
Q1-7 文字定数A及びchar型の大きさを表示するプログラムを作成せよ。
************************************
View
sizeof('A') : 1
sizeof('char') : 1
#####################################################
Answer
#include
int main(void) {
cout << "sizeof('A') : " << sizeof('A') <<'\n' ;
cout << "sizeof(char) : " << sizeof(char) << '\n' ;
return(0) ;
} // End main() ;
このプログラムでは、以下に示す文字定数を利用しています。
'A' 文字定数
文字定数とは、引用符 ' で文字を囲んだ物でしたね。
これは以下のような文字列リテラルとは異なる物です。
"ABC" 文字列リテラル
文字列リテラルが、一般に複数の文字の並び(たまたま1個という場合もあります)を表すのに対し、
文字定数は、原則として1個だけの文字を表すための物です。
文字定数の型はchar型ですからsizeof(文字定数)は1となります。
##############################################################################
Q1-8 int型のオブジェクトに実数値を代入すると、小数点以下の部分が切り捨てられること
を確認するプログラムを作成せよ。
***************************************
View
x1 = 2
x2 = 3
#########################################################
Answer
#include
int main(void) {
int x1, x2 ;
x1 = 2.95 ;
x2 = 3.14 ;
cout << "x1 = " << x1 << '\n' ;
cout << "x2 = " << x2 << '\n' ;
return(0) ;
} // End main() ;
今までchar, int, doubleと言う3つの型を学習しましたが、この中で、実数を取り扱う事が出来る
不動小数点型と呼ばれる型はdouble型だけです。
char, やintは整数型と呼ばれ、正数のみを表現する事が出来小数点以下の部分を持つ実数を取り扱
う事は出来ません。
オブジェクトに対して、値の格納を行う働きを持つ演算子を代入演算子(assignment operator)と呼
ばれる = です。
main関数
これまでのプログラムから、コメントや#include指令を除くと、全て以下の形式となっ
ていますが、この部分をmain関数と呼びます。
int main(void) {
// 文
// 文
} // End main() ;
プログラムにはmain関数は1つだけ存在し、その中の文が順次実行されて行きます。
////////////////////////////////////////////////////////////////////////////////////////
2 プログラムの流れの分岐
##############################################################################
Q2-1
int型の変数xに整数値を読み込んで、その値が5より大きければ「xは5より大きいです」
と表示するプログラムを作成せよ
********************************************
View
整数値xの値を入力してください:10
a の値は5より大きいです。
#############################################
Answer
#include
int main(void) {
int a, b ;
cout << "整数値aを入力せよ:" ;
cin >> a ;
if(a > 5)
cout << "a の値は5より大きいです。\n" ;
return(0) ;
} // End main() ;
if文
何らかの条件に基づいてプログラムの流れを分岐させるにはif文(if statement)を用います。
if(論理式)論理式がFalseである時に実行される実行文
式 a > 5 を評価すると、aの値は5よりも大きい場合のみ以下のcout 文が実行されます。
その論理式が成り立たない場合、いわゆる5よりも小さい時は何もしないでプログラムを抜け出します。
##############################################################################
Q2-2
2つのint型の変数a, bに整数値を読み込んで、aがbよりも大きければ「aはbよりも大きいです。」
と表示し、そうでなければ「aはbよりも小さいです。」と言うプログラムを作成せよ。
******************************************
View
整数値aを入力せよ:5
整数値bを入力せよ:3
a はbよりも大きいです。
############################################
Answer
#include
int main(void) {
int a, b;
cout << "整数値aを入力せよ:";
cin >> a ;
cout << "整数値bを入力せよ:" ;
cin >> b ;
if (a < b)
cout << "aはbよりも小さいです。\n" ;
else
cout << "aはbよりも大きいです。" ;
return(0);
} // End main() ;
if-else
if文は式を評価した値が非0である場合とで、それぞれ異なった処理を行う事も出来ます。
if(論理式) True実行文, else False実行文
となります。
論理式を評価した値が成り立てばTrue実行文し、成り立たなければFalse実行文をします。
##############################################################################
Q2-3
2つのint型の変数a, bに整数値を読み込んで、a < bならば「a は bよりも小さいです」、
a > b ならば「a はbより大きいです。」そうでなければ「aとbは等しいです」と、大小関係を表示
するプログラムを作成せよ
***************************************************
View
整数値aを入力せよ:5
整数値bを入力せよ:519
aはbより小さいです。
//////////////
整数値aを入力せよ:51
整数値bを入力せよ:50
aはbより大きいです。
//////////////
整数値bを入力せよ:35
整数値bを入力せよ:35
aとbは等しいです。
#####################################################
Answer
#include
int main(void) {
int a, b ;
cout << "整数値aを入力せよ:" ;
cin >> a ;
cout << "整数値bを入力せよ:" ;
cin >> b ;
if(a < b)
cout << "a は b より小さいです。\n" ;
else if(a > b)
cout << "aはbより大きいです。\n" ;
else
cout << "aとbは等しいです。\n" ;
return(0) ;
} // End main() ;
プログラムの効率
入力された値がa < bであるとします。この時最初の判定である
if (a < b)
において、式a < b を評価した値が1となる為、続く文である
cout << "aはbより小さいです。\n" ;
が、実行されます。
else if (a > b)
の論理式が成り立つのでであれば else if以下の実行文へ流れます。
どれにも属さない場合は最後のelseに流れます。
if (a < b) cout << "a ......
if (a > b) cout << "a ......
if (a == b) cout << "a .....
という風に1文ずつ記述する事も出来ますが必ず3回もの条件判定が行われることにな
りプログラムの実行効率の点で問題があります。
##############################################################################
Q2-4
関係演算子を用いた式 a < b, a > b, a <= b, a >= bを評価すると、0もしくは1とな
る事を確認するプログラムを作成せよ。
************************************************
View
整数値aを入力せよ:7
整数値bを入力せよ:12
a < b : 1
a > b : 0
a <= b : 1
a >= b : 0
################################################
Answer
#include
int main(void) {
int a, b;
cout << "整数値aを入力せよ:" ;
cin >> a ;
cout << "整数値bを入力せよ:" ;
cin >> b ;
cout << " a < b : " << (a < b) << '\n' ;
cout << " a > b ; " << (a > b) << '\n' ;
cout << " a <= b : " << (a <= b) << '\n' ;
cout << " a >= b : " << (a >= b) << '\n' ;
return(0) ;
} // End main() ;
関係演算子を評価した値は、必ず1または0の値となります。
7 + 12 19
7 < 12 1 True
7 > 12 0 False
Point #! No -> 0
##############################################################################
Q2-5
int型の変数に整数値を読み込み、それが0であれば「0です。」と表示し、そうでなければ
「0ではありません」と表示するプログラムを作成せよ。
*****************************************************
View
整数値を入力せよ:7
0ではありません。
######################################################
Answer
#include
int main(void) {
int a ;
cout << "整数値を入力せよ:" ;
cin >> a ;
if (a != 0)
cout << "0ではありません。" ;
else
cout << "0です。" ;
return(0) ;
} // End main() ;
ここで利用している演算子 != は等値演算子(equality operator)と呼ばれる演算子の
一種で、2つのオペランドが等しくないかどうかの判定を行います。
a == b aとbが等しければ1、そうでなければ0
a != b aとbが等しくなければ1、そうでなければ0
##############################################################################
Q2-6
月の値を整数値として読み込み、その月の季節を表示するプログラムを作成せよ。
なお、3〜5月であれば春、6〜8月であれば夏、9〜11月であれば秋、そうでなければ冬とする。
*******************************************************
View
月を入力してください:3
3月は春です。
#######################################################
Answer
#include
int main(void) {
int month ;
cout << "月を入力してください:" ;
cin >> month ;
if (month >= 3 && month <= 5)
cout << month <<" 月は春です。\n" ;
else if (month >= 6 && month <= 8)
cout << month << "月は夏です。\n" ;
else if (month >= 9 && month <= 11)
cout << month << "月は秋です。\n" ;
else
cout << month << "月は冬です。\n" ;
return(0) ;
} // End main() ;
論理AND演算子(logical And operator)と呼ばれる&&演算子が初登場します。
a && b
を評価すると、aとbの両方が非0であれば1,そうでなければ0となります。
すなわち日本語での「aかつb」に相当します。
#############################################################################
Q2-7
月の値を整数値として読み込み、その月の日数(例えば1月であれば31日)を表示するプログラム
を作成せよ。
***************************************************
View
月を入力して下さい:2
2月は28日か29日です。
////////////////////////
月を入力して下さい。:5
5月は31日です。
##################################################################
Answer
#include
int main(void) {
int month ;
cout << "月を入力して下さい:" ;
cin >> month ;
cout << month << "月は" ;
if (month == 2)
cout << "28日か29日です。\n" ;
else if (month == 4 || month ==6 || month == 9 || month == 11)
cout << "30日です。\n" ;
else
cout << "31日です。\n" ;
return(0) ;
} // End main() ;
論理OR演算子
「a または b」に、相当する演算子が論理OR演算子 || (logical OR operator)です。
日本語で「または」というと”どちらか一方のみ”というニュアンスである場合が多いのですが、
論理OR演算子では”どちらか一方でも”という意味であることに注意しましょう。
###############################################################################
Q-8
2つの整数値を読み込み、「小さい方の値は##です。大きい方の値は$$です。」と、小さい方の値、
大きい方の値を表示するプログラムを作成せよ。(##及び$$には、それぞれ小さい方と大きい方の値
を表示すること)
***********************************************************
View
整数値aを入力せよ:7
整数値bを入力せよ:12
小さい方の値は7
大きい方の値は12
/////////////////////////////
整数値aを入力せよ:7
整数値bを入力せよ:5
小さい方の値は5
大きい方の値は5
########################################################################
Answer
#include
int main(void) {
int a, b ;
cout << "整数値aを入力せよ:\n" ;
cin >> a ;
cout << "整数値bを入力せよ:\n" ;
cin >> b ;
if (a > b)
cout << "小さい方の値は" << b << '\n'
<< "大きい方の値は" << a << '\n' ;
else
cout << "小さい方の値は" << a << '\n'
<< "大きい方の値は" << b << '\n' ;
return(0) ;
} // End main() ;
###############################################################################
Q2-9
月の値を整数値として読み込み、その月の日数(例えば1月であれば31日)を表示するプログラム
を作成せよ。ただし、switch文を用いること。
*************************************************
View
Enter Month Number :5
5 Month is 31 day
///////////////////////
Enter Month Number :15
15 Month is Not found
###################################################################33
#include
int main(void) {
int month ;
cout <<"Enter Month Number :" ;
cin >> month ;
switch (month){
case 2: cout << month << "Month is 28 day or 29 day\n" ;break ;
case 4:
case 6:
case 9:
case 11:cout << month << "Month is 30 day\n" ; break ;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: cout << month << "Month is 31 day\n" ; break ;
default: cout << month << "Month is Not found\n" ; break ;
} // End Switch
return(0) ;
} // End main()
Switch文
ある単一の式の値によって、プログラムの流れを多重に分岐させたいのであればif文では無く
switch文(switch statement)を利用した方が良い場合が多いようです。
プログラムの流れはcaseの後に置かれている整数値と等しいところへ一気に飛びます。
その飛び先には
case 1:
と言った物が書かれています。これをラベルと呼びます。
いずれのcase文にも一致しない場合はdefaultにジャンプします。
###############################################################################
Q2-10
int型の整数に正の整数値を読み込み、それが偶数であれば「偶数です」と表示し、そうでなければ
「奇数です」と表示するプログラムをswitch文を用いて作成せよ
*****************************************:
View
正の整数値を入力せよ:7
奇数です
/////////////////////////
正の整数値を入力せよ:4
偶数です
#########################################
Answer
#include
int main(void) {
int a ;
cout << "Enter an Integer : " ;
cin >> a ;
switch (a % 2){
case 0:
cout << "value is an even number\n" ;
default:
cout << "value is a odd number\n" ;
} // End switch
return(0) ;
} // End main()
break ; と言うbreak文(break statement)が与えられています。これは、後続する文を実行せず
、一気にswitch文を抜け出すことを指示する物です。
//////////////////////////////////////////////////////////////////////////////////////////
3 プログラムの流れの繰り返し
##############################################################################
Q3-1
入力に関する文字をそのまま出力(表示)するプログラムを作成せよ
*********************************
View
This is a pen.
This is a pen.
I go to school everyday.
I go to school everyday.
*********************************
Answer
#include
int main(void) {
char a ;
while (cin.get(a)) //次の1文字を読み込む
cout << a ; // 読み込んだ1文字を出力する
return(0) ;
} // End main() ;
while文
このプログラムで用いているwhile文(while statement)は
while (式)文
と言う形式であり、式を評価した値が非0である限り、文を繰り返し実行します。
従って、最初に式を評価した時に、その値が0であれば、文は1度も実行されない事になります。
1文字読み込み
このプログラムの式である
cin.get(a)
は、cin即ちキーボードと結びついた入力ストリームから文字を1文字だけ読み込んでそれを
aに格納します。
この式を評価すると、読み込みが成功した時は非0となり、入力の終わりを検出したり、読み込み
に失敗した時には0となります。
##############################################################################
Q3-2
前問のプログラムを改良し、コピーの際に改行文字が視覚的に見える様に、各行の末尾
に[RET]を挿入せよ。
*********************************
View
This is a pen.
This is a pen.[RET]
I go to school everyday.
I go to school everyday.[RET]
*********************************
Answer
#include
int main(void) {
char a ;
while (cin.get(a)) //次の1文字を読み込む
if (a == '\n') //改行文字であれば・・
cout << "[RET]\n" ;
else
cout << a ;
return(0) ;
} // End main() ;
バッファリング
前問及び本問のプログラムでは、文字を読む度に、すぐに文字が出力されるはずですが、実行例では、
そうなっていません。
Enterキーを押された後にまとめて出力が行われています。
C++のストリーム入出力では読み込んだ文字や、書き出すべき文字を一旦バッファに貯めておきます。
###############################################################################
Q3-3
入力に出現する全文字数と、その中に含まれる改行文字の数とをそれぞれカウントして表示する
プログラムを作成せよ。
*********************************
View
Are you ready?
Yes, OK!
Ctrl + Z
文字数 = 24
改行数 = 2
*********************************
Answer
#include
int main(void) {
char c ;
int ccount = 0 ;
int ncount = 0 ;
while (cin.get(c)){
ccount++ ;
if (c == '\n')
ncount++ ;
} // End while
cout << "文字数 = " << ccount << '\n' ;
cout << "改行数 = " << ncount << '\n' ;
return(0) ;
} // End main() ;
ブロック(複文)繰り返すべき文が複数ある時はブロックを使います。
ブロックとは、以下の様に、複数の文を並べた物を( ) で囲んだ物であり、構文上は一つの文と見な
されます。
while (cin.get(c)) { ccount++ ;if (c == '\n') ncount++ ;}
オブジェクトの初期化
オブジェクトを宣言する際は、その初期値を与える事が出来ます。
例えば、変数xの初期値を5としたいのであれば
static int x = 5 ;
とします。
#############################################################################
Q3-4
正の整数値を読み込み、その値を0までのカウント・ダウンする様子を表示するプログラムを作成せよ
例えば5が入力された場合は、5 4 3 2 1 0 と出力する事
*******************************************
View
正の整数値を入力せよ:5
5 4 3 2 1 0
*******************************************
Answer
#include
int main(void) {
int a ;
cout << "正の整数値を入力せよ:" ;
cin >> a ;
while ( a >= 0 ){
cout << a << ' ' ;
a-- ;
} // End while
cout << '\n' ;
return(0);
} // End main() ;
インクリメント演算子とデクリメント演算子
プログラムでの
ccount++ ; ncount++ ;
や
a-- ;
において利用している演算子は、それぞれインクリメント演算子、デクリメント演算子と呼ばれる
演算子です。
これらの演算子は、オペランドの値を1つだけ増やす(あるいは減らす)働きをします
ccount++; // ccountの値を1だけ増やす
ccount = ccount + 1 // ccount に1加えた値をccountに代入する
と、言う意味になります。前者の方が簡潔になります。
##############################################################################
Q3-5
読み込んだ整数値の2乗及び4乗の値を表示するプログラムを作成せよ。
**************************
View
正の整数値を入力せよ 3
3の2乗は9です。
3の4乗は81です。
**************************
Answer
#include
int main(void) {
int a ;
cout <<" 正の整数値を入力して下さい:\n" ;
cin >> a ;
int pow2 = a * a ;
int pow4 = pow2 * pow2 ;
cout << a << "の2乗は" << pow2 << "です。\n" ;
cout << a << "の4乗は" << pow4 << "です。\n" ;
return(0) ;
} // End main() ;
ブロックと宣言文
2乗及び4乗の値を格納するオブジェクトの宣言が、以下の部分です。
int pow2 = a * a ;
int pow4 = pow2 * pow2 ;
///////////////////////////////////////////////////////////////////////////////
Q3-6
整数値を読み込み、その桁数を表示するプログラムを作成せよ。
例えば、123と入力されたら3と出力する事
***************************
View
正の整数値を入力して下さい。
123
その数は3桁です。
**************************
Answer
#include
int main(void) {
int a ;
static int keta = 0 ;
cout << "正の整数値を入力して下さい:\n" ;
cin >> a ;
do {
a = a / 10 ;
keta++ ;
} while (a) ;
cout << "その数は" << keta << "桁です。\n" ;
return(0) ;
} // End main() ;
do文
以下の形式を持つdo文は式を評価した値が非0である限り、文を繰り返します。
do文 while (式) ;
プログラムの流れは、右図の様に制御される事になります。
//////////////////////////////////////////////////////////////////////////////
Q3-7
整数値を読み込み、それぞれ正の値であれば、その数を逆順に出力するプログラムを作成せよ。
例えば、1234と入力されたら、4321と出力する事。なお、読み込んだ値が0以下であれば、何もしない
物とします。
***************************
View
整数値を入力せよ:1234
4321
***************************
Answer
#include
int main(void) {
int a ;
cout << "正の整数値を入力して下さい。\n" ;
cin >> a ;
if ( a > 0) {
do {
cout << a % 10 ;
a = a /10 ;
} while (a > 0) ;
cout << '\n' ;
} // End if
return(0) ;
} // End main() ;
逆順での出力
aに格納された値が1234である場合を考えます。
まず、a % 10 即ち、下1桁の数字である5が表示されます。
続く
a = a / 10
によって、aの値は123となります。
これを10で割った余剰を出力すれば、3と表示される事になります。
これは最初の数である1235の下2桁目の数字です。
この処理をaが0より大きい間繰り返す事によって、目的を達成する事が出来ます。
###############################################################################
Q3-8
1から10までの整数値を順に出力するプログラムをfor文を用いて作成せよ。
*********************************
View
1
2
3
4
5
6
7
8
9
10
**********************************
Answer
#include
int main(void) {
int i ;
for (i = 1 ; i <= 10 ; i++)
cout << i << '\n' ;
return(0) ;
} // End main() ;
for文
このプログラムで用いているfor文はwhile文と同様に、プログラムの流れを繰り返す物です。
forに続く( )の中は ; で区切られた、大きく3つの部分から構成されています。
上のプログラムをwhile文で書き直すと
static int i = 1 ;
while ( i <= 10) {
cout << i << '\n' ;
i++ ;
} // End while
となります。
##############################################################################
Q3-9
要素数が10である配列のAの各要素に対して、先頭から順に1, 2, 3....10を格納し、その値を先頭
から順に表示するプログラムを作成せよ。なお、表示は以下の様に各行に1つずつ行う事
************************************
View
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
a[5] = 6
a[6] = 7
a[7] = 8
a[8] = 9
a[9] = 10
************************************
Answer
#include
int main(void) {
int i ;
int a[10] ;
for (i = 0 ; i < 10 ;i++) { // 先頭から順に1を入れる
a[i] = i + 1 ;
cout << "a[" << i << "] =" << a[i] << '\n' ;
} // End for ;
return(0) ;
} // End main() ;
配列
プログラムの
int a[10] ;
の部分が配列の宣言です。配列は同じ型のデータの集合を表す物です。
従って、int型の配列から、要素を一つだけ取り出した物は、int型のオブジェクトと言う事になります
配列の各要素は、先頭から順にa[0], a[1], a[2]と、表します。
[ ] の中に与える値を添え字と呼び、[ ]を添え字演算子と呼びます。
添え字は整数値であり、0,1,2,3,4.....となります。
###############################################################################
Q3-10
入力に出現する数字文字をカウントするプログラムを作成せよ。
*********************************:
View
3.1415926535897
Ctrl + Z
0の出現回数:0
1の出現回数:2
2の出現回数:1
3の出現回数:2
4の出現回数:1
5の出現回数:3
6の出現回数:1
7の出現回数:1
8の出現回数:1
9の出現回数:2
**********************************
Answer
#include
int main(void) {
char c ;
static int cnt[10] = {0} ;
while (cin.get(c)) {
if (c >= '0' && c <= '9')
cnt[c - '0']++ ;
} // End while
for (static int i = 0 ;i < 10 ; i++)
cout << i << "の出現回数 :" << cnt[i] << '\n' ;
return(0) ;
} // End main() ;
配列の初期化
配列の対する初期化子は、各要素に対する初期化子をカンマ文字で区切って順に並べて、それを
{ }で囲んだ物です。
配列cnt の10個の要素を全て0で初期化するには
int cnt[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ;
と、宣言します。
int cnt[10] = {0} ;
と、しても同じ事です。
又、以下の様に配列の要素数を与えずに宣言する事も出来ます。
int ary[] = {1, 2, 5} ;
この時配列の要素数は、初期化子の個数に基づいて、2と見なされます。即ち
int ary[3] = {1, 2, 5} ;
と同じなのです。尚、
int ary[2] = {1, 2, 5} ;
と、配列の要素数を越えるとエラーになります。
###############################################################################
Q3-11
全問プログラムをもとにして、入力に出現する数字をカウントし、その結果を横方向のグラフで表示
するプログラムを作成せよ
*********************************
View
3.14159265358979323846
Ctrl + Z
各数字の出現回数
0:
1:**
2:**
3:****
4:**
5:***
6:**
7:*
8:**
9:***
#######################################
Answer
#include
int main(void) {
char c ;
int i ;
static int cnt[10] = {0} ;
while(cin.get(c)){
if(c >= '0' && c <= '9')
cnt[c - '0']++ ;
} // End While
cout << " View Counter Get : " << '\n' ;
for ( i = 0 ; i < 10 ; i++){
cout << i << " : " ;
for (int j = 0 ; j < cnt[i] ; j++)
cout << '*' ;
cout << '\n' ;
} //End for
return(0) ;
} // End main
2重ループ
このプログラムではfor分の中にfor文が含まれているという、入れ子構造となっています。
この様に、ループ(繰り返し)の中に、ループ構造が入れ子となっているものを2重ループと呼びます
外側のfor文の働きによって、iの値は0から9まで増えていきます。
それぞれiに対して以下の3つの事を行います。
iの値を表示
cout << i << ":" ; によってiの値を表示します。
その文字の出現回数の個数文だけ'*'を表示
それを行うのが内側のfor文です。このfor文は、cnt[i]回だけ繰り返しを行いますから現在
着目している数字iの出現回数分だけ、文字'*'を連続して表示する事になります。
###############################################################################
Q3-12
全問のプログラムを元にして入力に出現する数字をカウントし、その結果を縦方向のグラフで表示
するプログラムを作成せよ
********************************
View
3.1415965358979323846
Ctrl + Z
*
* * *
* * * * * * * *
* * * * * * * * *
0 1 2 3 4 5 6 7 8 9
*******************************
Answer
#include
int main(void) {
char c ;
int i ;
static int cnt[10] ={0} ;
while (cin.get(c)){
if(c >= '0' && c <= '9')
cnt[c - '0']++ ;
} // End While
int max = cnt[0] ;
for (i = 1 ; i < 10 ; i++)
if (max < cnt[i])
max = cnt[i] ;
for(i = max ; i > 0 ; i--){
for (int j = 0 ; j < 10 ; j++){
if(cnt[j] >= i)
cout << "* " ;
else
cout << " " ;
} // End for
cout << '\n' ;
} // End for
for ( i= 0 ; i < 10 ;i++)
cout << i << ' ' ;
cout << '\n' ;
return(0) ;
} // End main
###############################################################################
Q3-13
正の整数値を読み込み、その段数のピラミッドを表示せよ。
例えば、読み込んだ整数が3であれば以下のような出力を行うこと
********************************
View
正の整数値を入力してください。 3 [Enter]
*
***
*****
*******************************
Answer
#include
int main(void) {
int no ;
cout << "正の整数値を入力してください:" << "\n" ;
cin >> no ;
for ( static int i = 1 ; i <= no ; i++ ) {
int j ;
for ( j = 0 ; j
int main (void) {
int i ;
int x [2][3] = {{ 1, 2, 3 }, {4, 5, 6 }} ;
int y [2][3] = {{ 1, 5, 8 }, {5, 3, 1 }} ;
int z [2][3] = {{ 0, 0, 0 }, {0, 0, 0 }} ;
for ( i = 0 ; i < 2 ; i++ ) {
for (int j = 0 ;j < 3 ; j++ )
z[i][j] = x[i][j] + y[i][j] ;
} // End for
for ( i = 0 ; i < 2 ; i++ ) {
for (int j = 0 ; j < 3 ; j ++ )
cout << z[i][j] << ' ' ;
cout << '\n' ;
} // End for
return(0) ;
} // End main() ;
多元配列
このプログラムでのオブジェクトx, y, zは一般に2元配列と呼ばれる配列です。
2元配列の各要素は、
配列名[添え字][添え字]
と、2つの添え字を用いて表します。
このプログラムに示すように、2元配列に対する初期化子は{}の中に{}を入れて入れ子構造とする
事が出来ます。
int a[4][3] ;
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
a[2][0] a[2][1] a[2][2]
a[3][0] a[3][1] a[3][2]
###############################################################################
Q3-15
以下に示す2つの行列x, yの積を求めるプログラムを作成せよ。
1, 2, 3
x = 4, 5, 6
y = 1, 5
5, 3
8, 1
********************************
View
35 14
77 41
*******************************
Answer
#include
int main(void) {
int i ;
int x[2][3] = {{1, 2, 3}, {4, 5, 6}} ;
int y[3][2] = {{1, 5}, {5, 3}, {8, 1}} ;
int z[2][2] ;
for (i = 0 ;i < 2 ; i++) {
for ( int j = 0 ; j < 2 ; j++) {
z[i][j] = 0 ;
for ( int k = 0 ; k < 3 ; k++)
z[i][j] += x[i][k] * y[k][j] ;
} // End for
} // End for
for ( i = 0 ; i < 2 ; i++) {
for (int j = 0 ; j < 2 ; j++)
cout << z[i][j] << ' ' ;
cout << '\n' ;
} // End for
return(0) ;
} // End main() ;
代入演算子
このプログラムで利用している+=演算子は、複合代入演算子(compound assignment operator)と呼ば
れる演算子の一種です。
この演算子を用いた式 a += b は a = a + b と同じ意味であり aの値をbだけ増やします。
a を2度かくて間が省けるだけでなく、aにbを加えると読めますから直感的で分かり易くなります。
//////////////////////////////////////////////////////////////////////////////////////////
4 数と文字とストリーム入出力
##############################################################################
Q4-1
ベルを3回鳴らすプログラムを作成せよ
*********************************
View
ベルを3回鳴らします
*********************************
Answer
#include
int main(void) {
cout << "ベルを3回鳴らします\a\a\a\n" ;
return(0) ;
} // End main() ;
エスケープシーケンス
ベルを鳴らすには、エスケープシーケンス(escape sequence)である\aを用います。
\a アラート
\b バックスペース
\f フォームフィード
\n ニューライン
\r キャリッジリターン
\t ホライゾンタルタブ
##############################################################################
Q4-2
99の表を出力するプログラムを作成せよ
*********************************
View
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
*********************************
Answer
#include
int main(void) {
for ( int i = 1 ;i <= 9 ; i++ ) {
for ( int j = 1 ; j <= 9 ; j++ ) {
cout.width(3) ;
cout << i * j ;
} // End for
cout << '\n' ;
} // End for
return(0) ;
} // End main() ;
フィールド幅の指定
cout で出力される数値や文字列の幅であるフィールド幅は、特に設定されていない状態では値を
出力するのに最小限必要な幅となります。ただし
cout.width(n) ;
とする事によってフィールド幅はn桁となり、これに続く1回の出力に限って、少なくともn桁で出
力されるようになります。
例えば100を4桁の幅で出力するには
cout.width(4) ;
cout << 100 ;
とします。
出力する数値が設定したフィールド幅に収まらない場合は、それに必要な桁数で出力されます。
フィル文字
出力する数値や文字列の幅がフィールド幅に満たないときに、余白を埋め尽くす文字をフィル文字と
呼びます。
cout.fill('x') ;
とします。
浮動小数点数の制度の指定
浮動小数点数を出力する際の制度(ここでは全体の桁数)を5桁にするには
cout.precision(5) ;
とします。
書式状態フラグの設定・解除
設定 cout.setf(第1引数::第2引数)
解除 cout.unsetf(第1引数::第2引数)
左詰 cout.setf(ios::left, ios::ajustfield) ;
左詰解除 cout.unsetf(ios::left) ;
右詰 cout.setf(ios::right, ios::ajustfield) ;
センタリング cout.setf(ios::internal, ios::ajustfield) ;
///////////////////////////////////////////////////////////////////////////////////////////
To be continue.... To Vol.5
==============================================================================
インターネットスタートページ 鈴木維一郎 石橋三重子
|
|
|
|
|
|