2013年7月27日 星期六

小山的 C# 教學-第21課-借還錢模擬小程式(下)

本課簡介

本課延續上一課的教學
利用物件導向的方式來完成「借還錢程式」的程式碼部分

教學影片

注意:影片有高畫質 720P 的選項,可以看得更清楚喔!



重點提示

1. 在紀錄資料的時候,可以盡量使用 class 包起來。除了方便管理之外,以後需要大量增加也比較容易

2. class 內的「變數」可以想成「屬性」,method 則可以想成「行為」

3. class 可以藉由 constructor 來強迫使用者在建立物件的時候輸入某些參數來初始化

4. class 內可以互相呼叫自己的 method

練習

1. 我的朋友真可憐呢!每次都是我跟他借錢,這次他也想借錢了!你是否可以修改這支程式,新增兩個按鈕,然後加入朋友借還錢的功能?

2. 承上題,這個程式還有個問題,還錢的時候是看自己有多少錢,然後就可以還多少。但是這樣不太對,應該是借多少還多少吧?是否可以在程式中多顯示一道資訊,記錄我現在一共借了多少,而還錢的時候不可以超過這筆錢這樣?

3. 借錢怎麼可以只借固定數目哩?那我要借 100000,不就得借 100 次?請新增 NumericUpDown 的元件,來控制借還錢的數目。

28 則留言:

  1. 不好意思 我又來找碴了@@

    小弟對C#的陣列不是很了解

    不知道該怎麼寫陣列

    我這邊有個AS3.0的陣列使用方式

    可否請老師指導一下怎麼改成C#的格式

    package {

    import flash.display.MovieClip;


    public class test extends MovieClip {

    public var a:Array = new Array();
    public function test() {
    // constructor code
    get_all_infor(1,"小山","看起來是個好老師"); //存入訊息

    trace(""+a[0].id+","+a[0].strName+","+a[0].readme);
    }

    public function get_all_infor(_id:int,_strName:String,_readme:String)
    {
    var o_a:Object = new Object();
    o_a = {id:_id,strName:_strName,readme:_readme}
    a.push(o_a);

    }

    }

    }

    回覆刪除
    回覆
    1. 其實我下一課就要教陣列了,最慢明天晚上會出來

      至於閣下提供的程式碼
      老實說我沒有學過 AS3.0
      不過就我的經驗來看,這是屬於「弱型別 Week Type」的程式語言
      也就是說,你宣告變數的時候不需要指定他的型別
      就這點來看 AS3.0 與 C# 就很不一樣了

      而且你也不需要定義 class 的內容就可以插入變數
      這些都是 C# 沒有支援的功能

      總之等我下一課出來之後,你可能就會發現這兩者在陣列的使用上會有些差別
      (例如 C# 的陣列大小是固定的)

      刪除
    2. 其實我的意思是說,要轉成 C# 程式碼沒問題
      只是要注意有些細節可能會很不一樣

      刪除
  2. 想請問一下 假設把array當作一個class
    如上面的 內有id strName readme這些屬性
    如老師說的放個一兩個可以控制還好
    大量是透過本身的 class方法做預設
    那如何同時控制大量的這些數據呢
    像S.id是 小山的id
    如果有100個學生
    有類似用編號的方式
    XXX[0].id =小山的id
    XXX[1].id =某某的id...之類的方法嗎?

    今天在看別人撰寫的程式碼
    http://www.360doc.com/content/10/0510/17/1090703_26933072.shtml
    public frmLogin(ref UserInfo ui)
    {
    InitializeComponent();
    uiLogin = ui;
    }
    ref <-- 不太懂它的用途

    debug會說可訪問性不一致參數類型 "ref login.UserInfo"
    比方法 "login.frmLogin.frmLogin(ref login.UserInfo)"的訪問性低

    frmLogin有藍色水波底線

    謝謝

    回覆刪除
    回覆
    1. 後來暫時先把傳入的ref UserInfo ui部分先拿掉
      就暫時可以執行了
      但是還是不太懂這裡面是甚麼

      刪除
    2. 關於第一個問題,會在下一個教學影片獲得解答
      至於別人撰寫的程式碼,我剛剛看了一下
      ref 這個修飾字,這是很進階的東西
      短期內不會教到,不過我認為它在這個程式碼中的作用不大
      所以其實只單獨刪除 ref 理論上沒有影響(有兩個地方,都要刪掉)

      刪除
    3. 好的期待老師的影片 謝謝

      刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. 作者已經移除這則留言。

    回覆刪除
  6. 請問,為什麼以下寫法run出來會有問題:
    public void Repay(Person lender, int money)
    {
    if (lender.Money <= money) //小山使用方法: if(this.Money >= money)
    {
    lender.Money += money;
    this.Money -= money;
    }
    }

    回覆刪除
  7. 請問一下老師
    我做一個了TextBox,想要輸入一個數值,但它是一個字串!
    請問怎樣把string 轉 int?
    如果有一天我又想把 int 轉 string 又怎麼辦?

    回覆刪除
    回覆
    1. 用 Int32.Parse(str)
      str 換成你要解析的字串
      相關文件可以參考這裡:https://msdn.microsoft.com/zh-tw/library/b3h1hf19%28v=vs.110%29.aspx

      刪除
  8. 作者已經移除這則留言。

    回覆刪除
  9. 請問一下老師
    我做好了一個程式
    可不可以建立一個檔案
    然後打開檔案就可以看到我程式的視窗
    就不用每次都打開visual studio看程式碼了
    如果可以的話要怎麼使用呢?

    回覆刪除
    回覆
    1. 你可以找一下你的程式碼放在哪裡
      在同一個目錄下可以找到一個叫做 Debug 的資料夾
      裡面會包含一個跟你專案名稱相同的 exe 檔案
      點那個就可以直接跑

      刪除
  10. 請問查詢成績的程式要怎麼做

    回覆刪除
    回覆
    1. 這個問題好像無法用一兩段話回答
      你可以描述地精確一點嗎?

      刪除
  11. 小山老師您好:
    首先先謝謝你這麼認真教學,
    我想請問我在做練習題最後一題時,我的NumericUpDown 都只能到100是甚麼原因呢?
    100以內都可以 超過100他都會自動回到100.
    謝謝您

    回覆刪除
    回覆
    1. 關鍵在於 NumericUpDown 有一個屬性叫做 Maximum,如果你去查一下這個單字的意思就會知道是「最大值」。你可以藉由調整那個數值來控制你的元件最高可以調到多少。

      刪除
    2. 小山老師你好 請問我可以把最大值調到無限嗎 謝謝

      刪除
  12. 老師您好:

    學習到這裡我有個困擾想請問
    我每次在設計界面時, 假設這次的作業第三小題目我設計了一個 NumericUpDown 工具項目
    如果我在這個設計項目上面點兩下, 則會產生下列的程式碼在我的 Form1 裡面:

    private void perBorrowandRepayMoneyInput_ValueChanged(object sender, EventArgs e)
    {

    }

    像這次的作業我發現只要取得這個 NumericUpDown 的 Value 值就可以完成第小項目三的功課
    那麼我該如何把我的 Form1 裡面那個誤點兩下產生的物件碼給完整移除呢
    我發現只是把它刪除掉執行程式就會發生錯誤, 看這段 ID 自己產生的程式碼 又挺礙眼的...

    還是產生了就無法去除呢

    麻煩老師指導了
    謝謝~

    回覆刪除
  13. 小山老師我算是剛學C#對於你的練習題我有點不懂你有練習的程式影片讓我學習瞭解嗎?

    回覆刪除
  14. 小山你好~

    關於此課的練習二:「記錄我現在一共借了多少,而還錢的時候不可以超過這筆錢這樣?」

    想請問關於這道題目有沒有更快/簡潔一點的方式?
    目前是使用
    【  在還錢的按鈕下設定條件
      (目前金額-初始金額)=>得出所借金額,
       若所借金額<要還金額 ,就會跳出警示,不得還錢。 】

    這道題目是否有用class做的可能性呢? 非常謝謝

    =========================程式碼節錄==================================

    private void repaybutton_Click(object sender, EventArgs e)
    {

    int mealreadyborrowamount = ((int)me.money - (int)mymoneyinput.Value);
    if (mealreadyborrowamount < (int)moneyamount.Value)
    {
    MessageBox.Show(" 我沒有借那麼多錢啊");
    }
    else
    {
    me.Repay(friend, (int)moneyamount.Value);
    updatemoney();
    }
    }
    =========================程式碼節錄==================================

    Email:gn337711@gmail.com

    回覆刪除
  15. 不敢相信練習題自己沒看答案就解出來了!

    回覆刪除