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;
    }
}