C言語のプログラム:英文の文字数・単語数・文数を数える方法

このQ&Aのポイント
  • このC言語のプログラムは、与えられた英文の文字数と単語数と文数を数えて表示するものです。
  • 入力された英文を解析し、文字数をカウントします。また、スペースの数を数えて単語数を計算し、文の終わりを表す特定の記号の数を数えて文数を求めます。
  • このプログラムを理解するためには、入力と出力の流れをイメージすることが重要です。フローチャートに表すと、入力を受け取り、文字数、単語数、文数を数えてから結果を表示するという流れになります。
回答を見る
  • ベストアンサー

解説求む

#include <stdio.h> int main(void) { char s[256]; int i, n[3] = {0, 1, 0};   printf("英文を入力して下さい:"); fgets(s, sizeof s, stdin); for (i = 0; s[i]; i++) if (s[i] == '\n') break; s[i] = '\0'; for (i = 0; s[i]; i++) n[0]++; for (i = 0; s[i]; i++) if (s[i] == ' ') n[1]++; for (i = 0; s[i]; i++) if (s[i] == '.' || s[i] == '?' || s[i] == '!' || s[i] == ',' || s[i] == '/') n[2]++; printf("文字数は%dです。\n", n[0]); printf("単語数は%dです。\n", n[1]);   printf("文の数は%dです。\n", n[2]); return 0; } このプログラムゎ英文の文字数と単語数と文数を数えて表示させるものなんですが、これのフローチャート的なものを詳しく教えていただけるとありがたいです。全体的にあんまり理解できなくて…

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

  • ベストアンサー
  • Schwarz20
  • ベストアンサー率46% (6/13)
回答No.1

とりあえず、コメントを打ってみましたので、これを参考にブロックごとに考えてみてください #include <stdio.h> int main(void) {   char s[256];   int i, n[3] = {0, 1, 0};   /* 1.標準入力より文字列を取得する */   printf("英文を入力して下さい:");   fgets(s, sizeof s, stdin);   /* 2.最初に見つかった改行(\n)までの文字列にする */ /* ex. "I have a pen\n\0" → "I have a pen\0"   for (i = 0; s[i]; i++) /* 文字列の最後まで繰り返す('\0'でループを抜ける)*/     if (s[i] == '\n')       break;   s[i] = '\0';   /* 3.文字列の文字数を取得する */   /* ex. "I have a pen\0"なら12文字 */   for (i = 0; s[i]; i++)     n[0]++;   /* 4.文字列内の単語数を取得する */ /* ex. "I have a pen\0" なら4単語 */   for (i = 0; s[i]; i++)     if (s[i] == ' ') /* 単語の区切りは空白文字 */       n[1]++;   /* 5.文字列内の文の数を取得する */ /* ex. "I have a pen\0" なら1文 */   for (i = 0; s[i]; i++)     if (s[i] == '.' || s[i] == '?' || s[i] == '!' || s[i] == ',' || s[i] == '/') /* 文の区切りは、".?!,/"のいずれか */       n[2]++;   printf("文字数は%dです。\n", n[0]);   printf("単語数は%dです。\n", n[1]);   printf("文の数は%dです。\n", n[2]);   return 0; }

son333
質問者

お礼

ありがとうございます。

その他の回答 (1)

  • Schwarz20
  • ベストアンサー率46% (6/13)
回答No.2

#1に修正があります 修正箇所1. /* ex. "I have a pen\n\0" → "I have a pen\0" 「*/」が抜けていました。 正しくは、 /* ex. "I have a pen\n\0" → "I have a pen\0" */ 修正箇所2. /* 5.文字列内の文の数を取得する */ /* ex. "I have a pen\0" なら1文 */ どうやら、「.」などの文末の文字がないと文としてカウントしていません 正しくは、 /* ex. "I have a pen.\0" なら1文 */

son333
質問者

お礼

わざわざ修正ありがとうございます。たすかります

関連するQ&A

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をどなたかフローチャートに直してください JIS規格のものでお願いします

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をフローチャートに直したいのですがいまいち方法が解りません、どなたか詳しい回答お願いします JIS規格のものでお願いします

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • 単語数、文字数のカウントプログラム

    以下のような単語数、文字数のカウントプログラムを作ったのですが、10行目に「フォーマットは char ですが、引数は different type です」というエラーが出てしまいます。どのように修正したらよいでしょうか?教えてください。 #include <stdio.h> int main(void){ int wordcnt = 0; int charactercnt = 0; int i; char line[100]; printf("String: "); fgets(line, sizeof(line), stdin); sscanf(line, "%s", &line); if(line[0] != ' '){ wordcnt++; } for(i = 0; line[i] != '\0'; i++){ if(line[i - 1] == ' '){ wordcnt++; } if(line[i] != '\n'){ charactercnt++; } } if(wordcnt == 1){ printf("%d word,", wordcnt); }else{ printf("%d words,", wordcnt); } if(charactercnt == 1){ printf(" %d character", charactercnt); }else{ printf(" %d characters", charactercnt); } return 0; }

  • 解説をお願いします

    解説をお願いします。 次のプログラミングの解説をお願いします。 #include<stdio.h> int main(void) int n,m,x; char my_turn; printf("最後にタバスコを取った側がピザを食べます\n"); printf("タバスコの数?"); scanf("%d",&n); printf("1回にタバスコを振れる最大の数?"); scanf("%d",&m); if(n < 1 || m < 1) return 0;//負数の入力を拒否します for(my_turn = 1; n!=0; my_turn ^=1){ *1 if(my_turn){ x = (n - 1)%(m + 1);//なぜこの様な式になるのかを特に教えてください。 if(x == 0) x =1; printf("私は %d 回タバスコを振ります\n",x); }else do{ printf("何回振りますか?"); scanf("%d",&x); }while(x <= 0 || x > m || x > n); n = n - x; printf("残りは %d 回です\n",n); } if(my_turn) printf("あなたの負けです\nおいしく召し上がれ"); else printf("私の負けです\nいただきます"); return 0; }

  • わかる人 フローチャート

    このプログラムをフローチャートに直しなさい void main() { int i, n; int sum = 0; printf("n?\n"); scanf("%d",&n); for (i=0; i<=10; i++) { sum = sum + i; } printf("sum = %d\n",sum); }

  • 単語数のカウントについて

    C言語のプログラミングについて質問させていただきます。 『一行の入力に対し,入力された英文の文字数,単語数,文字の使用頻度を数える』という問題なんですが、一応プログラムを組むことはできました。 しかし、今のプログラムのままでは単語間にを連続して入力しても単語数が増加してしまいます。 そこで、単語間の空白が2文字以上でも安定して単語数を正しく数えることができるようにするためにはどのように変更すればいいのか教えてください。 よろしくお願いします。 #include <stdio.h> int main(void){ char line[100]; /* キーボード入力用汎用変数 */ int i; /* 繰り返し用カウンタ */ char temporary; /* テンポラリ */ int moji_acount[128]; /* 文字カウンタ */ int moji_count = 0; /* 文字数 */ int tango_count = 0; /* 単語数 */ /* 文字カウンタの初期化 */ for(i=32;i<128;i++){ moji_acount[i] = 0; } /* 文字列の入力 */ printf("文字列:"); fgets(line, sizeof(line), stdin); /* 繰り返し用カウンタの初期化 */ i = 0; /* 文字数を数える作業 */ while(line[i] != '\n'&& line[i] != '\0'){ moji_count++; i++; } /* 文字数の表示 */ printf("文字数:%d\n", moji_count); /* 文字をテンポラリに保存 + 文字カウンタを数える作業 */ for(i=0;i<moji_count;i++){ temporary = line[i]; moji_acount[(int)temporary]++; } /* 入力された文字と回数を表示 */ for(i=32;i<128;i++){ if(moji_acount[i] != 0){ /* 文字カウンタがゼロでないときに繰り返し */ printf("'%c': %2d個\n", (char)i, moji_acount[i]); } } /* 繰り返し用カウンタの初期化 */ i = 0; /* 単語数を数える作業 */ while(line[i] != '\n' && line[i] != '\0'){ if(line[i] == ' '){ /* もしline[i]がスペースのとき */ tango_count++; } i++; } printf("単語数:%d個\n", tango_count + 1); return 0; }

  • 作成したいプルグラムがあります。

    実は作成してみたいプログラムがあります。 それは単語カウントプログラムです。 入力するテキストのファイル中の単語(大文字小文字区別なし)を数えて、そして全体の単語数&それぞれの単語ごとの数を表示させるプログラムを作成してみたいです。分かりやすく言いますと以下の通りです。 This is a pen. This is a book. を入力すると、 total:8 This :2 is:2 a:2 pen:1 book:1 と出力されるプログラムです。 今までやってみてできた段階は #include <stdio.h> int main(void) { char s[256]; char t[256]; int i, n[3] = {0, 1, 0}; int j, o[3] = {0, 1, 0}; /* 標準入力より文字列を取得 */ printf(""); printf(""); fgets(s, sizeof s, stdin); fgets(t, sizeof t, stdin);      /* 文字列内の単語数を取得*/ for (i = 0; s[i]; i++) if (s[i] == ' ') /* 単語の区切りは空白文字*/   n[1]++; for (j = 0; t[j]; j++) if (t[j] == ' ') /* 単語の区切りは空白文字*/   o[1]++;      printf("total:%d\n\n", n[1]+o[1]);      return(0); } です。これ以降は分からなくて、参考になれるご指導をお願いいたします。

  • 有限体GF(4)上の同次方程式で不定方程式

    連立方程式の解法ですが、手計算だとうまくいくのにプログラムにしようとするとうまくいきません。 さらに不定方程式なので解がないといわれてしまいます。誰かわかる方がいらしたらプログラムを 見て直していただきたいです。プログラムは以下の通り。 #define N 4 #define T 6 unsigned char gf[4]={0,1,2,3},fg[4]={0,1,2,3}; unsigned char gf[4]={0,1,2,3},fg[4]={0,1,2,3}; unsigned char ad[4][4]; /* 答えは 1,1,2 */ unsigned char s[3][3]={{1,3,1},{3,3,0},{1,0,3}}; /* 答えはzを不定として1と置き、x=z=1;y=0;になる筈だがならない */ //unsigned char s[][]={{2,2,2},{2,0,2},{2,2,2}} int add(int x,int y){ return ad[x][y]; } int mlt(int x, int y){ if(x==0||y==0) return 0; return ((x+y-2)%(N-1))+1; } int mltn(int n,int x){ int i,j; if(n==0) return 1; i=x; for(j=0;j<n-1;j++) i=mlt(i,x); return i; } int div(int x,int y){ if(x==0) return 0; return ((x-y+(N-1))%(N-1))+1; } void syn(){ int i,j,k,l,n; for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(i==j){ if(s[i][j]==1){ for(l=0;l<3;l++){ for(k=0;k<3;k++){ s[l+1][k]=add(s[l+1][k],mlt(s[l+1][k],s[i][k])); printf("%d ",s[l][k]); } printf("\n"); } } // exit(1); if(s[i][j]!=1){ printf("%da \n",s[i][j]); n=div(1,s[i][j]); if(n==0){ printf("%d =\n",fg[s[i][j]]); exit(1); } for(k=0;k<3;k++){ if(s[0][0]==0){printf("%d?\n",s[0][0]); exit(1);} s[i][k]=mlt(n,s[i][k]); printf("%d ",s[i][k]); } printf("\n"); for(l=i;l<3;l++){ for(k=0;k<3;k++){ s[l+1][k]=add(s[l+1][k],mlt(s[l+1][k],s[i][k])); // printf("%d ",s[l][k]); } printf("\n"); } printf("\n"); for(l=0;l<3;l++){ for(k=0;k<3;k++) printf("%d ",s[l][k]); printf("\n"); } // exit(1); if(s[i][j]==0){ while(s[i][j]==0){ j++; } printf("i-j==%d\n",s[i+1][j]); if(s[i][j]!=0){ if(s[i][j]==1){ for(l=0;l<3;l++){ for(k=0;k<3;k++){ s[l+1][k]=add(s[l+1][k],mlt(s[l+1][k],s[i][k])); printf("%d ",s[l][k]); } printf("\n"); } } // exit(1); if(s[i][j]!=1){ printf("%da \n",s[i][j]); n=div(1,s[i][j]); if(n==0){ printf("%d =\n",fg[s[i][j]]); exit(1); } for(k=0;k<3;k++){ if(s[0][0]==0){printf("%d?\n",s[0][0]); exit(1);} s[i][k]=mlt(n,s[i][k]); printf("%d ",s[i][k]); } printf("\n"); for(l=i;l<3;l++){ for(k=0;k<3;k++){ s[l+1][k]=add(s[l+1][k],mlt(s[l+1][k],s[i][k])); // printf("%d ",s[l][k]); } printf("\n"); } printf("\n"); for(l=0;l<3;l++){ for(k=0;k<3;k++) printf("%d ",s[l][k]); printf("\n"); } }} // i++;j++; //exit(1); } } } } } for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%2d ",s[i][j]); printf("\n"); } } int main(){ int i,j; for(i=0;i<N;i++){ for(j=0;j<N;j++) ad[i][j]=fg[gf[i]^gf[j]]; } syn(); }

  • c言語 

    答えを0にするこまち算のプログラムを組んでみたのですが、ここからどうしても進まなくなってしまいました。 自分ではいけるかなと思ったのですが、9-8-7+65-4321=9など答えがありえない数になってしまいます。 どこがいけないか教えてください。むしろ最初から組み直した方がよいのでしょうか… #include <stdio.h> int cul(); int num[9] ={9,8,7,6,5,4,3,2,1}; int total;/**/ int kigou[8]={0,0,0,0,0,0,0,0}; int main(){ for(kigou[0]=0;kigou[0]<3;kigou[0]++){ for(kigou[1]=0;kigou[1]<3;kigou[1]++){ for(kigou[2]=0;kigou[2]<3;kigou[2]++){ for(kigou[3]=0;kigou[3]<3;kigou[3]++){ for(kigou[4]=0;kigou[4]<3;kigou[4]++){ for(kigou[5]=0;kigou[5]<3;kigou[5]++){ for(kigou[6]=0;kigou[6]<3;kigou[6]++){ for(kigou[7]=0;kigou[7]<3;kigou[7]++){ keisan(); } } } } } } } } return 0; } int keisan(){ int n =0; int flag = 0; int t = 0; int i = 0; total = num[0]; /* for (n=0;n<9;n++) printf("kigou[%d] == %d",n,kigou[n]);確かめ*/ for(;n<8;n++){ if(kigou[n] == 0 && n == 0){ total = total * 10 + num[n+1]; for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ total = total * 10 + num[n+flag+1]; } n = n + flag; } flag=0; if(kigou[n]!= 0){ for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ t = num[n+1] * 10 + num[n+flag+1]; } n = n+ flag; total = total + t; } } /*0になる計算式の表示*/ kigou[8]=2;/*表示しないために空白を入れる*/ if(total==0){ for(i=0;i<9;i++){ printf("%d",num[i]); if(kigou[i]==0) printf("+"); if(kigou[i]==1) printf("-"); if(kigou[i]==2) printf(""); } printf("=%d\n",total); } return 0; }

専門家に質問してみよう