2007年12月28日 星期五

C 程式設計期末作業,解題練習

作業內容:
有一數字問題,可以透過其最大值與最小值的差值,進行一連串的計算,

其計算過程如下:

一、先將該數依照數字由大排到小,形成新的數字。例如該數為14095,排列完變成95410。

二、再將該數依照數字由小排到大,形成另一個新的數字。例如該數為14095,排列完變成1459。

三、將大的數減去小的數字,所得的差值,取代該數。

四、重複一至三的步驟,直到第三步的差值已經在前面出現過為止。

輸入的值最大為六位數,當輸入為 0 時,則停止。

作業要求:顯示原始輸入數字、顯示最大數與最小數相減結果、顯示數字鏈的長度。

執行範例:
94510
Original number was 94510
95410 - 1459 = 93951
99531 - 13599 = 85932
98532 - 23589 = 74943
97443 - 34479 = 62964
96642 - 24669 = 71973
97731 - 13779 = 83952
98532 - 23589 = 74943
Chain length 7

3412
Original number was 3412
4321 - 1234 = 3087
8730 - 378 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
Chain length 4

777
Original number was 777
777 - 777 = 0
0 - 0 = 0
Chain length 2

0

期末作業解答
回到作業目錄
回到首頁

C 程式設計作業五,解題練習:解答


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

int getZoneNo(int);
int compZoneMin(int, int, int, int);
int main(void)
{
char phoneNo[20];
double zonePrice1=5.4, zonePrice2=3.6;
int startHr, startMin, endHr, endMin;
int zone1, zone2, zoneMin1, zoneMin2;
while (scanf("%s %d %d %d %d",phoneNo, &startHr, &startMin, &endHr, &endMin)==5)
{
printf("%s %6d %6d %6d %6d\n",phoneNo, startHr, startMin, endHr, endMin);
zone1 = getZoneNo(startHr);
zone2 = getZoneNo(endHr);
if (zone1==zone2)
{
if (zone1==1)
{
zoneMin1 = compZoneMin(startHr, startMin, endHr, endMin);
zoneMin2 = 0;
}
else
{
zoneMin1 = 0;
if (startHr<endHr)
zoneMin2 = compZoneMin(startHr, startMin, endHr, endMin);
else
zoneMin2 = compZoneMin(startHr, startMin, endHr+24, endMin);
}
}
else
{
if (zone1==1)
{
if (endHr<8)
endHr += 24;
zoneMin1 = compZoneMin(startHr, startMin, 18, 0);
zoneMin2 = compZoneMin(18, 0, endHr, endMin);
}
else
{
endHr += 24;
if (startHr<8)
startHr += 24;
zoneMin1 = compZoneMin(startHr, startMin, 32, 0);
zoneMin2 = compZoneMin(32, 0, endHr, endMin);
}
}
printf("--------------------------->%6d%6d%10.0lf\n", zoneMin1, zoneMin2, zoneMin1*zonePrice1+zoneMin2*zonePrice2);
}

system("pause");
return 0;
}

int getZoneNo(int hr)
{
if (hr>=8 && hr<18)
return 1;
else
return 2;
}
int compZoneMin(int startHr, int startMin, int endHr, int endMin)
{
printf("%6d %6d %6d %6d\n",startHr, startMin, endHr, endMin);
if (startMin<endMin)
return (endHr-startHr)*60+endMin-startMin;
else
return (endHr-startHr-1)*60+endMin-startMin+60;
}

作業五題目
回到首頁

2007年12月21日 星期五

小考四(F) 解答

/* C Programming, Quiz 4F */
/*
小考題目:完成一個計算標準常態機率密度函數,normdist。
函數輸入一個 x 值,輸出機率值,公式如附圖。
並利用函數呼叫計算下列 x 值所產生的機率。
(a) x = -1
(b) x = 2.01
(c) x = 0

提示:使用 math.h 的 pow 、sqrt、exp 函數。

函數輸入值:一個 double。
函數輸出值:一個 double。
題目輸入:無
題目輸出:印出(a)、(b)和(c)的答案。
*/

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

double normdist(double);

int main(void)
{

printf("(a) ans: %lf\n", normdist(-1));
printf("(b) ans: %lf\n", normdist(2.01));
printf("(c) ans: %lf\n", normdist(0));

system("pause");
return 0;
}

double normdist(double x)
{
return 1/sqrt(2*M_PI)*exp(-x*x/2);
}

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

小考四(E) 解答

/* C Programming, Quiz 4E */
/*
小考題目:完成一個計算帳戶餘額的函數,saving。
函數輸入四個值,本金(P)、年利率(r)、每年計算複
利次數(n),存款年數(t),完成本利最後餘額的計算,公式為
nt
A = P(1+r/n)

並利用函數呼叫計算
(a)本金12000,年利率0.08,每季複利一次,存20年。
(b)本金24000,年利率0.12,每季複利一次,存10年。

提示:使用 math.h 的 pow 函數。

函數輸入值:二個 double,即本金和利率;二個 int,即每年複利次數和年數。
函數輸出值:一個 double。
題目輸入:無
題目輸出:印出(a)和(b)的答案。
*/

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

double saving(double,double,int,int);

int main(void)
{

printf("(a) ans: %lf\n", saving(12000, 0.08, 4, 20));
printf("(b) ans: %lf\n", saving(24000, 0.12, 4, 10));

system("pause");
return 0;
}

double saving(double P, double r, int n, int t)
{
return P*pow(1+r/n, n*t);
}

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

小考四(F) 題目

/* C Programming, Quiz 4F */
/*
小考題目:完成一個計算標準常態機率密度函數,normdist。
函數輸入一個 x 值,輸出機率值,公式如附圖。
並利用函數呼叫計算下列 x 值所產生的機率。
(a) x = -1
(b) x = 2.01
(c) x = 0

提示:使用 math.h 的 pow 、sqrt、exp 函數。

函數輸入值:一個 double。
函數輸出值:一個 double。
題目輸入:無
題目輸出:印出(a)、(b)和(c)的答案。
*/


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

小考四(E) 題目


/* C Programming, Quiz 4E */
/*
小考題目:完成一個計算帳戶餘額的函數,saving。
函數輸入四個值,本金(P)、年利率(r)、每年計算複
利次數(n),存款年數(t),完成本利最後餘額的計算,公式為
nt
A = P(1+r/n)

並利用函數呼叫計算
(a)本金12000,年利率0.08,每季複利一次,存20年。
(b)本金24000,年利率0.12,每季複利一次,存10年。

提示:使用 math.h 的 pow 函數。

函數輸入值:二個 double,即本金和利率;二個 int,即每年複利次數和年數。
函數輸出值:一個 double。
題目輸入:無
題目輸出:印出(a)和(b)的答案。
*/

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

2007年12月18日 星期二

C 程式設計作業五,解題練習

作業內容:
有一家電話公司的電話費率按照時間區段來計算手機費率,計費方式採分鐘計費,費率表如下:
時段8am~6pm6pm~8am
費率5.43.6


例如:電話時間從 5:58pm 到 6:04pm 則電話費為5.4*2 + 3.6*4 = 25.2元。通話費小於一分鐘不計費,通話時間不會超過24小時。

作業基本要求如下:

輸入電話通話紀錄,每行首項為撥打電話號碼,格式為xxxx-xxxxxxxx (例如:0912-345678),接著為開始時數、開始分數、結束時數、結束分數,各資料以一個空格分隔。一行只有 # 表示輸入結束。

輸出為撥出號碼、各時段時間(以分計算)、價格(四捨五入)。

輸入範例:
0912-345678 17 58 18 04
0912-345678 23 55 00 20
0911-223344 07 50 12 30
#


輸出範例:
0912-345678     2     4      25
0912-345678 0 25 90
0911-223344 270 10 1494


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

C 程式設計作業四,迴圈與函數應用:解題


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

int whoWin(int, int);
int main(void)
{
int position = 0;
int computerPlay, myPlay;
int result;

srand(time(NULL));
while (position>4 && position<-4)
{
printf("%*c\n", (position+4)*5-1, 'f');
printf("| -3 | -2 | -1 | 0 | 1 | 2 | 3 |\n\n");
do
{
printf("Enter your play: scissors(1), paper(2), or rock(3) ");
scanf("%d", &myPlay);
} while (myPlay!=1 && myPlay!=2 && myPlay!=3 );
computerPlay = rand()%3 + 1;
if (computerPlay==1)
printf("Computer play: scissors\n");
else if (computerPlay==2)
printf("Computer play: paper\n");
else if (computerPlay==3)
printf("Computer play: rock\n");

result = whoWin(computerPlay, myPlay);
position += result;
}

system("pause");
return 0;
}

int whoWin(int comp, int me)
{
int winner;
if (comp==me)
{
printf("--------------- MATCH ---------------\n");
winner = 0;
}
else if (comp-me==1 || comp-me==-2)
{
printf("------------ PLAYER WIN -------------\n");
winner=1;
}
else
{
printf("----------- COMPUTER WIN ------------\n");
winner=-1;
}
return winner;
}

作業四題目
回到首頁

2007年12月7日 星期五

小考四(D) 解答


/* C Programming Quiz 4B */
/*
小考四題目:參考附圖,一矩形長為 25,寬為 10,內含二個
正三角形,邊長分別為 7, 5,計算矩形內不含三角
型之面積(即斜線面積)。必須完成兩個函數 RectangleArea
和 RTriangleArea,分別計算矩形面積和三角形面積,
並利用函數呼叫完成斜線面積計算。
提示:使用 math.h 的 sqrt 函數。
RectangleArea 函數輸入值:二個 double。
RTriangleArea 函數輸入值:一個 double。
函數輸出值:一個 double。
題目輸入:無
題目輸出:印出斜線面積。
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double RectangleArea(double, double);
double RTriangleArea(double);

int main(void)
{
double area;

area = RectangleArea(25.0, 10.0) - RTriangleArea(7.0) - RTriangleArea(5.0);
printf("Area = %lf\n", area);

system("pause");
return 0;
}

double RectangleArea(double x, double y)
{
return x*y;
}
double RTriangleArea(double x)
{
return sqrt(3)*x*x/4;
}

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

小考四(D) 題目


/* C Programming Quiz 4D */
/*
小考四題目:參考附圖,一矩形長為 25,寬為 10,內含二個
正三角形,邊長分別為 7, 5,計算矩形內不含三角
型之面積(即斜線面積)。必須完成兩個函數 RectangleArea
和 RTriangleArea,分別計算矩形面積和三角形面積,
並利用函數呼叫完成斜線面積計算。
提示:使用 math.h 的 sqrt 函數。
RectangleArea 函數輸入值:二個 double。
RTriangleArea 函數輸入值:一個 double。
函數輸出值:一個 double。
題目輸入:無
題目輸出:印出斜線面積。
*/

#include <stdio.h>
#include <stdlib.h>
/* your program is here */

int main(void)
{
double area;

/* your program is here */


system("pause");
return 0;
}

/* your program is here */


小考四(C)解答
返回小考目錄
回到首頁

小考四(C) 解答


/* C Programming Quiz 4C */
/*
小考四題目:參考附圖,一圓半徑為 9 ,內含三個正三角形,
邊長分別為 5, 5, 3,計算圓內不含三角型之面
積(即斜線面積)。必須完成兩個函數 CircleArea
和 RTriangleArea,分別計算圓面積和三角形面積,
並利用函數呼叫完成斜線面積計算。
提示:使用 math.h 的 M_PI 與 sqrt 函數。
函數輸入值:一個 double。
函數輸出值:一個 double。
題目輸入:無
題目輸出:印出斜線面積。
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double CircleArea(double);
double RTriangleArea(double);

int main(void)
{
double area;

area = CircleArea(9.0) - 2*RTriangleArea(5.0) - RTriangleArea(3.0);
printf("Area = %lf\n", area);

system("pause");
return 0;
}

double CircleArea(double r)
{
return M_PI*r*r;
}
double RTriangleArea(double x)
{
return sqrt(3)*x*x/4;
}

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

小考四(C) 題目


/* C programming Quiz 4C */
/*
小考四題目:參考附圖,一圓半徑為 9 ,內含三個正三角形,
邊長分別為 5, 5, 3,計算圓內不含三角型之面
積(即斜線面積)。必須完成兩個函數 CircleArea
和 RTriangleArea,分別計算圓面積和三角形面積,
並利用函數呼叫完成斜線面積計算。
提示:使用 math.h 的 M_PI 與 sqrt 函數。
函數輸入值:一個 double。
函數輸出值:一個 double。
題目輸入:無
題目輸出:印出斜線面積。
*/

#include <stdio.h>
#include <stdlib.h>
/* your program is here */

int main(void)
{
double area;

/* your program is here */


system("pause");
return 0;
}

/* your program is here */


小考四(C)解答
返回小考目錄
回到首頁

2007年12月4日 星期二

C 程式設計作業四,迴圈與函數應用

作業內容:
這次的作業是製作一個簡單的剪刀、石頭、布遊戲。
這個遊戲有點像拔河遊戲,只是拔河的雙方並不以力氣作為前進、後退的依據,而是用猜拳來決定前進後退。
在遊戲的開始,有一個旗子位於中央位置,如下圖所示。


玩家是你和電腦,以剪刀、石頭、布來決定旗子向左或向右,所以任何一方累積贏的次數超過四次,遊戲就結束。
範例畫面如下:

此作業基本要求如下:

1. 顯示旗子所在的位置,可能的位置有七個。
2. 以隨機方式,產生電腦出拳的結果。
3. 完成函數 int whoWin(int, int),這個函數傳入玩家與電腦出拳的值,輸出為輸贏的結果,有三種結果:輸、贏、平手。
4. 任一方累積贏的次數超過四次,遊戲結束。

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

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


/* C Programming Project 3 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int main(void)
{
int dice = 0, currentPos = 0, roundNo = 0;
int money = 10000;
int lucky;
char finger[3] = "↖";

srand(time(NULL));
while (roundNo < 3)
{
printf("\n春分 機會 夏至\n\n");
printf("命運 %s 川堂\n\n", finger);
printf("冬至 大門 秋分\n");
printf("================\n");
printf("現存現金 %d 元\n\n", money);
printf("按任意鍵來丟骰子...");
getch();
system("cls");
dice = rand()%6 + 1;
printf("骰子為 %d\n\n", dice);
currentPos += dice;
if (currentPos/8 == 1)
roundNo++;
currentPos %= 8;
switch(currentPos)
{
case 0:
printf("由此過得2000元\n");
money += 2000;
break;
case 1:
printf("機會:");
lucky = rand()%4 + 1;
switch (lucky)
{
case 1:
dice = rand()%3 + 1;
printf("前進 %d 格\n", dice);
currentPos += dice;
break;
case 2:
dice = rand()%3 + 1;
printf("後退 %d 格\n", dice);
currentPos -= dice;
break;
case 3:
printf("損失 500 元\n");
money -= 500;
break;
case 4:
printf("獲利 600 元\n");
money += 600;
break;
}
break;
case 2:
printf("損失 1000元\n");
money -= 1000;
break;
case 3:
printf("獲利 1500元\n");
money += 1500;
break;
case 4:
printf("前進 二格\n");
currentPos += 2;
break;
case 5:
printf("後退 二格\n");
currentPos -= 2;
break;
case 6:
printf("損失 800元\n");
money -= 800;
break;
case 7:
printf("命運:");
lucky = rand()%4 + 1;
switch (lucky)
{
case 1:
dice = rand()%3 + 1;
printf("前進 %d 格\n", dice);
currentPos += dice;
break;
case 2:
dice = rand()%3 + 1;
printf("後退 %d 格\n", dice);
currentPos -= dice;
break;
case 3:
printf("損失 600 元\n");
money -= 600;
break;
case 4:
printf("獲利 500 元\n");
money += 500;
break;
}
break;
default:
break;
}

switch(currentPos)
{
case 0:
strcpy(finger, "↖");
break;
case 1:
strcpy(finger, "↑");
break;
case 2:
strcpy(finger, "↗");
break;
case 3:
strcpy(finger, "→");
break;
case 4:
strcpy(finger, "↘");
break;
case 5:
strcpy(finger, "↓");
break;
case 6:
strcpy(finger, "↙");
break;
case 7:
strcpy(finger, "←");
break;
default:
break;
}
}
system("pause");
return 0;
}

作業三題目
回到首頁