2008年6月26日 星期四

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

這個題目看起來複雜,其實不算難。有幾個關卡要解決,首先是要能讀入所有的佈雷資訊,使用二維字元陣列(亦稱為一維字串陣列)讀取檔案內容,然後逐一的判斷是要列印"*"或數字。下列的C語言程式碼逐一的檢討字元,看是要列印"*"或數字。
if (mine[i][j]=='.')
fprintf(fptr2, "%d", calcMineNumber(i,j));
else
fprintf(fptr2, "*");

這裡的calcMineNumber(i,j)是一個函數,負責計算第 i 列和第 j 行的週遭八個位置有多少是雷。其C語言完成碼如下。
int calcMineNumber(int i, int j)
{
int sum=0;
sum += addMine(i-1, j-1);
sum += addMine(i-1, j);
sum += addMine(i-1, j+1);
sum += addMine(i, j-1);
sum += addMine(i, j+1);
sum += addMine(i+1, j-1);
sum += addMine(i+1, j);
sum += addMine(i+1, j+1);
return sum;
}

這個函數的概念簡單清楚,只是加總外圍八個位置的佈雷情形。至於i,j合理與否並不考慮,這種模組式的考慮,可以將問題拆解成容易理解的程度。
這時addMine就是決定i,j是否合理的地方,其C語言程式碼如下。
int addMine(int i, int j)
{
if (i<0||j<0||i>=row||j>=column)
return 0;
if (mine[i][j]=='*')
return 1;
else
return 0;
return 0;
}

希望大家在完成這個題目後,對問題的模組化能有進一步的體會。
期末作業題目
回到作業目錄
回到首頁

小考十 解答

這題以C語言練習使用命令列語法,最常見的主程式輸入參數如下,argc是參數的數量,argv是參數的值,為一維字串陣列,或看成二維字元陣列。
int main(int argc, char *argv[])

程式一開始必須要能判斷參數數量是否正確,否則程式會產生錯誤的情形。
獲得的參數可以使用atof轉換成double,及atoi轉換成int,剩下的部份就簡單了,C語言程式碼解答如下,請參考。
解答A:
r = atof(argv[1]);
printf("Area of circle is %f\n", PI*r*r);
printf("Perimeter of circle is %f\n", 2*PI*r);

解答B:
n = atoi(argv[1]);
for (i=1; i<=n;i++)
sum += i*i*i;
printf("Sum is %d\n", sum);

小考十題目
返回小考目錄
回到首頁

2008年6月23日 星期一

小考九(A) 解答

用C語言以二進位方式存入整數陣列,在PC Windows作業系統使用Dev-C++時,每個整數是四個位元組,而"Knowledge is power"有17個字元,因此必須存入五個整數,第一個整數的四個位元組用字串讀出來後,必須是"Know",也就是十六進位的 4B 6E 6F 77,因為檔案中的整數位元組在被讀出時,是以反序方式進行,所以其整數值為776F6E4B,也就是2003791435,因此寫入時,就是寫入2003791435。
用相同的方法算出五個整數值,然後用二進位的方式寫入檔案quiz9.bin。
C語言主程式的全部程式碼如下,請參考。

FILE *fptr;
char str[80];
int num[5] = {2003791435, 1734632812, 1936269413, 2003791904, 29285};
fptr = fopen("quiz9.bin", "wb");
fwrite(num, sizeof(int), 5, fptr);
fclose(fptr);
fptr = fopen("quiz9.bin", "r");
fread(str, sizeof(char), 80, fptr);
fclose(fptr);
printf("%s\n", str);

小考九(A)題目
返回小考目錄
回到首頁

小考十 題目

/* C programming Quiz 10 */
/*
題目
(A) 利用命令列引數接受一個 double r,以計算並列印出圓的面積與周長。
(B) 利用命令列引數接受一個整數n,以計算1*1*1+2*2*2+3*3*3+...+n*n*n的和,並列印出結果。
*/

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

2008年6月9日 星期一

因應 UVa Online Judge 在IExplorer 的變形

看來UVa Online Judge 目前只支援 Firefox,在 IExplorer的畫面變的很擁擠。

為繼續使用UVa Online Judge,因應之道有二
一、安裝Firefox。
二、安裝 Ubuntu 到 Windows 上的 VirtualBox ,使用 Ubuntu 上的 Firefox 。
這篇的內容在教你完成第二個方法。
-------------------------------------------------------------

安裝 Ubuntu 到 VirtualBox 的步驟


主要內容:
VirtualBox 安裝於Windows環境 (Windows host),Ubuntu安裝於VirtualBox中 (Linux guest)。

基本需求:
目前的實驗中,1GB的RAM,4GB的硬碟空間,應該是綽綽有餘。

安裝步驟:

一、下載:

(一)用Google找到VirtualBox 的網頁,按Download,點選 Binaries(all platforms),目前的版本為VirtualBox 1.5.6。下載時,Platform選Windows x86,Language不動,預設為 Multi-language,勾選同意版權條款(I agree to the VirtualBox 1.5.6 License Agreement ),接著就可以下載安裝了。

(二)用Google找到Ubuntu的網頁,並在完成安裝VirtualBox後,參考http://wiki.ubuntu.org.tw/index.php/Ubuntu7.10Install在Virtual中安裝Ubuntu。

二、安裝設定VirtualBox:

(一)安裝完成VirtualBox,要先設定一個虛擬磁碟,在[檔案]->[虛擬磁碟管理器]的[硬碟]分頁中,新增一個約4GB的虛擬硬碟,可以選動態擴充映像檔或固定大小都可以。

(二)新增一個虛擬機器(Virtual machine),名稱自訂,作業系統類別選 Linux 2.6。接下來為設定記憶體,256MB或512MB皆可,如果你的記憶體只有 1GB,建議你虛擬機器設定256MB。再下一步為選定硬碟檔,就是稍早在前一個步驟中設定的 .vdi 檔。

(三)完成設定後,在視窗的左邊就出現了一台虛擬機器,你可以選擇它,然後按:設定值,會出現如下畫面:

這時候選擇光碟,畫面如下,必須掛載光碟並選擇已經下載的ISO映像檔,至於其他的部份可以自己選定,例如設定使用軟碟、音效、網路、序列埠和USB等,等安裝完Ubuntu後,就可以使用這些硬體資源,分享資料夾部份,後面會再介紹。


(四)啟動虛擬機器,由於你的光碟是掛載著Ubuntu的映像檔,所以會直接由該光碟開機。開機之後的畫面會很快完成,任你感覺有了另一個作業系統在VirtualBox中執行,但是這真的只是執行而已,還沒有安裝Ubuntu,此時桌面會有一個Install的光碟檔案圖像,你必須點兩下進行安裝Ubuntu的工作。整個執行的步驟應該是非常簡單的,因為你使用的硬碟是虛擬硬碟,有關各項細節的設定,請參考安裝說明。建議使用英文語言,這樣在shell畫面時,資料夾會比較方便處理。其實中文也OK啦。

(五)重新啟動Ubuntu,記住你再重新啟動前,先將光碟掛載改成正常的光碟機,否則你會被問要如何開機。(如果沒有將Ubuntu的安裝iso檔卸載,你仍然可以選擇從硬碟開機。)之後,你必須輸入使用者帳號密碼,就可以進入Ubuntu畫面,如果你有記體體不足的問題,請先關掉佔用大量記憶體的程式(例如iexplorer)。

(六)在Ubuntu的Applications下選Accessories,選Terminal。這個Terminal的程式,就像Windows環境中的命令執行單元。請執行
sudo apt-get install build-essential

這個指令是讓你以管理員的身分,執行安裝程式發展環境的指令,他會再問你一次密碼,安裝完成後,你就可以編輯一個簡單的C語言程式 test.c,然後使用 gcc test.c -o test 來編譯,並用 ./test來執行。

(七)安裝 Guest Additions,這是個功能擴充的檔案,可以在Google code中下載,檔名為VirtualBox_OSE_GuestAdditions-1.5.4-0.exe。請先關閉你的虛擬機器與VirtualBox在安裝這個擴充檔。安裝完畢後,重新將VirtualBox的Ubuntu開機,你會感覺這個VirtualBox好用多了,此時,在Ubuntu的視窗最外層的工具列中,選[裝置]->[安裝客端額外功能]。你會在Ubuntu桌面發現一個光碟掛載檔,這時你必須在terminal中使用
cd /cdrom
sudo ./VBoxLinuxAdditions.run

指令安裝,安裝完,重開機。這樣你的外掛就有了。裝這個外掛的原因是要能與Windows進行檔案分享。

(八)在Ubuntu的視窗最外層的工具列中,選[裝置]->[分享資料夾],如下畫面。此時你可以按右上角的新增來設定新的分享資料夾。這裡的名稱,要先記住。另外你也可以設定此資料夾紙能讓Ubuntu唯讀。

然後回到Terminal,使用指令 sudo mount -t vboxsf temp /home/liangk/D_TEMP,這裡的temp是分享資料夾的名稱,D_TEMP則是在Ubuntu中新建的資料夾。完成之後,Ubuntu和Windows就可以分享資料,以上圖為例,Windows使用D:\temp,而Ubuntu使用D_TEMP,其實這兩個資料夾是同一個。
 

2008年6月1日 星期日

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

作業內容:
本作業將使用C語言進行踩地雷遊戲的數字計算。

大部分的人都玩過踩地雷的遊戲,遊戲的開始是在一個M*N的陣列中佈有許多地雷,你必須將佈有地雷的地方插一個旗子,在沒有地雷的地方,填入這個格字的週遭(即上下左右斜上斜下等八個格子)佈有地雷的數字。下圖為Windows作業系統所附的遊戲畫面。在這個作業中,題目的輸入格式如下。題目中的 '*' 表示是地雷,'.' 表示不是地雷。題目第一列的兩個整數分別表示地雷矩陣的大小,亦即列數與行數。
17 36
*..*.**..........*.....*.........*..
.......*.....*.*......*.....*...**..
...**...............*...*.....*.....
........*...........*......**.*.....
.......*.....**..........*.....*..*.
...**............*...*.*.*.....*....
*...*.....**.*.*..*........*...**...
*...............*....*.....*........
.................*..*...........*...
....*...............**...**...*.....
*..**..*..*...........*.*....*.*...*
..**......*..........*.*.**...**....
.*.....*.............*..*...*.....*.
...*..**...*.*.**.....*......**.*.*.
....*.*.....*............**.........
..*...........*.*..*.**..*....**.**.
.*.*..**..**.....*...*...........*..

作業的輸出是以C語言計算所有非地雷點的週遭地雷數。有地雷的地方仍然印著 '*' ,沒地雷的地方則印著其週遭的地雷數。上述例題的答案如下所示。
*11*2**2100011212*10012*100111013*20
1123433*10001*2*211112*32101*212**20
001**112210011211002*312*11334*32210
00122112*10012210002*201222**3*31111
0012211*21001**1111122213*32223*21*1
111**211112233422*211*2*3*31103*4211
*213*20001**2*2*33*12231213*202**100
*201110001222122*3222*10002*20133200
11011100000000012*12*42012321112*100
1113*211111100001112**222**112*32111
*23**21*12*20000000134*3*5421*5*201*
23**312222*2000000002*4*4**223**2122
1*43213*2122212221002*43*322*44423*2
112*23**201*3*2**10012*223222**2*3*2
0123*3*31012*334321123322**113443432
12*32333112322*2*22*3**12*3101**3**1
1*3*11**11**11122*213*31111001223*31

解答下載
回到作業目錄
回到首頁