春学期・月曜4時限・コンピュータルームB
授業はUnix環境で行ない、ソースファイルの作成は専らEmacsを用いる (別にviでも何でも良いのだが)。 これから作成するプログラムが長くなるに連れ、 効率的な実習の為にはエディタ操作への習熟が重要になる。 参考書・ネット上の情報・オンラインチュートリアルなどにより、 特に、 コピー&ペースト(リージョンコピー)・検索置換 ・複数ファイル読込・複数バッファ操作などについて、 各自調べて馴れておくと良い。
特に、行列計算・有理数型・calc
が大きな課題である。
myatoi()
を用いて、
コマンドラインから入力した2つ以上の整数の和を求めて表示する
プログラム calc
を作成せよ。
(符号対応・十六進版・不正な(数字以外の)入力への対応など
拡張版も出来れば作ってみよ。)
[締切 7/18(日)]
int
型)に変換する関数 myatoi()
を作成し、
動作例のプログラムを書いて動作を確認せよ。
(符号対応・十六進版など拡張版も出来れば作ってみよ。)
[締切 7/11(日)]
Rational
を定義した上で、
代入・表示・加減乗除・比較などの一連の基本的な関数を作成し、
main()
内でその動作を確認できるような計算をせよ。
[締切 8/6(金)。期末レポートの一つに相当する大きめの課題である。]
matrix2.c
を完成させよ。
(数学的に面白い例を求む。そのために以下を補足)
[締切 6/27(日)。仕様を満たしていないものは再提出すべし。]
int
型でなくてdouble
型でも良し。min_index()
として関数化し、
それを大きさの異なる 2 つの配列に適用して、
最小値を取る要素の添字とその値とを表示せよ。
(出来れば、乱数による配列の要素の値の設定の部分や、
配列の要素の値の表示の部分をも関数化せよ。)
[締切 6/20(日)]
swap()
を正しく作り、
動作を確認した上で、何故そういう動作になるか理解する。
[締切 6/13(日)]root()
を作り(初期値 a, 誤差範囲ε=10^{-6}としてよい)、
数学関数ライブラリにある平方根関数による値と共に表示するプログラム
[締切 プリントには5/30(日)と記したが、
Newton-Raphson法の説明が間に合わなかったので6/6(日)に延期。
知っている人は勿論先に提出しても構いません。]
gcd()
を作成し、
それを用いて、正整数 n に対し、それと互いに素な n 以下の正整数の個数
φ(n) を求めるプログラム
[締切 5/23(日)]計算機室での実習により、C 言語によるプログラミングの演習を行なう。 基本的な課題に取組みながら、文法を中心に基礎事項を学ぶ。 自分でプログラムを書き実際に動かしてみることを通じ、 単に文法を覚えるのみならず、 プログラミングの本質的な考え方を身に付けてもらいたい。 Unix 上で実習を行なうので、 情報処理I・II程度の基本操作に習熟していることを要す。
C 言語の基本的な文法事項を中心にプログラミングの演習を行なう。
配ったプリント [アンケート(pdf,15KB) |page 0〜7(pdf,45KB) ]
C 言語によるプログラミングを始めるに当たって。
C 言語によるプログラムの記述から実行まで。
プログラムを書く→コンパイルする→実行する、という手順。
最初のprogram(printf
による文字列の表示)。
変数を使ってみる(変数の宣言・整数の四則演算と値の表示)。
コンパイルエラー体験実習。エラーメッセージを読む。
課題: 3つの整数の和と平均とを計算して表示するプログラム
配ったプリント [page 8〜15(pdf,46KB) ]
前回の課題の解説と補足。変数を使う(続き)。
型(int
・double
)・四則演算・
printf
変換。実行時に値を入力する(scanf
)。
課題: 2つの実数と1つの整数を入力し、 2つの実数の和を整数で割った値を計算して結果を表示するプログラム
配ったプリント [page 16〜23(pdf,47KB) ]
前回の課題の解説と補足。
入出力リダイレクションとの連携を想定した画面表示法。
制御構造(条件分岐・繰り返し)。
if
,if
〜else
文。
while
文。
課題(4/26-1) : Collatz 予想(角谷予想) 「自然数 n に対し、 『n が偶数なら 2 で割り、奇数なら 3 倍して 1 足す』 を繰り返すと、必ず 1 に到達するだろう」 を検証するプログラム [締切 5/8(日)]
課題(4/26-2) : 正整数を 2 つ入力し、その最大公約数を ユークリッドの互除法によって求めるプログラム [締切 5/15(日)]
「憲法記念日」でお休み。
配ったプリント [page 24〜27(pdf,34KB) ]
前回の課題の解説と補足。ソースの字下げについて。
制御構造(条件分岐・繰り返し)の続き。do
〜while
文。
増分(increment)/減少(decrement)演算子(++
,-
-
)。
for
文。
課題: Collatz 予想(角谷予想)に於いて、 1 から 10000 までの自然数の中で、 1 に到達するまでのステップ数が最も多いものを調べ、 その自然数とその時のステップ数を出力するプログラム [締切 5/16(日)]
配ったプリント [page 28〜33(pdf,43KB) ]
前回の課題の解説と補足。演算子の優先順位。 C 言語では全ての式は型と値とを持つ。 関数について。関数定義・関数プロトタイプ・関数呼出。
課題 : 前々回の課題を基に関数 gcd() を作成し、 それを用いて、正整数 n に対し、それと互いに素な n 以下の正整数の個数 φ(n) を求めるプログラム[締切 5/23(日)]
配ったプリント [page 34〜39(pdf,49KB) ]
前回の課題の解説と補足。関数(続き)。
数学関数ライブラリの使い方。
ヘッダファイル・#include
命令・リンカオプション-l
。
#define
命令。man
の使い方。
課題 : Newton-Raphson法を用いて、正の実数 a に対してその平方根を返す関数
root()
を作り(初期値 a, 誤差範囲ε=10^{-6}としてよい)、 数学関数ライブラリにある平方根関数による値と共に表示するプログラム [締切: プリントには5/30(日)と記したが、 Newton-Raphson法の説明が間に合わなかったので6/7(日)に延期。 知っている人は勿論先に提出しても構いません。]
配ったプリント [page 40〜45(pdf,45KB) ]
Newton-Raphson法の補足説明。
ポインタ入門。変数の型と byte 長・sizeof
演算子。
アドレス参照 &
。
配ったプリント [page 46・47(pdf,24KB) ]
ポインタ入門(続き)。ポインタ型変数。間接参照 *
。
関数の引数として変数へのポインタを渡す例。
課題 : 2つの変数の値を入替える関数
swap()
を正しく作り、 動作を確認した上で、何故そういう動作になるか理解する。 [締切 6/13(日)]
配ったプリント [page 48〜53(pdf,47KB) ](誤記訂正済)
配列。乱数の使い方の紹介。 配列を関数に渡してポインタで受ける。
課題 : 配列に対し「最小値を取る要素の添字を求める」部分を
min_index()
として関数化し、 それを大きさの異なる 2 つの配列に適用して、 最小値を取る要素の添字とその値とを表示せよ。 (出来れば、乱数による配列の要素の値の設定の部分や、 配列の要素の値の表示の部分をも関数化せよ。) [締切 6/20(日)]
配ったプリント [page 54〜61(pdf,46KB) ](誤記訂正済)
前回の課題の解説と補足。
配列とポインタとの関係。
ポインタの演算。 a[i] == *(a+i)
。
多次元配列(行列を扱う)。
課題 : 3×3 行列に関する基本的な関数(表示・演算など)を作成して プリントのプログラム
matrix2.c
を完成させよ。 (数学的に面白い例を求む。そのために以下を補足)[締切 6/27(日)]
- 行列の成分はプリントの例にこだわらず適当に決めて良し。 入力を受付ける形にしても良し。
- 演算内容も積だけにこだわらず適当に増やして良し。 加減算だけでは不十分。
- 行列のサイズも適当に決めて良し。但し 3 以上であること。
int
型でなくてdouble
型でも良し。- 期限内に提出した後の機能拡張版の提出については、 期限にこだわらず試みられたい。
配ったプリント [page 62〜67(pdf,38KB) ]
前回の課題の解説と補足。typedef
による型の別名定義。
構造体。例:複素数型を作る。
課題 : 構造体を用いて「有理数型」
Rational
を定義した上で、 代入・表示・加減乗除・比較などの一連の基本的な関数を作成し、main()
内でその動作を確認できるような計算をせよ。 [締切 8/6(金)]
配ったプリント [page 68〜73(pdf,45KB) ]
前回の補足。
文字(char
)型。文字コード。文字列の扱い。
buffer overflow について。
課題 : 数字列を数値(
int
型)に変換する関数myatoi()
を作成し、 動作例のプログラムを書いて動作を確認せよ。 (符号対応・十六進版など拡張版も出来れば作ってみよ。) [締切 7/11(日)]
配ったプリント [page 74〜77(pdf,34KB) ]
コマンドライン引数(main
関数の引数)。
課題 : 前回の課題の
myatoi()
を用いて、 コマンドラインから入力した2つ以上の整数の和を求めて表示する プログラムcalc
を作成せよ。 (符号対応・十六進版・不正な(数字以外の)入力への対応など 拡張版も出来れば作ってみよ。) [締切 7/18(日)]
配る予定のプリント [page 78〜85(pdf,40KB) ]
「海の日」であるが授業実施日である。
break
文・continue
文によるloopの例外脱出。
switch
文による多岐分岐。
ファイル入出力。
期末試験は行ないません。課題の提出状況とその内容で評価します。