新規記事の投稿を行うことで、非表示にすることが可能です。
2017年09月07日
《その17》 p.68演習2-14,p.69演習2-15,演習2-16
新版 明解C++ 入門編 p.68 演習2-14
グー,チョキ,パー がランダムに表示される様子が、1回だけでは確認しづらいので、じゃんけんを 10回連続して行うようにしました。
少し先(p.100)の内容になりますが、10回連続させるために for文 を用いました。
// p068 演習2-14
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
srand((unsigned int)time(NULL));
for (int i = 0; i < 10; i++)
switch (rand() % 3) {
case 0: cout << "グー\n"; break;
case 1: cout << "チョキ\n"; break;
case 2: cout << "パー\n"; break;
}
}

新版 明解C++ 入門編 p.69 演習2-15
小吉,吉,末吉 が 出やすくなっています。
このプログラムも、for文 を用いて 5回の繰り返しにしました。
// p069 演習2-15
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
srand((unsigned int)time(NULL));
for (int i = 0; i < 5; i++)
switch (rand() % 10) {
case 0 : cout << "大吉\n"; break;
case 1 : cout << "中吉\n"; break;
case 2 :
case 3 : cout << "小吉\n"; break;
case 4 :
case 5 : cout << "吉\n"; break;
case 6 :
case 7 : cout << "末吉\n"; break;
case 8 : cout << "凶\n"; break;
case 9 : cout << "大凶\n"; break;
}
}

新版 明解C++ 入門編 p.69 演習2-16
1 ~ 12以外の値が入力された場合には 「何月ですか」と聞き直すようにしてあります。そのために、少し先(p.82)の内容になりますが、do文 を用いました。
// p069 演習2-16
#include <iostream>
using namespace std;
int main()
{
int m;
do {
cout << "何月ですか : "; cin >> m;
} while (m < 1 || m > 12);
switch (m) {
case 3 :
case 4 :
case 5 : cout << "春です。\n" ; break;
case 6 :
case 7 :
case 8 : cout << "夏です。\n" ; break;
case 9 :
case 10 :
case 11 : cout << "秋です。\n" ; break;
default : cout << "冬です。\n" ; break;
}
}

--
2017年09月05日
《その16》 p.63 fmod関数
fmod関数(p.63)で実数の剰余を求めることができます。
(例1) 2.4 ÷ 1.5
fmod(2.4, 1.5) で 2.4 を 1.5 で割ったときの剰余を求めることができます。
電卓で 2.4 ÷ 1.5 を計算すると、割り切れて 商は1.6 です。
割り切れるのなら 剰余は 0 のはずだから、fmod(2.4, 1.5) は 0 になるような気が
してしまいますが、そうではありません。
fmod(2.4, 1.5) は 0.9 になります。なぜだかわかりますか?
fmod関数は、「商は整数である」 と考えているようです。
2.4 の中に 1.5 は1つしか含まれないので、
商は 1
剰余は 2.4 - 1.5 × 1 を計算して 0.9
ということになります。
(例2) 2.4 ÷ 2.5
2.4 の中に 2.5 は含まれないので、
商は 0
剰余は 2.4
です。
(例3) 3.1 ÷ 1.5
3.1 の中に 1.5 は2つ含まれるので、
商は 2
剰余は 0.1
です。
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
double x;
cout << "実数値:"; cin >> x;
if (double m = fmod(x, 1.5)) {
cout << "その値は1.5で割り切れません。\n";
cout << "剰余は" << m << "です。\n";
}
else {
cout << "その値は1.5で割り切れます。\n";
}
}


--
《その15》 p.60 コンマ演算子,p.62 条件における宣言,p.61演習2-13
まず、p.61演習2-13 のコードを書き、そのあとで 『コンマ演算子』 と 『条件における宣言』 について考えてみます。
新版 明解C++ 入門編 p.61 演習2-13
// p061_演習2-13
#include <iostream>
using namespace std;
int main()
{
int a, b;
cout << "変数a:"; cin >> a;
cout << "変数b:"; cin >> b;
if (a < b) {
int t = a; /* ブロック内でのみ利用する変数は、
そのブロックの中で宣言する。 */
a = b;
b = t;
}
cout << "a≧bとなるようにソートしました。\n";
cout << "変数aは " << a << "です。\n";
cout << "変数bは " << b << "です。\n";
}
次に、コンマ演算子を使ってみます。どのように使うかは いろいろなやり方があるので、もっとセンスのある使い方がたくさんあると思いますが、
(`・ω・´) とりあえず・・・
新版 明解C++ 入門編 p.61 演習2-13 別解
// p061_演習2-13
#include <iostream>
using namespace std;
int main()
{
int a, b;
cout << "変数a:"; cin >> a;
cout << "変数b:"; cin >> b;
if (int t = a < b) t = a, a = b, b = t;
cout << "a≧bとなるようにソートしました。\n";
cout << "変数aは " << a << "です。\n";
cout << "変数bは " << b << "です。\n";
}
上のコードで
if (int t = a < b) t = a, a = b, b = t;
の部分が 変更箇所です。p.62 『条件における宣言』 に if文の ( ) の中に指定する《条件》は、単なる式だけでなく、変数の宣言であってもよい と書かれています。
上のコードの int t = a < b の部分です。
”=” より ”<” のほうが優先順位が上なので、まず a < b が評価され、true または false が決まります。次に、trueであれば 1、false であれば 0 が t に代入され、最後に "int t = a < b" 全体が t の値で評価されます。
なので、結果的に、条件 (int t = a < b) は (a < b) と同じ働きをすることになると思われます。
そのついでに、t の初期化も完了するんですね。
つまり、"int t = a < b" は、 ていねいに書くと、"int t = (a < b)" または "int t = (int)(a < b)" ということなんだと思います。
そして、 『コンマ演算子』を
t = a, a = b, b = t;
のようにして使ってみました。
--
《その14》 p.57演習2-10,演習2-11,p.59演習2-12
新版 明解C++ 入門編 p.57 演習2-10
// p057_演習2-10
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cout << "整数a:"; cin >> a;
cout << "整数b:"; cin >> b;
cout << "整数c:"; cin >> c;
int min = a;
if (b < min) min = b;
if (c < min) min = c;
cout << "最小値は " << min << "です。\n";
}
新版 明解C++ 入門編 p.57 演習2-11
// p057_演習2-11
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cout << "整数a:"; cin >> a;
cout << "整数b:"; cin >> b;
cout << "整数c:"; cin >> c;
int mid = a;
if ((b - c) * (b - a) <= 0) mid = b;
if ((c - a) * (c - b) <= 0) mid = c;
cout << "中央値は " << mid << "です。\n";
}
新版 明解C++ 入門編 p.59 演習2-12
// p059_演習2-12
#include <iostream>
using namespace std;
int main()
{
int a, b;
cout << "整数a:"; cin >> a;
cout << "整数b:"; cin >> b;
int min = a;
int max = b;
if (a > b) {
min = b;
max = a;
}
if (a == b) cout << "二つの値は同じです。\n";
else {
cout << "小さいほうの値は" << min << "です。\n";
cout << "大きいほうの値は" << max << "です。\n";
}
}
--
《その13》 p.55演習2-7,演習2-8,演習2-9
新版 明解C++ 入門編 p.55 演習2-7
// p055_演習2-7
#include <iostream>
using namespace std;
int main()
{
double p, q;
cout << "実数p:"; cin >> p;
cout << "実数q:"; cin >> q;
cout << "大きいほうの値は " << (p > q ? p : q) << "です。\n";
}
新版 明解C++ 入門編 p.55 演習2-8
// p055_演習2-8
#include <iostream>
using namespace std;
int main()
{
int a, b;
cout << "整数a:"; cin >> a;
cout << "整数b:"; cin >> b;
cout << "2数の差は " << (a > b ? a - b : b - a) << "です。\n";
}
新版 明解C++ 入門編 p.55 演習2-9
// p055_演習2-9
#include <iostream>
using namespace std;
int main()
{
int a, b;
cout << "整数a:"; cin >> a;
cout << "整数b:"; cin >> b;
int d = a > b ? a - b : b - a; // dは2数の差
cout << "それらの差は ";
d > 10 ? (cout << "11以上です。") : (cout << "10以下です");
cout << '\n';
}
--
《その12》 p.47演習2-4,演習2-5,p.53演習2-6
新版 明解C++ 入門編 p.45 演習2-4
// p047_演習2-4
#include <iostream>
using namespace std;
int main()
{
int x;
cout << "正の整数値を入力 : "; cin >> x;
if (x <= 0)
cout << "正でない値が入力されました。\n";
else if (x % 5)
cout << "その値は5で割り切れません。\n";
else
cout << "その値は5で割り切れます。\n";
}
新版 明解C++ 入門編 p.47 演習2-5
// p047_演習2-5
#include <iostream>
using namespace std;
int main()
{
int x;
cout << "正の整数値を入力 : "; cin >> x;
if (x <= 0)
cout << "正でない値が入力されました。\n";
else if (!(x % 3))
cout << "その値は3で割り切れます。\n";
else
cout << "その値を3で割った剰余は " << x % 3 << "です。\n";
}
新版 明解C++ 入門編 p.53 演習2-6
// p047_演習2-6
#include <iostream>
using namespace std;
int main()
{
int x;
cout << "点数を入力 : "; cin >> x;
if (x < 0 || x > 100)
cout << "不適切な値が入力されました。\n";
else if (x < 60)
cout << "不可\n";
else if (x < 70)
cout << "可\n";
else if (x < 80)
cout << "良\n";
else
cout << "優\n";
}
--
2017年09月04日
《その11》 p.45演習2-1,演習2-2,演習2-3
新版 明解C++ 入門編 p.45 演習2-1
// p.45 演習2-1
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "整数値を入力:"; cin >> n;
if (n < 0)
n = -n;
cout << "その絶対値は " << n << "です。\n";
}
新版 明解C++ 入門編 p.45 演習2-2
構文に誤りがなく、また、この else if が実行されるとき (n == 0)は必ず trueなので、
List 2-5 と同じ結果が得られる。
新版 明解C++ 入門編 p.45 演習2-3
// p045_演習2-3
#include <iostream>
using namespace std;
int main()
{
int a, b;
cout << "整数値を二つ入力:"; cin >> a >> b;
if (a > b)
cout << a << "のほうが大きいです。\n";
else if(a < b)
cout << b << "のほうが大きいです。\n";
else
cout << a << " と " << b << "は同じ値です。\n";
}
ここまでで、個人的に気になったのは p.33の getline関数です。
スペースを含んだ文字列を まるごと読み込んでくれるらしいので、便利だなと感じました。
新版 明解C++ 入門編を 少し先のほうまでパラパラと見てみたのですが、getline関数はあまり出てこない感じなので、忘れないようにしたいと思います。
// getline関数
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cout << "文字列を入力:"; getline(cin, s);
cout << "入力された文字列 … " << s << '\n';
}
このプログラムで、
cout << "入力された文字列 … " << s << '\n';
の '\n' についてですが、新版 明解C++ 入門編 p.92 に、'\n' と "\n" の違いが書かれています。'\n' を使うほうが「わずかな差ではあるものの プログラムがコンパクトになる」そうです。

--
2017年09月01日
《その10》 p.30演習1-13,演習1-14
新版 明解C++ 入門編 p.30 演習1-13
// p030_演習1-13
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
srand(time(NULL));
cout << rand() % 9 + 1 << " "
<< rand() % 9 + 1 << " "
<< rand() % 9 + 1 << "\n";
cout << "\n";
cout << -(rand() % 9 + 1) << " "
<< -(rand() % 9 + 1) << " "
<< -(rand() % 9 + 1) << "\n";
cout << "\n";
cout << rand() % 90 + 10 << " "
<< rand() % 90 + 10 << " "
<< rand() % 90 + 10 << "\n";
}
※
このプログラムで コンパイルは成功します。できあがった実行ファイルも ちゃんと動作します。
なので このままでいいのですが、Visual Studio Community 2017 は このコードをコンパイルするときに、『warning C4244: '引数': 'time_t' から 'unsigned int' への変換です。データが失われる可能性があります。』という警告を出してきます。
srand関数は'unsigned int'型の値が欲しいのに、与えられた time(NULL) が'time_t'型なので、「'time_t' から 'unsigned int' へ変換して使いますが、データが失われるかもしれませんよ。」という警告みたいです。
変換されても大丈夫なので、警告を無視してもかまわないのですが、気になる人は、
srand(time(NULL));を
srand((unsigned int)time(NULL));とすれば、警告は出なくなります。
(unsigned int)time(NULL) とすると、time(NULL)の型を'unsigned int'に変換できるようです。で、変換したものを srand関数に渡すことになるので、Visual Studio Community 2017 は納得してくれます。
● p030_演習1-13 の実行例



新版 明解C++ 入門編 p.30 演習1-14
// p030_演習1-14
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int x;
cout << "任意の整数値を入力 : "; cin >> x;
srand((unsigned int)time(NULL));
cout << x - 5 + rand() % 11 << " "
<< x - 5 + rand() % 11 << " "
<< x - 5 + rand() % 11 << " "
<< x - 5 + rand() % 11 << " "
<< x - 5 + rand() % 11 << " "
<< x - 5 + rand() % 11 << "\n";
}
※
rand() % 11 は 0 ~ 10 までの乱数なので、
- 5 + rand() % 11 は -5 ~ 5 までの乱数になります。
したがって、
x - 5 + rand() % 11 は x - 5 ~ x + 5 までの乱数になります。
新版 明解C++ 入門編は、p.30の段階では、まだ 繰返しの方法を説明してくれてないので、ちょっとくどいですが 値を出力させたい回数だけ同じコードを書きました。
● p030_演習1-14 の実行例



--
《その9》 p.27 Column 1-2 除算の演算結果
int x = -22; int y = 5;
のときの
商 x / y
剰余 x % y
について考えてみます。
(-22) ÷ 5 を、次の①,② の2通りのやり方で計算してみます。
①
符号を除いて絶対値で計算すると 22 ÷ 5 = 4.4
商は 4.4以下の最大の整数だから 4
結果は負なので、これに負の符号を付けて 商は -4
余りは
(元の数) - (割る数) × 商
を計算して
(-22) - 5 × (-4) = -2
このように考えると
商 x / y は -4
剰余 x % y は -2
になります。
②
符号を付けたままで計算すると (-22) ÷ 5 = (-4.4)
商は -4.4以下の最大の整数だから -5
余りは
(元の数) - (割る数) × 商
を計算して
(-22) - 5 × (-5) = 3
このように考えると
商 x / y は -5
剰余 x % y は 3
になります。
------------------------------------------------------------
------------------------------------------------------------
int x = 22; int y = -5;
のときの
商 x / y
剰余 x % y
について考えてみます。
22 ÷ (-5) を、次の①,② の2通りのやり方で計算してみます。
①
符号を除いて絶対値で計算すると 22 ÷ 5 = 4.4
商は 4.4以下の最大の整数だから 4
結果は負なので、これに負の符号を付けて 商は -4
余りは
(元の数) - 商 × (割る数)
を計算して
22 - (-4) × (-5) = 2
このように考えると
商 x / y は -4
剰余 x % y は 2
になります。
②
符号を付けたままで計算すると 22 ÷ (-5) = (-4.4)
商は -4.4以下の最大の整数だから -5
余りは
(元の数) - 商 × (割る数)
を計算して
22 - (-5) × (-5) = -3
このように考えると
商 x / y は -5
剰余 x % y は -3
になります。
------------------------------------------------------------
------------------------------------------------------------
(元の数) - 商 × (割る数) = 剰余
を変形すれば
(元の数) = 商 × (割る数) + 剰余
つまり
x = ( x / y ) * y + x % y
は当りまえですね (^^)
--
2017年08月31日
《その8》 p.14 演習1-4 ~ p.27 演習1-12
新版 明解C++ 入門編 p.14 演習1-4,演習1-5


新版 明解C++ 入門編 p.19 演習1-6


新版 明解C++ 入門編 p.19 演習1-7


新版 明解C++ 入門編 p.21 演習1-8


新版 明解C++ 入門編 p.27 演習1-9,演習1-10


新版 明解C++ 入門編 p.27 演習1-11,演習1-12


--