無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
GEN

無題

#1

投稿記事 by GEN » 14年前

1 #include<stdio.h>
2
3 main()
4 {
5 char c='\0';
6 char prevletter;
7 int wordnum;
8 int word_in;
9
10 while(1)
11 {
12 wordnum = 0;
13 word_in = 1;
14 prevletter = '\0';
15 printf("文字列を入力してください:");
16 while(1)
17 {
18 c=getchar();
19 if(c == '\n')
20 {
21 if(word_in)
22 wordnum++;
23 break;
24 }
25 prevletter = c;
26 if(c == ' ' || c == '.')
27 {
28 if(word_in)
29 {
30 wordnum++;
31 word_in=0;
32 }
33 }
34 else
35 word_in=1;
36 }
37 if(prevletter == '\0')
38 break;
39 printf("ワード数:%d\n",wordnum);
40 }
41 }

このようなワードカウンタのサンプルプログラムがありました。
質問その1:10、16行目のwhile(1)は無限ループですよね。
      では21、28行目のif(word_in)とはなんですか?
      if(条件式)と書いておきながらif(変数)って何を意味してるんですか?

質問その2:26行目のif(c == ' ' || c == '.')はどういう意味ですか?

質問その3:すみませんが分かりやすく解説のコメントをつけていただけると幸いです。

迷彩吹雪

Re:無題

#2

投稿記事 by 迷彩吹雪 » 14年前

腕試しのつもりでやってみました。
文字列操作は不得手なので、間違っているかも知れません。

これは「文中に含まれる単語数をカウントする」プログラムですね。
(空白やピリオドに挿まれた文字列の数、と言った方が正しいか)
このプログラムはまず先に一文字読んで、それが有効文字(空白やピリオド以外の文字)だった時にword_inを1にします。
word_inは「読んだ文字が有効文字だったかどうか」を示すフラグでしょう。
続く文字も有効文字なら、word_inは1のまま次の文字を読み込みます。
改行なら単語数を加算して結果表示へ。
空白かピリオドなら単語数を加算して、次の文字を読み込む。
……といった流れのようです。

if文やwhile文の条件式は「その値が0かそれ以外か」を判断します。
必ずしも論理演算子を用いた式の形である必要はありません。
だからword_inには1でなく10や100を代入しても動作します。それらは「0以外」なので。

以下、コメントを付加したコードです。(間違いがあればご指摘ください)
#include<stdio.h> 

void main() //型指定がなかったのでvoidとしました
{ 
    char c='\0'; 
    char prevletter; 
    int wordnum; 
    int word_in; 

    while(1) 
    { 
        wordnum = 0;    //単語数カウンタ
        word_in = 1;    //カウントすべき文字かどうかのフラグ
        prevletter = '\0';    //何も入力がない状態
        printf("文字列を入力してください:"); 
        while(1) 
        {
            c=getchar();    //一文字習得
            if(c == '\n')    //改行なら
            {
                //直前が文字だった場合にのみ、その文字をカウント
                if(word_in)
                    wordnum++;
                break;    //結果を表示するためループを抜ける
            } 
            prevletter = c;        //読んだ文字を保存(ループを出てから使用する)
            if(c == ' ' || c == '.')//取得した文字が空白かピリオドなら
            { 
                //直前が文字だった時のみカウント
                //その後フラグを倒す(連続する空白とピリオドはカウントしない)
                if(word_in) 
                { 
                    wordnum++; 
                    word_in=0; 
                } 
            } 
            else 
                word_in=1;    //改行、空白、ピリオド以外だったならフラグを立てる
        } 
        if(prevletter == '\0')//入力無しだったなら、プログラム終了
            break; 
        //結果を表示してループの先頭に戻り、再び入力を促す
        printf("ワード数:%d\n",wordnum);
    }
}

GEN#

とても分かりやすいです。ありがとうございます。

#3

投稿記事 by GEN# » 14年前

初心者向けにご親切に全部やさしく答えてくださりありがとうございました。
すごく分かりやすかったです。
制御文の条件式はそういう意味だったんですね。
word_inの説明がすごく分かりやすかったですよ。

GEN#

Re:とても分かりやすいです。ありがとうございます。

#4

投稿記事 by GEN# » 14年前

ちなみに最初のchar c='\0';はなにを宣言しているんですか?
フラグっていうのは絶対にtureするということでしょうか。

迷彩吹雪

Re:とても分かりやすいです。ありがとうございます。

#5

投稿記事 by 迷彩吹雪 » 14年前

>最初のchar c='\0';
単純に初期化しているのだと思います。どんな入力であれcはこの後c=getchar();で更新されますし。
特に深い意味は無いかと。

>フラグっていうのは絶対にtureするということでしょうか。
ごめんなさい。ちょっと良くわからないです。
「フラグ」の単語がわからないのでしょうか?
それとも「int型変数を条件にした時は必ずtrueか」とのことでしょうか?

前者なら、「ある条件を満たすかどうかを判定するための印」といったところでしょうか(上手く説明できない……)。

後者なら、否です。
既に述べた通り「条件式はその内容が0かそれ以外かを判断する」ので、word_inが0ならば条件としては「false」に、プラスだろうがマイナスだろうが0以外の値ならば「true」になります。
trueは「何かがある」、falseは「何もない」と考えてみて下さい。「値が0以外」は「何かがある」状態であり、「値が0」は「何もない」状態です。

どちらでもなければ、もう少し詳しくお願いします。
(余談ですが、ハンドルネームが変わっていませんか?)

GEN#

Re:とても分かりやすいです。ありがとうございます。

#6

投稿記事 by GEN# » 14年前

すいません質問する名前もGEN#で入力したつもりが・・・
GENになっておりましたww

閉鎖

“C言語何でも質問掲示板” へ戻る