上海电机学院C语言

本试卷为上海电机学院C语言,题目包括:单项选择题,填空题,编程题。

覆盖的内容包括:理论题,基础知识,控制结构,循环结构,指针,数组/指针数组,字符串/字符串指针,函数/函数指针,结构体,程序题。

C语言

一、单项选择题 (共20题,每题2分,共计40分)

(  A  )
1、下列叙述中正确的是________。
A、只能在循环体内和switch语句体内使用break语句
B、continue语句的作用是结束整个循环的执行
C、在循环体内使用break语句或continue语句的作用相同
D、从多层循环嵌套中退出时,只能使用got0语句
(  D  )
2、以下程序段的输出结果是________。
int k,j,s;
for(k=2;k<6;k++,k++)
{
s=1;
for(j=k;j<6;j++) s+=j;
}
printf("%d\n",s);
A、1
B、9
C、11
D、10
(  B  )
3、设有以下说明语句
typedef struct
{
int n;
char ch[8];
}
per;
则下面叙述中正确的是________。
A、PER 是结构体变量名
B、PER是结构体类型名
C、typedef struct 是结构体类型
D、struct 是结构体类型名
(  C  )
4、以下函数按每行8个输出数组中的数据
void fun( int *w, int n)
{
int i;
for(i=0;i<n;i++)
{
________ printf("%d",w[i]);
}
printf("\n");
}
下列划线处应填入的语句是________。
A、if(i/8==0)printf(“\n”);
B、if(i/8==0)continue;
C、if(i%8==0)printf(“\n”);
D、if(i%8==0)continue;
(  B  )
5、有以下程序
#include <stdio.h>
struct ord
{
int x ,y;
}
dt[2]= {1,2,3,4 };
main()
{
struct ord *p=dt;
printf("%d,",++p->x);
printf("%d\n",++p->y);
}
程序的运行结果是________。
A、1,2
B、2,3
C、3,4
D、4,1
(  A  )
6、变量a中的数据用二进制表示的形式是01011101,变量b中的数据用二进制表示的形式是11110000。若要求将a的高4位取反,低4位不变,所要执行的运算是________。
A、a^b
B、a|b
C、a&b
D、a<<4
(  C  )
7、设有如下枚举类型定义: enum language
{
basic=3 , assembly , ada=100 , cobol , fortran
};
枚举量 fortran 的值为 。
A、4
B、7
C、102
D、103
(  A  )
8、以下程序输出的结果是 __________.
#include <stdio.h>
void main( )
{
int a[ ]={1,2,3,4,5},i,j,s=0;
for(i=0;i<5;i++) s=s*10+a[i];
printf("s=%d\n",s);
}
A、s=12345
B、s=1 2 3 4 5
C、s=54321
D、s=5 4 3 2 1
(  B  )
9、若有以下定义和语句:int a[10]={1,2,3,4,5,6,7,8,9,10 },*ia=a; 则不能正确表示a数组元素的表达式是 ______。
A、*ia
B、a[10]
C、*a
D、a[ia-a]
(  B  )
10、若有说明int a[3][4]; 则a数组元素的非法引用是________。
A、123
B、2.5
C、-12
D、1563
(  D  )
11、若有表达式(w)(--x):(++y),则其中与w等价的表达式是________。
A、w==1
B、w==0
C、w!=1
D、w!=0
(  C  )
12、若所用变量都已正确定义,则在以下选项中,非法的表达式是________。
A、a!=4||b==1
B、'a'%3
C、'a'=1/2
D、'a'+32
(  C  )
13、有以下函数
int fun(char *s) {
char *t=s;
while(*t++);
return(t-s)
}
该函数的功能是______。
A、比较两个字符串的大小
B、计算s所指字符串占用内存字节个数
C、计算s所指字符串的长度
D、将s所指字符串复制到字符串t中
(  A  )
14、以下叙述中正确的是______。
A、函数既可以直接调用自己,也可以间接调用自己
B、任何情况下都不能用函数名作为实参
C、函数的递归调用不需要额外开销,所以效率很高
D、简单递归不需要明确的结束递归的条件
(  B  )
15、设有以下程序段 int x=0,s=0;
while(!x!=0)s+=++x;
printf("%d",s);
则
A、运行程序段后输出0
B、运行程序段后输出1
C、程序段中的控制表达式是非法的
D、程序段执行无限次
(  B  )
16、若有定义:int *p[3];
,则以下叙述中正确的是______。
A、定义了一个类型为int的指针变量p,该变量具有三个指针
B、定义了一个指针数组p,该数组含有三个元素,每个元素都是类型为int的指针
C、定义了一个名为*p的整型数组,该数组含有三个int类型元素
D、定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
(  A  )
17、有以下程序:
main()
{
int k=5;
while(--k)printf(”%d”,k-=3);
printf(”n”);
}
执行后的输出结果是________。
A、1
B、2
C、4
D、死循环
(  B  )
18、c语言源程序名的后缀是________。
A、exe
B、c
C、obj
D、cp
(  A  )
19、下面不能正确进行字符串赋值操作的语句是________。
A、char s[5]={"ABCDE"};
B、char s[5]={'A','B','C','D','E'};
C、char *s;s="ABCDEF";
D、char *s; scanf("%s",s);
(  D  )
20、对于数学式x /2a,下面正确的c 语言表达式是________。
A、sqr(x)/2a
B、sqr(x)/2*a
C、sqrt(x)/(2*a)
D、sqrt(x)/2*a

二、填空题 (共10题,每题2分,共计20分)

1、有以下程序
#include <stdio.h>
main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int b[3]={0},i;
for(i=0;i<3;i++) b[i]=a[i][2]+a[2][i];
for(i=0;i<3;i++) printf("%d",b[i]);
printf("\n");
}
程序运行后的结果是________。
2、c语言中对文件读写之前必须先打开文件,文件的打开是通过调用________函数来实现。
3、在c语言中,逻辑运算符中的"&&"称为________。
4、若有定义:int a=3; 表达式a/2.0+'b'-'a'的值是【1】。
5、c语言中与指针有关的两个运算符是&与________。
6、若s 是int 型变量,则表达式s%2+(s+1)%2 的值为【】。
7、编译预处理包括( )、文件包含、条件编译等。
8、函数f 的形参a 为一个10×10 的二维数组, n 的值为5,以下程序段的运行结果为________。f(int a[][20], int n)
{
int i,j,k;
j=n/2+1;
a[1][j]=1;
i=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if(i<1&&j>n)
{
i=i+2;
j=j-1;
}
else
{
if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
}
main()
{
int a[20][20]={0},n,i,j;
scanf("%d",&n);
f(a,n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)printf("%3d",a[i][j]);
printf("\n");
}
}
9、请补充main()函数,该函数的功能是:把一个整数插入一个已经按从小到大排序的数组中。插入后,数组仍然有序。 例如,在数组bb[M]={10 20 30 40 50 60 70 80 85 95}
中插入75,结果为 bb[M]={10 20 30 40 50 60 70 75 80 85 95}
注意:部分源程序给出如下。 请勿改动main()函数和其他函数中的任何内容,仅在main()函数的横线上填入所编写的若干表达式或语句。 试题程序:
#define M 10
void main()
{
int i,j;
int n;
int bb[M+1]={10,20,30,40,50,60,70,80,85,95};
system("CLS");
printf("\nlnput n n");
scanf("%d",&n);
printf("\nn=%d",n);
printf("\n***original list***\n");
for(i=0;i<M;I++) printf("%4d",bb[i]);
for(i=0;i<M;I++)
{
if(n<=bb[i])
{
for(j==M; ________ ;j--) ________ ;
bb[j]=n;
________ ;
}
}
if(i==M) bb[i]=n: printf("\n****new list****\n");
for(i=0;i<M+1;I++) printf("%4d",bb[i]);
}
10、以下程序对输入的一个小写字母,将字母循环后移5个位置后输出。如‘a’变成‘f’,‘w’变成‘b’。请在 内填入正确的内容。
#include <stdio.h>
void main()
{
char c;
c=getchar();
if(c>=’a’&&c<=’u’) ;
else if(c>=’v’&&c<=’z’) ;
putchar(c);
}

三、编程题 (共3题,每题0分,共计40分)

1、编写程序:计算sum=1-1/3+1/5-1/7+…+1/19
2、编写程序:用getchar函数读入两个字符给c1、c2,然后分别用putchar函数和printf函数输出这两个字符。
#include<stdio.h>
void main()
{
char c1, c2;
printf("请输入两个字符给c1和c2:\n");
_________________________________
_________________________________
printf("用putchar函数输出结果为:\n") ;
_________________________________
_________________________________
printf("\n用printf函数输出结果为:\n") ;
_________________________________
}
3、题⽬描述
万⾥⼗佳歌⼿⽐赛终于开始了,评委席坐了N(N⼤于等于3,并且N⼩于80)个评委,他们商量了很久,终于找出⼀个公正合理的评分⽅法。每次歌⼿唱完后,每个评委⾃⼰打⼀个分,然后在N个评委的打分中,去掉⼀个最⾼分,⼀个最低分。然后再把剩下的评委的打分求平均值~ 。
但是问题是他们嫌每次拿计算器按实在太烦。作为⼀名计算机专业学⽣~你⽤个程序帮帮他们搞定吧。
输⼊
输⼊有多组数据。每组2⾏,第⼀⾏是⼀个N,代表有N个评委。然后第⼆⾏有N个数,每个数⽤空格隔开,代表每个评委的打分。
当输⼊的N为0的时候结束输⼊。
输出
对于每组输⼊,输⼊最终这个选⼿的得分(⼩数点后⾯保留2位有效数字)。
样例输⼊
3
74 36 34
7
16 97 27 26 74 96 88
样例输出
36.00
62.20