摘要:以下是由希賽網整理的2012年上半年程序員考試下午真題,希望對備考程序員考試的考生有所幫助。
2012年上半年程序員考試下午真題:
● 閱讀以下說明和流程圖,填補流程圖中的空缺(1)~(5),將解答填入答題紙的對應欄內。
【說明】 已知數組A[1:n]中各個元素的值都是非零整數,其中有些元素的值是相同的(重復)。為刪除其中重復的值,可先通過以下流程圖找出所有的重復值,并對所有重復值賦0標記。該流程圖采用了雙重循環。 處理思路:如果數組A某個元素的值在前面曾出現過,則該元素賦標記值0。例如,假設數組A的各元素之值依次為2,5,5,1,2,5,3,則經過該流程圖處理后,各元素之值依次為2,5,0,1,0,0,3。
【流程圖】
● 閱讀以下說明、C程序代碼和問題1至問題3,將解答寫在答題紙的對應欄內。
【說明1】 設在某C系統中為每個字待型數據分配1個字節,為每個整型(int)數據分配4個字節,為每個指針分配4個字節,sizeof(x)用于計算為x分配的字節數。
【C代碼】 #include <stdio.h> #include <string.h> int main__(2)__ { int arr[5]={10, 20, 30}; char mystr[]="JustAtest\n"; char *ptr=mystr; printf("%d %d %d\n", sizeof(int), sizeof(unsigned int), strlen(arr)); printf("%d %d\n", sizeof(char), sizeof(mystr); printf("%d %d %d\n", sizeof(ptr), sizeof(*ptr), strlen(ptr)); return 0; }
【說明2】 const是C語言的一個關鍵字,可以用來定義“只讀”型變量。
【問題1】(8分)
請寫出以上C代碼的運行結果。
【問題2】(4分)
(1)請定義一個“只讀”型的整型常量size,并將其值初始化為10;
(2)請定義一個指向整型變量a的指針ptr,使得ptr的值不能修改,而ptr所指向的目標變量的值可以修改(即可以通過ptr間接修改整型變量a的值)。
注:無需給出整型變量a的定義。
【問題3】(3分)
某C程序文件中定義的函數f如下所示,請簡要說明其中static的作用,以及形參表“const int arr[]”中const的作用。
static int f(const int arr[])
{
/* 函數體內的語句省略 */
}
● 閱讀以下說明和C函數,填補C函數中的空缺(1)~(6),將解答寫在答題紙的對應欄內。
【說明】
函數numberOfwords(char message[])的功能是計算存儲在message字符數組中的一段英文語句中的單詞數目,輸出每個單詞(單詞長度超過20時僅輸出其前20個字母),并計算每個英文字母出現的次數(即頻數),字母計數時不區分大小寫。 假設英文語句中的單詞合乎規范(此處不考慮單詞的正確性),單詞不縮寫或省略,即不會出現類似don't形式的詞,單詞之后都為空格或標點符號。 函數中判定單詞的規則是: (1)一個英文字母串是單詞;
(2)一個數字串是單詞;
(3)表示名詞所有格的撇號(')與對應的單詞看作是一個單詞。
除上述規則外,其他情況概不考慮。 例如,句子“The 1990's witnessed many changes in people's concepts of conservation.”中有10個單詞,輸出如下: The 1990's witnessed many changes in people's concepts of conservation 函數numberOfwords中用到的部分標準庫函數如下表所述。
【C函數】 int numberOfwords (char message[]) { char wordbuffer[21], i=0;/* i用作wordbuffer的下標 */ (1) pstr; int ps[26]={0};/* ps[0]用于表示字母'A'或'a'的頻數 */ /* ps[1]用于表示字母'B'或'b'的頻數,依此類推 */ int wordcounter=0; pstr=message; while (*pstr){ if((2) (*pstr)){/* 調用函數判定是否為一個單詞的開頭字符 */ i=0; do{/* 將一個單詞的字符逐個存入wordbuffer[],并進行字母計數 */ wordbuffer[i++]=*pstr; if (isalpha (*pstr)){ if((3) (*pstr)) ps[*pstr-'a']++; elseps[*pstr-'A']++; } (4) ;/* pstr指向下一字符 */ }while (i<20 && (isalnum(*pstr)||*pstr=='\'')); if (i>=20)/* 處理超長單詞(含名詞所有格形式) */ while (isalnum (*pstr)||*pstr=='\''){ pstr++; } (5) ='\0';/* 設置暫存在wordbuffer中的單詞結尾 */ wordcounter++;/* 單詞計數 */ puts (wordbuffer);/* 輸出單詞 */ } (6) ;/* pstr指向下一字符 */ } return wordcounter; }
● 閱讀以下說明和C函數,填補C函數中的空缺(1)~(5),將解答寫在答題紙的對應欄內。
【說明】 函數SetDiff(LA,LB)的功能是將LA與LB中的共有元素從LA中刪除,使得LA中僅保留與LB不同的元素,而LB不變,LA和LB為含頭結點的單鏈表的頭指針。 例如,單鏈表LA、LB的示例如下圖中的(a)、(b)所示,刪除與LB共有的元素后的LA如下圖中的(c)所示。 鏈表的結點類型定義如下: typedef struct Node { int data; struct Node *next; }Node, *LinkList; 函數SetDiff(LinkList LA, LinkList LB)的處理思路如下:
(1)從LA的第一個元素結點開始,令LA的第一個元素為當前元素。
(2)在LB中進行順序查找,查找與LA的當前元素相同者,方法是令LA的當前元素先與LB的第一個元素進行比較,若相等,則結束在LB中的查找過程,否則繼續與LB的下一個元素比較,重復以上過程,直到LB中的某一個元素與LA的當前元素相等(表明查找成功),或者到達LB的表尾(表明查找失敗)為止。
(3)結束在LB表的一次查找后,若在LB中發現了與LA的當前元素相同者,則刪除LA的當前元素,否則保留LA的當前元素。
(4)取LA的下一個元素為當前元素,重復(2)、(3),直到LA的表尾。 【C函數】 void SetDiff (LinkList LA, LinkList LB) { LinkList pre, pa, pb; /* pa用于指向單鏈表LA的當前元素結點,pre指向pa所指元素的前驅 */ /* pb用于指向單鏈表LB的元素結點 */ (1) ;/* 開始時令pa指向LA的第一個元素 */ pre=LA; while (pa){ pb=LB->next; /* 在LB中查找與LA的當前元素相同者,直到找到或者到達表尾 */ while((2) ){ if (pa->data==pb->data) break; (3) ; } if (!pb){ /* 若在LB中沒有找到與LA中當前元素相同者,則繼續考察LA的后續元素 */ pre=pa; pa=pa->next; } else{ /* 若在LB中找到與LA的當前元素相同者,則刪除LA的當前元素 */ pre->next=(4) ; free (pa); pa=(5) ; } } }
● 閱讀以下說明和C++代碼,填補C++代碼中的空缺(1)~(6),將解答寫在答題紙的對應欄內。
【說明】 已知某公司按周給員工發放工資,其工資系統需記錄每名員工的員工號、姓名、工資等信息。其中一些員工是正式的,按年薪分周發放(每年按52周計算);另一些員工是計時工,以小時工資為基準,按每周工作小時數核算發放。 下面是實現該工資系統的C++代碼,其中定義了四個類:工資系統類PayRoll,員工類Employee,正式工類Salaried和計時工類Hourly,Salaried和Hourly是Employee的子類。 【C++代碼】 //頭文件和域名空間略 const int EMPLOYEE_NUM=5; class Employee { protected: int empCode;//員工號 string name;//員工姓名 double salary;//周發放工資 public: Employee(const int empCode, const string &name ) { this->empCode=empCode;this->name=name; } virtual ~Employee__(5)__{ } virtual void pay__(6)__=0; double getSalary__(7)__ { return this->salary; } }; class Salaried (1) { private: double payRate;//年薪 public: Salaried(const int empCode, const string &namet double payRate):Employee (empCode, name) { this->payRate=payRate; } void pay__(8)__ { this->salary=(2) ; //計算正式員工的周發放工資數 cout << this->name << ":" << this->salary<<endl; }; class Hourly (3) { private: double payRate;//小時工資數 int hours; //周工作小時數 public: Hourly (const int empCode. const string &name, int hours, double payRate) :Employee(empCode, name) { this->payRate=payRate;this->hours=hours; } void pay__(9)__{ this->salary=(4) ;//計算計時工的周發放工資數 cout << this->name << ":" << this->salary << endl; } }; class PayRoll{ public: void pay (Employee*e[])( for (int i=0;i<EMPLOYEE_NUM; i++){ e[i]->pay__(10)__; } } }; int main__(11)__{ PayRoll payRoll=new PayRoll; (5) employees [EMPLOYEE_NUM]= { new Salaried (1001, "Zhang San", 58000.00), //此處省略對其他職工對象的生成 new Hourly (1005, "Li", 12, 50.00), }; payRoll->pay((6) ); double total=0.0; for (int i=0;i<EMPLOYEE_NUM; i++) { total+=employees[i]->getSalary__(12)__;}//統計周發放工資患額 cout<<"總發放額="<<total<<endl; delete payRoll;return 0; }
● 閱讀以下說明和Java代碼,填補Java代碼中的空缺(1)~(6),將解答寫在答題紙的對應欄內。
【說明】 已知某公司按周給員工發放工資,其工資系統需記錄每名員工的員工號、姓名、工資等信息。其中一些員工是正式的,按年薪分周發放(每年按52周計算);另一些員工是計時工,以小時工資為基準,按每周工作小時數核算發放。 下面是實現該工資系統的Java代碼,其中定義了四個類:工資系統類PayRoll,員工類Employee,正式工類Salaried和計時工類Hourly,Salaried和Hourly是Employee的子類。 【Java代碼】 abstract class Employee{ protected String name;//員工姓名 protected int empCode;//員工號 protected double salary;//周發放工資 public Employee(int empCode, String name){ this.empCode=empCode; this.name=name, } public double getSalary__(6)__{ return thissalary; } public abstract void pay__(7)__ ; } class Salaried (1) Employee{ private double annualSalary; Salaried(int empCode, String name, double payRate) { super(empCode, name) ; this.annualSalary=payRate; } public void pay __(8)__ { salary=(2) ;//計算正式員工的周發放工資數 System.out.println(this.name+":"+this.salary); } } class Hourly (3) Employee{ private double hourlyPayRate; private int hours; Hourly(int empCode, String name, int hours, double payRate) { super(empCode, name); this.hourlyPayRate=payRate; this.hours=hours; } public void pay __(9)__ { salary=(4) ;//計算計時工的周發放工資數 System.out.println(thisname+":"+this.salary); } } public class PayRoll{ private (5) employees[]={ newSalaried(1001, "Zhang San", 58000.00), //此處省略對其他職工對象的生成 new Hourly(1005, "Li", 12, 50.00) }; public void pay(Employee e[]){ for (int i=0; i<e.length; i++){ e[i]pay__(10)__; } } public static void main(String[] args) { PayRoll payRoll=new PayRoll__(11)__; payRoll.pay((6) ); double total=0.0; for (int i=0;i<payRoll.employees.length; i++){ //統計周發放工資總額 total+=payRoll.employees[i].getSalary__(12)__; } System.out.println(total); } }
熱門:信息系統管理工程師報考指南 | 2025年軟考報名時間及入口
推薦:信息系統項目管理師網絡課堂 |系統架構設計師網絡課程 | 工信部信創認證培訓
活動:25年高項備考 | 軟考機考模擬作答系統 | 網絡工程師網絡課程
備考:章節練習+真題 | 軟考備考學習資料 | 軟考免費課程
課程:論文專題講解 | 信息系統項目管理師試聽課
軟考備考資料免費領取
去領取