- 本日の作業内容
- 前回の宿題について
今回は残念ながらコンパイルエラーが出ました.
コンパイルエラー: b1837
また,実行時にコアダンプが生じるものもありました.
コアダンプ: b1812
解答用紙に氏名と番号の記入が無かったり,実行時に間違った番号が表示される例,インデントの不備も見られました.
番号と名前無し: b1835
実行時番号違い: b1835
インデントの不備: b1818
注意してください.
以下は問題のあるプログラムの例です.参考にしてください.
int num1=rand()%3+7;
int num2=rand()%2+3;
|
乱数の使い方が未だに怪しい人がいます.きちんと理解してください.
return 0;
}
int fact1(int num1)
{
if(num1==1)
{
return 1;
}
else
{
return num1 *fact1(num1-1);
}
}
int fact2(int num2)
{
if(num2==1)
{
return 1;
}
else
{
return num2 *fact2(num2-1);
}
}
int fact3(int num3)
{
if(num3==1)
{
return 1;
}
else
{
return num3*fact3(num3-1);
}
}
|
なぜ3つも関数が必要なのか?
int per(int m, int n)
{
if(n==0)
{
return 1;
}
else
{
return m*per(m-1, n-1);
}
}
int com(int m, int n)
{
if(m==n)
{
return 1;
}
else if(n==0)
{
return 1;
}
else if(n==1)
{
return m;
}
else
{
return (com(m-1, n-1)+com(m-1, n));
}
}
|
なぜ2つも関数が必要なのか?
int mcn(int c1,int c2,int c3,int c4)
{
if(c4 == 1)
{
printf("%d\n",c1/c2);
return 0;
}
else
{
c1 = c1 * (c3 - 1);
c2 = c2 * (c4 - 1);
c3--;
c4--;
return mcn(c1,c2,c3,c4);
}
}
|
何がしたいのか?
- 前回の復習
値渡しと再帰について学習しました.値渡しは今週以降で行うスコープとも関係しますので,引き続き学習しましょう.
一方,再帰ですが,漸化式に帰着する処理は for 文などの反復処理を用いなくてもプログラムとすることが可能なもので,使い方によっては有効です.ただ,理解は難しいので,こちらも今週もう一回いろいろ確認してみましょう.また,処理が速い場合とそうでない場合があるので,使い分けも本格的にプログラムを作る場合には検討が必要です.
- 通用範囲
これまで変数の宣言は型に注意するだけで特に何の指定もなく行ってきました.教科書に書いてあるように,それは自動変数ということでした.小さなプログラムではそれで別に問題なく動作します.ところが,それなりの規模のプログラムを複数人で分けて個別に開発する場合には,関数やモジュールをいろいろ作っていくことになるので,それぞれの中で使用する変数がどこで使用可能なのかが重要になってきます.ここでは,教科書p.94の表5_1にあるような記憶クラスを意識してプログラミングを行います.
- 複数モジュールに関する注意
教科書のp.100のリスト5_6では複数のモジュールに分けたプログラムの例が出てきます.このように複数のファイルにプログラムが分かれている場合ですが,教科書の例のような単純なものでは,両方のファイルを同時にコンパイルすることで実行ファイルが作られます.
$ cc module_A.c module_B.c
ようにコンパイルします.
- 演習
演習問題はこちらです.
- 宿題
宿題の公開は5月21日以降です.よろしくお願いします.
- 次回の予習範囲
教科書のp.102からp.108の範囲を予習してください.
なお,次回は授業の後半でいよいよ第1回目の確認テストを実施します.関数の基本的な使用法についてのテストとなる予定です.準備よろしくお願いします.