高度プログラミング演習 (07) 演習問題 • 月と日を入力して、それが1月1日から何一目 であるか表示するプログラムを作成せよ。(た だし閏年は考慮しないこととする。) • 入力された2つの月日を求めるプログラムを 作成せよ。(ただし、閏年は考慮しないことと する。) #include<stdio.h> int md(int m,int d) { switch (m) { case 12: d = d + 30; case 11: d = d + 31; case 10: d = d + 30; case 9: d = d + 31; case 8: d = d + 31; case 7: d = d + 30; case 6: d = d + 31; main() { int m0,d0,m1,d1; case 5: d = d + 30; case 4: d = d + 31; case 3: d = d + 28; case 2: d = d + 31; case 1: d = d; } return d; } scanf("%d %d %d %d",&m0,&d0,&m1,&d1); printf("%d\n",md(m1,d1)-md(m0,d0)); } 関数の中で引数を変更する #include <stdio.h> void foo3(int x, int y) { x=3; y=4; } void foo4(int *x, int *y) { *x=6; *y=8; } void main() { int a=0,b=0; foo3(a,b); printf(“%d %d\n”,a,b); foo4(&a,&b); printf(“%d %d\n”,a,b); } 問題 • 数の並び替えをしてみよう。 • 4,1,2,3,6 を小さい順に並び替える。 4 1 2 3 6 1 4 2 3 6 手順 1. 最小値を見つけ、これを左端にもってくる。 2. 二番目に小さい値を見つけ、これを左から二 番目におく。 3. 三番目に。。。 最小値を見つけ、これを左端にもってくる。 for(i=1;i<n;i++){ もし data[i] が data[0] よりも小さければ 入れ替える。 } 1 2 4 3 6 2つの数字を入れ替える関数を作れば便 利。 my_swap(&a,&b) 1 2 3 4 6 2番目、3番目に小さい数字に対して、「最 小値を見つけ、これを左端にもってくる。 」 ような処理をするには、どうすればいい か? #include <stdio.h> void my_swap(int *a,*b) { } void my_sort() { } void main() { 並び替えるデータを乱数で作成する。; /* 並び替えをする関数を呼び出す。 */ my_sort(); 並び替えた結果を出力する。; } 再帰関数 • 再帰 – 動作の対象が動作主そのもの。 • 主語 = 目的語 – 彼は自分のことが好きだ。 – He loves himself. • 再帰関数 – 自分の中で自分自身を呼び出している関数。 void foo() { ………… ………… foo(); } 再帰関数を使う例(1) • n の階乗 – n! = n × n-1 × n-2 …. × 1 f(n) f(n-1) f(n-2) f(0) n*(n-1)*(n-2)*..*2*1 1*1 1 include <stdio.h> int fact(int n) { if(n==0) return 1; else return n * fact(n-1); } main() { int n; scanf("%d",&n); printf("%d ! = %d\n",n,fact(n)); } 再帰関数を使う例(2) • 10進表記の数 num を x進法表記するプログ ラム。 • num を x で割ったあまり桁の数字になる。 – 一番最初のあまりが一番小さい桁 • num が x よりも小さくなればそれが一番大き な桁になる。 10進表記 → 2進表記 #include <stdio.h> 1. num 2. num は 2 よりも大きい 5. num を表示す る 3. num を 2 で割る 4. num % 2 を表示する 1. 2. 3. 2. 3. … 5. 2. 3. 4. 3. 4 void d2x(int num,int x) { if(num<x){ printf("%d",num); return; } d2x(num/x,x); printf("%d",num%x); } void main() { int num,x; scanf("%d %d",&num,&x); d2x(num,x); printf("\n"); } 練習問題 • 与えられた2数のべき乗を計算する関数を再 帰関数を用いて作成せよ。 演習問題 • ユークリッドの互除法を用いて最大公約数を 求める関数を作成せよ。 • ヒント:24と64の最大公約数 – 64%24 → 16 – 24%16 → 8 – 16%8 → 0
© Copyright 2024 ExpyDoc