C++マクロの機能を解説:配列の最大値と最小値の差を求めるプログラム
問題概要
いくつかの整数値が格納された整数型の配列が与えられます。この配列の中から最小値と最大値を見つけ出し、その差を求めるのが課題です。ただし、この問題を解く際にはC++のマクロを必ず使用しなければなりません。入力は標準入力(stdin)から受け取り、結果は標準出力(stdout)に出力します。
例えば、入力が array = {120, 589, 324, 221, 234} の場合、出力は次のようになります。
The answer is : 469
これは、最大値の 589 と最小値の 120 の差が 469 であることを意味します。
解法のアプローチ
この問題は、次の手順で解くことができます。
- 変数
miniを無限大(十分に大きい値)で初期化する - 変数
maxiを負の無限大(十分に小さい値)で初期化する - 配列
vの各要素v[i]について以下を繰り返すmini > v[i]であれば、mini = v[i]と更新するmaxi < v[i]であれば、maxi = v[i]と更新する
ans = maxi - miniを計算するansを出力する
実装例
理解を深めるために、以下の実装例を見てみましょう。
#define minmac(a, b) a = min(a, b)
#define maxmac(a, b) a = max(a, b)
#define INF ((1 << 31)-2)
#define input(a) cin >> a
#define toStr(a) string("The answer is :")
#define FOO(a, b)
#define foreach(a, b) for (int i = 0; i < a.size(); ++i)
#include <iostream>
#include <vector>
using namespace std;
FOO(minmac, <)
FOO(maxmac, >)
int main(){
int n; cin >> n;
vector<int> v(n);
foreach(v, i) {
input(v)[i];
}
int mini = INF;
int maxi = -INF;
foreach(v, i) {
minmac(mini, v[i]);
maxmac(maxi, v[i]);
}
int ans = maxi - mini;
cout << toStr(The answer is :) <<' '<< ans;
return 0;
}
コードのポイント:各マクロの役割
このプログラムで定義されている主なマクロは以下の通りです。
minmac(a, b):a = min(a, b)に展開され、現在の値より小さい値があれば更新します。maxmac(a, b):a = max(a, b)に展開され、現在の値より大きい値があれば更新します。INF:((1 << 31) - 2)に展開され、int 型で扱えるほぼ最大の値を表します。最小値の初期値として使用します。input(a):cin >> aに展開され、標準入力からの読み込みを行います。toStr(a): 引数を文字列リテラルに変換します。foreach(a, b):for (int i = 0; i < a.size(); ++i)に展開され、vector の全要素を走査するループを簡潔に記述できます。
マクロを活用することで、頻繁に使う処理を短い名前で呼び出せるようになり、コードの可読性と再利用性が向上します。ただし、マクロはコンパイル前に単純なテキスト置換として展開されるため、引数に副作用を伴う式(インクリメントなど)を渡すと意図しない動作になる可能性がある点には注意が必要です。
入力例
5 120 589 324 221 234
出力例
The answer is : 469
-
C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説
swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s
-
関数を使って素数を判定するC++プログラムの作成方法
素数とは、1より大きい整数であり、約数が「1」と「その数自身」のみである数のことを指します。言い換えれば、素数はそれ以外のどの整数でも割り切ることができません。 最初のいくつかの素数は以下の通りです。 2, 3, 5, 7, 11, 13 ,17 本記事では、関数を使用してある数値が素数かどうかを判定するC++プログラムについて解説します。 サンプルコード #include <iostream> using namespace std; void isPrime(int n) { int i, flag = 0; for(i=2; i<=n/2; ++i)