2012年4月20日金曜日

開発環境

  • Microsoft Windows 7 Home Premium (OS)
  • Microsoft Visual C# 2010 Express Edition (IDE)
  • 言語: C#

独習C# 第3版 ハーバート・シルト (著) エディフィストラーニング株式会社 矢嶋聡 (監修, 翻訳) の第10章(C例外処理)の理解度チェック8を解いてみる。

8.

スタックが空の状態を通知するカスタム例外をテスト。

コード

using System;

public class FullException : Exception
{
    public FullException() :
        base() { }
    public FullException(string str) :
        base(str) { }
    public FullException(string str, Exception inner) :
        base(str, inner) { }
    public FullException(
        System.Runtime.Serialization.SerializationInfo si,
        System.Runtime.Serialization.StreamingContext sc) :
        base(si, sc) { }
}

public class EmptyException : Exception
{
    public EmptyException() :
        base() { }
    public EmptyException(string str) :
        base(str) { }
    public EmptyException(string str, Exception inner) :
        base(str, inner) { }
    public EmptyException(
        System.Runtime.Serialization.SerializationInfo si,
        System.Runtime.Serialization.StreamingContext sc) :
        base(si, sc) { }
    public override string ToString()
    {
        return Message;
    }
}

public class Stack
{
    private char[] s;
    private int loc;
    public Stack(int size)
    {
        s = new char[size];
        loc = 0;
    }
    public Stack(Stack obj)
    {
        loc = obj.loc;
        s = new char[obj.s.Length];
        for (int i = 0; i < s.Length; i++)
        {
            s[i] = obj.s[i];
        }
    }
    public Stack(char[] a)
    {
        loc = 0;
        s = new char[a.Length + 1];
        for (int i = 0; i < a.Length; i++)
        {
            try
            {
                Push(a[i]);
            }
            catch (FullException exc)
            {
                Console.WriteLine(exc);
            }
        }
    }
    public void Push(char ch)
    {
        if (loc == s.Length)
        {
            throw new FullException();
        }
        s[loc] = ch;
        loc++;
    }
    public char Pop()
    {
        if (loc == 0)
        {
            throw new EmptyException();
        }
        loc--;
        return s[loc];
    }
}

class Tester
{
    public void Run()
    {
        Stack s = new Stack(10);
        for (int i = 0; i < 10; i++)
        {
            s.Push((char)('A' + i));
        }
        for (int i = 0; i < 11; i++)
        {
            try
            {
                char ch = s.Pop();
                Console.WriteLine(ch);
            }
            catch (EmptyException exc)
            {
                Console.WriteLine(exc);
            }
        }
    }
    static void Main()
    {
        Tester t = new Tester();
        t.Run();
    }
}

入出力結果(Console Window)

J
I
H
G
F
E
D
C
B
A
種類 'EmptyException' の例外がスローされました。
続行するには何かキーを押してください . . .

スタックがいっぱいの状態を通知するカスタム例外をテスト。

コード

using System;

public class FullException : Exception
{
    public FullException() :
        base() { }
    public FullException(string str) :
        base(str) { }
    public FullException(string str, Exception inner) :
        base(str, inner) { }
    public FullException(
        System.Runtime.Serialization.SerializationInfo si,
        System.Runtime.Serialization.StreamingContext sc) :
        base(si, sc) { }
}

public class EmptyException : Exception
{
    public EmptyException() :
        base() { }
    public EmptyException(string str) :
        base(str) { }
    public EmptyException(string str, Exception inner) :
        base(str, inner) { }
    public EmptyException(
        System.Runtime.Serialization.SerializationInfo si,
        System.Runtime.Serialization.StreamingContext sc) :
        base(si, sc) { }
    public override string ToString()
    {
        return Message;
    }
}

public class Stack
{
    private char[] s;
    private int loc;
    public Stack(int size)
    {
        s = new char[size];
        loc = 0;
    }
    public Stack(Stack obj)
    {
        loc = obj.loc;
        s = new char[obj.s.Length];
        for (int i = 0; i < s.Length; i++)
        {
            s[i] = obj.s[i];
        }
    }
    public Stack(char[] a)
    {
        loc = 0;
        s = new char[a.Length + 1];
        for (int i = 0; i < a.Length; i++)
        {
            try
            {
                Push(a[i]);
            }
            catch (FullException exc)
            {
                Console.WriteLine(exc);
            }
        }
    }
    public void Push(char ch)
    {
        if (loc == s.Length)
        {
            throw new FullException();
        }
        s[loc] = ch;
        loc++;
    }
    public char Pop()
    {
        if (loc == 0)
        {
            throw new EmptyException();
        }
        loc--;
        return s[loc];
    }
}

class Tester
{
    public void Run()
    {
        try
        {
            Stack s = new Stack(0);
            s.Push('a');
            Console.WriteLine(s.Pop());
        }
        catch (FullException exc)
        {
            Console.WriteLine(exc);
        }
    }
    static void Main()
    {
        Tester t = new Tester();
        t.Run();
    }
}

入出力結果(Console Window)

FullException: 種類 'FullException' の例外がスローされました。
続行するには何かキーを押してください . . .

0 コメント:

コメントを投稿