资源描述
C语言程序设计练习题
题型
单选题
程序填空
程序运行结果
程序改错
编程
总分
分值
2*20=40
2*10=20
2*5=10
3*5=15
6+9=15
100
考生注意:所有答案均要填写在答题卡上否则不得分数!
一、单项选择题
1、下列转义字符中,错误的是(C)。 转义字符可以用八进制表示 \ddd, 0<=d<8
A.′\n′ B.′\\′ C.′\108′ D.′\xbb′
2、以下选项中正确的实型常数是___D____。小于1的实数小数点前的0可以省略
A、12.f B、 3.1415 (后有空)
C、1,000 D、 .876
3、在C语言中,整型常量的书写形式不包括(A)。
A.二进制 B.八进制 C.十进制 D.十六进制
4、在C语言程序中,主函数的摆放位置(D )。
A.必须置于所有函数之首
B.必须置于所有函数之尾
C.不得置于所有函数之尾
D.任意
5、 以下选项中不合法的用户标识符是____A___。标识符只能是字母、下划线、数字
A、 abc.c B、 file
C、 Main D、 PRINTF
6、 C 语言中运算对象必须是整型的运算符是____A____。
A、 % B、 /
C、 ! D、 *
7、 以下叙述中正确的是____A_____。
A、 a 是实型变量,C 允许进行赋值 a = 10,但不可以这样说:实型变量中允许存放整型值
B、 在赋值表达式中,赋值号左边既可以是变量也可以是任意表达式
C、 执行表达式 a = b 后,在内存中 a 和 b 存储单元中的原有值都将被改变,a 的值已由原值改变为 b 的值,b 的值由原值变为0
D、 已有 a = 3, b = 5,当执行表达式 a = b, b = a 之后,使 a 中的值为5,b 中的值为3
8、以下叙述中正确的是____A______。
A、C 程序中各函数之间既允许直接递归调用,也允许间接递归调用
B、C 程序中各函数之间不允许直接递归调用,也不允许间接递归调用
C、C 程序中各函数之间允许直接递归调用,不允许间接递归调用
D、C 程序中各函数之间不允许直接递归调用,允许间接递归调用
9、 若 a、b、c、d 都是 int 型变量且初值为0,以下选项中不正确的赋值语句是____C______。
A、 a = b = c = 100; B、 d++;
C、 c + b=a+d; D、 d = (c = 22) - (b++);
10、设有如下定义:char *aa[2]={“abcd”,“ABCD”};则以下说法中正确的是( C )。
A aa数组成元素的值分别是“abcd”和ABCD“
B aa是指针变量,它指向含有两个数组元素的字符型一维数组
C aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
D aa数组的两个元素中各自存放了字符‘a’和‘A’的地址
11、 若变量已正确定义为 int 型,要给 a、b、c 输入数据,正确的输入语句是___D_______。
A、 read(a, b, c); B、 scanf("%d%d%d", a, b, c);
C、 scanf("%D%D%D", &a, &b, &c); D、 scanf("%d%d%d", &a, &b, &c);
12、 若有以下程序段:
int c1 = 1, c2 = 2, c3;
c3 = c1 / c2;
printf("%d\n", c3);
执行后的输出结果是____A______。
A、 0 B、 1/2
C、 0.5 D、 1
13、 为表示关系:x≥y≥z,应使用的 C 语言表达式是_____A_____。
A、 (x >= y) && (y >= z) B、 (x >= y) AND (y >= z)
C、 (x >= y >= z) D、 (x >= y) & (y >= z)
14、定义如下变量和数组: int i, x[3][3]={1,2,3,4,5,6,7,8,9};则下面语句
for(i=0;i<3;i++) printf(“%d”,x[i][2-i]); 的输出结果是( C )
A、1 5 9 B、 1 4 7
C、3 5 7 D、 3 6 9
15、 设有定义:char str[] = "ABCD", *p = str; 则语句 printf("%d\n", *(p + 4)); 的输出结果是____B______。
A、 68 B、 0 (“ABCD”后面自动加上一个字符’\0’,ASCII值为0)
C、 字符 D 的地址 D、 不确定的值
16.字符数组初始化错误的是(D )。
A. static char word [ ]=″Turbo″;
B. static char word [ ]={″Turbo″};
C. static char word [ ]={′T′,′u′,′r′,′b′,′o′,′\0′};
D. static char word [ ]=′Turbo\0′;
17、 有以下定义:
struct person
{ char name[9];
int age;};
struct person class[10] = {"John", 17, "Paul", 19, "Mary", 18, "Adam", 16};
则下面能输出字母 M 的语句是____D______。
A、 printf("%c\n", class[3].name); B、 printf("%c\n", class[3].name[1]);
C、 printf("%c\n", class[2].name[1]); D、 printf("%c\n", class[2].name[0]);
18、 C 语言中,字符(char)型数据在微机内存中的存储形式是____D______。
A、 反码 B、 补码
C、 DBCDIC 码 D、 ASCII 码
19、 C 语言中,下列不合法的字符常量是___D_____。
A、 '\xff' B、 '\65'
C、 '&' D、 '\028'
20、 已定义了以下函数
fff(float x)
{ printf("%d\n", x * x);}
该函数的类型是___C_____。 函数没有声明类型为int型
A、 与参数 x 的类型相同 B、 void 类型
C、 int 类型 D、 无法确定
21、有以下程序:
#include <stdio.h>
#define N 2 定义N=2
#define M N + 1 M=2+1=3
#define NUM (M + 1) * M /2 NUM=(3+1)*3/2=6
void main() 用#define也可定义函数
{ int i;
for (i = 1; i < NUM; i++);
printf("%d\n", i);}
程序运行后的结果是____B______。
A、 5 B、 6
C、 8 D、 9
22、 若有定义:int x, *pb; 则正确的赋值表达式是___A_____。
A、 pb = &x B、 pb = x
C、 *pb = &x D、 *pb = *x
23、若已定义:int a[9], *p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式为( C )。
A、p+1 B、 a+1 C、 a++ D、 ++p a是固定的,不能做a++运算
24、设A为存放(短)整型的一维数组,如果A的首地址为P,那么A中第i 个元素的地址为( B )。
A、P+i*2 B、P+(i-1)*2 C、P+(i-1) D、P+i
25、 若有以下程序:
void main()
{ int k = 2, m = 4, n =6, *pk = &k, *pm = &m, *p;
*(p = &n) = *pk * (*pm);
printf("%d\n", n);}
程序的输出结果是_____C_____。
A、 4 B、 6
C、 8 D、 10
27、 若指针 p 已正确定义并指向如下图所示存储单元:
a[0]
a[1]
a[2]
a[3]
a[4]
10
20
30
40
50
p↑
则表达式 *++p 的值是_____B_____。
A、 20 B、 30
C、 21 D、31
27、 语句 printf("%d\n", strlen("ATS\n012\1\\")); 的输出结果是__C____。\n,\1,\\均为转义字符算一个
A、 11 B、 10
C、 9 D、 8
28、 若已定义:
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p = a, i;
其中0≤i≤9,则对 a 数组元素的引用不正确的是 ( D) *是取地址的值的运算
A、 a[p - a] B、 *(&a[i])
C、 p[i] D、 *(*(a + i))
29、设FILE *fp; char ch; , 则从fp所指向文件中读入一个字符,正确的语句是(B )。
A.fgetc(ch, fp);
B.ch=fgetc(fp);
C.getchar(ch);
D.fgetc(fp,ch);
30、 有以下程序: 通过#define预定义函数 宏定义
#include <stdio.h> FUDGF(y)=2.84+y 返回整型数 7
#define FUDGF(y) 2.84 + y PR(a)输出a a=12
#define PR(a) printf("%d", (int)(a)) PRINT1(a) 调用PR(a) 输出换行符
#define PRINT1(a) PR(a); putchar('\n') 本题属于C语言预处理的内容,如要详细
void main() 了解,请学习预处理部分
{ int x = 2;
PRINT1(FUDGF(5) * x);}
程序运行后的结果是___B_____。
A、 11 B、 12
C、 13 D、 15
二、程序填空
1、从键盘上输入10个数,求其平均值。
main()
{int i;
float f,sum;
for(i=1,sum=0.0;i<11;i++)
{ ___________【1】________________; scanf(“%f”,&f)
____________【2】_________________; sum=sum+f
}
printf(“average=%f\n”,sum/10);
}
2、输入一行字符,统计其中的英文字符、数字字符、空格及其它字符的个数。
#include <stdio.h>
#include <string.h>
#define ARR_SIZE 80
main()
{
char str[ARR_SIZE];
int len, i, letter=0, digit=0, space=0, others=0;
gets(str);
for (i=0; 【1】 ; i++) str[i]!=’\0’
{
if ( 【2】 ) (str[i]>=65&&str[i]<=80)|| (str[i]>=97&&str[i]<=122)
letter ++;
else if ( 【3】 ) (str[i]>=48&&str[i]<=57)
digit ++;
else if ( 【4】 ) str[i]=’ ‘;
space ++;
else
others ++;
}
printf("English character: %d\n", letter);
printf("digit character: %d\n", digit);
printf("space: %d\n", space);
printf("other character: %d\n", others);
}
3、将从键盘输入的字符串逆序显示。
#include <string. h>
main()
{int n;
char str[80], *p;
printf(″Input a string:″);
gets(str);/*输入字符串*/
n=strlen(___【1】_____); /* 第一空 */ str
p=str+___【2】_____-1; /* 第二空 */ n
while (p>=str)
{printf(″%c″, *p);
____【3】____; /* 第三空 */ p--
}
printf(″/n″);
}
4、不用函数strcat(),编程实现字符串连接函数strcat()的功能,将字符串srcStr连接到字符串dstStr的尾部。
#include <stdio.h>
#include <string.h>
main()
{
void MyStrcat(char dstStr[], char srcStr[]);
char s[80], t[80];
printf("Please enter source string: ");
gets(s);
printf("Please enter destination string: ");
gets(t);
MyStrcat(s,t);
printf("The concatenate string is: ");
puts(s);
}
void MyStrcat(char dstStr[], char srcStr[])
{
int i = 0, j;
while (dstStr[i] != '\0')
{
【1】 ; i++ /*起到目标串尾 */
}
for (j=0; 【2】 ; j++, i++) srcStr[j]!=’\0’
{
【3】 ; dstStr[i]=srcStr[j]
}
【4】 = '\0'; dstStr[i]
}
5、给定一3*4的矩阵,求出其中值最大的元素的值,及所在的行列号。
main()
{
int i,j,row=0,colum=0,max;
static int a[3][4]={{1,2,3,4}{9,8,7,6}{10,-10,-4,4}};
【1】 ; max=a[0][0]
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max)
{
【2】 ; max=a[i][j]
row=i;
coum=j;
}
printf(“max=%d,row=%d,colum=%d\n”,max,row,colum);
}
三、读程序,写出运行结果
1、int x=6,y=7;
printf(“%d,”,x++);printf(“%d\n”,++y);
程序的输出结果是__6,8___.
2、#include ”stdio.h”
func(int b[])
{ int j;
for(j=0;j<4;j++)
b[j]=j;
}
main()
{ int a[4],k;
func(a);
for(k=0;k<4;k++)
printf(“%d\n”,a[k]);
}
上述程序运行的结果: 0
1
2
3
3、float f=3.1415927;
printf(“%f,%5.4f,%3.3f”,f,f,f);
则程序的输出结果是__3.141593,3.1416,3.142___.
4、#include ”stdio.h”
void fun()
{ static int a=5;
a++;
printf(“a=%d\n”,a);
}
main()
{ int m;
for(m=0;m<=1;m++)
fun();
}
上述程序运行的结果: a=6
a=7
5、#include "stdio.h"
union mix
{ char c;
float f;int i;
};
main(){
union mix x,*p=&x;
*(float *)p=3.110;
printf("%f",x.f);
*(int *)p=50;
printf("%d",x.i);
}
上述程序运行的结果: 3.11000050 /* 输出没有分隔符 */
6、#include "stdio.h"
void test(int *x,int*y);
void main()
{
int a=10,b=20;
printf(“a=%d,b=%d\n”,a,b);
test(&a,&b);
printf(“a=%d,b=%d\n”,a,b);
}
void test(int *x,int*y){
int t;
t=*x;*x=*y;*y=t;
}
上述程序运行的结果: a=10,b=20
a=20,b=10
7、#include <stdio.h>
main()
{
int i, j, m;
int a[2][5] = {1,20,32,14,5,62,87,38,9,10};
m = a[0][0];
for (i=0; i<2; i++)
for (j=0; j<5; j++)
if( m<a[i][j] ) m = a[i][j];
printf(“m = %d\n”, m);
}
上述程序运行的结果: m=87 /*求大值*/
8、struct date
{
int year;
int month;
int day;
};
void func(struct date *p)
{
p->year = 2000;
p->month = 5;
p->day = 22;
}
main()
{
struct date d;
d.year = 1999;
d.month = 4;
d.day = 23;
printf(“%d,%d,%d\n”,d.year, d.month, d.day);
func(&d);
printf(“%d,%d,%d\n”,d.year, d.month, d.day);
}
上述程序运行的结果: 1999,4,23
2000,5,22
9、#include<stdio.h>
void fun1(int x)
{
x=20;
}
void fun2(int b[4])
{
int j;
for(j=0; j<4; j++)
b[j]=j;
}
main()
{
int x = 10;
int a[4] = {1,2,3,4}, k;
fun1(x);
printf("x = %d\n", x);
fun2(a);
for(k=0; k<4; k++)
printf("%d\n", a[k]);
}
上述程序运行的结果: x=10
0
1
2
3
10、main()
{int a,b;
for (a=1,b=1;a<=100;a++)
{ if(b>=20) break;
if(b%3==1)
{b+=3;continue;}
b-=5;} }
程序的输出结果a的值为__7____.
11、main()
{
int i=10;
switch(i){
case 9: i+=1;
case 10: i+=1;
case 11: i+=1;
default : i+=1;
}
printf(“%d”,i);
}
上述程序运行的结果: 13
12、a=3;
a+=(a<1)?a:1; printf(“%d”,a);
结果是__4____.
13、 #include<stdio.h>
int s();
int x,y;
main()
{
int n;
x=1;y=2
n=s();
printf(“x=%d,y=%d,n=%d\n”,x,y,n);
}
int s();
{
int z;
x=3;y=4;
z=x+y;
return(z);
}
上述程序运行的结果: x=3,y=4,n=7
14、#include "stdio.h"
#include "string.h"
main()
{
char *s1="engraft",*s2="engrave";
while(*s1++==*s2++);
printf("%d",strcmp(s1,s2));
}
上述程序运行的结果: 大于0的整数 /*当s1,s2指向a时,条件仍成立,继续指向f和v,条件不成立,但此时s1,s2再次指向下一位 t>e 结果得到大于0的整数
15、main( )
{ int a[5]={2,4,6,8,10},*P,* *k;
p=a; k=&p;
printf(“%d,”,*(p++));
printf(“%d\n”,* *k);
程序的输出结果是__2,4____.
四、程序改错题
在下面给出的5个程序中,共有10处错误,请找出其中的错误,并改正之。注意不得增行或删行,也不得更改程序的结构;多找、少找、找错、改错均不得分!
1、程序的功能是:程序中函数fun的功能是将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。
#include <stdio.h>
void fun(char *s, int a, double f)
{ file *fp; FILE *fp;
char ch;
fp = fopen("file1.txt", "w");
fprintf(fp, "%s %d %f\n", s, a, f);
fclose(fp);
fp = fopen("file1.txt", "r");
printf("\nThe result :\n\n");
ch = fgetc(fp);
while (!feof(fp)) {
putchar(fp); ch = fgetc(fp); } putchar(ch);ch=fgetc(fp);
putchar('\n');
fclose(fp);
}
main()
{ char a[10]="Hello!"; int b=12345;
double c= 98.76;
fun(&a,&b,&c); fun(a,b,c);
}
2、 下面的程序是求500以内的所有的素数之和。请修改程序中的错误,使它能得出正确的结果,并给出正确结果。
程序:
#include <conio.h>
#include <stdio.h>
#include <math.h>
int prime(int n)
{ int yes, i;
if(n<=1) {return 1;}
yes=1;
for(i=2; i<=sqrt(n); i++)
if(n%i==0){ yes=0; continue;} ***① {yes=0;break;}
return 1; ***② return yes;
}
main()
{ int sum=0, i;
clrscr();
for(i=2;i<=500; i++)
if(prime(i)) sum+=i;
printf("%d\n", sum);
}
3、序是求[1,450]之间同时满足除3余2和除5余3条件的数的个数。请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。
程序:
#include <conio.h>
#include <stdio.h>
#include <math.h>
main()
{ int count;
int i;
count=0;
for (i=1;i<=450;i++)
{
if (fmod(i,3)==2 && fmod(i,5)==3)
count+=i; ***① count++;
}
clrscr();
printf("%ld\n",count); ***② printf(“%d\n”,count);
}
4、24有8个因子,而24正好被8整除。下面程序求[50,250]之间有多少个整数能被其因子的个数整除,请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。
程序:
#include <conio.h>
#include <stdio.h>
#include <math.h>
main()
{ int a,b,c,n,count=0;
for (a=50; a<=250; a++)
{
b=0;
for (c=1;c<=a;c++)
if (a%c ==0 )
b+=c; ***① b++;
if (a%b==0)
{ count=count+a; ***② count++;
}
}
printf("\n count = %d",count);
}
5、程序的功能是:输入一个整数k(2≤k≤10000),打印出它的所有质因子(即所有为素数的因子)。
#include <conio.h>
#include <stdio.h>
IsPrime(int n);
{ int i, m;
m = 1;
for (i=2; i<n; i++)
if !(n%i) if(n%i==0)
{ m = 0;
break;
}
return(m);
}
main()
{ int j, k;
printf("\nplease enter an integer number between 2 and 10000:");
scanf("%d", &k);
printf("\n\nThe prime factor(s) of %d is(are):", k);
for (j=2; j<k; j++)
if ((!(k%j)) && (IsPrime(j)))
printf(" %4d,", j);
printf("\n");}
五、程序设计题
1、求1!+3!+5!+7!+…+19!的和。
long tm=1,sum=0;
int i,j;
for(i=1;i<=19;i+=2)
{tm=1;
for(j=1;j<=i;j++)
tm=tm*j;
sum=sum+tm;}
printf(“totle=%d\n”,sum);
2、从键盘输入某学生的成绩(0≤score≤100)后,先输出该同学的成绩,再按下列条件
输出
int score;
printf(“please input the score\n”);
do
scanf(“%d”,&score);
while(score<0||score>100);
if(score>=80)printf(“%d Good\n”,score);
else if(score>=60)printf(“%d Pass\n”,score);
else printf(“%d No pass\n”,score);
3、试编程序,找出1至99之间的全部同构数。同构数是这样一组数:它出现在平方数的右边。例如:5是25右边的数,25是625右边的数,5和25都是同构数。
int i,k;
for(i=1;i<=99;i++)
if(i<10)k=i*i%10;
else k=i*i%100;
if(i==k)printf(“%4d”,i); 1 5 6 25 76
4、用选择法或者冒泡法对10个整数排序(从大到小)。
(选择算法)
int s[10]={4,8,7,2,5,9,0,1,3,6};
int i,j,k,t;
for(i=0;i<9;i++)
{k=i;
for(j=i+1;j<10;j++) if(s[j]>s[k])k=j;
t=s[k];s[k]=sk[i];s[i]=t;}
(冒泡算法)
int s[10]={4,8,7,2,5,9,0,1,3,6};
int i,j,t;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++) if(s[j]<s[j+1]) {t=s[j];s[j]=sk[j+1];s[j+1]=t;}
第14 页
展开阅读全文