|
[9] 関数(2)演習課題
提出〆切は 6/12(金)14:10 です.
-
演習 1
サンプルプログラム①を別名(ex01.c)にコピーし,
それを次のように編集しなさい:
- 関数の名前を get_sum_divisor に変更する.
- 関数 get_sum_divisor は n の約数の合計を返す.
ただし,提出する ex01.c における main の中身は次の内容としなさい:
int main(void){
int x;
for ( x = 5; x <= 15; x += 5){
printf("%d の約数の合計 = %d\n", x, get_sum_divisor(x));
}
return 0;
}
これに対し,実行結果は
5 の約数の合計 = 6
10 の約数の合計 = 18
15 の約数の合計 = 24
となるようにしなさい.
(ヒント)自然数 k が n の約数であるというのは,
n を k で割った余りが 0 ということである.
したがって,k = 1 ~ n について,それぞれ n を k
で割った余りを調べ,余りが 0 の場合だけ k を足していけばよい.
-
演習 2
サンプルプログラム②を別名(ex02.c)にコピーし,
それを次のように編集しなさい:
- 関数 is_prime はそのままで変更しない.
- main 内で自然数 x を読み込み,
is_prime を繰り返し呼び出すことで(for か while を使いなさい),2 以上 x 以下の自然数それぞれが素数かどうかを判定して出力しなさい.
入出力例(キーボードからの入力は赤色)
自然数を入力してください:6
2 は素数です
3 は素数です
4 は素数ではありません
5 は素数です
6 は素数ではありません
-
演習 3
サンプルプログラム③を別名(ex03.c)にコピーし,
それを次のように編集しなさい:
- 新たに get_smaller という関数も作る.
- 関数 get_smaller は二つの整数を引数にとり,
小さい方を返すものとする.
- main 内で三つの自然数を読み込み,
真ん中の数字(2 番目に大きな値)を出力させる.
(ヒント)三つの数の合計から最大値と最小値を引けば,
真ん中の値は求まる.
int main(void){
int x, y, z, max, min, middle;
printf("三つ自然数を入力してください:");
scanf("%d %d %d", &x, &y, &z);
max = get_larger( get_larger(x,y), z );
min = (自分で考えて作りなさい.get_smaller を使うこと.)
middle = (x+y+z) - max - min;
printf("真ん中の値は %d です.\n", middle);
return 0;
}
-
演習 4
サンプルヘッダ④を
別名(ex04.h)にコピーし,
それを次のように編集しなさい:
- ヘッダファイル内で関数 get_max とは別に
get_min, get_average という関数も作る.
- get_min 関数は,
get_max と同様に int 配列を引数にとり,
配列内の最小値を返す
- get_average 関数は,
get_max と同様に int 配列を引数にとり,
配列内の要素の平均値(こちらは実数なので double 型)を返す.
関数の定義は「
double get_average( ... 」で始なければならない点に注意
main 関数を含んだ
ex04.c はこちらをダウンロードして使いなさい.
この課題では ex04.h を提出しなさい(ex04.c ではないので注意)
演習用データ 1 (data4-1.txt)
/
2 (data4-2.txt)
/
3 (data4-3.txt)
(リンクを右クリックして「名前を付けてリンク先を保存」を選ぶ)
入出力例(キーボードからの入力は赤色)※Mac の人は a ではなく ./a.out になります.
a < data4-1.txt
100 個の整数を入力してください:
入力された値の範囲: -22 以上 118 以下
入力された値の平均値 = 44.44
余裕のある人は
-
演習 1【発展課題】
まず,上の演習 1 で作った ex01.c を別名(ex01e.c)にコピーしなさい.
そして,その中で get_sum_divisor をコピーして
別の関数 get_divisor_count も作りなさい.
get_divisor_count は,約数の合計の代わりに約数の「個数」を返すものとする.
そして,main 内では二つの関数を次のように呼出しなさい.
int main(void){
int x;
for ( x = 5; x <= 15; x += 5 ){
printf("%d の約数(%d 個)の合計 = %d\n", x, get_divisor_count(x), get_sum_divisor(x));
}
return 0;
}
実行例
5 の約数(2 個)の合計 = 6
10 の約数(4 個)の合計 = 18
15 の約数(4 個)の合計 = 24
-
演習 2【発展課題】
まず,上の演習 2 で作った ex02.c を別名(ex02e.c)にコピーしなさい.
そして,main 関数のみを書き換えて,
見つかった素数の個数を数えて出力させなさい.
入出力例(キーボードからの入力は赤色)
自然数を入力してください:6
2 は素数です(1個目)
3 は素数です(2個目)
4 は素数ではありません
5 は素数です(3個目)
6 は素数ではありません
-
演習 3【発展課題】
まず,上の演習 3 で作った ex03.c を別名(ex03e.c)にコピーしなさい.
そして,main 関数を書き換えて,
読み込んだ三つの数を辺の長さとした三角形の形を判定するようにしなさい:
- 最大値と最小値が同じ:正三角形
- 上ではないが,2 番目に大きな値が最大値または最小値と同じ:二等辺三角形
- 上のいずれでもない:不等辺三角形
(※三角形にならないような入力が与えられることは無いと仮定して構わない)
(実行例1)
三つの辺の長さを入力してください:5 5 5
正三角形です
(実行例2)
三つの辺の長さを入力してください:5 3 5
二等辺三角形です
(実行例3)
三つの辺の長さを入力してください:5 3 6
不等辺三角形です
-
演習 4【発展課題】
まず,上記の演習 4 で作ったヘッダ ex04.h を別名(ex04e.h)にコピーしなさい.
そして,それに関数を二つ追加して次のように改良しなさい:
配列内の素数(ただし,2 以上の自然数に限る)の個数と最大の素数を表示させる.
【追加作成する関数】
- get_prime_count :int 配列を引数にとり,その中に含まれる素数の個数を返す.
(素数の判定には prime.h で与えられている is_prime を使いなさい)
- get_max_prime :int 配列を引数にとり,その中に含まれる素数の中で最大値を返す.素数が含まれていない場合は -1を返す.
(素数の判定には prime.h で与えられている is_prime を使いなさい)
(6/8, 19:35 更新) ※最大値 max を求める際,初期値設定に困るかもしれないが,ここでは max = -1; を初期値としてプログラムを書くとよい.
(※素数が 1 個以上存在していないと最大値は未定義になるが,ここでは必ず登場するものと仮定してよい.つまり,少なくとも
2 以上の素数が 1 個は登場するものとして max = 2; を初期値としてプログラムを作ってよい)
素数の判定に使用する is_prime 関数(講義で登場)をヘッダ prime.h で用意してあるのでダウンロードして使いなさい.
main 関数を含んだ
ex04e.c はこちらをダウンロードして使いなさい(この中では prime.h も読み込んである).
この課題では ex04e.h を提出しなさい(ex04e.c ではないので注意)
入出力例(キーボードからの入力は赤色)※Mac の人は a ではなく ./a.out になります.
a < data4-1.txt
100 個の整数を入力してください:
入力された値の範囲: -22 以上 118 以下
入力された値の平均値 = 44.44
入力された値の中の素数の個数 = 27 個
入力された値の中の素数の最大値 = 109
|