* 第6回 UNIXプログラミング [#h8383c41]

** 目次 [#g5c587b4]

#contents

** 参考になる情報 [#i8953726]

- C言語の教科書などを持っているなら参考になりますので用意してきて下さい。
- また、「C言語入門」とか「Cプログラミング入門」とか「Cの書き方」などなど…の言葉で、検索してみて下さい。そして手ごろなページを選んで下さい。それを参考にして、以下の課題をやってみましょう。

** とりあえずコンパイル [#i1e2bad4]

+ みなさんがインストールしたソフトウェアの中には、gccというCのコンパイラが入っています。コンパイルの仕方は以下になります。
 gcc ファイル名.c 
+ まず、これで「Hello, world!」と表示するプログラムを作ってみて、動作を確認して下さい。
+ コンパイル結果(たとえばa.out)を実行するには、以下のように先頭に「./」をつける必要があります。
 ./a.out
-- 工学部のサーバでは「./」は不要だったと思いますが、みなさんのコンピュータ設定はカレントディレクトリが実行パスに含まれていないので、明示的に指定する必要があります。(./は今いるディレクトリの意味です)

** 課題1 [#mf9e9e20]

+ counter.cというファイル名で以下のプログラムを作って下さい。
+ プログラムの冒頭には、いつものとおりコメント文で自分の名前をローマ字で書い
ておいて下さい。
+ 作るプログラムはcounterという名前にしてください。gccの-oオプションで指定で
きます。(なにも指定しないと、ご存じa.outになります。これをmvで改名しても良
いですが...)
+ ./counterとタイプするたびに数字を表示するプログラムにして下さい。つまり、最
初にcounterを起動すると1が表示されて終了し、次に起動すると2が表示されて終了
します。
+ このためには、前回表示した番号を覚えておかねばなりません。やりかたは、ファ
イルを作ってそこに番号を書き込んでおくことです。番号を記録しておくファイル
名は適当で良いです。が、そのファイルが存在しない時には新しくファイルを作る
、存在していればそこから番号を読み出して、カウントアップして、また書き込む
、という手順を実現して下さい。
+ もうすこし詳しいヒント
+ カウント用の変数を用意します。内容を0にしておきます。
+ fopenでカウント値記録用のファイルを読み込みモードで開きます。
+ fopenでエラーなく開けたら、fscanfでその値を用意した変数に読み込みます。
そのあとfcloseします。
+ 変数の値を1増やします。これを表示します。
+ fopenでカウント値記録用のファイルを書き込みモードで開きます。
+ fprintfで変数の値を書き込みます。
+ fcloseでファイルを閉じます。
+ フローチャートも書いておきました。ここです。
+ このプログラムは、あとのWWWのカウンタで使いますので、なくさないように保存し
ておいて下さい。

** 課題2 [#jb83b0b3]

+ gifcounter.cというファイル名で以下のプログラムを作って下さい。
+ gifcounterという名前の実行ファイルにして下さい。
+ counter.cと同様ですが、以下のように表示を変えて下さい。
+ 最初に起動すると
 0.gif
 0.gif
 0.gif
 0.gif
 0.gif
 0.gif
と表示して終了します。
+ 次に起動すると
 0.gif
 0.gif
 0.gif
 0.gif
 0.gif
 1.gif
と表示して終了します。
+ 次に起動すると
 0.gif
 0.gif
 0.gif
 0.gif
 0.gif
 2.gif
と表示して終了します。
+ 10回めに起動すると
 0.gif
 0.gif
 0.gif
 0.gif
 1.gif
 0.gif
と表示して終了します。
+ たとえば13459回めに起動すると(そんなに起動できませんから、回数を記憶してい
るファイルを、echoコマンドやエディタなどで書き換えてテストして下さい)
 0.gif
 1gif
 3.gif
 4.gif
 5.gif
 9.gif
と表示して終了します。

課題1と課題2は、この演習の後の回で(たぶん)使うことになります。そこでぜひ完成
させて下さい。以上の課題が完成したら、両方のプログラムを一つのメールの本文にし
て,report@fig.ele.eng.tamagawa.ac.jpまで送ってください。

この二つがあっという間に出来てしまって、時間を持て余す人のために、課題3を用意し
ておきました。

課題3 (時間に余裕のあるひと、できる人だけ挑戦して下さい)

+ 魔方陣というのがあります。例えば3x3のますに、1から9までの数字を重複しないで
入れていった場合、
┌──┬──┬──┐
│2 │7 │6 │
├──┼──┼──┤
│9 │5 │1 │
├──┼──┼──┤
│4 │3 │8 │
└──┴──┴──┘

という組み合わせで数字を入れると、縦、横、斜めの八通りの合計が全部15になり
ます。これを3次魔方陣とよびます。
+ 3x3の魔方陣になる組み合わせを、プログラムをかいて全部探してみましょう。
+ (STEP-1)
+ 魔方陣を表現するために9個の要素からなる整数配列を用意しましょう。
+ この配列を0にクリアする関数を作りましょう
+ この配列に左上から順番に1,2,3,4と数字を入れていく関数を用意しましょう。
+ この配列を3x3で表示する関数を用意しましょう。
+ 上記の関数を呼んで、以下のように印刷するmain()を作りましょう。

0 0 0
0 0 0
0 0 0

1 2 3
4 5 6
7 8 9
+ (STEP-2) このステップが出来ればほとんど完成です。
+ 魔方陣にすべての数字の組み合わせを入れて、それを表示する関数を作りまし
ょう。全ての組み合わせは9!とおりありますので、362,880とおりになります。
+ この関数は「再帰呼び出し」という方法を使うと比較的簡単に作れます。
+ この関数をmain()から呼び出して下さい。
+ 結果は、以下のようになるかと思います。
1 2 3
4 5 6
7 8 9

1 2 3
4 5 6
7 9 8

1 2 3
4 5 6
8 7 9

1 2 3
4 5 6
8 9 7

(略)

9 8 7
6 5 4
2 3 1

9 8 7
6 5 4
3 1 2

9 8 7
6 5 4
3 2 1

9 8 7
6 5 4
3 2 1

(36万通りも表示していると時間がかかりますので、./a.out | tail -20など
とすると最後の20行だけ表示されるので早いです)
+ (STEP-3)
+ STEP-2のプログラムを変更して、魔方陣になる組み合わせの数字のときだけ、
表示するように変更して下さい。8とおりの組み合わせが出てくるはずです。(
いずれも最初に示した魔方陣の例の、回転または鏡像対象の組み合わせになり
ます)
+ 実行時間を計ってみて下さい。
+ 春学期にやったように、timeコマンドを使って、高速化を試みて下さい。たと
えば最初の行の合計が15にならないような組み合わせの場合は、その先調べる
必要がありません。
+ 同じプログラムをcr0xで動かしてみて、工学部演習室のサーバと、みなさんの
iMacの速度を比較してみて下さい。

以上の課題が完成したら、教員に報告して下さい。

----
[[メディアコース実験]]



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS