全國計算機技術與軟體專業技術資格(水平)考試 2

  試題一(15分,每空3分)
閱讀下列說明和流程圖,將應填入__(n)__的字句寫在答題紙的對應欄內。
【流程圖說明]
下面的流程圖描述了對8位二進制整數求補的算法。
該算法的計算過程如下:從二進制數的低位(最右位)開始,依次向高位逐位查看,直到首次遇到“1”時,停止查看。然後,對該“1”位左面的更高位(如果有的話),逐位求反,所得的結果就是對原二進制數求補的結果。
例如:對二進制整數10101000求補的結果時01011000。
設8位二進制整數中的各位,從低位到高位,依次存放在整型數組bit的bit[1]~bit[8]中。例如,二進制整數10101000存放在數組bit後,就有bit[1]=0,bit[2]=0,…,bit[7]=0,bit[8]=1。若流程圖中存在空操作,則用nop表示。

流程圖中__(1)__處按“循環變數名:循環初值,增量,循環終值”格式描述。

試題二(15分,每空3分)
閱讀下列說明和流程圖,將應填入__(n)__的字句寫在答題紙的對應欄內。
【函式說明】
函式sort(int a[],int n)的功能時對數組a中的a[0]~a[n-1]這n個元素進行排序。排序過程如下:第一趟對所有的偶數下標p,比較a和a[p 1],若a>a[p 1],則將兩者交換;第二趟對所有的奇數下標q,比較a[q]和a[q 1],若a[q]>a[q 1],則將兩者交換;第三趟對偶數下標,第四趟對奇數下標,…,依次類推,直至整個數組元素有序排列為止。
【函式]
void sort (int a[],int n)
{
  int i ,j,t,tag=1;
 for(j=0;j<n;j = {
for (i=__(1)__;i<n-1;__(2)__= {
 if (a>a[i 1]) {t=a;a=a[i 1];a[i 1]=t;tag=0;}
}
tag
if (__(3)__) break;
 }
}
對包含十個元素的數組a採用上述方法排序時,元素間的比較次數最少為__(4)__次,最多為__(5)__次。

試題三(15分,每空3分)
閱讀下列說明和流程圖,將應填入__(n)__的字句寫在答題紙的對應欄內。
【函式說明]
函式movetoend(linkedlist la int i)的功能時:將線性表示a的第i個元素移到表尾。若移動成功,則返回0,否則返回-1。線性表a採用帶頭結點的單鍊表表示,la為表a的頭指針,如下圖所示。

鍊表結點的類型定義為:
typedef struct node {
 int key;
 struct node *next;
}*linkedlist
【函式]
int movetoend(linkedlist la,int i)
{
 linkedlist p ,q,prep;
 int k=1;
 p=la->next;prep=la;
 while(__(1)__){/*查找第i個元素並使指針p指向該結點*/
prep=p; p=->next;k
 }
 if (!p||k>i)return -1;
 if (__(2)__)/*第i個元素結點已經是表尾結點,則無需移動*/
 return 0;
 q=p;
 while(__(3)__)q=q-﹥next; /*查找表尾並使q指向表尾結點*/
 __(4)__=p->next;
 p->next=null;
 __(5)__;
 return 0;
}

從下列的2道試題(試題四至試題五)中任選1道解答。如果解答的試題數超過1道,則題號小的1道解答有效。試題四(15分,每空3分)
閱讀下列說明和流程圖,將應填入__(n)__的字句寫在答題紙的對應欄內。
【說明]
某單位舉辦了一場知識競賽,參加競賽的選手為300名,依次從1~300進行編號。競賽時 間為9:00~11:00。8道競賽題目依次從‘a’~‘h’編號,選手可按任意次序答題,每完成一道題目,可立即提交答案。若答題正確(y),則選擇其他題目進行解答,否則,可繼續做該題目或選擇其他題目進行解答,直至競賽結束。
選手提交答案的情況及判定結果由專人即時錄入,錄入的數據如下表1所示,對競賽情況進行統計和排名的結果如表2所示。

表1:輸入數據

提交時 間選手編號題目編號是否正確09:3714an09:508ay09:519bn09:5214an10:145an10:169bn10:235ay10:238by10:2714ay表2:輸出結果

名次選手編號完成題目數量總用時(分鐘)1821332511033141127

統計和排名的規則如下:
1. 若選手x在競賽時提交的題目p解答正確,2. 則解答該題目所用時 間如下計算:
解答題目p的用時=提交題目p正確的時 間-競賽的開始時 間+罰時
罰時=提交題目p錯誤解答的次數×20
例如:表1中14號選手在10:27提交了題目a的正確解答,因此該選手正確解答該題目所用時 間為87分鐘,由於之前的兩次提交錯誤解答,罰時為2×20=40分鐘,所以14號選手解答題目a的用時=87+40=127(分鐘)。
2.已經提交正確答案的題目再次提交時不再計算。
3.競賽結束時,選手的總用時為所有解答正確的題目用時累加所得,解答不正確的題目不計時。
4.排名時,完成題目數量多者排名靠前;若完成的題目數相同,則用時少者排名靠前;若完成的題目數和所用時 間均相等,則名次相同;完成題目數為0的選手不參加排名。
函式void statistic()的功能是:讀取輸入數據,進行統計、排名並輸出結果。
#define maxn 300
typedef struct {
 int no; /*選手編號*/
 int num; /*完成的題目數量*/
 int time; /*完成題目的總用時*/
 int d[8]; /*d用於記錄提交第i個題目錯誤答案的次數*/
 int a[8]; /*a用於記錄第i個題目是否已經提交正確答案*/
}info;
 【函式】
void statistic () {
 char ch,pass;
 int i,j,k,h,m,t,time,maxindex;
 info r[maxn 1];
 for(i=1;i<=maxn;i ){ /*數組r的元素置初值0*/
r no=0; r num=0; r time=0;
for(j=0;j<8;j ){r.d[j]=0;r.a[j]=0;}
 }/*for*/
 maxindex=0;
 while(1) {
/*錄入一名選手提交答案的信息(小時:分鐘,選手編號,題目號,是否正確)*/
scanf(”%d:%d,%d,%c”,&h,&m,&k,&ch,&pass);
if (h= =0) break;
r[k] no=k;
time=__(1)__;
if (isupper(ch)) ch=’a’ ch-‘a’;
if (pass !=’y’&& pass !=’y’) { r[k] d[ch-‘a’] ;continue;}
if (r[k] a[ch-‘a’]= =1) continue;
r[k] a[ch-‘a’]=1;
r[k] num ;
r[k] time =__(2)__;
if (k>maxindex) maxindex=k;
 } /*while*/
 for (i=1;i<maxindex;i ) {/*選擇排序*/
for(t=i,j=i 1;j<=maxindex;j )
if (r[t] num<r[j] num || __(3)__ t=j;)
if(__(4)__) { r[0]=r[t];r[t]=r;r=r[0];}
 }/*for*/
 k=1;r[0]=r[1];
 for(i=1;i<=maxindex;i ) /*輸出排名情況*/
 if(r[i].num>0){
if (r num!=r[0] num || r time!=r[0] time) k ;
r[0]=__(5)__;
printf(“%d: = m ] ”,k,r no,r num r time);
 } /*if*/
} /*statistic*/

試題五(15分,每空3分)
閱讀下列說明及visual basic程式代碼,將應填入__(n)__的字句寫在答題紙的對應欄內。
【套用說明]
某單位舉辦了一場知識競賽,參加競賽的選手為300名,依次從1~300進行編號。競賽時 間為9:00~ 11:00。8道競賽題目依次從‘a’~‘h’編號,選手可按任意次序答題,每完成一道題目,可立即提交答案。若答題正確(y),則選擇其他題目進行解答,否則,可繼續做該題目或選擇其他題目進行解答,直至競賽結束。
選手提交答案的情況及判定結果由專人即時錄入,錄入數據包括提交答案的時 間、選手編號、題目編號(a~h)、是否正確(y/n)。
對競賽情況進行統計和排名的規則如下:
1.若選手x在競賽時提交的題目p解答正確,則解答該題目所用時 間如下計算:
解答題目p的用時=提交題目p正確的時 間-競賽的開始時 間+罰時
罰時=提交題目p錯誤解答的次數×20
例如:表1中14號選手在10:27提交了題目a的正確解答,因此該選手正確解答該題目所用時 間為87分鐘,由於他在09:37和09:52兩次提交了題目a的錯誤解答,因此罰時為2×20=40分鐘,所以14號選手解答題目a的用時=87+40=127(分鐘)。
2.已經提交正確答案的題目再次提交時不再計算。
3.競賽結束時,選手的總用時為所有解答正確的題目用時累加所得,解答不正確的題目不計時。
4.排名時,完成題目數量多者排名靠前;若完成的題目數相同,則用時少者排名靠前;若完成的題目數和所用時 間均相等,則名次相同;完成題目數為0的選手不參加排名。
本應用程式的運行視窗如下圖所示:

視窗中的兩個文本框為txt_time和txt_player,分別用於錄入提交答案的時 間和選手編號。組合列表框combol提供題目編號(a~h),錄入時從中選擇。檢查框chk_yn用於輸入解答是否正確信息。當單擊“確定”按鈕(cmd_comfirm)時,錄入的提交信息加入列表框list1中,排名情況在列表框list2輸出。單擊“關閉”按鈕時退出應用程式。
在開發過程中,需要編寫的部分程式代碼如下:
【程式代碼]
private type info
 no as integer ’選手編號
 num as integer ’完成題目數量
 time as integer ’完成題目的總用時
 d(8) as integer ’d用於記錄提交第i個題目錯誤答案的次數
 a(8) as boolean ’a用於記錄第i個題目是否已經提交正確答案
end type
dim r(301) as info ’r[j]用於統計編號為j的選手提交答案的情況
dim maxindex as integer ’maxindex記錄提交答案的選手中編號最大者

private sub from_load ()
 for i=1 to 8
combo1.additem chr(__(1)__)
 next
 combol.text = combol.list(0): txt_time .text=””: txt_player.text=””
 for i=1 to 300
r(i).num=0: r(i).time=0: r(i).no=i
for j=1 to 8
 r(i).d(j)=0: r(i).a(j)=false
 next j,i
end sub

private sub cmd_confirm_click()
 dim h, m,k, time as integer,ch ,pass,s1 as string
 k= instr(txt _time .text,”:”):if k<2 then goto error1
 h=val(left(txt_time.text,k-1)):m=val(mid(txt_time.text,k 1))
 if h>11 or h=11 and m>0 or m>=60 then goto error1
 time =__(2)__’計算答題時 間,以分鐘為單位
 if txt_plater.text<1 or txt_player .text>300 then goto error1
 ch= __(3)__
 pass=iif(chk_yn.__(4)__ =0,”n”,”y”)
 s1=txt_time.text space(4) txt_player.text
 s1=s1 space(10-len(txt_player.text)) ch space(8) pass
 list1.additem s1
 k= val(txt_player.text) 'k為選手編號
 r(k).no=k'編號為k的選手的提交信息記錄在下標為k的數組元素中
 if k >maxindex then maxindex=k
 m = asc(ch)-asc(“a”)
 if pass <>”y” then  '編號為k的選手提交第m個題目的解答不正確
r(k).d(m)=r(k).d(m) 1
 else if r(k).a(m)<>true then'已經提交正確的題目的解答不再計算
 r(k).a(m)=true:r(k).num=r(k).num 1
 r(k).time=r(k).time __(5)__
 call statistic '調用過程statistic進行實時排名和輸出
 end if
 exit sub
 error1:msgbox”錄入信息有錯誤!”,vbokonly
end sub

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

試題六(15分,每空3分)
閱讀以下說明和c 程式,將應填入 __(n)__處的字句寫在答題紙的對應欄內
【說明】
以下程式的功能是計算三角形、矩形和正方形的面積並輸出。
程式由4個類組成:類triangle,rectangle和square分別表示三角形、矩形和正方形;抽象類finure提供了一個純虛擬函式getarea(),作為計算上述三種圖形面積的通用接口。
【c 程式】
#include<iostream.h>
#include<math.h>

class figure{
 public:
 virtual double getarea()=0;//純虛擬函式
};

class rectangle:__(1)__ {
 protected:
 double height;
 double width;
 public:
 rectangle(){};
 rectangle(double height,double width){
this->height=height;
this->width=width;
 }
 double getarea(){
return __(2)__ ;
 }
};

class square:__(3)__ {
 public:
 square(double width){
__(4)__ ;
 }
};

class triangle:__(5)__ {
 double la;
 double lb;
 double lc;
 public:
 triangle(double la ,double lb,double lc){
this ->la=la; this->lb; this->lc;
 }
 double getarea(){
double s=(la lb lc)/2.0;
return sqrt(s*(s-la)**(s-lb) *(s-lc));
 }
};

viod main(){
 figure* figures[3]={
new triangle(2,3,3),new rectangle(5,8),new square(5)};
for (int i=0;i<3;i ){
 cout<<”figures[“<<i<<”]area= “<<(figures)->getarea()<<endl;
}
 }
};

第七題(15分,每空3分)
閱讀以下套用說明及vb部分的程式代碼,將應填入__(n)__處的字句寫在答題紙的對應欄內
【套用說明]
設一個簡單的“通訊錄”存儲在一個access類型的資料庫表中,包括姓名、電話和email三個欄位。下面的應用程式實現對“通訊錄”資料庫表中的記錄進行增加、刪除及修改處理,其運行界面如下:

(1)數據控制項(data1)與"通訊錄"資料庫表相連線,用戶可通過"》"和"《"按鈕指定表中的當前記錄。
(2)文本框txt_name,txt_phone和txt_email 分別與資料庫中的姓名、電話和email欄位綁定,用於顯示當前記錄的內容。
(3)應用程式啟動時,"確定"按鈕(cmd_ok)和"取消"按鈕(cmd_cancel)不可操作,文本框中顯示錶中的第一條記錄,這時文本框處於不可操作狀態。
(4)單擊"增加"按鈕(cmd_add)或"修改"按鈕(cmd_modify)後,方可以編輯記錄內容,同時增加、刪除、修改和退出按鈕變為不可操作狀態。增加和修改操作需通過確定和取消按鈕確認。
(5)單擊刪除按鈕(cmd_del)後,彈出對話框,再單擊確定按鈕,當前記錄被刪除。
【程式代碼】
private sub enableop(isenabled as boolean)
 txt_name.enabled=isenabled :txt _phone.enabled=isenabled
 txt_email.enabled=isenabled
 cmd_ok.enabled= isenabled: cmd_cancel.enabled= isenabled
 cmd_add.enabled= not isenabled: cmd_del.enabled= not isenabled
 cmd_end.enabled= not isenabled: cmd_modify.enabled= not isenabled
end sub

private sub form_load()
 call enableop(false)
 detal.refresh
 if data1.recordset.recordcount=0 then
cmd_del.enabled= false: cmd_modify.enabled= __(1)__
 end if
end sub

private sub cmd_add_click() '單擊“增加”按鈕的代碼
 call enableop( __(2)__ )
 data1.recordset.addnew'在資料庫表中添加一個新記錄
 txt_name.__(3)__
end sub

private sub cmd_del_click()'單擊“刪除”按鈕的代碼
 on error goto error3
 ans=msgbox(“確定刪除嗎?”,vbyesno vbinformation,” 操作提示!”)
 if (ans=vbyes) then
data1.recordset.__(4)__
data1.recordset.movenext
if data1.recordset.eof then data1.refresh
 end if
 exit sub
 error3:
 msgbox err.description,vbokonly,”錯誤提示!”
end sub

private sub cmd_ok_click()  '單擊確定按鈕的代碼
 on error goto error1
 data1.recordset.__(5)__
 call enableop(false)
 exit sub
 error1:
 msgbox err.description,vbokonly,”錯誤提示!”
 data1,updatecontrols
call enableop(false)
end sub
'修改和取消按鈕的程式代碼略

試題八(15分,每空3分)
閱讀以下說明和java程式,將應填入__(n)__處的字句寫在答題紙的對應欄內
【說明】
以下程式的功能時三角形、矩形和正方形的面積輸出。
程式由5個類組成:areatest是主類,類triangle,rectangle和square分別表示三角形、矩形和正方形,抽象類figure提供了一個計算面積的抽象方法。
【程式】
public class areatest{
 public static viod main(string args[]){
figure[]figures={
 new triangle(2,3,3),new rectangle(5,8),new square(5)
};
for (int i= 0;i< figures.length;i ){
 system.out.println(figures ”area=” figures.getarea());
}
 }
}

public abstract class figure{
 public abstract double getarea();
}
public class rectangle extends __(1)__ {
 double height;
 double width;
 public rectangle (double height, double width){
this.height= height;
this. width = width;
 }
 public string tostring(){
return”rectangle: height=” height ”, width=” width ”:”;
 }
 public double getarea(){
return __(2)__
 }
}
public class square exends __(3)__
{
 public square(double width) {
__(4)__ ;
 }
 public string tostring(){
return” square:width=” width”:”;
 }
}

public class rectangle entend __(5)__
{
 double la;
 double lb;
 double lc;
 public triangle(double la ,double lb,double lc){
this.la=la; this.lb=lb; this.lc=lc;
 }
 public string tostring(){
return” triangle:sides=” la ”, ” lb ”, ” lc ”:”;
 }
 public double get area(){
double s=(la lb lc)/2.0;
return math.sqrt(s*(s-la) *(s-lb) *(s-lc));
 }
}