当前位置:   article > 正文

软考初级程序员下午题(9)_软考初级程序员真题 豆丁网

软考初级程序员真题 豆丁网

试题一

阅读下列算法说明和算法,将应填入______处的语句填写完整。
[说明]
本程序可以将字符串s1中出现的所有s2子串替换成s3,形成一个新串,但不破坏字符串s1。

 [代码]
    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
    char*replace(char*s1, char*s2, char*s3)
    { char*p,*q,*r,*s;int l2,l3,i=0;
    l2=strlen(s2);
    l3=strlen(s3);
    p=s1;
    while((p=strstr(p,s2))!=NULL)
    { i++;    //统计s2串出现的次数
    ______;
    }
    i=______;
    s=r=(char*)malloc(i);     //分配动态内存存放新字符串
    p=s1;
    while(1)
    { q=strstr(p,s2);    /*s2是否在s1中出现,q是首次出现的位置
    if(q!=NULL)
    { i=q-p;
    ______;
    r+=i;
    ______;
    r+=l3;
    p=q+l2;      //将指向s1串的指针移到s2子串出现的位置后,为下一次循环做好准备*/
    }
    else    //q为空,表示剩余的s1串中已经没有s2
    {______;
    break;    //终止循环
    }
    }
    return(s);    //返回指向所形成的新串的指针
    }
    void main()
    { char*a="sabcababde", *b="ab", *c="efg", *d;
    d=replace(a,b,c); printf("result=%s\n", d); free(d);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

试题二

阅读以下函数说明和C语言函数,将应填入______处的语句填写完整。
[函数2.1说明]
本程序可以打印出菱形:

  [函数2.1]
    main()
    {
    int i,j,k;
    for(i=0;i<=3;i++)
    {
    for(j=0;j<=2-i;j++)
    printf(" ");
    for(______)
    printf("*");
    printf("\n");
    }
    for(i=0;i<=2;i++)
    {
    for(______)
    printf(" ");
    for(k=0;k<=4-2*i;k++)
    printf("*");
    printf("\n");
    }
    }
    [函数2.2说明]
    通过本程序,可以从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“CsaiWgm”中保存,输入的字符串以“!”结束。
    [函数2.2]
    #include"stdio.h"
    main()
    {
    FILE*fp;
    char str[100],filename[10];
    int i=0;
    if((fp=fopen("CsaiWgm","w"))==NULL)
    {
    printf("cannot open the file\n");
    exit(0);
    }
    printf("please input a string:\n");
    gets(str);
    while(______)
    {
    if(str[i]='a'&&str[i]='z')
    str[i]=______;
    fputc(str[i],fp);
    ______;
    }
    fclose(fp);
    fp=fopen("CsaiWgm","r");
    fgets(str,stden(str)+1,fp);
    printf("%s\n",str);
    fclose(fp);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

试题三

阅读以下说明和C语言函数,将应填入______处的语句填写完整。
[说明]
设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为子树根结点的值后跟用“()”括起来的各子树的列表(若有子树的话),各子树的列表间用“,”分隔。例如,如下图所示的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。
本程序根据输入的列表生成一棵M叉树,并由M叉树再输出列表。

在这里插入图片描述

  [函数]
    #include <stdio.h>
    #include <stdlib.h>
    #define M 3    //三叉树
    typedef struct node{
    int val;
    strud node*subTree[M];
    }NODE;
    char buf[255],*str=buf;
    NODE*dNULL;
    NODE*makeTree()    //由列表生成M叉树
    {
    int k; NODE*s;
    s=______;
    s->val=*str++;
    for(k=0;k<M;k++)
    s->subTree[k]=NULL;
    if(*str=='(')
    {
    k=0;
     do{
    str++;
    s->subTree[k]=______;
    if(*str==')')
    {
    str++;
    break;
    }
    k=k+1;
    } while(______);
    }
    return s;
    }
    void walkTree(NODE*t)    //由M叉树输出列表
    {
    int i;
    if(t!=NULL)
    {
    ______;
    if(t->subTree[0]==NULL)
    return;
    putcharC('(');
    for(i=0; i<M; i++)
    {
    ______;
    if(i!=M-1 && t->subTree[i+1]!=NULL)
    putchar(',');
    }
    putchar(')');
    }
    }
    void main()
    {
    printf("Enter exp:");
    scanf("%s", str);
    d=makeTree();
    walkTree(d);
    putchar('\n');
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

试题一答案

(1)p+=l2
(2)strlen(s1)-il2+il3+1
(3)strncpy(r,p,i)
(4)strcpy(r,s3)
(5)strcpy(r,p)

[解析] 本题考查用C语言实现对字符串的操作。
题目要求将字符串s1中出现的所有子串s2替换成s3,形成一个新串,但不破坏字符串s1。要不破坏字符串s1,只有用一个新串来存放处理结果;要用到新串,那么就需要重新分配空间。
第1空在第一个循环体中,此循环体的作用在注释中已经给出,用来统计串s2在串s1中出现的次数,这里的统计变量已经给出,并将结果存放在统计变量i中,但每次统计成功后串s1的位置应该往后移动串s2的长度,由程序我们可以看出,串s1是存放在指针变量p中的,因此,指针变量P指的位置需要往后移动串s2的长度,而串s2的长度存放在变量l2中。因此,此空答案为“p+=l2”。
第2空很明显是用来给变量i赋一个值,但根据s=r=(char*)malloc(i)语句我们可以推断出,当前变量i中存放的是新串的长度。而新串的长度应该等于串s1的长度减去串中x个串s2的长度,加上x个串s3的长度再加1,而在上面的循环中已经求出了串s2在串s1中出现的次数,结果存放在变量i中。因此,此空答案为“strlen(s1)-il2+il3+1”。
第3空是在if(q!=NULL)成立的情况下运行的语句,而变量q指向的是s2在s1中首次出现的位置,如果条件成立,说明串s2在串s1中出现了,语句i=q-p用来表不出现的位置到s1开始位置的距离。在这些条件都清楚了后,应该往新的串中写字符了,首先写串s1的前i个字符,此空就是用来完成这个功能的,因此,此空答案为“strncpy(r,p,i)”。
第4空是接着上一空而来的,在上面我们分析到,把串s1的前i个字符写入新串,那么在新串中接着要出现的应该是替换串s2的串s3,此空的任务应该是将串s3写入新串中,因此,此空答案为“strcpy(r,s3)”。
第5空是在if(q!=NULL)不成立的情况下运行的语句,这说明串s2不在串s1中出现,在这种情况下,串应该不需要进行替换操作,而直接将串s1写入到新串中,此空的作用就是用来实现这个功能的,因此,此空答案为“strcpy(r,p)”。

试题二答案

(1)k=0;k<=2*i;k++
(2)j=0;j<=i;j++
(3)str[i]!=‘!’
(4)str[i]-32
(5)i++

[解析] 本题考查用C语言实现菱形的输出与大小写字母的转换。
在函数2.1中,题目要求实现对菱形的输出,从图中可以看出每行的“”字符个数为(2×行号-1),最长的一行其长度为8个“”字符,最短的一行是1个“”字符,从最短到最长一共是4行。下面来分析代码。
第1空是第二重循环的循环条件,从程序中可以推断出这个循环的作用是用来输出一行的“
”字符,根据上面的分析,每行的“”字符个数为(2×行号-1)可以得到循环的上界,再结合程序可以知道此空用的变量是k,而每行的行号存放在变量i中,因此,此空答案为“k=0;k<=2i;k++”。
第2空在第二个二重循环下面,这个二重循环用来输出图形中下半部分,此空是循环的条件。由于菱形具有对称性,我们可以对照程序上面相应的循环中的条件,很容易就可以得到结果,此空答案为“j=0;j<=i;j++”。
在函数2.2中,题目要求从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件CsaiWgm中保存。此题的关键在于如何将小写字母变成大写字母。
第3空是循环的循环条件,从程序中可以推断出这个循环的作用是用来将字符串的小写字母全部转换成大写字母,那么可以知道循环的条件是只要取到的字符不为结束字符“!”,循环就继续,因此,此空答案为“str[i]!=‘!’”。
第4空是条件判断语句下面的语句,根据程序给出的代码不难发现,如果此条件判断语句结果为真,说明当前取到的字符是小写字母,那么应该将其转换为大写字母,因此,此空答案为“str[i]-32”。
第5空是循环的最后一条语句,从程序中不难发现,循环对字符串的位置没有移动,那么此空应该用来实现对字符串位置的往后移动。而记录当前字符串位置的是变量i,因此,此空答案为“i++”。

试题三答案

(1)(NODE*)malloc(sizeof(NODE))
(2)makeTree()
(3)*str
(4)putchar(t->val)
(5)walkTree(t->subTree[i])

[解析] 本题考查在C语言中实现用列表表示M叉树。
题目要求程序根据输入的列表生成一棵M叉树,并由M叉树再输出列表。题目中给出了列表与树的对应关系,从这种对应关系中我们可以看出,每个结点后紧跟的那层括号下结点的个数就是这个根结点的孩子个数,用列表表示得到的序列有点像树的先序遍历,因此,根据列表来生成M叉树时,应该是首先生成左子树,然后才依次往右的生成过程。下面来具体分析代码。
第1空很明显是给变量s赋一个初值,从程序中可以知道,变量s是一个指向NODE型结点的指针变量,但程序中并没有给出这样的结点,那么此空应该是动态创建一个这样的结点。在C语言中,动态分配空间要用函数malloc(),因此,此空答案为“(NODE*)malloc(sizeof(NODE))”。
第2空在循环体中,从程序中不难推断出此循环体的作用是由列表生成M叉树,此空是给s->subTree[k]这个指针数组赋值,这个数组中存放的是当前结点的孩子结点的指针,在树的生成过程中是根据列表来递归生成其对应的三叉树的,此空应该是递归调用生成结点的函数makeTree()。因此,此空答案为"makeTree()”。
第3空是循环结束的判断条件,而这个循环的作用是根据列表来生成三叉树,只有列表的所有元素都被考虑了循环才结束。从程序中可以知道列表的元素存放在数组中,指针变量str指向这个数组,且在程序中对列表的操作都是通过指针变量str来实现的,因此,此空答案为“*str”。
第4空在条件判断语句下面,此条件判断语句结果为真,说明当前取到的是结点,接下来应该把该结点的值写入列表中,从后面的程序我们很容易知道实现此功能的函数,因此,此空答案为“putchar(t->val)”。
第5空在一个循环体下面,根据循环的条件,可以推断出这是对一个结点的所有孩子结点进行循环搜索。由M叉树生成列表可以说是由列表生成M叉树的逆过程,需要对树中的每个结点进行检索来生成列表,这里也要用到递归调用,而这个函数的当前检索的结点指针为t->subTree[i]。因此,此空答案为“walkTree(t->subTree[i])”。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/506999
推荐阅读
相关标签
  

闽ICP备14008679号