9日目 11日目

10日目

目標

課題 11

文法に関するあれこれ

複文

ここまでのプログラムでは forif の後ろは、実行されるべき文を 必ず '{' と '}' で括りブロックを形成していた。 実は、C では、この '{' と '}' は書かなくてもよい場合が存在する。

実はfor文は、繰り返し処理を行う文を1つだけ取る。 同様に if文で、条件が成立した際に実行されるのも単一の文である。 ところが、実際に行いたい処理が単一文で書くことができるのは滅多にない。 そのような場合には、 '{' と '}' で文を括ることにより、それらの複数の文は 一つの文と同じように扱われる。 これを「複文(compound statement)」と呼ぶ。 単一の文であっても、'{' と '}' でくくって複文としても良いので、これまでは 必ず複文にしていたのである。

繰り返し処理

C で利用できる繰り返し処理の方法には、これまでに出てきた for文、 while文に加えて、do〜while文が存在する。

上記 3種の構造は次のような図で表すことができる。

           

条件分岐

C で利用できる条件分岐としては、今まで学習した if(-else)に加えて (先週フライングでちょっとだけ出てきた)switch文がある。


文字種の判定関数たち

ある変数に入っている値を「文字」と考えたときに、それが何であるかを 調べるために、いちいち ASCII 表をみるのは、煩雑であり面倒である。 そのため、文字種を判定するための関数が C 言語には用意されている。

たとえば、isdigit という関数は、引数が(10進数で言うところの)数字であれば真を、そうでなければ偽を返す。 したがって次の2つのコードは同じ意味となる。( int 型の変数 i に確かめたい文字が代入されているものとする)

  if (i >= 0x30 && i <= 0x39) {
         printf("'%c' is digit\n", i);
  }
  if (isdigit(i)) {
         printf("'%c' is digit\n", i);
  }

同じ結果になるとは言え、プログラムの可読性には大きく差があることが判る。

このような文字種判定関数は次のものが用意されている。使用する場合は ctype.h を #include しておくこと。 なお引数の型はすべて int であるが、値としては EOF もしくは符合無 char 型で表現できるものでなければならない。

関数名 真となる引数 備考
isalnum 英字もしくは数字 (isalpha(c) || isdigit(c)) と等価
isalpha アルファベット 標準の C ロケールでは (isupper(c)||islower(c))と等価。
それ以外では、大文字でも小文字でもない他の文字でも真になる場合がある
isascii ASCII 文字  
isblank 空白文字(スペースもしくはタブ)  
iscntrl 制御文字  
isdigit 数字 10進数での数字、すなわち (0〜9)
isgraph 表示可能文字 スペースは含まない
islower 小文字 標準 C ロケールであれば (a〜z)
isprint 表示可能文字 スペースを含む
ispunct 記号 表示可能文字から英数字とスペースを除いた物
isspace 空白文字 標準 C ロケールならば、スペース、フォームフィード('\f')、改行('\n')、復帰('\r')、 水平タブ('\t')、垂直タブ('\v')
isupper 大文字 標準 C ロケールであれば (A〜Z)
isxdigit 数字 16進数での数字、すなわち (0〜9, A〜F, a〜f)

問題 11

次の関数が何をしているかを調べ、mycat2.cにこの関数を組み合わせたプログラムを作成せよ。

/* rot.c */
int rot(char *ch, int shift)
{
        char base = 0;

        if (isupper((int)*ch)) {
                base = 'A';
        } else if (islower((int)*ch)) {
                base = 'a';
        }

        if (base > 0) {
                *ch = base + ((*ch - base) + shift) % 26;
                return 0;
        }

        return 1;
}

出来上がったプログラムに次の内容のファイル(input.txt)を引数に与えて、何を意味するものか調べよ。

Pbatenghyngvba, lbh tbg vg!
V jvfu lbh n zreel puevfgznf naq n unccl arj lrne

他にも5日目の問題5 (calendar の仕上げ)、 9日目の問題10 についても、解答プログラムが 完成している事も確認する事。


パーツについてかなり見てきたので、初日に動かした chat4.c が徐々に読めるようになってきているはずである...


9日目 表紙 11日目

tacha@tack.fukui-med.ac.jp
$Id$