2001 年度「計算機基礎論3B」 2001-10-26
unix の決まりごと
- プログラムの実行を途中で中止するときは Ctrl+C(Ctrl を押しながら C)。
- プログラムの実行を途中で一時停止するときは Ctrl+S(Ctrl を押しながら S)。
- 一時停止したプログラムの実行を再開するときは Ctrl+Q(Ctrl を押しながら Q)。
- 「入力の終わり」は行頭で Ctrl+D(Ctrl を押しながら D)。
- prog を実行ファイル名とするとき、
「prog < file」とすると prog はファイル file
の内容をキーボードから打ち込んだかのように動く。
(入力リダイレクト)
- prog を実行ファイル名とするとき、
「prog > file」とすると prog の出力がファイル
file の内容となる。上書きされるので注意。
「prog >> file」とすれば最後に追加される。
(出力リダイレクト)
- prog1, prog2 を実行ファイル名とするとき、
「prog1 | prog2」とすると prog1 の出力が prog2
の入力となる。
(パイプ)
- キーボードを「標準入力」、画面を「標準出力」と呼ぶことがある。
演習(の一例)
ループ
- 下の loop.c は、
1 から 10000 までの整数を一行にひとつずつ出力するプログラムである。
これを利用して、プログラムの中止、一時停止、再開の練習をせよ。
文字入出力とリダイレクト・パイプ
- 教科書の、入力を出力に複写するプログラム
(の一つをコンパイルしてできた実行ファイル)を a.out
とするとき、単に「a.out」としてそれを動かしてみよ。
「入力の終わり」は上に述べた通り。
- a.out を上の通りとするとき、次を確かめよ。
- 「a.out < file」とするとファイルの内容を画面に出力する。
- 「a.out > file」
とするとキーボードからの入力を内容とするファイルを作成する。
(上書きに注意。)
- 「a.out >> file」
とするとキーボードからの入力をファイルに追加する。
- 「a.out < file1 > file2」とするとファイル
file1 を file2 に複写する。
(上書きに注意。)
- 「a.out < file1 >> file2」とするとファイル
file1 を file2 に追加する。
- 下の toupper.c は小文字を大文字に変換しつつ入力を出力に複写する。
これをコンパイルしてできた実行ファイルを toupper と改名せよ。
まずはリダイレクトせずに動かしてみよ。
次にリダイレクトしていろいろやってみよ。
- unix にたいていついている
sort は、
入力した複数の行をアルファベット順に並べ直して出力するプログラムである。
まずはリダイレクトせずに動かしてみよ。
次にリダイレクトしていろいろやってみよ。
- file を実在するファイルとするとき、
「cat file | toupper | sort」は何を行なうか?
「cat file | sort | toupper」はどう違うか?
- 下の rev.c は各行内の文字を逆転しつつ入力を出力に複写する。
これをコンパイルしてできた実行ファイルを rev と改名せよ。
まずはリダイレクトせずに動かしてみよ。
次にリダイレクトしていろいろやってみよ。
- 「cat file | rev | sort | rev」は何を行なうか?
プログラミング
教科書の例を見ながら、より簡単なプログラムを書いてみよう。
以下はその一例である。
- 整数型変数 a, b, c を宣言し、
a に 1 を、b に 2 を代入する。
それから a と b の和を c に代入する。
そしてその結果を「何々 たす 何々 は 何々 です」
のように出力するプログラムを書け。
- 上のプログラムで、「和」を「差」「積」「商」に変えてみよ。
除数が 0 のときは何が起こるか?
- 上のプログラムで、整数型変数を浮動小数点型変数に変えてみよ。
除数が 0 のときは何が起こるか?
- 1 から 40(ぐらい)までの整数とその二乗を並べて出力するプログラムを書け。
二乗は x * x のようにして計算せよ。
Cにはベキ乗の演算子はない。
- 0 から 1 まで、0.1 おきに、数とその二乗を並べて出力するプログラムを書け。
今までに学んだ知識どおりに書くと 1 の場合が計算・出力されないはずである。
工夫すれば 1 も出力できるようになるが、そこまでしなくてもよろしい。
== loop.c =====================================================================
#include <stdio.h>
main()
{
int i;
for (i = 1; i <= 10000; i++) {
printf("%d\n", i);
}
}
===============================================================================
== toupper.c ==================================================================
#include <stdio.h>
#include <ctype.h> /* toupper() を使うため */
main()
{
int c;
while ((c = getchar()) != EOF) {
putchar(toupper(c));
}
}
===============================================================================
== rev.c ======================================================================
#include <stdio.h>
char* rev(char*);
char buf[4096+1];
int main()
{
while (gets(buf) != NULL) {
puts(rev(buf));
}
return 0;
}
/* 文字列を反転する。日本語 euc に対応 */
char* rev(char* buf)
{
unsigned char *p, *q;
unsigned char tmp;
/* 文字列の終わりを探しつつ2バイト文字の1バイト目と2バイト目を入れかえる */
for (q = (unsigned char *) buf; *q != '\0'; q++) {
if (*q & 0x80) {
tmp = *q, *q = *(q+1), q++, *q = tmp;
}
}
/* よくあるやりかたで文字列全体を反転する */
for (p = (unsigned char *) buf, q--; p < q; p++, --q) {
tmp = *p, *p = *q, *q = tmp;
}
return buf;
}
===============================================================================
岩瀬順一