【考研复习】李春葆新编C语言习题与解析(错误答案订正)

新编C语言习题与解析

做习题时发现有些错误答案,写篇博客进行改正记录。不对地方欢迎指正~
使用g++进行编译。

第二章

在这里插入图片描述
C. 其中b的表达形式错误,若加上0x1e2b则正确。所以C错误。
D. e后为整数。指数命名规则:e前有数,后有整数。所以D错误。


在这里插入图片描述
乘除和求余的优先级一样高。 所以正确的解释如下:
2.5+1*7%2/4=2.5+7%2/4=2.5+1/4=2.5+0=2.5。
之后再统一精度。


第三章

在这里插入图片描述
根据后面选项,可知题目为-1.


在这里插入图片描述

在这里插入图片描述
A. case后的常量表达式不是整型,且switch后也不是整型;
B. switch(a);后有分号错误;
C. case后的常量表达式不是整型;
D. switch(a+b);后有分号。若无分号,正确答案为D。


在这里插入图片描述
少了个S,应该都看得出来。


在这里插入图片描述
输出部分偶数之和应该直接输出c,而不是c-11。

#include <stdio.h>
int main()
{
    
    
    int a,b,c;
    a=c=0;
    for (int i = 0; i < 10; i+=2)
    {
    
    
        a+=i;
        b=i+1;
        c+=b;
    }
    printf("even = %d\n",a);
    printf("odd = %d\n",c);
} // namespace std;


在这里插入图片描述

  1. j%2==1当判断条件为1的时候输出
  2. 每个集合之间有逗号(数字之间的逗号可以用个if做一下)
#include<stdio.h>
int main(){
    
    
    int n,m,i,j,k;
    printf("n=");
    scanf("%d",&n);
    //计算具有子集的个数
    m=1;
    for(i=1;i<=n;i++){
    
    
        m=m*2;
    }
    m--;
    for(i=0;i<=m;i++){
    
    
        printf("{");
        j=i;
        k=0;
        while(j!=0){
    
    
            if(j%2==1) printf("%d",k);
            k++;
            j/=2;
        }
        printf("},");
        if((i+1)%5==0) printf("\n");
    }
    printf("\n");
}

第四章

在这里插入图片描述
在定义数组时,定义赋初值的个数等于数组长度,则数组长度可以省略,所以只给部分数组元素赋初值时,对数组的长度声明不能省略。故答案为A、B。
简记:一维数组可以省略,二维数组行能省略,列不能。


这里有一个歧义题目
在这里插入图片描述
书上说:定义静态数组时才会初始化全为0。该定义不是静态数组,故将初值只赋值给前两个元素。
网上说:数组为初始化,中存放的是乱码,但是只要初始化一个数,其余数据自动填充0,所以数组元素都为0。
两者歧义,先按照书上定义的来,另外苏小红书中也提到静态数组定义的时候会将数组元素赋为0。


在这里插入图片描述
我们看第十个判断题:如果想使一个数组中全部元素的值为0,可以写成int a[10]={0*10};。请问这句话的说法是正确的吗?

个人认为: 题目等价于 int a[10]={0},表示只给第一个元素赋初值,后面9个元素值默认为0.
拓展: int a[10]={1*10},是否正确,初始化的结果是什么?
输出结果:10,0,0,0,0,0,0,0,0,0


在这里插入图片描述


第五章

在这里插入图片描述
在这里插入图片描述
5-2-4:
A. p指针指向“are you”字符串。程序段正确
B. a为地址常量,不能进行++a操作。程序段错误
C. a[11]数组内存为11,而st指向的字符串为11+1(最后还有’\0\),数组内存不够。程序段错误
D. a数组未声明多大的数组。程序段错误
5-2-11:
A. p指针指向“are you”字符串。程序段正确
B. a为地址常量,不能进行++a操作。程序段错误
C. a[11]数组内存为11,而st指向的字符串为11+1(最后还有’\0\),数组内存不够。程序段错误
D. p指针指向"w are you"字符串。程序段正确


在这里插入图片描述

#include<stdio.h>
#include<string.h>
int main(){
    
    
    char *ptr1,*ptr2;
    ptr1=ptr2="abcde";
    while(*ptr2!='\0')
        putchar(*ptr2++);
    while(--ptr2>=ptr1)
        putchar(*ptr2);
    putchar('\n');
}

本题答案有误,编译器输出结果为:abcdeedcba


在这里插入图片描述
在这里插入图片描述
本题答案有误,编译器输出结果为:

greeting[0]=Hello
greeting[1]=Good morning
greeting[2]=How are you
Hello
Good morning
How are you

第六章

在这里插入图片描述
在这里插入图片描述

储备知识:
在这里插入图片描述
当数组名即地址作为实参时,这三种形式等价。

A) 参数2,数组长度不限。正确
B) 参数2,数组长度41, &a[9] 从9-50是41。正确
C) 参数2,指针用地址调用。正确
D) 参数2,为整型,不能传入地址。不正确

参考问题解答


在这里插入图片描述
这道题的答案的提问方式错了,应该问的是正确的定义方式。
当用二维数组作为形参时,第一维的大小可以省略,但第二维的大小是不能省略的,必须和实参数组第二维的大小一致。所以正确答案是C。
参考问题答案


在这里插入图片描述
这道题应该不是字符串从大到小排序,而是输出字符串长度最大的。对应答案为B则正确。


在这里插入图片描述
输出格式不对,正确格式为:1,3,2


第七章

在这里插入图片描述
答案应为D。
A. a.next后应该赋值为c的地址;另外这种形式就是不对的,变量a没有next的属性。
B. 首先p和q链接之后,q.next变为q了,第二句中的q.next和p.next是让他们的指针域互指,不能形成正确的单链表。
C. 该选项当p和q连结之后,反的错误和B类似,p和q指针域互指了。
D. 首先变量a的指针域p指向变量c,然后让变量c的指针域指向变量b。答案正确。
另外,没有变量名时,应该先连后头的,再把前面连上,否则断链了
参考答案链接


第九章

在这里插入图片描述
在这里插入图片描述
本题答案为D
A.文本文件的每一个字节放一个ASCII码,代表一个字符。文本文件也称为ASCII码文件,具有可读性。故A选项正确。
B. 由于数据在计算机中是以二进制形式存放的,因此二进制文件中的数据可以直接读出,而不需要像文本文件那样把ASCII码转换成二进制,因此速度较快。故B选项正确。
C. 在文本文件中,数据以ASCII码形式存放的,用户很难判定一个数据到底占几个字节,所以不适合使用随机读写方式。故C选项正确。
D. 数据以二进制形式存放,占有的字节数是固定的,所以可以进行随机读写,当然也可以顺序读写。所以,D选项为所选。
参考答案链接


猜你喜欢

转载自blog.csdn.net/m0_52427832/article/details/131109382