2012年上半年程序員考試下午真題

程序員 責(zé)任編輯:YLM 2017-08-17

添加老師微信

備考咨詢

加我微信

摘要:以下是由希賽網(wǎng)整理的2012年上半年程序員考試下午真題,希望對備考程序員考試的考生有所幫助。

2012年上半年程序員考試下午真題:

>>>點擊進入軟考初級程序員歷年真題下載

● 閱讀以下說明和流程圖,填補流程圖中的空缺(1)~(5),將解答填入答題紙的對應(yīng)欄內(nèi)。 

【說明】 已知數(shù)組A[1:n]中各個元素的值都是非零整數(shù),其中有些元素的值是相同的(重復(fù))。為刪除其中重復(fù)的值,可先通過以下流程圖找出所有的重復(fù)值,并對所有重復(fù)值賦0標(biāo)記。該流程圖采用了雙重循環(huán)。 處理思路:如果數(shù)組A某個元素的值在前面曾出現(xiàn)過,則該元素賦標(biāo)記值0。例如,假設(shè)數(shù)組A的各元素之值依次為2,5,5,1,2,5,3,則經(jīng)過該流程圖處理后,各元素之值依次為2,5,0,1,0,0,3。
【流程圖】
1.png

● 閱讀以下說明、C程序代碼和問題1至問題3,將解答寫在答題紙的對應(yīng)欄內(nèi)。 

【說明1】 設(shè)在某C系統(tǒng)中為每個字待型數(shù)據(jù)分配1個字節(jié),為每個整型(int)數(shù)據(jù)分配4個字節(jié),為每個指針分配4個字節(jié),sizeof(x)用于計算為x分配的字節(jié)數(shù)。 

【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語言的一個關(guān)鍵字,可以用來定義“只讀”型變量。
【問題1】(8分)

請寫出以上C代碼的運行結(jié)果。

【問題2】(4分)

(1)請定義一個“只讀”型的整型常量size,并將其值初始化為10;

(2)請定義一個指向整型變量a的指針ptr,使得ptr的值不能修改,而ptr所指向的目標(biāo)變量的值可以修改(即可以通過ptr間接修改整型變量a的值)。

注:無需給出整型變量a的定義。

【問題3】(3分)

某C程序文件中定義的函數(shù)f如下所示,請簡要說明其中static的作用,以及形參表“const int arr[]”中const的作用。

static int f(const int arr[])

{

/* 函數(shù)體內(nèi)的語句省略 */

}

● 閱讀以下說明和C函數(shù),填補C函數(shù)中的空缺(1)~(6),將解答寫在答題紙的對應(yīng)欄內(nèi)。 

【說明】 

函數(shù)numberOfwords(char message[])的功能是計算存儲在message字符數(shù)組中的一段英文語句中的單詞數(shù)目,輸出每個單詞(單詞長度超過20時僅輸出其前20個字母),并計算每個英文字母出現(xiàn)的次數(shù)(即頻數(shù)),字母計數(shù)時不區(qū)分大小寫。 假設(shè)英文語句中的單詞合乎規(guī)范(此處不考慮單詞的正確性),單詞不縮寫或省略,即不會出現(xiàn)類似don't形式的詞,單詞之后都為空格或標(biāo)點符號。 函數(shù)中判定單詞的規(guī)則是: (1)一個英文字母串是單詞; 

(2)一個數(shù)字串是單詞; 

(3)表示名詞所有格的撇號(')與對應(yīng)的單詞看作是一個單詞。 

除上述規(guī)則外,其他情況概不考慮。 例如,句子“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 函數(shù)numberOfwords中用到的部分標(biāo)準(zhǔn)庫函數(shù)如下表所述。
2.png
【C函數(shù)】 int numberOfwords (char message[]) { char wordbuffer[21], i=0;/* i用作wordbuffer的下標(biāo) */ (1) pstr; int ps[26]={0};/* ps[0]用于表示字母'A'或'a'的頻數(shù) */ /* ps[1]用于表示字母'B'或'b'的頻數(shù),依此類推 */ int wordcounter=0; pstr=message; while (*pstr){ if((2) (*pstr)){/* 調(diào)用函數(shù)判定是否為一個單詞的開頭字符 */ i=0; do{/* 將一個單詞的字符逐個存入wordbuffer[],并進行字母計數(shù) */ 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';/* 設(shè)置暫存在wordbuffer中的單詞結(jié)尾 */ wordcounter++;/* 單詞計數(shù) */ puts (wordbuffer);/* 輸出單詞 */ } (6) ;/* pstr指向下一字符 */ } return wordcounter; } 

● 閱讀以下說明和C函數(shù),填補C函數(shù)中的空缺(1)~(5),將解答寫在答題紙的對應(yīng)欄內(nèi)。 

【說明】 函數(shù)SetDiff(LA,LB)的功能是將LA與LB中的共有元素從LA中刪除,使得LA中僅保留與LB不同的元素,而LB不變,LA和LB為含頭結(jié)點的單鏈表的頭指針。 例如,單鏈表LA、LB的示例如下圖中的(a)、(b)所示,刪除與LB共有的元素后的LA如下圖中的(c)所示。 3.png 鏈表的結(jié)點類型定義如下: typedef struct Node { int data; struct Node *next; }Node, *LinkList; 函數(shù)SetDiff(LinkList LA, LinkList LB)的處理思路如下:

 (1)從LA的第一個元素結(jié)點開始,令LA的第一個元素為當(dāng)前元素。 

(2)在LB中進行順序查找,查找與LA的當(dāng)前元素相同者,方法是令LA的當(dāng)前元素先與LB的第一個元素進行比較,若相等,則結(jié)束在LB中的查找過程,否則繼續(xù)與LB的下一個元素比較,重復(fù)以上過程,直到LB中的某一個元素與LA的當(dāng)前元素相等(表明查找成功),或者到達LB的表尾(表明查找失?。橹?。 

(3)結(jié)束在LB表的一次查找后,若在LB中發(fā)現(xiàn)了與LA的當(dāng)前元素相同者,則刪除LA的當(dāng)前元素,否則保留LA的當(dāng)前元素。 

(4)取LA的下一個元素為當(dāng)前元素,重復(fù)(2)、(3),直到LA的表尾。 【C函數(shù)】 void SetDiff (LinkList LA, LinkList LB) { LinkList pre, pa, pb; /* pa用于指向單鏈表LA的當(dāng)前元素結(jié)點,pre指向pa所指元素的前驅(qū) */ /* pb用于指向單鏈表LB的元素結(jié)點 */ (1) ;/* 開始時令pa指向LA的第一個元素 */ pre=LA; while (pa){ pb=LB->next; /* 在LB中查找與LA的當(dāng)前元素相同者,直到找到或者到達表尾 */ while((2) ){ if (pa->data==pb->data) break; (3) ; } if (!pb){ /* 若在LB中沒有找到與LA中當(dāng)前元素相同者,則繼續(xù)考察LA的后續(xù)元素 */ pre=pa; pa=pa->next; } else{ /* 若在LB中找到與LA的當(dāng)前元素相同者,則刪除LA的當(dāng)前元素 */ pre->next=(4) ; free (pa); pa=(5) ; } } }

● 閱讀以下說明和C++代碼,填補C++代碼中的空缺(1)~(6),將解答寫在答題紙的對應(yīng)欄內(nèi)。 

【說明】 已知某公司按周給員工發(fā)放工資,其工資系統(tǒng)需記錄每名員工的員工號、姓名、工資等信息。其中一些員工是正式的,按年薪分周發(fā)放(每年按52周計算);另一些員工是計時工,以小時工資為基準(zhǔn),按每周工作小時數(shù)核算發(fā)放。 下面是實現(xiàn)該工資系統(tǒng)的C++代碼,其中定義了四個類:工資系統(tǒng)類PayRoll,員工類Employee,正式工類Salaried和計時工類Hourly,Salaried和Hourly是Employee的子類。 【C++代碼】 //頭文件和域名空間略 const int EMPLOYEE_NUM=5; class Employee { protected: int empCode;//員工號 string name;//員工姓名 double salary;//周發(fā)放工資 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) ; //計算正式員工的周發(fā)放工資數(shù) cout << this->name << ":" << this->salary<<endl; }; class Hourly (3) { private: double payRate;//小時工資數(shù) int hours; //周工作小時數(shù) 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) ;//計算計時工的周發(fā)放工資數(shù) 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)__;}//統(tǒng)計周發(fā)放工資患額 cout<<"總發(fā)放額="<<total<<endl; delete payRoll;return 0; }

● 閱讀以下說明和Java代碼,填補Java代碼中的空缺(1)~(6),將解答寫在答題紙的對應(yīng)欄內(nèi)。 

【說明】 已知某公司按周給員工發(fā)放工資,其工資系統(tǒng)需記錄每名員工的員工號、姓名、工資等信息。其中一些員工是正式的,按年薪分周發(fā)放(每年按52周計算);另一些員工是計時工,以小時工資為基準(zhǔn),按每周工作小時數(shù)核算發(fā)放。 下面是實現(xiàn)該工資系統(tǒng)的Java代碼,其中定義了四個類:工資系統(tǒng)類PayRoll,員工類Employee,正式工類Salaried和計時工類Hourly,Salaried和Hourly是Employee的子類。 【Java代碼】 abstract class Employee{ protected String name;//員工姓名 protected int empCode;//員工號 protected double salary;//周發(fā)放工資 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) ;//計算正式員工的周發(fā)放工資數(shù) 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) ;//計算計時工的周發(fā)放工資數(shù) 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++){ //統(tǒng)計周發(fā)放工資總額 total+=payRoll.employees[i].getSalary__(12)__; } System.out.println(total); } }

更多資料
更多課程
更多真題
溫馨提示:因考試政策、內(nèi)容不斷變化與調(diào)整,本網(wǎng)站提供的以上信息僅供參考,如有異議,請考生以權(quán)威部門公布的內(nèi)容為準(zhǔn)!

軟考備考資料免費領(lǐng)取

去領(lǐng)取

!
咨詢在線老師!