![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
実は作成してみたいプログラムがあります。
それは単語カウントプログラムです。
入力するテキストのファイル中の単語(大文字小文字区別なし)を数えて、そして全体の単語数&それぞれの単語ごとの数を表示させるプログラムを作成してみたいです。分かりやすく言いますと以下の通りです。
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);
}
です。これ以降は分からなくて、参考になれるご指導をお願いいたします。
No.4ベストアンサー
- 回答日時:
>これ以降は分からなくて、参考になれるご指導をお願いいたします。
★この質問を見た(読んだ)人は、「これ」が判らないと思います。
・どうして n[1]++; なのか。n[0], n[2] は何に使うのか。
・なぜ空白をカウント・出力するのか。
★「参考になれる」かどうかは、質問者様だけが判断できること。
↑「回答者」にしてみれば、高いハードルだなぁ。
----- 高いハードルは、くぐってと年寄りが・・---------
★手作業だったら、どうするか。
・まず、最初の単語をメモし、「正」の字の横一(◆)。
・次の単語が、前の単語と同じ(既出)なら、「正」の字の縦(順次)。
・違えば、新たにメモ・・この繰り返しだよね。
これをプログラムする(↓1つの方法、他の方法もいっぱいあるはず)。
・メモ用紙の代わりに、構造体を定義。
typedef struct{
int iCount; // カウンタ
char cTango[32]; // 単語
}TANGO;
TANGO sWork[1000]; // [1000] は適宜調整(>テキスト内ユニーク単語数)
int igAllCount = 0;
・1行読み込み、「単語」切り出し、既出判定。
▽初物だったら構造体に格納、カウンタを1に初期化(◆)。
格 納: strcpy( sWork[igAllCount].cTango, cStr );
初期化: sWork[igAllCount++].iCount = 1; // igAllCount++ はここだけ
既 出: sWork[ x ].iCount++; // x 番目に格納したものと一致
▽難物は、「『単語』切り出し」。
・大小 52 文字以外をデリミタとするか、it's の ' はどうするか。
(あらかじめ定めておく)
・デリミタを全て NULL にしておくのも1つの方法。そして、
strcpy( cStr, &cBuf[k] );
for( i = 0; i < igAllCount; i++ ){ // 判定
if( 0 == strcmp( sWork[i].cTango, cStr ) ){ // 既出
★て書いてきたけど、やっぱハードルは越えなくちゃダメかな。
いろいろのご指導有難うございます。
やはりいきなり単語カウントプログラムを作りたくても基本をしっかり覚えていないわけですから組むのに無理が出てます。基本を踏まえてから少しずつ作り上げたいと思いました。
皆さんのご指導有難うございました。
No.3
- 回答日時:
> This :2
> is:2
> a:2
> pen:1
> book:1
出力順に、何らかの決め事はありますか?
上記の例を見る限りにおいては
単語の登場順のように見えますが、そういう仕様ですか?
No.1
- 回答日時:
これは先が長いかもしれませんね。
3点書きます。
まず、fgetsの前にfopenが必要で、fgetsが終わると
fcloseが必要です。
fgetsは前もって終わらせるのではなくて、eofにな
るまで繰り返してfgetsするものです。
単語の区切りは(これをデリミタという)空白とし
ていますが、空白以外にもデリミタはあるでしょう。
例えば「,」「.」改行、eof等、「:」や「;」も
入れるべきかもしれません。
ついでにスペースが続いた場合のことを考慮しま
しょう。なおスペースは''ではありません。
' 'です。
最初のprintf 2行が意味不明。改行とかしたいの
ならtotalを印刷する時に、同時に行うべき。
forの後ろにifを使っているので括弧でくくった方
がforがどこまで有効かはっきりする。
括弧と段落は合わせるべきでしょう。
3つと言いながら沢山書いてしまいました。
沢山のご指導有難うございます。やはりまだまだ先が長いですね。
>最初のprintf 2行が意味不明。改行とかしたいの
ならtotalを印刷する時に、同時に行うべき。
#そうですね。二行に改行したくprintfを二回入れてしまいました。
#そして括弧と段落は合わせるの方が分かりやすいですもんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
*をユーザーが入力した数字の数...
-
電卓の小数点
-
C言語 backspaceキーを無効に...
-
batプログラム上で文字列を入力...
-
数字以外が入力されたらエラー...
-
入力候補を表示させるには・・・?
-
や
-
Date関数で書いた日付がおかしい
-
C++のcinの動作
-
if文の条件にscanf関数を使うと…?
-
漢字のソートについて
-
C言語 逆ピラミッドの作り方
-
fgetsを用いたループ処理後の入...
-
4桁の数字以外を入力したらエラ...
-
プログラミングの問題です 「金...
-
double型が正常に認識されてい...
-
scanf が無視されます
-
scanfが2回使えない・・・?;
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語 逆ピラミッドの作り方
-
double型が正常に認識されてい...
-
ワードで文字を入力する時の変...
-
コマンドプロンプトからのEOFの...
-
Linuxで入力待ちなしkeyread関...
-
scanf が無視されます
-
if文の条件にscanf関数を使うと…?
-
C言語について
-
cout関数を使っているのですが...
-
enterでループ終了
-
"scanf"でエンターで改行させな...
-
C言語でgetchar();が上手く使え...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報