【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22899

簡単なカウントプログラム
投稿者---kura(2005/08/30 16:12:59)


英文カウントプログラム。
このプログラムは、英大小文字、空白、コンマ、ピリオド、改行だけを入力出来るものとし、単語数、母音数をカウントする。空白、コンマ、ピリオド、改行が文の始めに入力される場合もあり、ピリオドは英文の最後に一つだけ入力されるものとする。
入力はscanf、出力はprintfを用いる。

という条件でプログラムを作成し、思うとおりに動いたのですが、
scanf("%c",&c);
if(c=='.'){
words++;
}
の部分を、
scanf("%c\n",&c);
if(c=='.'){
words++;
}
とすると、「コンマ」を入力した後に改行しても終了せず、「コンマ」を二回入力してから、改行すると終了します。
誰か、分かる方ご教授願います。



#include <stdio.h>
void main (void)
{
char c;
int bowel,words;

bowel=0;
words=0;

printf("英文を入力して下さい。\n");
scanf("%c",&c);
while(c!='.'){
if(c==' '||c==','||c=='\n'){
words++;
}
if(c=='a'||c=='i'||c=='u'||c=='e'||c=='o'){
bowel++;
}else if(c=='A'||c=='I'||c=='U'||c=='E'||c=='O'){
bowel++;
}
scanf("%c",&c);
if(c=='.'){
words++;
}
}
printf("あなたが入力した英文の母音数は%dです。\n",bowel);
printf("あなたが入力した英文の単語数は%d\n",words);

}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:簡単なカウントプログラム 22900 まきじ 2005/08/30 17:55:18
<子記事> Re:簡単なカウントプログラム 22901 円零 2005/08/30 18:17:12


No.22900

Re:簡単なカウントプログラム
投稿者---まきじ(2005/08/30 17:55:18)


>このプログラムは、英大小文字、空白、コンマ、ピリオド、改行だけを入力出来るものとし、単語数、母音数をカウントする。

単語数は、ピリオドまでを読み込み、strtok() で、
空白、コンマ、ピリオド、改行で区切り
NULL でない間、カウントすれば良い。

母音数は、一行を一文字ずつ、a i u e o の
どれかと等しければ、カウントすれば良い。


この投稿にコメントする

削除パスワード

No.22903

Re:簡単なカウントプログラム
投稿者---まきじ(2005/08/30 20:02:56)


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 256

int count_vocal(char* buf){

    int i;
    int vocal = 0;
    
    for(i = 0; buf[i] != '.'; i++){
        if(tolower(buf[i]) == 'a' || tolower(buf[i]) == 'i' || tolower(buf[i]) == 'u'
            || tolower(buf[i]) == 'e' || tolower(buf[i]) == 'o')
                vocal++;
    }
    
    return vocal;
}

int count_word(char *buf){

    int i;
    int word = 0;
    char seps[] = ", .";
    char *token;
    
    token = strtok(buf,seps);
    while(token != NULL){
        word++;
        token = strtok(NULL,seps);
    }

    return word;
}

int main(void){

    char buf[N];
    char *p = buf;
    int len, i;
    
    do{
        puts("英文の入力");
        fgets(buf,N,stdin);
        len = strlen(buf);
    }while(buf[len - 2] != '.');
    if(buf[len - 1] == '\n') buf[len - 1] = '\0';
    
    for(i = 0; buf[i] != '\0' && !isalpha(buf[i]); i++){
        p = &buf[i];
    }

    printf("母音数:%d\n",count_vocal(p));
    printf("単語数:%d\n",count_word(p));

    return 0;
}



この投稿にコメントする

削除パスワード

No.22901

Re:簡単なカウントプログラム
投稿者---円零(2005/08/30 18:17:12)


なんかコンマとピリオドがごちゃごちゃになってませんか。
何回コンマを入力しても終了しませんけど。
それと、scanf("%c\n",&c)にしなきゃいけない理由もよくわからないのですが…

とりあえず解説すると、format文字列で空白文字(スペース、改行、タブ)が出てくると、
scanf関数は標準入力において非空白文字にぶつかるまで読み飛ばします。

つまり、ピリオドの次に非空白文字があれば(「..」はその入力の一例)、まずピリオドを変数cに格納した後
次の文字が非空白文字であることを確認してscanfは終了しますが、
例えば入力が「.\n」などの場合、まだ非空白文字にぶつかってないのでscanfが終了しません。
scanfはenterキーを押した瞬間に終了するわけではないのです。
enterキーを押した瞬間に起きるのは、改行文字の入力と入力内容の確定、だけです。
scanfがそこで終わるかどうかは、確定した入力内容がscanfの要求を満たし終えたかどうかによります。

まあ型指定が"%s"なら、空白文字で読み込みが終了するので、enterを押した瞬間に終了しますが。
混同してませんか?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧