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

広告

posted by fanblog

2017年09月25日

《その48》 ポインタと配列(p.266演習7-4,演習7-5,p.267演習7-6,演習7-7,演習7-8,演習7-9,演習7-10,演習7-11)


新版明解C++入門編 p.266 演習7-4
 typeid演算子を用いて型を表示することによって、List 7-10(p.260)の関数 reverse の仮引数a が配列でなくポインタであることを確認せよ。

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

void reverse(int a[], int n)
{
cout << "aの型:" << typeid(a).name() << '\n';
// ・・・・・・
}

int main()
{
const int n = 5;
int c[n];
// ・・・・・・
reverse(c, n);
// ・・・・・・
}

b07_04.png




新版明解C++入門編 p.266 演習7-5
 List 7-10(p.260)の関数 reverse での2要素の交換を、演習7-2(p.253)で作成した関数 swap の呼出しによって行うように変更したプログラムを作成せよ。

// p266_演習7-5
#include <iostream>
using namespace std;

void swap(int* x, int* y)
{
int t = *x;
*x = *y;
*y = t;
}

void reverse(int* a, int n)
{
for (int i = 0; i < n / 2; i++)
swap(&a[i], &a[n - i - 1]);
}

int main()
{
const int n = 5;
int c[n];

for (int i = 0; i < n; i++) {
cout << "c[" << i << "] : "; cin >> c[i];
}

reverse(c, n);

cout << "------\n";
for (int i = 0; i < n; i++)
cout << "c[" << i << "] = " << c[i] << '\n';
}

b07_05.png




新版明解C++入門編 p.267 演習7-6
 要素数n の配列 a の全要素の合計を求めて返却する関数 sum_of を作成せよ。
    int sum_of(const int a[], int n);


// p267_演習7-6
#include <iostream>
using namespace std;

int sum_of(const int a[], int n)
{
int sum = 0;
for (int i = 0; i < n; i++)
sum += a[i];
return sum;
}

int main()
{
const int n = 5;
int a[n];
cout << "整数値を " << n << "個入力\n";
for (int i = 0; i< n; i++) {
cout << "a[" << i << "] = "; cin >> a[i];
}

cout << "値の合計 : " << sum_of(a, n) << '\n';
}

b07_06.png




新版明解C++入門編 p.267 演習7-7
 要素数 n の配列 a から要素 a[idx] を削除する関数 aryrmv を作成せよ。
    void aryrmv(int a[], int n, int idx);
 削除は a[idx] より後方の全要素を一つ前方にずらすことによって行う。移動されずにあまってしまう末尾要素 a[n - 1] の値は変更しなくてもよい。たとえば、配列 a の要素が {1, 3, 4, 7, 9, 11} のときに aryrmv(a, 6, 2) と呼び出した後の配列 a の要素は {1, 3, 7, 9, 11, 11} となる。

// p267_演習7-7
#include <iostream>
#include <iomanip>
using namespace std;

void aryrmv(int a[], int n, int idx)
{
for (int i = idx - 1; i < n - 1; i++)
a[i] = a[i + 1];
}

int main()
{
int array[8] = { -2, 50, 23, -8, 1, 3, 4, 17 };
for (int i = 0; i < 8; i++)
cout << setw(4) << array[i];
cout << '\n';
int m;
do {
cout << "何番目を消去(1〜7を入力)? "; cin >> m;
} while (m < 1 || m > 7);

aryrmv(array, 8, m);

for (int i = 0; i < 8; i++)
cout << setw(4) << array[i];
cout << '\n';
}

b07_07.png




新版明解C++入門編 p.267 演習7-8
 要素数 n の配列 a から要素 a[idx] を先頭とする k個の要素を削除する関数 arynrmv を作成せよ。
    void arynrmv(int a[], int n, int idx, int k);
 削除は a[idx] より後方の全要素を k個前方にずらすことによって行うこと。なお、移動されずにあまってしまう要素の値は変更しなくてよい。

// p267_演習7-8
#include <iostream>
#include <iomanip>
using namespace std;

void arynrmv(int a[], int n, int idx, int k)
{
for (int i = idx - 1; i < n; i++) {
if (i + k < n)
a[i] = a[ i + k];
// else // ☆
// a[i] = 0; // ☆

}
}

int main()
{
int array[8] = {-2, 50, 23, -8, 1, 3, 4, 17};
for (int i = 0; i < 8; i++)
cout << setw(4) << array[i];
cout << '\n';
int idx, k;
int f = 0;
do {
if (f++ > 0)
cout << "入力値が不正!\n";
cout << "何番目(1〜8)から何個消去するかを入力\n";
cout << "何番目から? "; cin >> idx;
cout << "何個を消去? "; cin >> k;
} while (idx < 1 || idx > 8 || k < 0 || idx + k > 9);

arynrmv(array, 8, idx, k);

for (int i = 0; i < 8; i++)
cout << setw(4) << array[i];
cout << '\n';
}

3番目から1個を消去(演習7-7 と同じ結果になります。)
b07_0801.png

5番目から2個を消去
b07_0802.png

5番目から4個を消去
 この場合は後方に要素がないので、問題の指示通りの仕様では、最終的な数字の並びが最初と同じになってしまいます。

b07_0803.png


上のプログラムのピンク色の部分のコメントアウトを外すと、後方からずれてくる要素が足りない場合は 0になるので、そのほうが自然な気がします。
以下の2画像は、ピンク色の部分のコメントアウトを外して実行した結果です。

b07_0811.png

b07_0812.png




新版明解C++入門編 p.267 演習7-9
 要素数 n の配列 a の要素 a[idx] に x を挿入する関数 aryins を作成せよ。
    void aryins(int a[], int n, int idx, int k);
 挿入に伴って a[idx] 〜 a[n-2] を一つ後方にずらさなければならない。
たとえば、配列 a の要素が {1, 3, 4, 7, 9, 11} のときに aryins(a, 6, 2, 99) と呼び出した後
の配列 a の要素は {1, 3, 99, 4, 7, 9} となる。

// p267_演習7-9
#include <iostream>
#include <iomanip>
using namespace std;

void aryins(int a[], int n, int idx, int x)
{
for (int i = n - 1; i > idx - 1; i--)
a[i] = a[i - 1];
a[idx - 1] = x;
}

int main()
{
int array[6] = { 1, 3, 4, 7, 9 ,11 };
for (int i = 0; i < 6; i++)
cout << setw(4) << array[i];
cout << '\n';
int idx, x;
do {
cout << "何番目(1〜6)にどんな整数を挿入するかを入力\n";
cout << "何番目に? "; cin >> idx;
cout << "整数値は? "; cin >> x;
} while (idx < 1 || idx > 6);

aryins(array, 6, idx, x);

for (int i = 0; i < 6; i++)
cout << setw(4) << array[i];
cout << '\n';
}

b07_09.png




新版明解C++入門編 p.267 演習7-10
 n行5列の int型2次元配列 a の各行の最大値を、要素数 n の 1次元配列 m に格納する関数 maxline を作成せよ。
    void maxline(int a[][5], int m[], int n);
たとえば、aに受け取った 3行5列の配列の構成要素が
{ {1, 2, 5, 4, 8}, {6, 7, 4, 2, 3}, {3, 0, 5, 9, 1} } であれば、mに {8, 7, 9} を格納すること。

// p267_演習7-10
#include <iostream>
#include <iomanip>
using namespace std;

void maxline(int a[][5], int m[], int n)
{
for (int i = 0; i < n; i++) {
int max = a[i][0];
for (int j = 1; j < 5; j++)
if (max < a[i][j])
max = a[i][j];
m[i] = max;
}
}

int main()
{
const int row = 4;

int array[row][5] = {
{ 11, 2, 5, 4, 8 },
{ 6, 17, 4, 2, 3 },
{ 3, 0, 5, 7, 6 },
{ 0, 1, 26, 2, 1 },
};
int m[row];
for (int i = 0; i < row; i++) {
for (int j = 0; j < 5; j++)
cout << setw(3) << array[i][j];
cout << '\n';
}
cout << '\n';

maxline(array, m, row);

for (int i = 0; i < row; i++) {
cout << "m[" << i << "] … " << setw(3) << m[i];
cout << '\n';
}
}

b07_10.png




新版明解C++入門編 p.267 演習7-11
 n行5列の int型2次元配列 a の全構成要素の値を縦横に並べて表示する関数 print2d を作成せよ。
    void print2d(int a[][5], int n);
 各構成要素がどのような値であっても、各列の数値の先頭(左端)がそろうように、最低限のスペースを空けること。

// p267_演習7-11
#include <iostream>
#include <iomanip>
using namespace std;

int digits(int n) // 整数の桁数(マイナス記号を含む)を返す。
{
int dgts = 0; // 桁数
int negative_number = 0; // 正なら桁数に1を加えない。
if (n < 0) {
negative_number = 1; // 負なら桁数に"-"の分として1を加える。
n = -n;
}
do {
dgts++;
n /= 10;
} while (n >= 1);

return dgts + negative_number;
}

void print2d(int a[][5], int n)
{
int dgts[5];
for (int j = 0; j < 5; j++) {
int min = a[0][j];
int max = a[0][j];
for (int i = 1; i < n; i++) {
if (min > a[i][j])
min = a[i][j];
if (max < a[i][j])
max = a[i][j];
}
dgts[j] = digits(max) > digits(min) ? digits(max) : digits(min);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++)
cout << setw(dgts[j] + 1) << left << a[i][j];
// ↑ 第j列の幅を確保
// "-"の分も考慮した桁数に1を加えた幅
cout << '\n';
}
}

int main()
{
const int rows = 5;

int array[rows][5] = {
{ 32 , -1, 32, 45, 67 },
{ 535, 0, 2, 128, -127 },
{ 2 , 5, -123, 9, 5 },
{ 1 , 2, 3, -12345, -1 },
{ 2 , 5, -123, 9, 12345 },
};

print2d(array, rows);
cout << '\n';
}

b07_11.png

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

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









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6738584
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします 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日以上新しい記事の更新がないブログに表示されております。