【VC++】CArrayを使用した構造体可変配列のサンプル

0

    <機能>

    (1)構造体(ユーザ定義)の可変配列をCArrayを使用して実装する

    (2)ユーザ定義構造体のメンバは以下の2つ

     urban(都市名) char[1024]

     ipopulation(人口) int

    (3)下記メソッドを使用してみる

     Add:要素を追加

     GetAt:指定インデックスから値を返す

     

    <動作検証&開発環境>
    Visual Studio Community 2015

     

    <イメージ>

    東京都の都市別人口(出典:総務省統計局)をコマンドプロンプトに出力します

    ユーザ定義構造体,可変配列,CArray,MFC,VC++,

     

    <使い方>
    (1)Win32コンソールアプリケーションでプロジェクトを作成

    (2)[次へ]を押下し、アプリケーション設定画面の共通ヘッダーファイルを追加にて「MFC」にチェック

    ユーザ定義構造体,可変配列,CArray,MFC,VC++,

    (3)ソースの追加

     

    //構造体定義
    typedef struct SCT_POPULATION {
        char urban[1024];
        int ipopulation;
    }sctPopulation;

     

    //プロトタイプ宣言
    void setPopulation(CArray<sctPopulation> *sctpop);


    // 唯一のアプリケーション オブジェクトです。

    CWinApp theApp;

    using namespace std;

    int main()
    {
        int nRetCode = 0;

        HMODULE hModule = ::GetModuleHandle(nullptr);

        if (hModule != nullptr)
        {
            // MFC を初期化して、エラーの場合は結果を印刷します。
            if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
            {
                // TODO: 必要に応じてエラー コードを変更してください。
                wprintf(L"致命的なエラー: MFC の初期化ができませんでした。¥n");
                nRetCode = 1;
            }
            else
            {

                //構造体可変配列を宣言
                CArray <sctPopulation> sctpop;

                //東京都の都市別人口を構造体可変配列にセット
                setPopulation(&sctpop);

                //構造体可変配列の内容をコンソールに出力
                for (int i = 0; i < sctpop.GetSize(); i++)
                {
                    printf(" %-20s %9d人¥n", sctpop.GetAt(i).urban, sctpop.GetAt(i).ipopulation);
                }

                //コマンドプロンプト画面が閉じないようにする
                system("pause");
            }
        }
        else
        {
            // TODO: 必要に応じてエラー コードを変更してください。
            wprintf(L"致命的なエラー: GetModuleHandle が失敗しました¥n");
            nRetCode = 1;
        }

        return nRetCode;
    }

     

    /*************************************************
    関数名 setPopulation
    機能   可変構造体配列に東京都都市別人口データを設定
    出典   総務省統計局「都市別人口」
    *************************************************/

    void setPopulation(CArray<sctPopulation> *sctpop)
    {
        CString cbuf,cdat;
        
        sctPopulation wkpop;
        sctpop->RemoveAll();

        char *urbanPopulation[] = {
            "千代田区,56873",
            "中央区,138088",
            "港区,240585",
            "新宿区,327712",
            "文京区,207413",
            "台東区,189795",
            "墨田区,258423",
            "江東区,493952",
            "品川区,372077",
            "目黒区,269689",
            "大田区,707455",
            "世田谷区,874332",
            "渋谷区,217008",
            "中野区,316625",
            "杉並区,547165",
            "豊島区,275507",
            "北区,338084",
            "荒川区,209087",
            "板橋区,544172",
            "練馬区,714656",
            "足立区,674111",
            "葛飾区,449527",
            "江戸川区,680262",
            "八王子,562572",
            "立川,179090",
            "武蔵野,142138",
            "三鷹,182092",
            "青梅,137052",
            "府中,254551",
            "昭島,112727",
            "調布,224191",
            "町田,426648",
            "小金井,117427",
            "小平,186958",
            "日野,180975",
            "東村山,151412",
            "国分寺,119379",
            "国立,74558",
            "福生,58553",
            "狛江,79096",
            "東大和,86162",
            "清瀬,74374",
            "東久留米,116494",
            "武蔵村山,72092",
            "多摩,147486",
            "稲城,86594",
            "羽村,56604",
            "あきる野,81697",
            "西東京,198267",
            "0"
        };

        for (int i = 0;; i++)
        {
            //ループ終了条件("0"が出現したらデータセット終了)
            if (strcmp(urbanPopulation[i], "0") == 0) break;

            //対象インデックスの文字列を取得
            cbuf = urbanPopulation[i];

     

            //cbufの1カラム目(都市名)をセット
            AfxExtractSubString(cdat, cbuf, 0, ',');
            //CStringをLPCSTRへマクロを使って変換する
            strcpy_s(wkpop.urban, CT2CA(cdat));

     

            //cbufの2カラム目(人口)をセット
            AfxExtractSubString(cdat, cbuf, 1, ',');
            wkpop.ipopulation = atoi(CStringA(cdat));

     

            //構造体可変配列にセット
            sctpop->Add(wkpop);
        }
        return;
    }

     

    よろしければポチッと押してください


    プログラマー ブログランキングへ

     



    calendar

    S M T W T F S
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
    << November 2017 >>

    profile

    others

    mobile

    qrcode