SSブログ

郵便番号の検索(オブジェクト指向版!?) [C++]

 別記事〔郵便番号検索の実用化〕で、C++で郵便番号検索プログラムの例を紹介しました。

 でも、C++を使って書いた割りに、読み難いプログラムとなってしまいました。

 せっかくC++で書くので、class定義を使って書き直してみましたので紹介します。

 この程度(100行)のプログラムを書くのに、オブジェクト指向は不要だとのお叱りはあろうかと思いますが、C++の使い方の練習にはなると思います。

(by 心如)

───〔表示例〕───────────────────────────
CPP chk_jzc.JPG

───〔プログラム例〕───────────────────────────
// 郵便番号データの検索
//
// 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);
}


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。