C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

文字数、単語数、行数の計数について

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■92631 / inTopicNo.1)  文字数、単語数、行数の計数について
  
□投稿者/ あや (1回)-(2019/10/14(Mon) 22:34:14)

分類:[C/C++] 

Visual Studio 2019でC++のコードを書いています.
入力テキスト中の文字数、単語数、行数を教える問題です.単語は、空白文字で区切られた非空白文字の列とします.
以下が入力テキストです.
NASA debuted a color picture from the Spirit rover 
on Tuesday showing gray rocks peppering a Martian 
lake bed awash in its natural hues of red pink 
and orange Mission scientists said they were 
bowled over by the spectacular quality of 
the image taken with a dual camera system 
called pancam that is mounted on a mast jutting 
up from the rover I think my reaction has been 
one of shock and awe said Jim Bell the team 
member in charge of pancam Using special software 
mission scientists can fly though the image zooming 
in on rocks and other landscape features of interest
It is approximately the color that you would see 
with your eyes if you were standing there Bell said
The resolution of course is pretty much what you 
would see Pancam has 20 20 vision It is three to 
four times better than any previous mission that has gone 
to Mars in fact these pictures are the highest resolution
highest detailed pictures of Mars ever obtained They 
are absolutely spectacular
以下のコードで実行すると,単語数:94と出力されます.単語数:173と出力するには,どこを直したらいいでしょうか?
正しいコードを教えてください.お願いします.
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

// 定数定義
#define B 0 // 空白文字
#define N 1 // 通常文字

// プロトタイプ宣言
void updateWord(void);  // 単語数を更新する

// 大域変数
int word; // 単語数
int type; // 直前入力文字の種別
char ch;    // 入力文字

/********************************
メイン関数
********************************/
int main() {

	ifstream file;  // 入力ファイル  
	
	int letter; // 文字数
	int line; // 行数

	// 1. 文字数、単語数、行数を0とする。
	letter = 0;
	word = 0;
	line = 0;

	// 2. 「直前入力文字の種別」を「空白文字」とする。
	type = B;

	// 3. ファイルを開く。
	file.open("test.txt");

	// 4. ファイルから1文字読み込む。
	ch = file.get();

	// 5. ファイルの未尾に到達するまで以下の処理を繰り返す。 
	while (!file.eof()) {

		// 5-1. 文字数を1増やす。
		letter++;

		// 5-2. 単語数を更新する。
		updateWord();

		// 5-3. 読み込んだ文字が改行文字ならば、行数を1増やす。
		if (ch == '\n') {
			line++;
		}

		// 5-4. ファイルから1文字読み込む。
		ch = file.get();
	}

	// 6. 入力ファイルを閉じる。
	file.close();

	// 7. 文字数、単語数、行数を出力する。
	cout << "文字数:" << letter << endl;
	cout << "単語数:" << word << endl;
	cout << "行数:" << line << endl;
}

/********************************************
単語数を更新する
********************************************/
void updateWord(void) {

	

	// 1. 読み込んだ文字が空白文字ならば、以下の処理を行う。 
	if (isspace(ch)) {

		// 1-1. 「直前入力文字の種別」が「通常文字」ならば、単語数を1増やす。
		if (type == N) {
			word++;


			// 1-2. 「直前入力文字の種別」を「空白文字」とする。
			type = B;
		}

		// 2. そうでない場合、以下の処理を行う。 
		else {

			// 2-1. 「直前入力文字の種別」を「通常文字」とする。
			type = N;
		}
	}
}

引用返信 編集キー/
■92632 / inTopicNo.2)  Re[1]: 文字数、単語数、行数の計数について
□投稿者/ 774RR (741回)-(2019/10/15(Tue) 06:24:01)
設問もコードも長すぎてみる気がしないうえに下記でだいたい答えがついている様子
https://dixq.net/forum/viewtopic.php?f=3&t=20806

引用返信 編集キー/
■92650 / inTopicNo.3)  Re[1]: 文字数、単語数、行数の計数について
□投稿者/ shu (1199回)-(2019/10/17(Thu) 17:02:29)
No92631 (あや さん) に返信

空白だけでなく\nのときも単語判定が必要。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ