niusouti.com

试题三(共15分)阅读以下说明和C函数,填补C函数中的空缺(1)~(6),将解答写在答题纸的对应栏内。【说明】函数numberOfwords (char message[])的功能是计算存储在message字符数组中的一段英文语句中的单词数目,输出每个单词(单词长度超过20时仅输出其前20个字母),并计算每个英文字母出现的次数(即频数),字母计数时不区分大小写。假设英文语句中的单词合乎规范(此处不考虑单词的正确性),单词不缩写或省略,即不会出现类似don't形式的词,单词之后都为空格或标点符号。函数中判定

题目

试题三(共15分)

阅读以下说明和C函数,填补C函数中的空缺(1)~(6),将解答写在答题纸的对应栏内。

【说明】

函数numberOfwords (char message[])的功能是计算存储在message字符数组中的一段英文语句中的单词数目,输出每个单词(单词长度超过20时仅输出其前20个字母),并计算每个英文字母出现的次数(即频数),字母计数时不区分大小写。

假设英文语句中的单词合乎规范(此处不考虑单词的正确性),单词不缩写或省略,即不会出现类似don't形式的词,单词之后都为空格或标点符号。

函数中判定单词的规则是:

(1)一个英文字母串是单词;

(2) 一个数字串是单词;

(3)表示名词所有格的撇号(')与对应的单词看作是一个单词。

除上述规则外,其他情况概不考虑。

例如,句子“The 1990's witnessed many changes in people's concepts ofconservation”中有10个单词,输出如下:

The

1990's

witnessed

many

changes

in

people's

concepts

of

conservation

函数numberOfijvords中用到的部分标淮库函数如下所述。

【C函数】

int numberOfwords (char message[])

{

char wordbuffer[21],i=0; /*i用作wordbuffer的下标*/

(1) pstr;

int ps[26]={0); /*ps[0]用于表示字母'A'或'a'的频数*/

/*ps[1]用于表示字母'B'或'b'的频数,依此类推*/

int wordcounter=0;

pstr=message;

while (*pstr){

if((2)(*pstr)){/*调用函数判断是否为一个单词的开头字符*/

i=0;

do{/*将一个单词的字符逐个存入wordbuffer[],并对字母计数*/

wordbuffer[i++]=*pstr;

if(isalpha(*pstr)){

if (3) (*pstr))ps[*pstr-'a']++;

else ps[*pstr-'A']++;

}

(4) ; /*pstr指向下一字符*/

}while (i<20&&(isalnum(*pstr)||*pstr=='\"));

if (i>=20) /*处理超长单词(含名词所有格形式)*/

while (isalnum(*pstr)||*pstr=='\"){pstr++;}

(5) ='\0';/*设置暂存在wordbuffepstrr中的单词结尾*/

wordcounter++; /*单词计数*/

puts(wordbuffer); /*输出单词*/

}

(6); /*pstr指向下一字符*/

}

retum wordcounter;

}


相似考题
参考答案和解析
正确答案:
(1)char*,或unsigned char*
(2)isalnum,或isalpha(*pstr)||isdigit
(3)islower,或!isupper
(4)pstr++,或++pstr,或pstr=pstr+1,或pstr+=1
(5)wordbuffer[i],或*(wordbuffer+i)
(6)pstr++,或++pstr,或pstr=pstr+1,或pstr+=1
更多“ 试题三(共15分)阅读以下说明和C函数,填补C函数中的空缺(1)~(6),将解答写在答题纸的对应栏内。【说明】函数numberOfwords (char message[])的功能是计算存储在message字符数”相关问题
  • 第1题:

    ●试题二

    阅读下列程序或函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【函数2.1说明】

    函数strcmp()是比较两个字符串s和t的大小。若s<t函数返回负数;若s=t函数返回0;若s>t,函数返回正数。

    【函数2.1】

    int strcmp(char *s,char *t)

    { while(*s && *t && (1) ){

    s++;t++;

    }

    return (2) ;

    }

    【程序2.2说明】

    在n行n列的矩阵中,每行都有最大的数,本程序求这n个最大数中的最小一个。

    【程序2.2】

    #includestdio.h

    #define N 100

    int a[N][N];

    void main()

    { int row ,col,max,min,n;

    /*输入合法n(<100),和输入n×n个整数到数组a的代码略*/

    for (row=0;row<n;row++){

    for(max=a[row][0],col=1;col<n;col++)

    if( (3) )max=a[row][col];

    if( (4) )min=max;

    else if( (5) )min=max;

    }

    printf ("The min of max numbers is %d\n",min);

    }


    正确答案:

    ●试题二

    【答案】(1)*s == *t(2) *s - *t

    【解析】*s *t相等才执行循环体。返回二者差值,恰好符合题目要求。

    【答案】(3) arow][col>max (4) row == 0(5) max<min

    【解析】当前值比max大,则把它赋给maxmax是本行最大值。初始化min为第一行的max。该行的maxmin小,则将max赋给min

     

  • 第2题:

    阅读以下函数说明和C语言函数,将应填入(n)的字句写在答题纸的对应栏内。

    [说明1]

    函数int fun1(int m, int n)的功能是:计算并返回正整数m和n的最大公约数。

    [函数1]

    int fun1(int m, int n)

    {

    while ((1)) {

    if (m>n) m=m-n;

    else n=n-m;

    }

    (2);

    }

    [说明2]

    函数long fun2(char*str)的功能是:自左至右顺序取出非空字符串str中的数字字符形成一个十进制整数(最多8位)。

    例如,若字符串str的值为“f3g8d5.ji2e3p12fkp”,则函数返回值为3852312。

    [函数2]

    long fun2(char *str)

    {

    int i=0;

    long k=0;

    char *p=str;

    while (*p!='\0' &&(3)) {

    if (*p>='0' && *p<='9') {

    k=(4)+ *p - '0';

    ++i;

    }

    (5);

    }

    return k;

    }


    正确答案:(1)m!=n;(2)return n或return m;(3)i8;(4)k*10;(5)p++
    (1)m!=n;(2)return n或return m;(3)i8;(4)k*10;(5)p++

  • 第3题:

    阅读下列函数说明和C函数,将应填入______处的语句写在答题纸的对应栏内。

    [函数2.1说明]

    函数palindrome(char s[])的功能是:判断字符串s是否为回文字符串,若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样,称该字符串是回文字符串,例如,“LEVEL”是回文字符串,而“LEVAL”不是。

    [函数2.1]

    int palindrome(char s[])

    {

    char *pi, *pj;

    pi=s;pj=s+strlen(s)-1;

    while(pi<pj&& (1) ) {

    pi++;pj--;

    }

    if( (2) ) return-1;

    else return 0;

    }

    [函数2.2说明]

    函数f(char *str,char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。

    例如,若str的值为“33123333435”,del的值为“3”,调用此函数后,将输出3个子字符串,分别为“12”,“4”和“5”。

    [函数2.2]

    void f(char *str,char del)

    {

    int i,j,len;

    len=strlen(str);

    i=0;

    While(i<len){

    While( (3) )i++; /* 忽略连续的标志字符 */

    /* 寻找从str[i]开始直到标志字符出现的一个子字符串 */

    j=i+1;

    while(str[j]!=del &&str[j]!'\0')j++;

    (4) ='\0'; /* 给找到的字符序列置字符串结束标志 */

    printf("%s\t",&str[i]);

    (5);

    }

    }


    正确答案:(1)*pi==*pj (2)pipj或 *pi != * pj及其等价形式 (3)str[i]==del (4)str[j] (5)i=j+1
    (1)*pi==*pj (2)pipj或 *pi != * pj,及其等价形式 (3)str[i]==del (4)str[j] (5)i=j+1 解析:[函数2.1]
    若一个字符串顺读和倒读都一样,称该字符串是回文字符串。如果使用数组s[n]来存储一个字符串,则根据这个定义,要判断一个串是否是回文字符串,需要循环比较:
    (1)该字符串的第一个元素s[0]和最后一个元素s[n-1]比较,如果s[0]不等于 s[n-1],则s不是回文字符串。
    (2)如果s[0]等于s[n-1],则第二个元素s[1]和倒数第二个元素s[n-2]比较,如果s[1]不等于s[n-2],则s不是回文字符串。
    (3)依次类推,直到最中间的2个元素也比较完毕(如果s有偶数个元素),或者只剩下中间的1个元素(如果s有奇数个元素)。
    当上述循环结束时,如果最中间的元素没有进行比较,就说明s不是回文字符串,如果进行了比较,则s是回文字符串。
    在函数2.1中,pi和pj是2个指向字符的指针,程序首先将s的首地址赋给pi(即 pi=&a[0]),将元素s[strlen(s)-1)的地址赋给pj(即pj=&s[strlen(s)-1]),当pipj并且pi和pj所指向的字符相等时进行循环:pi自增,pj自减。
    退出循环后,如果pipj,则s是回文字符串(如果s有偶数个元素,则为pi>pj,如果 s有奇数个元素,则为pi=pj);如果pipj,则s不是回文字符串。
    [函数2.2]
    由函数2.2说明可知,此函数对给定的字符串进行从左至右的扫描,找出不包含标志字符的子字符串。
    在函数2.2中,i的初值为0,len表示字符串的长度。当ilen时进行循环:如果当前字符是标志字符,则不做处理,继续扫描以处理标志字符连成一串的情况。当退出该循环时,当前字符str[i]不是标志字符,这时开始寻找从str[i]开始,直到标志字符出现的一个子字符串(i保持不变,用j标记寻找的过程),给找到的字符序列置字符串结束标志,以便于后面语句的输出。
    输出语句结束后,就要继续寻找后面的不包含标志字符的子字符串,这时需要把指针 i移动j的后面,继续扫描。

  • 第4题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。

    【函数2.1说明】

    递归函数sum(int a[], int n)的返回值是数组a[]的前n个元素之和。

    【函数2.1】

    int sum (int a[],int n)

    {

    if(n>0) return (1);

    else (2);

    }

    【函数2.2说明】

    有3个整数,设计函数compare(int a,int b,int c)求其中最大的数。

    【函数2.2】

    int compare (int a, int b, int c )

    { int temp, max;

    (3) a:b;

    (4) temp:c;

    }

    【函数2.3说明】

    递归函数dec(int a[],int n)判断数组a[]的前n个元素是否是不递增的。不递增返回 1,否则返回0。

    【函数2.3】

    int dec( int a[], int n )

    {

    if(n<=1) return 1;

    if(a[0]<a[1]) return 0;

    return (5);

    }


    正确答案:(1)a[n-1]+sum(an-1)或者a[0]+sum(a+1n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1n-1);
    (1)a[n-1]+sum(a,n-1)或者a[0]+sum(a+1,n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1,n-1); 解析:本题考查C语言函数和一些基本运算。
    下面我们分别来分析这几个函数。在函数2.1中,题目要求用此递归函数求数组前 n个元素之和。递归函数的特点是在函数体中不停地调用函数本身,只是将其函数的参数范围改变。题目中要求我们求数组前n个元素之和,我们可以这样理解,即前n个元素之和等于第n个元素加上前n-1个元素之和,现在的问题转化成如何求前n-1个元素之和。同样的道理,可以将求前n-1个元素之和转化成求前n-2个元素之和,直到这个数小于0。从函数2.1的代码中可以知道,在计算以前,首先判断n与0的关系,如果n小于0,说明数组中无元素,因此,返回0值;如果n大于等于0,说明数组中有元素,应该返回的结果是第n个元素加上前n-1个元素之和,而前n-1个元素之和是调用函数本身来计算的。因此,第(1)空和第(2)空的答案分别是a[n-1)+sum(a,n-1),return()。
    在函数2.2中,题目要求我们在三个数中取最大数,在数学中,我们从三个数中取最大数时,一般是首先拿其中两个数比较,取较大的数再与第三个数比较,再取其较大的数,这个数就是三个数中的最大数。从函数2.2的代码中知道,三个数a、b、c,两个整型变量temp与max。根据求三个数中最大数的数学过程和函数中已给出的代码可知,第(3)空处语句应该为temp=(a>b)?a:b,求得a、b中较大数并存放在变量temp中。第(4)空处语句为max=(temp>c)?temp:c。
    在函数2.3中,题目要求判断数组a[]的前n个元素是否是不递增的。不递增返回1,否则返回0。要判断前n个元素是否是不递增的,需要判断前n-1个元素是否是不递增的,以及第n个元素与第n-1个元素的关系。此处与函数2.1一样,用的都是递归函数,只是出口不同,在函数2.1中,只要数组中没有元素了,递归结束,这里只要第n个元素大于第n-1个元素,则返回0,递归结束。又由if(a[0]a[1])语句可知,在每次调用函数时,都将其数组中的第一个元素与第二个元素比较来作为递归的出口,如果结果为假,就说明数组的前面两项的关系是不递增的,在下次调用中不用再考虑第一项。因此第(5)空应该是dec(a+1,n-1)。

  • 第5题:

    阅读以下说明和C函数将应填入(n)处的字句写在答题纸的对应栏内

    【说明1】

    函数Counter(intn,intw[])的功能是计算整数n的二进制表示形式中的1个数同时用数组w记录该二进制数中1所在位置的权。

    例如十进制数22的二进制表示为10110.对于该二进制数,1的个数为3,在w[0]中存入2(即21)、w[1]中存入4(即22)w[2]存入16(即24)

    【C函数1】


    答案:

    解析:

    本题考查C程序控制结构的应用

    计算结束。

    从上例可知二进制数的各位是从低到高依次计算出来的。

    这样数组中的奇数全部排在偶数之前

  • 第6题:

    阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。

    [函数2.1说明]

    Fibonacci数列中头两个数均为1,从第三个数开始,每个数等于前两个数之和。下述程序计算Fibonacci数列中前15个数,并以每行5个数的格式输出。

    [函数2.1]

    include <stdio.h>

    main()

    { int i,f,f1=1,f2=1;

    printf("%5d%5d",f1,f2);

    for(i=3;i<=15;i++){

    f=(1);

    printf("%5d",f);

    if((2)= =0) printf("\n");

    f1=12;

    (3);

    }

    }

    [函数2.2说明]

    函数fun(char *str1,char *str2)的功能是将字符串str2拼接到str1之后。

    [函数2.2]

    fun(char *str1,char *str2)

    { int i,j;

    for(i=0;str1[i]!='\0';i++);

    for(j=0;str2[j]!='\0';j++) (4);

    (5);

    }


    正确答案:(1) f1+f2 (2) i%5 (3) f2=f (4) str1[i++]=str2[j] (5) str1[i]='\0'
    (1) f1+f2 (2) i%5 (3) f2=f (4) str1[i++]=str2[j] (5) str1[i]='\0' 解析:(1)根据Fibonacci数列的性质,f等于前两数f1与f2之和;
    (2)每输出5个数以后应当换行,此条件即:i除以5余 0;
    (3)计算一个数值前,f1与f2都应更新,其中f2应为刚计算出的f;
    (4)此循环的功能是将str2的字符添加到str1末尾;
    (5)函数结束前应在str1末尾添加结束符。

  • 第7题:

    阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。

    【说明1】 递归函数is_elem(char ch, char *set)的功能是判断ch中的字符是否在set表示的字符集合中,若是,则返回1,否则返回0。 【C代码1】 int is_elem (char ch ,char*set) { If(*set==‘\0’) return 0; else If( (1) ) return 1; else return is_elem( (2) ) } 【说明2】 函数char*combine(char* setA,char *setB)的功能是将字符集合A(元素互异,由setA表示)和字符集合B(元素互异,由setB表示)合并,并返回合并后的字符集合。 【C代码2】 char*combine(char *setA, char*setB) { int i,lenA, lenB, lenC; lenA=strlen(setA); lenB=strlen(setB); char*setC=(char*)malloc(lenA+lenB+1); if(!setC) return NULL; strncpy(setC,setA,lenA); //将setA的前lenA个字符复制后存入setC lenC= (3) ; for(i=0;i<lenB;i++) if( (4) ) //调用is_elem判断字符是否在setA中 setC[lenC++]=setB[i]; (5) =‘/0’; //设置合并后字符集的结尾标识 return setC; }


    正确答案:(1)set[0]==ch
    (2)ch,*set-1
    (3)lenA
    (4)is_elem(setB[i],*setA)==0
    (5)setC[lenC+1]

  • 第8题:

    ●试题二

    阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    该程序运行后,输出下面的数字金字塔

    【程序】

    include<stdio.h>

    main ()

    {char max,next;

    int i;

    for(max=′1′;max<=′9′;max++)

    {for(i=1;i<=20- (1) ;++i)

    printf(" ");

    for(next= (2) ;next<= (3) ;next++)

    printf("%c",next);

    for(next= (4) ;next>= (5) ;next--)

    printf("%c",next);

    printf("\n");

    }

    }


    正确答案:
    ●试题二【答案】(1)(max-′0′)(2)′1′(3)max(4)max-1(5)′1′【解析】该程序共有9行输出,即循环控制变量max的值是从1~9。每行输出分3部分,先用循环for语句输出左边空白,(1)空填"(max-′0′)";再用循环输出从1到max-′0′的显示数字,即(2)空和(3)空分别填1和max;最后输出从max-′1′~1的显示数字,即(4)空和(5)空分别填和max-1和′1′。

  • 第9题:

    阅读以下两个说明、c函数和问题,将解答写入答题纸的对应栏内。

    【说明1】

    函数main()的功能旨在对输入的一个正整数n,计算12+22+32+…+n2,但是对该函数进行测试后没有得到期望的结果。

    【c函数】

    1.输入5测试上述main函数时,显示结果如下所示。

    input an integer:5

    result:-582598909

    2.将行号为7的代码修改为:prinff(”n=%d\nresuh:%d\n”,n,sum);并再次

    输入5测试main函数,显示结果如下所示。

    input an interger:5

    n=2293632

    result:-582598909

    阅读以上两个说明、c函数和问题,将解答写入答题纸的对应栏内。

    【问题1】

    请给出上述main函数中需要修改的代码行号,并给出修改后的整行代码。

    【说明2】

    函数test_f2{}编译时系统报告有错,修改后得到函数12_B{}。对函数12_B{}

    进行编译时顺利通过,在某些C系统中执行时却由于发生异常而不能正确结束。

    【c函数2】

    【问题2】(1)请指出函数test_f2中不能通过编译的表达式;(2)请指出可能导致函数f2_B运行异常的表达式。


    正确答案:问题(1):     以上的答案仅供参考并没有先后顺序。另外对sum进行初始化的“sum=O;”也可以加在第3行第4行以及第5行的适当的位置。 问题(2):(1)str++ (2) str:‘a’
    问题(1):     以上的答案仅供参考,并没有先后顺序。另外对sum进行初始化的“sum=O;”也可以加在第3行,第4行以及第5行的适当的位置。 问题(2):(1)str++ (2) str:‘a’ 解析:问题(1)解析:程序中的错误可以分为语法错误和语义错误,其中语义错误又可以分为静态语义错误和动态语义错误。语法错误和静态语义错误可以在编译的时候发现,而动态的语义错误只有在程序运行的结果中才能表现出来。C函数1中的main函数通过编译但是运行结果不对,虽然输出的是sum的值,但是在for循环中sum的值的得到与k以及n的值是相关的,因此我们需要从n、k、sum的定义和初始化查起。首先来看k,在定义的时候没有被初始化,但是在for循环进行使用的时候被初始化为1,后面通过k++进行改变的,这一部分是正确的。接下来看n,n在定义的时候也没有被初始化,n的值是通过scanf(“%d”,n)取得的,由第二次测试的显示结果可以看出,n的值并不是我们的输入值5,很显然n的值设定不对,回头仔细检查scanf函数的调用才发现n的前面缺少取地址运算符“&”,作为一名程序员都应该知道scanf中的变量使用的是地址,所以正确的写法为“scanI。(“%d”,&m);”;再来看sum,sum的值主要是通过for循环中的语句“sum+=k*k”来改变的。“sum+=k*k”实际上等同于“sum=sum+k*k”,可是我们知道sum在定义的时候并没有初始化,那么在我们第一次进入for循环的时候sum的值是不确定的,在这种情况下执行语句“sum+=k*k”得到的值自然也就无法预料了,所以我们需要在sum使用之前对其进行初始化“sum=0”。另外,在程序中还有一处就是第5行,可以看到在句末有一个分号,这样就等于for循环语句的循环体为空,“sum+=k * k”语句并没有被包含到for循环语句中,只是在循环结束后执行一次,最后输出地结果sum是等于n * n,不符合题目要求的结果(12+22+32+……+n2),正确的做法就是删除第5行末位的分号。问题(2)的解析:函数test~12()编译时系统报错,检查函数能够发现“char str[ ]=“test string”;”定义了字符数组str,并进行了初始化,因此str就是数组名,也是数组在内存中的首地址,*str则表示的是str[O],通过“* str=‘a’”改变str[O]的值是对的,但是“str++”就不对了,在c语言中str是数组名是地址常量,是不能修改的,所以系统在编译的时候会报告错误。如果我们将str定义为一个char类型的指针的话,则可以通过str++来修改str的值,使它指向不同字符对象,但是在函数f2_B()中定义“char *str=‘test string’;”的时候,直接对指针str用常量进行了初始化,使得str为一个指针常量,这样即使我们可以通过str++取得字符串中的任何一个字符,但是却不能够通过“*str=‘a’”修改*str的值,所以在运行的时候就会发生异常不能够正常结束。

  • 第10题:

    阅读以下说明和C函数,填补代码中的空缺,将解答填入答题纸的对应栏内。
    [说明1]
    函数isPrime(int n)的功能是判断n是否为素数。若是,则返回1,否则返回0。素数是只能被1和自己整除的正整数。例如,最小的5个素数是2,3,5,7,11。

    [C函数] int isPrime(int n) { int k, t; if (n==2) return 1; if(n<2 || ______)return 0; /*小于2的数或大于2的偶数不是素数// t=(int)Sqrt(n)+1; for(k=3; k<t; k+=2) if(______) return 0; return 1; }

    [说明2]
    函数int minOne(int art[],int k)的功能是用递归方法求指定数组中前k个元素中的最小者,并作为函数值返回。

    [C函数]int minOne(int arr[],int k){int t;assert(k>0);if(k==1)return ______;t=minOne(arr+1,______);if(arr[0]<t)return amr[0];return ______;}


    答案:
    解析:
    n%2==0,或!(n%2),或其等价形式
    n%k==0,或!(n%k),或其等价形式
    arr[0],或*arr,或其等价形式
    k-1,或其等价形式
    t

  • 第11题:

    阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。
    阅读以下说明和C函数,将应填入 (n) 处的语句或语句成分写在答题纸的对应栏内。
    【说明1】
    函数deldigit(char *s) 的功能是将字符串s中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与s等长的临时字符串空间并令t指向它,将非数字字符按次序暂存入该空间,最后再拷贝给s。
    【C函数】

    char *t = (char *)malloc( (1) ); /*申请串空间*/ int i, k = 0; if (!t) return; for(i = 0; i < strlen(s); i++)if ( !(*(s+i)>=’0’ && *(s+i)<=’9’) ) { t[k++] = (2) ;} (3) = ’\0’; /*设置串结束标志*/ strcpy(s,t);free(t);}

    【说明2】
    函数reverse(char *s, int len)的功能是用递归方式逆置长度为len的字符串s。例如,若串s的内容为"abcd",则逆置后其内容变为"dcba"。
    【C函数】

    void reverse(char *s, int len){ char ch; if ( (4) ) { ch = *s; *s = *(s+len-1); *(s+len-1) = ch; reverse( (5) ); }}


    答案:
    解析:
    (1)strlen(s)+1
    (2)*(s+i),或s[i]或其等价表示
    (3)*(t+k)或t[k] 或其等价表示
    (4)len>1 或len>=1 或其等价表示
    (5)s+1 len-2
    【解析】

    根据说明1,在函数deldigit(char*s)中需先申请一个与s等长的临时字符串空间并令t指向它,因此空(1)处应填入"strlen(s)+1",其中,加1的原因是函数strlen计算s所指向字符串的长度时,没有包含串结束标志字符"\0"。当然,申请比"strlen(s)+1"更大的存储区也可以,只是没有必要。
    由于需要将非数字字符按原来的顺序存入t所指向的存储区,所以空(2)处填入"s[i]",或其等价表示形式。
    最后在设置t所指向字符串的结束标志,即令t[k]='\0'.在这里,空(3)处的t[k]写为t[k++]也可以,而写为t[k+1]或t[++k]则不符合整个代码的处理逻辑。
    函数reverse(char*s,int len)的功能是用递归方式逆置长度为len的字符串s,其中以下代码实现了将s所指字符与串中最后一个字符交换的处理。
    Ch=*s; *s=*(s+len-1); *(s+len-1)=ch;

  • 第12题:

    阅读以下说明和C函数,填补函数代码中的空缺,将解答填入答题纸的对应栏内。
    [说明1]
    函数f(double eps)的功能是:利用公式

    计算并返回π的近似值。

    [C函数1] double f(doubleeps) { double n=1.0, s=1.0, term=1.0, pi=0.0; while ( fabs(term) >=eps ){ pi=pi+term; n= ______; s= ______; term=s/n; } return pi*4; }

    [说明2]
    函数fun(char *str)的功能是:自左至右顺序取出非空字符串str中的数字字符,形成一个十进制整数(最多8位)。例如,若str中的字符串为"iyt?67kp f3g8d5.j4ia2e3p12",则函数返回值为67385423。

    [C函数2] long fun(char*str) { int i=0; long num: 0; char *p = str; while ( i<8 && ______) { if ( *p >= '0' && *p <= '9' ) { num= ______ + *p -'0'; ++i; } ______; } return num; }


    答案:
    解析:
    n+2
    -s或-1*s
    *p!='\0'或等价形式
    num*10或等价形式
    p++或等价形式

    【解析】

    本题考查C语言程序设计基本技能。考生需认真阅读题目中的说明,从而确定代码的运算逻辑,在阅读代码时,还需注意各变量的作用。
    函数f(double eps)的功能是计算兀的近似值。观察题中给出的计算公式,可知在循环中n每次递增2,因此空(1)处应填入"n+2"。由于公式中的各项是正负交替的,因此结合表达式"term=s/n"可知变量s就是起此作用的。空(2)处应填入"-s"或"-1*s"。
    对于函数fun(char *str]),从字符序列中取出数字并组合为一个整数时,对于每个数字,只需将之前获取的部分乘以10再加上该数字的值即可。
    以67385423为例。
    67385423=(((((((0+6)*10+7)*10+3)*10+8)*10+5)*10+4)*10+2)*10+3
    函数中的变量i是用来计算位数的,num用来计算所获得的整数值。显然,最多读取字符序列中的前8个数字,或者到达字符序列的末尾(*p!='\0')时,计算也需结束。因此,空(3)处应填入"*p!:'\0'"。
    根据num的作用,空(4)处应填入"num*10"。
    根据指针p的作用,空(5)处的代码应使得p指向下一个字符,因此应填入"p++"。

  • 第13题:

    试题二(共15分)

    阅读以下说明和C函数,将应填入 (n) 处的语句或语句成分写在答题纸的对应栏内。

    【说明1】 函数deldigit(char *s) 的功能是将字符串s中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与 s 等长的临时字符串空间并令t指向它,将非数字字符按次序暂存入该空间,最后再拷贝给s。

    【C函数】

    void deldigit(char *s)

    {

    char *t = (char *)malloc( (1) ); /*申请串空间*/

    int i, k = 0;

    if (!t) return;

    for(i = 0; i < strlen(s); i++)

    if ( !(*(s+i)>='0' && *(s+i)<='9') ) {

    t[k++] = (2) ;

    }

    (3) = '\0'; /*设置串结束标志*/

    strcpy(s,t);

    free(t);

    }

    【说明2】

    函数reverse(char *s, int len)的功能是用递归方式逆置长度为 len的字符串s。例如,若串s的内容为“abcd” ,则逆置后其内容变为“dcba” 。

    【C函数】

    void reverse(char *s, int len)

    {

    char ch;

    if ( (4) )

    {

    ch = *s;

    *s = *(s+len-1);

    *(s+len-1) = ch;

    reverse( (5) );

    }

    }


    正确答案:
    试题二(共15分)
    (1)strlen(s)+1          (3分)
         其中,strlen(s)不可缺少,1可用大于1的任何一个整数代替
         若考生解答为strlen(s),则给2分
    (2)*(s+i),或s[i],或其等价表示      (3分)
    (3)*(t+k),或t[k] ,或其等价表示     (3分)
    (4)len > 1,或len >= 1,或其等价表示     (3分)
    (5)s+1,len-2          (3分)

  • 第14题:

    阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。

    [函数2.1说明]

    函数strcpy的功能是将字符串str2的内容复制到字符申str1。

    [函数2.1]

    (1) strcpy (char *slr1, const char *str2)

    { char * temp;

    while( * str2!='\0') *cp++ =(2);

    (3)='\0';

    return str1;

    }

    [函数2.2说明]

    函数int strcmp(const char *str1, const char *str2)的功能是按字典序比较两个字符串str1和str2的大小。当str1<str2时返回-1,当str1>str2时返回1,否则返回0。

    [函数2.2]

    int strcmp(const char *str1, const char *str2)

    { while( *str1= =* str2) {

    if(* s1= =(4)) return 0;

    s1++;

    (5);

    }

    if( *str1<*str2) return -1;

    return 1;

    }


    正确答案:char * (2) * str2++ (3) * cp (4) ‘\0’ (5) s2++或 ++s2
    char * (2) * str2++ (3) * cp (4) ‘\0’ (5) s2++或 ++s2 解析:(1)根据函数说明,char *是函数strcpy的返回值类型;
    (2)while循环是字符串复制的关键,它将str2的字符一个个复制到cp;
    (3)字符复制完成后,应在字符串cp的末尾添加结束符;
    (4)~(5):while循环的功能是从字符串首开始逐个比较str1和str2的每一字符,如果循环一直执行到两字符串末尾,则说明两串相等,应返回0值。

  • 第15题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    【说明】

    给定函数fun的功能是:将从键盘上输入的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔开,用“.”结束输入。

    【函数】

    int fun(char *c,int status)

    {

    if((1)=='')

    return 1;

    else

    {

    if((2)&&(3)&&(4))

    (5)='A'-'a';

    return 0;

    }

    }

    main()

    {

    int flag=1;

    char ch;

    printf("请输入一字符串,用点号结束输入!\n");

    do {

    ch=getchar();

    flag=fun(&ch,flag);

    putchar(ch);

    }while(ch!='.');

    printf("\n");

    }


    正确答案:(1)*c (2)status (3)*c='z' (4)*c>='a' (5)*c+
    (1)*c (2)status (3)*c='z' (4)*c>='a' (5)*c+ 解析:本题考查在C语言中对字符串的处理。
    题目要求程序将从键盘上输入的每个单词的第一个字母转换为大写字母,而输入的各单词必须用空格隔开,用“.”结束输入。要实现这个功能,关键之一在于如何取出单词中的第一个字母,关键之二是如何实现大小写字母的转换。
    第(1)空是一个条件判断语句的条件,如果条件成立,则返回1,而从程序中可以看出,此条件判断语句是判断当前取到的字符是否等于空格字符。从主函数中可以看到,每次在调用功能函数fun()前都从输入的字符串中取出一个字符,并存放在变量ch中,而在调用函数时是将变量ch的地址传递给了指针变量c,因此此空的答案为*c。
    第(2)空、第(3)空和第(4)空应该结合起来看,它们都是条件判断语句的条件,这个条件判断语句下面的程序是将一个小写字母改变成一个大写字母,根据题目要求,此条件判断语句的条件应该是判断当前取到的字母是一个单词的第一个字母且是一个小写字母,再结合主函数来看,我们不难发现单词的第一个字母用一个标记变量flag标识,如果是第一个字母,这个标记变量flag的值为1,否则为0。要判断一个字母是否是小写字母,应该判断其ASCⅡ码值是否在a与z的ASCⅡ码值之间。所以这3个空的答案应该分别为status、*c='z'、*c>='a'。
    第(5)空是在上面条件成立的情况下执行的一条语句,条件成立我们在上面已经分析过了,表明当前取到的字符是一个单词的第一个字母且是小写字母,此空所在语句的任务是将小写字母变成大写字母,根据上面的分析,因此可以得到此空答案为*c+。

  • 第16题:

    阅读下面的说明,回答问题1~问题4,将解答填入答题纸对应的解答栏内。

    [说明]

    阅读以下说明,回答问题1~问题4,将解答填入答题纸对应的解答栏内。

    windows Server 2003是一个多任务多用户的操作系统,能够以集中或分布的方式实现各种应用服务器角色,是目前应用比较广的操作系统之一。

    Windows内置许多应用服务功能,将下表中(1)~(5)处空缺的服务器名称填写在答题纸对应的解答栏内。

    (1)


    正确答案:域名(DNS)服务器
    域名(DNS)服务器

  • 第17题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    [说明1]

    函数void fun(char*w,char x,int*n)用来在w数组中插入x,w数组中的数已按由小到大顺序存放,n指存储单元中存放数组中数据的个数,插入后数组中的数仍有序。

    [C函数1]

    void fun(char*W,char x,int*n)

    { int i,P;

    p=0;

    w[*n]=x;

    while(x>w[p]) (1) ;

    for(i=*n,i>p;i--)w[i]=(2);

    w[p]=x;

    ++*n;

    }

    [说明2]

    函数void revstr(char*s)将字符串s逆置。例如:字符串“abcde”,经过逆置后变为“edcba”。

    [C函数2]

    void revstr(char*s)

    { char*p,c;

    if(s==NULL)return;

    p=(3); /*p指向字符串s的最后一个有效字符*/

    while(s<p){ /*交换并移动指针*/

    C=*s;

    (4)=*p;

    (5)=c;

    }

    }


    正确答案:(1) p++ (2) w[i-1] (3) s+strlen(s)-1 (4) *s++或*(s++) (5) *p-或*(p--)
    (1) p++ (2) w[i-1] (3) s+strlen(s)-1 (4) *s++或*(s++) (5) *p-或*(p--) 解析:函数1的fun()中的while循环是为了找到x的插入位置,因此(1)填“p++”,for循环是移动数组中的元素,因此(2)填“w[i-1]”。
    对于函数2,设字符串的长度为n,则该函数的思想为将*(s+j)与*(s+n-1+i)对换,i=0....n/2。采用指针来实现,s为起始地址,p定位为最后一个字符的位置,所以空(3)应填“s+strlen(s)-1”;采用*s与*p交换后为s++与P--。即空(4)填“*s++”或“*(s++)”,空(5)填“*p-”或“*(p--)”。

  • 第18题:

    阅读以下说明和C函数,填补代码中的空缺(1)~(5),将解答填入答题纸的对应栏内。

    【说明1】 函数isPrime(int n)的功能是判断n是否为素数。若是,则返回1,否则返回0。素数是只能被1和自己整除的正整数。例如,最小的5个素数是2,3,5,7,11。 【C函数】 int isPrime (int n) { int k, t; if (n==2) return 1; if(n<2|| (1) ) return 0; /* 小于2的数或大于2的偶数不是素数 */ t=(int)sqrt(n)+1; for (k=3; k<t; k+=2) if ( (2) ) return 0; return 1; } 【说明2】 函数int minOne(int arr[], int k)的功能是用递归方法求指定数组中前k个元素中的最小者,并作为函数值返回。 【C函数】 int minOne (int arr[], int k) { int t; assert (k>0) ; if(k==1) return (3) ; t=minOne(arr+1, (4) ; if (arr[0]<t) return arr[0]; return (5) ; }


    正确答案:
    (1)n%2==0,或!(n%2),或其等价形式
    (2)n%k==0,或!(n%k),或其等价形式
    (3)arr[0],或*arr,或其等价形式
    (4)k-1,或其等价形式
    (5)t

  • 第19题:

    阅读以下说明和 C 函数,填补函数代码中的空缺,将解答填入答题纸的对应栏内。 【说明 1】 函数 f(double eps) 的功能是:利用公式计算并返回 π 的近似值。【说明 2】 函数fun(char *str)的功能是:自左至右顺序取出非空字符串 str中的数字字符,形成一个十进制整数(最多 8 位)。例如,若 str中的字符串为 "iyt?67kp f3g8d5.j4ia2e3p12", 则函数返回值为 67385423。


    正确答案:(1)n+2
    (2)-s 或-1*s
    (3) *p!= ' \ 0'或等价形式
    (4) num*10 或等价形式
    (5) p++或等价形式

  • 第20题:

    试题三(共 15 分)

    阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。


    正确答案:

  • 第21题:

    ()阅读下列说明和C语言程序,将应填入 (n)处的语句写在答题纸的对应栏内。[说明]下面程序是一个带参数的主函数,其功能是显示在命令行中输入的文本文件内容。[C语言函数]#include"stdio.h"main(argc,argv) int argc; char *argv[]; { (1) ; if((fp=fopen(argv[1],”r’’))== (2) ) { printf(”file not open!\n”);exit(0);} while( (3) ) putchar( (4) ); (5); }


    正确答案:()
    (1)FILE *fp; (2)NULL  (3)!feof(fp)  (4)fgetc(fp)   (5)fclose(fp)
    从程序功能来看,程序中需要用到文件型指针变量中,而主函数体没有定义,所以(1)应该填写的是“FILE *fp;”。接下来的语句是标准的打开只读文本文件的语句,显示的是文件没打开,说明文件名不存在,也就是为“NULL”。接着的while循环语句中有两处空白。前一个空白是控制循环的条件,从程序功能来看,要将文本文件中的所有字符显示出来,这儿当然只能填写“不是文件尾则继续循环”,具体说,需要填写的是“!feof(fp)”。(4)出现在循环体中的语句中,该循环体的功能是从fp指向的文本文件中读取单个字符并显示在屏幕上,此处使用的是putchar函数,该函数的功能是将形参对应的字符显示在屏幕上,所以该处的空白就是要显示的字符,这个字符必须是从文本文件中读取的单个字符,完成这项工作的可以利用fgetc()函数,所以(4)填写的是“fgetc(fp)”。最后一句应当是关闭文件,所以(5)应填fclose(fp)。

  • 第22题:

    阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。【说明】函数GetDateId(DATEdate)的功能是计算并返回指定合法日期date是其所在年份的第几天。例如,date表示2008年1月25日时,函数的返回值为25,date表示2008年3月3日时,函数返回值为63。函数Kday—Date(inttheyear,intk)的功能是计算并返回指定合法年份theyear(theyear≥1900)的第k天(1≤k≤365)所对应的日期。例如,2008年的第60天是2008年2月29日,2009年的第60天是2009年3月1日。函数isLeapYear(inty)的功能是判断y代表的年份是否为闰年,是则返回1,否则返回0。DATE类型定义如下:



    答案:
    解析:
    (1)date.month(2)date.month>2或其等价形式(3)DATE(4)theyear(5)days_month[i-1]或其等价形式
    【解析】

    函数GetDateId(DATE date)的功能是计算并返回指定合法日期date是其所在年份的第几天。处理思路是:先将1月~date.month-l月的天数累加起来,然后加上date.month的天数date.day即可。若date.month>2,则需要考虑特殊情况2月份,在闰年为29天而不是28天。因此,空(1)处应填入date.month,空(2)处应填入date.month>2。函数Kday_Date(int theyear,int k)的功能是计算并返回指定合法年份theyear (theyear≥1900)的第k天(1≤k≤365)所对应的日期。根据说明,显然空(3)应填入“DATE”。当k<32时,计算出的日期一定在1月份;当k大于31而小于60(闰年时为61)时,计算出的日期一定在2月份;以此类推。函数中的处理思路是:先将k的值减去1月份的天数,若仍大于0,则继续减去2月份的天数,以此类推,直到k的值小于或等于0。此时将多减去的最后1个月的天数加上即可。因此,空(4)应填入“theyear”,空(5)应填入“days_month[i]”。

  • 第23题:

    阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。【说明1】
    函数deldigit(char *s) 的功能是将字符串s中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与s等长的临时字符串空间并令t指向它,将非数字字符按次序暂存入该空间,最后再拷贝给s。【C函数】
    void deldigit(char *s)
    {
    char *t = (char *)malloc( (1) ); /*申请串空间*/
    int i, k = 0;

    if (!t) return;
    for(i = 0; i < strlen(s); i++)
    if ( !(*(s+i)>=’0’ && *(s+i)<=’9’) ) {
    t[k++] = (2) ;
    }
    (3) = ’\0’; /*设置串结束标志*/
    strcpy(s,t);
    free(t);
    }
    【说明2】
    函数reverse(char *s, int len)的功能是用递归方式逆置长度为len的字符串s。例如,若串s的内容为“abcd”,则逆置后其内容变为“dcba”。
    【C函数】
    void reverse(char *s, int len)
    {
    char ch;
    if ( (4) )
    {
    ch = *s;
    *s = *(s+len-1);
    *(s+len-1) = ch;
    reverse( (5) );
    }
    }


    答案:
    解析:
    (1)strlen(s)+1
    (2)*(s+i),或s[i]或其等价表示
    (3)*(t+k)或t[k] 或其等价表示
    (4)len>1 或len>=1 或其等价表示
    (5)s+1 len-2根据说明1,在函数deldigit(char*s)中需先申请一个与s等长的临时字符串空间并令t指向它,因此空(1)处应填入“strlen(s)+1”,其中,加1的原因是函数strlen计算s所指向字符串的长度时,没有包含串结束标志字符“\0”。当然,申请比“strlen(s)+1”更大的存储区也可以,只是没有必要。
    由于需要将非数字字符按原来的顺序存入t所指向的存储区,所以空(2)处填入“s[i]”,或其等价表示形式。
    最后在设置t所指向字符串的结束标志,即令t[k]=’\0’.在这里,空(3)处的t[k]写为t[k++]也可以,而写为t[k+1]或t[++k]则不符合整个代码的处理逻辑。
    函数reverse(char*s,int len)的功能是用递归方式逆置长度为len的字符串s,其中以下代码实现了将s所指字符与串中最后一个字符交换的处理。
    Ch=*s; *s=*(s+len-1); *(s+len-1)=ch;