郵便番号の検索(オブジェクト指向版!?) [C++]
別記事〔郵便番号検索の実用化〕で、C++で郵便番号検索プログラムの例を紹介しました。
でも、C++を使って書いた割りに、読み難いプログラムとなってしまいました。
せっかくC++で書くので、class定義を使って書き直してみましたので紹介します。
この程度(100行)のプログラムを書くのに、オブジェクト指向は不要だとのお叱りはあろうかと思いますが、C++の使い方の練習にはなると思います。
(by 心如)
───〔表示例〕───────────────────────────
───〔プログラム例〕───────────────────────────
// 郵便番号データの検索
//
// 2012.04.18 ───── coded by 心如
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
// 文字列を、指定された文字で分割し、文字列の配列にする
vector<string> split(string s, char c){
string::size_type i, tp;
string temp;
vector<string> data;
tp = 0;
for(i = 0; i < s.size(); i++){
if(s[i] == c){
temp = s.substr(tp, i - tp);
data.push_back(temp);
tp = i + 1;
}
}
temp = s.substr(tp);
data.push_back(temp);
return data;
}
// 「"」で囲まれた文字列から「"」を外す
string strip_s(string s){
return s.substr(1, s.size() - 2);
}
// 開始からの秒数を取得
inline float get_sec(){
return (float)clock() / CLOCKS_PER_SEC;
}
// 郵便番号データに関する定義
class JZipCode{
string fname;
vector<string> data;
public:
JZipCode(string);
void print_adr(int);
int search(string);
};
// 郵便データの構築
JZipCode::JZipCode(string jzc_file){
string temp;
fname = jzc_file;
ifstream f(fname.c_str());
//指定されたファイルを1行ずつ読み込んでそれをdataに格納
int n = 0;
while(getline(f,temp)){
data.push_back(temp);
n++;
}
printf("[%dlines loaded, %.3f sec.]\n", n, get_sec());
}
// 指定された行の郵便番号・住所データを表示
void JZipCode::print_adr(int n){
vector<string> tmps = split(data[n], ',');
cout << tmps[0] << ",";
cout << tmps[1] << ",";
cout << strip_s(tmps[2]) << ",";
cout << strip_s(tmps[6]) << strip_s(tmps[7]);
if(tmps[8].find("以下に") == -1){
cout << strip_s(tmps[8]);
}
}
// 指定された検索文字列を含む行を表示し数える
int JZipCode::search(string ss){
int n = 0;
float wsec = get_sec();
string ss1, ss2;
string::size_type m = ss.find(",");
if(m == -1){
ss1 = ss;
ss2 = ss;
}
else{
ss1 = ss.substr(0, m);
ss2 = ss.substr(m + 1);
}
for(vector<string>::size_type i = 0; i < data.size(); i++){
if(data[i].find(ss1) != -1 && data[i].find(ss2) != -1){
printf("%06d: ", i);
print_adr(i);
cout << endl;
n++;
}
}
cout << "[" << ss1;
if(ss1 != ss2){
cout << "," << ss2;
}
printf(": %d Hit](%.3fsec.)\n\n", n, get_sec() - wsec);
return n;
}
// メイン・ルーチン
int main(){
string temp;
JZipCode jzc("D:/Data/KEN_ALL.CSV"); //調べるファイルの指定
// 検索処理の流れ
do{
cout << "・探す文字列の入力(xxx:終了)>";
cin >> temp;
if(temp == "xxx") break; // 終了判定
jzc.search(temp);
}while(1);
}
コメント 0