ページ 11

単語分割について

Posted: 2019年10月12日(土) 22:47
by あや
入力テキスト中の各単語を異なる行に分けて表示する問題です.
入力⇒NASA debuted a color(改行)
出力⇒NASA(改行)debuted(改行)a(改行)color(改行)
このように表示します.
・単純には、スペースが出たら改行文字を代わりに出力します
・スペース以外の区切り文字があった場合も、改行文字を代わりに出力します
・複数の区切り文字が連続した場合には、単一の改行を出力します
・区切り文字は、isspace(ch)関数で判定して真となる文字とします
・isspace(ch)関数は、chが「空白文字」(即ちスペース、タブ、改行、復帰、垂直タブ、または改頁文字)のコードであれば、真(非ゼロ)を 返します

以下が現在のコードです.正しく出力されないのですが,どこを直したらいいのか教えてください.よろしくお願いします.

コード:

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

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

void main() {

	// 変数
	ifstream file;  // 入力ファイル  
	char ch;    // 入力文字
	int type;   // 直前入力文字の種別

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

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

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

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

		// 4-1. 入力文字が空白文字ならば、以下の処理を実行する。
		if (isspace(ch)) {

			// 4-1-1.  「直前入力文字の種別」が「通常文字」ならば、改行する。
			if (type = N) {
				ch = '\n';
			}

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

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

			// 4-2-1. 入力文字を出力する。
			cout << ch;

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

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

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

Re: 単語分割について

Posted: 2019年10月13日(日) 00:24
by asd
あや さんが書きました:
5年前

以下が現在のコードです.正しく出力されないのですが,どこを直したらいいのか教えてください.よろしくお願いします.
4点ほど怪しそうなところをプログラム中に※付きでコメント入れてみます。
コメントを読んでどうしたらよさそうかを考えていただけると。
(よくわからなければまた質問してください)

修正したあとでステップ実行を行って、テキストファイルから読み込んだ値と実行される処理が
自分の思った通りに動いているかを確認されるとよいと思います。
(if文で期待した値の比較が行われているか、その結果の分岐は期待した通りになっているかなど)

コード:

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

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

void main() {//※C++の場合はint main()にして戻り値が必要だったかと思います

	// 変数
	ifstream file;  // 入力ファイル  
	char ch;    // 入力文字
	int type;   // 直前入力文字の種別

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

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

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

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

		// 4-1. 入力文字が空白文字ならば、以下の処理を実行する。
		if (isspace(ch)) {

			// 4-1-1.  「直前入力文字の種別」が「通常文字」ならば、改行する。
			if (type = N) {//※typeとNが等しいかの比較演算子は=一つでよかったでしたっけ?
				ch = '\n';//※chに改行文字を代入していますが、それは標準出力されているでしょうか?
			}

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

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

			// 4-2-1. 入力文字を出力する。
			cout << ch;

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

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

		// 5. 入力ファイルを閉じる。
		file.close();//※whileループ中でファイルを閉じてしまって大丈夫でしょうか?
	}
}

Re: 単語分割について

Posted: 2019年10月13日(日) 00:48
by あや
※chに改行文字を代入していますが、それは標準出力されているでしょうか?
というコメントのところを,どう直したらいいのか教えていただけますか?
よろしくお願いします.

Re: 単語分割について

Posted: 2019年10月13日(日) 01:53
by asd
あや さんが書きました:
5年前
※chに改行文字を代入していますが、それは標準出力されているでしょうか?
というコメントのところを,どう直したらいいのか教えていただけますか?
よろしくお願いします.
文字が空白文字”ではなかった”場合の処理(elseの中)でchに代入された文字を出力している処理がありますよね?
それと同じ処理をすればchに代入された改行文字が出力されるかと思います。

Re: 単語分割について

Posted: 2019年10月13日(日) 02:09
by あや
正しく出力されました。本当にありがとうございます。

Re: 単語分割について

Posted: 2019年10月13日(日) 18:20
by asd
解決したようで何よりです(*´ヮ`)

Re: 単語分割について

Posted: 2019年10月13日(日) 18:29
by あや
文字数、単語数、行数の計数についてのトピックについても教えていただけますか?

Re: 単語分割について

Posted: 2019年10月14日(月) 16:09
by asd
あや さんが書きました:
5年前
文字数、単語数、行数の計数についてのトピックについても教えていただけますか?
乗り掛かった舟なのでそちらにも回答を入れていますが、
本来掲示板はいろんな方が閲覧し投稿する場所なので、特定の人にだけ回答をお願いするのは避けた方がよいですよ。

仮に私が回答できない状況になったら誰からも回答がもらえなくなってしまって、
困るのはあやさんですので。

Re: 単語分割について

Posted: 2019年10月14日(月) 16:14
by asd
あぁ、もう一つ抜けていましたが、解決したのであれば、
解決したソース全部を提示して「これで解決しました」と提示いただけますか?

それがないとあやさんは解決してよいかもしれませんが、回答した私やほかの閲覧者さんからすると
どうやって直したの?が見えませんので…。

Re: 単語分割について

Posted: 2019年10月14日(月) 18:56
by dic
純粋なC++でないといけませんか?
C/C++の混在コードはダメですか?
もしくは、Cのみではダメですか?

回答者の交代を希望しますか?
交代を希望するのであれば、その旨を書いていただきたいです。

わからないときは「わかりません」でお願いします。



フォーラム(掲示板)ルール より
rules
>また、解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。