2004年上半年程式設計師下午試題及答案

試題一

閱讀下列說明、流程圖和算法,將應填入__(n)__處的字句寫在答題紙的對應欄內.
[流程圖說明]
下面的流程圖用n—s盒圖形式描述了數組a中的元素被劃分的過程.其劃分方法是:
以數組中的第一個元素作為基準數,將小於基準數的元素向低下標端移動,而大於基準數的元素向高下標端移動.當劃分結束時,基準數定位於a[i],並且數組中下標小於i的元素的值均小於基準數,下標大子i的元素的值均大於基準數。設數組a的下界為low,上界為high,數組中的元素互不相同。例如,對數組(4,2,8,3,6),以4為基準數的劃分過程
[算法說明]
將上述劃分的思想進一步用於被劃分出的數組的兩部分,就可以對整個數組實現遞增排序。設函式int p(int a[],int low,int high)實現了上述流程圖的劃分過程並返回基準數在數組a中的下標。遞歸函式void sort(int a[],iht l,int h)的功能是實現數組a中元素的遞增排序。
[算法]
 void sort(int a[],iht l,int h) {
 if ( l < h ) {
k=p(a,l,r); //p()返回基準數在數組a中的下標
sort(__ (4)__; //小於基準數的元素排序
sortl__ (5)__);//大於基準數的元素排序
}
 }

從下列的2道試題(試題二至試題三)中任選1道解答。如果解答的試題數超過1道,則題號小的1道解答有效。


試題二

閱讀下列函式說明和c函式,將應填入__(n)__處的字句寫在答題紙的對應欄內。
[函式2.1說明]
函式palindrome(chars[])的功能是:判斷字元串s是否為回文字元串,若是,則返回0,否則返回-1。若一個字元串順讀和倒讀都一樣時,稱該字元串是回文字元串,例如:“level”是回文字元串,而“leval”不是。
[函式2.1]
 int palindrome(char s[])
 { char *pi,*pj;
pi=s;pj=s+strlen(s)-1:
while ( pi<pj && __(1)__){
 pi++; pj--;
}
if(__ (2)__)return-1;
else return 0;
 }
[函式2.2說明]
函式f(char *str,char del)的功能是;將非空字元串str分割成若干個子字元串並輸出,del表示分割時的標誌字元。
例如若str的值為“33123333435”,del的值為‘3’,調用此函式後,將輸出三個子字元串,分別為“12”、“4”和“5”。

[函式2.2]
 void f(char*str,char del)
 { int i,j,len;
len = strlen(str);
i = 0;
while (i<len){
 while (__(3)__) i++;/*忽略連續的標誌字元*/
/*尋找從str[i]開始直到標誌字元出現的一個子字元串*/
 j = i + 1;
while (str[j] !=del && str[j] !='\0') j++;
__ (4)__="\0"; /*給找到的字元序列置字元串結束標誌*/
printf(" %s\t",&str[i]): ’
__ (5)__;
}
 }

試題三

以下是與visual basic開發套用有關的5個問題.對每一個問題,請將解答填入答題紙的對應欄內。
(1)在visual basic中,工程檔案、窗體檔案和標準模組檔案的擴展名是什麼?
請從下列選項中選擇:
prg、prj、exe、vbp、rom、frm、win、fra,std、bas、vbs、vbm

(2)設某窗體上有一個命令按鈕,其名稱為 cmdsave,運行時該按鈕上顯示有“保存(s)”字樣的信息。為使熱鍵 alt+s 與該命令按鈕相關聯,應該對按鈕 cmdsave 的 caption屬性設定什麼樣的屬性值?

(3)設某視窗內有一個圖像框 image1,以及兩個命令按鈕“放大”和“縮小”。單擊“放大”按鈕就會使該圖像框的長和寬都放大10%;單擊“縮小”按鈕就會使該圖像框的長和寬都縮小10%(該圖像框的左上角不動)。請分別寫出這兩個命令按鈕的單擊事件過程中的程式代碼。

(4)為使某個單選按鈕初始時默認被選中,在開發時應怎樣做?

(5)若有語句 tmpval=msgbox(非法操作!,ybokcancel+vbcritical,"提示"),請簡要描述程式運行時彈出的訊息框的主要特徵。

 

從下列的2道試題(試題四至試題五)中任選1道解答,如果解答的試題數超過1道,則題號小的1道解咎有效。

 閱讀以下說明和c代碼,將應填入__(n)__處的字句寫在答題紙的對應欄內。
[說明]
函式 multibaseoutput(long n,int b)的功能是:將一個無符號十進制整數 n 轉換成 b(2≤b≤16)進制數並輸出。該函式先將轉換過程中得到的各位數字入棧,轉換結束後再把 b 進制數從棧中輸出。有關棧操作的諸函式功能見相應函式中的注釋。c代碼中的符號常量及棧的類型定義如下:
 #define kaxsize 32
 typedef struct{
int *elem;/* 棧的存儲區 */
int max; /* 棧的容量,即找中最多能存放的元素個數 */
int top; /* 棧頂指針 */ 
 }stack;

[c代碼]
 int lnitstack(stack *s,int n)/* 創建容量為n的空棧 */
 { s->elem = (int *)matloc(n * sizeof(int));
if (s->elem == null) return -1;
s->max = n;__(1)__= 0;return 0;
 }
 int push(stack*s,int item) /* 將整數item壓入棧頂 */
 { if(s->top == s->max){ printf("stack is full!\n");return -1;}
__(2)__;item;return 0;
 }
 int stackempty(stack s){ return(!s.top) ? 1;0;) /* 判斷棧是否為空 */
 int pop(stack*s)/* 棧頂元素出棧 */
 { if (!s->top){ printf("pop an empty stack!\n");return -1;)
return __(3)__;
 }
 void multibaseoutput(long n,int b)
 { int m;stack s;
if (init stack(&s,maxsize)) { printf("failure!\n");return;}
do {
 if (push(&s,__(4)__)) { printf("failure!\n");return;}
 n = __(5)__:
} while (n != 0);
while (!stackempty(s)) { /* 輸出b進制的數 */
 m = pop(&s);
 if (m < 10) printf("kd",m);/* 小於10,輸出數字 */
 else printf("%c,m + 55);  /* 大於或等於10,輸出相應的字元 */
}
printf("\n");
 }

試題五

閱讀以下套用說明及visual basic程式代碼,將應填入__(n)__處的字句寫在答題紙的對應欄內。
[套用說明5.1]
本應用程式的窗體中有一個下拉式列表框(名稱為combol)和兩個文本框(名稱分別為txtl和txt2)。運行時,用戶從combol的列表中進行選擇,程式就會將選中條目的內容以及編號(從0開始)分別在文本框 txt1 和 txt2 中顯示出來。
[程式代碼5.1]
 private sub combol_c1ick()
txtl.text = combol.__(1)__
txt2.text = combol.__(2)__
 end sub
(註:可供(2)處選擇的選項:list,index,listlndex,listcount,number)
[套用說明5.2]
本應用程式的運行視窗如下圖所示:

當用戶在輸入框(名為txtln)中輸入數值數據,並從下拉式列表框(名為cmbop)中選擇所需的運算後,輸出框(名為txtout)中就會顯示運算的結果。用戶單擊“清除”按鈕(名為cmdclear)後,輸入框和輸出框都清空。
開發該套用的部分程式代碼如下:
[程式代碼5.2]
 private sub cmbop_click()
dim datain as double,dataout as double
datain = __(3)__
select case __(4)__
 case "取整數部分"
dataout = int(dataln)
 case "求平方根"
if dataln < o then
 msgbox$("負數不能開平方!")
else
 dataout = sqr(dataln)
end if
 case "取絕對值"
dataout = abs(dataln)
(txtout.text = str$(dataout)
__5)__
 end sub