一、程序填空题1. 给定程序中,函数fun的功能是:在形参ss所指字符串数组中,删除所有串长超过k的字符串,函数返回所剩字符串的个数。ss所指字符串数组中共有N个字符串,且串长小于M。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在
考生文件夹下的BLANK1. C中。不得增行或删行,也不得更改程序的结构!
#include <stdio. h>
#include <string. h>
#define N 5
#define M 10
int fun (char (*ss) [M], int k)
{int i, j=0, len;
/**********found**********/
for(i=0; i<
; i++)
{len=strlen (ss[i]);
/**********found**********/
if (1en<=
)
/**********found**********/
strcpy(ss[j++],
);
}
return j;
}
main( )
{char x[N] [M]={"Beijing", "Shanghai",
"Tianjing", "Nanjing", "Wuhan");
int i, f;
printf("\nThe original string\n\n");
for(i=0; i<N; i++)puts(x[i]);
printf("\n");
f=fun(x, 7);
printf("The string witch length
is less than or equal to 7 :\n");
for(i=0; i<f; i++) puts(x[i]);
printf("\n");
}
[解析] 本题中函数fun的功能是在形参ss所指字符串数组中,删除所有串长超过k的字符串,然后函数返回所剩字符串的个数。根据题意,在fun函数中,利用for循环比较字符串长度是否小于k,然后利用strcpy函数组成新的可用字符串数组,将可用的字符串数组的长度值进行返回,即为字符串的个数。
第一空:“for(i=0; i< ______; i++)”,这一空部分出现在fun函数中的for循环条件中,在定义了i之后i的条件。根据for后面的语句我们可以看出,这里是要进行比较,比较对象是ss所指字符串数组的所有字符串,所以这里循环要进行整改字符串数组的长度,相应的,这里for循环的循环条件就要是i小于字符串长度,而字符串长度开始就有定义,为N,所以这里应该是i<N,这一空应该填N。
第二空:“if(len<2)”,这一空部分出现在fun函数中,是for循环中if条件语句的条件,这根据if条件语句后面的语句我们可以知道,这里的条件语句是后面strcpy的执行条件,而strcpy要执行,根据题目给出的条件我们可以知道是要字符串长度小于等于k才能保留,所以这里的if条件语句中的条件应该是字符串长度小于k,所以这一空应该填k。
第三空:“strcpy(ss[j++], ______;”这一空部分出现在strcpy函数中,此函数为字符串复制函数,是将后面的一个字符串复制到前面一个字符数组中去,根据题意和前面的条件语句,这一行语句是要将符合条件的字符串重新组成一个新的字符串数组,然后返回新数组的长度,这样的话就能知道ss[j]为新字符串数组,而这里要复制的就是原字符串数组中符合条件的字符串,所以这里要填就是前面符合条件的i所对应的字符串,所以这一空应该填ss[i]。
[考点] 一维数组for循环结构、if条件语句、字符串处理函数。
二、程序修改题1. 给定程序MODI1. C中函数fun的功能是:逐个比较p、q所指两个字符串对应位置中的字符,把ASCII值大或相等的字符依次存放到c所指数组中,形成一个新的字符串。
例如,若主函数中a字符串为:aBCDeFgH,主函数中b字符串为:ABcd,则c中的字符串应为:aBcdeFgH。
请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio. h>
#include <string. h>
void fun(char *p, char *q, char *c)
{
/************found************/
int k=1;
/************found************/
while(*p!= *q)
{if(*p<*q) c[k]=*q;
else c[k]=*p;
if(*p) p++;
if(*q) q++;
k++;
}
}
main( )
{char a[10]="aBCDeFgH",
b[10]="ABcd", c[80]={'\0');
fun(a, b, c);
printf("The string a: ");
puts(a);
printf("The string b: ");
puts(b);
printf("The result: ");
puts(c);
}
int k=1改为int k=0;
(*p!=*q)改为(*p ||*q);
[解析] 本题中函数fun的功能是:逐个比较p、q所指两个字符串对应位置中的字符,把ASCII值大或相等的字符依次存放到c所指数组中,形成一个新的字符串。While循环为字符串比较的提供前提条件,然后再比较得到p、q两个字符串一一对应的符合条件中可用的一个字符,最终合并得到新的字符串c。
(1)第一个错误在fun函数最开始定义的k的初始值。根据fun函数的功能我们可以知道这里k是新字符串c各字符的位置,然后根据比较结果一一对应新字符串个位置的字符。这里犯了一个明显的错误就是:从字符串的第一个字符比较,得到的第一个字符在字符串中的位置不是c[1]而是c[0],所以k的初始值不是1,而是0。所以这里第一个改错是将1改为0。
第二个错误在while循环的条件表达式,我们要知道的是while循环条件和if循环条件的区别。if的条件为开始条件,即符合这条件开始循环,而这里while的循环条件则是为终止条件,意思是下面括号内的循环进行到不符合while条件语句时终止,所以这里很明显错误,如果是这种条件的只要两个字符串中出现相同的字符即终止,以例子来说就是到第二个字符比较久终止,很明显不符合题意。所以为了完全比较这两个字符串,给出的终止条件应该是到两个字符串都结束,即两个字符串字符都为“'\0'”时终止,所以终止条件应该为“*p||*q”。
[考点] 字符串、while语句循环。
三、程序设计题1. 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。
例如,字符串中的内容为:****A*BC*DEF*G*******,删除后字符串中的内容应当是:****ABCDEFG。
注意:部分源程序在文件PROG1. C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio. h>
void fun(char *a)
{
/*以下代码仅供参考*/
int i=0, k;
while(a[i]=='*') i++;
k=i;
while(a[i]!='\0')/*以下程序段实现非*字符前移*/
{
}
a[k]='\0';
}
main( )
{char s[81]; void NONO( );
printf(*Enter a string: \n"); gets(s);
fun(s);
printf("The string after
deleted: \n"); puts(s);
NONO( );
}
void NONO( ).
{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/
FILE *in, *out;
int i;char s[81];
in=fopen
("C: \\WEXAM\\24990001\\in. dat", "r");
out=fopen
("C:\\WEXAM\\24990001\\out. dat", "w");
for(i=0; i<10; i++) {
fscanf(in, "%s", s);
fun(s);
fprintf(out, "%s\n", s);
}
fclose(in);
fclose(out);
}
#incllide <stdio. h>
void fun(char *a)
{
int i=0, k;
while(a[i]=='*') i++;
k=i;
while(a[i]!='\0')
{
if(a[i] !='*') a[k++]=a[i];
i++;
}
a[k]='\0';
1}
main( )
{
char s[81];
printf("Enter a
string:\n"); gets(s);
fun(8);
printf("the string
after deleted:\n"); puts(s);
NONO( );
}
NONO( )
{
FILE *in, *out;
int i; char s[81];
in=fopen
("C:\\WEXAM\\24990001\\in. dat","
r"),
out=fopen
("C:\\WEXAM\\24990001\\out. dat",
"w");
fox(i=0; i<10; i++) {
fscanf(in, "%s", s);
fun(s);
fprintf(out, "%s\n", s);
}
fclose(in);
fclose(out);
}
[解析] 本题所需要的功能是是处理一个输入的只含字母和“*”的字符串,除了字符串前导的“*”号之外,将串中其它“*’号全部删除。并且在编写函数时,不得使用C语言提供的字符串函数。这里根据题意,很快我们就知道需要使用循环语句和条件语句来进行功能的实现。第一步要自己输入字符串,这就需要格式输入函数;第二步就要进行功能函数了,这里的就要一开始是否有“*”的存在,有多少个“*”,这个是很重要的判断。因为根据题意虽然是要删除“*”,但是字符串前面的“*”是不用删除的,无论有多少个都不能删除,然后当没有“*”,或者跳过字符串前面“*”后,就要到达第一个字母了,字母保留,然后后面遇见“*”就删除,依次循环进行下去,一直到字符串结束,这些功能的实现就需要条件语句和循环语句的使用了;第三步将处理过后的字符串输出,得到新的字符串,程序就可以结束了。
本题主函数中需要输入一个字符串,然后进入。fun函数处理字符串,在fun函数中,就要实现题目要求我们写出的功能了。首先是判断字符串的开始是否为“*”,这里就用到while函数(这里因为有步骤的区别,所以这里用while比用if好),判断开始的字符是否为“*”,见程序第5~6行,这里需要顺次进行,因为开始无论有多少个“*”都不用删除,当出现字母时,就开始下一步了,因为已经出现了字母,所以后面出现的“*”一律删除,而字母时不用管的,所以这里就又需要if条件语句来判断是否为“*”然后赋值为空,见程序第9~12行,当程序进行到字符为空时代表字符串结束,程序就终止,这里就要用到while条件语句进行终止判断,见程序第7行。这样循环进行就能保留字符串前面的“*”并且删除后面出现的所有“*”了,然后fun函数执行完成就可以转到主函数中进行新字符串的输出了。
[考点] while循环语句,if条件语句