概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C 例題6 データの終わりのあるプログラム2
2006年07月25日 (火) | 編集 |
前回はprintf、scanfを使ってデータの終わりを用いるプログラムを作ったが、今回はgetcharやputcharを使うプログラムを作ってみる。
ってわけで1文字で入出力を行うgetcharとputcharでの例題だ。
基本的には変わらないはずなんだが、これもこれで面倒そうだぜ。


勝利条件:
「getchar/putcharを用いて一文字入力し、その文字を出力することを繰り返すプログラムを組めや」
「終わりはEOFか、もしくは特定の値にしろや」


攻略方法:
なんというか、あまり考えることもないんだよなあ。
というか今はまだ、考えても分からないことの方が多い。
とはいえ、やらなければ分からんままなのでやるしかなかろう。

まず、変数cをintで宣言しておこう。

eoftest_gp_c.jpg
これだけだと何のプログラムなのやら

文字入力するからchar型でいいんじゃないかって話もあるんだが。ううむ。

なんでだ?

getcharはアスキー・コードと対応しているから、int型でも問題なく文字を返すことが出来たような気はするんだが、かといってint型でなくてはならない、といったルールは無かったような。
考えても知らんものは分からんので、入門書にある説明をそのまま記述する。

getchar()は通常0~255に対応する文字を取得するが、ファイルの終わりでこれら以外の値(例えば-1)を返さないとならんので、257通りの値を返す必要がある(0~255で256通りなので)。で、257通りってのはchar型では表現できないので、intで宣言するんだそうだ。




うん、ぼく わかったようなきがするよ!

何となくな。
getcharで使う変数はintで宣言しておけば問題が少ないってことでいいよな?
いいんだ。
そういうことにしておこう。今は。


さて、変数の宣言が終わったところで次はwhile部分だ。
入出力を繰り返すような記述は以下のようになる。

^Zで終わる場合
while((c=getchar())!=EOF)
putchar(c);

特定の値(例えばz)で終わる場合
while((c=getchar())!="z")
putchar(c);


この((c=getchar())!=EOF)っていう条件式はかなりC特有のものらしく(そんなこと言われても俺は他の言語知らんのだが)、こんなことが出来るのも

・getchar()が関数で値を持っており
・c=getchar()が代入式で値を持っている


からだそうだ。
上記の条件式は、まずgetchar()により入力が行われ、その入力された文字が変数cに代入されるため、c=getchar()という式はそれとEOFを比較することが出来るのだそうだ。

なんのこっちゃ。

ま、今はそういうものだと思っておこう。いずれ理解出来る日も来るだろうからな。
こんなんばかりだが。本当に来るのか?


何か釈然としないが、これでいいとするなら後は簡単で、

eoftest_gp.jpgeoftest_gp2.jpg

これでそれぞれ^Zと「z」で入力を終えるプログラムになる。
実際に動かしてみよう。

eoftest_gp3.jpgeoftest_gp4.jpg

左では^Zで入力を終え、右ではzで入力を終えている。
コードは短くても勝利条件はちゃんと満たしているようだ。
というか別に合計も平均も出すわけじゃないので短くて当然な気もしてきたが。

逆に言や合計も平均も出せば長くなるってことだろうか?
というかgetcharやputcharで合計や平均を出せるのか?
気が向いたら後で試してみよう。



では今回のまとめ。

getchar/putcharで使う変数はintで宣言しておけば?
繰り返しで使う条件式は((変数=getchar())!=EOF)で
今回のとりあえずそういうことにしておいた回数…2回



以上。
書式は覚えても理屈が分からんというのがどうにも。ううむ。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。