C++
 Computer >> コンピューター >  >> プログラミング >> C++

ファイル内の一意の単語を出力するC++プログラム

ファイルとは、単語のストリーム(連続したテキストデータ)を格納するメモリ上の場所です。ひとつのファイルの中には、さまざまな単語が含まれています。本記事では、ファイルから「一意の単語」だけを抽出して出力するC++プログラムを紹介します。

ここでいう一意の(ユニークな)単語とは、その単語がファイル内でちょうど1回だけ出現することを意味します。

たとえば、次のような文があったとします。

Tutorials point is best for programming tutorials.

この文では、「tutorial(s)」という単語が複数回出現しているため一意ではありません。それ以外のすべての単語は一意です。

アルゴリズム

与えられたファイル内の一意の単語を調べるには、data(単語)と occurrence(出現回数)の2つの変数を持つマップ構造とイテレータを使用します。

  • 入力: ファイル
  • ステップ1: ファイルから1行ずつ読み込み、ステップ2へ進みます。
  • ステップ2: イテレータを使って、その単語がデータ構造内にすでに存在するかどうかを確認します。
    • ステップ2.1: 単語が一致する場合は、対応する出現回数を1増やします。
    • ステップ2.2: 一致しない場合は、新しい単語を追加し、出現回数を1に設定します。
  • ステップ3: データ構造全体を反復処理し、各単語の出現回数を確認します。
    • ステップ3.1: 出現回数が1であれば、その単語を出力します。それ以外は何もしません。

サンプルコード

#include <bits/stdc++.h>
using namespace std;

int main(){
    // テスト用ファイルを作成して書き込む
    ofstream fout("test.txt", ios::trunc);
    fout << "tutorials point is best for programming tutorials";
    fout.close();

    // ファイルを読み込みモードで開く
    fstream fin("test.txt");
    map<string, int> mp;
    string word;

    // 単語ごとに出現回数をカウント
    while (fin >> word){
        if (!mp.count(word))
            mp.insert(make_pair(word, 1));
        else
            mp[word]++;
    }
    fin.close();

    // 出現回数が1回の単語のみを出力
    for (map<string, int>::iterator p = mp.begin();
         p != mp.end(); p++){
        if (p->second == 1)
            cout << p->first << endl;
    }
    return 0;
}

コードの解説

まず ofstream を使ってテスト用のファイルを作成し、サンプル文を書き込んでいます。続いて fstream で同じファイルを読み込みモードで開き、while (fin >> word) によって空白区切りで単語を1つずつ取り出します。

各単語は map<string, int> にキーとして登録され、値に出現回数が記録されます。初めて登場した単語は出現回数1で挿入され、すでに存在する単語はカウントがインクリメントされます。

最後にイテレータでマップを走査し、出現回数が1の単語だけを標準出力に表示します。map はキーを自動的にソートして保持するため、出力は辞書順になります。

実行結果

best
for
is
point
programming

「tutorials」は2回出現しているため除外され、残りの5つの単語がアルファベット順に出力されました。

  1. C++で「Happy Birthday」を出力するプログラム

    本記事では、C++を使って「Happy Birthday」という文字列を出力するプログラムを紹介します。このプログラムは、ASCIIコードの性質を利用したちょっとしたトリックを使ったユニークな手法が特徴です。 アルゴリズム 開始 出力したい各文字の「1つ前の文字」からなる文字列str1を用意する(例:「H」なら「G」、「a」なら「`」)。 文字列の先頭アドレスをポインタpに代入する。 *pがNULL(\0)でない間、whileループを繰り返す。 現在の文字をインクリメント(+1)して目的の文字へ変換し、ポインタを次の位置へ進める。 変換後の文字列

  2. ユーザーが入力した数値を出力するC++プログラム

    C++では、入力と出力のためにそれぞれ「cin」と「cout」というオブジェクトを使用します。cinはistreamクラスのインスタンスであり、キーボードなどの標準入力デバイスに接続されています。一方、coutはostreamクラスのインスタンスであり、ディスプレイ画面などの標準出力デバイスに接続されています。 ユーザーが入力した数値を表示するプログラムは、以下のとおりです。 サンプルコード #include <iostream> using namespace std; int main() { int num; cout<<Enter the num