2005年春二级C考试试卷
试题一、判断题(每小题1分,共10分)
说明:在以下提供的若干个陈述中,逐一判断其正确与否,选A表示正确,选B表示错误。
(1)
在C语言中,常量和变量都有数据类型。
(2)
C语言的运算符只有单目运算符和双目运算符两种。
(3)
若变量己正确定义,表达式x+y=z符合C语言语法。
(4)
C编译器可以找出C源程序中所有的语法错误和逻辑错误。
(5)
表达式3*5/2和表达式3/2*等价。
(6)
表达式m=n++的求解顺序是先计算m=n,再计算n=n+1。
(7)
变量名fahr和Fahr代表两个不同的变量。
(8)
若表达式sizeof(unsigned)的值为2,则unsigned类型数据能表示的最大整数为 216-1。
(9)
break语句只能用于循环结构中。
(10)
while语句先判断循环条件,所以循环体有可能一次也不执行。
试题二、单选题(每小题2分,共20分)
(11)执行scanf(“%d%lf%d”,&money,&rate,&year), 输入(11)后,money=1000,
year=3, rate=0.025.
A、1000
3 0.025
B、1000 0.025 3
C、1000,3,0.025
C、1000,0.025,3
(12)判断变量ch是英文字母的表达式为(12)。
A、('a'<=ch<='z')||('A'<=ch<='z')
B、(ch>='a' &&
ch<='z')&&(ch>='A' && ch<='Z')
C、(ch>='a' && ch<='z')|| (ch>='A'
&& ch<='Z')
D、('A'<=ch<='z')&&('A'<=ch<='z')
(13)while((13))等价于while(!x)。
A、x==1 B、x==0
C、x!=0 D、x!=1
(14)以下程序段输出字符串str, 其中循环条件str[i]!= 0 还可以写成(14)。
char str[80];
for(i=0;str[i]!='\0' i++)
putchar(str[i]);
A、str[i]!=NULL B、i< 80
C、!(str[i]= '\0' D、i<=80
(15)设变量定义为:int n,*p;char ch,*q,*g;,则语句(15)是不正确的。
A、p=&n;g=q=&ch; B、p=&n;q=&ch;
C、p=&n;g=&ch D、p=&n;q=&ch;g=p;
(16)设变量定义如下,则对其中的结构分量num正确的引用是(16)。
struct student{
int num;
Char name[20];
float scire;
}stud[10];
A、stud[1].num = 10; B、student.stud.num
= 10;
C、struct.stud.num = 10; D、struct student.num = 10;
(17)对于以下递归函数f,调用函数f(2, 1 2 3)的输出结果是(17)。
void f(int n,char a,char b,char c)
{
if(n==1)
printf("%c->%c#",a,b);
else
{ f(n-1,a,c,b);
printf("%c->%c#",a,b);
f(n-1,c,b,a);
}
}
A、1->2#1->3#3->2#
B、3->2#1->2#1->3#
C、'1'->'3'#'3'->'2'#'1'->'2'# C、1->3#1->2#3->2#
(18)下列程序段的输出结果是(18)。
int t,a[3] = {10,5,1};
int *p;
for(p =a;
p<a+3; p++)
t =t + *p;
printf(“%d”
,t);
A、15
B、16
C、10
D、不确定
(19)设变量定义为: int *p[3],a[3];,(19)是正确的赋值。
A、p =&a[9]
B、*p = **a
C、p[0] = a
D、**p = a
(20)对于以下的变量定义,语句(20)在语法和语义上都是正确的。
struct node{
float x,y;
char s[10];
}point = {1,2, “abc”},*p;
A、*p = point;
B、p = point;
C、point = p;
D、p->x = point.y;
试题三、程序填空题(每空2分,共20分)
说明:阅读下列程序说明和相应程序,在每小题提供的若干可选答案中,挑选一个正确答案。
1.程序1、
[程序说明]
根据下式计算s 的值,要求精确到最后一项的绝对值小于106 。
s = 1-1/3+1/5-1/7+…….
[程序]
#include
<stdio.h>
#include
<math.h>
void
main()
{ int flag = 1, t = 1;
(21)
while( (22) ){
item
= flag * 1.0 / t ;
s =
s + item ;
(23) ;
t =t+2;
}
printf ( “s = %f\n” ,s);
}
(21) A、double item = 2 , s = 0; B、double
item = 0 , s = 0;
C、double item = 1 , s = 1;
D、double item = 3 , s = 1;
(22) A、item<1E-6
B、item>=1e-6;
C、fabs(item)<1E-6
D、fabs(item)>=1E-6
(23) A、flag
= -1 B、s
= -s
C、flag = -flag;
D、t = -t
2、程序2
[程序说明]
验证哥哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,…,18=7+11。将6——100之间的每个偶数都表示成两个素数之和。函数prime(m)用于判断m是否为素数。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。
[程序]
#include "stdio.h"
#include "math.h"
void main()
{ int i, k;
int
prime(int m);
for
(i=6;i<=100;i=i+2)
for(k=3;k=<50;k++)
if ( 24 ){
printf ("%d = %d+%d\n", i, k, i-k);
break;
}
}
int prime(int m)
{ int k, n;
if(m = = 1) return 0;
n = (int)sqrt (m);
for (k = 2; k <= n ;k++)
(25) ;
(26) ;
}
(24) A、prime(i)
B、prime(i) && prime(k)
C、prime(k) && prime(i-k) D、prime(k)
(25) A、if
(m%k!=0) return 0
B、if(m%k==0) return 0
C、if(m%k==0) return 1
D、if(m%k !=0) return 1
(26) A、return
0 ;
B、return 1;
C、else return 0;
D、else return 1;
程序3
[程序说明]
输入一个字符串(少于80个字符),滤去所有的非八进制字符后,组成一个新符串(八
进制形式),然后将其转化为十进制整数后输入。函数stoi(str)将八进制形式的字符串str
转换为十进制整数,例如,stoi(“12”)的值为10(八进制12对应十进制10)。
[程序]
#include<stdio.h>
void main()
{ int i,k;
char s[10];
int stoi(char *str);
gets(s);
for( i=k=0;s[i]!=’\0’;i++)
if(s[i]<=’7’&&s[i]>=’0’)
(27)
(28)
printf(“digit=%d\n”, (29) )
}
int stoi(char*str)
{ int i,n=0;
for(i=0;str[i]!=’\0’;i++)
(30)
return n;
}
(27)A、s[I]=s[k];i++
B、s[k]=s[i]
C、s[k]=s[i],k++
D、s[i]=s[k]
(28)A、s[i]! =‘\0’
B、s[k]! = ’\0’
C、s[i] =‘\0’
D、s[k] = ’\0’
(29) A、stoi(s)
B、s
C、stoi(s[i])
D、n
(30) A、n = n * 8 + (str[i]–‘0’) B、n
= n * 10 + (str[i]–‘0’)
C、n = n * 8 + str[i]
D、n = n * 10 + str[i]
试题四、程序阅读题(每小题5分,共20分)
说明:阅读下列程序,将运行时的输出结果写在答卷纸的相应题号下。
1. 程序1
#include <stdio.h>
void main ()
{ int x =
10023
do {
printf (“%d#”, x%10);
x = x / 10;
}while (x!= 0);
}
2. 程序2
#inclde
<stdio.h>
void main ()
{
int i,x=1, y=1;
for(i=1;i<=5; i++)
{ x = x + y;
y++;
printf (“%d#”,x);
}
}
3. 程序3
#include <stdio.h>
void main()
{int i,x =
1 , y = 1 ;
void f
(int m, int n, int * px, int *py);
f(2004,
70, &x, &y),
printf
("%d # %d#", x, y);
f(2005,
98, &x, &y);
printf
("%d#%d#", x, y);
}
void f
(int m, int n, int *px, int *py)
{ int k,
flag;
int tab [2][13] = {
{0, 31, 28, 31, 30, 31, 30,
31, 31,30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30,
31, 31,30, 31, 30, 31}
};
flag=m%4==0 && m%100!=0||m%400==0;
for ( k =
1; n > tab[flag][k]; k++)
n = n -
tab[flag][k];
*px =k;
*py = n;
}
4. 程序4
/* 假设读写文件的操作能正常完成 */
#include <stdio.h>
#include <stdio.h>
void main()
{ char ch,
*s = "ACEDB";
int
x;
FILE
*in;
if
((in = fopen("file.txt","w" ))!=NULL)
while(*s!='\0')
fputc(*s++, in);
fclose(in);
if
((in=fopen("file.txt","r"))!=NULL)
while((ch=fgetc(in))!=EOF)
{ switch(ch)
{ case 'A': x = 95; break;
case
'B': x = 85; break;
case 'C': x = 75; break;
case
'D': x = 60; break;
default:
x = 0; break;
}
printf ("%d#", x );
}
fclose (in);
getch();
}
试题五、程序设计题(每小题各10分,共30分)
1.输入法x ,计算并输出下列分段函数 f(x) 的值。可以调用数学库函数:平方根函数sqrt(),绝对值函数fabs()
和幂函数 pow()。

2.输出一张摄氏一华氏温度转换表,摄氏温度的取值区间是[-1000
C,1500C ],温度间隔50C。要求定义和调用函数 ctof(c),将摄氏温度C转换成华氏温度F,计算公式:
F = 32 + C* 9/5。
3.输入一个正整数不胜n (1≤ n ≤6),再输入一个n 行n列的矩阵,找出该矩阵中绝对值最大的元素以及它的行下标和列下标。