Presentation is loading. Please wait.

Presentation is loading. Please wait.

高度プログラミング演習 (07).

Similar presentations


Presentation on theme: "高度プログラミング演習 (07)."— Presentation transcript:

1 高度プログラミング演習 (07)

2 演習問題 月と日を入力して、それが1月1日から何一目であるか表示するプログラムを作成せよ。(ただし閏年は考慮しないこととする。)
入力された2つの月日を求めるプログラムを作成せよ。(ただし、閏年は考慮しないこととする。)

3 #include<stdio.h>
int md(int m,int d) { switch (m) case 12: d = d + 30; case 11: d = d + 31; case 10: case 9: case 8: case 7: case 6: main() { int m0,d0,m1,d1; scanf("%d %d %d %d",&m0,&d0,&m1,&d1); printf("%d\n",md(m1,d1)-md(m0,d0)); } case 5: d = d + 30; case 4: d = d + 31; case 3: d = d + 28; case 2: case 1: d = d; } return d;

4 関数の中で引数を変更する #include <stdio.h> void foo3(int x, int y) { x=3;
} 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);

5 問題 数の並び替えをしてみよう。 4,1,2,3,6 を小さい順に並び替える。

6 4 1 2 3 6 1 4 2 3 6 1 2 4 3 6 1 2 3 4 6 手順 最小値を見つけ、これを左端にもってくる。
二番目に小さい値を見つけ、これを左から二番目におく。 三番目に。。。 4 1 2 3 6 最小値を見つけ、これを左端にもってくる。 for(i=1;i<n;i++){ もし data[i] が data[0] よりも小さければ入れ替える。 } 2つの数字を入れ替える関数を作れば便利。 my_swap(&a,&b) 2番目、3番目に小さい数字に対して、「最小値を見つけ、これを左端にもってくる。 」ような処理をするには、どうすればいいか? 1 4 2 3 6 1 2 4 3 6 1 2 3 4 6

7 #include <stdio.h>
void my_swap(int *a,*b) { } void my_sort() void main() 並び替えるデータを乱数で作成する。; /* 並び替えをする関数を呼び出す。 */ my_sort(); 並び替えた結果を出力する。;

8 再帰関数 再帰 再帰関数 動作の対象が動作主そのもの。 彼は自分のことが好きだ。 He loves himself.
主語 = 目的語 彼は自分のことが好きだ。 He loves himself. 再帰関数 自分の中で自分自身を呼び出している関数。 void foo() { ………… foo(); }

9 再帰関数を使う例(1) n の階乗 n! = n × n-1 × n-2 …. × 1 f(n) f(n-1) f(n-2) f(0)
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)); }

10 再帰関数を使う例(2) 10進表記の数 num を x進法表記するプログラム。 num を x で割ったあまり桁の数字になる。
一番最初のあまりが一番小さい桁 num が x よりも小さくなればそれが一番大きな桁になる。

11 10進表記 → 2進表記 #include <stdio.h> void d2x(int num,int x) {
10進表記 → 2進表記 #include <stdio.h> 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"); 1. num 2. num は 2 よりも大きい 5. num を表示する 3. num を 2 で割る 4. num % 2 を表示する

12 練習問題 与えられた2数のべき乗を計算する関数を再帰関数を用いて作成せよ。

13 演習問題 ユークリッドの互除法を用いて最大公約数を求める関数を作成せよ。 ヒント:24と64の最大公約数 64%24 → 16
64%24 → 16 24%16 → 8 16%8 → 0


Download ppt "高度プログラミング演習 (07)."

Similar presentations


Ads by Google