国家二级(C语言)机试模拟试卷34(题后含答案及解析)_0

  • 格式:doc
  • 大小:27.50 KB
  • 文档页数:2

国家二级(C语言)机试模拟试卷34 (题后含答案及解析)

题型有:1. 程序填空题 2. 程序修改题 3. 程序设计题

程序填空题(30分)

1. str为一个字符序列。请补充函数fun( ),该函数的功能是:查找str中值为x的元素,返回该字符序列中值为x的元素个数,并把这些值为x的元素下标依次保存在数组bb中。例如,在“abcdefahij”中查找‘a’,结果为:2个‘a’,下标依次为 0、6。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun( )的横线上填入所编写的若干表达式或语句。 试题程序: #include<stdio.h> #include<conio.h>

#define N 20 int bb[N]; int fun(char *str,char ch) { int i=0, n=0;

char t=ch; char *p=str; while(*p) { if (【 】) 【 】;

p++; i++; } return【 】; } main( ) { char

str[N]; char ch; int i, j,n; clrscr( ); printf(“***Input

the original string ***\n”); gets(str); printf(“***The Original ***\n”);

puts(str); printf(“***Input character ***\n”); scanf(“%c”,&ch);

n=fun(str,ch); printf(“\nThe numbr of character is: %d\n”, n);

printf{“***The suffix of character ***\n”); for(i=0;i<n;i++)printf(“%d

“,bb[i]); }

正确答案:*p==tbb[n++]=In

解析:第一空:通过指针p的移动来依次访问字符串的各个字符,如果指针p所指的字符等于待查找的字符,即表示找到了满足条件的字符。第二空:将找到的字符在字符数组中的下标值保存在数组bb中。第三空:变量n记录在字符串中找到待查找字符的个数。由main函数的调用可知函数fun( )的返回值为n。

程序修改题(30分)

2. 假如整数数列中的数不重复,并存放在数组中。下列给定的程序中,函数fun( )的功能是:删除数列中值为X的元素。 N中存放的是数列中元素的个数。 请改正程序中的错误,使它能够得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include<stdio.h> #define N 20 fun (int *a,int n,int x) {int p=0,i; a[n]=x;

while (x!=a[p]) p=p+1; if(p==n) return -1; else {for (i=p;i<n;i++) /*************found**************/a[i+1]=a[i]; return

n-1; } } main( ) {int w[N]={-3,0,1,5,7,99,10,15,30,90}, x,n,i;

n=10; printf(“The original data :\n”); for (i=0;i<n;i++) printf(“%5d”,w[i]);

printf(“\nInput x (to delete ): “);scanf(“%d”,&x); printf(“Delete : %d\n”,x);

n=fun(w,n,x); if (n==-1) printf(“***No be found! ***\n\n”); else

{printf(“The data after deleted:\n”); for (i=0;i<n;i++)

printf(“%5d”,w[i]);printf(“\n\n”); } }

正确答案:错误:a[i+1]=a[i]; 正确:a[i]=a[i+1];

解析:上机改错题有一个优势,就是我们可以执行该程序,根据错误的提示再一步一步实现改错的目的,我们先不看程序是什么意思,甚至不用看它在求什么。按Ctrl+F9快捷键,然后看看屏幕提示。另外,审题时我们必须要注意“不要改动main( )函数,不得增行或减行,也不得更改程序结构”,这样;对我们来说,只要读懂题意,对程序执行部分: {int p=0,i; a[n]=x; while (x!=a[p])

p=p+1; if (p==n) return -1; else { for (i=p;i<n;i++) a[i+1]=a[i]; return

n-1; } 逐步分析,再应用平时的常识加以区分,琢磨,相信答案不攻自破,这种考题,按Ctrl+F9快捷键后,屏幕一般都不会提示错误,否则就显得太儿科了一点,所以,我们并不需要着急去找错误,而是把程序读懂。

程序设计题(40分)

3. 请编写一个函数void fun(char *tt,int pp[]),统计在tt字符串中“a”到“ z”26个字母各自出现的次数,并依次放在pp所指数组中。 例如:当输入字符串abcdefghabcdeabc后,程序的输出结果应该是:33322110000000000000000000

注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include <conio.h> #include <stdio.h> void fun (char*tt, int pp[]) { }

main( ) { char aa[1000]; int bb[26], k, n; clrscr( );

printf(“\nPlease enter a char string: “) ; scanf(“%s”,aa); fun(aa,bb); for

(k=0 ;k<26 ; k++) printf(“%d “,bb[k]) ; printf(“\n “); }

正确答案:void fun(char*tt,int pp[] ) { int i; fori=0;i<26;i++)

pp[i]=0; /*初始化pp数组各元素为0*/ for(;*tt!=‘\0’;tt++)

if(*tt>=‘a’&&*tt<=‘z’)pp[*tt-’a’]++; /*将tt字符串中’a’到’z’26个字母各自出现的次数,依次放在pp数组中,任一个小写字 母减去’a’后所得结果正好是它对应的下标*/ }

解析:第1个循环的作用是初始化数组pp,未经赋值变量的量为一个不确定数字。由于它要将’a’到’z’26个字母的个数依次放到数组pp中。即’a’的个数存于pp[0]中,’b’的个数存于pp[1]中,’c’的个数存于pp[2]中,…,依次类推。而’a’-’a’的值正好为0,’b’-’a’的值为1,’c’-’a’的值为2,…,依此类推。即任一个小写字母减去’a’后所得结果正好是它对应的下标,所以就有了pp[*tt-’a’]++。但*tt必须是小写字母即if( )不应省略。