二级C语言2023-9易错题
1 二叉树结点数计算:
一棵二叉树有10个度为1的结点,7个度为2的结点,则该二叉树共有____个结点。
解:
2 指针:
有以下程序
#inctude<stdio.h>
#include<stdlib.h>
main()
{ int *a,*b,*c;
a=b=c=(int*)malloc(sizeof(int));
*a=1;*b=2,*c=3;
a=b;
printf("%d,%d,%d\n",*a,*b,*c);
}
程序运行后的输出结果是? 3,3,3
1. `a`, `b`, `c` 都通过 `malloc` 分配了相同的内存地址并指向这块内存。
2. 使用 `*a = 1;`, `*b = 2;` 和 `*c = 3;` 依次赋值:
- `*a = 1;` means 当前的内存值是 `1`。
- `*b = 2;` 将同一块内存的值改为 `2`(此时,所有指向这块内存的指针都“看到”这个值)。
- `*c = 3;` 会再次将内存的值改为 `3`。
在这一系列操作后,内存的最终值变成 `3`,
因此,在最初,执行完所有的赋值后,虽然 `a`, `b`, `c` 最终都指向同一块内存,但是由于 `a` 现在指向 `b`,并且这块内存的值被设置为 `3`,所以最终的输出应当为:3, 3, 3
3 strcat 字符串拼接:
有以下程序( strcat函数用以连接两个字符串)
#include <stdio.h>
#include <string.h>
int main() {
char a[20] = "ABCD\OEFG\0"; // 假设你想要的是这个字符串,并且'\'是普通的字符
char b[] = "IJK";
strcat(a, b);
printf("%s\n", a); // 输出将是 "ABCDOEFGIJK"
return 0;
}
程序运营后的输出结果是? ABCDOEFGIJK
- 在C语言中,
\\
是反斜杠的转义字符。如果你期望在字符串中包含反斜杠(\
),你需要写成\\
。
在代码:
char a[20] = "ABCD\OEFG\0";
由于 \O
被解释为一个转义序列(O
并没有对应的转义字符,因此它不会被特殊处理),所以 \O
实际上被视为字符 O
。
strcat:
在 C 语言中,strcat 函数用于连接两个字符串。它的原型定义在 <string.h> 头文件中。strcat 将源字符串追加到目标字符串的末尾。
函数原型
char *strcat(char *dest, const char *src);
参数
dest:目标字符串,必须有足够的空间来容纳拼接后的结果。
src:源字符串,将被追加到目标字符串的末尾。
返回值
返回 dest 指向的字符串的指针。
注意事项
dest 必须足够大,以容纳追加后的整个字符串(包括终结的空字符)。
dest 字符串必须以空字符 ‘\0’ 结束。
使用 strcat 时要小心可能导致缓冲区溢出。
示例代码
以下是一个使用 strcat 的示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, "; // 目标字符串,需要有足够的空间
const char *src = "World!"; // 源字符串
strcat(dest, src); // 进行字符串拼接
printf("拼接结果: %s\n", dest); // 输出: 拼接结果: Hello, World!
return 0;
}
这个示例中,dest 中的内容和 src 被拼接在一起,最终输出为 “Hello, World!”。
4 指针数组:
指针数组——>是一个数组
数组指针——>是一个指针
有定义语句:int *p[4];以下选项中与此语句等价的是
A. int p[4];
B. int **p;
C. int *(p「4」);
D. int (*p)「4」;
-
A. int p[4]; - 这是一个包含4个int类型元素的数组,不是指针数组,所以A选项不正确。
-
B. int **p; - 这是一个指向指针的指针,它本身不是数组,而是一个单独的指针,可以指向一个指向int的指针。这与指针数组不同,所以B选项不正确。
-
C. int *(p「4」); - 这个选项的语法是不正确的
-
D. int (*p)[4]; - 这个选项定义了一个指针p,它指向一个包含4个int类型元素的数组。
所以好像没有正确答案?有了解的同学可以在评论区留言!
int *p[4];
表示一个包含 4 个 int
指针的数组。以下是一些等价的定义写法:
-
指针数组类型的定义:
int *p[4];
-
使用 typedef 定义的方式:
typedef int* IntPtr; IntPtr p[4];
-
结合括号明确指针数组的含义:
int *(*p)[4];
然而注意这种写法通常是错误的理解,在正确的上下文中可以理解为指向一个数组的指针。
-
通过创建一个指向指针的数组:
int **p;
不过,最后一个 int **p;
并不完全等价,因为它表示一个指向 int
指针的指针,而并不是一个 int
指针的数组。
实际上,最简单的等价写法就是仍然保持原来的写法 int *p[4];
,或者通过类型定义来增强可读性。
5 sizeof() & strlen()
#include <stdio.h>
#include <string.h>
int main() {
char x[] = "STRING";
x[0] = 0;
x[1] = '\0';
x[2] = '0';
printf("%d %d\n", sizeof(x),strlen(x)); // 输出将是 "ABCDOEFGIJK"
return 0;
}
程序运营后的输出结果是?
让我们一步步分析这个程序:
首先,定义了一个字符数组 x,初始化为 “STRING”。这个数组的大小是7(6个字符加上一个隐含的结束符’\0’)。
然后对数组进行了如下修改:
x[0] = 0; // 将第一个字符设为 NULL 字符,注意这不是‘0‘
x[1] = '\0'; // 将第二个字符设为 NULL 字符
x[2] = '0'; // 将第三个字符设为字符 '0'
让我们看看这两个函数的结果:
-
sizeof(x) 返回数组 x 的总大小(以字节为单位)。这个值在数组定义时就确定了,不会因为后续的修改而改变。所以 sizeof(x) 的结果是 7。
-
strlen(x) 返回字符串的长度,它会从字符串的开始计数,直到遇到第一个 NUL 字符(‘\0’)。在这里,x[0] 已经被设置为 NUL 字符,所以 strlen(x) 的结果是 0。
因此,程序的输出结果是:7 0
解释:
7 是数组 x 的大小(以字节为单位)
0 是字符串 x 的长度(因为第一个字符就是 NUL 字符)
6 一些基础的知识
1
仅由顺序、选择(分支)和反复(循环)结构构成的程序是____程序。
正确答案: 结构化
题目描述的是程序设计中的三种基本控制结构:顺序、选择(分支)和反复(循环)。当一个程序仅由这三种控制结构组成时,我们称这样的程序为结构化程序。结构化编程是一种编程范式,它通过限制代码结构来提高程序的清晰度、质量以及开发效率。
2
数据库设计的四个阶段是:需求分析,概念设计,逻辑设计,____
正确答案: 物理设计
数据库设计通常包括以下几个阶段:
需求分析:确定用户对数据库系统的需求。
概念设计:根据需求分析的结果建立概念模型,常用E-R图表示。
逻辑设计:将概念模型转换成特定DBMS支持的数据模型。
物理设计:考虑具体的存储方案,如文件组织形式、索引策略等,以优化性能。
3
数据库设计中反映用户对数据规定的模式是
A. 内模式
B. 概念模式
C. 外模式
D. 设计模式
关键词:用户
!
在数据库设计中,为了从不同角度描述和抽象数据,通常会涉及三种模式:内模式、概念模式和外模式。
- 内模式:这是数据库的物理存储结构的描述,包括数据的物理位置、存储方式、索引结构等。它与数据库的硬件和操作系统紧密相关。
- 概念模式:也称为全局模式或逻辑模式,它描述了整个数据库的逻辑结构,包括所有数据元素的逻辑关系、数据类型、数据约束等。这是数据库设计者从整体角度看待数据库的结果。
- 外模式:也称为子模式或用户模式,它是从用户的角度看到的数据库的局部逻辑结构。每个用户可能只关心数据库中的部分数据,外模式就反映了这部分数据及其结构。因此,外模式是与特定用户相关的。
考虑到上述三种模式的定义和目的:
内模式主要关注数据的物理存储,与用户对数据的规定无直接关系。
概念模式虽然描述了整个数据库的逻辑结构,但它不是从特定用户的角度出发的。
外模式是从用户的角度描述的,它反映了用户对数据的需求和规定。
因此,最符合题目要求的答案是外模式。
至于“设计模式”,它并不是数据库设计中的一个标准术语,所以不应作为此题的答案。
4
面向对象方法中,继承是指
A. 一组对象所具有的相似性质
B. 一个对象具有另一个对象的性质
C. 各对象之间的共同性质
D. 类之间共享属性和操作的机制
在面向对象方法中,继承的核心概念是类之间共享属性和操作,因此最准确的答案是:D
虽然选项 B 描述了一种特性,但 D 更清晰地表达了继承的机制。
5
下面描述中,不属于软件危机表现的是
A. 软件过程不规范
B. 软件开发生产率低
C. 软件质量难以控制
D. 软件成本不断提高
在提供的选项中,不属于软件危机表现的是:A
软件危机通常与软件开发的效率、成本和质量等问题相关,而“软件过程不规范”虽然可能是导致软件危机的一个因素,但不直接描述软件危机的表现。其他选项(B、C、D)则直接反映了软件开发中的危机状态。
6
软件测试的目的是
A. 评估软件可靠性
B. 发现并改正程序中的错误
C. 改正程序中的错误
D. 发现程序中的错误
正确答案是:D.
解析:软件测试是一个旨在找出软件缺陷或错误的过程。它帮助确保软件产品能够满足业务需求,并且在发布前达到预期的质量标准。虽然通过测试可以间接地评估软件的可靠性(选项A),并且测试过程中发现的问题通常会反馈给开发团队进行修正,但“改正错误”(选项B和C)实际上是软件调试
阶段的任务,而不是测试直接的目标。测试人员的主要职责是识别问题所在,而修复这些问题是开发者的工作。
明天开考,加油!