PowerPoint版

プログラミング演習II
2004年10月19日(第1回)
理学部数学科・木村巌
この授業の目標





C言語による、より規模の大きいプログラムの
作成(複数の関数、複数のファイルからなる
プログラム)
C言語におけるより高度な概念の習得(変数
のスコープと寿命、アドレスとポインタ)
C言語により、より複雑なデータ構造の実装
(構造体などを用いる)
標準ライブラリを使ったプログラミング
プログラミングの楽しさを知る
評価




ほぼ毎回課すレポート
中間・期末試験
を評価の対象にします.
出席は加味しません.
プログラミング?




プログラム:コンピュータに、処理の仕方を指
示するもの
プログラミング:プログラムを作成すること
プログラミング言語:プログラムを作成するた
めの人工言語.C言語の他、C++, Java, Lisp,
Perl, Ruby, Pythonなど様々なものがある
プログラミングは楽しい!
この授業を受けるに当たって


以下の知識・技能を仮定します
Microsoft Windowsの基本概念・基本操作


Cygwin環境の基本概念・基本操作


秀丸エディタ、AL-Mail, Microsoft Office各ソフト
ウエアの基本操作
ファイルの作成、コンパイル、実行の仕方
プログラミング演習Iで学んだ程度のC言語の
知識(高橋麻奈「やさしいC」第7章まで)
前回までの復習



C言語で書かれたプログラムは、原則として、
main()関数と、0個以上のそれ以外の関数か
らなる
実行は、常にmain()関数から始まる
main()関数は、



int main (void)
int main (int ac, char **av)
という引数、返値を持つ
前回までの復習2

関数の定義は、



という形式であった(括弧内は引数リスト)
関数呼び出しは、プログラムの中で、



返値 関数名 (型1 仮引数1, 型2 仮引数2, …)
関数名 (引数1, 引数2, …)
という形式を取るのだった
関数から値を、呼び出し元に戻すことができ
る(return 式;)
前回までの復習3


Cygwinってなんだっけ?
Cygwinの使い方




プログラミング演習Iの4/20の回を参照
Cygwinはfree!
パソコンを持っている人は、手に入れて使っ
てみよう
パソコンを持っている人は、 LinuxやFreeBSD
にチャレンジしてみよう!
今日学ぶこと




関数の中で変数を宣言し、使えるようになる
関数の中で定義された変数のスコープ(可視
範囲)について理解する
変数の寿命について理解する
教科書8.6から(p.249~)
ローカル変数・グローバル変数

例えば、今までmain()関数内で定義してきた
変数は、main()にローカルな変数
int main (void)
{
int a; /* main()内でローカルな変数 */
…
}


関数の外側でも変数の定義が出来る!
それがグローバル変数
グローバル変数(教科書図8-14)
int a; /* グローバル変数 */
void func (void)
{
int b = 1; /* func()にローカルな変数 */
}
int main (void)
{
…
}
スコープ(可視範囲)





Sample10.c (p.250)を入力し、コンパイル・実
行してみよう
グローバル変数aは、すべての関数から可視
ローカル変数は、そのローカル変数が定義さ
れた関数内でのみ、可視
変数の名前が通用する範囲を、スコープ
(scope)という
教科書図8-15参照
ローカル変数の名前が重なると?


同じ関数内で名前が重なると、重複がコンパ
イル時に検出される
異なる関数内で、それぞれにローカルな変数
が同じ名前を持つことは、構わない
ローカル変数とグローバル変数で名
前が重なると?

グローバル変数が、ローカル変数によって
「隠蔽」されるように振る舞う(教科書図8-17,
p.255)
記憶寿命


変数(に限らず、任意のオブジェクト)は、「寿
命」、即ち、そのオブジェクトが存在し、最後に
保存された値を保っていることが保証される
期間、をもつ.
変数の一生



(1)メモリが確保される
(2)値が格納される
(3)破棄される
いつメモリが確保・破棄される?

ローカル変数の場合



関数内で、その変数の宣言箇所に実行がさしか
かったとき確保される
その関数から、実行が離れるとき破棄される
グローバル変数の場合


プログラムの実行が始まるときに、すべてのグ
ローバル変数が確保される
プログラムの終了時に破棄される
例で確認しよう

変数の一生を確認するために、Sample11.cを
入力し、コンパイル・実行してみよう!
static変数の場合

ローカル変数を宣言するときに、static という
strage class specifierをつけると、




プログラムの実行が始まるときに確保され
プログラムの実行が終わるときに破棄される
関数から実行が離れるときも、破棄されない!
Sample11.cの変数cを参照
今日学んだこと




変数の可視範囲
ローカル変数、staticなローカル変数
グローバル変数
変数の寿命
レポート課題




次のスライドの/* ??? */ を補って、Fibonacci
数列のはじめの幾つかの項が出力されるプ
ログラムを完成せよ.
締め切り:2004年10月25日一杯(日本時間
で)
提出先:メールで木村([email protected])まで.
感想などあると木村が喜びます
レポート課題: /* ??? */を補え
int
static_fib (void)
{
/* ??? */ int fib1 = 1;
/* ??? */ int fib2 = 1;
int tmp = fib1;
fib1 = fib2;
fib2 = tmp + fib2;
return fib2;
}
int
main (void)
{
printf ("%d\n", static_fib());
printf ("%d\n", static_fib());
printf ("%d\n", static_fib());
printf ("%d\n", static_fib());
printf ("%d\n", static_fib());
printf ("%d\n", static_fib());
printf ("%d\n", static_fib());
return 1;
}
レポートの書式


件名(Subject)に、プログラミング演習IIのレ
ポートであることを明記
差出人欄(From: )に、差出人の氏名を明記


Spamメールを大量に受け取るので、これらが明
記されていないメールは読まれないことがありま
す。そもそも当然のネチケット(neticket)です
レポートの内容は、本文に記述。添付書類に
しない。実行ファイルを添付しない!