期末考试题(4)

一、填空   共5题 (共计20分)

第1题 (4.0分)        题号:1878        难度:易        第22章

以下程序运行后,输出的a值是【1】,b值是【2】,x的值是【3】,y的值是【4】。

# include <stdio.h>

void ex(int, int);

int main( )

{

        int a = 10, b =4;

        ex(a, b);

        printf("a = %d, b = %d\n", a, b);

        return 0;

}

void ex(int x, int y)

{

        x++;

        ++y;

        printf("x = %d, y = %d\n", x, y);

}

=======(答案1)=======

10

=========或=========

a=10

=======(答案2)=======

4

=========或=========

b=4

=======(答案3)=======

11

=========或=========

x=11

=======(答案4)=======

5

=========或=========

y=5

第2题 (4.0分)        题号:1885        难度:较易        第22章

以下程序输出结果是【1】。

#include "stdio.h"

union pw

{

        int i;

        char ch[2];

}a;

main()

{

        a.ch[0]=68;

        a.ch[1]=0;

        printf("%d\n",a.i);

}

=======(答案1)=======

68

第3题 (4.0分)        题号:1891        难度:中        第22章

以下程序输出结果是【1】。

# include <stdio.h>

int  age(int n)

{

        int c;

        if (n==1)

                c = 8;

        else

                c = age(n-1)+2;

        return c;

}

int main()

{

        printf("%d\n", age(6));

        return 0;

}

=======(答案1)=======

18

第4题 (4.0分)        题号:1893        难度:较难        第22章

以下程序输出结果是【1】。

#include <stdio.h>

int a=3,b=5;

int main()

{        int f(int);           

        int a=2,i;

        for(i=0;i<3;i++)

                printf("%d ",f(a));

        return 0;

}

int f(int a)

{         auto  int b=0;

           static int c=3;

        b=b+1;

           c=c+1;

        return(a+b+c);

}

=======(答案1)=======

7 8 9

第5题 (4.0分)        题号:1461        难度:难        第22章

程序运行时若依次输入2,3,40,则输出结果是【1】.

main()

{int *p1,*p2,*p3;

int i,j,k,t;

scanf("%d%d%d",&i,&j,&k);

p1=&i;

p2=&j;

p3=&k;

if(*p1<*p2){t=*p1;*p1=*p2;*p2=t;}

if(*p1<*p3){t=*p1;*p1=*p3;*p3=t;}

if(*p2<*p3){t=*p2;*p2=*p3;*p3=t;}

printf("%d\n",*p1);

}

=======(答案1)=======

40

二、程序填空   共3题 (共计20分)

第1题 (5.0分)        题号:384        难度:中        第9章

/*-------------------------------------------------------

【程序填空】

---------------------------------------------------------

题目:程序通过定义学生结构体变量,存储学生的学号、姓名和3门课的成绩。函数fun的

      功能是:将形参a所指结构体变量中的数据赋给函数中的结构体变量b,并修改b中

      的学号和姓名,最后输出修改后的数据。

例如:a所指变量中的学号、姓名和三门课的成绩依次是:10001、"ZhangSan"、95、80、88,

      则修改后输出b中的数据应为:10002、"LiSi"、95、80、88。

-------------------------------------------------------*/

#include  <stdio.h>

#include  <string.h>

struct student

{

        long  sno;

        char  name[10];

        float  score[3];

};

void fun(struct  student  a)

{

        struct student  b;   

        int  i;

/***********SPACE***********/

        b = 【?】;

        b.sno = 10002;

/***********SPACE***********/

        strcpy(【?】, "LiSi");

        printf("\nThe data after modified :\n");

        printf("\nNo: %ld  Name: %s\nScores:  ",b.sno, b.name);

        for (i=0; i<3; i++)

/***********SPACE***********/

                printf("%6.2f ",  b.【?】);

        printf("\n");

}

main()

{

        struct student  s={10001,"ZhangSan", 95, 80, 88};

        int  i;

        printf("\n\nThe original data :\n");

        printf("\nNo: %ld  Name: %s\nScores:  ",s.sno, s.name);

        for (i=0; i<3; i++)

                printf("%6.2f ",  s.score[i]);

        printf("\n");

        fun(s);

}

答案:

=======(答案1)=======

a

=======(答案2)=======

b.name

=======(答案3)=======

score[i]

第2题 (10.0分)        题号:417        难度:中        第10章

/*-------------------------------------------------------

【程序填空】

---------------------------------------------------------

题目:以下mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回.

-------------------------------------------------------*/

#include <stdio.h>

int mystrlen( char *str)

{

    int i;

/***********SPACE***********/

    for(i=0;【?】!='\0';i++) ;

/***********SPACE***********/

   return(【?】);

}

void main( )

{

        char *str="abcdefg";

        printf("%d\n",mystrlen(str));

}

答案:

=======(答案1)=======

*(str+i)

=========或=========

str[i]

=======(答案2)=======

i

第3题 (5.0分)        题号:446        难度:中        第11章

/*-------------------------------------------------------

【程序填空】

---------------------------------------------------------

题目:下列给定程序中,函数fun的功能是:将自然数1~10及其平方根写到名

       为myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。

-------------------------------------------------------*/

#include    <math.h>

#include    <stdio.h>

int fun(char  *fname )

{

        FILE  *fr;    

        int  i,n;    

        float  x;

        if((fr=fopen(fname, "w"))==NULL)  

                return  0;

        for(i=1;i<=10;i++)

/***********SPACE***********/

                fprintf(【?】,"%d %f\n",i,sqrt((double)i));

        printf("\nSucceed!!\n");

/***********SPACE***********/

        【?】;

        printf("\nThe data in file :\n");

/***********SPACE***********/

        if((fr=fopen(【?】,"r"))==NULL)

                return  0;

        fscanf(fr,"%d%f",&n,&x);

        while(!feof(fr))

        {  

                printf("%d %f\n",n,x);  

                fscanf(fr,"%d%f",&n,&x);

        }

        fclose(fr);

        return  1;

}

main()

{

        char  fname[]="myfile3.txt";

        fun(fname);

}

答案:

=======(答案1)=======

fr

=======(答案2)=======

fclose(fr)

=======(答案3)=======

fname

三、程序改错   共3题 (共计20分)

第1题 (5.0分)        题号:240        难度:中        第8章

/*-------------------------------------------------------

【程序改错】

---------------------------------------------------------

题目:下列给定程序中函数fun的功能是:求两个非零正整数的最大

公约数,并作为函数值返回。

例如:若num1和num2分别为49和21,则输出的最大公约数为7;

      若num1和num2分别为27和81,则输出的最大公约数为27。

-------------------------------------------------------*/

#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);

}

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);

}

答案:

=======(答案1)=======

t=a;a=b;b=t;

=======(答案2)=======

return(b);

=========或=========

return b;

第2题 (10.0分)        题号:255        难度:中        第10章

/*-------------------------------------------------------

【程序改错】

---------------------------------------------------------

题目:下列给定程序中函数fun的功能是:删除s所指字符中所有的小写字母c 。

-------------------------------------------------------*/

#include <stdio.h>

void  fun( char  *s )

{   

        int  i,j;

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

                if(s[i]!='c')

        /***********FOUND***********/

                        s[j]=s[i];

/***********FOUND***********/

                s[i]=0;

}

main()

{

        char  s[80];

        printf("Enter a string:       ");

        gets(s);

        printf("The original string:  ");

        puts(s);

        fun(s);

        printf("The string after deleted :  ");

        puts(s);printf("\n\n");

}

答案:

=======(答案1)=======

s[j++]=s[i];

=========或=========

{s[j]=s[i];j++;}

=======(答案2)=======

s[j]= '\0';

=========或=========

s[j]= 0;

第3题 (5.0分)        题号:207        难度:难        第10章

/*------------------------------------------------------        

【程序改错】

--------------------------------------------------------

功能:为一维数组输入10个整数;将其中最小的数与第一个数

      对换,将最大的数与最后一个数对换,输出数组元素。

------------------------------------------------------*/

#include <stdio.h>

main()

{

  int a[10];

  void input();

  void output();

  void max_min();

  input(a,10);

  max_min(a,10);

  output(a,10);

}

void input(int *arr,int n)

{

  int *p,i;

  p=arr;

  printf("please enter 10 integers:\n");

  for(i=0;i<n;i++)

  /**********FOUND**********/

  scanf("%d",p);

}

void max_min(int *arr,int n)

{

  int *min,*max,*p,t;

  min=max=arr;

  for(p=arr+1;p<arr+n;p++)

    /**********FOUND**********/

    if(*p<*max)

       max=p;

    else if(*p<*min) min=p;

      t=*arr;*arr=*min;*min=t;

/**********FOUND**********/

  if(max=arr) max=min;

  t=*(arr+n-1);

  *(arr+n-1)=*max;

  *max=t;

}

void output(int *arr,int n)

{

  int *p,i;

  p=arr;

  printf("The changed array is:\n");

  /**********FOUND**********/

  while(i=0;i<n;i++)

    printf("%3d",*p++);

  printf("\n");

}

答案:

=======(答案1)=======

scanf("%d",p ++);

=========或=========

scanf("%d",arr[i]);

=========或=========

scanf("%d",p+i);

=========或=========

scanf("%d",arr+i);

=======(答案2)=======

if(*p>*max)

=========或=========

if(*max<*p)

=======(答案3)=======

if( max == arr )

=======(答案4)=======

for(i=0;i<n;i++)

=========或=========

for(i=0;n>i;i++)

=========或=========

for(p=arr;p<arr+n;)

=========或=========

for(i=0;i<=n-1;i++)

=========或=========

for(i=0;n-1>=i;i++)

=========或=========

for(p=arr;p<=arr+n-1;)

=========或=========

for(p=arr;arr+n-1>=p;)

四、程序设计   共4题 (共计40分)

第1题 (10.0分)        题号:528        难度:易        第3章

/*-------------------------------------------------------

【程序设计】

---------------------------------------------------------

题目:请编fun函数写程序,从键盘输入百分制成绩,要求输出

      等级制成绩A、B、C、D。90~100分为A,80~89分为B,

      60~79分为C,1~59分为D。不考虑小数,输入为整数,

      输出为字符。

-------------------------------------------------------*/

#include <stdio.h>

void wwjt();

char fun (int n)

{

  

    /**********Program**********/

  

    /**********  End  **********/

}

void main()

{

    int score,n;

    char p;

    scanf("%d",&score);

    n=score/10;

    p=fun(n);

    printf("%c" , p);

    wwjt();

}

void wwjt()

{

    FILE *IN,*OUT;

    int iIN,i;

    char cOUT;

    IN=fopen("in.dat","r");

    if(IN==NULL)

    {

        printf("Please Verify The Currernt Dir..it May Be Changed");

    }

    OUT=fopen("out.dat","w");

    if(OUT==NULL)

    {

        printf("Please Verify The Current Dir.. it May Be Changed");

    }

    for(i=0;i<5;i++)

    {  

        fscanf(IN,"%d",&iIN);

        cOUT=fun(iIN);

        fprintf(OUT,"%c\n",cOUT);

    }

    fclose(IN);

    fclose(OUT);

}

答案:    char s;

    switch(n)

    {

        case 10:

        case 9:s='A';break;

        case 8:s='B';break;

        case 7:

        case 6:s='C';break;

        default:s='D';

    }

    return s;

第2题 (10.0分)        题号:470        难度:中        第3章

/*------------------------------------------------

【程序设计】

--------------------------------------------------

功能:用函数实现字符串的复制, 不允许用strcpy()函数。

------------------------------------------------*/

#include <stdio.h>

void  wwjt();

void copy(char str1[],char str2[])

{

  /**********Program**********/

  

  

  

  

  

  

  /**********  End  **********/

}

main()

{

  void copy();

  char c1[40],c2[40];

  gets(c1);

  copy(c1,c2);

  puts(c2);

  wwjt();

}

void wwjt()

{

  FILE *IN,*OUT;

  char i[100];

  char o[100];

  IN=fopen("in.dat","r");

  if(IN==NULL)

  {

    printf("Read FILE Error");

  }

  OUT=fopen("out.dat","w");

  if(OUT==NULL)

  {

    printf("Write FILE Error");

  }

  fscanf(IN,"%s",i);

  copy(i,o);

  fprintf(OUT,"%s\n",o);

  fclose(IN);

  fclose(OUT);

}

答案:----------------------

int i;

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

       str2[i]=str1[i];

    str2[i]='\0';

----------------------

第3题 (10.0分)        题号:287        难度:较难        第3章

/*-------------------------------------------------------

【程序设计】

---------------------------------------------------------

题目:某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在

      主函数中给出,请编写函数fun,其功能是:求出该学生的平均分,并放入记

      录的ave成员中。

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

注意:请勿改动主函数main和其它函数中的任何内容,仅在函数fun部位中填入你编写

      的若干语句。

-------------------------------------------------------*/

#include <stdio.h>

#define   N   8

void wwjt (  );

typedef  struct

{  

        char  num[10];

        double  s[N];

        double  ave;

} STREC;

void  fun(STREC *a)

{

        /**********Program**********/

        /**********  End  **********/

}

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);

        wwjt();

}

void wwjt()

{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */

        FILE *out ;

        int i ; STREC s[10] = {

        {"GA005",85.5,76,69.5,85,91,72,64.5,87.5},

        {"GA001",82.5,66,76.5,76,89,76,46.5,78.5},

        {"GA002",72.5,56,66.5,66,79,68,46.5,58.5},

        {"GA003",92.5,76,86.5,86,99,86,56.5,88.5},

        {"GA004",82,66.5,46.5,56,76,75,76.5,63.5},

        {"GA006",75.5,74,71.5,85,81,79,64.5,71.5},

        {"GA007",92.5,61,72.5,84,79,75,66.5,72.5},

        {"GA008",72.5,86,73.5,80,69,63,76.5,53.5},

        {"GA009",66.5,71,74.5,70,61,82,86.5,58.5},

        {"GA010",76,66.5,75.5,60,76,71,96.5,93.5},

        };

        out = fopen("out.dat","w") ;

        for(i = 0 ; i < 10 ; i++)

        {

                fun(&s[i]) ;

                fprintf(out, "%7.3f\n", s[i].ave) ;

        }

        fclose(out) ;

}

答案: double ave=0.0;

int i;

for(i=0;i<N;i++)

a->ave=a->ave+a->s[i];

a->ave/=N;

第4题 (10.0分)        题号:302        难度:难        第3章

/*------------------------------------------------

【程序设计】

--------------------------------------------------

功能:输入2个学生3门课的成绩,计算学生成绩平均分,

      课程平均分和最高分.

例如:输入2名学生3门课的成绩分别为92,87,68,56,

      92,84 则

      学生1平均分:82.33

      学生2平均分:77.33

      课程1平均分:74.00

      课程2平均分:89.50

      课程3平均分:76.00

      最高分为:92

------------------------------------------------*/

#include <stdio.h>

void wwjt();

/*定义全局变量*/

/*学生成绩平均分*/

float StuAgv[2];

/*课程平均分*/

float CouAgv[3];

/*所有学生的所有课程最高分*/

float Max=0;

/*说明:需要在下面函数中把题干要求中的结果赋值到上面定义一变量中*/

void fun(float score[2][3])

{

  

  /**********Program**********/

  /**********  End  **********/

  

}

void main()

{

        int i,j;

        float score[2][3];

    

        printf("输入学生的成绩:");

    for(i=0;i<2;i++)

      for(j=0;j<3;j++)

         scanf("%f",&score[i][j]);

    printf("\n输出学生的成绩:");

    for(i=0;i<2;i++)

        {  

           for(j=0;j<3;j++)

             printf("%.2f  ",score[i][j]);

       printf("\n");

        }

   

    fun (score);

    for(i=0;i<2;i++)

       printf("第%d个学生的平均成绩是:%0.2f\n",i+1,StuAgv[i]);

    for(j=0;j<3;j++)

       printf("第%d门课的平均成绩是:%0.2f\n",j+1,CouAgv[j]);

        

        printf("所有分数中的最高分为:%.2f\n",Max);

        wwjt();

}

void wwjt()

{

  FILE *IN,*OUT;

  float iIN[2][3];

  int i,j;

  IN=fopen("in.dat","r");

  if(IN==NULL)

  {

    printf("Please Verify The Currernt Dir..it May Be Changed");

  }

  OUT=fopen("out.dat","w");

  if(OUT==NULL)

  {

    printf("Please Verify The Current Dir.. it May Be Changed");

  }

  for(i=0;i<2;i++)

    for(j=0;j<3;j++)

      fscanf(IN,"%f",&iIN[i][j]);

  fun(iIN);

  for(i=0;i<2;i++)

    fprintf(OUT,"%.2f\n",StuAgv[i]);

  for(j=0;j<3;j++)

    fprintf(OUT,"%.2f\n",CouAgv[j]);

  fprintf(OUT,"%.2f\n",Max);

        fclose(IN);

  fclose(OUT);

  return ;

}

答案: int i,j;

float sum;

    for(i=0;i<2;i++)            /*计算第i个学生平均分*/

{

  sum=0;

      for(j=0;j<3;j++)

        sum=sum+score[i][j];

      StuAgv[i]=sum/3;

 }

     for(j=0;j<3;j++)            /*计算第j门课的平均分*/

 {

   sum=0;

       for(i=0;i<2;i++)

         sum=sum+ score [i][j];

       CouAgv[j]=sum/2;

 }

      Max=score[0][0];

      for(i=0;i<2;i++)

        for(j=0;j<3;j++)

          if(Max<=score[i][j])

  {

Max=score[i][j];

   }

  return ;