プログラミング入門II
2019.05.27
授業の後半で確認テストを実施します.窓側の席は柱の部分を避けて座って準備してください.
残念ながらコンパイルエラーが出ました.提出しても採点しませんので,エラーのないプログラムにしてから出してください.
コンパイルエラー: b1807 b1855
また,警告ですが,コンパイルできない警告(ほぼエラー)のものもありました. printf を print と打ち間違えただけですが,残念ながらそれでも動きませんので,採点できません.
警告(ほぼエラー): b1806
それから依然としてハイフンによる線引きや学生番号の無いものも見られます.インデントの不備もありました.気をつけましょう.
ハイフンラインなし: b1817 b1818
さて,今回の宿題ですが,まずは何を関数として置くのかについての理解が難しかったようです.まあ,何でもかんでも無理やり関数化するのがこの章の目的なので,判断が難しいところもありますが,解答例を参考にしてください.なお,いつもの悪い癖で数式を「自分で全部書く」という人が大変多かったです.McLaughrin展開を100項目までとか,1万項目までとかだったらどうしたんでしょうかね?プログラミンでは力技ではなく,常に自動化を考えてください.変数の個数が少ないから,式の項数が少ないからできるプログラミングではなく,変数が増えようが,式の項数が増えようが「同じ形」になるものが望ましいプログラムです.
せめて階乗くらいは関数を使って欲しいですが.
大変ですね.お疲れ様です.
式を自分で全部書いていますね.
変数の通用範囲(スコープ)について学習しました.以前に行った値渡しと併せて,複数のプログラムや関数とやり取りするにはどうすればよいのか,学習しました.
たくさんの自作関数を使いこなしたり複数のモジュールに分けて開発したりする場合には,外部から使用可能かどうか,また,使用させないようにするかどうか,という判断が必要になります.そのため,この教科書セクション5.2にある記憶クラスを理解しておくことが重要となります.
しかし,現時点で作成しているプログラムはそこまで大掛かりなものでも大したものでもないので,そんなに意識しなくても十分でしょう.ここでは,こんなこともあるという程度で理解してください.
また,教科書のp.104にあるモジュールBですが,記憶クラス指定子の extern を省略しても正常に動作します.一方で, static を指定したい場合にはきちんと書く必要はあります.
ここまでの学習で皆さんに特に覚えておいてほしいことは,105ページの記憶クラスの表です.通常の変数宣言は auto クラスとなりますが,その際に明示的に初期化しないと初期値は不定です.うっかり初期化を忘れることもありますが,現在はこの教室では警告が出るようになっています.ただ,一般的には警告が出ないのが普通なので,その時には以前にも紹介したオプションつきのコンパイルをおすすめします.
$ cc -Wuninitialized hoge.c
演習問題はこちらです.今回も複数モジュールに関数を分ける練習をしましょう.
学生番号なし: b1818
インデント不備: b1829
r2 = 2;
r3 = 3*r2;
r4 = 4*r3;
r5 = 5*r4;
r6 = 6*r5;
r7 = 7*r6;
r8 = 8*r7;
r9 = 9*r8;
printf("sin(%.1f) = ",x);
y1 = x - (x*x*x)/r3 + (x*x*x*x*x)/r5 - (x*x*x*x*x*x*x)/r7 + (x*x*x*x*x*x*x*x*x)/r9;
float s(float x)
{
return (float)x-(float)1/fact(3)*bekijo(x,3)+(float)1/fact(5)*bekijo(x,5)-(float)1/fact(7)*bekijo(x,7)+(float)1/fact(9)*bekijo(x,9);
}
float c(float x)
{
return 1-(float)1/fact(2)*bekijo(x,2)+(float)1/fact(4)*bekijo(x,4)-(float)1/fact(6)*bekijo(x,6)+(float)1/fact(8)*bekijo(x,8);
}
sinx = x - num(3)/fact(3) + num(5)/fact(5) - num(7)/fact(7) + num(9)/fact(9);
目次ページに戻る