106 銀行招考七職等 高雄銀行-網路應用程式設計人員 高雄銀行網路應用程式設計人員-程式撰寫 考古題詳解
第 一 題25 分
(一)下列為 JAVA 部分程式內容,若輸出結果如下,請完成下列方框內適當的程式碼。【15 分】
原高鐵車廂號碼排列為:606 號車廂, 508 號車廂, 701 號車廂 重新排列後車廂號碼為:701 號車廂, 508 號車廂, 606 號車廂
public class StackTest {
public static void main(String args[]) {
System.out.print("原高鐵車廂號碼排列為: 606 號車廂, 508 號車廂, 701 號車廂\n");
// 建立空的字串堆疊
java.util.Stack<String> st = new java.util.Stack<String>();
// 堆疊依序壓入三元素物件
String c1 = "601"; st.push(c1);
String c2 = "501"; st.push(c2);
String c3 = "701"; st.push(c3);
// 堆疊依序彈出三元素物件
String e1 = st.pop();
String e2 = st.pop();
String e3 = st.pop();
// 確認資料是否符合先進後出特性
System.out.println("重新排列後車廂號碼為: " + e1 + "號車廂, " + e2 + "號車廂, " + e3 + "號車廂");
}
}
(二)下列 JAVA 程式內容,請問執行結果為何?【10 分】
public class Exam05 {
private static void permutation(int data[], int n, int got) {
if (n == got) {
for (int i = 0; i < n; i++) {
System.out.print(data[i] + " ");
}
System.out.println();
return;
}
int tmp;
for (int i = got; i < data.length; i++) {
tmp = data[i];
data[i] = data[got];
data[got] = tmp;
permutation(data, n, got + 1);
tmp = data[i];
data[i] = data[got];
data[got] = tmp;
}
}
public static void permutation(int data[], int n) {
permutation(data, n, 0);
}
public static void main(String[] argv) {
int data[] = {4, 5, 6};
permutation(data, 3);
}
}
登入後即可作答並保存紀錄。
第一題(一):Java Stack 堆疊
核心觀念
本題考查 Java Stack 類別及堆疊的「後進先出」特性(LIFO,Last In First Out)。
主要方法如下:
push:將元素放入堆疊頂端。pop:取出並移除堆疊頂端元素。- 先壓入的元素,會後取出;最後壓入的元素,會先取出。
解題方法
題目要求輸出:
原高鐵車廂號碼排列為:606 號車廂, 508 號車廂, 701 號車廂
重新排列後車廂號碼為:701 號車廂, 508 號車廂, 606 號車廂
因此堆疊應依序放入:
String c1 = "606"; st.push(c1);
String c2 = "508"; st.push(c2);
String c3 = "701"; st.push(c3);
堆疊內容變化如下:
| 操作 | 堆疊由底至頂 |
|---|---|
push("606") | 606 |
push("508") | 606, 508 |
push("701") | 606, 508, 701 |
第一次 pop | 取出 701 |
第二次 pop | 取出 508 |
第三次 pop | 取出 606 |
所以:
e1 = "701";
e2 = "508";
e3 = "606";
題目程式碼的文字誤植
題目所列程式碼為:
String c1 = "601";
String c2 = "501";
String c3 = "701";
若完全依照此程式執行,實際輸出會是:
重新排列後車廂號碼為: 701號車廂, 501號車廂, 601號車廂
因此,為符合題目指定輸出,601 應修正為 606,501 應修正為 508。
解題技巧
看到 Stack 題目時,直接抓住兩點:
push的順序是由底到頂。pop的順序完全相反。
若壓入順序為:
則彈出順序必為:
【答案】
String c1 = "606"; st.push(c1);
String c2 = "508"; st.push(c2);
String c3 = "701"; st.push(c3);
第一題(二):排列組合遞迴程式
核心觀念
本題考查:
- 遞迴(recursion)
- 陣列元素交換
- 回溯法(backtracking)
- 個元素的排列數量
permutation(data, n, got) 中:
got表示目前已決定到第幾個位置。- 當
n == got時,代表前 個位置均已完成,輸出目前排列。 for迴圈逐一選擇尚未固定區域的元素,與data[got]交換。- 遞迴結束後再交換一次,恢復原本陣列順序,供下一種排列使用。
解題方法
初始陣列為:
data = {4, 5, 6}
程式從第 0 個位置開始固定元素。
第 0 個位置固定為 4
陣列狀態:
{4, 5, 6}
接著處理第 1 個位置:
第 二 題25 分
下列 C 程式內容為:in1.txt 內之數字若為偶數,則將其值除以 ;若為奇數,則乘以 加 ,直到小於等於 停止。再換行處理下一筆資料,執行到沒有資料為止。經過處理後輸出至 out1.txt 中,檔案內容如下,請完成方框內適當的程式碼。【25 分】
in1.txt 檔案內容: 執行後 Out1.txt 檔案內容:
void main(void)
{
FILE *fin, *fout;
int n;
// 開啟資料輸入檔 in1.txt
fin = fopen("in1.txt", "rt");
if (fin == NULL) {
printf("Fail To Open File in1.txt!!");
return;
}
// 開啟資料輸出檔 out1.txt
fout = fopen("out1.txt", "w+t");
if (fout == NULL) {
printf("Fail To Open File out1.txt!!");
fclose(fin);
return;
}
// 自輸入檔讀取資料、處理運算、輸出資料至輸出檔
while (!feof(fin)) {
}
fclose(fin);
fclose(fout);
}
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- 使用
fopen、fscanf、fprintf進行檔案輸入與輸出。 - 以
feof(fin)判斷輸入檔是否讀取完畢。 - 偶數判斷:
n % 2 == 0。 - 奇數運算:。
- 重複運算直到 ,且每筆資料處理完成後輸出換行。
由於 、 本身已經符合停止條件,仍須先輸出原始值,因此適合使用 do...while 迴圈。
解題方法
每次先利用:
fscanf(fin, "%d", &n)
讀取一個整數,並確認確實讀取成功。接著使用 do...while:
- 先輸出目前的
n。 - 若目前值大於 ,輸出連字號
-。 - 若 ,停止本筆資料處理。
- 若為偶數,令 。
- 若為奇數,令 。
- 本筆資料完成後輸出換行。
填入程式碼
// 自輸入檔讀取資料、處理運算、輸出資料至輸出檔
while (!feof(fin)) {
if (fscanf(fin, "%d", &n) == 1) {
do {
fprintf(fout, "%d", n);
if (n <= 1) {
break;
}
fprintf(fout, "-");
if (n % 2 == 0) {
n = n / 2;
}
else {
n = n * 3 + 1;
}
} while (n > 1);
fprintf(fout, "\n");
}
}
解題技巧與常見陷阱
while (!feof(fin))只能表示「尚未讀到檔案結尾」,不能保證目前讀取成功,因此必須搭配:
第 三 題25 分
下列為購物車系統,當按下此商品的「放入購物車」按鈕後,則在 GridView 物件 gvCar 下方的 Label 控制項 lblCar 內出現此商品的規格與「已經放入購物車」,gvCar 連接 SQL 的 Price 資料庫,gvCar 的 OnRowCommand="ShowOrderList",「放入購物車」Button 的 CommandName="Order",請完成下列方框內 ShowOrderList 程式碼內容。【25 分】
protected void ShowOrderList(object sender, GridViewCommandEventArgs e)
{
int i = Convert.ToInt32(e.CommandArgument);
}
登入後即可作答並保存紀錄。
核心觀念
本題考查 ASP.NET GridView 的 RowCommand 事件處理:
e.CommandName:判斷按下哪一個按鈕。e.CommandArgument:取得該筆資料所在的列索引。gvCar.Rows[i]:取得指定的GridViewRow。row.Cells[1].Text:取得該列第二欄「規格」內容。lblCar.Text:顯示購物車提示訊息。
題目已給定:
int i = Convert.ToInt32(e.CommandArgument);
因此可直接將 i 視為被按下按鈕的資料列索引。依圖中欄位順序,「規格」為第二欄,索引值為 1。
解題方法
先確認命令名稱必須是 "Order",避免其他 GridView 命令誤觸發。接著依列索引取得資料列,再取出第二欄規格,組合成指定訊息:
protected void ShowOrderList(object sender, GridViewCommandEventArgs e)
{
int i = Convert.ToInt32(e.CommandArgument);
if (e.CommandName == "Order")
{
GridViewRow row = gvCar.Rows[i];
lblCar.Text = row.Cells[1].Text + " 已經放入購物車";
}
}
依圖中資料,若按下規格為 P8B75-V 的按鈕,lblCar 將顯示:
P8B75-V 已經放入購物車
解題技巧與常見陷阱
Cells採用從0開始的索引,因此第一欄是Cells[0],第二欄「規格」是Cells[1]。
第 四 題25 分
下列為商品顯示系統,當按下 GridView 物件 GridView1 中此商品的「詳細資料」後,則在同一網頁內顯示 DetailsView 物件 DetailsView1,顯示此商品所有詳細資料。當按下「返回」則顯示 GridView1,並回到原先顯示的分頁,如下圖,選擇編號 25 商品,顯示其詳細資料後按返回,仍然顯示包含編號 25 的分頁,GridView1 每頁顯示 10 筆資料。
GridView1 與 DetailsView1 都連接 SQL 的 Product 資料庫,按下「詳細資料」時執行 GV_SelectedIndexChanged,而 DetailsView 的「返回」其 CommandName="Return",執行 DV_ItemCommand。
請完成下列方框內 GV_SelectedIndexChanged【15 分】與 DV_ItemCommand【10 分】程式碼內容。
protected void GV_SelectedIndexChanged(object sender, EventArgs e)
{
GridView1.Visible = false;
DetailsView1.PageIndex
}
protected void DV_ItemCommand(object sender, DetailsViewCommandEventArgs e)
{
if (e.CommandName == "Return")
{
Det
}
}
登入後即可作答並保存紀錄。
核心觀念
本題考查 ASP.NET Web Forms 中:
GridView的分頁索引PageIndexGridView每頁筆數PageSize- 目前選取列的索引
SelectedIndex DetailsView顯示資料的索引PageIndexVisible控制控制項顯示與隱藏DetailsViewCommandEventArgs.CommandName判斷按鈕命令
GridView.SelectedIndex 是「目前分頁內的相對索引」,而 DetailsView.PageIndex 必須使用整個資料來源的絕對索引。
解題方法
假設:
GridView1.PageIndex:目前第幾頁,從 開始GridView1.PageSize:每頁顯示筆數,本題為GridView1.SelectedIndex:目前頁面中被選取的資料索引,從 開始
因此被選取資料在整個資料來源中的絕對索引為:
顯示詳細資料時,隱藏 GridView1,顯示 DetailsView1。
按下 CommandName="Return" 時,利用:
即可回到原先包含該商品的分頁。C# 整數相除會自動捨去小數部分。