2010年12月6日 星期一

2010列印機

1


2








橫行來看 公式為 n+2



n代表了要印的"空格"或"底線"的數量,+2則為兩側的紅色的空格

每個數字都是用這種格式的

所以利用

for ( int i = 0; i < int.Parse(input); i++)
{
space += " ";
baseLine += "_";
}












就算繼續增大2010得尺寸變成3












部件的數量永遠都是n-1,所以當n=1時就沒有部件了

使用

for ( int i = 0 ; i < n-1 ; i++)
Console.WriteLine(" " + space + "|" + "|" + space + "|" + " " + space + "|" + "|" + space + "|");
//此為部件1的搭配

有幾個部件就印幾次部件

依照
Console.WriteLine(頂端 )
Console.WriteLine(部件 1) (用for印n-1次)
Console.WriteLine(中間 )
Console.WriteLine(部件2 ) (用for印n-1次)
Console.WriteLine(底端)

這樣就能用短短的程式,印出2010了!!

咖啡促銷


買二杯中美式咖啡,可以有一杯免費小美式咖啡。
買二杯大美式咖啡,可以有一杯免費中美式咖啡。
買二杯中拿鐵,可以有一杯免費小拿鐵或小美式咖啡,以小拿鐵優先免費。
買二杯大拿鐵,可以有一杯免費中拿鐵或中美式咖啡,以中拿鐵優先免費。


根據上面的條件來看,可以得知大美式與大拿鐵的數量不會改變
會改變的是中拿鐵、小拿鐵、中美式、小美式,所以我們只要從此下手
美式咖啡 比較複雜 他需要考量到自己的優待數量以及拿鐵是否會有剩餘的優待

以中美式來說,它的可優待數量為


int free = American_L / 2;
if (Latte_L / 2 - Latte_N > 0)
{
free += Latte_L / 2 - Latte_N;
}


American_L / 2 為自己大美式的可優待數量
Latte_L / 2 - Latte_N > 0 如果大拿鐵的優待數量 - 中拿鐵的數量還有剩餘的話
free就加上大拿鐵剩餘的優待數量
再用中美式的數量去扣除掉可優待的數量,但也要注意中美式的數量夠不夠優待喔!!
不然會變成負數產生錯誤喔,小美式跟中美式的處理方式是相同的

再來處理中拿鐵

中拿鐵的數量 = 中拿鐵 - 大拿鐵/2 (即是可優待的數量)

if (Latte_N - (Latte_L / 2) > 0)
{
Latte_N = Latte_N - (Latte_L / 2);
}
else
Latte_N = 0;


這樣就大功告成了,小拿鐵也是依此類推

這道題目就這樣就能寫完了

還有一點很重要,就是"處理的順序"

用這種解法必須從中美→中拿

舉個例來看看

6 2 1 0 2 1

6 0 1 0 1 1(結果)

如果先從拿鐵先扣除 會變成 6 0 1 0 2 1 (美式的還沒計算到)

處理美式的時候會發現 Latte_L / 2 - Latte_N

此時的拿鐵中的數量被改變了

所以會出錯 變成 6 0 1 0 0 1

所以要在拿鐵改變前先算出 拿鐵"多餘"的優待數量

跟題目要求的以拿鐵優先免費並不相衝

還是以拿鐵先免費掉,多餘的再去免費掉美式

當然用其他種寫法也可以從拿鐵先下手

2010年11月6日 星期六

作業一:簡易訂單作業(解題)

C#語言中的欄位和屬性經常不容易學通,這個題目也是希望能提供一個練習製作屬性的機會。 設計Price屬性時需要根據是否含稅來決定取得的售價Price。

計算單筆訂單價格時,只要呼叫Order的物件方法,例如o.CalcPrice(),即可獲得訂單價格, 題解的C#程式碼中,關於Product與Order類別的設計如下:

struct Product
{
    public string Name;
    public bool Taxable;
    public double Price
    {
        set { price = value; }
        get
        {
            if (Taxable)
                return price * 1.05;
            else
                return price;
        }
    }
    double price;
}
class Order
{
    public Product[] ProductList;
    public int[] AmountList;
    protected int x;
    public static int OrderCount = 0;
    public Order(int n)
    {
        ProductList = new Product[n];
        AmountList = new int[n];
        OrderCount++;
    }
    public static double CalcTotalPrice(Order[] ol)
    {
        double sum = 0;
        foreach (Order o in ol)
        {
            sum += o.CalcPrice();
        }
        if (sum <= 5000)
            return sum;
        else
            return (int)sum /100 * 100;
    }
    public double CalcPrice()
    {
        double sum = 0;
        for (int i=0;i<ProductList.Length;i++)
        {
            if (AmountList[i]<10)
                sum += ProductList[i].Price * AmountList[i];
            else if (AmountList[i]>=10 && AmountList[i]<25)
                sum += ProductList[i].Price * AmountList[i] * 0.9;
            else
                sum += ProductList[i].Price * AmountList[i] * 0.8;
        }
        return sum;
    }
}

小考二:公式計算(解題)

這兩個題目都在應用for迴圈,在執行n次循環時,進行累加的工作。

小考二(A)

在for迴圈中以i為計數器,並使用奇偶數判斷加或減。 C#程式碼解題重點如下
    if (i % 2 == 0) 
        sum -=  Math.Sin(i) / (Math.PI * i);
    else 
        sum += Math.Cos(i) / (Math.PI * i);

小考二(B)

這題在for迴圈中以i為計數器,C#程式碼解題重點如下
sum += Math.Pow(i, -3) + Math.Sin(i / (2 * Math.PI));

作業二:數字解謎(解題)

這個題目主要是能夠將每一個位數值相加,下列C#程式碼由蔡宥安 提供,就是將原數除以10,在加上個位數。
int m = i;
while (m >= 10)
{
    m = m % 10 + m / 10;
}

小考二:ArrayList物件處理

小考二:ArrayList物件處理

  1. 建立一個Car類別,內有三個公用欄位,車主姓名Owner、廠牌Brand和年份Year。
  2. 設計一個靜態方法,頭部為
  3. static void RemoveByName(ArrayList alist, string name)
    實作此一方法,用以刪除alist中車主名字為name的Car物件。
  4. 另外,在主程式中自行新建四個Car物件,並宣告一個ArrayList變數,命名為CarList。並呼叫RemoveByName以成功刪除一筆資料。

作業二:數字解謎

作業內容

一、本次作業主要內容在進行數值計算,將一個數字的位數值進行加總, 若加總後的數字大於10,則再進行位數值加總,直到剩下個位數n, 將原來的數字乘上2,再除以3,重複n次的整數運算,得到m
二、例如計算47,4+7得11,1+1得n為2,所以將47*2/3*2/3(進行二次*2/3計算),得m為20。

輸出與輸入

一、輸入每一行為一筆測試資料,每一行有兩個整數a和b,且a<=b,計算a與b之間的每個數字的m值(包含a與b)。
二、每行輸出有一個整數輸出,列印出a和b之間(包含a與b)最大的m值。

範例

Input:
47 50
123456 123465
123456789 123456879
Output:
20
82308
82304580

小考二:公式計算

小考二(A)

輸入一個整數n,計算下列公式值
輸出入範例
Input
22
Output
0.000990063958331312

小考二(B)

輸入一個整數n,計算下列公式值
輸出入範例
Input
22
Output
13.1633367828221

2010年10月14日 星期四

作業二:數字排列

作業目的

程式邏輯與方法運用

作業內容

本作業在製作二個靜態方法,一個叫做SortData ,無傳回值,傳入為一個ref 整數,輸出時將輸入參數進行排序, 排序方式是將傳入整數的每個數字重新由大排到小,例如傳入參數2303998,輸出時參數就變成9983320。
另一個靜態方法,叫做Add2Sort,傳回一個整數值,傳入兩個整數, 傳回的值是將兩個傳入整數分別經過SortData方法排序後, 進行相加,相加的和經過SortData處理後,再傳回來。

輸出入格式

輸入每一行為一個題目,輸入為兩個整數a,b,a和b均小於230,並以空白相隔。
輸出時每個問題輸出一個整數。

範例

Input:
23110 123
808 303
Output:
43321
2110

小考一:宿營

小考一(A)

小明從營地出發,以每小時3.5公里速度向東北走了2小時,然後又向東走了x小時,請計算出小明距離營地的距離。

小考一(B)

小明從營地出發,以每小時3.5公里速度向東走了x小時,然後又向東南走了2小時,請計算出小明距離營地的距離。

輸出輸入

輸入:為一個小數。
輸出:也是一個小數。

作業一:咖啡促銷

作業目的

選擇邏輯練習

作業內容

一、某便利商店進行咖啡促銷活動,促銷咖啡有兩種,一個美式咖啡、一個拿鐵,活動內容如下:
  • 買二杯中美式咖啡,可以有一杯免費小美式咖啡。
  • 買二杯大美式咖啡,可以有一杯免費中美式咖啡。
  • 買二杯中拿鐵,可以有一杯免費小拿鐵或小美式咖啡,以小拿鐵優先免費。
  • 買二杯大拿鐵,可以有一杯免費中拿鐵或中美式咖啡,以中拿鐵優先免費。
  • 拿鐵大、中、小售價分別為50、40、30元。
  • 美式咖啡大、中、小售價分別為45、35、25元。
二、請寫一個程式,計算購買咖啡的總價

輸出與輸入

一、輸入每一行為一筆測試資料,共有六個大於零的整數值,以空白相隔, 分別代表大拿鐵、中拿鐵、小拿鐵、大美式、中美式、小美式的 數量。
二、每行輸出有一個整數輸出,代表總售價。

範例

Input:
0 0 0 0 0 1
1 2 3 4 5 6
2 0 0 3 2 1
0 0 2 0 2 2
0 5 0 2 0 1
Output:
25
600
260
155
290

2010年10月7日 星期四

小考一:溫度類別的設計

設計一個類別Temperature,內有一個公用欄位,為度量單位Unit,代表攝氏或華氏。另外有一個公用屬性為溫度值Degree,負責存取私用欄位degree。degree儲存的值是攝氏的值。當存取Degree值,以Unit來判斷應該設定/讀取攝氏的度數、或華氏的度數。

建立二個建構子,一個有一個參數、一個有兩個參數。

一個參數時,輸入為度數,用來設定degree,Unit預設為攝氏。

二個參數時,輸入為度數與度量單位,用來設定Degree,與Unit。

Main主程式內容如下,以測試類別Temperature的正確性。

Temperature t1 = new Temperature(30);
Temperature t2 = new Temperature(“F”, 50);
t1.Unit = “F”;
Console.WriteLine(t1.Degree);
Console.WriteLine(t2.Degree);
t2.Unit = “C”;
Console.WriteLine(t2.Degree);

華氏與攝氏溫度轉換公式為:華氏溫度=(攝氏溫度×9)÷5+32

2010年10月2日 星期六

如何紀錄宣告物件的數量

在許多程式設計實例中,經常需要知道某特定類別在目前已經宣告了多少物件,這時就需要宣告一個靜態(static)的欄位來記錄宣告物件的總數,當物件呼叫建構子(constructor)建立新的執行個體時,將這個紀錄值累加就行了。例如下列的C#程式碼範例
    class Point
    {
        public int x, y;
        private static int pointCount = 0;
        public Point()
        {
            pointCount++;
        }
        public Point(int x, int y)
            : this()
        {
            this.x = x; this.y = y;
        }
    }

這個範例有兩個建構子,第一個無參數建構子在呼叫時會將pointCount累加;第二個兩參數建構子呼叫this(),表示在執行該建構子區塊前,會先呼叫無參數建構子,也就會累加pointCount,這種方式就可以紀錄以建構子建立執行個體的次數。

說明與建議

  • 這僅能從類別中知道物件數量,並無法知道各個物件的內容。
  • 為避免pointCount被意外覆寫,宣告為private,若需讀取此值,可另建方法傳回此值。
  • 當某些物件不再使用時,可覆寫物件的Finalize()方法,並將pointCount累減。
  • 當物件設定為null時,pointCount不會自行累減。若要將pointCount累減,必須將pointCount宣告為屬性,即可在set區塊中,判斷value為null時,將pointCount累減。

2010年9月30日 星期四

C#語言欄位(field)與屬性(property)的比較

程式設計初學者若第一個語言學的是C語言,則學到C#語言的欄位(field)與屬性(property)時,會很容易將這兩者混淆。
  • 欄位就像是一般的變數,它與區域變數不同的地方在修飾詞的使用。因為欄位是類別或結構型態的成員,所以就需要設定成員存取修飾詞。而一般的區域變數宣告在方法之中,不需要也不能使用修飾詞。
  • 欄位與屬性在某種應用程度上是相同的,例如下列x與y,此二個成員在物件中使用時,並無差異。
  • // 欄位
    public int x;
    // 屬性
    public int y {get; set;}
    
  • 屬性是可以提供完整控制的變數,例如讓變數只能讀、或只能寫;讀寫時,能根據需要進行驗證或計算的工作。欄位則是單純的變數,可用readonly修飾詞設定唯讀,但是值不能有延伸變化。
  • 在實作時,屬性常為公用,並控制著一個私用的欄位,在下面例子中,公用屬性Price,提供價格的存取,取出時,另外加上5%的稅額。真正的值則存在私用欄位price中。
  • // 私用欄位
    private double price;
    // 屬性
    public double Price
    {
       get { return price*1.05; }
       set { price = value; }
    }
    
  • 欄位不能使用virtual, override, sealed, abstract等修飾詞,因此子類別繼承時,直接繼承欄位。屬性則可在子類別繼承後,再視需要予以變化。

2010年9月20日 星期一

作業一:簡易訂單作業

作業目的

程式邏輯練習與類別方法運用

作業內容

本作業在製作一個簡易的訂單處理系統,你必須在命名空間下設計一個結構為產品Product,一個類別為訂單Order。
產品包含
• 一個欄位表示產品名稱,命名 Name
• 一個欄位表示是否要附加 5% 營業稅,命名 Taxable
• 一個屬性表示產品價格,命名 Price
訂單包含
• 一個產品Product陣列,命名 ProductList
• 一個訂購數量int陣列,命名 AmountList
• 一個靜態欄位,紀錄全部訂單數量,命名 OrderCount
• 一個靜態方法,計算所有訂單加總後的金額,參數為一個訂單Order陣列,傳回double,命名 CalcTotalPrice
• 一個非靜態方法,計算單筆訂單的金額,無參數,傳回double,命名 CalcPrice
產品價格Price 設定時為原價,取出時是以Taxable欄位決定是否附加5%營業稅
訂單方法CalcPrice 在計算時,若單一商品數量超過(大於等於)10,則打九折;若超過(大於等於)25,則打八折計價
訂單方法CalcTotalPrice在計算時,若總金額超過5000時,則四捨五入到百位數,例如總價為6235元時,以6200元計價

輸出入格式

輸入第一行為題目數量n,n<=20,接下來會有n個題目;每一個題目的第一行為訂單的數量m,m<=30,接下來會有m筆訂單;每一個訂單的第一行為該訂單中筆數p,p<=10,接下來會有p筆產品訂購資訊,一筆產品訂購資訊在一行中有四項輸入值,分別為名稱、是否算稅(yes/no)、單價、與數量,並以空白相隔。
輸出時每個問題輸出每筆訂單的總額,與全部訂單的原價、稅額與總額,格式如範例。

範例

Input:
2
3
2
Apple no 45 10
Cup yes 99 50
1
Cup yes 99 15 
4
Cup yes 99 15
Apple no 45 8 
Banana no 25 30 
Coffee yes 150 35 
2
2
Apple no 45 8 
Banana no 25 25 
5
Apple no 45 14 
Banana no 25 5 
Coffee yes 150 16 
Ball yes 70 11
Cup yes 99 2
Output:
Case #1:
  Order #1 total price is 4563
  Order #2 total price is 1403
  Order #3 total price is 6773
  Order Total:12700
Case #2:
  Order #1 total price is 860
  Order #2 total price is 3896
  Order Total:4756

2010年9月17日 星期五

搶先試讀

C#程式設計學以致用

這本書在第二章以程式範例開始,介紹突破學習程式的第一個障礙。

請下載:初學者必讀的第2章

2010年9月6日 星期一

學寫程式的三個障礙

經多年程式設計教學與撰寫程式解決實際問題的經驗累積,再回頭檢視初學者學習程式設計常遭遇的障礙,將之歸納有三。
  • 障礙一:傳統數學與程式邏輯的混淆,如「等號」與「等於」在遭遇「x = x + 1」指令時,若認知錯誤將無法收拾後果。
  • 障礙二:無法將「問題」轉換成「邏輯」,每當問題出現在”如果”的敘述中,初學者很難將這些問題轉換成算術、比較或邏輯的條件句。
  • 障礙三:無法體會迴圈中變數的變化,因迴圈的重覆執行所產生迴圈中的變數變化,外觀上看不出來,也很難在心中體會其道理。

2010年9月5日 星期日

關於本書


國家圖書館出版品預行編目(CIP)資料

目錄
  1. 認識程式語言
  2. C#語言初探
  3. 運算子與運算式
  4. 選擇結構
  5. 循環結構
  6. 字串與陣列
  7. 類別與結構型態
  8. 欄位、屬性與方法
  9. 集合與列舉型態
  10. 錯誤與例外處理
  11. 繼承
  12. 介面
  13. 檔案輸出輸入
  14. 索引子與運算子
  15. 委派與事件
  16. 泛型