顯示具有 C#語言教學 標籤的文章。 顯示所有文章
顯示具有 C#語言教學 標籤的文章。 顯示所有文章

2010年5月14日 星期五

C98010:作業十:銀行櫃台(解題)

首先將參數帶入函數中,可得到到達時間以及兩名服務員的服務時間的ArrayList使用上可照一般陣列使用只需在前加個強制轉換符號 (int)
得到參數後可以開始解題了,
step1:設一個迴圈讓其可以不斷的執行,直到總服務時間超過480分鐘

step2:首先第一塊判斷式是判斷由p1服務員服務的狀態
需要由p1服務員服務的情況有 當兩人工作時間相同時、p2還在工作的時候以及兩人同時都沒有在工作的情況下,需要由p1服務員服務

if (p1work == p2work || p1work < p2work|| cometotal - p1work >= 0)
{
if (cometotal >= p1work)
{
finish = cometotal + (int)person1[p1];
start = cometotal;
wait = 0;
p1++;
p1work = finish;
}
else
{
finish = p1work + (int)person1[p1];
start = p1work;
wait = p1work - cometotal;
p1++;
p1work = finish;
}
Console.WriteLine(cometotal + " " + start + " " + "p1" + " " + finish + " " + wait);
}

step3:判斷由p2服務,其實這邊上面p1條件寫好,這邊只需要寫else就好

else
{
if (cometotal >= p2work)
{
finish = cometotal + (int)person2[p2];
start = cometotal;
wait = 0;
p2++;
p2work = finish;
}
else
{
finish = p2work + (int)person2[p2];
start = p2work;
wait = p2work - cometotal;
p2++;
p2work = finish;
}
Console.WriteLine(cometotal + " " + start + " " + "p2" + " " + finish + " " + wait);
}

step4:最後統計一下題目要求的數據再列印出來即可完成本提

by Alent

題目連結
回C#語言教學目錄
回首頁

2010年5月4日 星期二

C98010:作業十:銀行櫃台

政府或服務業在臨櫃服務項目中,最常需要面對的問題是,在一個人來人往的基層政府機關或小店面要有多少人服務,而計算此一類問題的方法中,模擬是一項常用的方法。


在這次的作業中,我們要模擬一個小小的基層機構,有兩個服務人員,在面對每天來此辦公的八小時之內,探討顧客的滿意度。


顧客的滿意度往往是使用等待時間來評量。等待時間愈長,相對的顧客滿意度就愈差。在計算這種問題,我們有兩種重要參數,第一個是顧客的到達時間,第二個是服務的使用時間。


在這個問題中,我們使用平均分配來製造到達時間與服務時間,製造的函數完整C#程式碼下:

static ArrayList getRandom(int seed, int minV, int maxV)
{
Random rand = new Random(seed);
ArrayList randList = new ArrayList();
for (int i = 0; i < 50; i++)
{
randList.Add(rand.Next(minV, maxV));
}
return randList;
}

應用範例如後,到達時間間隔使用(100,5,20),兩個服務人員的服務時間分別為(101,15,25)和(102,20,30)。
由於這裡的隨機函數使用C#提供的Random類別,在使用種子初始化後,該種子每次產生的隨機數序列均會相同,且每此僅產生50個變數(已足夠本作業使用)。產生的隨機數內容如下表:


到達率與處理率
編號到達間隔P1 處理時間P2 處理時間
參數(100,5,20)參數(101,15,25)參數(102,20,30)
1191920
271927
3151820
4181623
5102322
6192326
7151626
8141626
9101925
1072028
11192224
12131821
13101527
14121525
15192123
16121627
17181827
18192122
19101924
2051928
2161723
22102128
23181522
24191826
25122026
26171921
27182226
28141728
2971927
30141922
3161928
32161523
33122423
34122025
35132422
3661621

在這個作業中,我們要調查的是在一天八小時中的顧客滿意度,因此在480分鐘以後到達的顧客將不再處理。


這個基層機構的排隊隊伍只有一行,顧客到達時,若P1與P2兩個服務人員皆空閒著,則顧客以P1為服務對象,若僅有單一服務人員空閒,則由該服務人員提供服務,若兩者皆忙碌,則會產生等待的情形,當然,最快完成服務的人員,將持續位下一位顧客服務,因此,根據上表的到達時間與服務時間,所產生的完整服務情形如下表。


處理統計
編號到達時間開始時間受理者完成時間等待時間
11919P1380
22626P2460
34141P1600
45959P2860
56969P1870
68888P11040
7103103P21230
8117117P11400
9127127P21500
10134140P11636
11153153P21750
12166166P11820
13176176P22020
14188188P12040
15207207P12260
16219219P22450
17237237P12570
18256256P22820
19266266P12880
20271282P230711
21277288P130611
22287306P132119
23305307P23352
24324324P13390
25336336P23600
26353353P13740
27371371P23920
28385385P14010
29392392P24190
30406406P14240
31412419P24447
32428428P14490
33440444P24674
34452452P14710
35465467P24942
36471471P14900


輸出入格式
每一行為一個測試題目,每行有九個數字分別為 s1 min1 max1 s2 min2 max2 s3 min3 max3,以空白隔開,s1為到達時間的亂數種子,s2, s2則為兩個服務人員的亂數種子,min1與max1為到達時間的最小與最大範圍,而min2,max2和min3,max3為兩個服務人員時間的最小與最大範圍。每一個問題會有一行輸出,計有六個數字d1 d2 d3 d4 d5 d6,以空白隔開,內容如下:

  • d1是等待時間為0的顧客累計人數

  • d2是等待時間為大於0,小於等於10分鐘的顧客累計人數

  • d3是等待時間為大於10,小於等於20分鐘的顧客累計人數

  • d4是等待時間為大於20,小於等於30分鐘的顧客累計人數

  • d5是等待時間為大於30,小於等於40分鐘的顧客累計人數

  • d6是等待時間為大於40分鐘的顧客累計人數


範例
Input:
100 5 20 101 15 25 102 20 30
200 5 20 201 15 25 202 20 30
Output:
28 5 3 0 0 0
19 16 3 0 0 0

by Alent

解答連結
回C#語言教學目錄
回首頁

2010年4月15日 星期四

B98012: 小考八:倉庫庫存(解答)

進入到程式,一開始先判斷他是in或不是in

假如是in就把 後面的木材數輸入進儲列


string[] value = line.Split(' ');
if (value[0] == "in")
{
int inbank = int.Parse(value[1]);
mybank.Push(inbank);
}

假如不是in則先把out所要取出的木材數先拿出

再使用forech加總儲列裡所有的木材數 最後印出答案 程式結束


else
{
cases++;
int outbank = int.Parse(value[0]);
int total = 0;
for (int i = 0; i < outbank; i++)
{
mybank.Pop();
}
foreach (int x in mybank)
{
total += x;
}
Console.WriteLine("#{0}: {1} left", cases, total);
}

By Alent



題目連結
回C#語言教學目錄
回首頁

B98012: 小考八:倉庫庫存

有一賣木板的商店,由於需求量過高,所以常常賣到缺貨,商店老闆非常的傷腦筋,所以想請你幫他寫一個程式讓他能知道他現在的庫存量還剩多少。因為木板進貨時都是一捆一捆的,所以進貨時或出貨時,皆以一捆數量來計算。值得注意的是,倉庫進貨出貨時是以先進後出的方式進行。

輸入以「in N」表示,N為一捆木板進貨的數量,0 < N < 100,而「M out」是將倉庫拿出 M 綑木板( 先前提到此倉庫是以後出方式進行出貨 )來販售,0 < M < 10。

輸出以「#i: t left」表示,i為此次出貨次數,t為庫存量。當倉庫出貨時,則需印出它的庫存量還剩多少塊木板,也就是說有幾個「M out」,就有幾個輸出。
Input:
in 3
in 5
in 4
in 8
2 out
in 3
in 10
1 out
Output:
#1: 8 left
#2: 11 left


By Alent



解答連結
回C#語言教學目錄
回首頁

2010年4月14日 星期三

C98009: 作業九:捷運售票機(解答)

設一個變數算到達時間剪掉上一次的完成時間,假如是第一個客人當然不用等

第二個以後假如算出來是負的代表這個顧客需要等待,

所以設個wait變數將算出來的數轉為正數,再將運算的變數歸0

最後完成就是時間要加10秒運作時間

將算出來的等待時間與完成時間輸入進儲列


int come = int.Parse(line);
comeTotal += come;
int comewait = comeTotal - finish ;
int wait = 0;
if (i == 0)
{
wait = 0;
i++;
}
if (comewait < 0)
{
wait = -comewait;
comewait = 0;
}
finish = finish + comewait + 10;
waitTime.Enqueue(wait);
finishTime.Enqueue(finish);

程式的最後將儲列裡的等待時間與完成時間取出列印即完成作業

int cases = 1;
foreach (int w in waitTime)
{
Console.WriteLine("#{0}: waited {1}, finished {2}",cases,w,finishTime.Dequeue());
cases++;
}

作業九題目
回C#語言教學目錄
回首頁

C98009: 作業九:捷運售票機

作業內容

若有一個捷運自動售票機的售票處理時間為固定10秒,但是購票乘客抵達時間不固定,若自動售票機在有人使用的情形下,乘客必須先行排隊等待。(假設只有一部售票機) 乘客抵達時間為相隔時間,在輸入乘客抵達時間後,請輸出每個乘客的等待時間與完成時間。

程式基本要求:使用Queue類別。
輸出入格式

輸入的每一行為乘客抵達的間隔時間t,n<10000,第一個乘客抵達的時間,為t1-0;第二個乘客抵達的時間,為t2-t1,第三個乘客抵達的時間,為t3-t2;以此類推。輸入結束,則測試結束。

輸出格式為「#i: waited x, finished y」,i為第i個輸入的乘客。 x為等待時間,y為離開時間。
範例

Input:
5
12
16
8
6
10
13
Output:
#1: waited 0, finished 15
#2: waited 0, finished 27
#3: waited 0, finished 43
#4: waited 2, finished 53
#5: waited 6, finished 63
#6: waited 6, finished 73
#7: waited 3, finished 83

解答連結
回C#語言教學目錄
回首頁

2010年4月10日 星期六

作業八:機器人駕駛(解答)

宣告一個迴圈,同時做讀取機器人走的方位與步數以及將字串拆解成陣列的動作,C#語言程式碼如下

for (i = 0; i < cases; i++)
{
int m = int.Parse(Console.ReadLine());
for (j = 0; j < m; j++)
{
string instruct = Console.ReadLine();
string[] value = instruct.Split(' ');
qus.Blue[i].MoveTo(value[0], value[1]);
qus.Red[i].MoveTo(value[2], value[3]);
}
}

計算方位與距離

double pointView = Math.Atan((qus.Blue[i].y - qus.Red[i].y) /
(qus.Blue[i].x - qus.Red[i].x)) * 180 / Math.PI;
double distance = Math.Sqrt((qus.Blue[i].x - qus.Red[i].x) * (qus.Blue[i].x - qus.Red[i].x) +
(qus.Blue[i].y - qus.Red[i].y) * (qus.Blue[i].y - qus.Red[i].y));

最後判斷以一點為中心另一點是在哪個象限再決定是要加90&270或者減90&270

if ((qus.Red[i].x - qus.Blue[i].x) >= 0 && (qus.Red[i].y - qus.Blue[i].y) >= 0)
{
Console.Write("Blue: {0:f3}, {1} Red: {2:f3}, {3}", distance, Math.Round(90 - pointView), distance, Math.Round(270 - pointView));
}
if ((qus.Red[i].x - qus.Blue[i].x) >= 0 && (qus.Red[i].y - qus.Blue[i].y) <= 0) { Console.Write("Blue: {0:f3}, {1} Red: {2:f3}, {3}", distance, Math.Round(90 - pointView), distance, Math.Round(270 - pointView)); } if ((qus.Red[i].x - qus.Blue[i].x) <= 0 && (qus.Red[i].y - qus.Blue[i].y) >= 0)
{
Console.Write("Blue: {0:f3}, {1} Red: {2:f3}, {3}", distance, Math.Round(270 - pointView), distance, Math.Round(90 - pointView));
}
if ((qus.Red[i].x - qus.Blue[i].x) <= 0 && (qus.Red[i].y - qus.Blue[i].y) <= 0) { Console.Write("Blue: {0:f3}, {1} Red: {2:f3}, {3}", distance, Math.Round(270 - pointView), distance, Math.Round(90 - pointView)); }
作業九題目
回C#語言教學目錄
回首頁

C98008: 作業八:機器人駕駛

作業內容

有紅、藍兩個機器人,在接獲一連串的移動指令後,必須能知道相互
之間的方位與距離。共有八種移動指令 E, W, S, N, NE, SE, SW,
NW,分別代表東、西、南、北、東北、東南、西南、西北八個方
向,指令中並包含行進的位移,前四個方位的位移為一個單位,後四
個方位位移的量為sqrt(2)的倍數。

程式基本內容要求如下:

1. 宣告一個Robot類別;
2. 宣告一個Point結構;
3. 建立一個非靜態方法MoveTo(),用來移動機器人;

輸出入格式

輸入的第一行為一個整數n,n<10,表示測試的題數,每個測試題的>

輸出格式為「 Blue: d, b1 Red: d b2」,d為紅藍機器人之間的距
離,精確度到小數點三位, b1為藍機器人看紅機器人的方位,b2為
紅機器人看藍機器人的方位,兩者皆用Math.Round()取整數。每兩個
測試題,中間有一個空行,最後一個測試題後面則無空行。連續兩個
測試題之間需空一行。下列範例結果如圖所顯示

範例

Input:
1
4
E 3 SW 2
N 2 NW 2
NW 1 N 5
NE 2 NW 2
Output:
Blue: 10.198, 281 Red: 10.198, 101

解答連結
回C#語言教學目錄
回首頁

C#語言教學目錄