5
九九九九九九九九九九九九九九九九九九九九 一、 請請請請請 一。一,: (1) 請請九九九九 (請 1))(2) 請請九九九九 (請 2))(3) 請請九九九九 (請 3)) (4) 請請請請請請 【】 1) 請請請請請請請請請請請請九九請請 10 九請請請請(請請請請請請請 10 請) 請請請 (請請 10 請 請請)請請請請請 6 請請請(請請請請請) 請請請 。,,九九 請請 1 ~ 49 請請請 ;。。 2) 請請請請請請請請請 1 ~ 49 九九請請 九九九九請6請請請請請 一;。,九九九九請6請請請請 ,一,。 3) 請請請請請請請請請請 6請請請請請請請請6 請 請請 九九 6 請請請請請請請請 6 請請請請請請九九九 請請請請 ,一,九九 6 請請請請請請請請請請請請九九九請請請請請(請 請 ) 九九 九九九(請請請請請請請請請請請請請請請 請)請請請請請請請請請請請請 6 請 請 (請請請請請 6 請 請 (請 請請請請請請請 、、、 ))請請請請請 。,,一。 4) 請 請 請 ,,。 5)請請請請請 ;: 九九九九九九請請請請請九九九九九九請請 九九九九九九請請 九九九九九九 請請請…請請 6) 請 請 3 九九九九九九(請 請 請 、、)7) 請 請 請 請 、,,。 請請 一。 請請 (Menu) ,: (1) 九九九九 (請)(2) 九九 (請請)(3) 九九九九 (請請)(4) 九九九九 (請請) (5) 九九九九請請 【】 () 九九九九請請請請請請請請請請請(請請 10 請請請) 請請請請 5 (九) 九九請請請請請請請請 52 請請(請請請請)請九九請請九九 3 九九九九九九九九九九九九九九九九九九請請請請請請 請請請請請 九九九九 請請請請 請請請 九九九 請請請請請 請請請請請請請請請請請請 、、、。 A 2 3 4 5 910JQK 請請請請 1~13 請(請九九 請請請)(九) 九九九九請請 請 九九九九 九九九請請 九九九九3請九九九九九九(請請請請請請請請請) 九九 九九 請請 一。 (5)(4)(3) (6) ASCII 請 請 請 。,九九九請請 ,。 (九) 九九九九請請 ,。 (九) 請請請 ,,。 (九) 請請請請請請請請請請請九九九九九九九九九九 請請請 ;:,…請請(九) 九 九九 一,。 (九) 請請請請 、,,。 請請請九九九九 P. 1

九十九學年度第二學期計算機概論實習作業

Embed Size (px)

Citation preview

Page 1: 九十九學年度第二學期計算機概論實習作業

九十九學年度第二學期計算機概論暨實習作業一、 請設計一虛擬樂透號碼對獎程式。程式中請設計一選單介面,讓使用者可選擇下列功能

選項:(1) 輸入對獎號碼 (註 1))、(2) 產生開獎號碼 (註 2))、(3) 顯示中獎結果 (註 3))、或 (4) 離開程式。

【註】:1) 輸入對獎號碼:此功能允許使用者每次至多輸入 10 組對獎資料(亦可能輸入不滿 10

組);每組對獎資料應包括購買者姓名(最多 10 個字元)及其購買之 6 組數字(即對獎號碼)。使用者輸入購買者之對獎號碼時,可允許不依大小順序輸入,但程式必需檢查同一購買者之對獎號碼是否重覆,或是否超出 1 ~ 49 之間的號碼;若輸入錯誤則要求重新輸入該號碼。但不同購買者間允許購入相同號碼。

2) 產生開獎號碼:樂透開獎號碼為 1 ~ 49 之亂數產生;每次開獎號碼為 6 組數字及一個特別號;所有號碼不得重覆出現。開獎號碼產生完成後,請由小至大將 6 組號碼排列後,再連同特別號一併儲存,暫不印出。

3) 顯示中獎結果:若購買者所購入的 6 組對獎號碼與樂透 6 組開獎號碼全部相同時,則為頭獎;若購買者所購入的 6 組對獎號碼與樂透 6 組開獎號碼中任五組數字相同,且另一個數字與特別號相同時,則為二獎;若購買者所購入的 6 組對獎號碼只與開獎號碼中任五組數字相同時(但另一個數字與特別號不同時),則為三獎;其餘皆為歡喜獎。(本程式假設只需判斷此四種獎項即可)。中獎結果顯示時請先將樂透 6 組開獎號碼與特別號印出,之後再列印此次購買者之對獎資料(含姓名及其 6 組對獎號碼、及中獎獎別(頭獎、二獎、三獎、或歡喜獎)),供作檢核。中獎結果顯示後,請清除所有對獎資料與開獎號碼,供另一期開獎之用。

4) 操作中若輸入的功能代號錯誤,請提示錯誤訊息後,要求重新輸入。5) 程式設計過程中請注意其執行邏輯順序之合理性;例如:未選擇輸入對獎號碼前不

得執行產生開獎號碼選項,未選擇產生開獎號碼前,不得執行顯示中獎結果之選項…等等。

6) 本題至少須寫出一個主程式及 3 個函數副程式(即輸入對獎號碼之函數、產生開獎號碼之函數、及顯示中獎結果之函數)。

7) 輸入、輸出格式,或未規定事項請自行發揮設計,但請注意合理性與美觀性。

二、 請設計一個撲克牌比大小之遊戲程式。程式執行時提供一選單(Menu),讓使用者可選擇下列功能選項:(1) 玩家登錄 (註一)、(2) 派牌 (註二)、(3) 公佈結果 (註三)、(4) 另闢新局 (註四)、及(5) 遊戲結束。

【註】:(一) 玩家登錄:讓使用者輸入玩家姓名(最多 10 個字元),名額請設定為 5 位。輸入時

畫面必須顯示目前是第幾位玩家的資料登錄。(二) 派牌:派牌時由電腦自 52 張牌(扣除鬼牌)中,隨機分發每人 3 張;所有玩家手上

P. 1

Page 2: 九十九學年度第二學期計算機概論實習作業

之牌均不得重覆出現。個人所握之牌並依花色與點數由小至大排列儲存。花色由小至大分別為梅花、磚塊、紅心、與黑桃。點數 A、2、3、4、5、…、9、10、J、Q、K 依序代表 1~13 點。(請先考慮花色,再考慮點數之排列)。

(三) 公佈結果:公佈結果時,請依照玩家手上牌的點數總和,由高到低排列顯示。印出時需連同玩家姓名、3 張手上牌的資料(包括花色圖案與點數)、及其點數總和一併印出。花色圖案為 (5)、 (4)、 (3) 、 (6),括號內為該圖案之 ASCII 碼。顯示完之後請暫停並出現提示訊息,要求使用者按任意鍵繼續回到選單畫面,選擇其他功能。

(四) 另闢新局:另闢新局選項可以讓使用者清除該清除之資料內容後,重新執行程式選單之選擇。

(五) 遊戲中若輸入的功能代號錯誤,請提示錯誤訊息後,要求重新輸入。(六) 程式設計過程中請注意其執行邏輯順序之合理性;例如:未先選擇玩家登錄不得

執行派牌選項,未派牌前不得執行公布結果之選項…等等。(七) 本題每一功能選項之執行程式,均須設計成個別函式。(八) 輸入、輸出格式,或未規定事項請自行發揮設計,但請注意合理性與美觀性。

三、 請設計一遞迴程式,計算下列數學公式

註:1) 數列相加、次方、以及階層計算均請用遞迴函式完成。

四、 請設計一程式,讀取一文字檔案 (input4.txt),將其內所有的單字(word),按照字母順序(不管大小寫)排列,並計算該單字在該檔案中出現的總次數,及其出現的所有列數編號後,印出其結果。

【註】:文字檔案中的所有字皆為 20 個字元以內的英文單字,除空白間隔外,沒有其他標點符號。

例如:若輸入檔案的內容為:this is an apple

This is a pen

輸出為: WORDTIMES LINE

a 1 2

an 1 1

apple 1 1

is 2 1, 2

pen 1 2

this 2 1, 2

P. 2

Page 3: 九十九學年度第二學期計算機概論實習作業

五、 請設計一檔案異動程式;讀取異動檔 (update5.txt) 內的資料來修正主檔 (master5.txt) 內容,並將最後的更新結果回存到主檔上。之後,再利用更新後的主檔案內容,計算各科成績平均及標準差,並將結果輸出到檔案 (dxxxxxxx_5.txt)中。主檔案、異動檔及輸出檔案格式請依照下列要求準備或設計:主檔案格式:

1) 每一列為一筆資料。每一資料項以空格分隔。2) 第一資料項為學號(ID) (字元,長度為 8 個字元,Key,按照順序排列、不得重複)。3) 第二資料項為計概成績 (0~100 分之間的整數)。4) 第三資料項為計概實習成績 (0~100 分之間的整數)。

輸出檔案格式:1) 輸出的檔案請用個人學號命名。2) 每一列為一筆學生資料紀錄,每一紀錄內的資料項以空格分隔。3) 第一、二、三資料項與輸入格式相同。4) 第四資料項為二科總分 (整數,0~200 間的整數)。5) 第五資料項為二科平均 (浮點數,四捨五入至小數點後第二位)。6) 當所有學生的資料輸出後,再輸出一列包含各科平均成績及全班總平均。(其中第一

資料項印出“Avg.”,第二、三、四資料項分別為計概全班平均成績、計概實習全班平均成績及全班成績總平均。(浮點數,請四捨五入至小數點後第二位)

7) 最後一列請印出各科標準差。(第一資料項印出 “Dev.”,第二、三資料項分別為計概及計概實習全班成績之標準差。(浮點數,請四捨五入至小數點後第二位)

異動檔格式:1) 每一列為一筆資料,每一資料項以空格分隔。2) 第一資料項為學號 (字元,長度為 8 個字元,Key,按照順序排列、不得重複)。3) 第二資料項為資料異動型態 (字元,+ 代表新增,- 代表刪除, * 代表更新)

4) 第三資料項為計概成績 (0-100 間的整數,-1 代表不更新)。5) 第四資料項為計概實習成績 (0-100 間的整數,-1 代表不更新)。6) 新增時,若主檔中已經存在相同的 ID 時則不做處理,但須印出錯誤的異動資料,

否則將異動資料加入主檔中。7) 刪除時,如果主檔案中沒有該 ID 時,則主檔不做處理,但須印出錯誤的異動資料,

否則將主檔資料刪除。8) 更新時,如果主檔中沒有該 ID 時,主檔不做處理,但須印出錯誤的異動資料。如

果主檔中存在相同的 ID 時,則將舊資料取代成新資料後輸出。(視第三、四資料項的註記而定)

9) 異動檔的資料筆數不一定與主檔的資料筆數相同,但其內容均已依學號(ID)排序。

例如: 主檔內容為:1 100 80

2 90 50

4 30 60

5 40 30

P. 3

Page 4: 九十九學年度第二學期計算機概論實習作業

異動檔內容:2 - -1 -1

3 + 90 50

4 + 10 20

5 * 30 -1

6 - 20 90

更新後主檔案內容:1 100 80

3 90 50

4 30 60

5 30 30

輸出: 錯誤:新增時主檔已經有相同 ID 4

錯誤:刪除時主檔不存在 ID 6

【註】:輸入檔案的資料筆數不一定,請勿使用陣列儲存處理。

六、 二十一點(Black jack)遊戲程式設計:由電腦先將一副撲克牌(52 張)用亂數洗牌後,各發2 張牌給使用者(玩家)及電腦本身(莊家),其中 J、Q 及 K都代表 10 點,A 可視為 1 點或 11 點玩家先依手上牌的點數和決定是否再跟莊家要求補牌。玩家手上牌的點數總和不得超過 21 點否則視為失敗。當玩家於有效總和內(<=21 點)結束補牌後,莊家方可決定補牌與否。莊家手上牌的點數和不得少於 17 點,否則需無條件補牌,但仍不得超過 21 點,否則視為輸家。當雙方在有效總和內均停止補牌時,則依牌面點數總和大小決定輸贏。

【註】:1) 每次發(補)牌後的牌型,均需要列印出牌的花色( 、 、 、 的 ASCII 碼分別為

3 、4、5、6)及點數。2) 玩家在未失敗或結束補牌前,莊家之牌型不得讓對方知道(但須先顯示其中一張牌

供玩家判斷補牌與否)。3) 本題需用結構(struct)來儲存撲克牌的點數及花色。

七、 請設計一程式,讓使用者於一平面上輸入 3 組三角形之頂點座標後,依其面積大小排序後,將此三組三角形之資訊 (含頂點座標及面積) 列印出來。

【註】:1) 座標點及三角形定義請利用巢狀結構(Nested struct)來表示。2) 三角形三個頂點座標,其輸入的順序允許可不按照固定方向(如順時針或逆時針)輸

入,請利用程式自行判斷其位置關係。

P. 4

Page 5: 九十九學年度第二學期計算機概論實習作業

八、 請設計一程式,以亂數產生 20 位學生的英文姓名(8 個英文字元以內)、微積分成績與計概成績(均為 0~100 之整數分數)。並計算出每位學生該二科的平均成績,存於同一個結構陣列(Structure array)中。之後,依其平均成績高低排列,並將其原始結構陣列,以及排序後結構陣列結果列印出來。 註:1) 英文姓名、微積分成績、計概成績均請利用亂數隨機產生。

2) 必需將原始陣列傳遞到副程式中排序。 3) 資料交換必需使用另一副程式處理,並且利用 Call by address 的方式完成。

4) 學生英文姓名、微積分成績、計概成績、平均成績請以結構設計儲存。

九、 請設計一程式,由使用者輸入 2 個一元多次方程式,並分別建構成兩個 Linked List。之後,設計一功能界面,供使用者選擇執行兩多項式之相加或相乘計算,並印出運算結果。

   註:1) 多項式輸入為連續輸入下列格式:係數 次方

當輸入係數為 0 時表示多項式結束。若輸入多個相同次方的係數時,則將這些係數相加成為該次方的係數。例如 輸入 -3 1 3 3 1 1 1 0 0

表示多項式 3X3 -2X + 1 即 3X3 +(-3+1)X + 1

2) 多項式允許可不按次方大小順序輸入,但在多項式的 Linked List 中必須按照次方大小順序排列,也必須按次方大小順序印出。請自行撰寫程式處理。

3) 相加或相乘後的結果係數為零時,不可將此次方印出 (即必須從多項式 Linked List

中移除)。列印時使用下列格式印出,如上例:3X^3 -2X^1 + 1 則表示 3X3 -2X + 1。

十、 在 32 位元的個人電腦中,長整數之最大值是 2147483647(10 位數)。但在諸如國家財政預算的應用環境中,由於數值龐大(常以兆為單位;13 位數),則無法以標準資料型態表示之。有一種方式可以表現此種資料,那就是利用鏈結串列(Linked List);並假設每一節點(node)

代表一位數,如此則可利用該結構執行一些需要的運算,並列印出其結果。例如下面圖例即簡單顯示出兩個數值 9535 與 638,分別以鏈結串列表示後,並執行加法或減法運算之結果。

請設計一 C語言程式合乎下列要求條件:1). 輸入兩個未知位數大小的整數值 (注意:輸入的整數可能超過 int 所能表示的最大值),分別將其傳入 createlist()函數中,建構出兩個如上結構之鏈結串列 (ptr1 &

P. 5

1

進位:

0 1 0 1

3 5 95

7

638

3 01

+)

ptr1

ptr2

ptr3

1

Page 6: 九十九學年度第二學期計算機概論實習作業

ptr2)後,傳回主程式應用。(個位數請建於第一個節點上)

2). 撰寫一函數 addition( ),由主程式接收兩個原始鏈結串列 (ptr1 & ptr2),並執行加法計算後傳回結果之鏈結串列 (ptr3)。(本題不可以利用輸入之整數值直接計算,如:sum=num1+ num2,需採用上述鏈結串列方式處理計算) (注意:執行加法時應考慮有可能第一個鏈結串列長度較長,亦有可能第二個鏈結串列長度較長的情形)

3). 撰寫一函數 listing( ),可列印出其原始輸入之數值及加法後之結果大小。(本題不可以將輸入之原始整數值或結果直接印出,須透過鏈結串列來列印)。(提示:可利用建構反轉串列(inverted linked list)後再列印)

註:反轉串列即指所有的串列指標均反向指引,串列名稱指標則指向原始串列的最後一個節點。

【加分題】請設計一走迷宮程式,讀取地圖檔 (input11.txt) 後由程式自行走出迷宮,並印出離開迷宮時走過的路徑 (含方向或座標)。

輸入檔案格式:1) 第一列有一個數字 N ,代表地圖的大小。2) 接下來有 N * N 個以空格或斷行分隔的數字,其值為 0 或 1。 (注意:每一列不一定

儲存 N 個數字,但檔案中總共會有 N * N 個數字來標示地圖。)

3) 數值 0 表示可走之位置,數值 1 表示不可走之位置。4) 地圖由 N * N 個位置組成,入口座標為 (0, 0),出口座標為 (N -1, N -1)。5) 如果無法走到出口請印出”無法離開”訊息。6) 地圖檔請於授課資訊網頁下載。

P. 6