課題の進め方

基本的には適当なプロジェクト/ソリューションを作って課題を進めた上で,Program.csのみ(特に他に指示がなければ)を提出する.

他の人(受講者・非受講者両方)に解答内容(一部でも)を見せない,そして他の人の解答内容(一部でも)を見ないようお願いします.特に,公開の場所に解答を置かないようお願いします.githubやbitbucket等は使える人は使えばよいと思いますが,privateレポジトリにするようにお願いします.

プロジェクト/ソリューションの作成

Note

再掲:プロジェクトは一つの実行形式やライブラリを作成するためのコード等を全てまとめたものであり,ソリューションは関連するプロジェクトをまとめたもの(参考:What are solutions and projects in Visual Studio).

適当な名前(たとえば課題3の解答なのでQ3にするなど)のフォルダを適当な場所に作成し, VSCodeで作成したフォルダを開く.そして,VSCode内のターミナルで以下を実行する.

dotnet new console -o .

課題の実施

Program.cs を問題文の指示の通りに編集する(提出・採点手続きの簡略化のため提出する.csファイルは一つのみ).作成した.csファイルには先頭部分に学籍番号と名前をコメントとして含めること.なので,たとえば学籍番号Z0TB9999の東北 大学さんの提出ファイルは

// Z0TB9999
// 東北 大学

という行から始まる.

提出

できあがった Program.csをClassroom内の当該回の「課題」より提出する.最初のステップで作成したフォルダにあるはず.また問題文に指示がある場合はそのファイル(例:課題4のitems.txt)も提出する.提出前には以下を確認しよう.

基本課題

以下のProgram.csを適切に埋めて,プログラム完成させよ.

// あなたの学籍番号
// あなたの名前
using System; 

// 電子マネーカード
class EmoneyCard 
{
    // 残高
    private int balance;
    // カードの名前
    private string name; 

    public EmoneyCard(string n) 
    {
        // この中身を実装する
        //
        // 名前がnで残高が0のEmoneyCardを作成する
    }

    public void Charge(int b) 
    {
        // この中身を実装する
        // 金額 b(≧ 0と仮定してよい)を残高に加算する.
    }
    public bool Pay(int b) 
    {
        // この中身を実装する
        // 残高が金額 b(≧ 0と仮定してよい) 以上であれば,残高をb減らし true を返す
        // そうでなければ,残高は変更せず false を返す

        // 下の行はCS0161エラーを防ぐため.後で消してよい(し消さなくてもよい) 
        // https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0161
        return false; 
    }
    public void Print() 
    {
        // この中身を実装する
        //
        // 「<カードの名前>: <残高>」を改行付きで標準出力に出力する.
        // たとえばカードの名前が "MyCard" で残高が 500 であれば,
        // "MyCard: 500"を改行付きで標準出力に出力する.
    }
}

// この部分は変更しない
class Program 
{
    static void Main(string[] args) 
    {
        EmoneyCard ec = new EmoneyCard("MyCard"); 
        ec.Charge(100);
        ec.Print(); 
        if (ec.Pay(500)) 
        {
            Console.WriteLine("payment succeeded");
        }
        else 
        {
            Console.WriteLine("payment failed"); 
        }
        ec.Charge(1000);
        ec.Print(); 
        if (ec.Pay(500)) 
        {
            Console.WriteLine("payment succeeded");
        }
        else 
        {
            Console.WriteLine("payment failed"); 
        }           
        ec.Print(); 

        if (ec.Pay(600)) 
        {
            Console.WriteLine("payment succeeded");
        }
        else 
        {
            Console.WriteLine("payment failed"); 
        }           
        ec.Print(); 
    }
}

正しく実装できれば以下が出力される.

MyCard: 100
payment failed
MyCard: 1100
payment succeeded
MyCard: 600
payment succeeded
MyCard: 0

発展課題

Important

本課題を完了できたのならば本課題の解答のみを提出すればよく,基本課題の解答は提出する必要はない.

基本課題で作成したクラス EmoneyCard に以下のメソッドを追加せよ.

メソッド 実装すべき挙動
public bool TransferFrom(EmoneyCard ec, int b) このメソッドは,ec の残高が b(≧ 0と仮定してよい)以上であれば,ecの残高をb減らし,自身の残高をb増やし,trueを返す.そうでなければ,falseを返す.

ヒントec.Pay(int b)Charge(int b)を使う?

また,ProgramクラスのMainメソッドを以下のように変更せよ.

static void Main(string[] args) 
{ 
    EmoneyCard ec1 = new EmoneyCard("Card1"); 
    EmoneyCard ec2 = new EmoneyCard("Card2"); 

    ec1.Charge(100);
    ec2.Charge(100);
    ec1.Print();
    ec2.Print();
    if (ec1.TransferFrom(ec2, 300)) 
    {
        Console.WriteLine("transfer succeeded"); 
    } 
    else 
    {
        Console.WriteLine("transfer failed"); 
    }

    ec2.Charge(1000);
    ec1.Print();
    ec2.Print();

    if (ec1.TransferFrom(ec2, 300)) 
    {
        Console.WriteLine("transfer succeeded"); 
    } 
    else 
    {
        Console.WriteLine("transfer failed"); 
    }
    ec1.Print();
    ec2.Print(); 

    if (ec2.TransferFrom(ec1, 400)) 
    {
        Console.WriteLine("transfer succeeded"); 
    } 
    else 
    {
        Console.WriteLine("transfer failed"); 
    }
    ec1.Print();
    ec2.Print(); 
}

そのとき,以下の出力が得られることを確認せよ.

Card1: 100 
Card2: 100 
transfer failed 
Card1: 100 
Card2: 1100 
transfer succeeded 
Card1: 400 
Card2: 800
transfer succeeded 
Card1: 0 
Card2: 1200