2017年12月01日
《その158》 関数形式マクロ
関数形式マクロ
次のプログラムは、版明解C++中級編 p.128 にあるint型配列用のクイックソート関数 quickに、動作確認用のプログラムを付け足したものです。
プログラムの2行目
#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
は、関数形式マクロです。
このマクロ定義により、プログラム中の
swap(int, v[pl], v[pr]);
は、コンパイル時に
do { int t = v[pl]; v[pl] = v[pr]; v[pr] = t; } while (0);
に書き換えられます。
// ------------------------------------
#include <iostream>
#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
// int型配列のクイックソート
void quick(int v[], int n)
{
if (n > 0) {
int pl = 0;
int pr = n - 1;
int x = v[(pl + pr) / 2];
do {
while (v[pl] < x) pl++;
while (v[pr] > x) pr--;
if (pl <= pr) {
swap(int, v[pl], v[pr]);
pl++;
pr--;
}
} while (pl <= pr);
if (0 < pr) quick(v, pr + 1);
if (pl < n - 1) quick(v + pl, n - pl);
}
}
int main() {
int num[] = { 25, 21, 16, 12, 17, 11, 23, 19, 28, 17, 22, 24, 11, 18 };
std::cout << "◆ 25, 21, 16, 12, 17, 11, 23, 19, 28, 17, 22, 24, 11, 18\n";
quick(num, sizeof(num) / sizeof(num[0]));
std::cout << "→ ";
for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++)
std::cout << num[i] << " ";
std::cout << '\n';
}
// ------------------------------------
★ 新版明解C++入門編(SB Creative株式会社)に沿って学習してきましたが、
当ブログ《その1》〜《その112》までで一応終えることができました。
★ 新版明解C++中級編(SB Creative 株式会社)を購入しましたので、《その113》からはこれに沿って、
演習問題を全て解きながら、また、大切と思うことを自分なりに整理しながら、学習を進めて行きます。
★ ソースプログラムのコンパイルには、Visual Studio Community 2017 を利用しています。
Visual Studio Community 2017 の使い方については、このブログの《その1》〜《その6》をご覧ください。
関数形式マクロ
次のプログラムは、版明解C++中級編 p.128 にあるint型配列要のクイックソート関数 quickに、動作確認用のプログラムを付け足したものです。
プログラムの2行目
#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
は、関数形式マクロです。
このマクロ定義により、プログラム中の
swap(int, v[pl], v[pr]);
は、コンパイル時に
do { int t = v[pl]; v[pl] = v[pr]; v[pr] = t; } while (0);
に書き換えられます。
// ------------------------------------
#include <iostream>
#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
// int型配列のクイックソート
void quick(int v[], int n)
{
if (n > 0) {
int pl = 0;
int pr = n - 1;
int x = v[(pl + pr) / 2];
do {
while (v[pl] < x) pl++;
while (v[pr] > x) pr--;
if (pl <= pr) {
swap(int, v[pl], v[pr]);
pl++;
pr--;
}
} while (pl <= pr);
if (0 < pr) quick(v, pr + 1);
if (pl < n - 1) quick(v + pl, n - pl);
}
}
int main() {
int num[] = { 25, 21, 16, 12, 17, 11, 23, 19, 28, 17, 22, 24, 11, 18 };
std::cout << "◆ 25, 21, 16, 12, 17, 11, 23, 19, 28, 17, 22, 24, 11, 18\n";
quick(num, sizeof(num) / sizeof(num[0]));
std::cout << "→ ";
for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++)
std::cout << num[i] << " ";
std::cout << '\n';
}
// ------------------------------------
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7040181
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック