今回の演習も、C言語によるプログラミングの初歩を、教科書の例を入力したり、それを修正したりして学習します。
また、今回の課題では、プログラムと入出力データとのやりとりを、UNIXの機能の一つであるリダイレクションを用いて行います。
教科書(プログラミング言語C)P20、ファイルの複写(標準入力を標準出力へ)プログラムのソースコードを入力し、コンパイル&実行せよ。
実行のテストとして、様々な入出力のリダイレクションを試せ。
このプログラムはキーボードから入力された文字を、そのまま画面に出力するというものです。
EOF(ファイルの終わり)である ctrl-d を入力するまで処理を繰り返します。
#include <stdio.h> /* 入力を出力に複写:第1版 */ main(){ int c; c = getchar(); while ( c!= EOF){ putchar(c); c = getchar(); } }
実行結果
% ./a.out abcdefg[ENTER] ・・・キーボードでの入力 abcdefg ctrl-d を入力(これはEOFを入力することとなる) %
リダイレクションとの併用
% ./a.out >hoge abcdefg[ENTER] ・・・キーボードでの入力 12345[ENTER] ・・・キーボードでの入力 ctrl-d を入力 %これで、入力文字列が hoge という名前のファイルに記録されます。 cat コマンドで確認しましょう。
% cat hoge
% ./a.out <hoge
% ./a.out <hoge >hoge2
以下のソースコードは演習課題1のプログラムを少し修正たもので、数字の「0」が入力されたときは、
「0」の代わりに文字列「zero」を出力するようになっている。
このソースコードをさらに修正して、「0」,「1」,「2」,...,「9」と入力されたときは、
それぞれ「zero」,「one」,「two」,... と表示するプログラムを作れ。
#include <stdio.h> /* 入力を出力に複写、ただし「0」は「zero」と表示する */ main(){ int c; c = getchar(); while ( c!= EOF){ if(c == '0') printf("zero"); else putchar(c); c = getchar(); } }
教科書P24 の、入力の行数を数えるプログラムと、演習課題2を参考にして、 入力された文字のなかに「0」が現れた回数を数えて出力するプログラムを作成せよ。
演習課題3を修正することで、入力された文字のなかに「0」 から「9」までの各数字が現れた
回数をそれぞれ数えて出力するプログラムを作成せよ。教科書P27のソースコードも参考せよ。
また、動作確認として以下のファイル
/homer/pl/tea/kht23151/Examples/gnuplot/sample.gpl
の中に、それぞれの数字がいくつ含まれているかを調べなさい。
正しく動作していれば 0 から 9 までの出現個数はそれぞれ 43, 44, 29, 4, 4, 35, 0, 5, 0, 0 となる。
演習課題4を完成させるには、if ~ else if ~ else という構文を使う方法が分かりやすい。
しかし以下のような、よりスマートな方法もある。
一般にコンピュータにおける文字コードでは、(半角)数字の文字コードは 0~9 の順番に付けられている。
これを利用して入力文字が数字であるかどうかをテストできる。if文の条件として
'0'<=c && c<='9'
とすれば、「cが数字のときには」という条件になる(&& は「かつ」ということ、すなわち '0'<=c と c<='9'が同時に成立するとき。
因みに「または」を表す際は || を用いる)
また、数字の個数のカウントには、配列変数を使うのが便利。ここで
c-'0'
という式を使えば、数字の文字コードをその数に変換することができる(e.g. もし c='2' ならば c-'0' は 数値の2 に等しい)。
演習課題4を修正することで、入力された文字のなかで、もっとも現れた回数の多かった数字を出力 するプログラムを作成せよ。 ただし、もしそのような数字が2つ以上現れた場合は、それらの中の任意の数を出力してよいことにする。
入力された文字のなかで 「10」が現れたときは 「ten」と出力するプログラムを作成せよ。
演習課題4(どうしてもできなかった人は演習課題3)で作成したプログラムを用いて、ファイル
/homer/pl/tea/kht23151/Examples/gnuplot/1.dat
に出現する数字の個数を調べよ。
そしてプログラムのソースコードを印刷して提出すること。
この際、ソースコード内に作成者の名前をコメントとして含ませること。
ちなみに、テキストファイルを印刷するには、
% lp filename
とすればよい。