プログラミング基礎 II
Martin J. Dürst
duerst@it.aoyama.ac.jp
O 棟 529号室
テュールスト マーティン ヤコブ
http://www.sw.it.aoyama.ac.jp/2005/Programming%20Basics%20II/lecture8.html
© 2005 Martin
J. Dürst 青山学院大学
先週の演習題
- 1 から 20
の整数の半径の円の面積を計算するプログラムを作りなさい。
- 先週のゴミ出しのプログラムをある月の一日の曜日だけを指定して、プログラムがその月の全ての日のゴミ出しを計算するように改造してください
(月が全て 31日間の想定で結構です)。
- 先週のゴミ出しのプログラムをユーザが何回も入力できる、しかも止めたいときには止める様に変更してください。
- 10~20 かける 10~20 の表を作って下さい。(ヒント:
printf
で %d
の代わりに %3d
を使うと数字が揃う)
- ある入力した数字が素数かどうかを判断するプログラムを作って下さい。さらに、1
から n までを素数かどうかのプログラムに変更してください。
- 自分の分野や身の回りの問題で繰り返しと条件文を使った面白いプログラムを作って下さい。
今までの関数の使い方
自分で書いた関数:
使った関数:
- 入出力関係:
printf
, scanf
,
fgets
, など
- 文字列関係:
strlen
, strcmp
, など
関数の目的、役割
- プログラムの処理の明確な構造化
- よく使う処理の部品化
- プログラムの読みやすさの向上
関数の作り方
double① pow② (double③ a④, int③ b④)
{
int n;⑥
double ret = 1;
for (n=0; n<b; n++) {
ret *= a;
}
return ret;⑤
}
- 戻り値の型
- 関数の名前
- 引数の型
- 引数の名前
return
文
- 関数の本文
関数とのデータのやり取り
引数: 関数へ値を引き渡す (0 個 (void
) 以上)
戻り値: 関数から値を戻す (0 個 (void
) 又は 1
個)
グローバル変数:
プログラム全体に使える変数。役割分担などはっきりしないため、避けた方がよい。
関数の型
関数の型は次のもので定まる:
例外: printf
と scanf
の場合には引数の数も第二引数以降の型も決っていない
関数の宣言と定義
- 関数はどの順番で書いてもいいが、コンパイラがある関数の型を知らないところでその関数を使うと引数の引き渡しがうまく行かないことが多い
- 関数の型だけを前もって宣言できる:
double pow (double a, int b);
double① pow② (double③ a④, int③ b④);⑦
(7. セミコロン)
- 関数の宣言だけを別のファイル (
.h
ファイル) に入れることがよくある
関数を作るときの注意点
- 関数側と使う側を混乱させないように片側づつ考える
- 引数の数と型、戻り値の型に注意すること
- 使うところでコンパイラが宣言や定義を見えるようにする
今週の演習題
- 簡単な関数 (例えば消費税の計算、利子の計算、BMI
の計算、素数の判断) を一つ作って、先生や TA
に見せてからその関数を使う
main
関数を作って下さい。
- 先週の演習問題 2 及び 3
の一日分のゴミ出しの判断を関数にして、二つのプログラムを書き直してください。
- 今までの演習問題のプログラムを調査して、関数に出来るところを見つけて関数化する。
- 発展問題: 二つの 1
以上の整数の最大公約数を計算する関数
(とこれを使うプログラム) を作る。a と b
の最大公約数 gcd(a, b) は次のように計算できる: a==b
の時 a と b が最大公約数; a>b の時 gcd(a, b) は gcd (a-b,
b) と同じ。a<b の時に gcd(a, b) は gcd(b, a)
と同じ。この説明に沿って関数を作って下さい。関数が自分を呼ぶことを気にしないでください。
- 発展問題:
複数のプログラムに同じ関数を書くのが無駄な面がある。一日分のゴミ出しの判断の関数を別のファイル
(例えば
gomi.c
) に移して、その宣言を例えば
gomi.h
に入れて、今までのプログラムで
#include "gomi.h"
で引用して下さい。コンパイルの場合に複数の
.c
ファイルを書いてもよい (.h
ファイルは書かなくてよい)
次回のための準備
- 第十一章 (pp. 146-157) を読む
- 余った演習題を完成する
- ミニテスト (約 30 分) への準備