1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 6及答案与解析 1 阅读下列函数说明和 C函数,将应填入 (n)处的字句写在对应栏内。 【函数 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 pjpj - if(2)retu
2、rn -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(3)i+; /*忽略连续的标志字符 */ /*
3、寻找从 stri开始直到标志字符出现的一个子字符串 */ j=i+1; while(strj != del /*给找到的字符序列置字符串结束标志 */ printf(“%st“, (5); 2 阅读下列函数说明和 C代码,将应填入 (n)处的字句写在对应栏内。 【说明】 设有一个带表头结点的双向循环链表 L,每个结点有 4个数据成员:指向前驱结点的 指针 prior、指向后继结点的指针 next、存放数据的成员 data和访问频度freq。所有结点的 freq初始时都为 0。每当在链表上进行一次 L.Locate(x)操作时,令元素值 x的结点的访问频度 freq加 1,并将该结点前移,链接到
4、现它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。 【函数】 void Locate( int while(p!=frist if(p! =first) /*链表中存在 x*/ (2); 结点类型说明 * current = P; /*从链表中摘下这个结点 */ Current - prior - next = current - next; Current - next - prior = current - prior; P = current - prior; /*寻找重新插入的位置 */ While(p! =first Cur
5、rent- next =(4); /*插入在 P之后 *? Current - prior = P; P - next - prior = current; P- next=(5); else printf(“Sorry. Not find! n“); /*没找到 */ 3 阅读下列函数说明和 C代码,将应填入 (n)处的字句写在对应栏内。 【说明】 函数 QuickSort是在一维数组 An上进行快速排序的递归算法。 【函数】 void QuickSort( int A ,int s,int t) int i=s,j=t+1,temp; int x=As; do do i + ;while
6、(1); do j - ;while(Aj x); if(i j)temp=Ai;(2);(3); while(i j); Aa =Aj;Aj =x; if(s i-1) (4); if(j+1 t) (5); 4 阅读以下程序说明和 C程序,将应填入 (n)处的子句,写在对应栏内。 【程序说明】 函数 int commstr(char * str1, char * str2, int * sublen)从两已知字符串 str1和 str2中,找出它们的所有最长的公共子串。如果最长公共子串不止 1个,函数将把它们全部找出并输出。约定空串不作为公共子串。 函数将最长公共子串的长度送入由参数 su
7、blen所指的变量中,并返回字符串 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)
8、s1=str1 ;s2=str2; else len2 = len1;s1 = str2;s2 = str1; for(j=len2;j 0;j-) /*从可能最长子串开始寻找 */ for(k=0;(1) :len2;k+) /*k为子串 s2的开始位置 */ for(i=0;s1(2)!=0;i+;) /*i为子串 s1的开始位置 */ /*s1的子串与 s2的子串比较 */ for (p=0;p j)p+); if (4) /*如果两子串相同 */ for(p=0);p j;p+ /*输出子串 */ printf (“%c“,s2k+p); printf (“n“); count+;/*
9、计数增 1 */ if (count 0) break; *sublen=(count 0)?(5):0; return count; 5 阅读以下说明及 Visual Basic 程序代码,将应填入 (n)处的字句写在对应栏内。 说明 本程序求 3 100之间的所有素数 (质数 )并统计个数;同 时将这些素数从小到大依次写入顺序文件 E: dataout.txt;素数的个数显示在窗体 Form1上。 Visual Basic 代码 Private Sub Command1_ Click ( ) Dim count as integer, flag as Boolean Dim t1 as I
10、nteger, t2 as Integer (1) Count=0 For t1=3 to 100 Flag=Tree For t2=2 to Int( Sqr ( t1 ) ) If (2) Then flag=False Next t2 (3) count=(4) write #1, t1 End if Next t1 (5) Close #1 End Sub 6 阅读以下说明及 Visual Basic 程序代码,将应填入 (n)处的字句写在对应栏内。 说明 以下是一账号和密码输入的检 验程序。对输入的账号和密码规定如下所述。 (1)账号为不超过 6位的数字,密码为 4位字符,在本题中,
11、密码假定为 “Pass”。 (2)密码输入时在屏幕上不显示输入的字符,而以 “*”代替。 (3)当输入不正确,如账号为非数字字符或密码不正确时,显示有关信息。 (4)当输入正确时,关闭密码窗口,显示记事本窗口。 按要求完成有关控件的其他属性的设置,编写确定按钮的单击事件过程。相关界面如下: (可能要用到的单词: MultiLlne, ScrollBars, PasswordChar,MaxLength)密码窗口 frmPass控件设置如下表所示。 记事本窗口 frmNotepad 控件设置如下表所示。 在密码窗口的属性窗口,对密码文本框设置属性 MuniLine 为 False。 Visual
12、 Basic 代码 Private Sub cmd OK_ Click ( ) If txtPas. Text= “Pass“ Then Load frmNotePad frmNotePad. Show frmPass.Hide Else MsgBox “密码错误 ! “, vbExclamation + vbRetryCancel, “重输入密码 “ txtPas. Text= “ “ txtPas. SetFocus (1) End Sub Private Sub Form_ Load ( ) txtPas.PasswordChar = “*“ xtNo.MaxLength = 6 End
13、 Sub Private Sub txtNo LostFocus ( Dim i As Integer, s As String * 1 Fori= 1 To (2) s = Mid ( txtNo.Text, i, 1 ) If (3) Or (4) Then MsgBox “账号有非数字符号 ! “, vbExclamation + vbRetryCancel, “1 输入账号 “ (5) txtNo. SetFocus Exit Sub End If Next i End Sub 7 阅读以下说明和 C+代码,将解答写入对应栏内。 【说明】 请编写一个函数 int SeqSearch(i
14、nt list, int start, int n, int key),该函数从 start开始,在大小为 n的数组 list中查找 key值,返回最先找到的 key值的位置,如果没有找到则返回 -1。请修改程序中画线部分的错误并将不同情况下的输出结果补充完 整。 【程序】 文件 search.cpp的内容如下: #include iostream. h int SeqSearch( int list ,int start,int n,int key) for(int i=start;i =n;i+) /(1) if( listi = key)/(2) return i; return -1;
15、 void main( ) int A10 int key,count=0,pos; cout “ Enter a list of 10 integers:“; for(pos=0;pos 10;pos+) cin A; /(3) cout “ Enter a key; “; cin key; pos=0; while( pos = SeqSearch ( A, pos, 10, key) !=-1 ) count +; pos +; cout key “occurs“ count (count!=1?“ times“:“ time“) “ in the list,“ endl; 第一种情况:
16、输入 2 3 12 6 8 45 8 33 7输入 key: 8 输出: (4) 第二种情况:输入 2 3 126 8 45 8 33 7输入 k6y: 9 输出: (5) 8 阅读以下说明和 Java代码,将应填入 (n)处的字句写在对应栏内。 说明 编写一个字符界面的 Java Application 程序,接受用户输入的 10个整数,并输出这 10个整数的最大值和最小值。 Java 代码 import java. io.* ; public class abc public static void main (1) int i, n=10, max=0, min=0, temp=0; t
17、ry BufferedReader br = new BufferedReader ( new InputStreamReader ( System.in ) ); max = min =Integer. parselnt ( br. readLine ( ) ); . (2) ( IOExccption e ) ; for ( i=2 ; i =n ; i+ ) try BufferedReader br = new (3) ( new InputStreamReader ( System. in ) ); temp =(4) ( br. readLine ( ); if (temp max
18、 ) max=temp; if (temp min) (5) catch (IOException e ) ; System.out.println ( “max=“+max+“nmin=“+min ); 软件水平考试(初级)程序员下午(应用技术)模拟试卷 6答案与解析 1 【正确答案】 (1)*pi=*pj (2)pi pj或者等价表达式 (3)stri=del (4)strj (5)i=j+1 【试题解析】 (1)指针 pi从左往右移动,指针 pj从右往左移动,每移动一次,判断二者指向的元素是否相等,所以此处应填入判断语句 *pi= =*pj。 (2)pi如果能移动到 pj右面,说明字符串
19、是回文字 符串,否则返回 -1,所以此处应填入 pi pj或者其他等价表达式。 (3)此处表达式判断当前字符是否等于标志字符 del,即填入stri=del。 (4)此处表达式为符合要求的字符串置结束标志,此时 j已指向最后,所以应填入 strj即可。 (5)此处语句是修改 i指针进行下一次循环,所以应填入i=j+1。 2 【正确答案】 (1)p- data!=x (2)p- freq+ (3)current- freq P- freq (4)p- next (5)current 【试题解析】 (1)空所在的 循环是定位 x,将指针指向 x结点 (如存在的话 ),因此(1)空应填写 “p- d
20、ata!=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”。 3 【正确答案】 (1)Ai x (2)Ai=Aj 3)Aj=temp (4)QuickSort
21、(A, s, j-1) (5)QuickSort(A, j+1, t); 【试题解析】 快速排序的思想是:任取待排序序列中的某个元素作为基准 (一般取第一个元素 ),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。 4 【正确答案】 (1)k+j
22、 (2)i+j-1 (3)s1i+P=s2k+P (4)P=j或 p =j (5)j 5 【正确答案】 (1) Open “e:dataout.txt“ For Output as #1 (2) t1 mod t2=0 (3) If t2 Int (sqr(t1)Then (4) count +1 (5) Form1.Print “素数个数 “; count 6 【正确答案】 (1) End If (2) en (txt No. Text) (3) Asc(s) Asc(“0“) (4) Asc(s) Asc(“9“) (5) txtNo. Text= “ “ 7 【正确答案】 (1)for(
23、int i=start; i n; i+) (2)if(listi=key) (3)cin Apos (4)8 occurs 2 times in the list (5)9 occurs 0 time in the list 【试题解析】 数组下标从 0开始,所以 n次循环要在 i=n-1时结束,而不是在i=n时结束。判断是否相等使用 “=”,一个等号是赋值。将输入数字逐个赋给 A的 pos处的元素。 8出现 2次,注意结果中的 times。 9出现 0次,注意结果中的time。 8 【正确答案】 (1)String args (2) Catch (3) BufferedReadsr (4) Integer. parseInt (5) min=temp;