2002年度・計算機数学・第11回実習
1
実習内容1(実習時間中に行うもの)
配布したプログラムの内容を理解した上で,以下のプログラムを書きなさい.
1.
プログラムの引数として,Y , M , D
の整数値を入力して,西暦Y年M月N日がその年の第何日目にな るかを出力するプログラムを書け. すなわち,プログラム名をcount_days
としたとき,./count_days 2002 1 1
と実行すると
1
と言う出力をするプログラムのことである.ただし, 存在しない日時を入力したときには
error
と出力すること.2.
標準入力から1つ以上の空白で区切られた数値列としてY , M , D
の整数値を入力する. 西暦Y 年M月N日がその年の第何日目になるかを出力するプログラムを書け. すなわち, プログラム名をcount_days
として,data
を2002 1 1 1999 12 31
としたとき,cat data | ./count_days
と実行すると1 365
と出力するプログラムのことである.
ただし, 存在しない日時を入力したときには
error
と出力すること.実習内容2(各自で自習)
1.
標準関数strncmp
を実現せよ.2.
関数atoi
を,以下の仕様で作成せよ.int atoi(char *str)
基本仕様
str
に与えられた文字列が10進整数をあらわす文字列の時には, その数値を返す. 10 進整数をあらわす文字列とは,先頭に0個以上の空白文字,その直後に+,
または-
の符号文字, その直後に0123456789
の数値文字が並んだ文字列である.エラー 10進整数をあらわさない文字列の場合には,
0
を返し, 大域変数_error
に-1
をセットす る. 10進整数をあらわすが,INTMIN
とINTMAX
の範囲を越える値の時には,0
を返し,大域変 数_error
の-2
をセットする.(FreeBSDの
atoi
関数のソースコードを参考にせよ.)ex11.tex,v 1.7 2002-07-02 15:29:20+09 naito Exp
2
2002年度・計算機数学3・第11回実習3.
2つの同じ型の変数の値を入れ替える関数を書け. (ヒント:標準関数qsort
の引数の渡し方を参 考にせよ.)4.
3個の正の整数の組{a
i}
3i=1 に対して,その最大公約数gcd({a
i})
を求める関数を書け. あらかじめ 定められた最大n
個の正の整数の組に対しても,容易に拡張できるように書くこと. 特に,これを計 算する関数に対して,配列a
とその有効な要素数を渡して計算するように書くこと.プログラム解説
prog11-01.c
西暦Y年M月N日が,その年の第何日目になるかを返す関数.配列とポインタの扱いに注意.
prog11-02.c
配列とポインタの等価性.prog11-03.c
文字列のコピーの方法.prog11-04.c
コマンドライン引数からのデータの入力../prog11-04Ã1Ã2Ã3
として実行してみる.
prog11-05.c
標準入力から文字列を読み取り,整数値として配列に格納する.1Ã2Ã3
1Ã2Ã3Ã4Ã5Ã6Ã7Ã8Ã9Ã0 1Ã2Ã3Ã4Ã5Ã6Ã7Ã8Ã9Ã0Ã1 -1Ã2Ã3Ã4Ã5Ã6Ã7Ã8Ã9 Ã-1Ã2Ã3Ã4Ã5Ã6Ã7Ã8
という内容のファイルを作成し,それを
data
として,cat data | ./prog11-05
として実行してみる.
prog11-06 prog11-05.c
を2つのファイルに分割したもの.make
とするとコンパイルとリンクを行ってくれる. 特に, 大域変数の受け渡し方に注意すること.