C语言错题集

狂风中的少年 提交于 2020-01-22 16:34:29

1.定义结构体typedef struct one { int a;}s; s a;则a为结构体变量()
答案:正确
解析:s为结构体类型名,s a定义了a为一个结构体变量

2.表达式10!=9的值是true。 (F)
解析:在c语言中正确为1,错误为0;所以其值是 1

3.若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( D)。

函数的实参和其对应的形参共占同一存储单元
形参只是形式上的存在,不占用具体存储单元
同名的实参和形参占同一存储单元
函数的形参和实参分别占用不同的存储单元

解析:C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元,所以选D

4.变量a所占内存字节数是( D )。
union U
{char st[4];
int i;
long l;
};
struct A
{int c;
union U u;
}a;

A: 4
B: 5
C: 6
D: 8
解析:共用体所占字节数是里面的成员所占字节数相加,int 4个字节 ,union U u取最长4字节,所以a所占字节数为
4+4=8.

5.任何一个算法都必须有的基本结构是( A )

A: 顺序结构
B: 条件分支结构
C: 循环结构
D: 以上三个都要有
解析:根据算法的特点
如果在执行过程中,不需要分类讨论,则不需要有条件结构;
如果不需要重复执行某些操作,则不需要循环结构;
但任何一个算法都必须有顺序结构

6.以下错误的转义字符是(D)

A: ‘\’
B: ‘’’
C: ‘\t’
D: ‘\80’
解析:因为“\”后面使用数字表示字符ASCII值默认用的是8进制 用8自然是错的

7.以下程序输出结果是( B )

#include <stdio.h>
main()
{
static char a[]=“programe”;
char *p;
p=a;
for(p=a;p<a+8;p+=2)
putchar(*p);
}

A: programme
B: porm
C: 有语法错误
D: Prog
解析:p[0]=p,p[2]=o,p[4]=r,p[6]=m;
所以输出为 porm

8.假定所有变量均已正确说明,下列程序段运行后x的值是( B )。
a=b=c=0;x=35;
if(!a) x–;
else if(b) ; if© x=3;
else x=4;

/
A: 34
B: 4
C: 35
D: 3
解析:本题考查if else语句。第一个if语句,先判断条件,发现a=0,则!a成立,执行下列的语句,x–,得x=34;第二、三个if语句,判断条件,发现,b=0,c=0,则条件不成立,执行下列的else语句,得x=4。

9.已知 int x=10, y=20, z=30; 以下语句执行后x, y, z的值是(B )。
if(x>y)
z=x;x=y;y=z;

A: x=10,y=20,z=30 
B: x=20,y=30,z=30
C: x=20,y=30,z=10 
D: x=20,y=30,z=20
解析:这个题有一个坑,那就是if语句没有假{},所以if只执行接下来的第一个分号之前的内容。
这里 x!=y,所以只执行x=y和y=z。

10.已有如下定义和输入语句,若要求a1,a2的值分别为10,20,正确的输入方式是(A)
int a1,a2;
scanf("%d%d",&a1,&a2);

A: 10 20
B: 1020
C: 10,20
D: 10;20
解析:整型之间输入要隔开,连在一起只会认为是一个整型数据

11.语句y=*p++;和y=(*p)++;是等价的。(F)
解析:第一个y = *p;p++.++作用于p上.
第二个 *p,++作用于p指向的内容上.

12.定义:char p[20]; 则,p, &p[0] 两者没有区别(T)
解析:都是指的数组的第一个元素的地址.

13.枚举类型是一种基本的数据类型 (F)
解析:在C语言等计算机编程语言中是一种构造数据类型 .

14.结构化程序设计是以____模块化____设计为中心。

15.结构化程序设计方法的主要原则可以概括为_ 自顶向下___、逐步求精__、模块化__和____限制使用goto语句

16.计算圆周率1
题目描述:
圆周率可以采用如下公式进行计算:
在这里插入图片描述
现要求根据输入的精度e,即最后一项的值不小于精度e时,输出相应的圆周率的值,结果保留六位小数。
输入
输入一个精度e。
输出:
输出对应的圆周率,结果保留六位小数。

样例输入;
0.00005
样例输出:
3.141480

#include<stdio.h>
int main()
{
	double s=0.0,t=1.0,e;
	int i;
	scanf("%lf",&e);
	for(i=1;t>e;i++)
	{
		s+=t;
		t=t*i/(i*2+1);
	}
	printf("%.6lf",2.0*s);
	return 0;
}

17.Fibonacci数列问题

题目描述

有一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每个月都生1对兔子,小兔子长到第3个月后每个月又生1对兔子。假设所有兔子都不死,问每个月兔子的总对数为多少?

提示:不满1个月的为小兔子,满1个月不满2个月的为中兔子,满3个月以上的为老兔子。每对老兔子每个月会生1对小兔子。因此,每个月的兔子总数依次为1,1,2,3,5,8,13,…。这就是Fibonacci数列。该数列的递归定义如下:f(n)= 1 (n等于1或2);f(n)= f(n-1)+ f(n-2) (n>2)

请编写递归函数int fib(int n),求出第n个月兔子的总对数。

输入描述

输入一个正整数n,表示求第n个月兔子的总对数。

输出描述

输出为一行“第n个月兔子的总对数为f”,f值为求出的数列第n项的值f(n)。

样例输入

2

样例输出

第2个月兔子的总对数为1

#include<stdio.h>
long Fibonacci(int m);
void main()
{
	int i;
	scanf("%d",&i);
   	printf("%d\n",Fibonacci(i));
   	return 0;
}
long Fibonacci(int m)
{
  if(m<=2)
       return 1;
  else 
 	 return Fibonacci(m-1)+Fibonacci(m-2);
}

18.下面程序段的运行结果是_____A________。
char s[6]; s=“abcd”; printf(""%s"\n",s);

A: “abcd”
B: “abcd "
C: “abcd”
D: 编译出错
解析:给s赋初值为“abcd”,输出s字符串,其中"为转义字符,将” "输出

19.有如下程序:
#define N 2
#define M N+1
#define NUM 2*M+1
main()
{int i;
for(i=1; i<=NUM; i++) printf("%d\n", i);
}
该程序中的for循环执行的次数是( B )。

A: 5
B: 6
C: 7
D: 8
解析:NUM=2*2+1+1=6;所以for循环执行六次.

20.已知大写字母A的ASCII码为65,以下程序的运行结果为( A )。
#include<stdio.h>
main( )
{
char c1=‘A’,c2=‘Y’;
printf("%d,%d\n",c1,c2);
}

A: 65,89
B: A,Y
C: 65,88
D: 65,90
解析:A为65,输出65;Y=65+24=89;所以输出89.

21.合法的数组定义是( D )。
A: int a[]=“string”;
B: int a[5]={0,1,2,3,4,5};
C: char a=“string”;
D: char a[]={0,1,2,3,4,5};
解析:A的问题是将字符串的首地址赋值给int类型数组肯定不行类型不一样。
B的问题是初始化元素的个数超过了定义的个数
C的问题是将一个字符串的首地址赋值给一个char变量
D的问题是将字符串的首地址赋值给int类型数组肯定不行类型不一样。
所以选D

22.设有以下结构体类型说明和变量定义,则变量a在内存中所占的字节数是 32 。(VC环境中)
struct stud
{char num[6];
int s[4];
double ave;
}a;
解析:char num[6]占字节数为6+2=8;int s[4]为4*4=16;double ave为8;
所以a所占字节数为8+16+8=32。

23.已定义以下函数(D)
fun(char *p2, char *p1)
{ while((*p2=*p1)!=’\0’){p1++;p2++;}
}
A: 将p1所指字符串复制到p2所指内存空间
B: 将p1所指字符串的地址赋给指针p2
C: 对p1和p2两个指针所指字符串进行比较
D: 检查p1和p2两个指针所指字符串中是否有’\0’

解析:将p1所指字符串复制到p2所指内存空间,直到遇到’\0’结束循环。

24.下面能正确进行字符串赋值操作的是 (C)

A: char s[5]={“ABCDE”};
B: char s[5]={ ′A′, ′B′, ′C′, ′D′, ′E′};
C: char *s;s=“ABCDE”;
D: char *s;char a; scanf("%s",&s);
解析:A. char s[5]={“ABCDE”}; “ABCDE"占用空间是6字节,超出s的长度了
B. char s[5]={ ′A′, ′B′, ′C′, ′D′, ′E′}; 没有字符串结束的终结符,s不能当字符串使用
C. char *s;s=“ABCDE”; 正确
D. char *s;char a; scanf("%s",&s); s还是个野指针

25.已定义以下函数:

  int  fun(int  *p){return  *p;}
  fun函数返回值是 ( C  )

A: 一个整数
B: 形参p的地址值
C: 形参p中存放的值
D: 不确定的值
解析:返回的数据类型是整型,返回值是*p,即形参p中存放的值。

26.p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是( B)

A: c=*p1+*p2
B: p2=c
C: p1=p2
D: c=*p1 *(*p2)
解析:A项 *(取内容符) 将p1 p2指向的变量的值的和赋给c是可以的。
B项 c是字符变量 p2是指针变量 ,指针变量只能付地址 改为p2=&c是可以的。
C项 指针就是地址p1 和p2是可以相互赋值的。
D项 是取其内容运算不是指针运算,是对的

27.如果x是整型变量,则合法的形式是( D )。
A: &(x+5)
B: *x
C: &*x
D: *&x
解析:A.&(x+5) //&表示取地址,后面应该是变量名,不能是表达式。
B.*x   //*后面应该是指针变量,而x不是。  
C.&*x  //后面应该是指针变量,而x不是。  
D.
&x //相当于x

28.若有以下定义,则赋值正确的是( C )。
int a ,b , *p;
float c, *q;

A: p=&c
B: q=p
C: p=NULL
D: q=new int
解析:A选项p和c是不同的类型
B选项p和q是不同的类型
C选项正确,p = NULL; :p是一个指针,但它不指向任何变量,多以答案对的。也就是暂时先不给它赋值,以后再赋值。
D选项 语法错误,new是关键字

29.若有说明:char language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};
则表达式
language[1]>*language[3]比较的是______C________。

A: 字符F和字符P
B: 字符串BASIC和字符串JAVA
C: 字符B和字符J
D: 字符串FORTRAN和字符串PASCAL
解析:在我们认为是对字符串BASIC与JAVA进行比较,在运行过程中它先读入字符串的第一个字母,进行比较,如果一样就再读下一个字母,因此这里比较的是B与J

30.若int i=10;执行下列程序后,变量i的正确结果是( D)
switch(i){
case 9:i+=1;
case 10:i+=1;
case 11:i+=1;
default:i+=1;
}

A: 10
B: 11
C: 12
D: 13
解析:这个题有个坑,switch case语句,一句case后面如果没加break的话,就会继续执行下面的语句;
这个题就是从 case10开始一直往下执行后面的语句,最后i=13.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!