C言語:ポインタを使って関数内で合計と差を求めるプログラム
2つの整数 a と b があるとします。ここで、(a + b) と (a − b) の両方を計算できる関数を定義することを考えます。
しかし、C言語では1つの関数が返せる戻り値は最大で1つだけです。複数の結果を呼び出し元に返したい場合は、ポインタを使って出力パラメータ(引数)経由で値を書き戻すのが定番のテクニックです。
この問題では、a を a + b の値に、b を a − b の値にそれぞれ更新します。そのため、関数を呼び出すときには、これら2つの変数のアドレスを渡す必要があります。
たとえば、入力が a = 5、b = 8 の場合、出力は次のようになります。
a + b = 13a − b = -3
解き方の手順
solve()という関数を定義し、aとbのアドレスを受け取るtempに、渡されたアドレス先の変数の値の合計を代入するbに、渡されたアドレス先の変数の値の差を代入するaにtempの値を代入する
実装例
以下の実装を見ると、動作がより理解しやすくなります。
#include <stdio.h>
int solve(int *a, int *b){
int temp = *a + *b;
*b = *a - *b;
*a = temp;
}
int main(){
int a = 5, b = 8;
solve(&a, &b);
printf("a + b = %d and a - b = %d", a, b);
}
入力
a = 5, b = 8
出力
a + b = 13 and a - b = -3
ポイント解説
このコードの重要なポイントは、solve() 関数が引数として int * 型(intへのポインタ)を受け取っている点です。*a や *b と記述することで、ポインタが指し示す元の変数の値を読み書きできます。そのため、関数内での変更が main() 側の変数にも直接反映されます。
このように「参照渡し」の仕組みを利用すれば、C言語でも1つの関数から実質的に複数の結果を取得することが可能になります。なお、計算順序に注意が必要で、*b を上書きする前に合計を一時変数 temp に退避しておくことが正しい結果を得るための鍵となります。
-
非再帰関数を使って2つの整数の最大公約数(GCD)を求めるCプログラム
問題与えられた2つの整数について、非再帰関数を用いて最大公約数(GCD:Greatest Common Divisor)を求めます。解決策最大公約数を求める最も一般的な方法は、ユークリッドの互除法です。これは「大きい方の数を小さい方の数で割った余り」と「小さい方の数」の最大公約数が、元の2つの数の最大公約数と等しくなるという性質を利用したものです。この性質を関数として実装することで、繰り返し処理によって効率よくGCDを計算できます。以下では、非再帰的なアプローチで2つの整数の最大公約数を求める手順を説明します。アルゴリズム非再帰関数を使って2つの整数の最大公約数(GCD)を求めるためのアルゴリ
-
【C言語】再帰関数を使って2つの整数の最大公約数(GCD)を求める方法
問題 C言語において再帰関数を使用し、与えられた2つの整数の最大公約数(GCD:Greatest Common Divisor)を求めます。 解決策 再帰関数を用いて2つの整数の最大公約数を求めるには、「ユークリッドの互除法」が利用できます。これは「2つの数のGCDは、大きい方の数を小さい方の数で割った余りと、小さい方の数とのGCDに等しい」という性質を応用した手法です。この計算を余りが0になるまで再帰的に繰り返すことで、GCDを効率よく求めることができます。 アルゴリズム 再帰関数を使って2つの整数のGCDを求めるためのアルゴリズムは、以下の手順に従います。 ステップ1 − 再帰関数を