課題の進め方
基本的には適当なプロジェクト/ソリューションを作って課題を進めた上で,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
になっているか - 提出するファイルに学籍番号と名前がコメントとして含まれているか
- 文献やWebサイトを参考にした場合は文献の情報やURLおよびアクセス日に加えて元文献のどの部分を参考にしたのかがコードの当該箇所付近のコメントとして記述されているか
- 友人と相談した・された場合はその友人の名前および大雑把な相談の内容がコメントとして書かれているか
- ただし,友人の解答を見ない,そして友人に解答を見せないようお願いします
- TA・教員と相談した場合は,その旨と大雑把な相談の内容がコメントとして書かれているか
基本課題
以下の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)
{
= new EmoneyCard("MyCard");
EmoneyCard ec .Charge(100);
ec.Print();
ecif (ec.Pay(500))
{
.WriteLine("payment succeeded");
Console}
else
{
.WriteLine("payment failed");
Console}
.Charge(1000);
ec.Print();
ecif (ec.Pay(500))
{
.WriteLine("payment succeeded");
Console}
else
{
.WriteLine("payment failed");
Console}
.Print();
ec
if (ec.Pay(600))
{
.WriteLine("payment succeeded");
Console}
else
{
.WriteLine("payment failed");
Console}
.Print();
ec}
}
正しく実装できれば以下が出力される.
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)
{
= new EmoneyCard("Card1");
EmoneyCard ec1 = new EmoneyCard("Card2");
EmoneyCard ec2
.Charge(100);
ec1.Charge(100);
ec2.Print();
ec1.Print();
ec2if (ec1.TransferFrom(ec2, 300))
{
.WriteLine("transfer succeeded");
Console}
else
{
.WriteLine("transfer failed");
Console}
.Charge(1000);
ec2.Print();
ec1.Print();
ec2
if (ec1.TransferFrom(ec2, 300))
{
.WriteLine("transfer succeeded");
Console}
else
{
.WriteLine("transfer failed");
Console}
.Print();
ec1.Print();
ec2
if (ec2.TransferFrom(ec1, 400))
{
.WriteLine("transfer succeeded");
Console}
else
{
.WriteLine("transfer failed");
Console}
.Print();
ec1.Print();
ec2}
そのとき,以下の出力が得られることを確認せよ.
Card1: 100
Card2: 100
transfer failed
Card1: 100
Card2: 1100
transfer succeeded
Card1: 400
Card2: 800
transfer succeeded
Card1: 0
Card2: 1200