二级C语言机试-182
(总分:100.00,做题时间:90分钟)
一、填空题(总题数:1,分数:30.00)
在给定程序中,函数fun的功能是:把形参a所指数组中的偶数按原顺序依次存放到a[0]、a[1]、a[2]、……中,把奇数从数组中删除,将偶数的个数通过函数值返回。
例如:若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除奇数后a所指数组中的数据为:4、2、6、8,返回值为4。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构。
文件BLANK1.C内容如下:
#include<stdio.h>
#define N 9
int fun(int a [],int n)
int i,j;
j=0;
for(i=0;i<n;i++)
/**********found**********/
if( (1) ==0)

/**********found**********/
(2) =a[i];j++;

/**********found**********/
return (3)

void main( )
int b[N]=9,1,4,2,3,6,5,8,7,i,n;
printf("/nThe original data: in");
for(i=0;i<N;i++)printf("%4d",b[j]);
printf("/n");
n=fun(b,N);
printf("/nThe nunlber of even: %d/n",n);
printf("/n The even: in");
for(i=0;i<n;i++)printf("%4d",h[i]);
printf("/n"):


(分数:30.00)
填空项1:__________________ (正确答案:a[i]%2)
解析:
填空项1:__________________ (正确答案:a[j])
解析:
填空项1:__________________ (正确答案:i)
解析:[解析] 题目要求将奇数删除,将偶数放入数组相应的元素中。函数fun使用的算法实质就是将偶数往前移动,放入a[0]、a[1]、a[2]、……中。程序中利用循环对所有的元素进行判断,若是偶数则往a[0]、a[1]、a[2]、……中赋值,因此第1空处应填入a[i]%2,判断a[i]的奇偶性。循环中利用变量i作为数组元素下标,依次取出数组元素进行奇偶性的判断,利用变量j记录要覆盖的数组元素的位置,满足条件的a[i]赋值给a[j],所以第2空处应填入a[j]。循环结束后,变量j的值就是最后偶数的个数,所以将其返回,第3空处应填入j。
二、改错题(总题数:1,分数:30.00)
1.给定程序MODI1.C函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
文件MODI1.C内容如下:
#include<stdio.h>
void fun(char *s)
int i,j;
for(i=0,j=0; s[i]!='/0';i++)
if(s[i]>='0'&& s[i]<='9')
/**********found**********/
s[j]=s[i];
/**********found**********/
S[j]="/0";

void main( )
char item[80];
printf("/nEnter a string:");
gets(item);
printf("/n/nThe string is:/"%s/"/n",item);
fun(item);
printf("/n/nThe string of changing is: /"%s/"/n",item);



(分数:30.00)
填空项1:__________________ (正确答案:第1处:将“s[j]=s[i];”改为“s[j++]=s[i];”。
第2处:将“s[j]="/0";”改为“s[j]='/0';”。)
解析:[解析] 题目要求将数字字符取出,实际就是将其他字符删除。函数fun中使用的删除算法是:将数字字符往前移动,依次放入s[0]、s[1]、s[2]、……等数组元素中,最后将字符串结束标记放入适当的位置。变量i作为每次取出元素的下标,变量j记录赋值的位置。在for循环中,每次判断当前要处理的字符s[i]是否为数字字符,若是则将其赋值到字符数组相应的单元s[j]中。循环结束后,给新字符串加上字符串结束标记。对于第1处错误,j变量的值始终为0,没有改变,元素下标出现错误,当s[i]赋给s[j]后,j应该自加1,由于题目不允许增加行或删除行,所以只能将下标j改为“j++”;对于第2处错误,混淆了字符和字符串的区别,s[j]是一
个字符变量,只能存储一个字符,而“/0”是一个字符串,所以将字符串的结束标记赋值给s[j]只能用单引号括起来。
[归纳总结] 处理数组问题时,错误通常出现在数组元素下标的表示上。数组元素的下标从0开始编号,下标值不能超过数组大小的定义。要修改此类错误,必须弄清楚程序的算法、循环的执行过程、下标的变换规律及程序中数组下标的最小值和最大值是否超过数组的范围,从而发现错误位置。对于字符数组,除了注意数组元素的下标表示外,还要注意字符串的结束标记'/0'的位置及书写方法。
数组处理的常见错误有:
(1)数组元素下标出错,尤其是出现两个数组时,如果采用不同的变量来表示两个数组元素的下标,一定要注意下标名要前后统一。
(2)字符数组中,单引号和双引号的使用错误。如果是字符应该用单引号括起来,如果是字符串应该用双引号括起来;
(3)字符串结束标记'/0'使用错误。
三、编程题(总题数:1,分数:40.00)
2.假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G********,删除后,字符串中的内容应当是:ABCDEFG。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
文件PROG1.C内容如下:
#include<stdio.h>
void fun(char *a)


void main( )
char s[81];
printf("Enter a string: /n");gets(s);
fun(s);
printf("The string after deleted:/n");pats(s);



(分数:40.00)
__________________________________________________________________________________________
正确答案:(void fun(char *a){
int i,j;
for(i=0,j=0;a[i]!='/0';i++)
if(a[i]!='*'){a[j]=a[i];j++;}
a[j]='/0';
})
解析:[解析] 参考答案中使用的算法是:将不是'*'号的字符往前移动,依次放入a[0]、a[1]、
a[2]、……等数组元素中。程序中利用for循环,从第一个字符开始依次取出字符进行判定,若不是'*'号,则往前赋值。变量i作为每次取出元素的下标,变量j记录赋值的位置。跳出循环后,将字符串结束标记'/0'赋值到相应位置,完成删除操作。
本题还派生了很多题目:
(1)假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中前导*号。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G*********,删除后,字符串中的内容应当是:A*BC*DEF*G********。
参考程序:
c语言数组最大值最小值#include<stdio.h>
void fun(char *a){
int i,j;
i=j=0;
while(a[i]=='*')i++;
while(a[i]!='/0'){
a[j]=a[i];j++;i++;
{
a[j]='/0';
}
void main( ){
char s[81];
printf("Enter a string: /n");gets(s);
fun(s);
printf("The string after deleted: /n");puts(s);
}
(2)假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导和尾部的*号之外,将串中的其他*号全部删除。形参h已指向字符串中第一个字母,形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G********,删除后,字符串中的内容应当是:****ABCDEFG********。
参考程序:
#include<stdio.h>
void Nn(char *a,char *h,char *p){
int i,j;
a=h;
for(i=j=0;a+i<=p;i++)/*将字符串中从第一个字母开始到最后一个字母之间的*号删除*/
if(a[i]!='*'){a[j]=a[i];j++;}
while(a[i]!='/0'){a[j]=a[i];j++;i++;} /*将字符串尾部的*号顺序前移*/
a[j]='/0*; /*给字符串赋上字符串结束标记*/
}
void main( ){
char s[81],*t,*f;
printf("Enter a string: in");
gets(s);
t=f=s:
while(*t)t++;
t--;
while(*t=='*')t--;
while(*f=='*')f++;
fun(s,f,t);
printf("The string after deleted: in");
puts(s);
}
(3)假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中后导*号。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G********,删除后,字符串中的内容应当是:****A*BC*DEF*G。
参考程序:
#include<stdio.h>
void fun(char *a){
int i,j;
for(i=0;a[i]!='/0';i++) /*到最后一个字母的位置记录在变量j中*/
if(a[i]!='*')j=i;
a[j+1]='/0';/*将字符串结束标志赋值到最后一个字母后面,即可删除后续*号*/
}
void main( ){
char s[81];
printf("Enter a string: /n");gets(s);
fun(s);
printf("The string after deleted: /n");puts(s);
}
[归纳总结] 本套试题的程序填空和程序设计题考查的是数据的删除。数据的删除操作可以采用两种方法:第一种方法,可以在原数组基础上,通过数据移动,将需要删除的数据覆盖;第二种方法,引入一个中间数组,将不需要删除的数据放入其中,再将该数组赋值给原数组,从而达到删除某些数据的目的。实际上,数据的删除实质也是数据的移动,即将不需要
删除的字符往前移动,依次放入数组对应的单元中。
删除字符算法的常用程序如下:
void fun(char *s){
int i,j;
fnr(i=j=0;s[i]!='/0';i++)
if(…){ /*需要保留字符的条件*/
s[j]=s[i];
j++;
s[j]='/0';
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。