プログラミング実習II (2026) 課題

[T5] 第5章 関数(2)

(T5_1)

2 個の整数の最大公約数を求めて表示するプログラムを作成する(通常,最大公約数は greatest common "divisor" という).

表示例: x = 560, y = 462 のとき        表示例: x = 3355, y = 2379 のとき

   560 ÷ 462  =  1 … 98                    3355 ÷ 2379  =  1 … 976
   462 ÷  98  =  4 … 70                    2379 ÷  976  =  2 … 427
    98 ÷  70  =  1 … 28                     976 ÷  427  =  2 … 122
    70 ÷  28  =  2 … 14                     427 ÷  122  =  3 …  61
    28 ÷  14  =  2                           122 ÷   61  =  2

  gcd( 560, 462 ) = 14                      gcd( 3355, 2379 ) = 61
#include <stdio.h>

int gcd( int, int );

int main( void ){

    int x, y, g;

    printf("Enter an integer: ");
    scanf("%d", &x);
    printf("Enter another integer: ");
    scanf("%d", &y);


    printf("gcd( %d, %d ) = %d \n", x, y, g );

    return 0;
}

int gcd( int x, int y ){

}
(T5_2)

「キックオフ C言語」 3.10節 練習問題 8(【関数の役割分担・void関数】マンハッタン距離とは…)に解答せよ。作成した関数を利用し,動作が確認できるような C 言語のプログラムを作成して提出すること.

(T5_3)

「キックオフ C言語」 3.10節 練習問題 6(【関数の役割分担・座標の平行移動】次の関数を…)に解答せよ。作成した関数を利用し,動作が確認できるような C 言語のプログラムを作成して提出すること.

(T5_4)

「グローバル変数」「ローカル変数」とはどのようなものであるかを資料を参考にしてレポートにて説明せよ.その上で,以下を解答せよ.

  1. コンパイルすると 1 行エラーが表示される.その理由を説明したうえで,修正せよ.
  2. 正しく修正した後で実行すると,main関数やその他の関数内の変数 i, j の値が表示される.各々について,なぜその値が表示されるかを説明せよ.
  3. このプログラム内で「グローバル変数」を定義している箇所を指摘せよ.

// ローカル変数とグローバル変数
// 変数のスコープ

#include <stdio.h>

int i = 0;

int func1( void ){
	printf("func1-1 : i = %d, j = %d \n", i, j );

	int i = 2;
	int j = 7;
	printf("func1-2 : i = %d, j = %d \n", i, j );

	return 0;
}

int func2(int i){
	printf("func2-1 : i = %d\n", i);

	i += 3;
	printf("func2-2 : i = %d\n", i);

	return i;
}

int j = 5;

int main( void )
{
	printf("main-1 : i = %d, j = %d \n", i, j );

	int i = 1;
	printf("main-2  : i = %d\n", i);

	func1();
	printf("main-3  : i = %d\n", i);

	i = func2( i );
	printf("main-4  : i = %d\n", i);

	return 0;
}
※「グローバル変数」は便利な面もあるが,プログラミングのミスにより意図と異なる値の書き換えなどを犯してしまいがちで,使用には注意が必要である.特に今回は「関数」の習得が目標であり,引数・戻り値の概念を理解することが重要であるため,宿題課題 [E5] では グローバル変数を用いずに解答して下さい.
(T5_5)

以下のプログラムにおける accumulator( n ) は,複数回呼び出されたときに, それまでに与えられた n を積算して返す関数である. ただし,グローバル変数を用いているため,(さらにプログラムを追加すると)意図しない値の書き換えが起こる恐れがあり,実用上このようなプログラムは書くべきではない. この問題が解消されるように,グローバル変数を用いないプログラムに書き換えよ.ただし,main 関数は変更しないこと. キックオフ C 言語の p. 114-115,および C言語によるプログラミング p. 210-216 が参考になる.

#include <stdio.h>

int sum = 0;

int accumulator( int n ) {
	sum = sum + n;
	return sum;
}

int main( void ) {
	printf("%d\n", accumulator(1)); // 1 = 1
	printf("%d\n", accumulator(5)); // 1 + 5 = 6
	printf("%d\n", accumulator(3)); // 1 + 5 + 3 = 9
	printf("%d\n", accumulator(4)); // 1 + 5 + 3 + 4 = 13

	return 0;
}