一、程序填空题 1.
考生文件夹 给定程序中函数fun的功能:在形参ss所指字符串数组中,查找含有形参substr所指子串的所有字符串并输出,若没找到则输出相应信息。ss所指字符串数组中共有N个字符串,且串长小于M。程序中库函数strstr(s1,s2)的功能是在s1串中查找s2子串。若没有,就输出“Haven't found!”;若有,就输出s1串。
请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.c中。不得增行或删行,也不得更改程序的结构!
给定源程序如下:
#include <stdio.h>
#include <string.h>
#define N 5
#define M 15
void fun(char (*ss)[M], char *substr)
{ int i,find=0;
/**********found**********/
for(i=0; i< __1__ ; i++)
/**********found**********/
if( strstr(ss[i], __2__) != NULL )
{ find=1; puts(ss[i]); printf("\n"); }
/**********found**********/
if (find==__3__) printf("\nDon't found!\n");
}
main()
{ char x[N][M]={"BASIC","C langwage","Java","QBASIC","Access"},str[M];
int i;
printf("\nThe original string\n\n");
for(i=0;i<N;i++)puts(x[i]); printf("\n");
printf("\nEnter a string for search : "); gets(str);
fun(x,str);
}
[解析] (1)此处考查for循环语句中循环变量i的取值范围,题目指出共有N个字符串,所以i的取值范围为0~N-1。 (2)strstr(s1,s2)的功能是在s1串中查找s2子串。题目要求在ss字符串数组中,查找substr所指的字符串,故应填substr。 (3)此处使用if条件语句来判断查找结果,由printf("\nHaven't found!\n")可知,此处需填没有找到的条件,即find==0。
二、程序改错题 1. 给定程序中函数fun的功能是:统计substr所指子字符串在str所指字符串中出现的次数。
例如,若字符串为aaas lkaaas,子字符串为as,则应输出2。
请改正程序中的错误,使它能计算出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include<stdio.h>
int fun (char *str, char *substr)
{ int i, j, k, num=0;
/**********found**********/
for(i=0, str[i], i++)
for(j=i, k=0; substr[k]==str[j]; k++, j++)
/**********found**********/
If(substr[k+1]=='\0')
{ num++;
break;
}
return num;
}
main()
{
char str[80], substr[80];
printf("Input a string:");
gets(str);
printf("Input a substring:");
gets(substr);
printf("%d\n", fun(str, substr));
}
(1)for(i=0; str[i]; i++) (2)if(substr[k+1]=='\0')
[解析] 我们先看循环条件for(i=0, str[i], i++),不难发现此处for循环语句的格式有误,其中表达式之间应以";"相隔;同时很容易发现if条件语句处的关键字书写错误。
三、程序设计题 1. 请编写函数fun,它的功能是:求出能整除形参x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。
例如,若x中的值为:35,则有4个数符合要求,它们是:1,5,7,35。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include<stdio.h>
void fun(int x, int pp[], int*n)
{
}
main()
{int x, aa[1000], n, i;
printf("\Please enter an integer number:\n");
scanf("%d", &x);
fun(x, aa, &n);
for(i=0; i<n; j++)
printf("%d", aa[i]);
printf("\n");
}
void fun(int x, int pp[], int *n) { int i, j=0; for(i=1; i<=x; i=i+2)/*i的初始值为1,步长为2,确保i为奇数*/ if(x%i==0) /*将能整除x的数存入数组pp中*/ pp[j++]=i; *n=j; /*传回满足条件的数的个数*/ }
[解析] 本题考查:偶数的判定方法;整除的实现。 本题题干信息是:能整除x且不是偶数的所有整数。循环语句中变量i从1开始且每次增2,所以i始终是奇数。整除的方法,在前面已经讲过多次,这里就不再赘述了。对于本题目要求的不是偶数的判定方法,即该数对2求余不为0。除以上方法外,还可以通过for循环语句直接把偶数筛出去,确保参与操作的数均为奇数。