2003年度・計算機数学3・第3回実習
1
● 実習内容
【C言語】
1.
まず,
以下のex03.c
を入力してコンパイルおよび実行を行ってみよう.
このプログラムは,
以下を行っていることに注意する.
•
整数型変数(int型変数)の宣言(定義)•
変数に定数を代入すること•
変数に16進定数を代入すること•
変数に定数を加算すること•
変数にほかの変数の値を代入すること•
変数にほかの変数の値を加算することこれらの操作がどのように行われているかを良く理解してほしい
.
2. ex03.c
を参考にして,以下のようなプログラムを書いてみよう.•
利用している処理系での「(符号付き)正の整数の最大値」をint
型変数に代入する.
•
その変数の値を10進および16進で表示させる.
•
その変数の値に1
を加える.
•
その変数の(加算した後の)値を10進および16進で表示させる.
「正の整数の最大値」に
1
を加えたときにどのようなことが起ったのか,
それはなぜなのかを考 えてみよう.
3.
さらに,
次のようなプログラムを書いてみよう.
•
利用している処理系での「(符号付き)正の整数の最大値」をunsigned int
型変数に代入 する.
•
その変数の値を10進および16進で表示させる.
•
その変数の値に1
を加える.
•
その変数の(加算した後の)値を10進および16進で表示させる. int
型変数とunsigned int
型変数では何が違うのかを理解しよう.
なお,
printf
関数でunsigned int
の値を表示させるには%d
ではなく,%u
を用いる必要が ある.電子メールで「今日の講義の感想や意見」を送ってください.
★ 注意
上の実習内容の
2
で行ったことは,
やってはいけないことである.
プログラムで算術型の変数を利用す る場合には,
常に「桁あふれ」を考慮しなければならず,
符号付き整数では,
桁あふれが生じた場合に何が 起るかは処理系依存であるので,
桁あふれの結果に依存するようなプログラムを書いてはいけない.
なお
,
「符号なし整数」に対しては,
桁あふれが生じてもその演算結果は規格により「保証」されている.
ex03.tex,v 1.1 2003-04-24 15:50:47+09 naito Exp naito
2
2003年度・計算機数学3・第3回実習★
ex03.c
の内容#
" !
/* ex03.c */
/*
整数型変数*/
#include <stdio.h>
int i, j, k ;
int main(int argc, char **argv) {
i = 0 ; /* i
に0
を代入*/
printf("i = %d\n", i) ; printf("i+1 = %d\n", i+1) ; printf("i = %d\n", i) ;
i = i + 1 ; /* i
に1
を加算*/
printf("i = %d\n", i) ;
j = 0x7f ; /* j
に16進定数7F
を代入*/
printf("j = %d\n", j) ; printf("j = %X\n", j) ;
k = i ; /*
変数k
に変数i
の値を代入*/
j = k + j ; /*
変数j
に変数k
の値を加算する*/
printf("j = %d\n", j) ; return 0 ;
}
● 前回の実習の解説
【UNIX】
【シェルとワイルドカード】
• foo1.txt, foo2.txt, bar.txt
という3つのファイルを作成してから,
「ワイルドカード」を用いて
, foo1.txt
とfoo2.txt
だけを消去することを考えてみよう. (
資料section 4.4.2)
例えば
, rm foo?.txt
で消去できる.
この他にもrm foo* , rm f*
など,
いくつも考え られる.
これは以下のように考えれば良い.
消去したい
foo1.txt , foo2.txt
で共通する部分を抜き出すと, foo?.txt
となる.
さ らに, foo?.txt
は,
消去してはいけないbar.txt
にはマッチしないので, rm foo?.txt
で良いことがわかる.
• foo1.txt, foo2.txt, bar1.txt
という3つのファイルを作成してから,「ワイルドカード」を用いて
, foo1.txt
とbar1.txt
だけを消去することを考えてみよう. (
資料section 4.4.2)
ex03.tex,v 1.1 2003-04-24 15:50:47+09 naito Exp naito
2003年度・計算機数学3・第3回実習
3
上と同様に考えれば
, rm *1.txt , rm *1.* , rm *1*
などが考えられる.
★ 発展課題
foo1.txt , foo2.txt
という2つのファイルのみがあった状態で,
これらをそれぞれbar1.txt , bar2.txt
という名前のファイルに置き換えたい.
これを“ mvfoo?.txtbar?.txt ”
により望む結果が得られるのか?
もし,
そうでないならば,
その理由は何か?
これは
,
それなりに難問である.
まず,
次の事実に注意しなければならない.
コマンドが受け取る「文字列」はワイルドカードを含んだものではなく
,
ワイルドカー ドがシェルによって展開された後のものである.
また,
ワイルドカードの展開結果は文 字列の辞書式順序にしたがって展開される.
この場合は
,
ワイルドカードfoo?.txt
はfoo1.txt foo2.txt
に展開され, bar?.txt
に一致するものが存在しないので, mv foo1.txt foo2.txt
というコマンドを実行した ことに等しい.
【C言語】
•
次に,
おなじhello.c
を% gcchello.c-otest Return
としてコンパイルしてみよう
.
さらに,
% test Return
としたときと
% ./test Return
としたときの実行結果には何か違いが生じるかを調べ
,
その理由を考えてみよう. (
資料section 4.4.5.1)
UNIX
のシェルには「コマンド実行パス」という「環境変数」が存在する.
シェルから「絶対パス」や「相対パス」で表されていないコマンド名を入力した場合には
,
コマン ド実行パス(ディレクトリ)の中からそのコマンドを検索し,
最初に見つかったコマン ドを実行する.
例えば,
コマンド実行パスが/usr/bin:/bin
となっている場合には,
そ のコマンドを,
最初に/usr/bin
から探し,
次に/bin
から探す.
それが見つからなかっ た場合には“Command not found”
と判断し,
実行を取りやめる.
また,
コマンド実行 パスには標準的には/usr/bin, /bin
が含まれている.
したがって
,
単にtest
と実行した場合には,
実際には/usr/bin/test
などが実行され ている.
カレントディレクトリに存在するtest
を実行するには,
明示的に相対パスを 利用して./test
とする必要がある.
なお