专项习题程序员考试练习题及答案(3年内考题)
●试题一
阅读下列算法说明和算法,将应填入(n)处的字句写在答题纸的对应栏内。
【算法说明】
为便于描述屏幕上每个像素的位置,在屏幕上建立平面直角坐标系。屏幕左上角的像素设为原点,水平向右方向设为X轴,垂直向下方向设为Y轴。
设某种显示器的像素为128×128,即在每条水平线和每条垂直线上都有128个像素。这样,屏幕上的每个像素可用坐标(x,y)来描述其位置,其中x和y都是整数,0≤x≤127,0≤y≤127。
现用一维数组MAP来存储整个一屏显示的位图信息。数组的每个元素有16位二进位,其中每位对应一个像素,"1"表示该像素"亮","0"表示该像素"暗"。数组MAP的各个元素与屏幕上的像素相对应后,其位置可排列如下:
MAP(0),MAP (1) ,…,MAP (7)
MAP (8) ,MAP (9) ,…,MAP (15)
MAP(1016),MAP(1017),…,MAP(1023)
下述算法可根据用户要求,将指定坐标(x,y)上的像素置为"亮"或"暗"。
在该算法中,变量X,Y,V,S,K都是16位无符号的二进制整数。数组BIT中的每个元素BIT(K)(K=0,...,15)的值是左起第K位为1,其余位均为0的16位无符号二进制整数,即BIT(K)的值为215-k。
【算法】
第1步根据用户指定像素的位置坐标(x,y),算出该像素的位置所属的数组元素MAP(V)。这一步的具体实现过程如下:
1.将x送变量X,将y送变量Y;
2.将Y左移 (1) 位,仍存入变量Y;
3.将X右移 (2) 位,并存入变量S;
4.计算Y+S,存入变量V,得到像素的位置所属的数组元素MAP(V)。
第2步算出指定像素在MAP(V)中所对应的位置K(K=0,…,15)。这一步的具体实现过程如下:将变量X与二进制数 (3) 进行逻辑乘运算,并存入变量K。
第3步根据用户要求将数组元素MAP(V)左起第K位设置为"1"或"0"。这一步的具体实现过程如下:
1.为把指定像素置"亮",应将MAP(V)与BIT(K)进行逻辑 (4) 运算,并存入MAP(V)。
2.为把指定像素置"暗",应先将BIT(K)各位取反,再将MAP(V)与BIT(K)进行逻辑 (5) 运算,并存入MAP(V)。
●试题一
【答案】(1)3 (2)4 (3)1111 (4)或(加)(5)与(乘)
【解析】(1)由于每一行像素占用8个数组元素,所以第y行的像素占用数组的第 8×y 到8×y + 7号元素。于是y需要乘以8存入变量Y,即左移3位。(2)x表示y行上的第x列像素,因为每个数组元素表示16个像素,所以需要将x除以16,得到所在数组元素位置。即右移4位。(3)X的后四位即表示像素在MAP(V)中所对应的位置,因此取x的后4位送入K即可。(4)因为0和1与1逻辑或的结果都是1,而与0逻辑或的结果不变。所以将MAP(V)与BIT(K)进行逻辑或(加),即可将MAP(V)指定位置"1"。(5)0和1与0逻辑与的结果都是0,而与1逻辑与的结果不变,所以将MAP(V)与取反后的BIT(K)进行逻辑与(乘),即可将MAP(V)指定位置"0"。
●试题四
阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。
【函数】
void QuickSort(int A[],int s,int t)
{int i=s,j=t+1,temp;
int x=A[s];
do{
do i++;while (1) ;
do j--;while(A[j]>x);
if(i<j){temp=A[i]; (2) ; (3) ;}
}while(i<j);
A[a]=A[j];A[j]=x;
if(s<i-1) (4) ;
if(j+1<t) (5) ;
}
●试题四
【答案】(1)A[i]<x(2)A[i]=A[j](3)A[j]=temp(4)QuickSort(A,s,j-1)
(5)QuickSort(A,j+1,t);
【解析】快速排序的思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。
A.画家算法的基本思想是先将屏幕赋值为背景色,然后在把物体各个面按其到视点距离远近排序
B.Z缓冲算法不仅需要帧缓冲区存放像素的亮度值,还需要一个Z缓冲区存放每个像素的深度值
C.扫描线算法首先按扫描行顺序处理一帧画面,在由视点和扫描线所决定的扫描平面上解决消隐问题
D.区域采样算法是利用图形的区域连贯性在连续的区域上确定可见面及其颜色和亮度
●试题一
阅读下列算法说明和算法,将应填入(n)处的语句写在答题纸的对应栏内。
【说明】
为了减少直接插入排序关键字的比较次数,本算法使用了二分(折半)插入法对一个无序数组R[1..n]进行排序。排序思想是对一个待插入元素,先通过二分法(折半)找到插入位置,后移元素后将该元素插入到恰当位置(假设R[]中的元素互不相同)。
【算法】
1.变量声明
X:DataType
i,j,low,high,mid,R0..n
2.每循环一次插入一个R[i]
循环:i以1为步长,从2到n,反复执行
①准备
X<-R[i]; (1) ;high<-i-1;
②找插入位置
循环:当 (2) 时,反复执行
(3)
若X.key<R[mid].key
则high<-mid-1
否则 (4)
③后移
循环:j以-1为步长,从 (5) ,反复执行
R[j+1]<-R[j]
④插入
R[low]<-X
3.算法结束
●试题一
【答案】(1)low<-1(2)low≤high(3)mid<-int((low+high)/2)(4)low<-mid+1
(5)i-1到low
【解析】这是一个通过自然语言描述二分插入排序的过程。整个过程由一个大循环来完成,在大循环中又包含两个循环,第一个循环是一个二分查找过程,第二循环是后移过程。
查找过程是在有序序列R[1].R[i-1]中查找R[i]的过程,这是一个典型的折半查找过程。初始时指针low指向第一个元素,即R[1],指针high指向第后一个元素,因此(1)空处应填写"low-1"。要查找R[i],先与中间元素进行比较,中间元素使用mid指向,因此,(3)空处应填入"mid<-int((low+high)/2)"。当R[i]<R[mid]时,则在前半部分查找,将high<-mid-1,如果R[i]>R[mid]时,则在后半部分查找,因此(4)空处应填"low<-mid+1"。那什么时候结束呢?显然,一种情况是已经找该元素,由于题目中已经假设元素互不相同,这种情况不会发生,二是没有找到该元素,即指针low和指针high之间的没有元素了,所以(2)空处应填写"low≤high"。(5)空所在循环是进行数据移动,结合下面语句,可以判断循环是从i-1开始,到什么时候结束呢?通过分析,可以知道,最终要把R[i]放在R[low]的位置,循环要到low时结束,因此(5)空处应填写"i-1到low"。
阅读下列算法说明和算法,将应填入(n)处的字句写在对应栏内。
【算法说明】
为便于描述屏幕上每个像素的位置,在屏幕上建立平面直角坐标系。屏幕左上角的像素设为原点,水平向右方向设为X轴,垂直向下方向设为Y轴。
设某种显示器的像素为128×128,即在每条水平线和每条垂直线上都有128个像素。这样,屏幕上的每个像素可用坐标(x,y)来描述其位置,其中x和y都是整数,0≤x≤127, 0≤y≤127。
现用一维数组MAP来存储整个一屏显示的位图信息。数组的每个元素有16位二进位,其中每位对应一个像素,“1”表示该像素“亮”,“0”表示该像素“暗”。数组MAP的各个元素与屏幕上的像素相对应后,其位置可排列如下:
MAP(0),MAP(1),…,MAP(7)
MAP(8),MAP(9),…,MAP(15)
MAP(1016),MAP(1017),…,MAP(1023)
下述算法可根据用户要求,将指定坐标(x,y)上的像素置为“亮”或“暗”。
在该算法中,变量X,Y,V,S,K都是16位无符号的二进制整数。数组BIT中的每个元素BIT(K)(K=0,…,15)的值是左起第K位为1,其余位均为0的16位无符号二进制整数,即BIT(K)的值为215-k。
【算法】
第1步 根据用户指定像素的位置坐标(x,y),算出该像素的位置所属的数组元素 MAP(V)。这一步的具体实现过程如下:
1.将x送变量X,将y送变量Y;
2.将Y左移(1)位,仍存入变量Y;
3.将X右移(2)位,并存入变量S;
4.计算Y+S,存入变量V,得到像素的位置所属的数组元素MAP(V)。
第2步 算出指定像素在MAP(V)中所对应的位置K(K=0,…,15)。这一步的具体实现过程如下:将变量X与二进制数(3)进行逻辑乘运算,并存入变量K。
第3步 根据用户要求将数组元素MAP(V)左起第K位设置为“1”或“0”。这一步的具体实现过程如下:
1.为把指定像素置“亮”,应将MAP(V)与BIT(K)进行逻辑(4)运算,并存入MAP(V)。
2.为把指定像素置“暗”,应先将BIT(K)各位取反,再将MAP(V)与BIT(K)进行逻辑(5)运算,并存入MAP(V)。
(1)3 (2)4 (3)1111 (4)或(加) (5)与(乘) 解析:(1)由于每一行像素占用8个数组元素,所以第y行的像素占用数组的第8×y到8×y+7号元素。于是y需要乘以8存入变量 Y,即左移3位。(2)x表示y行上的第x列像素,因为每个数组元素表示16个像素,所以需要将x除以16,得到所在数组元素位置,即右移4位。 (3)X的后四位即表示像素在MAP(V)中所对应的位置,因此取x的后 4位送入K即可。(4)因为0和1与1逻辑或的结果都是1,而与0逻辑或的结果不变。所以将MAP(V)与BIT(K)进行逻辑或(加),即可将MAP(V)指定位置“1”。(5)0和1与0逻辑与的结果都是0,而与1逻辑与的结果不变,所以将MAP(V)与取反后的BIT(K)进行逻辑与 (乘),即可将MAP(V)指定位置“0”。
温故而知新,下笔如有神近三年程序员考试专项习题训练及答案试题一 阅读下列算法说明和算法,将应填入 (n) 处的字句写在答题纸的对应栏内。算法说明 为便于描述屏幕上每个像素的位置,在屏幕上建立平面直角坐标系。屏幕左上角的像素设为原点,水平向右方向设为x轴,垂直向下方向设为y轴。 设某种显示器的像素有128X128,即在每条水平线和每条垂直线上都有128个像素。这样,屏幕上的每个像素可用坐标(x,y)来描述其位置,其中x和y都是整数,0x127,0y127。 现用一维数组MAP来存储整个一屏显示的位图信息。数组的每个元素有16位二进位,其中每位对应一个像素,“1”表示该像素“亮”,“0”表示该像素“暗”。数组MAP的各个元素与屏幕上的像素相对应后,其位置可排列如下:MAP(0),MAP(1),MAP(7)MAP(8),MAP(9),MAP(15)MAP(1016),MAP(1017),MAP(1023) 下述算法可根据用户要求,将指定坐标(x,y)上的像素置为“亮”或“暗”。 在该算法中,变量X,Y,V,S,K都是16位无符号的二进制整数。数组BIT中的每个元素BIT(K)(K=0,15)的值是左起第K位为1,其余位均为0的16位无符号二进制整数,即BIT(K)的值为2l5-k。算法第1步根据用户指定像素的位置坐标(x,y),算出该像素的位置所属的数组元素MAP(V)。这 一步的具体实现过程如下: 1、将x送变量X,将y送变量Y; 2、将Y左移 (1) 位,仍存入变量Y; 3、将X右移 (2) 位,并存入变量S; 4、计算Y+S,存入变量V,得到像素的位置所属的数组元素MAP(V)。第2步算出指定像素在MAP(V)中所对应的位置K(K=0,15)。这一步的具体实现过程如下: 将变量X与二进制数 (3) 进行逻辑乘运算,并存入变量K。第3步根据用户要求将数组元素MAP(V)左起第K位设置为”1”或”0”。这一步的具体实现过程 如下: , 1、为在指定像素置“亮”,应将MAP(V)与BIT(K)进行逻辑 (4) 运算,并存入MAP(V)。 2、为在指定像素置“暗”, 应先将BIT(K)各位取反,再将MAP(V)与BIT(K)进行逻辑 (5) 运算,并存入MAP(V)。习题很丰富,梦想易实现 试题二 阅读下列函数说明和C代码,将应填入匹l处的字句写在答题纸的对应栏内。 函数21说明 函数strcat(char *si,char *s2)是将字符串s2连接在字符串si之后,构成一个首指 针为s1的字符串。 函数2.1 void strcat(char *sl,char *s2) while(*s1!=0) ; (1) : for( ; (2) ;s1+,s2+); 函数22说明 本函数输入n(1000)个整数到指定数组,求该数组中最大元素的值和此元素的下标,最大元素值以函数值返回,此元素的下标通过指针形参带回调用处。 函数22 #include #define MAXLINE 1000 int maxindex(int a,int *index) int i,n; do printf(Please input nn); scanf(d,&n); while( (3) );/*保证输入的n在限定范围内*/ for(i=0 ; in ; i+) scanf(%d,&ai); *index=0; for(i=1 ; in ; i+) if( (4) ) *index=i; return (5) ; 试题三 阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。 函数31说明 函数insert_sort(int a,int count)是用直接插入排序法对指定数组的前count个元素从小到大排序。直接插入排序法的基本思想是:将整个数组(count个元素)看成是由有序的(a0,ai-1)和无序的(ai,aCount-1)两个部分组成;初始时i等于1,每趟排序时将无序部分中的第一个元素ai插入到有序部分中的恰当位置,共需进行count-1趟,最终使整个数组有序。函数3.1void insert_sort(int a , int count) int i, j, t; for(i=1 ; i=0 & taj) /*在有序部分中寻找元素ai的插入位置*/ (2) ; j-; (3) ;函数32说明 递归函数invert(int a,int k)将指定数组中的前k个元素逆置。函数32void invert(int a , int k); int t;if ( (4) ) invert( (5) ); t=a0; a0=ak-1; ak-1=t;试题四 阅读下列程序说明和C代码,将应填入 (n) 处的字句写在答题纸的对应栏内。程序4说明 本程序用古典的Eratosthenes的筛法求从2起到指定范围内的素数。如果要找出2至10中的素数,开始时筛中有2到10的数,然后取走筛中的最小的数2,宣布它是素数,并把该素数的倍数都取走。这样,第一步以后,筛子中还留下奇数3、5、7、9:重复上述步骤,再取走最小数3,宣布它为素数,并取走3的倍数,于是留下5、7。反复重复上述步骤,直至筛中为空时,工作结束,求得2至10中的全部素数。程序中用数组sieve表示筛子,数组元素sievei的值为1时,表示数i在筛子中,值为-1时表示数i已被取走。程序4#include #define MAX 22500main() unsigned int i , range , factor , k ; int sieveMAX ; printf(“please input the range : ”); scanf(“%d”,&range); /*range指出在多大的范围内寻找素数 */ for (i=2 ; i=range ; i+) /* 筛子初始化 */ (1) ; factor=2 ; while (factor=range) if ( (2) ) /*筛子最小数是素数 */ printf(“%dt”,factor); k=factor; while (kdatadata) SortTreelnsert( (1) ,S); else if(S-data(*tree)-data) SortTreelnsert( (2) ,S);函数52说明 函数void TraversalTree(BTREE *tree)用非递归方法,对以tree为根结点指针的二叉树进行后序遍历。函数5,2 void TraversalTree(BTREE *tree) BTREE *stack1000,*p; int tag1000,top=0; p=tree; do while(p!=NULL) stack+top=p; (3) ; taghop=0; *标志栈顶结点的左子树已进行过后序遍历* : while(top0 & (4) ) /* 栈顶结点的右子树是否被后序遍历过* p=stacktop-; putchar(p-data); if (top0) /*对栈顶结点的右子树进行后序遍历* (5) ; tagtop=1; while(top0); 参考答案试题一试题二(1) 3(1) s1+(2) 4(2) *s1= *s2(3) 1111(3) n=MAXLINE(4) 或(加)(4) ai a*index(5) 与(乘)(5) a*index试题三试题四(1) i-1(1) sievei = 1(2) aj+1 = aj(2) sievefactor = 1 或 sievefactor 0 或 sievefactor = 0 或 sievefactor != -1(3) aj+1 = t(3) sievek = -1(4) k 1(4) k+factor(5) a+1 , k-2(
阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。
【说明】
函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。
【函数】
void QuickSort( int A[ ],int s,int t)
{ int i=s,j=t+1,temp;
int x=A[s];
do{
do i ++ ;while (1);
do j -- ;while(A[j]>x);
if(i<j){temp=A[i];(2);(3);}
}while(i<j);
A[a] =A[j];A[j] =x;
if(s<i-1) (4);
if(j+1<t) (5);
}
(1)A[i]x (2)A[i]=A[j] 3)A[j]=temp (4)QuickSort(A,s,j-1) (5)QuickSort(A,j+1,t); 解析:快速排序的思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。
阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。
[说明]
完成以下中序线索化二叉树的算法。
[函数]
Typedef int datatype;
Typedef struct node {
Int ltag, rtag;
Datatype data;
*lchild,* rchild;
}bithptr;
bithptr pre;
void inthread ( p );
{if
{inthread ( p->lchild );
if ( p->lchild==unll ) (1);
if ( P->RCHILD=NULL) p->rtag=1;
if (2)
{if (3) pre->rchild=p;
if ( p->1tag==1 )(4);
}
INTHREAD ( P->RCHILD );
(5);
}
}
(1) P->LTAG=0 (2) (PRE) (3) (PRE->RTAG==1) (4) P->LCHILD=PRE (5) PRE=P
阅读以下说明和流程图,将应填入(n)处的字句写在对应栏内。
[说明]
设学生某次考试的成绩按学号顺序逐行存放于某文件中,文件以单行句点“.”为结束符。下面的流程图读取该文件,统计出全部成绩中的最高分max和最低分min。
(1) max←a (2) min←a (3) a="." (4) a>max或amax或maxa或max≤a (5) amin或a≤min或min>a或mina 解析:本题用到的三个变量及其作用分别为:a,存放读入的一行数据;max存放最高分;min存放最低分。算法首先读入文件的第一行数据a,若a为文件结束符“.”,则算法提前结束;否则为max和min赋初值a,循环读入文件其余部分,直至文件末尾。循环过程中,当某行数据a大于max时,更新max的值;当某行数据a小于min时,更新min的值。
阅读以下说明,回答问题,将解答填入对应的解答栏内。
. [说明] 请完成流程图以描述在数据A(1)至A(10)中求最大数和次大数的程序的算法。并将此改成PAD图。该算法的流程图如下图:
(1)max2 =A(1) mex1 =A(2) (2)i< =10 (3)max1 =A(i)1 max2 = max1 (4)i=i+1 解析:本题的算法思想是:先输入A(1)到A(10)的值,然后判断前两个数的大小。用变量max1存储最大数,用变量max2.存储次大数。然后逐个读入数据,分别和max1,max2比较,保证最大的存入max1,次大的存入max2。
●试题二
阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
该程序运行后,输出下面的数字金字塔
【程序】
include<stdio.h>
main ()
{char max,next;
int i;
for(max=′1′;max<=′9′;max++)
{for(i=1;i<=20- (1) ;++i)
printf(" ");
for(next= (2) ;next<= (3) ;next++)
printf("%c",next);
for(next= (4) ;next>= (5) ;next--)
printf("%c",next);
printf("\n");
}
}
●试题二【答案】(1)(max-′0′)(2)′1′(3)max(4)max-1(5)′1′【解析】该程序共有9行输出,即循环控制变量max的值是从1~9。每行输出分3部分,先用循环for语句输出左边空白,(1)空填"(max-′0′)";再用循环输出从1到max-′0′的显示数字,即(2)空和(3)空分别填1和max;最后输出从max-′1′~1的显示数字,即(4)空和(5)空分别填和max-1和′1′。
相关考题:
- 单位通知存款不论实际存期多长,均按存款人提前通知银行取款的期限划分为1天和7天两种。
- 行为主义学派强调( )因素对人格与行为的作用。A.环境B.基因C.认知D.本能
- 商业银行会计有何特点?
- 固定资产、无形资产、长期待摊费用等物权形式存在的资产不属于金融资产。
- 金融行业的所有资产都是金融资产。
- 根据奥尔德佛的ERG理论,人的核心需要包括( ). A.成就需求 B。生存需要 C。关系需要 D.权力需要 E.成长需要
- 商业汇票的付款人是持票人。
- 托收承付结算业务产生的网内往来汇划为代收业务。
- 计算机病毒攻击战是指将( )植入敌方计算机系统,删除其数据,瘫痪其系统。A.网络病毒B.基因病毒C.计算机病毒D.生物病毒
- 中长期贷款展期不得超过原贷款期限的一半,最长不得超过5年.