1、国家三级信息管理技术机试模拟试卷 91及答案与解析 一、程序设计题 1 编写一个函数 findStr(),该函数统计一个长度为 2的子字符串在另一个字符串中出现的次数。例如,假定输入的字符串为 “asd asasdfg asd as zx67 asd mklo“,子字符串为 “as“,函数返回值是 6。 函数 ReadWrite()实现从文件 in.dat中读取两个字符串并调用函数 findStr(),最后把结果输出到文件 out.dat中。 注意:部分程序已经给出。 请勿改动主函数 main()和其他函 数中的任何内容,仅在函数 findStr()的花括号中填入你编写的若干语句。 #incl
2、ude stdio.h #include string.h #include conio.h int findStr(char *str,char *substr) main() char str81,substr3; int n; clrscr(); printf(“输入原字符串 “); gets(str) ; printf(“输入子字符串 :“); gets(substr); puts(str); puts(substr); n=findStr(str, substr); printf(“n=%dn“, n); ReadWrite(); ReadWrite() char str81,sub
3、str3,ch; int n, len,i=0; FILE *rf, *wf; rf=fopen(“in.dat“, “r“); wf=fopen(“out.dat“, “w“); while(i 25) fgets(str, 80, rf); fgets(substr, 10, rf); len=strlen(substr)-1; ch=substrlen; if(ch=n | ch=0xla)substrlen=0; n=findStr(str, substr); fprintf(wf, “%dkn“, n); i+; fclose(rf); fclose(wf); 国家三级信息管理技术机
4、试模拟试卷 91答案与解析 一、程序设计题 1 【正确答案】 int findStr(char *str,char *substr) int n; char *p , *r; n=0; while( *str ) p=str; r=substr; while(*r) if(*r=*p) r+; p+; else break; if(*r=O) n+; str+; return n; 【试题解析】 该程序属于按条件查找类型的题目,考核的知识点为: (1)在给定的字符串中查找指定字符; (2)统计查找后满足条件的个数。 本题的解题思路是:对原字符串中的字符进行扫描,若原字符串中含有子字符串,即原字
5、符串的其中一部分与子字符串完全相同时,统计出个数。判断原字符串是否含有子字符串,可以将原字符串中的元素逐个与子字符串相比较,当两字符串中各个元素都相同且子字符串结束时,则证明原 字符串包含一个子字符串。在统计个数的时候需要设置一个记录变量,每当原字符串包含子字符串一次的时候,该记录变量自动加 1。 程序的流程是:首先通过键盘接收两个字符串,其中一个作为原字符串,另一个作为子字符串,然后调用 findStr()函数对两字符串进行比较,处理后的结果由ReadWrite()函数写回文件 out.dat中。 答案解析如下: int findStr(char *str,char *substr) int
6、 n; /*定义变量, n代表子符串出现次数 */ char p,r; /*定义指针变量 */ n=0; while(str) /*当原字符串不为空,即 *str不为空时进入到外层 while,此时循环中原字符串指针 str和子字符串指针 substr都指向其字符串内的第一个元素 */ p=str; /*将字符串的指针 str赋给 p*/ r=substr; /*将字符串的指针 substr赋给 r*/ while(*r) /*当子字符串也不为空时,即 *r不空时进入内嵌的 while循环 */ if(*r=*p) /*将原字符串与子字符串逐个元素进行比较看是否相等 */ r+; p+; /*将原字符串与子字符串分别后移一个字符 */ else break; /*否则结束循环 */ if(*r=0) /*结束 while循环的情况有两种: (1)比较完毕,即原字符串中包含该子字符串,此时子字符串的指针指向串尾 (为 “0”); (2)未比较完毕,此时子字符串的指针不指向串尾。 if语句的功能是通过判断子字符串的指针是否指向串尾进而来判断内层 while循环结束的原因 */ n+; /*出现的次数加 1*/ str+; /*牟字符串指针也指向下一个字符 */ return n; /*返回出现的次数 */