C语言程序设计错题归纳

C语言程序设计错题归纳

判断题、选择题和填空题

1.在C语言中能逐个地使用下标变量,也能一次引用整个数组。(F)
解析:不能一次引用整个数组

2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。(F)
解析:数组名不是指针,是元素首地址

3.一维数组定义的一般形式如下,其中的类型名指定数组变量的类型。类型名 数组名[数组长度];(F)
解析:其中的类型名是指数组元素的类型。

4.不正确的赋值或赋初值的方式是__C__。
A.char str[]=“string”;
B.char str[7]={‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’};
C.char str[10];str=“string”;
D.char str[7]={‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’, '\0’};
解析:不能给数组名赋值

5.对于定义 char str[] = “abc\000def\n”(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是: (C)
A12 ,13
B.3 ,11
C.3 ,9
D.3 ,4

6.以下哪个定义中的p不是指针,请选择恰当的选项: (C)
A.char **p;
B.char (*p)[10];
C.char *p[6];
D.给出的三项中,p都是指针
解析:*p[6]代表指针数组,其中的元素才代表指针

7.在以下描述中,( AB)是正确的。
A.int a[5] = {1, 2, 3, 4, 5};
定义了数组a,并对数组元素赋初值。此时,a[0]为1,a[1]为2,a[2]为3,a[3]为4,a[4]为5。
B.static int b[10];
定义了静态数组b,且10个数组元素的初值都为0。
C.int fib[45] = {1, 1};
定义了数组fib,并对数组 fib 的前2个元素赋初值,其余元素的值都为0。
D.static int week[7] = {1, 2, 3};
定义了静态数组week,并对数组 week 的前3个元素week[0]~week[2]赋初值,week[3]~week[6]值都是不确定的。

解析:只有静态staic定义的数组,经过初次赋值后,没有赋值的元素值默认为0,并不是不确定的

8.在以下描述中,( ABCD)是正确的。
A.int a[3][3] = {1};
定义了数组a,并对数组a赋初值。此时,a[0][0]的值为1,而其余元素的值都是不确定的。
B.static int b[4][3] = {{ }, { }, { },{9}};
定义了静态数组b,并对数组赋初值。此时,b[3][0]的值为9,而其余元素的值都为0。
C.int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
和int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
等价。
D.static int b[4][3] = {{1, 2, 3}, { }, {4, 5}};
和static int b[4][3] = {1, 2, 3, 0, 0, 0, 4, 5};
等价。
E.int a[3][3] = {{},{4},{}};
定义了数组a,并对数组a赋初值。此时,a[1][1]的值为4,而其余元素的值都是不确定的。

解析:.int a[3][3] = {{},{4},{}};此时,a[1][0]的值才是为4,而其余元素的值都是不确定的。

9…int (*p)[4]它表示p是一个指针数组,它包含4个指针变量元素(F)
解析:p是一个指针变量
知识拓展:int (*p)[n]; 是数组指针,小括号优先,所以 是 1个指针,用来指向 有5个元素的数组。int *p[n]; 指针数组,有 5 个成员,每个成员都是一个指针,共有5 个指针

10.结构体类型本身不占用内存空间,结构体变量占用内存空间(T)(结构体成员)

11.语句int *p; *p=50;执行时,不会有任何错误(F)
解析:P需要指向一个地址后才能对 *p赋值.

12.对于定义int a[10] , *p=a;(赋的是一个首地址) 语句p=a+1;和a=a+1;都是合法的。 (F)
解析:a是数组,只能对数组元素赋值,要有下标。

13.在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。(T)

14.假设结构指针p已定义并正确赋值,其指向的结构变量有一个成员是int型的num,则语句 *p.num=100; 是正确的。(F)
15. 若变量已正确定义并且指针P已经指向某个变量X,则(*P)++相当于 (x++)

16.下列程序段的输出是 ( 5 )。
int c[]={1, 3, 5};

int *k=c+1;

printf("%d",
*++k);

17.若定义pf为指向float类型变量f的指针,下列语句中_B_是正确的。 (2分)

A.float f, *pf = f;(地址没有浮点型的)

B.float f, *pf = &f;

C.float *pf = &f, f;

D loat f, *pf =0.0;

解析:定义时初始化float *pf = &f;的等价的语句是: float *pf; pf = &f;.

18.根据声明int (*p)[10],单独的 p是一个( 指针)

19.根据声明int a[10], *p=a; ,下列表达式错误的是( a++)。(a是常量,不能自增)

  1. int a[2]={1,3},
 *p=&a[0]+1;               结果是3

 printf("%d",*p);

20.对于以下结构定义,++p->str中的++加在指针str上____。 (2分)

struct {

int len; 

char *str;

} *p;

  1. 程序是由函数构成

  2. 注释/*和 */,还有//

  3. a=(3,4,5)此时a=5; a=3,4,5此时a=3.

  4. 设double
    x=2.5,y=4.7;int a=7;则x+a%3*(int)(x+y)%2/4为_____2.5___。(从左至右,赋值最低)

  5. 定义:double
    x=3.5,y=3.2;则表达式(int)x*0.5的值是__1.5_____,表达式y+=x++的值是___6.7____。

解析:x++是先使用后加,下次中的x的值才会加一;
int(这里面的才会变,不打括号就是把靠它最近的强制转换)

  1. 定义:int m=5,n=3;则表达式m/=n+4(和m=m/(n+4)一样)的值是____0___,表达式m=(m=1,n=2,n-m)的值是___1_____,m+=m-=(m=1)*(n=2)(当有多个赋值时,从右往左计算)的值是____-2____。
    
  2. 在C语言,标识符分为三类:_关键字_____、__用户自定义标识符____和_预定义标识符______。
    
  3.  合法的标识符由字母、数字、下划线组成(数字不能放最前面),变量名不能由关键字(如case)组成。
    
  4. 这个字符串的长度是9——这个字符串的长度是9——a \x44 \ a b
    c d \101 b——这是因为C/C++的字符串中由\引导的是“转义字符”或叫“换码序列**”。下面只对转义字符予以说明:
    \x44——以\x引导的是十六进制ASCII码,\x44表示0x44,即大字字母D;\——由于\被赋予换码序列的引导符,所以字符串中使用字符’'时要双写;\101——八进制ASCII码,八进制101就是十进制65**,即大字字母A。

30.!逻辑非与!=不等于

31.设int a=0,b=5;执行表达式++a||++b(当前面满足有一个是非0是,就不会执行后面的了),a+b后,a,b和表达式的值分别是( 1,5,6 )

32.运算符的先后高低(单目乘除为关系,逻辑三目后赋值)。

单目:单目运算符±(负数) +±等

乘除:算数单目运算符* / % ±

为:位移单目运算符<< >>

关系:关系单目运算符><>=<===!=

逻辑:逻辑单目运算符&&|| &|^

三目:三目单目运算符A>B?X:Y

后:无意义,仅仅为了凑字数

赋值:赋值=),数学运算与C语言运算的符号区别,运算

33.int
k=2;while(k=0){printf("%d",k);k–;}则下面描述中正确的是( 循环体语句一次也不执行 )(0为假,1为真,执行循环,不满足退出)

链表

  1. 在单向链表中,头指针中存放的是头结点的内容(F)(有区别)

  2.  用链表代替数组进行数据操作时,查询更加方便。(F)(数组内存连续,占用大,查找更方便,链表插入删除方便,但不可随机访问)
    

编程题

1.阶乘计算升级版
本题要求实现一个打印非负整数阶乘的函数。
输入样例:15
输出样例:1307674368000

#include 

void Print_Factorial ( const int N );

int main()
{
    int N;
	
    scanf("%d", &N);
    Print_Factorial(N);
    return 0;
}
void Print_Factorial ( const int N )
 
 {double product=1;
 int i;
 if(N<0)
  printf("Invalid input\n"); 
 else{
  for(i=1;i<=N;i++)
   product=product*i;
  printf("%.0f\n", product);
 }
}

2.数组循环右移本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a​0​​a​1​​⋯a​n−1​​)变换为(a​n−m​​⋯a​n−1​​a​0​​a​1​​⋯a​n−m−1​​)(最后m个数循环移至最前面的m个位置)。
输入样例:6 2
1 2 3 4 5 6
输出样例:5 6 1 2 3 4

#include 
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
    int a[MAXN], n, m;
    int i;
    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
    ArrayShift(a, n, m);
    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");
    return 0;
}
int ArrayShift( int a[], int n, int m )
{
    int i,j,tmp; 
for (i=0;i<m;i++){ 
tmp=a[n-1]; 
for (j=n-1;j>0;j--) a[j]=a[j-1]; 
a[0]=tmp;  
}
for(i=0;i<n;i++)
    return a[i];
}

3.报数报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m( 输入样例:11 3
输出样例:4 10 1 7 5 2 11 9 3 6 8

#include 
#define MAXN 20
void CountOff( int n, int m, int out[] );
int main()
{
    int out[MAXN], n, m;
    int i;
    scanf("%d %d", &n, &m);
    CountOff( n, m, out );   
    for ( i = 0; i < n; i++ )
        printf("%d ", out[i]);
    printf("\n");
    return 0;
}void CountOff( int n, int m, int out[] ){  
    int i,j,p;  
	int num[MAXN];
    for(i=0;i<n;i++){
    	num[i] = i+1; 
    } 
	int count=0;
	i=0,j=0,p=0;  
    while(count < n){  
        if(num[i]!=-1){
        	p++; 
        }  
        if(p==m){  
            j++;  
            out[i]=j;  
            p=0;  
            num[i]=-1; 
            count++;  
        }  
        i++;  
        if(i==n) {
        	i=0;  	
        } 
    }  
}  

4.点赞微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。
输入样例:4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123
输出样例:233 3

#include
int main() 
{
    int n, k, num, max1= 0, max2= 0;
    scanf("%d", &n);
    int arr[1001] = {0};
    for (int i=0;i<n;i++) 
    {
        scanf("%d", &k);
        for (int j=0;j<k;j++) 
        {
            scanf("%d", &num);
            arr[num]++; 
        }
    }
    for (int i=0;i<1001;i++)
     {
        if (arr[i] >= max1)
         {
            max1= arr[i];
            max2= i;
        }
    }
    printf("%d %d",max2,max1);
    return 0;
}

5.出租下面是新浪微博上曾经很火的一张图:
C语言程序设计错题归纳_第1张图片
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的
输入样例:18013820100
输出样例:int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};

#include
void BubbleSort(int *a,int n)
{
	int i,j,temp;
	for(i=0;i<n;i++)
	for(j=0;j<n-i-1;j++)
	if(a[j]<a[j+1])
	{
		temp=a[j];
		a[j]=a[j+1];
		a[j+1]=temp; 
	}
}
int main()
{
	char s[12];
	int arr[10],index[11],SET[10]={0};
	gets(s);
	int len=0,i,j,temp;
	for(i=0;i<11;i++)
	{
 		temp=s[i]-'0';
		if(!SET[temp])
		{
			SET[temp]=1;
			arr[len++]=temp;
		}
	}
	BubbleSort(arr,len);
	for(i=0;i<11;i++)
	{
		temp=s[i]-'0';
		for(j=0;j<len;j++)
		if(arr[j]==temp)
		{
			index[i]=j;
			break;
		}
	}
	printf("int[] arr = new int[]{");
	for(i=0;i<len;i++)
	{
		printf("%d",arr[i]);
		if(i!=len-1)
		putchar(',');
	}
	printf("};\nint[] index = new int[]{");
	for(i=0;i<11;i++)
	{
		printf("%d",index[i]);
		if(i!=10)
		putchar(',');
	}
	printf("};\n");
	return 0;
}

你可能感兴趣的:(C语言程序设计错题归纳)