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

広告

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

2017年09月14日

《その27》 明示的型変換(p.157演習4-8,演習4-9)


新版明解C++入門編 p.157 演習4-8
  以下の算術演算を行う各式にsizeof演算子やtypeid演算子を適用した値を表示するプログラムを作成せよ。また、実行結果に対する考察を行うこと。
  int + int    double + double    int + double    double + int

// p157_演習4-8
#include <iostream>
#include <typeinfo>
using namespace std;

int main()
{
int a = 10;
int b = 20;
double p = 30.0;
double q = 40.0;

cout << "【sizeof演算子】\n";
cout << "int + int … " << sizeof(a + b) << '\n';
cout << "double + double … " << sizeof(p + q) << '\n';
cout << "int + double … " << sizeof(a + p) << '\n';
cout << "double + int … " << sizeof(q + b) << '\n';

cout << "【typeid演算子】\n";
cout << "int + int … " << typeid(a + b).name() << '\n';
cout << "double + double … " << typeid(p + q).name() << '\n';
cout << "int + double … " << typeid(a + p).name() << '\n';
cout << "double + int … " << typeid(q + b).name() << '\n';
}

b04_08.png

《実行結果に対する考察》 int型とdouble型が混在する算術演算では、int型オペランドがdouble型に変換されて計算が行なわれ、演算結果は double型の値になる。




新版明解C++入門編 p.157 演習4-9
  三つの整数値を読み込んで、その合計と平均を表示するプログラムを作成せよ。平均は実数値で表示すること。キャスト記法を用いるもの、関数的記法を用いるもの、static_cast演算子を用いるものを作成すること。

// p157_演習4-9
#include <iostream>
using namespace std;

int main()
{
int a, b, c;
cout << "整数を三つ入力:"; cin >> a >> b >> c;

int sum = a + b + c;
cout << "合計 … " << sum << '\n';

cout << "平均\n";
cout << " キャスト記法 を用いた場合 … " << (double)sum / 3 << '\n';
cout << " 関数的記法 を用いた場合 … " << double(sum) / 3 << '\n';
cout << " static_cast演算子を用いた場合 … " << static_cast<double>(sum) / 3 << '\n';
}

b04_09.png

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

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









--

2017年09月13日

《その26》 浮動小数点型(p.149演習4-5,演習4-6,演習4-7)


新版明解C++入門編 p.149 演習4-5
  float型の変数とdouble型の変数にキーボードから数値を読み込んで、その値を表示するプログラムを作成せよ。いろいろな値を入力して、動作を検証すること。

焦りました (〃゚д゚;A
「float型の変数とdouble型の変数にキーボードから数値を読み込んで、その値を表示するプログラムを作れ」
ということなので、次のようなプログラムを作ったのですが・・・

#include <iomanip>
#include <iostream>

using namespace std;

int main()
{
float a;
double b;

do {
cout << "float a の入力( 999の入力で終了 ) "; cin >> a;
if (a == 999) break;
cout << "double b の入力 "; cin >> b;
cout << "a … " << a << '\n';
cout << "b … " << b << '\n';
} while (1);
}


float型とdouble型は、値が表示されるとき どんな違いがあるんだろう と期待しながら、
桁数の多い値を入力してみたところ・・・

b04_05-1.png

なんと!Σ【*゚д゚*】
float型もdouble型も 同じ結果。しかも6桁しか表示されていません。
float型なら まだ許せるけど、double型が6桁 ヽ(´・ェ・ヽ)

で、調べてみました。
そうしたら、
出力のデフォルト桁数は、float型もdouble型も6桁 なんだそうです。

p.120 Table3-7 に、浮動小数点数の出力n桁指定には操作子setprecision(n) を使う と書いてある
ので、プログラムを書き直しました。

#include <iomanip>
#include <iostream>
using namespace std;

int main()
{
float a;
double b;

do {
cout << "float a の入力( 999の入力で終了 ) "; cin >> a;
if (a == 999) break;
cout << "double b の入力 "; cin >> b;
cout << setprecision(20) << "a … " << a << '\n';
cout << "b … " << b << '\n';

cout << scientific;
cout << "a … " << a << '\n';
cout << "b … " << b << "\n";
} while (1);
}

b04_05-4.png

出力結果を見ると、確かに float型より double型のほうが精度がいいですね。


《補足》

p.151 の List4C-3 に、
   cout << "桁 数:" << numeric_limits::digits10 << "桁\n";
という行があります。
これで、double型の最大精度がわかるみたいです!

#include <limits>
#include <iostream>
using namespace std;

int main()
{
cout << "桁数(float) :" << numeric_limits<float>::digits10 << "桁\n";
cout << "桁数(double):" << numeric_limits<double>::digits10 << "桁\n";
}

b04_05-2.png




新版明解C++入門編 p.149 演習4-6
  3種類の浮動小数点型の大きさをsizeof演算子によって表示するプログラムを作成せよ。

// p149_演習4-6
#include <iostream>
using namespace std;

int main()
{
float a = 123.456F;
double b = 123.456;
long double c = 123.456L;

cout << "floa型の大きさ : " << sizeof(float) << '\n';
cout << "double型の大きさ : " << sizeof(double) << '\n';
cout << "long double型の大きさ : " << sizeof(long double) << "\n\n";

cout << "float a の大きさ : " << sizeof(a) << '\n';
cout << "double b の大きさ : " << sizeof(b) << '\n';
cout << "long double c の大きさ : " << sizeof(c) << '\n';
}

b04_06.png




新版明解C++入門編 p.149 演習4-7
  浮動小数点型の情報をtypeid演算子によって表示するプログラムを作成せよ。

// p149_演習4-7
#include <iostream>
#include <typeinfo>
using namespace std;

int main()
{
float p = 1.23F;
double q = 1.23;
long double r = 1.23L;

cout << "変数pの型:" << typeid(p).name() << '\n';
cout << "変数qの型:" << typeid(q).name() << '\n';
cout << "変数rの型:" << typeid(r).name() << '\n';

cout << "浮動小数点型リテラル 123.45F の型:" << typeid(123.45F).name() << '\n';
cout << "浮動小数点型リテラル 123.45 の型:" << typeid(123.45).name() << '\n';
cout << "浮動小数点型リテラル 123.45L の型:" << typeid(123.45L).name() << '\n';
}

b04_07.png

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

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









--

2017年09月12日

《その25》 整数リテラル(p.141演習4-3),オブジェクトと sizeof演算子(p.141演習4-4)


新版明解C++入門編 p.141 演習4-3
  整数リテラル0が8進リテラルであることを論理的に説明せよ。

整数0 と 100 について、C++の操作子を使って基数表示付加を指示した上で、10進数,16進数,8進数での表示をさせてみました。

#include <iostream>
using namespace std;

int main()
{
int i = 0;
cout << "10進数(基数表記)… " << dec << showbase << i << '\n';
cout << "16進数(基数表記)… " << hex << showbase << i << '\n';
cout << " 8進数(基数表記)… " << oct << showbase << i << '\n';

cout << '\n';
i = 100;
cout << "10進数(基数表記)… " << dec << showbase << i << '\n';
cout << "16進数(基数表記)… " << hex << showbase << i << '\n';
cout << " 8進数(基数表記)… " << oct << showbase << i << '\n';
}

b04_03.png
0 の場合は、16進数,8進数とも、0 と表記されています。
なので、この結果からは、整数リテラル0 が何進リテラルであるかの説明はできないですね・・・。

では、0 と書かれていて、この整数リテラル0 は何進リテラルであるかと 質問された場合は・・・。
表記のルールから考えてみるしかないのかな・・・。

p.138 に
 ◇ 10進リテラルの先頭文字として許されるのは 1, 2, 3, 4, 5, 6, 7, 8, 9 のみであり 0 は含まれない。
 ◇ 16進リテラルは、先頭に 0x または 0X を付けて表記する。
 ◇ 8進リテラルは、10進リテラルと区別がつくように、先頭に 0 を付けて表記する。
とあります。

整数リテラル0 は、
 先頭文字が 0 なので 10進リテラルではない。
 先頭に 0x または 0X がないので 16進リテラルではない。
 先頭文字が 0 なので 8進数である。8進数を示す先頭文字 0 が、値0 の表示も兼ねているものと思われる。

ということで、いいのかな (^▽^;)




新版明解C++入門編 p.141 演習4-4
  文字リテラルと整数リテラルに対してsizeof演算子を適用した値を表示するプログラムを作成せよ。実行結果に対する考察を行うこと。

// p141_演習4-4
#include <iostream>
using namespace std;

int main()
{
cout << sizeof(char) << '\n';
cout << sizeof('a') << '\n';
cout << sizeof(int) << '\n';
cout << sizeof(128) << '\n';
}

b04_04.png

整数を表すのに必要な記憶域上の大きさは 4バイト、すなわち、文字を表すのに必要な記憶域上の大きさの4倍であることがわかる。

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

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









--

《その24》 符号付き文字型(signed char 型),符号無し文字型(unsigned char 型),整数型(p.135演習4-1,p.136演習4-2)


新版明解C++入門編 p.126 ~ p.135 の範囲は 説明を読み進めるだけのページですが、そのなかで、私が実際にパソコンでチェックしてみたことを書きます。
人によって、気になる箇所は違うので、参考になるかどうか・・・。

まず、私が利用している処理系の 『単なる文字型』 が、符号付き型 なのか 符号無し型なのかを 調べました。

#include <climits>
#include <iostream>
using namespace std;

int main()
{
cout << "CHAR_MIN … " << CHAR_MIN << '\n';
cout << "CHAR_MAX … " << CHAR_MAX << '\n';
}

b04_0-1.png

これで、符号付きだとわかりました。

ということは、-128 ~ +127
なんとなくですが、 ( ;´・ω・`) 符号無しのほうが 0 ~ 255 で分かりやすい気がします・・・。


新版明解C++入門編p.132 に文字コード表がありますが、これを自分の処理系で表示させてみました(下の画像)。ただ、文字型が符号付きなので、私の知識では あまりきれいなコードが書けませんでした。
具体的に言うと、符号付き文字型の -128 ~ -1 の部分の取り扱いが スマートにできませんでした。
符号無し文字型だったら もっとすっきりできそうなのに・・・(* _ω_)...

とりあえずのコードは・・・

#include <iostream>
using namespace std;

int main()
{
cout << " |";
for (int i = 0; i <= 15; i++) cout << hex << " " << i;
cout << '\n';
cout << "-------------------------------------------------------";
cout << '\n';
for (int i = 0; i <= 15; i++) {
cout << " " << i << " |";
for (int j = i; j <= i + 112; j += 16) {
switch (j) {
case '\a': cout << " \\a"; break;
case '\b': cout << " \\b"; break;
case '\f': cout << " \\f"; break;
case '\n': cout << " \\n"; break;
case '\r': cout << " \\r"; break;
case '\t': cout << " \\t"; break;
case '\v': cout << " \\v"; break;
default:
cout << " " << (char)j;
}
}
for (int j = -128 + i; j <= -128 + i + 112; j += 16)
cout << " " << (char)j;
cout << '\n';
}
}

です。
ちょっと くどい感じのコードになってしまいました。結果の画面は、こんな感じになります。

b04_0-2.png




新版 明解C++ 入門編 p.135 演習4-1
  すべての文字について、数字/英大文字/英小文字/記号文字などの文字種が分かる一覧表を出力するプログラムを作成せよ。

// p135_演習4-1
#include <iomanip>
#include <cctype>
#include <iostream>

using namespace std;

int main()
{
cout << "文字" << " コード" << " 文字種\n";
for (char i = 0; ; i++) {
switch (i) {
case '\a': cout << " \\a"; break;
case '\b': cout << " \\b"; break;
case '\f': cout << " \\f"; break;
case '\n': cout << " \\n"; break;
case '\r': cout << " \\r"; break;
case '\t': cout << " \\t"; break;
case '\v': cout << " \\v"; break;
default: cout << " " << (isprint(i) ? i : ' ');
}

cout << ' ' << setw(4) << hex << int(i);
cout << " ";
if (isdigit(i))
cout << " 数字";
if (isupper(i))
cout << " 英大文字";
if (islower(i))
cout << " 英小文字";
if (ispunct(i))
cout << " 記号文字";
if (iscntrl(i))
cout << " 制御文字";
if (isspace(i))
cout << " 空白類文字";
cout << '\n';

if (i == 127) break;
}
}
/*
制御文字 (control character)
ディスプレイ,プリンター,通信装置などの制御に用いる特殊文字。
ASCIIコードでは、0x00~0x1Fまでの文字と0x7Fが制御文字。
*/

b04_01.png
出力画面表示が縦長なので、途中までです m( _ _;)m




新版 明解C++ 入門編 p.136 演習4-2
  以下の二つのプログラムを作成せよ。
   ① int型の最小値から最大値までの全整数値を8進数・10進数・16進数で表示。
   ② unsigned型の最小値から最大値までの全整数値を8進数・10進数・16進数で表示。

// p136_演習4-2_①
#include <iomanip>
#include <climits>
#include <iostream>
using namespace std;

int main()
{
cout << " 8進数 10進数 16進数\n";

int i;
for (i = INT_MIN; i < INT_MIN + 5; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
}
cout << '\n';
for (i = -3; i <= 3; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
}
cout << '\n';
for (i = INT_MAX - 4; ; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
if (i == INT_MAX)
break;
}
}

b04_02-1.png


// p136_演習4-2_②
#include <iomanip>
#include <climits>
#include <iostream>
using namespace std;

int main()
{
cout << " 8進数 10進数 16進数\n";
unsigned i;
for (i = 0; i < 11; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
}
cout << '\n';
for (i = UINT_MAX - 10; ; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
if (i == UINT_MAX)
break;
}
}

b04_02-2.png

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

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









--

2017年09月11日

《その23》 break文,continue文,goto文,(p.111演習3-23,p.113演習3-24,p.115演習3-25,演習3-26)


新版明解C++入門編 p.111 演習3-23
  合計だけでなく平均も求めるように、List 3-15 および List 3-16 を書きかえたプログラムをそれぞれ作成せよ。

◆ p.110 List3-15を書きかえたプログラム
// p111_演習3-23(List3-15を変更)
#include <iostream>
using namespace std;

int main()
{
int n, i;
cout << "加算の回数:"; cin >> n;

int sum = 0;
for (i = 0; i < n; i++) {
int t;
cout << "整数(0で終了):"; cin >> t;
if (t == 0) break;
sum += t;
}
cout << "合計 … " << sum << "\n";
cout << "平均 … " << (double)sum / i << "\n";
}
/*
「 整数sum ÷ 整数i 」の計算結果は整数になります。
これだと、1と2の平均が 1.5ではなく、1 になってしまいます。
新版明解C++入門編 p.154 に書いてあるキャストと呼ばれる方法で、この不自然さ
を解決できます。

sum の前に (double) を付けて、(double)sum と記述することで 整数値を実数値に
変換し、それを回数で割れば 平均を実数値で求めることができます。
プログラムの
cout << "平均 … " << (double)sum / i << "\n";
の箇所です。
*/

b03_23-1.png
b03_23-2.png


◆ p.111 List3-16を書きかえたプログラム
// p111_演習3-23(List3-16を変更)
#include <iostream>
using namespace std;

int main()
{
int n, i;
cout << "加算の回数:"; cin >> n;

int sum = 0;
for (i = 0; i < n; i++) {
int t;
cout << "整数:"; cin >> t;
if (sum + t > 1000) {
cout << "\a合計が1,000を超えました。\n最後の数値は無視します。\n";
break;
}
sum += t;
}
cout << "合計 … " << sum << "\n";
if (!i) cout << "平均 … " << 0 << "\n";
else cout << "平均 … " << (double)sum / i << "\n";
}
/*
このプログラムの
if (!i) cout << "平均 … " << 0 << "\n";
は、
最初にいきなり 1000を越える整数が入力されたときの対策です。
たとえば、1回目に 1050と入力されると、iが0のまま繰り返し文を抜けてしまうので、
平均を求める計算が 0 ÷ 0 となってしまいます。
*/

b03_23-3.png



新版 明解C++ 入門編 p.113 演習3-24
  合計だけでなく平均も求めるように、List 3-17 を書きかえたプログラムを作成せよ。なお、読み込んだ負の数の個数は平均を求める際の分母から除外すること。

// p113_演習3-24
#include <iostream>
using namespace std;

int main()
{
int n;
cout << "0以上の整数を加算\n数値の個数:"; cin >> n;

int sum = 0; // 合計値
int np = 0; // 0以上の整数の個数
for (int i = 0; i < n; i++) {
int t;
cout << "0以上の整数:"; cin >> t;
if (t < 0) {
cout << "\a負の数は加算しません。\n";
continue;
}
sum += t;
np++;
}
cout << "入力数値" << n << "個のうち 0以上の整数は" << np << "個\n";
cout << "合計 … " << sum << "\n";
cout << "平均 … " << (double)sum / np << "\n";
}

b03_24.png



新版 明解C++ 入門編 p.115 演習3-25
  List 3-3(p.87)の数当てゲームのプレーヤが値を入力できる回数に制限を設けたプログラムを作成せよ。制限回数内に当てられなかった場合は、正解を表示してゲームを終了すること。

// p115_演習3-25
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
const int FREQUENCY = 8; // 制限回数

srand((unsigned int)time(NULL));
int no = rand() % 90 + 10;
int x, i = 1;

cout << "数当て(10~99の整数)\n入力制限回数 " << FREQUENCY << "\n\n";

do {
cout << "整数(10~99)を入力 " << i++ << "回目:"; cin >> x;
if (x == no)
goto Correct;
if (i > FREQUENCY) {
cout << "\a\n回数オーバー! 正解は " << no << "です。\n";
goto Exit;
}
if (x > no)
cout << "それより小さい\n";
else
cout << "それより大きい\n";
} while (1);

Correct:
cout << "\n正解!\n";

Exit:
;
}

b03_25-1.png
b03_25-2.png



新版明解C++入門編 p.115 演習3-26
  人間とコンピュータとが対戦するジャンケンプログラムを作成せよ。
    ① 人間が望む限り何度でも繰り返せるようにするもの。
    ② いずれか一方が3回勝つまで繰り返すもの。
など、複数のパターンのプログラムを作ること。

① 人間が望む限り何度でも繰り返せるジャンケンプログラム
// p115_演習3-26(何度でも繰り返せる)
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
srand((unsigned int)time(NULL));
int cmp; // コンピュータの手
int you; // あなたの手

cout << "1 … グー\n2 … チョキ\n3 … パー\n";
cout << "※\"999\"の入力で終了\n\n";

do {
do {
cmp = rand() % 3 + 1;
cout << "あなたの手 :"; cin >> you;
if (you == 999)
goto Exit;
} while (you < 1 || you > 3);

cout << "------\n";
cout << "あなた   :";
if (you == 1) cout << "グー\n" ;
if (you == 2) cout << "チョキ\n";
if (you == 3) cout << "パー\n" ;

cout << "コンピュータ:";
if (cmp == 1) cout << "グー\n" ;
if (cmp == 2) cout << "チョキ\n";
if (cmp == 3) cout << "パー\n" ;

if (you == cmp) {
cout << "◆あいこ\n" "------\n"; continue;
}
if (you == 1 && cmp == 2 || you == 2 && cmp == 3 || you == 3 && cmp == 1) {
cout << "◆あなたの勝ち\n""------\n";
}
else {
cout << "◆あなたの負け\n""------\n";
}
} while (1);

Exit:
;
}

b03_26-1.png


② いずれか一方が3回勝つまで繰り返すジャンケンプログラム
// p115_演習3-26(3回勝つまで繰り返す)
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
srand((unsigned int)time(NULL));
int cmp; // コンピュータの手
int you; // あなたの手
int nc = 0; // コンピュータの勝った回数
int ny = 0; // あなたの勝った回数

cout << "1 … グー\n2 … チョキ\n3 … パー\n";
cout << "※ 3回勝ったほうが勝ち\n";
cout << "※\"999\"の入力で終了\n\n";

do {
cout << "----- あなた " << ny << "勝 ";
cout << "コンピュータ " << nc << "勝\n";

if (ny == 3) {
cout << "◆あなたの勝ち\n" ; goto Exit;
}
if (nc == 3) {
cout << "◆コンピュータの勝ち\n"; goto Exit;
}
cmp = rand() % 3 + 1;

do {
cout << "あなたの手 :"; cin >> you;
if (you == 999)
goto Exit;
} while (you < 1 || you > 3);

cout << "あなた   :";
if (you == 1) cout << "グー\n" ;
if (you == 2) cout << "チョキ\n";
if (you == 3) cout << "パー\n" ;

cout << "コンピュータ:";
if (cmp == 1) cout << "グー\n" ;
if (cmp == 2) cout << "チョキ\n";
if (cmp == 3) cout << "パー\n" ;

if (you == cmp) {
continue;
}
if (you == 1 && cmp == 2 || you == 2 && cmp == 3 || you == 3 && cmp == 1) {
ny++;
}
else {
nc++;
}
} while (1);

Exit:
;
}

b03_26-2.png

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

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









--

2017年09月10日

《その22》 多重ループ
 ( p.109 演習3-17,演習3-18,演習3-19,演習3-20,演習3-21,演習3-22)


新版 明解C++ 入門編 p.109 演習3-17
  季節を求める List 3-1(p.82)の月の読込みにおいて、1 ~ 12 以外の値が入力された場合は、再入力させるように変更したプログラムを作成せよ(do文の中に do文が入る二重ループとなる)。

// p109_演習3-17
#include <iostream>
using namespace std;

int main()
{
char retry;

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

cout << "\nもう一度? Y…Yes/N…No:"; cin >> retry;

} while (retry == 'Y' || retry == 'y');
}

b03_17.png





新版 明解C++ 入門編 p.109 演習3-18
  九九の表を表示する List 3-13(p.106)を、setw操作子を用いることなく実現するように書きかえたプログラムを作成せよ。

// p109_演習3-18
#include <iostream>
using namespace std;

int main()
{
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
int k = i * j;
k > 9 ? cout << " " : cout << " ";
cout << k;
}
cout << '\n';
}
}

b03_18.png



新版 明解C++ 入門編 p.109 演習3-19
  n段の正方形を表示するプログラムを作成せよ。

// p109_演習3-19
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "正方形を表示します。1辺の*の個数を入力:"; cin >> n;

for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
cout << '*';
cout << '\n';
}
}

b03_19.png



新版 明解C++ 入門編 p.109 演習3-20
  List 3-14 は左下側が直角の直角三角形を表示するプログラムであった。直角が左上側、右下側、右上側の直角三角形を表示するプログラムをそれぞれ作成せよ。

// p109_演習3-20
#include <iostream>
using namespace std;

int main()
{
int n;
cout << "直角三角形を表示します。段数を入力:"; cin >> n;

cout << "◆左上が直角\n";
for (int i = n; i >= 1; i--) {
for (int j = 1; j <= i; j++)
cout << '*';
cout << '\n';
}
cout << '\n';

cout << "◆右下が直角\n";
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) cout << ' ';
for (int j = 1; j <= i; j++) cout << '*';
cout << '\n';
}
cout << '\n';

cout << "◆右上が直角\n";
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i - 1; j++) cout << ' ';
for (int j = 1; j <= n - i + 1; j++) cout << '*';
cout << '\n';
}
cout << '\n';
}

b03_20.png



新版 明解C++ 入門編 p.109 演習3-21
 n段のピラミッドを表示するプログラムを作成せよ。
 第i行目には (i - 1) * 2 + 1 個の '*'記号を表示すること(最終行である第n行目
には (n - 1) * 2 + 1 個の '*'記号を表示することになる)。


// p109_演習3-21
#include <iostream>
using namespace std;

int main()
{
    int n;
cout << "ピラミッドを表示します。段数を入力:"; cin >> n;

for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i ; j++) cout << ' ';
for (int j = 1; j <= 2 * i - 1; j++) cout << '*';
cout << '\n';
}
}

b03_21.png



新版 明解C++ 入門編 p.109 演習3-22
  n段の下向き数字ピラミッドを表示するプログラムを作成せよ。第i行目には i % 10 によって得られる数字を表示すること。

// p109_演習3-22
#include <iostream>
using namespace std;

int main()
{
int n;
cout << "逆さの数字ピラミッドを表示します。段数を入力:"; cin >> n;

for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i - 1; j++) cout << ' ';
for (int j = 1; j <= 2 * (n - i) + 1; j++) cout << i % 10;
cout << '\n';
}
}

/*
**********************************************
左空白の個数 数字の個数
1段目 0 (2 * n - 1) 
2段目 1 (2 * n - 1) - (1) * 2
3段目 2 (2 * n - 1) - (2) * 2

i段目 i - 1 (2 * n - 1) - (i - 1) * 2
**********************************************

上の (2 * n - 1) - (i - 1) * 2 は、計算すると 2 * (n - i) + 1 になります。
*/

b03_22.png

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

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









--

2017年09月09日

《その21》 繰り返し文(p.105 演習3-8,演習3-9,演習3-10,演習3-11,演習3-12,演習3-13,演習3-14,演習3-15,演習3-16)


新版 明解C++ 入門編 p.105 演習3-8

// p105_演習3-8
#include <iostream>
using namespace std;

int main()
{
int n;
cout << "* の表示個数を入力:"; cin >> n;

for (int i = 0; i < n; i++)
cout << '*';
if (n > 0)
cout << '\n';
}

b03_08.png




新版 明解C++ 入門編 p.105 演習3-9

// p095_演習3-9
#include <iostream>
using namespace std;

int main()
{
int x;

do {
cout << "カウントダウンします。正の整数を入力:"; cin >> x;
} while (x <= 0);

for (int i = x; i >= 0; i--) {
cout << i << "\n";
}
}

b03_09.png



新版 明解C++ 入門編 p.105 演習3-10

// p105_演習3-10
#include <iostream>
using namespace std;

int main()
{
int n;

do {
cout << "nまでカウントアップ。正の整数nを入力:"; cin >> n;
} while (n <= 0);

for (int i = 0; i <= n; i++) {
cout << i << "\n";
}
}

b03_10.png



新版 明解C++ 入門編 p.105 演習3-11

// p105_演習3-11
#include <iostream>
using namespace std;

int main()
{
int n;

cout << "1からnまでの和\n";
do {
cout << "nの値:"; cin >> n;
} while (n < 1);

int sum = 0; // 合計

for (int i = 1; i <= n; i++) {
sum += i;
}
cout << "1から" << n << "までの和は" << sum << "です。\n";
}

b03_11.png



新版 明解C++ 入門編 p.105 演習3-12

// p105_演習3-12
#include <iostream>
using namespace std;

int main()
{
int n;

cout << "1からnまでの和\n";
do {
cout << "nの値:"; cin >> n;
} while (n < 1);

int sum = 0; // 合計

for (int i = 1; i <= n; i++) {
cout << i;
sum += i;
if (i < n)
cout << " + ";
}
cout << " = " << sum << '\n';
}

上のコードの

    for (int i = 1; i <= n; i++) {
cout << i;
sum += i;
if (i < n)
cout << " + ";
}
cout << " = " << sum << '\n';

の部分を、コンマ演算子(p.99)を使って次のように書き直してみました。

    for (int i = 1; (cout << i, sum += i, i < n); i++)
cout << " + ";
cout << " = " << sum << '\n';

書き直したプログラムの全体は、次のようになります。

// p105_演習3-12(別解)
#include <iostream>
using namespace std;

int main()
{
int n;

cout << "1からnまでの和\n";
do {
cout << "nの値:"; cin >> n;
} while (n < 1);

int sum = 0; // 合計

for (int i = 1; (cout << i, sum += i, i < n); i++)
cout << " + ";
cout << " = " << sum << '\n';
}

b03_12.png



新版 明解C++ 入門編 p.105 演習3-13

// p105_演習3-13
#include <iostream>
using namespace std;

int main()
{
int n1, n2, nd;
cout << "120cm~200cmの範囲内の対応表を表示します。\n";
do {
cout << "◆何cmから:"; cin >> n1;
cout << " 何cmまで:"; cin >> n2;
cout << " 何cmごと:"; cin >> nd;
} while (n1 < 120 || n2 < 120 || n1 > 200 || n2 > 200 || n1 > n2 || nd < 1);

cout << "身長 標準体重\n";
for (int i = n1; i < n2; i += nd) {
cout << " " << i << " " << (i - 100) * 0.9 << '\n';
}
cout << " " << n2 << " " << (n2 - 100) * 0.9 << '\n';
}

このプログラムの最後の部分を

    for (int i = n1; i < n2; i += nd) {
cout << " " << i << " " << (i - 100) * 0.9 << '\n'; // (*1)
}
cout << " " << n2 << " " << (n2 - 100) * 0.9 << '\n'; // (*2)

のように、わざわざ (*1),(*2) に分けたのは、身長の増分にかかわらす 身長終了値の標準体重が必ず表示されるようにするためです。

b03_13.png



新版 明解C++ 入門編 p.105 演習3-14

// p105_演習3-14
#include <iostream>
using namespace std;

int main()
{
int n;
cout << "* の表示個数を入力:"; cin >> n;

for (int i = 0; i < n; i++) {
if (i % 5 == 0 && i > 0) cout << '\n';
cout << '*';
}
if (n > 0)
cout << '\n';
}

b03_14.png



新版 明解C++ 入門編 p.105 演習3-15

// p105_演習3-15
#include <iostream>
using namespace std;

int main()
{
int a, n = 0;
do {
cout << "正の整数値を入力:"; cin >> a;
} while (a < 1);

for (int i = 1; i <= a; i++)
if (a % i == 0)
cout << i << '\n', n++;
cout << "約数の個数は " << n << '\n';
}

b03_15.png



新版 明解C++ 入門編 p.105 演習3-16

// p105_演習3-16
#include <iostream>
int main()
{
int n = 0;
do {
std::cout << "正の整数値を入力:"; std::cin >> n;
} while (n < 1);

for (int i = 1; i <= n; i++)
std::cout << i << "の2乗は " << i * i << '\n';
}

b03_16.png

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

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









--

2017年09月08日

《その20》 while文( p.88 ~ p.99)


新版 明解C++ 入門編 p.89 演習3-4

// p089_演習3-4
#include <iostream>
using namespace std;

int main()
{
int x;
do {
cout << "正の整数値を入力:";
cin >> x;
} while (x <= 0);

while (x >= 0) {
cout << x << "\n";
x--;
}
cout << "while文終了時の xの値 → " << x << "\n";
}

b0007.png



新版 明解C++ 入門編 p.95 演習3-5

// p095_演習3-5
#include <iostream>
using namespace std;

int main()
{
int n;
cout << "何個*を表示しますか:";
cin >> n;

int i = 0;
while (i < n) {
cout << '*';
i++;
}
if (n > 0)
cout << '\n';
}

b0008.png



新版 明解C++ 入門編 p.95 演習3-6

// p095_演習3-6
#include <iostream>
using namespace std;

int main()
{
int n;
cout << "個数を入力:"; cin >> n;
int i = 0;
while (i < n) {
if (i % 2)
cout << '-';
else
cout << '+';
i++;
}
if (n > 0)
cout << '\n';
}

b0009.png



新版 明解C++ 入門編 p.99 演習3-7

// p099_演習3-7
#include <iostream>
using namespace std;

int main()
{
int a; // a : 自然数(正の整数)
int n = 0; // n : 桁数

do {
cout << "自然数を入力:"; cin >> a;
} while (a < 1);

while (a > 0) {
a /= 10;
n++;
}
cout << "桁数は" << n << "\n";
}

b0010.png

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

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









--

《その19》 do文( p.82 ~ p.87)


新版 明解C++ 入門編 p.83 演習3-1

// p083_演習3_1
#include <iostream>
using namespace std;

int main()
{
char retry;
do {
int n;
cout << "整数値:"; cin >> n;

if (n > 0)
cout << "その値は正です。\n";
else if (n < 0)
cout << "その値は負です。\n";
else
cout << "その値は0です。\n";

cout << "もう一度? Y…Yes/N…No:"; cin >> retry;
} while (retry == 'Y' || retry == 'y');
}

"もう一度? Y…Yes/N…No:" という画面メッセージに対し、入力されるのは1文字(Y,y,N 等)だけです。
上のプログラムでは、その 1文字を char型の変数retryで受け取るようにしました。

p.92に、単一の文字(char型の文字リテラル)を表現するには 'Y''y'のように単一引用符「 ' 」で囲む、と書かれています。なので、do文の (条件式) は
 (retry == 'Y' || retry == 'y')
となります。

p.82 List3-1 では、string型の変数retryで "Y""y"等の文字列リテラルを受け取っていますが、
この場合は <string>ヘッダのインクルードが必要になります。そして、do文の (条件式) は
 (retry == "Y" || retry == "y")
となります。

b0004.png



新版 明解C++ 入門編 p.87 演習3-2

// p087_演習3_2
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
srand((unsigned int)time(NULL));
int no = rand() % 90 + 10;
int x;

cout << "10~99 の整数を当ててください。\n";

do {
cout << "整数(10~99)を入力:"; cin >> x;
if (x > no)
cout << "\aそれより小さい\n";
if (x < no)
cout << "\aそれより大きい\n";
} while (x != no);

cout << "正解!\n";
}

b0005.png



新版 明解C++ 入門編 p.87 演習3-3

// p087_演習3_3
#include <iostream>
using namespace std;

int main()
{
int n1, n2;
do {
cout << "10~99の異なる2整数を入力:"; cin >> n1 >> n2;
} while (n1 < 10 || n2 < 10 || n1 > 99 || n2 > 99 || n1 == n2);

if (n1 > n2) {
int t = n1; n1 = n2; n2 = t;
}

do {
cout << n1 << " ";
n1 = n1 + 1;
} while (n1 <= n2);
cout << '\n';
}

b0006.png

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

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









--

2017年09月07日

《その18》 p.70 代替表現(and,or),p.77演習2-17,演習2-18


新版 明解C++ 入門編 p.70 代替表現

p.70に
「論理積演算子&& の代わりに and を、論理和演算子|| の代わりに or を 用いることができる。」
と書かれています。
p.71に
「代替表現がサポートされていない処理系では、<ciso646>ヘッダのインクルードを試してみる。」
と書かれています。

私の使っている処理系では、<ciso646>ヘッダのインクルードが必要でした。
・・・ということは、サポートされていないんですね (_ _ |||

// p071_List2-19
#include <iostream>
#include <ciso646>
using namespace std;

int main()
{
int y;

cout << "年を入力せよ:";
cin >> y;

cout << "その年は閏年";
if (y % 4 == 0 and y % 100 != 0 or y % 400 == 0)
cout << "です。\n";
else
cout << "ではありません。\n";
}



新版 明解C++ 入門編 p.77 演習2-17

 double a;
 int b;
 a = b = 1.5;

代入演算子は右結合なので
 a = b = 1.5;

 a = (b = 1.5);
と解釈されて、まず b = 1.5 によって bに 1が代入されます(bは int型なので、1.5は受け取れない)。
代入式 b = 1.5 は 1(int型 b の値)と評価され、その 1が aに代入されます。
a は double型ですから、aの値は実数1となるはずです。

以上のことから、aの値は実数1,bの値は整数1 になります。




新版 明解C++ 入門編 p.77 演習2-18

 if (a = 0) c = 3;

( ) の中の 条件 a = 0 は、代入後の aの値である 0と評価されます。条件 0 は falseと見なされ、
 if (条件) 文;
の 文は実行されません。

なので、この if文は 何もしません。

新版 明解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日以上新しい記事の更新がないブログに表示されております。