情報処理III


春学期・月曜4時限・コンピュータルームB

[ 上智大学の学部シラバス内の本授業のページ]


受講生へのお勧め

授業はUnix環境で行ない、ソースファイルの作成は専らEmacsを用いる (別にviでも何でも良いのだが)。 これから作成するプログラムが長くなるに連れ、 効率的な実習の為にはエディタ操作への習熟が重要になる。 参考書・ネット上の情報・オンラインチュートリアルなどにより、 特に、 コピー&ペースト(リージョンコピー)・検索置換 ・複数ファイル読込・複数バッファ操作などについて、 各自調べて馴れておくと良い。

レポート提出に際しての注意

レポート課題一覧

特に、行列計算・有理数型・calcが大きな課題である。

  1. 7/12: 前回の課題の myatoi() を用いて、 コマンドラインから入力した2つ以上の整数の和を求めて表示する プログラム calc を作成せよ。 (符号対応・十六進版・不正な(数字以外の)入力への対応など 拡張版も出来れば作ってみよ。) [締切 7/18(日)]
  2. 7/5: 数字列を数値(int型)に変換する関数 myatoi() を作成し、 動作例のプログラムを書いて動作を確認せよ。 (符号対応・十六進版など拡張版も出来れば作ってみよ。) [締切 7/11(日)]
  3. 6/28: 構造体を用いて「有理数型」Rational を定義した上で、 代入・表示・加減乗除・比較などの一連の基本的な関数を作成し、 main() 内でその動作を確認できるような計算をせよ。 [締切 8/6(金)。期末レポートの一つに相当する大きめの課題である。]
  4. 6/21: 3×3 行列に関する基本的な関数(表示・演算など)を作成して プリントのプログラム matrix2.c を完成させよ。 (数学的に面白い例を求む。そのために以下を補足) [締切 6/27(日)。仕様を満たしていないものは再提出すべし。]
  5. 6/14: 配列に対し「最小値を取る要素の添字を求める」部分を min_index() として関数化し、 それを大きさの異なる 2 つの配列に適用して、 最小値を取る要素の添字とその値とを表示せよ。 (出来れば、乱数による配列の要素の値の設定の部分や、 配列の要素の値の表示の部分をも関数化せよ。) [締切 6/20(日)]

  6. 6/7: 2つの変数の値を入替える関数swap()を正しく作り、 動作を確認した上で、何故そういう動作になるか理解する。 [締切 6/13(日)]
  7. 5/31: 今回は新規の課題無し。今までの課題の提出が滞っている人は、 この機会に追い付きましょう。
  8. 5/24: Newton-Raphson法を用いて、正の実数 a に対してその平方根を返す関数 root()を作り(初期値 a, 誤差範囲ε=10^{-6}としてよい)、 数学関数ライブラリにある平方根関数による値と共に表示するプログラム [締切 プリントには5/30(日)と記したが、 Newton-Raphson法の説明が間に合わなかったので6/6(日)に延期。 知っている人は勿論先に提出しても構いません。]
  9. 5/17: 前々回の課題を基に関数 gcd() を作成し、 それを用いて、正整数 n に対し、それと互いに素な n 以下の正整数の個数 φ(n) を求めるプログラム [締切 5/23(日)]
  10. 5/10: Collatz 予想(角谷予想)に於いて、 1 から 10000 までの自然数の中で、 1 に到達するまでのステップ数が最も多いものを調べ、 その自然数とその時のステップ数を出力するプログラム [締切 5/16(日)]
  11. 4/26(1): Collatz 予想(角谷予想) 「自然数 n に対し、 『n が偶数なら 2 で割り、奇数なら 3 倍して 1 足す』 を繰り返すと、必ず 1 に到達するだろう」 を検証するプログラム [Subject は 4/26(1), 0426-1 など。締切 5/9(日)]
  12. 4/26(2): 正整数を 2 つ入力し、その最大公約数を Euclidの互除法によって求めるプログラム (Euclidの互除法を知らない人は自分で調べること) [Subject は 4/26(2), 0426-2 など。締切 5/16(日)]
  13. 4/19: 2つの実数と1つの整数を入力し、 2つの実数の和を整数で割った値を計算して結果を表示するプログラム [Subject は 4/19, 0419 など。締切 4/25(日)]
  14. 4/12: 3つの整数の和と平均とを計算して表示するプログラム [Subject は 4/12, 0412 など。締切 4/18(日)]

履修予定者への注意

講義概要

計算機室での実習により、C 言語によるプログラミングの演習を行なう。 基本的な課題に取組みながら、文法を中心に基礎事項を学ぶ。 自分でプログラムを書き実際に動かしてみることを通じ、 単に文法を覚えるのみならず、 プログラミングの本質的な考え方を身に付けてもらいたい。 Unix 上で実習を行なうので、 情報処理I・II程度の基本操作に習熟していることを要す。

講義計画

C 言語の基本的な文法事項を中心にプログラミングの演習を行なう。

主な参考書

講義内容

4/12

配ったプリント [アンケート(pdf,15KB) |page 0〜7(pdf,45KB) ]

C 言語によるプログラミングを始めるに当たって。 C 言語によるプログラムの記述から実行まで。 プログラムを書く→コンパイルする→実行する、という手順。 最初のprogram(printfによる文字列の表示)。 変数を使ってみる(変数の宣言・整数の四則演算と値の表示)。 コンパイルエラー体験実習。エラーメッセージを読む。

課題: 3つの整数の和と平均とを計算して表示するプログラム

4/19

配ったプリント [page 8〜15(pdf,46KB) ]

前回の課題の解説と補足。変数を使う(続き)。 型(intdouble)・四則演算・ printf変換。実行時に値を入力する(scanf)。

課題: 2つの実数と1つの整数を入力し、 2つの実数の和を整数で割った値を計算して結果を表示するプログラム

4/26

配ったプリント [page 16〜23(pdf,47KB) ]

前回の課題の解説と補足。 入出力リダイレクションとの連携を想定した画面表示法。 制御構造(条件分岐・繰り返し)。 if,ifelse文。 while文。

課題(4/26-1) : Collatz 予想(角谷予想) 「自然数 n に対し、 『n が偶数なら 2 で割り、奇数なら 3 倍して 1 足す』 を繰り返すと、必ず 1 に到達するだろう」 を検証するプログラム [締切 5/8(日)]

課題(4/26-2) : 正整数を 2 つ入力し、その最大公約数を ユークリッドの互除法によって求めるプログラム [締切 5/15(日)]

5/3

「憲法記念日」でお休み。

5/10

配ったプリント [page 24〜27(pdf,34KB) ]

前回の課題の解説と補足。ソースの字下げについて。 制御構造(条件分岐・繰り返し)の続き。dowhile文。 増分(increment)/減少(decrement)演算子(++,--)。 for文。

課題: Collatz 予想(角谷予想)に於いて、 1 から 10000 までの自然数の中で、 1 に到達するまでのステップ数が最も多いものを調べ、 その自然数とその時のステップ数を出力するプログラム [締切 5/16(日)]

5/17

配ったプリント [page 28〜33(pdf,43KB) ]

前回の課題の解説と補足。演算子の優先順位。 C 言語では全ての式は型と値とを持つ。 関数について。関数定義・関数プロトタイプ・関数呼出。

課題 : 前々回の課題を基に関数 gcd() を作成し、 それを用いて、正整数 n に対し、それと互いに素な n 以下の正整数の個数 φ(n) を求めるプログラム[締切 5/23(日)]

5/24

配ったプリント [page 34〜39(pdf,49KB) ]

前回の課題の解説と補足。関数(続き)。 数学関数ライブラリの使い方。 ヘッダファイル・#include命令・リンカオプション-l#define命令。manの使い方。

課題 : Newton-Raphson法を用いて、正の実数 a に対してその平方根を返す関数 root()を作り(初期値 a, 誤差範囲ε=10^{-6}としてよい)、 数学関数ライブラリにある平方根関数による値と共に表示するプログラム [締切: プリントには5/30(日)と記したが、 Newton-Raphson法の説明が間に合わなかったので6/7(日)に延期。 知っている人は勿論先に提出しても構いません。]

5/31

配ったプリント [page 40〜45(pdf,45KB) ]

Newton-Raphson法の補足説明。

ポインタ入門。変数の型と byte 長・sizeof演算子。 アドレス参照 &

6/7

配ったプリント [page 46・47(pdf,24KB) ]

ポインタ入門(続き)。ポインタ型変数。間接参照 *。 関数の引数として変数へのポインタを渡す例。

課題 : 2つの変数の値を入替える関数swap()を正しく作り、 動作を確認した上で、何故そういう動作になるか理解する。 [締切 6/13(日)]

6/14

配ったプリント [page 48〜53(pdf,47KB) ](誤記訂正済)

配列。乱数の使い方の紹介。 配列を関数に渡してポインタで受ける。

課題 : 配列に対し「最小値を取る要素の添字を求める」部分を min_index() として関数化し、 それを大きさの異なる 2 つの配列に適用して、 最小値を取る要素の添字とその値とを表示せよ。 (出来れば、乱数による配列の要素の値の設定の部分や、 配列の要素の値の表示の部分をも関数化せよ。) [締切 6/20(日)]

6/21

配ったプリント [page 54〜61(pdf,46KB) ](誤記訂正済)

前回の課題の解説と補足。 配列とポインタとの関係。 ポインタの演算。 a[i] == *(a+i) 。 多次元配列(行列を扱う)。

課題 : 3×3 行列に関する基本的な関数(表示・演算など)を作成して プリントのプログラム matrix2.c を完成させよ。 (数学的に面白い例を求む。そのために以下を補足)[締切 6/27(日)]

6/28

配ったプリント [page 62〜67(pdf,38KB) ]

前回の課題の解説と補足。typedefによる型の別名定義。 構造体。例:複素数型を作る。

課題 : 構造体を用いて「有理数型」Rational を定義した上で、 代入・表示・加減乗除・比較などの一連の基本的な関数を作成し、 main() 内でその動作を確認できるような計算をせよ。 [締切 8/6(金)]

7/5

配ったプリント [page 68〜73(pdf,45KB) ]

前回の補足。 文字(char)型。文字コード。文字列の扱い。 buffer overflow について。

課題 : 数字列を数値(int型)に変換する関数 myatoi() を作成し、 動作例のプログラムを書いて動作を確認せよ。 (符号対応・十六進版など拡張版も出来れば作ってみよ。) [締切 7/11(日)]

7/12

配ったプリント [page 74〜77(pdf,34KB) ]

コマンドライン引数(main関数の引数)。

課題 : 前回の課題の myatoi() を用いて、 コマンドラインから入力した2つ以上の整数の和を求めて表示する プログラム calc を作成せよ。 (符号対応・十六進版・不正な(数字以外の)入力への対応など 拡張版も出来れば作ってみよ。) [締切 7/18(日)]

7/19(予定)

配る予定のプリント [page 78〜85(pdf,40KB) ]

「海の日」であるが授業実施日である。

break文・continue文によるloopの例外脱出。 switch文による多岐分岐。 ファイル入出力。

期末試験は行ないません。課題の提出状況とその内容で評価します。