C言語の文字入出力、条件分岐とUNIXのリダイレクション

 今回の演習も、C言語によるプログラミングの初歩を、教科書の例を入力したり、それを修正したりして学習します。
 また、今回の課題では、プログラムと入出力データとのやりとりを、UNIXの機能の一つであるリダイレクションを用いて行います。

演習課題1

 教科書(プログラミング言語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を入力することとなる)
%

リダイレクションとの併用

  1. 標準出力の切り替え
    プログラム a.out の標準出力を、ファイル hoge に切り替えると、 入力文字列がファイルに記録されます。
    % ./a.out >hoge
    abcdefg[ENTER]  ・・・キーボードでの入力 
    12345[ENTER]  ・・・キーボードでの入力 
    ctrl-d を入力
    %
    
    これで、入力文字列が hoge という名前のファイルに記録されます。 cat コマンドで確認しましょう。
    % cat hoge
    
  2. 標準入力の切り替え
    プログラム a.out の標準入力を、ファイル hoge に切り替えると、入力文字列として hoge の内容を用います。結果として、ファイルの内容を出力する cat コマンドと同じような動作をすることになります。
    % ./a.out <hoge
    
  3. 標準入力・出力の同時切り替え
    プログラム a.out の標準入力を、ファイル hoge に、標準出力を hoge2 に切り替えます。 結果として、hoge の内容を入力し、それを hoge2 に出力します。つまり、ファイルのコピーと同じような 動作をします。
    % ./a.out <hoge >hoge2
    

演習課題2

 以下のソースコードは演習課題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();
  }
}

演習課題3

 教科書P24 の、入力の行数を数えるプログラムと、演習課題2を参考にして、 入力された文字のなかに「0」が現れた回数を数えて出力するプログラムを作成せよ。

演習課題4

 演習課題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についてのヒント&テクニック

演習課題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 に等しい)。

演習課題5

 演習課題4を修正することで、入力された文字のなかで、もっとも現れた回数の多かった数字を出力 するプログラムを作成せよ。 ただし、もしそのような数字が2つ以上現れた場合は、それらの中の任意の数を出力してよいことにする。

演習課題6(特別問題:やや難)

入力された文字のなかで 「10」が現れたときは 「ten」と出力するプログラムを作成せよ。

今日の提出課題

演習課題4(どうしてもできなかった人は演習課題3)で作成したプログラムを用いて、ファイル

/homer/pl/tea/kht23151/Examples/gnuplot/1.dat

に出現する数字の個数を調べよ。 そしてプログラムのソースコードを印刷して提出すること。 この際、ソースコード内に作成者の名前をコメントとして含ませること。

ちなみに、テキストファイルを印刷するには、

% lp filename

とすればよい。


TOP