単語分割について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あや
記事: 28
登録日時: 4年前

単語分割について

#1

投稿記事 by あや » 4年前

入力テキスト中の各単語を異なる行に分けて表示する問題です.
入力⇒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();
	}
}
 

アバター
asd
記事: 319
登録日時: 13年前

Re: 単語分割について

#2

投稿記事 by asd » 4年前

あや さんが書きました:
4年前

以下が現在のコードです.正しく出力されないのですが,どこを直したらいいのか教えてください.よろしくお願いします.
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ループ中でファイルを閉じてしまって大丈夫でしょうか?
	}
}
Advanced Supporting Developer
無理やりこじつけ(ぉ

あや
記事: 28
登録日時: 4年前

Re: 単語分割について

#3

投稿記事 by あや » 4年前

※chに改行文字を代入していますが、それは標準出力されているでしょうか?
というコメントのところを,どう直したらいいのか教えていただけますか?
よろしくお願いします.

アバター
asd
記事: 319
登録日時: 13年前

Re: 単語分割について

#4

投稿記事 by asd » 4年前

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

あや
記事: 28
登録日時: 4年前

Re: 単語分割について

#5

投稿記事 by あや » 4年前

正しく出力されました。本当にありがとうございます。

アバター
asd
記事: 319
登録日時: 13年前

Re: 単語分割について

#6

投稿記事 by asd » 4年前

解決したようで何よりです(*´ヮ`)
Advanced Supporting Developer
無理やりこじつけ(ぉ

あや
記事: 28
登録日時: 4年前

Re: 単語分割について

#7

投稿記事 by あや » 4年前

文字数、単語数、行数の計数についてのトピックについても教えていただけますか?

アバター
asd
記事: 319
登録日時: 13年前

Re: 単語分割について

#8

投稿記事 by asd » 4年前

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

仮に私が回答できない状況になったら誰からも回答がもらえなくなってしまって、
困るのはあやさんですので。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
asd
記事: 319
登録日時: 13年前

Re: 単語分割について

#9

投稿記事 by asd » 4年前

あぁ、もう一つ抜けていましたが、解決したのであれば、
解決したソース全部を提示して「これで解決しました」と提示いただけますか?

それがないとあやさんは解決してよいかもしれませんが、回答した私やほかの閲覧者さんからすると
どうやって直したの?が見えませんので…。
Advanced Supporting Developer
無理やりこじつけ(ぉ

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

Re: 単語分割について

#10

投稿記事 by dic » 4年前

純粋なC++でないといけませんか?
C/C++の混在コードはダメですか?
もしくは、Cのみではダメですか?

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

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



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

返信

“C言語何でも質問掲示板” へ戻る