ファイル内の一意の単語を出力する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つの単語がアルファベット順に出力されました。
-
C++で「Happy Birthday」を出力するプログラム
本記事では、C++を使って「Happy Birthday」という文字列を出力するプログラムを紹介します。このプログラムは、ASCIIコードの性質を利用したちょっとしたトリックを使ったユニークな手法が特徴です。 アルゴリズム 開始 出力したい各文字の「1つ前の文字」からなる文字列str1を用意する(例:「H」なら「G」、「a」なら「`」)。 文字列の先頭アドレスをポインタpに代入する。 *pがNULL(\0)でない間、whileループを繰り返す。 現在の文字をインクリメント(+1)して目的の文字へ変換し、ポインタを次の位置へ進める。 変換後の文字列
-
ユーザーが入力した数値を出力するC++プログラム
C++では、入力と出力のためにそれぞれ「cin」と「cout」というオブジェクトを使用します。cinはistreamクラスのインスタンスであり、キーボードなどの標準入力デバイスに接続されています。一方、coutはostreamクラスのインスタンスであり、ディスプレイ画面などの標準出力デバイスに接続されています。 ユーザーが入力した数値を表示するプログラムは、以下のとおりです。 サンプルコード #include <iostream> using namespace std; int main() { int num; cout<<Enter the num