摘要:以下是由希賽網整理的2013年上半年程序員考試下午真題,希望對備考程序員考試的考生有所幫助。
2013年上半年程序員考試下午真題:
● 閱讀以下說明和流程圖,填補流程圖中的空缺(1)~ (5) ,將解答填入答題紙的對應欄內。
【說明】
平面上一個封閉區域內穩定的溫度函數是一個調和函數。如果區域邊界上各點的溫度是己知的(非常數),那么就可以用數值方法近似地計算出區域內各點的溫度。
假設封閉區域是矩形,可將整個矩形用許多橫豎線切分成比較細小的網格,并以最簡單的方式建立坐標系統,從而可以將問題描述為:己知調和函數u(i,j)在矩形 {0≤i≤m; 0≤j≤n}四邊上的值,求函數u在矩形內部各個網格{(i,j)|i=1,....m-1; j=1,.....,n-1}上的近似值。
根據調和函數的特點可以推導出近似算式:該矩形內任一網格點上的函數值等于其上下左右四個相鄰網格點上函數值的算術平均值。這樣,我們就可以用法代法來進行數值計算了。首先將該矩形內部所有網格點上的函數值設置為一個常數,例如 u(0,0); 然后通過該法代式計算矩形內各網格點上的新值。這樣反復進行法代計算,若某次迭代后所 有的新值與原值之差別都小于預定的要求(如0.01),則結束求解過程。
【流程圖】
● 閱讀以下說明和C函數,填充函數中的空缺,將解答填入答題紙的對應欄內。
【說明】
函數GetDateld(DATE date)的功能是計算并返回指定合法日期date是其所在年份的第幾天。例如,date表示2008年1月25日時,函數的返回值為25,date表示2008年3月3日時,函數返回值為63。
函數Kday_Date(int theyear,int k)的功能是計算并返回指定合法年份theyear(theyear≥1900)的第k天(1≤k≤365)所對應的日期。例如,2008年的第60天是2008年2月29日,2009 年的第60天是2009年3月1日。
函數isLeapYear(int y)的功能是判斷y代表的年份是否為閏年,是則返回1,否則返回0。
DATE 類型定義如下:
typedef struct {
int year ,month ,day;
}DATE;
【C函數1】
int GetDateld( DATE date )
{
const int days _month[13] = { 0,31,28,31,30,31,30,31,31,30,
31,30 ,31 );
int i ,date_id = date.day;
for ( i = 0; i < (1) ; i++ )
date_id += days_month[i];
if ( (2) && isLeapYear(date.year) ) date_id++;
return date_id;
}
【C函數2】
(3) Kday_Date(int theyear ,int k)
{
int i;
DATE date;
int days_month(13) = { 0,31,28,31,30,31,30,31,31,30,31,30,31};
assert(k>=l && k<=365 && theyear>=1900); /*不滿足斷言時程序終止*/
date .year = (4) ;
if (isLeapYear(date.year)) days_month[2]++;
for (i=1; ; ) {
k = k - days_month(i++);
if (k<=0) { date .day = k + (5) ; date.month = i-1; break; }
}
return date;
}
● 閱讀以下說明和C程序,填充程序中的空缺,將解答填入答題紙的對應欄內。
【說明】
埃拉托斯特尼篩法求不超過自然數N的所有素數的做法是:先把N個自然數按次序排列起來,1不是素數,也不是合數,要劃去; 2是素數,取出2(輸出),然后將2的倍數都劃去:剩下的數中最小者為3,3 是素數,取出3(輸出),再把3的倍數都劃去;剩下的數中最小者為5,5是素數,再把5的倍數都劃去。這樣一直做下去,就會把不超過N的全部合數都篩掉,每次從序列中取出的最小數所構成的序列就是不超過N的全部質數。
下面的程序實現埃拉托斯特尼篩法求素數,其中,數組元素sieve[i](i>0)的下標i對應自然數i,sieve[i]的值為1/0分別表示i在/不在序列中,也就是將i劃去(去掉)時,就將sieve[i]設置為0。
【C 程序】
*include <stdio.h>
*define N 10000
int main __(3)__
{
char sieve[N+1] = {0};
int i = 0,k;
/*初始時2~N都放入sieve數組*/
for(i=2; (1) ; i++)
sieve[i] = 1;
for( k = 2; ;){
/*找出剩下的數中最小者并用k表示*/
for( ; k<N+1&& sieve[k]==0; (2));
if ( (3) ) break;
printf("%d\t",k); /*輸出素數*/
/*從sieve中去掉k及其倍數*/
for( i=k; i<N+1; i= (4) )
(5);
}/*end of for*/
return 0;
} /*end of main*/
● 閱讀以下說明和C程序,填充函數中的空缺,將解答填入答題紙的對應欄內。
【說明】
N個游戲者圍成一圈,從l~N順序編號,游戲方式如下:從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,直到剩余一個游戲者為止,該游戲者即為獲勝者。
下面的函數playing(LinkList head)模擬上述游戲過程并返回獲勝者的編號。其中,N個人圍成的圈用一個包含N個結點的單循環鏈表來表示,如圖4-1所示,游戲者的編號放在結點的數據域中。
在函數中,以刪除結點來模擬游戲者退出圈子的處理。整型變量c(初值為1)用于計數,指針變量p的初始值為head(如圖4-1所示)。游戲時,從p所指向的結點開始計數,p沿鏈表中的指針方向遍歷結點,c的值隨p的移動相應地遞增。當c計數到2時,就刪除p所指結點的下一個結點(因下一個結點就表示報數到3的游戲者),如圖4-2所示,然后將c設置為0后繼續游戲過程。
結點類型定義如下:
typedef struct node{
int code; /*游戲者的編號*/
struct node *next;
}NODE,*LinkList;
【C 函數】
int playing(LinkList head ,int n)
{ /* head 指向含有n個結點的循環單鏈表的第一個結點(即編號為1的游戲者) */
LinkList p = head ,q;
int theWinner ,c = 1;
whi1e ( n > (1) ){
if (c == 2) { /*當c等于2時,p所指向結點的后繼即為將被刪除的結點*/
q = p->next;
p->next = (2) ;
printf("%d\t" ,q->code); /*輸出退出圈子的游戲者編號時*/
free (q) ;
c = (3) ;
n--;
} /*if*/
p = (4) ;
c++;
}/*while*/
theWinner= (5) ;
free(p);
return theWinner; /*返回最后一個游戲者(即獲勝者)的編號*/
}
● 閱讀以下說明和Java程序,填充代碼中的空缺,將解答填入答題紙的對應欄內。
【說明】
某學校在學生畢業時要對其成績進行綜合評定,學生的綜合成績(GPA)由其課程加權平均成績(Wg)與附加分(Ag)構成,即GPA= Wg +Ag。
設一個學生共修了n門課程,則其加權平均成績 (Wg) 定義如下:
其中 ,gradei 、Ci 分別表示該學生第 i 門課程的百分制成績及學分。
學生可以通過參加社會活動或學科競賽獲得附加分(Ag)。學生參加社會活動所得的活動分(Apoints)是直接給出的,而競賽分(Awards)則由下式計算(一個學生最多可參加m項學科競賽):
其中 ,li 和Si 分別表示學生所參加學科競賽的級別和成績。
對于社會活動和學科競賽都不參加的學生,其附加分按活動分為0計算。
下面的程序實現計算學生綜合成績的功能,每個學生的基本信息由抽象類Student描述,包括學號(stuNo)、姓名(name) 、課程成績學分(grades) 和綜合成績 (GPA)等,參加社會活動的學生由類ActStudent描述,其活動分由Apoints表示,參加學科競賽的學生由類CmpStudent描述,其各項競賽的成績信息由awards表示。
【 C++代碼】
#include <string>
#include <iostream>
using namespace std;
const int N=5; /*課程數*/
const int M=2; /*競賽項目數*/
class Student{
protected:
int stuNo; string name;
double GPA; /*綜合成績*/
int (*grades) [2]; /*各門課程成績和學分*/
public:
Student ( const int stuNo ,const string &name ,int grades[ ] [2] ){
this->stuNo = stuNo; grades; this->name = name; this->grades =
grades;
}
virtual ~Student( ) { }
int getStuNo( ) {/*實現略*/
string getName( ) {/*實現略*/ }
(1) ;
double computeWg ( ){
int totalGrades = 0 ,totalCredits = 0;
for (int i = 0; i < N; i++) {
totalGrades += grades [i] [0] * grades [i] [1]; totalCredits +=
grades [i] [1];
}
return GPA =(double)totalGrades / totalCredits;
}
};
class ActStudent : public Student {
int Apoints;
public:
ActStudent(const int stuNo ,const string &name ,int gs[ ] [2] ,int
Apoints)
: (2) {
this->Apoints = Apoints ;
}
double getGPA ( ) { return GPA = (3) ;}
};
class CmpStudent: public Student{
private:
int (*awards) [2];
public:
CmpStudent (const int stuNo ,const string &name ,int gs[] [2] ,int
awards [ ] [2])
: (4) {this->awards = awards;}
double getGPA( ) {
int Awards = 0;
for (int i = 0; i < M; i++) {
Awards += awards [i] [0] * awards [i] [1];
}
return GPA = (5) ;
}
}
int main ( )
{ //以計算 3 個學生的綜合成績為例進行測試
int g1[ ] [2] = {{80 ,3} ,{90 ,2} ,{95 ,3} ,{85 ,4} ,{86 ,3}} ,
g2[ ][2] = {{60 ,3} ,{60 ,2} ,{60 ,3} ,{60,4} ,{65,3}} ,
g3[ ] [2] = {{80,3} ,{90,2} ,(70 ,3} ,{65,4} ,{75,3}}; //課程成績
int c3[ ] [2] = {{2 ,3} ,{3,3}}; //競賽成績
Student* students[3] = {
new ActStudent (101,"John" ,g1,3) , //3 為活動分
new ActStudent (102 ,"Zhang" ,g2 ,0),
new CmpStudent (103 ,"Li" ,g3 ,c3) ,
};
//輸出每個學生的綜合成績
for(int i=0; i<3; i++)
cout<< (6) <<endl;
delete *students;
return 0;
● 閱讀以下說明和Java程序,填充代碼中的空缺,將解答填入答題紙的對應欄內。
【說明】
某學校在學生畢業時要對其成績進行綜合評定,學生的綜合成績(GPA)由其課程加權平均成績(Wg)與附加分(Ag)構成,即GPA= Wg +Ag。
設一個學生共修了n門課程,則其加權平均成績 (Wg) 定義如下:
其中 ,gradei 、Ci 分別表示該學生第 i 門課程的百分制成績及學分。
學生可以通過參加社會活動或學科競賽獲得附加分(Ag)。學生參加社會活動所得的活動分(Apoints)是直接給出的,而競賽分(Awards)則由下式計算(一個學生最多可參加m項學科競賽):
其中 ,li 和Si 分別表示學生所參加學科競賽的級別和成績。
對于社會活動和學科競賽都不參加的學生,其附加分按活動分為0計算。
下面的程序實現計算學生綜合成績的功能,每個學生的基本信息由抽象類Student描述,包括學號(stuNo)、姓名(name) 、課程成績學分(grades) 和綜合成績 (GPA)等,參加社會活動的學生由類ActStudent描述,其活動分由Apoints表示,參加學科競賽的學生由類CmpStudent描述,其各項競賽的成績信息由awards表示。
【Java 代碼】
abstract class Student {
protected String name;
protected int stuNo;
protected double GPA; /*綜合成績*/
protected int [ ] [ ] grades; /*各門課程成績和學分*/
//其他信息略
public Student ( int stuNo ,String name ,int[ ] [ ] grades) {
this. stuNo = stuNo; grades; this.name = name; this.grades =
grades;
}
(1) ;
double computeWg( ){
int totalGrades = 0 ,totalCredits = 0;
for (int i = 0; i < grades.length; i++) {
totalGrades += grades [i] [0] * grades [i] [1] ;
totalCredits += grades [i] [1];
}
return (double)totalGrades / totalCredits;
}
}
class ActStudent extends Student {
private int Apoints;
ActStudent (int stuNo ,String name ,int[] [] grades ,int Apoints){
(2) ;
this. Apoints = Apoints;
}
public double getGPA( ) { return GPA = (3) ;
}
}
class CmpStudent extends Student {
private int [ ] [ ] Awards;
CmpStudent (int stuNo ,String name ,int[ ] [ ] grades ,int[ ] [ ] awards) {
(4) ;
this.Awards = awards;
}
public double getGPA__(6)__ {
int totalAwards = 0;
for (int i = 0; i < awards.length; i++) {
totalAwards += awards[i] [0] * awards[i] [1];
}
return GPA = (5) ;
}
}
public class GPASystem ( //以計算 3 個學生的綜合成績為倒進行測試
public static void main(String[] args) {
int [ ] [ ] gl = {{80,3} ,{90,2} ,{95,3} ,{85,4} ,(86 ,3}) ,
g2 = {{60,3} ,{60,2} ,{60,3} ,{60,4} ,(65 ,3}) ,
g3 = {{80,3} ,{90,2} ,{70,3} ,{65,4} ,(75 ,3}); //課程成績
int [ ][ ] e1 = ((2 ,3) ,{1,2}} ,e2 = {{1,3}}; //競賽成績
Student students[ ] = {
new ActStudent (101,"John" ,gl ,3), / /3 為活動分
new ActStudent (102 ,"Zhang" ,g2 ,0) ,
new CmpStudent (103,"Li",g3,e2)};
}
//輸出每個學生的綜合成績
for (int i = 0; i < students .length; i++) (
System.out,println( (6) );
}
}
}
熱門:信息系統管理工程師報考指南 | 2025年軟考報名時間及入口
推薦:信息系統項目管理師網絡課堂 |系統架構設計師網絡課程 | 工信部信創認證培訓
活動:25年高項備考 | 軟考機考模擬作答系統 | 網絡工程師網絡課程
備考:章節練習+真題 | 軟考備考學習資料 | 軟考免費課程
課程:論文專題講解 | 信息系統項目管理師試聽課
軟考備考資料免費領取
去領取