I am a teacher!

导航

计算机等级考试二级C语言上机题集(第56~60套)

第56套

1.程序填空题

给定程序中,函数fun的功能是:在带头结点的单向链表中,查找数据域中值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在值为ch的结点,函数返回值为0。

请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
#include <stdlib.h>
#define  N  8
typedef  struct list
{  
    int  data;
    struct list  *next;
} SLIST;
SLIST *creatlist(char *);
void outlist(SLIST *);
int fun(SLIST *h, char ch)
{  
    SLIST  *p;        
    int  n=0;
    p=h->next;
    /**********found**********/
    while(p!=___1___)
    {   
        n++;
    /**********found**********/
        if (p->data==ch)  return ___2___;
        else  p=p->next;
    }
    return 0;
}
int main()
{  
    SLIST  *head;       
    int  k;      
    char  ch;
    char a[N]={'m','p','g','a','w','x','r','d'};
    head=creatlist(a);
    outlist(head);
    printf("Enter a letter:");
    scanf("%c",&ch);
    /**********found**********/
    k=fun(___3___);
    if (k==0)  printf("\nNot found!\n");
    else printf("The sequence number is : %d\n",k);
    return 0;
}
SLIST *creatlist(char  *a)
{  
    SLIST  *h,*p,*q;      
    int  i;
    h=p=(SLIST *)malloc(sizeof(SLIST));
    for(i=0; i<N; i++)
    {  
       q=(SLIST *)malloc(sizeof(SLIST));
       q->data=a[i];  p->next=q;  p=q;
    }
    p->next=0;
    return  h;
}
void outlist(SLIST  *h)
{  
    SLIST  *p;
    p=h->next;
    if (p==NULL) printf("\nThe list is NULL!\n");
    else
    {  
        printf("\nHead");
        do {
           printf("->%c",p->data);  
           p=p->next;  
        } while(p!=NULL);
        printf("->End\n");
    }
}

2.程序修改题

给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和a[0]中的数对调,次大数与a[1]中的数对调。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>
#define  N  20
void  fun(int *a, int n)
{  
    int i, m, t, k ;
    for(i=0;i<2;i++) 
    {
    /**********found**********/
       m=0;
       for(k=i+1;k<n;k++)
    /**********found**********/
          if(a[k]>a[m]) k=m;
       t=a[i];a[i]=a[m];a[m]=t;
    }
}
int main()
{  
    int b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;
    for ( i=0; i<n; i++ ) printf("%d  ", b[i]);
    printf("\n");
    fun ( b, n );
    for ( i=0; i<n; i++ ) printf("%d  ", b[i]);
    printf("\n");
    return 0;
}

3.程序设计题

编写函数fun,它的功能是:求出n位整数w(w>10)的后n-1位的数作为函数值返回。

例如,若w值为5923,则函数返回923;w为923,函数返回23。

注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include <stdio.h>
void NONO(void);
unsigned  fun(unsigned  w)
{

}
int main()
{
    unsigned  x;
    printf("Enter a unsigned integer number :" );
    scanf("%u", &x );
    printf("The original data is :  %u\n", x);
    if (x < 10) printf ("Data error !");
    else  printf("The result : %u\n", fun(x));
    NONO();
    return 0;
}
void NONO(void)
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
    输出数据,关闭文件。 */
    unsigned x ;
    int i ;
    FILE *rf, *wf ;
    rf = fopen("in.dat","r") ;
    wf = fopen("out.dat","w") ;
    for(i = 0 ; i < 20 ; i++)
    {
       fscanf(rf, "%u", &x) ;
       fprintf(wf, "%u\n", fun(x)) ;
    }
    fclose(rf) ;
    fclose(wf) ;
}
1.(1)NULL   (2)n   (3)head,ch
2. m=i;
    if (a[k]>a[m]) m=k;
3. unsigned  fun(unsigned  w)
    {
        unsigned x=0,d,p=1;
        while (w>=10)
        {
             d=w%10;
             x=p*d+x;
             p=p*10;
             w=w/10;
        }
        return x;
    }
第56套参考答案

第57套

1.程序填空题

给定程序中已建立一个带头结点的单向链表,在main函数中将多次调用函数fun,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。

请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include  <stdio.h>
#include  <stdlib.h>
#define   N  8
typedef  struct list
{  
    int  data;
    struct list  *next;
} SLIST;
void fun(SLIST  *p)
{  
    SLIST  *t, *s;
    t=p->next;    
    s=p;
    while(t->next != NULL)
    {  
        s=t;
    /**********found**********/
        t=t->___1___;
    }
    /**********found**********/
    printf(" %d ",___2___);
    s->next=NULL;
    /**********found**********/
    free(___3___);
}
SLIST *creatlist(int  *a)
{  
    SLIST  *h,*p,*q;      
    int  i;
    h=p=(SLIST *)malloc(sizeof(SLIST));
    for(i=0; i<N; i++)
    {  
        q=(SLIST *)malloc(sizeof(SLIST));
        q->data=a[i];  p->next=q;  p=q;
    }
    p->next=0;
    return  h;
}
void outlist(SLIST  *h)
{  
    SLIST  *p;
    p=h->next;
    if (p==NULL)  printf("\nThe list is NULL!\n");
    else
    {  
        printf("\nHead");
        do { 
            printf("->%d",p->data);  
            p=p->next;  
        } while(p!=NULL);   
        printf("->End\n");
    }
}
int main()
{  
    SLIST  *head;
    int  a[N]={11,12,15,18,19,22,25,29};
    head=creatlist(a);
    printf("\nOutput from head:\n");  
    outlist(head);
    printf("\nOutput from tail: \n");
    while (head->next != NULL)
    {
      fun(head);
      printf("\n\n");
      printf("\nOutput from head again :\n");  
      outlist(head);
    }
    return 0;
}

2.程序修改题

给定程序的功能是:读入一个整数k(2<=k<=10000),打印它的所有质因子(即所有为素数的因子)。

例如,若输入整数:2310,则应输出:2、3、5、7、11。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>
/************found************/
IsPrime (int  n);
{   
    int   i,  m;
    m = 1;
    for ( i = 2;  i < n;  i++  )
    /************found************/
      if  !( n%i )
      {    m = 0;    break ;   }
    return ( m );
}
int main()
{   
    int  j, k;
    printf( "\nPlease enter an integer number between 2 and 10000: " ); 
    scanf(  "%d", &k );
    printf( "\nThe prime factor(s) of %d is( are ):", k );
    for (j=2; j<=k; j++)
       if ((!(k%j)) && (IsPrime(j))) printf("\n %4d",j);
    printf("\n");
    return 0;
}

3.程序设计题

已知学生的记录由学号和学习成绩构成,N名学生的数据已存入结构体数组a中。编写函数fun,它的功能是:找出成绩最高的学生记录,通过形参返回(规定只有一个最高分)。

注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include <stdio.h>
#include <string.h>
#define  N  10
typedef  struct  ss
{
    char  num[10];
    int  s;
} STU;
void NONO(void);
void fun(STU  a[], STU  *s)
{

}
int main()
{
    STU a[N]={{"A01",81},{"A02",89},{"A03",66},
          {"A04",87},{"A05",77},{"A06",90},
          {"A07",79},{"A08",61},{"A09",80},
          {"A10",71} }, m  ;
    int   i;
    printf("***** The original data *****\n");
    for ( i=0; i< N; i++ )
        printf("No = %s  Mark = %d\n", a[i].num,a[i].s);
    fun ( a, &m );
    printf ("***** THE  RESULT *****\n");
    printf ("The top  :  %s , %d\n",m.num, m.s);
    NONO( );
    return 0;
}
void NONO(void)
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
    FILE *rf, *wf ;
    STU a[N], m ;
    int i ;
    rf = fopen("in.dat","r") ;
    wf = fopen("out.dat","w") ;
    for(i = 0 ; i < 10; i++)
       fscanf(rf, "%s %d", a[i].num, &a[i].s) ;
    fun(a, &m) ;
    fprintf (wf, "The top : %s, %d\n", m.num, m.s) ;
    fclose(rf) ;
    fclose(wf) ;
}
1.(1)next   (2)t->data   (3)t
2int IsPrime (int  n)
    if  (!(n%i))  或  if  (n%i==0)
3void fun(STU  a[], STU  *s)
    {
        int i;
        *s=a[0];
        for (i=1;i<N;i++)
            if (s->s<a[i].s)
               *s=a[i];
    }
第57套参考答案

第58套

1.程序填空题

给定程序中,函数fun的功能是:对形参ss所指字符串数组中的M个字符串按长度由短到长进行排序。

请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include  <stdio.h>
#include  <string.h>
#define   M    5
#define   N    20
void fun(char  (*ss)[N])
{  
    int  i, j, k, n[M];      
    char  t[N];
    for(i=0; i<M; i++)  n[i]=strlen(ss[i]);
    for(i=0; i<M-1; i++)
    {  
        k=i;
    /**********found**********/
        for(j=___1___; j<M; j++)
    /**********found**********/
           if(n[k]>n[j])  ___2___;
        if(k!=i)
        {  
            strcpy(t,ss[i]);
            strcpy(ss[i],ss[k]);
    /**********found**********/
            strcpy(ss[k],___3___);
            n[k]=n[i];
        }
    }
}
int main()
{  
    char  ss[M][N]={"shanghai","guangzhou",
             "beijing","tianjing","cchongqing"};
    int  i;
    printf("\nThe original strings are :\n");
    for(i=0; i<M; i++)  printf("%s\n",ss[i]);
    printf("\n");
    fun(ss);
    printf("\nThe result :\n");
    for(i=0; i<M; i++)  printf("%s\n",ss[i]);
    return 0;
}

2.程序修改题

给定程序中,函数fun的功能是:求出两个非零正整数的最大公约数,并作为函数值返回。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>
int  fun(int  a,int  b)
{  
    int  r,t;
    if(a<b) 
    {
    /************found************/
       t=a; b=a; a=t;
    }
    r=a%b;
    while(r!=0)
    {  a=b; b=r; r=a%b; }
    /************found************/
    return(a);
}
int main()
{  
    int  num1, num2,a;
    printf("Input  num1  num2:   "); 
    scanf("%d%d",&num1,&num2);
    printf("num1= %d  num2= %d\n\n",num1,num2);
    a=fun(num1,num2);
    printf("The maximun common divisor is %d\n\n",a);
    return 0;
}

3.程序设计题

假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。

例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:ABCDEFG。

注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include <stdio.h>
void NONO(void);
void fun(char *str)
{

}
int main()
{
    char  s[81];
    printf("Enter a string:\n");
    gets(s);
    fun( s );
    printf("The string after deleted:\n");
    puts(s);
    NONO();
    return 0;
}
void NONO(void)
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
    FILE *in, *out ;
    int i ;
    char s[81] ;
    in = fopen("in.dat","r") ;
    out = fopen("out.dat","w") ;
    for(i = 0 ; i < 10 ; i++)
    {
       fscanf(in, "%s", s) ;
       fun(s) ;
       fprintf(out, "%s\n", s) ;
    }
    fclose(in) ;
    fclose(out) ;
}
1.(1)i+12)k=j   (3)t
2. t=a; a=b; b=t;
    return(b);
3void fun(char *str)
    {
        int i,j;
        for (i=0,j=0; str[i]!='\0';i++)
            if (str[i]!='*') str[j++]=str[i];
        str[j]='\0';
    }
第58套参考答案

第59套

1.程序填空题

给定程序中,函数fun的功能是:求出形参ss所指字符串中最长字符串的长度,将其余字符串左边用字符“*”补齐,使其与最长的字符串等长。ss所指字符串数组中共有M个字符串,且串长<N。

请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include  <stdio.h>
#include  <string.h>
#define  M   5
#define  N   20
void fun(char  (*ss)[N])
{  
    int  i, j, k=0, n, m, len;
    for(i=0; i<M; i++)
    {  
        len=strlen(ss[i]);
        if(i==0) n=len;
        if(len>n) 
        {
    /**********found**********/
           n=len;    ___1___=i;
        }
    }
    for(i=0; i<M; i++)
       if (i!=k)
       { 
           m=n;
           len=strlen(ss[i]);
    /**********found**********/
           for(j=___2___; j>=0; j--)
              ss[i][m--]=ss[i][j];
           for(j=0; j<n-len; j++)
    /**********found**********/
              ___3___='*';
       }
}
int main()
{  
    char  ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchongqing"};
    int  i;
    printf("\nThe original strings are :\n");
    for(i=0; i<M; i++)  printf("%s\n",ss[i]);
    printf("\n");
    fun(ss);
    printf("\nThe result:\n");
    for(i=0; i<M; i++)  printf("%s\n",ss[i]);
    return 0;
}

2.程序修改题

给定程序中,函数fun的功能是:用递归算法计算斐波那契数列中第n项的值,从第1项起,斐波那契数列为:1、1、2、3、5、8、13、21、……。

例如,若n=7,该项的斐波那契数值为13。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>
long fun(int  g)
{
    /**********found**********/
    switch(g);
    {  case 0: return 0;
    /**********found**********/
       case 1 ;case 2 : return 1 ;
    }
    return( fun(g-1)+fun(g-2));
}
int main()
{  
    long   fib;    
    int   n;
    printf("Input n:  "); 
    scanf("%d",&n); 
    printf("n = %d\n",n);
    fib=fun(n);
    printf("fib = %d\n\n",fib);
    return 0;
}

3.程序设计题

某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程成绩已在主函数中给出。编写函数fun,它的功能是:求出该学生的平均分放在记录的ave成员中。

例如,学生的成绩为:85.4,76,69.5,85,91,72,64.5,87.5,平均分应为:78.875。

注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include <stdio.h>
#define N 8
typedef struct
{
    char num[10];
    double s[N];
    double ave;
}STREC;
void NONO(void);
void fun(STREC *p)
{

}
int main()
{
    STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5};
    int i;
    fun(&s);
    printf("The %s's student data:\n",s.num);
    for(i=0;i<N;i++)
       printf("%4.1f\n",s.s[i]);
    printf("\nave=%7.3f\n",s.ave);
    NONO();
    return 0;
}
void NONO(void)
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
    STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5};
    int i;
    FILE  *wf;
    wf = fopen("out.dat", "w") ;
    fun(&s);
    fprintf(wf,"The %s's student data:\n",s.num);
    for(i=0;i<N;i++)
       fprintf(wf,"%4.1f\n",s.s[i]);
    fprintf(wf,"ave=%7.3f\n",s.ave);
    fclose(wf) ;
}
1.(1)k   (2)len   (3)ss[i][j]
2switch(g)
    case 1 :case 2 : return 1 ;
3void fun(STREC *p)
    {
        int i;
        double sum=0.0;
        for (i=0;i<N;i++)
            sum+=p->s[i];
        p->ave=sum/N;
    }
第59套参考答案

第60套

1.程序填空题

给定程序中,函数fun的功能是:进行字母转换。若形参ch是小写英文字母,则转换为对应的大写英文字母;若ch中是大写英文字母,则转换为对应的小写英文字母;若是其它字符则保持不变。

请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
#include <ctype.h>
char fun(char  ch)
{
    /**********found**********/
    if ((ch>='a')___1___(ch<='z'))
      return  ch -'a' + 'A';
    if ( isupper(ch) )
    /**********found**********/
      return  ch +'a'-___2___ ;
    /**********found**********/
    return ___3___;
}
int main()
{  
    char  c1, c2;
    printf("\nThe result  :\n");
    c1='w';   c2 = fun(c1);
    printf("c1=%c    c2=%c\n", c1, c2);
    c1='W';   c2 = fun(c1);
    printf("c1=%c    c2=%c\n", c1, c2);
    c1='8';   c2 = fun(c1);
    printf("c1=%c    c2=%c\n", c1, c2);
    return 0;
}

2.程序修改题

给定程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17整除的自然数之和。

例如,若k=500,则函数值为4622。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>
int fun(int k)
{
    int m=0,mc=0;
    while ((k>=2)&&(mc<10))
    {
    /************found************/
        if ((k%13=0)||(k%17=0))
        {  m=m+k; mc++; }
    /************found************/
        k++;
    }
    return m;
}
int main()
{
    printf("%d\n",fun(500));
    return 0;
}

3.程序设计题

假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:除了字符串中的前导*号之外,将串中其它*号(中间和尾部的*号)全部删除。

例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:*****ABCDEFG。

注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include <stdio.h>
void NONO(void);
void fun(char *str)
{

}
int main()
{
    char  s[81];
    printf("Enter a string:\n");
    gets(s);
    fun( s );
    printf("The string after deleted:\n");
    puts(s);
    NONO();
    return 0;
}
void NONO(void)
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
    FILE *in, *out ;
    int i ;
    char s[81] ;
    in = fopen("in.dat","r") ;
    out = fopen("out.dat","w") ;
    for(i = 0 ; i < 10 ; i++)
    {
       fscanf(in, "%s", s) ;
       fun(s) ;
       fprintf(out, "%s\n", s) ;
    }
    fclose(in) ;
    fclose(out) ;
}
1.(1)&&   (2'A'3)ch
2if ((k%13==0)||(k%17==0))
    k--;
3void fun(char *str)
    {
        int i,j;
        i=0;
        while (str[i]=='*') i++;
        for (j=i; str[i]!='\0';i++)
            if (str[i]!='*') str[j++]=str[i];
        str[j]='\0';
    }
第60套参考答案

posted on 2022-11-07 05:43  aTeacher  阅读(189)  评论(0编辑  收藏  举报