アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

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;
}
}

b0001.png



新版 明解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;
}
}

b0002.png



新版 明解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;
}
}

b0003.png

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)











--

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";
}
}


c1.jpg

c1.jpg

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)










--

《その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;
のようにして使ってみました。

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)











--

《その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";
}
}

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--

《その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';
}

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--

《その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";
}

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)











--

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' を使うほうが「わずかな差ではあるものの プログラムがコンパクトになる」そうです。

aaaa.png

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)











--


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 の実行例

c1.jpg

c1.jpg

c1.jpg




新版 明解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 の実行例

c1.jpg

c1.jpg

c1.jpg
 

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)











--

《その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
は当りまえですね (^^)
 

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)











--

2017年08月31日

《その8》 p.14 演習1-4 ~ p.27 演習1-12


新版 明解C++ 入門編 p.14 演習1-4,演習1-5

c1.jpg

c1.jpg



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

c1.jpg

c1.jpg



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

c1.jpg

c1.jpg



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

c1.jpg

c1.jpg



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

c1.jpg

c1.jpg



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

c1.jpg

c1.jpg
 

新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)











--

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。