2009年12月6日日曜日

構造体をパラメータとして、さらにこれまでの学習を復習するために配列、例外処理も使用してみる。

using System;

// 構造体
struct Member
{
    public string name;
    public int age;
    public string country;

    // パラメーター付きコンストラクタ
    public Member(string n, int a, string c)
    {
        name = n;
        age = a;
        country = c;
    }
}

// 構造体の配列をメンバに持つクラス
class Group
{
    // 配列asiaにコピーしたデータ数
    int asiacnt;

    // Member型の配列 サイズ5
    Member[] asia = new Member[2];

    // 配列asiaに構造体のパラメータを追加
    public bool addAsia(Member c)
    {

        // 配列のサイズにまで追加
        if (asiacnt < asia.Length)
        {
            // Member型のデータをコピー
            asia[asiacnt++] = c;
            return true;
        }
        return false;
    }

    // 配列asiaの要素を表示
    public void displayAsia()
    {
        foreach (Member m in asia)
        {
            // countryがないものは表示しない
            if (m.country != null)
            {
                Console.WriteLine("{0} {1} {2}",
                    m.name, m.age, m.country);
            }
        }
    }

    // 配列asiaの要素を返す
    public Member getAsia(int x)
    {
        try
        {
            return asia[x];
        }
        catch(Exception error)
        {
            // 例外の原因の詳細情報を表示
            Console.WriteLine(error.Message);
            // 例外の場合は空のMemberを返す
            return new Member();
        }
    }
}

class MainClass
{
    static void Main()
    {
        Group g = new Group();

        // Member型のデータを追加
        g.addAsia(new Member("Kamimura",10,"日本"));
        g.addAsia(new Member("Kamimura1",20,"中国"));
        g.addAsia(new Member("Kamimura2",30,"韓国"));

        /* 追加したMemberを表示
         * 配列のサイズを2にしたのでKamimura2 30 韓国は
         * 表示されない */
        g.displayAsia();

        // インデックス0のメンバを取得
        Member m = g.getAsia(0);
        // 取得したメンバのcountryを表示
        Console.WriteLine(m.country);

        // インデックスのサイズ2を超えた場合
        m = g.getAsia(10);
        /* 例外の原因の詳細情報が表示されてから
         * 何も表示されない行が出力される */
        Console.WriteLine(m.country);
    }
}

0 コメント:

コメントを投稿