ワードカウンタプログラムの要点と注意点

このQ&Aのポイント
  • ワードカウンタプログラムでは、prevletter変数を使用して直前の文字を追跡します。
  • 2つ目のwhileループでは、改行やスペース、ピリオドなどの特定の文字を処理し、ワード数の計算を行います。
  • 入力された文字列のうち、特定の条件でワード数をカウントします。
回答を見る
  • ベストアンサー

ワードカウンタというものを作るため、下のようなプログラムを本の通りにか

ワードカウンタというものを作るため、下のようなプログラムを本の通りにかきました。 #include <stdio.h> main() { 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); } } ここで質問で、 1、なぜprevletterは必要でしょうか。 2、2つ目のwhile文でif(c == '\n')やif(c == ' ' || c == '.')では改行やスペース、ピリオドだけ入力されている場合しか処理していないと思うのですが、実際はどうなっているのでしょうか

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.1

こんにちは。 > 1、なぜprevletterは必要でしょうか。 必要か必要でないかは、ご提示のプログラムが、どういう趣旨(仕様、目的など) のものであるかによると思います。 ご提示のプログラムが、 1)標準入力から「区切り文字」で区切られた「文字列」(=ワード)を入力し、  改行が入力されたら、入力された「文字列」の個数を表示する。 2)「区切り文字」として、スペース、及び、ピリオドを使用する。 3)文字列の入力時に、改行のみが入力された場合は、プログラムを終了させる。  それ以外は、1)の処理を繰り返す。 という趣旨のものであるならば、必要だと思います。 ※例えば、プログラムは強制終了(Ctrl+'C'の入力など)させるという仕様ならば、  必要ないかもしれません。 今回の場合、prevletterは改行のみが入力された場合に、プログラムを終了させる ための「判定条件」(下記部分)として使用されていると思われます。   if(prevletter == '\0')   break; 試しに、prevletter の記述部分を全てコメントアウトしたバージョンを作成して、 コンパイル&実行を行い、その動作を確認してみれば解ると思います。 > 2、2つ目のwhile文でif(c == '\n')やif(c == ' ' || c == '.')では改行やスペース、 > ピリオドだけ入力されている場合しか処理していないと思うのですが、実際は > どうなっているのでしょうか このプログラムの処理内容(何を行っているのか?)が、解らないということでしょうか? ご覧になっている「本」には、どう書かれているのでしょうか? プログラム内で使用されているC言語の構文、標準関数の仕様等を理解されている のであれば、プログラムを順を追って見て行けば解ると思います。 ※プログラムに、コメント(ステップ単位とか、まとまった処理単位毎の説明)を付けて  みるのも良いかもしれません。 上記で述べた趣旨のプログラムであるならば、このプログラムは「文字列」の個数 をカウントするためのものであり、「文字列」の中身まではチェックする必要はない と思われます。 従って、入力の終了判定【=改行の判定】、及び、「文字列」の区切りの判定 【=スペース、及び、ピリオドの判定】以外の入力文字の判定などの処理は、 特に必要ないと思われます。 ただし、前述の「prevletter」によるプログラム終了判定を行うために、「prevletter」 に入力された文字を格納する処理(下記部分)を行っているようです。   prevletter = c; ※改行のみが入力された場合は、prevletter には初期値の '\0' が格納されて  いますので、それを見てプログラム終了としているようです。 その他に、 変数 wordnum は、   「文字列」の個数を数えるカウンタとして使用されているようです。   ・改行入力または、区切り文字が入力される度にカウントアップされる。    (ただし、下記に示す word_in = 1 だった場合のみ。) 変数 word_in は、   「文字列」の【入力中】を示すフラグとして使用されているようです。   word_in = 1 の時 → 文字列の入力中                 ・区切り文字が入力されたら、word_in = 0 となる。   word_in = 0 の時 → 区切り文字の入力後                 ・区切り文字以外が入力されたら、word_in = 1 となる。 となっているようです。 以上です。 的外れだった場合はすみません。

yuukizx
質問者

お礼

>的外れだった場合はすみません。 いえ、大丈夫です。的中してます。 ご回答ありがとうございました。

その他の回答 (1)

noname#144013
noname#144013
回答No.2

#1です。 連投すみません。 ご提示のプログラムの場合、文字列の入力待ち状態で、 『区切り文字のみ』入力された場合でも、   ワード数:1 として表示されてしまうため、1段目のループ先頭の   while(1)   {     wordnum = 0;     word_in = 1;       : の部分は、   while(1)   {     wordnum = 0;     word_in = 0;       : とした方が良いかも知れません。 ただし、プログラムの仕様によります。 以上です。

関連するQ&A

  • if( )の( )の中の意味

    このプログラムは入力した文字列をカウントするプログラムなんですが、一部解からないところがあります。 20行目の *****if(word_in)***** です。 ()の中はどういった意味になるんでしょうか? たぶんですが、何か省略されてるんですよね? お願いします。 #include <stdio.h> main() { 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); } }

  • C初心者です。どうかお助けを

    独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。

  • 構造体

    下記プログラムの2次元配列を構造体の配列に作り変え,構造体を利用して生年月日の項目を追加し,形式は日を除いたYYYY/MMで持ち,生年月日の入出力は,YYYY/MM形式で行い,西暦が数字4桁で,西暦と月の間に'/'があり,月が01~12の範囲の数字の2桁になっている7文字の入力のみ受け付け,正しく入力されるまでそれ以外は再入力させたい。あとdo-while文をつかっている箇所をwhile文に直したいです.自力でやったのですが,わかりませんでした. どのようにしたらよいか教えてください. お願いします. include <stdio.h> #define BUFFERSIZE 11 #define MAX_PERSON 10 #define MAX_CHARS 10 int main(void) { char name[10][BUFFERSIZE]; int c; int count = 0; int i; int j; for (i = 0; i < MAX_PERSON; i++) { printf("氏名入力 : "); j = 0; /* 氏名の1文字目が'0'なら入力を終了 */ if ((c= getchar()) == '0'){ break; } if (c == '\n') { /* 改行のみの入力は再入力 */ do { printf( "再入力\n" ); /*再入力*/ printf("氏名入力 : "); } while ((c = getchar()) == '\n'); } name[i][j++] = c; /*1文字目を格納*/ if (name[i][0] == '0') { break; } while ((c = getchar()) != '\n' && c != EOF) { if (j < BUFFERSIZE - 1) { name[i][j++] = c; } } name[i][j] = '\0'; count++; /* 実際に入力した人数を記録*/ printf("累計 : %d \n", count); } /* 氏名と生年月日を出力したいです */ for (i = 0; i < count; i++) { for (j = 0; j < MAX_CHARS; j++) { if (name[i][j] == '\0'){ break; } putchar(name[i][j]); } putchar('\n'); } return 0; }

  • プログラムの間違っている箇所が分かりません

    文字列の置換プログラムを作りたいのですが、下記のプログラムでは正常に動きませんでした。 例えば、「call」の「ll」を「sell」と変換しようとするとエラーがでてしまいます。 プログラミング初心者なので、どこが間違っているのかよく分からないです。 以下、問題のあるプログラムを記述します。 #include <stdio.h> void change(char *in, char *bef, char *af){     char tmp[100];     int i = 0, j = 0;     int flg=0;         for(i = 0; *(af + i) != '\0'; i++){         tmp[i] = *(af + i);     }     tmp[i] = '\0';     for(j = 0; *(in + j) != '\0'; j++){     if(flg == 0 && *(bef + j) == '\0'){             flg = 1;     }         if(flg == 1){             tmp[i++] = *(in + j);             tmp[i] = '\0';         }     }     for(j = 0; j<=i; j++){         *(in + j) = tmp[j];     } } int check(char *in, char *bef){       int i=0;     int flg=0;     while(*(bef+i)!='\0'){             if(*(in+i)=='\0' || *(in+i)!=*(bef+i)){             flg=1;             break;         }         i++;     }     return flg; } int main(){     char in[100];     char bef_ch[20];     char af_ch[20];     int i=0;     printf("文字列を入力して下さい。\n");     gets(in);     printf("置換したい文字列を入力して下さい。\n");     gets(bef_ch);     printf("置換後の文字列を入力して下さい。\n");     gets(af_ch);     while(in[i]!='\0'){         if(check(&in[i], &bef_ch[0]) == 0){             change(&in[i], &bef_ch[0], &af_ch[0]);         }         i++;     }     printf("置換結果を示します。\n");     printf("%s\n",in);     return 0; }

  • 16進数の入力プログラムについて

    16進数の入力プログラムについての課題が出たのですが作動しませんどこが間違っているか教えて頂けませんか #include<stdio.h> main() { int number; int ch; printf("please input: "); while(){ ch=getchar() if('\n'=ch) break; number=number*16; if('0'<=ch && ch<='9'){ number=number+(ch-'0'); } if('A'<=ch && ch<='F'){ number=number+(ch-'A'+10); } } printf("your input number is %d\n",number,number); }

  • このプログラムの復元処理教えでください。助けてくだ

    #include <stdio.h> int main(void) { char a[51]; char b[101]; char c[51]; int i,k; int cnt; printf("文字例-->"); scanf("%s",a); i = 0; k = 0; while(a[i] !='\0') { cnt = 0; b[k] = a[i]; while(b[k] = a[i]) { cnt++; i++; } k++; b[k] = cnt + 48; k++; } b[k]='\0'; printf("b=%s\n",b); printf("c=%s\n",c); //-------------------------------------------------- getchar(); return 0; }

  • 置き換えのプログラム

    c言語初心者です。 入力されたタブを\tに置き換えて、入力全体を出力するプログラムを、 #include <stdio.h> main() { int c; while((c=getchar())!=EOF){ if(c=='\t') printf("\\t");   putchar(c); } } と書いて実行できたのですが、入力した文字(タブ、空白、改行などは除く)を¥(バックスシュラッシュ)に置き換えて出力するプログラムにするためには、どのように書き換えればよいのでしょうか? どなたかご教授お願いします。

  • C言語で簡単暗号

    C言語を初めてけっこう立つんですが。 自分なりにソフトを作ってみました 暗号化、解読ができるソフトです 1.暗号化 2.解読 3.Quit ソースは #include <stdio.h> int main(void) { int i; char da; back: modo: do{ printf("1.angouka\n"); printf("2.kaidoku\n"); printf("3.Quit\n"); scanf("%d",&i); }while(i<1 || i>3); if(i==1){ da=getchar(); while(da){ printf("%c",da+1); da=getchar(); if(da=='.'){ goto modo; } } } else if(i==2){ da=getchar(); while(da){ printf("%c",da-1); da=getchar(); if(da=='.'){ goto back; } } } return 0; } なんですが。感想などここはこうした方が良いなどと教えてもらいたいんですが。 もっと簡潔にかけて破かれにくい暗号を書くにはどうしたらいいでしょう 教えて下さい

  • scanf()関数の使い方について

    はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

専門家に質問してみよう