2017年10月04日
《その65》 配列要素の並びを反転(p.315演習8-14)
配列要素の並びを反転
要素数が n の配列 a[n] について考えます。
〔1〕配列内の要素を順次交換していく方法
◆ n が偶数6 の場合は、以下の 3回の交換で完了します。
a[0] と a[5] を交換
a[1] と a[4] を交換
a[2] と a[3] を交換
交換回数の 3 は 6 / 2 で求めることができます。
◆ n が奇数7の場合は、以下の 3回の交換で完了します。
a[0] と a[6] を交換
a[1] と a[5] を交換
a[2] と a[4] を交換
※ 真ん中の要素 a[3] は、反転後も真ん中のまま
交換回数の 3 は 7 / 2 で求めることができます(int型の商は小数部分切り捨て)。
以上のことから、配列 a[n] の要素の並びを反転する場合の交換回数は
n が偶数でも奇数でも、(n / 2)回ということがわかります。
------------------------------------------------for (int i = 0; i < n / 2; i++) {------------------------------------------------
a[i] の値と a[n - 1 - i] の値を交換;
}
〔2〕配列のコピーを作り、コピーから逆順に元の配列に値を書き戻す方法
配列a[n] の要素数が予めわからない場合もあるので、コピーの配列名を temp にするなら、
char* temp = new char[n];
のように動的に生成するのがいいと思います。
------------------------------------for (int i = 0; i < n; i++)------------------------------------
temp[i] = a[i];
for (int i = 0; i < n; i++)
a[i] = temp[n - 1 - i];
新版明解C++入門編 p.315 演習8-14
文字列 s の文字の並びを反転する関数 str_rvs を作成せよ。
char* str_rvs(char* s);たとえば、文字列 s が "abc" であれば、その文字列を "cba" に更新する。受け取った s の値をそのまま返却すること。
// p315_演習8-14_1 配列内の要素を順次交換していく方法
#include <iostream>
using namespace std;
void swap(char* p1, char* p2) { // 2要素の入れ替えを行う関数
char temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
char* str_rvs(char* s)
{
char* p = s;
int n = 0; // n は文字数
while (*s++)
n++;
for (int i = 0; i < n / 2; i++)
swap(&p[i], &p[n - 1 - i]);
return p;
}
int main()
{
char str1[] = "ABCDE";
char str2[] = "0123456789";
char str3[] = "X Y Z";
cout << str1 << '\n';
str_rvs(str1);
cout << str1 << '\n';
cout << str2 << '\n';
str_rvs(str2);
cout << str2 << '\n';
cout << str3 << '\n';
str_rvs(str3);
cout << str3 << '\n';
}
// p315_演習8-14_2 配列のコピーを作り、コピーから逆順に元の配列に値を書き戻す方法
#include <iostream>
using namespace std;
char* str_rvs(char* s)
{
char* p = s;
int n = 0;
while (*s++)
n++;
char* temp = new char[n];
for (int i = 0; i < n; i++)
temp[i] = p[i];
for (int i = 0; i < n; i++)
p[i] = temp[n - 1 - i];
delete[] temp;
return p;
}
int main()
{
char str1[] = "ABCDE";
char str2[] = "0123456789";
char str3[] = "X Y Z";
cout << str1 << '\n';
str_rvs(str1);
cout << str1 << '\n';
cout << str2 << '\n';
str_rvs(str2);
cout << str2 << '\n';
cout << str3 << '\n';
str_rvs(str3);
cout << str3 << '\n';
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6773025
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック