试题一 阅读下列算法说明和算法,将应填入
(n) 处的字句写在对应栏内。
1. 【算法说明】
为便于描述屏幕上每个像素的位置,在屏幕上建立平面直角坐标系。屏幕左上角的像素设为原点,水平向右方向设为X轴,垂直向下方向设为Y轴。
设某种显示器的像素为128×128,即在每条水平线和每条垂直线上都有128个像素。这样,屏幕上的每个像素可用坐标(x,y)来描述其位置,其中x和y都是整数,0≤x≤127, 0≤y≤127。
现用一维数组MAP来存储整个一屏显示的位图信息。数组的每个元素有16位二进位,其中每位对应一个像素,“1”表示该像素“亮”,“0”表示该像素“暗”。数组MAP的各个元素与屏幕上的像素相对应后,其位置可排列如下:
MAP(0),MAP
,…,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)的值为2
15-k 。
【算法】
第1步 根据用户指定像素的位置坐标(x,y),算出该像素的位置所属的数组元素 MAP(V)。这一步的具体实现过程如下:
1.将x送变量X,将y送变量Y;
2.将Y左移
位,仍存入变量Y;
3.将X右移
位,并存入变量S;
4.计算Y+S,存入变量V,得到像素的位置所属的数组元素MAP(V)。
第2步 算出指定像素在MAP(V)中所对应的位置K(K=0,…,15)。这一步的具体实现过程如下:将变量X与二进制数
进行逻辑乘运算,并存入变量K。
第3步 根据用户要求将数组元素MAP(V)左起第K位设置为“1”或“0”。这一步的具体实现过程如下:
1.为把指定像素置“亮”,应将MAP(V)与BIT(K)进行逻辑
运算,并存入MAP(V)。
2.为把指定像素置“暗”,应先将BIT(K)各位取反,再将MAP(V)与BIT(K)进行逻辑
运算,并存入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) 处的字句写在对应栏内。
1. 【函数2.1说明】
函数palindrome(char s[])的功能是,判断字符串s是否为回文字符串,若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样时,称该字符串是回文字符串,例如:“LEVEL”是回文字符串,而“LEVAL”不是。
【函数2.1】
int palindrome( char s[ ] )
{ char * pi, * pj;
pi=s; pj=s+strlen(s)-1;
while( pi<pj&&
){
pi ++ ;pj --
}
if(
)return -1;
else return 0;
}
【函数2.2说明】
函数f(char * str,char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。
例如若str的值为“33123333435”,del的值为“3”,调用此函数后,将输出3个子字符串,分别为“12”、“4”和“5”。
【函数2.2】
void f( char * str, char del)
{ int i ,j ,len;
len = strlen (str)
i=0;
while(i < len) {
while(
)i++; /*忽略连续的标志字符*/
/*寻找从str[i]开始直到标志字符出现的一个子字符串*/
j=i+1;
while(str[j] != del && str[j] ! = '\0')j ++
: '\0'; /*给找到的字符序列置字符串结束标志*/
printf("%s\t",&str[i]);
;
}
}
(1)*pi==*pj (2)pi<pj或者等价表达式 (3)str[i]==del (4)str[j] (5)i=j+1
[解析] (1)指针pi从左往右移动,指针pj从右往左移动,每移动一次,判断二者指向的元素是否相等,所以此处应填入判断语句*pi= =*pj。(2)pi如果能移动到pj右面,说明字符串是回文字符串,否则返回-1,所以此处应填入pi<pj或者其他等价表达式。(3)此处表达式判断当前字符是否等于标志字符del,即填入str[i]==del。(4)此处表达式为符合要求的字符串置结束标志,此时j已指向最后,所以应填入str[j]即可。(5)此处语句是修改i指针进行下一次循环,所以应填入i=j+1。
试题三 阅读下列函数说明和C代码,将应填入
(n) 处的字句写在对应栏内。
1. 【说明】
设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次L.Locate(x)操作时,令元素值x的结点的访问频度 freq加1,并将该结点前移,链接到现它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。
【函数】
void Locate( int &x)
{ <结点类型说明>
* p =first -> next;
while(p!=frist&&
)P=P->next;
if(p! =first) /*链表中存在x*/
{
;
<结点类型说明>
* current = P; /*从链表中摘下这个结点*/
Current -> prior -> next = current -> next;
Current -> next -> prior = current -> prior;
P = current -> prior; /*寻找重新插入的位置*/
While(p! =first &&
)p=p->prior;
Current-> next =
; /*插入在P之后*?
Current -> prior = P;
P -> next -> prior = current;
P->next=
;
}
else printf("Sorry. Not find! \n"); /*没找到*/
}
(1)p->data!=x (2)p->freq++ (3)current->freq>P->freq (4)p->next (5)current
[解析] (1)空所在的循环是定位x,将指针指向x结点(如存在的话),因此(1)空应填写“p->data!=x”。显然,(2)空是使该结点的访问频度加1,因此(2)空应填写“p->freq++”。(3)空所在的循环是根据访问频度定位x结点的新位置,用P指向x结点的前驱,因此(3)空处应填“current->freq>P->freq”。 (4)、(5)空之间的语句是将结点x插入在P之后。(4)空所在语句是将指针P指向x结点的前驱,因此(4)空应填写“p->next”。(5)空所在语句是将P后继指向结点current,因此空(5)处应填写“current”。
试题四 阅读下列函数说明和C代码,将应填入
(n) 处的字句写在对应栏内。
1. 【说明】
函数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
;
do j -- ;while(A[j]>x);
if(i<j){temp=A[i];
;
;}
}while(i<j);
A[a] =A[j];A[j] =x;
if(s<i-1)
;
if(j+1<t)
;
}
(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) 处的子句,写在对应栏内。
1. 【程序说明】
函数int commstr(char * str1,char * str2,int * sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。
函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。
【程序】
int strlen(char * s)
{char *t=s;
while( * ++);
return t-s-1;
}
int commstr(char) *str1,char *str2,int *sublen
{ char*s1, *s2;
int count=0,len1 ,len2,k,j,i,p;
len1:=strlen(str1)
len2 = strlen(str2);
if(len1>len2)
{s1=str1 ;s2=str2;}
else {len2 = len1;s1 = str2;s2 = str1;}
for(j=len2;j>0;j--) /*从可能最长子串开始寻找*/
{for(k=0;
<:len2;k++) /*k为子串s2的开始位置*/
{for(i=0;s1[
]!='\0';i++;) /*i为子串s1的开始位置*/
{ /*s1的子串与s2的子串比较*/
for (p=0;p<j)&&
;p++);
if (
) /*如果两子串相同*/
{for(p=0);p<j;p++} /*输出子串*/
printf ("%c",s2[k+p]);
printf ("\n");
count++;/*计数增1 */
}
}
}
if (count>0) break;
*sublen=(count>0)?
:0;
return count;
}
(1)k+j (2)i+j-1 (3)s1[i+P]==s2[k+P] (4)P==j或p>=j (5)j
[解析] 略。
试题六 阅读以下说明和Java代码,将解答写入对应栏内。
1. 【说明】
下面是一个Applet程序,其功能是输出已定义好的两个变量x和chr。请改正程序中的错误(有下划线的语句),使程序能输出正确的结果。
注意:不改动程序的结构,不得增行或删行。
import java. awt.*;
{
int x=10;
Label output1;
Label output2;
}
output1 = new Label("定义int类型变量"+"x,的初值为"+x);
output2 = new Label("定义char类型变量"+"chr,的初值为"+chr);
add(output1);
add(output2);
}
}
<HTML>
<HEAD>
<TITLE> ex34_3 </TITLE>
</HEAD>
<BODY>
width=400 height=400>
</applet>
</BODY>
</HTML>
(1)import java.applet.* (2)public class MyApplet extends Applet (3)char chr='R' (4)public void init() (5)<appletcode="MyApplet.class”
[解析] 创建applet程序应导入包applet。applet程序类继承自类 Applet。声明字符型变量应当使用单引号。初始化函数必须是公有的。调用applet类应当使用关键字code。
试题七 阅读以下应用说明及Visual Basic程序代码,将应填入
(n) 处的字句写在对应栏内。
1. 【说明】
已知窗体上有两个名为cmdGene和cmdSort的命令按钮。单击cmdCene按钮时,随机产生10个[1,100]范围内的整数并将它们放在数组intA中;单击cmdSort按钮时,用选择法排序这10个数并输出。
【程序代码】
Dim intA(1 To 10)As integer
Private Sub cmdGene_Click( )
Dim intl As Integer
Randomize
For intl = 1 To 10
intA(intl) =
Next intl
End Sub
Private Sub cmdSort_Click( )
Dim intl, intJ,intMin, intTemp As Integer
For intl = 1 To 9
intMin = intA(intl)
For intJ=
To 10
If intA(intJ) < intMin Then
Temp = intA(intJ)
intA(intJ)=
intMin = intTemp
End If
Next intJ
For intl = 1 To 10
Print Str(intA(intl))+" ";
Next intl
Next lntl
Print
End Sub
(1)1+int(rnd*100) (2)intI+1 (3)intMin (4)intA(intI)=intMin (5)Next intI
[解析] 根据题意,第一个空应该是产生10个[1,100]范围内的随机整数,因此填“1+int(rnd*100)”。 选择排序思想是:第i趟排序开始时,当前有序区和无序区分别为 R[1..i-1]和R[i..n](1≤i≤n-1),该趟排序则是从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1..i]和R[i+1..n)分别变为新的有序区和新的无序区。因为每趟排序均使有序区中增加了一个记录,且有序区中的记录关键字均不大于无序区中记录的关键字,即第i趟排序之后R[1..i].keys≤R[i +1..n].keys,所以进行n-1趟排序之后有R[1..n-1].keys≤R[n]. key。也就是说,经过n-1趟排序之后,整个文件R[1..n]递增有序。因此(2)空填“intI+1”;If intA(intJ)<intMin Then后的3条语句是实现数intA(intJ)与intMin的交换,因此(3)空填“intMin”;(4)空是实现最小数与无序区的第1个数交换,因此填“intA(intI)=intMin”;(5)空是循环结束语句,填“Next intI”。
试题八 阅读以下说明和C++代码,将解答写入对应栏内。
1. 【说明】
源程序文件vectorClass.cpp,其中定义了用于表示向量的类vector,但类vector的定义并不完整。请按要求完成下列操作,将类vector的定义补充完整,并给出输出结果。
1.补充类vector的构造函数,该函数有参数x和y,它们都是int型的数据,默认值都为 0。请使用参数列表的形式分别将类的数据成员a和b分别初始化为参数x和y的值。
2.完成类vector的成员函数input(int x,int y)的定义,将int型的参数x和y分别赋值给数据成员b和a。
3.完成类vector的友元函数friend double Multiply(vector &x,vector &y)的定义,先定义 double型的临时变量c,然后将参数对象x和对象y的数据成员a与b分别相乘再相加后赋值给c,最后返回c的值。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件vectorClass.cpp清单如下:
#include < iostream. h >
class vector
{
int a;
int b;
public:
vector(
):
{
}
void input(int x, int y)
{
}
void output( )
{
cout<<'('<<a<<','<<b<<")" <<endl;
}
friend double Multiply(vector &x,vector &y);
};
double Multiply(vector &x,vector &y)
{
double c;
return c;
}
void main( )
{
vector x(10,20),y;
double d;
y. input(2,3)
d=Multiply(x,y);
cout<<d<<endl;
}
程序输出结果是:
。
(1)int x=0,int y=0 (2)a(x),b(y) (3)b=x;a=y (4)c=x.a*y.a+x.b*y.b (5)70
[解析] 注意参数默认值的书写方法。分别对a,b赋值。注意赋值顺序,与构造函数的赋值不同。注意对象访问成员使用“.”操作符。 x.a=10;y.a=3;x.b=20;y.b=2,所以c=70。