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

広告

posted by fanblog

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

b08_14.png



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

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

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









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

お名前:

メールアドレス:


ホームページアドレス:

コメント:

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

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

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

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