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);
// ・・・・・・
}
新版明解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';
}
新版明解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';
}
新版明解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';
}
新版明解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 と同じ結果になります。)
5番目から2個を消去
5番目から4個を消去
この場合は後方に要素がないので、問題の指示通りの仕様では、最終的な数字の並びが最初と同じになってしまいます。
上のプログラムのピンク色の部分のコメントアウトを外すと、後方からずれてくる要素が足りない場合は 0になるので、そのほうが自然な気がします。
以下の2画像は、ピンク色の部分のコメントアウトを外して実行した結果です。
新版明解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';
}
新版明解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';
}
}
新版明解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';
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6738584
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック