视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
武汉大学2012-2013年上学期3学分《C语言程序设计》期末试卷
2025-10-05 03:46:59 责编:小OO
文档
一、选择题(每小题2分,共34分) 

1. 以下不合法的用户标识符是__C____。 

A、j2_KEY          B、Double 

C、4d              D、_8_ 

    复习要点: 

     标识符的定义: 首字符必须是字母或下划线;后续字符可以是字母、数字或下画线。 C、4d 中用了‘4’做首字符,所以不合法 

2.以下叙述中正确的是__A____。 

A、C程序中注释部分可以出现在程序中任意合适的地方 

B、花括号“{”和“}”只能作为函数体的定界符 

C、构成C程序的基本单位是函数,所有函数名都可以由用户命名(库函数) 

D、分号是C语言之间的分隔符,不是语句的一部分 

    复习要点: 

A、C程序中注释部分可以出现在程序中任意合适的地方。对, 注释由/*  */包含 

 B、花括号“{”和“}”只能作为函数体的定界符,不对。还可以用做复合语句的定界符,也可以做结构体的定界符 

 C、构成C程序的基本单位是函数,所有函数名都可以由用户命名(库函数),不对。库函数声明和主函数声明已经给定,只可以调用 

D、分号是C语言之间的分隔符,不是语句的一部分,不对。分号是语句的结束,是语句的组成部分 

3.设int a=12,则执行完语句a+=a-=a*a后,a的值是__D____。 

A、0                B、2    

C、144              D、-2 

原因: 赋值运算赋”=”和符合赋值运算赋都是右结合性,所以,先执行a=12然后执行a-=a*a,即a=a-a*a,  a的值为-132。最后执行a+=a,即a=a+a. 

4.假定x和y为double型,表达式x=2,y=x+3/2的值是__D____。 

A、3.500000       B、3  

C、2.000000       D、3.000000 

复习要点: 各种类型数据运算后的数据类型 

   在算术运算时,数据运算时的类型按照数据类型自动转换的原则进行。 

就这道体来说,3/2是整数和整数相除,计算结果还是整数,且没有4舍5入的概念。 所以3/2的结果为1。则x+1是double类型和 int类型的和,结果的类型应该为double类型。 即2.0+1的最后结果3.000000 

5.语句:printf("%d",(a=2)&&(b=-2));的输出结果是___B___。 

A、2              B、1  

C、-4             D、-2 

复习要点:逻辑运算符” &&”是”与”运算,即只有两个操作数为真,结果才为真。在判断两个操作a和b数的值时,都是非0,即a和b为真。运算结果为真用1表示,故B 对, 

6.若变量c为char类型,能正确判断出c为小写字母的表达式是___D___。 

A、´a´<=c<=´z´ 

B、(c>=´a´)||(c<=´z´) 

C、(´a´<=c)and(´z´>=c)

D、(c>=´a´)&&(c<=´z´) 

  原因:  A)错,不可能用两个运算符“<=”或两个运算符“>=”表达一个数值的范围,学生常常犯这个错误 

          B)错,逻辑运算符”||”是”或”运算,即只要有一个操作数为真,结果为真,这里显然要两个操作数都为真,所以不可以用 

          C)错,and 不是一个C语言运算符 

复习要点:逻辑运算符” &&”是”与”运算,即只有两个操作数为真,结果才为真。 

7.在嵌套使用if语句时,C语言规定else总是___C___。 

A、和之前与其具有相同缩进位置的if配对 

B、和之前与其最近的if配对 

C、和之前与其最近的且不带else的if配对 

D、和之前的第一个if配对 

这道题出得不太好,正确回答应该是:在语法允许的情况下,和之前与其最近的且不带else的if配对。 

   例如: if(a) 

                 { if(b} a=1; } 

              else 

                  b=2; 

     这里else 只能和if(a)   配对。  

    不可以和if(b},因为在语法上, { if(b} a=1; }是一条复合语句,语法上不可能和复合语句外的语句 配对 

8.以下循环体的执行次数是__C____。 

main() 

int i,j; 

for (i=0,j=1; i<=j+1;i+=2,j--)

printf("%d \\ni); 

A、3               B、2  

C、1               D、0 

原因:循环控制表达式 i<=j+1为假时,循环结束 

第一次判断 :i=0, j=1:i<=j+1为真。执行1次 

第二次判断 :i=2, j=0:i<=j+1为假,退出 

9.int a[2][3]={{1},{2,3}};,则a[0][1]的值是_D_____。 

    A.1  B. 2 

C. 3   D. 0 

复习要点:数组的初始化,给部分数组元素赋值时,没有赋值的数组元素的值为0 

10. 以下对二维数组a的正确说明是__B____。 

    A. int a[5][]; B. float a[5][4]; 

C. double a[][4];           D. float a(5)(4); 

复习要点:数组的定义: 元素个数国定,类型相同的元素集合。 

    即数组定义时,下标运算符[]中必须时整型常量表达式。 

所以:A和B 显然错,下标运算符[]中无值且没有初始化 

D. 错,下标运算符不可以用() 

11.有以下程序 

main() 

    int i,t[][3]={9,8,7,6,5,4,3,2,1}; 

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

      printf("%d",t[2-i][i]); 

判序执行后的输出结果是___B___。 

A、753                        B、357    

C、369                        D、751 

原因:循环变量 i=0 ,1, 2 

第一次i=0 :输出 t[2][0]      3 

第二次i=1 :输出 t[1][1]      5 

第三次i=2 :输出 t[0][2]      7 

12.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是__D____。 

A、函数调用可以作为的语句存在 

B、函数调用可以作为一个函数的实参 

C、函数调用可以出现在表达式中 

D、函数调用可以作为一个函数的形参 

复习要点:函数调用的用法,前三个都是正确的。而函数的形参只能用变量类型,数组类型,指针类型变量等等 

13.以下函数值的类型是__A____。 

fun(float x) 

    float y; 

    y=3*x-4; 

    return y; 

A、int                    B、不确定    

C、void                   D、float 

理由:函数定义时,如果不写函数的类型,默认为int 

14. 若有下列定义:int a[5],*p=a; 则对a数组元素地址的正确引用是__B____。 

A、&a                     B、p+2   

C、a++                    D、&a[5] 

原因:  A)错,数组名a表示数组的首地址,再用取地址运算符“&”,错 

        C)错,数组名a表示数组的首地址,是国定值,不可以运算 

        D)错,数组名a表示数组的首地址,是国定值,不可以运算 

        B)对,p+2  表示引用元素a[2] 

15.若有定义和语句: 

int   a[4][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, (*p)[3] = a, *q[4]; 

q[0]=a[0]; 

则不能够正确表示a数组元素的表达式是______。 

A、(*(p+1))[1]            B、a[4][3]    

C、q[0][1]                D、p[2][2] 

题目超范围 

16.已定义如下函数: int fun(int *p) {return *p;}, 该函数的返回值是__D____。 

A、不确定的值             B、形参p中存放的值 

C、形参p的地址值         D、形参p所指存储单元的值 

复习要点:指针运算符“*”,*p 表示取得指针变量p所指的变量的值,这是p中存储的是地址值 

  17.能正确表示a和b同时为正或同时为负的逻辑表达式是___D___。 

A、(a>=0‖b>=0)&&(a<0‖b<0)

B、(a>=0&&b>=0)&&(a<0&&b<0)

C、(a+b>0)&&(a+b<=0)

D、a*b>0

原因:A、错 (a>=0‖b>=0)表示a和b不一定同时为正。 (a<0‖b<0) 表示a和b 

二、填空题(每小题2分,共16分) 

1.表示条件:10  2. 若函数调用语句为f(a, b, f(a+b,a-b,b));,则函数f的参数个数是___3_________。 

      分别为a,   b和f(a+b,a-b,b)。第三个参数是一个函数调用 

3.若有以下整型的a数组:int a[10]={9,4,12,8,2,10,7,5,1,3};  

 则:a[a[9]]的值为______8______; a[a[4]+a[8]]的值为______8______。 

计算过程: 

      a[9]  的值 3 

      a[a[9]]即为 a[3]. 其值为8 

      a[4]+a[8]为 2+1  

      a[a[4]+a[8]]即为 a[3],其值为8 

4.若有以下程序段: 

   int a[5]={2,4,6,8,10}, *p, k, m; 

 p = &a[2];  

k = *(p--); 

m = *(p--); 

   则程序段执行完后k的值为_____6_______; m的值为_____4_______。 

计算过程: 

     p = &a[2];  p指向 a[2] 

   k = *(p--);   p—是后缀减。 先把a[2]的值6赋给k, 然后 p--,指向 a[1] 

    m = *(p--); 这时,先把a[1]的值4赋给m 

  5.下面程序的功能是输出以下形式的金字塔图案是: 

                        * 

                       *** 

                      ***** 

                     ******* 

 在下划线处填入的正确的表达式。 

main() 

{  int i,j; 

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

    { for(j=1;j<=4-i;j++)

printf(" "); 

      for(j=1;j<=___2*i-1_________;j++) printf("*"); 

      printf("\\n"); 

    } 

}   

  "*"的个数是随行变量i每次增加2,填 2*i-1 

6.以下程序的功能是计算:1+12+123+1234+12345。请填空。 

   Main() 

   {  int t= 0,s=0,I; 

      for (I=1;I<=5;I++)

      {  

 t=I +  ___t*10_________ ; 

 s=s+t; 

  } 

 printf(“s=%d\n”,s); 

   } 

     当前项t得值为已经得到前一项值乘10再加循环变量I值 , t=t*10+I   

7.下面的程序用指针变量输出数值,其中两条语句有语法错误,请在空格处填上正确语句。 

#include

void main() 

  int a[ ]={1,2,3,4,5,6,7,8,9,10},*p;    

  *p=a;                 /*语句错误*/      ____p=a________ 

  printf("%f\\n",*p+9);   /*语句错误*/     ____ printf("%d\\n",*p+9); ________ 

printf("%f\\n",*p+9);    改为 printf("%d\\n",*p+9);       格式符d 用于输出整数 

8.下面的程序采用辗转相除法与函数求两个整数的最大公约数,其中两条语句有语法或算法错误,请在空格处填上正确语句。 

#include

void main() 

{ int (int a, int b);     

  int a,b,abd; 

  printf("intput data a b:\\n"); 

  scanf("%d,%da,b);    /*语句错误*/     ___ scanf("%d,%d",&a,&b); _________ 

  abd=(a,b);   

  printf("abd=%d\\nabd); 

int (int x,int y)      

{ int t; 

  if(x  while(y!=0) 

  { t=x%y;x=y;x=t;}      /*语句错误*/      _____y=t_______ 

  return x; 

}三、程序分析题(每题5分,共25分)  

1.写出下面程序的运行结果。  

#include

{  

int a=10, b=20;  

a+=b;  

b=a-b;  

a-=b;  

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

}  

2. 写出下面程序的运行结果。  

#include

main()  

{   int i;  

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

    { if(i%2)  printf("*");  

      else  continue;  

      printf("#");  

    }  

    printf("$\\n");  

}  

3. 写出下面程序的运行结果。  

main( )  

{   int   a[3][3]={1,2,3,4,5,6,7,8,9};  

    int   x=0,y=0;  

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

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

          if(i==j)  x +=a[i][j];   

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

       for(j=2;j>=0;j--)

          if(i+j==2)  y +=a[i][j];                

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

}  

4. 写出下面程序的运行结果。  

#include

int a=100;  

fun()  

{  

  static int a =20;  

   a++;  

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

}  

void main()  

{  

  int i;  

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

  {  

  a++;  

     printf("%d,",a);  

     fun();  

  }  

}  

5. 写出下面程序的运行结果。  

main()  

{   

    int a[]={1,2,3,4,5,6,7,8,9,10},*p;  

    p=a; *(p+3)+=2;  

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

p+=3;  

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

}  

四、程序设计(共25分)  

1、编写函数fun(int m)求1000以内所有m的倍数之和,m为一个正整数;并编写main函数调用该函数。(12分)。  

2、编写一个输出20行以内的杨辉三角形函数,yanghui(int n), 其中n为需要输出杨晖三角形的行数,并编写main函数调用该函数。注:main函数首先输入需要输出杨辉三角形的行数,并判断所输入的行数是否小于20。(13分)。  

1  

1 1  

1 2 1  

1 3 3 1  

1 4  6 4 1  

……  下载本文

显示全文
专题