计算机二级C语言上机真题(67)【附详解】
【真题1】 函数int MySearch(char *str, char *s)的功能是:统计字符串s 在字
符串str 中出现的次数。
例如,若输入字符串"12 123 12345"和"23",则应输出2(表示字符串"23"在字符
串"12 123 12345"中出现了两次)。若输入字符串"33333"和"33",则应输出4
(表示字符串"33"在字符串"33333"出现了四次)。
请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数
MySearch 中的横线处填入适当的内容并删除横线
#include < conio.h >#include < stdio.h >#include < string.h >int
MySearch( char* str, char* s )
{ char* p;
int n =0;
for( ; *str; )
if( ( p = strstr( str, s ) ) != NULL )
{ n++; str=p+1; }
else
____[1]____;
return(____[2]____);
}
main()
{ char str1[81], str2[21];
printf("\nPlease enter 2 line character strings:\n");
gets(str1);
gets(str2);
printf( "\n\n\"%s\" are(is) appeared in \"%s\" %d times\n", str2, str1,
MySearch(str1, str2));
compute();
}
/* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */
WriteData(int num)
{ FILE *fp ;
fp=fopen("dat22.dat","w");
fprintf(fp,"%d",num);
fclose(fp);
}
compute()
{ char str1[81], str2[21], ch;
FILE *fp;
int num ;
fp=fopen("c9670203.in","r");
fgets(str1, 80, fp); str1[strlen(str1)-1] = 0 ;
fgets(str2, 20, fp); ch = str2[strlen(str2)-1] ;
if(ch == '\n') str2[strlen(str2)-1] = 0 ;
fclose(fp);
num=MySearch(str1, str2);
WriteData(num);
}
(2011年2月)
解析: 本题的考核点是c 语言中指针和循环语句的使用。
解题思路:当字符串str 中没有字符串s,而此时str 指针又没有指向串最后一
个字符时,str++,继续循环,直到遇到字符串结束标志'\0',结束循环。n 是
一个计数器,用以统计字符串s在字符串str 中出现的次数,函数结束时应将其
返回。
int MySearch( char* str, char* s )
{ char* p;
int n =0;
for( ; *str; )
if( ( p = strstr( str, s ) ) != NULL )
{ n++; str=p+1; }
else
str++;
return( n );
}
答案:【1】str++ 【2】n
【真题2】 给定程序modi.c 的功能是:删除w数组中下标为k 的元素中的值。程
序中, 调用了getindex、arrout 和arrdel三个函数,getindex 用以输入所删元
素的下标,函数中对输入的下标进行检查,若越界,则要求重新输入,直到正确为
止。arrout 用以输出数组中的数据,arrdel进行所要求的删除操作。
请改正程序中的语法错误,使它能得出正确的结果。
注意:不要改动 main 函数,
#include "conio.h"
#include "stdio.h"
#define NUM 10
/************found************/
arrout ( int w, int m )
{ int k;
/************found************/
for (k = 0; k < m; k++)
printf ("%d " w[k]);
printf ("\n");
}
arrdel ( int *w, int n, int k )
{ int i;
for ( i = k; i < n-1; i++ ) w[i] = w[i+1];
n--;
return n;
}
getindex( int n )
{ int i;
do
{ printf("\nEnter the index [ 0< = i< %d ]: ", n );
scanf ("%d",&i );
} while( i < 0 || i > n-1 );
return i;
}
main( )
{ int n, d, a[NUM]={21,22,23,24,25,26,27,28,29,30};
n = NUM;
clrscr();
printf ("Output primary data :\n"); arrout ( a, n );
d = getindex( n ); n = arrdel ( a, n, d );
printf ("Output the data after delete :\n"); arrout( a, n );
}
(2011年2月)
解析: 本题的考核点是C语言中函数入口参数的用法和常用函数的使用。
从主函数中可以看出,w 是一个字符串,因此在arrout函数的参数表中应将w
改为字符指针或字符数组,即把"arrout(int w,int m )"语句改为"arrout(int
*w, int m )"或相同作用的语句。
printf 函数的一般格式为:printf( 格式控制,输出表列);,因此,
"printf("%d"w[k]); "应改为"printf("%d",w[k]); "或相同作用的语句。
【真题3】
下列给定程序中,函数fun()的功能是:删除字符串s 中所有空白字符(包括Tab 字
符、回车符及换行符)。输入字符串时用"#"结束输入。
试题程序:
#include < string.h >#include < stdio.h >#include < ctype.h >fun(char
*p)
{ ……}
main()
{char c,s[80];
int i=0;
printf("Input a string: ");
c=getchar();
while(c!=’#’)
{ s[i]=c;i++;c=getchar();}
s[i]=’\0’;
fun(s);
puts(s);
}
(2011年2月)
解析: fun(char *p)
{ int i, t; char c[80];
for(i=0,t=0;p[i];i++)
if(!isspace(*(p+i))) c[t++]=p[i];
c[t]='\0';
strcpy(p,c);
}
符串str 中出现的次数。
例如,若输入字符串"12 123 12345"和"23",则应输出2(表示字符串"23"在字符
串"12 123 12345"中出现了两次)。若输入字符串"33333"和"33",则应输出4
(表示字符串"33"在字符串"33333"出现了四次)。
请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数
MySearch 中的横线处填入适当的内容并删除横线
#include < conio.h >#include < stdio.h >#include < string.h >int
MySearch( char* str, char* s )
{ char* p;
int n =0;
for( ; *str; )
if( ( p = strstr( str, s ) ) != NULL )
{ n++; str=p+1; }
else
____[1]____;
return(____[2]____);
}
main()
{ char str1[81], str2[21];
printf("\nPlease enter 2 line character strings:\n");
gets(str1);
gets(str2);
printf( "\n\n\"%s\" are(is) appeared in \"%s\" %d times\n", str2, str1,
MySearch(str1, str2));
compute();
}
/* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */
WriteData(int num)
{ FILE *fp ;
fp=fopen("dat22.dat","w");
fprintf(fp,"%d",num);
fclose(fp);
}
compute()
{ char str1[81], str2[21], ch;
FILE *fp;
int num ;
fp=fopen("c9670203.in","r");
fgets(str1, 80, fp); str1[strlen(str1)-1] = 0 ;
fgets(str2, 20, fp); ch = str2[strlen(str2)-1] ;
if(ch == '\n') str2[strlen(str2)-1] = 0 ;
fclose(fp);
num=MySearch(str1, str2);
WriteData(num);
}
(2011年2月)
解析: 本题的考核点是c 语言中指针和循环语句的使用。
解题思路:当字符串str 中没有字符串s,而此时str 指针又没有指向串最后一
个字符时,str++,继续循环,直到遇到字符串结束标志'\0',结束循环。n 是
一个计数器,用以统计字符串s在字符串str 中出现的次数,函数结束时应将其
返回。
int MySearch( char* str, char* s )
{ char* p;
int n =0;
for( ; *str; )
if( ( p = strstr( str, s ) ) != NULL )
{ n++; str=p+1; }
else
str++;
return( n );
}
答案:【1】str++ 【2】n
【真题2】 给定程序modi.c 的功能是:删除w数组中下标为k 的元素中的值。程
序中, 调用了getindex、arrout 和arrdel三个函数,getindex 用以输入所删元
素的下标,函数中对输入的下标进行检查,若越界,则要求重新输入,直到正确为
止。arrout 用以输出数组中的数据,arrdel进行所要求的删除操作。
请改正程序中的语法错误,使它能得出正确的结果。
注意:不要改动 main 函数,
#include "conio.h"
#include "stdio.h"
#define NUM 10
/************found************/
arrout ( int w, int m )
{ int k;
/************found************/
for (k = 0; k < m; k++)
printf ("%d " w[k]);
printf ("\n");
}
arrdel ( int *w, int n, int k )
{ int i;
for ( i = k; i < n-1; i++ ) w[i] = w[i+1];
n--;
return n;
}
getindex( int n )
{ int i;
do
{ printf("\nEnter the index [ 0< = i< %d ]: ", n );
scanf ("%d",&i );
} while( i < 0 || i > n-1 );
return i;
}
main( )
{ int n, d, a[NUM]={21,22,23,24,25,26,27,28,29,30};
n = NUM;
clrscr();
printf ("Output primary data :\n"); arrout ( a, n );
d = getindex( n ); n = arrdel ( a, n, d );
printf ("Output the data after delete :\n"); arrout( a, n );
}
(2011年2月)
解析: 本题的考核点是C语言中函数入口参数的用法和常用函数的使用。
从主函数中可以看出,w 是一个字符串,因此在arrout函数的参数表中应将w
改为字符指针或字符数组,即把"arrout(int w,int m )"语句改为"arrout(int
*w, int m )"或相同作用的语句。
printf 函数的一般格式为:printf( 格式控制,输出表列);,因此,
"printf("%d"w[k]); "应改为"printf("%d",w[k]); "或相同作用的语句。
【真题3】
下列给定程序中,函数fun()的功能是:删除字符串s 中所有空白字符(包括Tab 字
符、回车符及换行符)。输入字符串时用"#"结束输入。
试题程序:
#include < string.h >#include < stdio.h >#include < ctype.h >fun(char
*p)
{ ……}
main()
{char c,s[80];
int i=0;
printf("Input a string: ");
c=getchar();
while(c!=’#’)
{ s[i]=c;i++;c=getchar();}
s[i]=’\0’;
fun(s);
puts(s);
}
(2011年2月)
解析: fun(char *p)
{ int i, t; char c[80];
for(i=0,t=0;p[i];i++)
if(!isspace(*(p+i))) c[t++]=p[i];
c[t]='\0';
strcpy(p,c);
}