2007年11月26日 星期一

小考三(F) 解答


/* C Programming Quiz 3F */
/*
小考三題目:使用兩個骰子,在丟出10000次之後,計算出現
點數和為 2 或 12 的機率。
提示一:使用兩個隨機變數。
提示二:以 randNum1+randNum2 == 2 || randNum1+randNum2 == 12
來累進出現的次數,再除以10000,即可得此機率。
輸入值:無。
輸出值:一個機率值。
*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int randNum1, randNum2;
int i;
double count=0;
srand(time(NULL));
for (i=0; i<10000; i++)
{
randNum1 = rand()%6+1;
randNum2 = rand()%6+1;
if (randNum1+randNum2 == 2 || randNum1+randNum2 == 12)
count++;
}
printf("The probability of obtaining 2 or 12 is %.3lf\n", count/10000);

system("pause");
return 0;
}

小考三(F)題目
返回小考目錄
回到首頁

小考三(F) 題目


/* C Programming Quiz 3F */
/*
小考三題目:使用兩個骰子,在丟出10000次之後,計算出現
點數和為 2 或 12 的機率。
提示一:使用兩個隨機變數。
提示二:以 randNum1+randNum2 == 2 || randNum1+randNum2 == 12
來累進出現的次數,再除以10000,即可得此機率。
輸入值:無。
輸出值:一個機率值。
*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int randNum1, randNum2;

/* your program is here */


system("pause");
return 0;
}

小考三(F)解答
返回小考目錄
回到首頁

小考三(E) 解答


/* C Programming Quiz 3E */
/*
小考三題目:使用兩個骰子,在丟出10000次之後,計算出現
點數和為 6, 7, 8 的機率。
提示一:使用兩個隨機變數。
提示二:以計算點數和 6 為例,以 randNum1+randNum2 == 6
出現的次數除以10000,即可得此機率。
輸入值:無。
輸出值:三個機率值。
*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int randNum1, randNum2;
int i;
double countSix=0, countSeven=0, countEight=0;
srand(time(NULL));
for (i=0; i<10000; i++)
{
randNum1 = rand()%6+1;
randNum2 = rand()%6+1;
if (randNum1+randNum2 == 6)
countSix++;
if (randNum1+randNum2 == 7)
countSeven++;
if (randNum1+randNum2 == 8)
countEight++;
}
printf("The probability of obtaining 6 is %.3lf\n", countSix/10000);
printf("The probability of obtaining 7 is %.3lf\n", countSeven/10000);
printf("The probability of obtaining 8 is %.3lf\n", countEight/10000);


system("pause");
return 0;
}

小考三(E)題目
返回小考目錄
回到首頁

小考三(E) 題目


/* C Programming Quiz 3E */
/*
小考三題目:使用兩個骰子,在丟出10000次之後,計算出現
點數和為 6, 7, 8 的機率。
提示一:使用兩個隨機變數。
提示二:以計算點數和 6 為例,以 randNum1+randNum2 == 6
出現的次數除以10000,即可得此機率。
輸入值:無。
輸出值:三個機率值。
*/

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int randNum1, randNum2;

/* your program is here */


system("pause");
return 0;
}

小考三(E)解答
返回小考目錄
回到首頁

2007年11月20日 星期二

C 程式設計作業三 ,迴圈與隨機數應用

作業內容:
你玩過「大富翁」遊戲嗎?沒錯,這個作業就是要設計一個類似的紙上遊戲,只不過是個簡單單人版的紙上遊戲。

這個遊戲基本上有八個或以上的格子,你的棋子由某個角落出發,然後,你用骰子來決定走幾步,再根據走到的地方來決定發生什麼事情,例如有的格子會獲得固定的獎勵,有的會受到固定的懲罰,有的是機會、命運,有的是前進幾格,有的是退後幾格。

下圖是一個類似的紙上遊戲圖:

起點由春分點開始,按順時針行走,所以遊戲的基本執行畫面,會像下面範例。



光是顯示現在的位置是不夠的,因為這樣一點都沒有遊戲的樣子,像樣的遊戲至少會有些變化。這個作業,基本要求的變化如下:

1. 遊戲有一個適當的故事地點,例如:每個點的名稱是街道名、縣市名、鄉鎮名、國名、科幻遊戲地點、線上遊戲地點、或自己編輯的虛幻地名等,都可以。

2. 遊戲必須能呈現現在位置,利用適當的指標來表示玩家的現在位置。例如,上面是用箭頭來表示現在位置。你可以用相同,或別的方式來表示玩家的位置。

3. 除了機會、命運外,你必須在每一個格子設定獲利、損失,前進、或後退四種規則中的一種。在這四種規則中,獲利多少、損失多少,前進多少格、後退多少格,每種至少要有一個格子屬於該規則。

4. 有一個機會和一個命運,這時你必須以隨機的方式,選出你上述四種規則中的一種,每一個機會或命運,必須有四種以上的變化作為選擇。

5. 遊戲有一個固定的起點,在第三次經過該起點以後(繞三圈),遊戲結束。此時你必須計算玩家的獲利或損失的情形,並列印出來。

作業三解答
回到作業目錄
回到首頁

2007年11月17日 星期六

Problem 136 Ugly Numbers,難看的數字

這題要列出的數字,其因數只能有2, 3, 或 5,所以,數字一定是 2^x * 3^y * 5^z的組合,參考他的解答,我使用一個 minUgly(2*x, 3*y, 5*z, &idx)的方式,注意這裡的x,y,z必須也是Ugly number,所以就必須有個index將uglyNum陣列中的數字一個個叫出來。 &idx是告訴你三個中,哪一個最小,這時才能將x,y,或z換大一點的Ugly number。
注意:不要用//,這個註解會產生compilation error。

uglyNum[0] = 1;
while (i<1500)
{
min = minUgly(2*fac[0], 3*fac[1], 5*fac[2], &idx);
if (min>oldmin)
i++;
uglyNum[i] = min;
maxFac[idx]++;
fac[idx] = uglyNum[maxFac[idx]];
oldmin = min;
}

p136題目連結
回ACM題庫目錄
回首頁

2007年11月15日 星期四

Problem 113 Power of Cryptography,密碼的力量

這題在其解說網頁就說了,用exp(log(p)/n))的公式來解,他給的題目是可以求出整數的根值,重點是要列印出整數來。雖然仍然用double 宣告,但是在printf 中以 %.0lf 列印,就可以讓小數消失了。程式碼參考如下:

double n, p, k;
while (scanf("%lf %lf", &n, &p) == 2) {
k = exp(log(p)/n);
printf("%.0lf\n", k);
}

p113題目連結
回ACM題庫目錄
回首頁

2007年11月12日 星期一

C 程式設計作業二,選擇邏輯與迴圈應用:解題


這題主要在能解決前兩天的訂貨能被納進來計算,且能更新。所以我們使用兩個分別處理兩天的訂貨量,如下:
arrivedNum = firstOrder;
firstOrder = secondOrder;

如此第一天的的訂貨為到貨量,第二天的訂貨變成第一天的訂貨,而第二天的訂貨則是今天計算後再決定


/* C Programming, Project 2 */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int orderNum, stockNum, arrivedNum, soldNum;
int orderMax = 500;
int orderMin = 300;
int firstOrder = 0;
int secondOrder = 0;
int i;

stockNum = 450;
for (i=1; i<=10; i++) {
printf("Enter the sold amount: ");
scanf("%d", &soldNum);
arrivedNum = firstOrder;
firstOrder = secondOrder;
stockNum = stockNum + arrivedNum - soldNum;
if (stockNum < 300)
secondOrder = 500 - stockNum;
else
secondOrder = 0;
printf("Order = %3d, Arrived = %3d, Stock = %3d\n", secondOrder, arrivedNum, stockNum);
}

system("pause");
return 0;
}

作業二題目
回到首頁

2007年11月8日 星期四

C 程式設計作業二,選擇邏輯與迴圈應用

作業內容:
貴公司販售單一進口商品,每週四為存貨計算時間,並紀錄每週的銷售量與到貨量,每次清點完存貨,若發現存貨低於最低安全存量(訂購點)時,則會交給採購部門下訂單進行訂購工作,如有訂購需求,在週五會發出訂單,每次訂購量以到達標準存量來計算,通常在10天後(下下個星期一),訂貨準時到達。

資訊長(CIO)在週末時告訴你一件不幸的事,他說,清點存貨的員工,電腦中毒,有關十周之內的存貨與訂貨資料都消失了,只剩銷售量的資訊, 所以要求你設計一個程式可用銷售量來計算存貨與訂貨的資料。

基本資訊如下(前四項為固定不變,第五項為假設資訊):
一、最低安全存量為 300 件。
二、標準存量為 500 件。
三、十周之前的存貨量為 450 件。
四、前十二、十一周的訂貨量均為 0。
五、假設前十周的銷售量為 160, 90, 115, 170, 150, 140, 165, 155, 185, 175。

在你經過紙上計算,你所獲得的計算結果如下:



前週數121110987654321
銷售量  16090115170150140165155185175
訂貨量002103002050003254803400
到貨量  00210300205000325480
存貨量 45029020029542548034017520160465


紅色部分是經過上述所提供的基本資訊所得到的計算結果。

請完成你的作業,並能輸入不同的十周銷售量進行類似的計算,輸出類似紅色部分的相關資料。

測試方式:
測試題:銷售量 180, 135, 120, 155, 110, 160, 155, 90, 125, 145。

作業二解答
回到作業目錄
回到首頁

小考三(D) 解答


/* C Programming Quiz 3D */
/*
小考題目:有一種外來植物,高度為 H,每月生長高度
為前一個月的 1.5 倍,若生長高度大於 20
公尺時,則次月停止生長。請用 C 語言寫
一個計算其最終高度的程式。例如:初始高度
為 4 公尺,則第一個月長高 6 公尺,第二個
月長高 9 公尺,第三個月長高 13.5 公尺,
第四個月長高 20.25 公尺,第五個月停止
生長,所以總高度為
4 + 6 + 9 + 13.5 + 20.25 = 52.75 公尺。
提示一:使用 scanf 輸入高度,輸出為最終高度。
提示二:do while 迴圈會較容易。
提示三:初始高度小於 10 公尺。


*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
float Height;
float nextGrow;
printf("Enter initial height: ");
scanf("%f", &Height);
nextGrow = Height;
do
{
nextGrow *= 1.5;
Height += nextGrow;
} while (nextGrow <= 20);
printf("Final height = %f\n", Height);

system("pause");
return 0;
}

小考三(D)題目
返回小考目錄
回到首頁

小考三(D) 題目


/* C Programming Quiz 3D */
/*
小考題目:有一種外來植物,高度為 H,每月生長高度
為前一個月的 1.5 倍,若生長高度大於 20
公尺時,則次月停止生長。請用 C 語言寫
一個計算其最終高度的程式。例如:初始高度
為 4 公尺,則第一個月長高 6 公尺,第二個
月長高 9 公尺,第三個月長高 13.5 公尺,
第四個月長高 20.25 公尺,第五個月停止
生長,所以總高度為
4 + 6 + 9 + 13.5 + 20.25 = 57.75 公尺。
提示一:使用 scanf 輸入高度,輸出為最終高度。
提示二:do while 迴圈會較容易。
提示三:初始高度小於 10 公尺。

*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
float Height;

/* your program is here */


system("pause");
return 0;
}

解答下載
返回小考目錄
回到首頁

小考三(C) 解答


/* C Programming Quiz 3C */
/*
小考題目:有一種外來植物,高度為 H,每月生長高度
為前一個月的一半,若生長高度小於一公尺,
則次月停止生長。請用 C 語言寫一個計算
其最終高度的程式。例如:初始高度為 7.0 公尺
,則第一個月長高 3.5 公尺,第二個月長高 1.75
公尺,第三個月長高 0.875 公尺,第四個月停止
生長,所以總高度為
7.0 + 3.5 + 1.75 + 0.875 = 13.125 公尺。
提示一:使用 scanf 輸入高度,輸出為最終高度。
提示二:do while 迴圈會較容易。
提示三:初始高度大於 1 公尺。

*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
float Height;
float nextGrow;
printf("Enter initial height: ");
scanf("%f", &Height);
nextGrow = Height;
do
{
nextGrow /= 2.0;
Height += nextGrow;
} while (nextGrow >= 1);
printf("Final height = %f\n", Height);

system("pause");
return 0;
}

小考三(C)題目
返回小考目錄
回到首頁

小考三(C) 題目


/* C Programming Quiz 3C */
/*
小考題目:有一種外來植物,高度為 H,每月生長高度
為前一個月的一半,若生長高度小於一公尺,
則次月停止生長。請用 C 語言寫一個計算
其最終高度的程式。例如:初始高度為 7.0 公尺
,則第一個月長高 3.5 公尺,第二個月長高 1.75
公尺,第三個月長高 0.875 公尺,第四個月停止
生長,所以總高度為
7.0 + 3.5 + 1.75 + 0.875 = 13.125 公尺。
提示一:使用 scanf 輸入高度,輸出為最終高度。
提示二:do while 迴圈會較容易。
提示三:初始高度大於 1 公尺。

*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
float Height;

/* your program is here */


system("pause");
return 0;
}

解答下載
返回小考目錄
回到首頁

2007年11月7日 星期三

C語言教學影片(二),運用重導(redirect)與管線(pipeline),便於大量資料輸入

教學內容
在這段C語言教學影片中,將介紹簡單的DOS指令,並運用重導(redirect)與管線(pipeline)的概念,讓你在面對大量資料輸入時,能快速處理,免除一個一個進行鍵盤輸入才能完成測試的困擾。

DOS 指令用在「命令提示字元」,或稱Console、shell、操控台等,這裡介紹的基本指令包括:
cd (change directory),改變目錄。
dir ,顯示目錄中的檔案與子目錄名稱。
type ,顯示檔案內容。

重導 (redirect),將某個資料流導向到使用者指定的地方,使用 '<' 或 '>' 指令。
管線 (pipeline),將一個程式執行的輸出導向成為另一個程式執行所需的輸入,使用 '|' 指令。



若無法播放,請由此處下載
其他影片下載:
C語言教學影片(一),初次使用dev-c++

2007年11月4日 星期日

Problem 591 Box of Bricks,方塊擺放問題

因為已經知道要分成幾堆,把總高度除以堆數就知道每一堆的平均高度為多少,接著只要把所有高於平均高度的差加起來就是答案了。

for(i=0;i<n;i++)
{
// every one height
scanf("%d", &m[i]);
// total
h+=m[i];
}

// average
h /= n;
for(i=0;i<n;i++)
{
if(m[i] > h)
moves += m[i]-h;
}

Solved by Wellwind
p591 題目連結
回ACM題庫目錄
回首頁

Problem 579 ClockHands,分針與時針夾角問題


這題出現在之前的程式設計比賽中,控制輸入可以用分號隔開
scanf("%d:%d", &h, &m);

接著只要知道

1小時 = 360度 / 12 = 30度
1分鐘 = 30度 / 5 = 6度

就可以把題目算出來,要注意分針在走的時候時針也有小幅度的在走,不要忘記算進去;注意不要時針跟分針接近的時候很容易做出超出範圍的答案

degree_h = 30.0 * (h+m/60.0);
degree_m = 6.0*m;

ans = degree_m - degree_h;
if(ans < 0)
ans = -ans;
if(ans > 180)
ans = 360-ans;

Solved by Wellwind
p579目連結
回ACM題庫目錄
回首頁

Problem 272 TeX Quotes,單雙引號問題處理


這題非常簡單,只要一直讀入字元,如果是雙引號(")就判斷出現是第奇數次還是偶數次,如果是奇數次就輸出(``);如果是偶數次,輸出('');其他狀況則直接把字元輸出就好

if(c == '"')
{
if(i==1)
{
putchar('`');
putchar('`');
i=0;
}
else if(i==0)
{
putchar('\'');
putchar('\'');
i=1;
}
}
else
putchar(c);

Solved by Wellwind
p272題目連結
回ACM題庫目錄
回首頁

C 程式設計作業一(B),選擇邏輯與輸出、輸入應用:解題


/* C Programming, Project 1B */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int price, shampoo_L, shampoo_S, conditioner_L, conditioner_S;
int free_S, isOdd;

printf("Enter large shampoo number:");
scanf("%d", &shampoo_L);
printf("Enter large conditioner number:");
scanf("%d", &conditioner_L);
printf("Enter small shampoo number:");
scanf("%d", &shampoo_S);
printf("Enter small conditioner number:");
scanf("%d", &conditioner_S);

free_S = (shampoo_L+conditioner_L)/2;
isOdd = (shampoo_L+conditioner_L)%2;
if (isOdd==1)
{
if (shampoo_L>0)
{
if (conditioner_S > free_S)
{
conditioner_S -= free_S;
free_S = 0;
} else {
free_S -= conditioner_S;
conditioner_S = 0;
}
if (free_S > 0)
{
if (shampoo_S > free_S)
shampoo_S -= free_S;
else
shampoo_S = 0;
}
} else if (conditioner_L>0) {
if (shampoo_S > free_S)
{
shampoo_S -= free_S;
free_S = 0;
} else {
free_S -= shampoo_S;
shampoo_S = 0;
}
if (free_S > 0)
{
if (conditioner_S > free_S)
conditioner_S -= free_S;
else
conditioner_S = 0;
}
}
} else {
if (shampoo_S>0) {
if (shampoo_S > free_S)
{
shampoo_S -= free_S;
free_S = 0;
} else {
free_S -= shampoo_S;
shampoo_S = 0;
}
if (free_S > 0)
{
if (conditioner_S > free_S)
conditioner_S -= free_S;
else
conditioner_S = 0;
}
} else if (conditioner_S>0) {
if (conditioner_S > free_S)
{
conditioner_S -= free_S;
free_S = 0;
} else {
free_S -= conditioner_S;
conditioner_S = 0;
}
if (free_S > 0)
{
if (shampoo_S > free_S)
shampoo_S -= free_S;
else
shampoo_S = 0;
}
}
}
if (isOdd==1 && ((shampoo_L>0 && shampoo_S>0) || (conditioner_L>0 && conditioner_S>0)))
price = (shampoo_L+conditioner_L)*280+(shampoo_S+conditioner_S-1)*150+150*0.6;
else
price = (shampoo_L+conditioner_L)*280+(shampoo_S+conditioner_S)*150;

if (shampoo_L+conditioner_L >=6)
price *= 0.95;

printf("Price checkout:\n\n");
printf("Large shampoo x %d\n", shampoo_L);
printf("Large conditioner x %d\n", conditioner_L);
printf("Small shampoo x %d\n", shampoo_S);
printf("Small conditioner x %d\n", conditioner_S);
printf("\nPrice = %d\n", price);

system("pause");
return 0;
}

請參考下方流程圖,此圖僅顯示針對偶數大瓶裝處理的過程。

作業一(B)題目
回到首頁