计算机二级(C语言)已过
非线性结构:树、图
链表和队列的结构特性不一样,链表可以在任何位置插入、删除,而队列只能在队尾入队、队头出队
对长度为n的线性表排序、在最坏情况下时间复杂度,二分查找为O(log2n),顺序查找为O(n),哈希查找为O(1)
最坏情况下堆排序的时间复杂度最低;
层数/深度为n的满二叉树,节点个数为2^n -1
C语言的数值表示中,e/E后面必须是整数,前面必须有底数
静态变量只初始化一次
对任何一颗二叉树,度为0的结点(即叶子结点)总是比度为2的结点多一个
结构化程序的三种基本控制结构:顺序、选择和重复
数据库管理系统为完成主要功能提供了相应的数据语言,它们是:数据定义语言,该语言负责数据的模式定义与数据的物理存取构建;数据操纵语言,该语言负责数据的操纵,包括查询与增、删、改等操作;数据控制语言,该语言负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。
%md指输出带符号的十进制整数,给定最小宽度为m位,不足m位左端补空格,超过m位按实际位数输出,%.nf表示以小数形式输出实数,小数占n位,四舍五入到n位
数组元素a[i][j]可表示为*(a[i]+j)
如果在定义函数之后,定义的变量,该变量不能被之前的函数访问
循环队列的元素个数:(rear-front+m)%m---------------------m为队列长度
堆栈的元素个数:(bottom-top+1)或(后栈顶-前栈顶)
关系模式中只有一种元素-------------------关系
关键字是指被C语言保留的,不能用作其他用途的一些标识符,它们在程序中都代表着固定的含义,用户不可重新定义。预定义标识符是系统已经有过定义的标识符,用户可以重新定义,可以作为变量名。scanf为库函数名,属于预定义标识符,可以被用户重定义case为关键字,是选择结构switch语句中的关键字,不可被用户重定义
表达式不能被赋值 如:a+b=c
在类型转换过程中,如果较高类型转换成较低类型,直接忽略多余位数。
所有类型的指针变量都是地址,所占字节数均为4
%s控制符用于输出字符串,输出时从给定地址开始依次输出字符,直到遇到’\0’结束。给字符变量赋值0,相当于赋值’\0’。
带参数的宏定义不是进行简单的字符串替换,而是要进行参数替换。例如:#define D(x) 4x+1; D(i+j)=4i+j+1
strcpy 的作用是将源字符串 src(包括字符串的结束符 \0)复制到目标字符串 dest 中。
对任何一棵二叉树,度为0的节点(即叶子节点)总是比度为2的节点多一个。
软件工程包含3个要素:方法、工具和过程。
在 C 语言中,return a = b; 返回的是 赋值操作完成后的结果。而a=b++是先赋值再自加
在 C 语言中,数组不能直接通过赋值操作符 = 来赋值。数组的赋值必须通过逐个元素赋值,或者使用函数(如 strcpy)。
在 C 语言中,声明数组时必须指定大小(除非是初始化时使用字符串字面量)。未指定大小的数组声明是非法的。
\后跟一个字符构成转义字符也可以是八进制或十六进制数字
字符实例的一般形式是用一对单引号括起来的一个字符。
实体完整性约束:不能有空值
参照完整性约束:要么为空值,要么必须和原表一样
定义指针必须初始化(指向某一变量、分配内存或置为NULL)
p++不管怎么样都是先返回p的值进行外部运算再自增
指针指向结构体变量用 ->
变量指向结构体变量用 .
强制类型转换数据类型需要用()括起来
整形数组空位自动赋值0、字符数组空位自动赋值\0
主键是最小可以唯一标识关系的属性集
关键字是指被C语言保留的,不能用作其他用途的标识符
||语句左边的条件成立就不会执行右边的语句了
指针变量存储的是地址值,所有地址值所占的字节都是一样的
含指针的题目:注意变化的是指针还是指针指向的变量
&只能对变量取地址,不能对常量取地址
一个字符占8位
具体使用动态库还是静态库是编译时决定的不是预编译的作用
strcopy(int* p,“aaa”)是将aaa赋值给p所指向的内存区域中
C语言语句中,若存在未被使用的量,则在转化成机器指令时会被优化掉
符号常量(通过#define预处理器指令定义的常量)
符号常量除在预编译阶段可多次重新定义,其余地方都不能重新定义
例:
#define PI 3.14
#define PI 3.14159
有些算法是理论可行的,所以不能说的太绝对
变量是值可以改变的量,其所占有的内存空间不能随意改变
函数体必须由{开始 C程序执行必须由main语句开始
反斜杠 \ 后面跟随的数字可以表示八进制数,但仅限于1到3位的八进制数字
形参不能是常量
地址不能乘除运算
C语言中,函数名是一个指针,是函数的入口地址
对于一个空指针,必须先给它分配内存再读取数据
运算符[]内的数据类型只能是int和char
自然连接:两关系间的公共域相等值连接
操作系统的四项主要功能:进程管理、存储管理、设备管理、文件管理
指令寄存器用于暂存当前正在执行的指令
一个指令执行包括取指令、存储器读、存储器写等一系列工作,每一项工作占用一个机器周期。一个指令执行完成占用一个指令周期。故一个指令周期包含n个机器周期
当定义多个变量赋同一个值时,不能用等式连写的方式
C源程序中不能表示的数制是二进制(除非用特定的编译器扩展)
逗号表达式(v1,v2,v3)的值为最后一个参数(v3)
宏名一般习惯用大写字母表示,以便与变量名相区别;
if…else语句默认else语句总是与它上面最接近的if配对
函数不需要传参数时,()内要明确定义void否则编译器不会识别是否传入参数到该函数
软件测试的实施步骤是单元测试、集成测试、确认测试
指针类型是由指针所指向的地址所存放的数据类型决定
数据交换顺序必须"一前一后"顺序不能变
异或运算:相同为0、相异为1
通常数据存储以小端字节序存储
算法的目的是为了求解,即输出。没有输出的算法是没有意义的;
形参的值不能传给实参,只能通过直接改变实参的值来改变实参;
extern、register、static、auto分别是定义外部变量、寄存器变量、静态变量、自动变量‘其中自动变量和寄存器变量属于动态存储,调用时分配临时单元;
free(q);释放的是q所指的动态分配的内存空间;
标准输入输出中用文件指针FILE;文件描述符是系统提供的IO接口;
请求分页式管理是动态内存管理的一种,它将经常反复执行和调用的工作区部分存储起来;
标准输入输出#include <stdio.h> 有缓存机制
统一输入输出#include <unistd.h> 无缓存机制,直接参与系统调用
int x = (a = 5, b = a + 1, b * 2);//像这样逗号表达式中出现多余的逗号是不合法的;
while(){循环体} 条件表达式比循环体执行多一次
do{循环体}while() 循环体和条件表达式的执行次数一样
网络字节序是大端字节序;主机字节序取决于计算机硬件架构;
实参和形参的类型应相同或赋值兼容,整形数据和字符型数据可以通用
赋值语句中未定义量只能有最左边的一个
快速排序每经过一次元素的交换会产生新的逆序
strcmp(char *s1,cahr *s2);功能:比较字符串s1,s2的大小,s1==s2时返回0,s1>s2时返回值>0,s1<s2时,返回值<0;
sizeof函数取到的字符串长度是包括字符串结束标志’\0‘
strlen是计算以“\0”结束的字符串的长度的函数,函数值为字符串的实际长度,不包括“\0”
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用;在调用f1函数过程中要调用f2函数,而在调用f2函数的过程中又要调用f1函数是间接调用;
软件调试的任务是诊断和改正程序中的错误
黑盒测试的主要方法有:等价类划分法、边界值分析法、错误推测法、因果图等,主要用于软件确认测试
在C语言中,不能直接将一个字符串数组赋值给另一个字符串数组。因为字符串在C语言中是以字符数组的形式存储的,数组的赋值不能直接通过简单的赋值语句完成。
字符型数组并不限定最后一个元素必须是‘’\0‘字符
字符串数组,是指数组中的每一个元素都是一个存放字符串的一维数组
在函数内部或复合语句内部定义的变量,均称为局部变量;
当你定义一个数组时,数组的内存地址在定义时就已经确定了。故,只能改变其变量值不能改变其地址值;
在C程序中函数可以直接或间接的自己调用自己,称为递归调用;递归必须要有一个明确的结束递归条件;
若循环中修改了全局变量的值,则全局变量的值会被更新,且会保留到下次循环中;
只有在做投影操作时,其结果的列数可能小于原表中的列数
软件设计中常用的过程设计工具有:图形工具:程序流程图、N—S图,PADHIPO图;表格工具:判定表 语言工具:PDL(伪码)
数据库是有结构的数据的集合
函数声明必须在函数调用之前,这样编译器才能正确解析函数调用。
函数声明可以在文件的任何地方,只要它在函数调用之前。
函数声明通常放在头文件中,通过 #include 引入到需要使用该函数的文件中。
如果函数声明在函数调用之后,会导致编译错误或警告。
在C语言中,如果出现下标越界的情况,系统不管在编译还是执行时都不会给出“下标越界”的错误提示
如果关系模式R中的某个属性集不是R的主键,而是另一个关系R1的主键,则该属性集是关系模式R的外键;外键是本关系表与其他关系表的联系;
如果一个关系表的主键由多个属性组成(即复合主键),某个非主属性只依赖于主键的一部分,而不是整个主键,那么这种依赖关系就被称为部分依赖。
在C语言中,类型转换是指将一个数据类型转换为另一个数据类型。虽然C语言允许很多类型的隐式转换和显式转换,但某些类型转换是无效的,可能会导致编译错误、运行时错误或未定义行为。以下是一些常见的无效类型转换情况:
1. 不兼容的类型赋值
- 问题:将一个类型直接赋值给不兼容的类型,而没有进行显式转换。
- 示例:
int a = 10; char c = a; // 错误:int 转换为 char 可能导致数据丢失,需要显式转换
- 解决方法:使用显式类型转换。
char c = (char)a; // 显式转换
2. 指针类型不匹配
- 问题:将一种指针类型赋值给另一种指针类型,而没有进行显式转换。
- 示例:
int* p1; char* p2 = p1; // 错误:int* 和 char* 不兼容
- 解决方法:使用显式类型转换。
char* p2 = (char*)p1; // 显式转换
- 注意:虽然显式转换可以解决编译错误,但这种转换可能会导致运行时错误,特别是当指针指向的内存大小不一致时。
3. 从指针到整数的转换
- 问题:将指针类型直接赋值给整数类型,而没有进行显式转换。
- 示例:
int* p = NULL; int a = p; // 错误:指针不能直接赋值给整数
- 解决方法:使用显式类型转换。
int a = (int)p; // 显式转换
- 注意:这种转换通常不推荐,因为指针和整数的大小可能不同,可能导致数据丢失或未定义行为。
4. 从整数到指针的转换
- 问题:将整数类型直接赋值给指针类型,而没有进行显式转换。
- 示例:
int a = 0; int* p = a; // 错误:整数不能直接赋值给指针
- 解决方法:使用显式类型转换。
int* p = (int*)a; // 显式转换
- 注意:这种转换同样可能导致未定义行为,特别是当整数值不是有效的内存地址时。
5. 函数指针类型不匹配
- 问题:将一个函数指针赋值给另一个不兼容的函数指针类型。
- 示例:
void f1(int a) {} void (*p1)(int) = f1; // 正确 void (*p2)(char) = p1; // 错误:函数指针类型不匹配
- 解决方法:确保函数指针的类型完全匹配,或者使用兼容的类型。
void (*p2)(int) = p1; // 正确
6. 无效的联合类型转换
- 问题:联合体(union)中的成员类型不匹配,或者对联合体成员进行非法的类型转换。
- 示例:
union {int a;char b; } u; u.a = 10; int c = u.b; // 错误:u.b 是 char 类型,不能直接赋值给 int
- 解决方法:确保访问联合体成员时,类型匹配。
int c = u.a; // 正确
7. 从空指针到非空指针的转换
- 问题:将空指针(
NULL
)赋值给非空指针类型,而没有进行显式转换。 - 示例:
int* p = NULL; char* q = p; // 错误:空指针不能直接赋值给非空指针
- 解决方法:使用显式类型转换。
char* q = (char*)p; // 显式转换
8. 从非数值类型到数值类型的转换
- 问题:将非数值类型(如结构体、联合体)直接转换为数值类型。
- 示例:
struct {int a;int b; } s; int a = s; // 错误:结构体不能直接转换为整数
- 解决方法:如果需要提取结构体中的某个成员值,可以直接访问该成员。
int a = s.a; // 正确
9. 从数值类型到非数值类型的转换
- 问题:将数值类型直接转换为非数值类型(如结构体、联合体)。
- 示例:
int a = 10; struct {int x;int y; } s = a; // 错误:整数不能直接转换为结构体
- 解决方法:如果需要将数值赋值给结构体的某个成员,需要显式访问该成员。
struct {int x;int y; } s; s.x = a; // 正确
10. 从浮点数到整数的转换(可能导致精度丢失)
- 问题:将浮点数直接赋值给整数类型,可能会导致精度丢失。
- 示例:
float f = 10.5; int a = f; // 警告:浮点数到整数的转换可能导致精度丢失
- 解决方法:使用显式类型转换,并注意精度问题。
int a = (int)f; // 显式转换
总结
在C语言中,类型转换需要谨慎处理,尤其是涉及指针、函数指针、结构体等复杂类型时。为了避免无效的类型转换,建议:
1. 明确类型转换的意图。
2. 使用显式类型转换(如 `(type)`)来避免编译器警告。
3. 确保转换后的类型与目标类型兼容。
4. 避免可能导致未定义行为的类型转换,如将非法地址赋值给指针。
如果不确定类型转换是否安全,可以查阅C语言标准或使用编译器的警告选项(如 `-Wall`)来帮助发现潜在问题。
printf()函数中,当格式转换说明符个数少于输出项个数时,多余的输出项不予输出
break和continue只会影响最内层的循环即当前所在的循环;
无论是字符数组还是其他类型的数组都不能直接赋值为一个单一的字符或整数;
C语言中所有函数都有返回,void表示返回的无类型;
fopen(A)是创建文件A或若文件A已存在则清空A再进行操作;
->的优先级大于++;
左值是指一个可以出现在赋值运算符左边的表达式,它表示一个存储位置(memory location),可以被赋值或访问。
右值是指一个不能出现在赋值运算符左边的表达式,它表示一个值,而不是一个存储位置。右值通常是一个临时值,不能被取地址或赋值。
依赖是后者依赖于前者
在树中,结点数为树中所有结点的度之和再加1;
逗号表达式返回逗号后面的值,但逗号表达式都会从左到右依次运算;
()------------------------函数调用标识符
实型常量有小数形式和指数形式;
scanf和printf是C语言提供的输入输出函数;
printf输出的数据都隐含右对齐
预定义的标识符是C语言标识符的一种
在C程序中的八进制和十六进制是整型;
printf函数和scanf函数都可以指定输入数据的宽度
c语言中,位运算符和取模运算符运算对象必须是整型数
sizeof()是一种标识符不是函数,其返回值决定了它是一种什么类型的表达式;
关系数据库规范化的目的是为了解决关系数据库中的插入,删除异常及数据冗余问题
第一范式要求数据库表中的每一列都是不可再分的基本数据项
第二范式要求在满足第一范式的基础上,表中的每个非主属性必须完全依赖于主键,而不能部分依赖于主键。也就是说,不能存在仅依赖于主键一部分的非主属性。
第三范式非主键必须直接依赖于主键,不能存在传递依赖;
在C语言中,%md 是一种格式化输出的格式说明符,用于控制整数的输出宽度。这里的 m 是一个整数,表示输出的最小宽度
宏定义#define 可以给任何数据定义但不会对其进行检查
类型重定义typedef只能给变量类型重新定义但会对变量类型进行检查,故更加安全;重命名后原名字仍可用