浅记c语言二级考试的那些坑

首先想说一下二级考试的做题顺序。因为二级考试的特点是选择题一旦提交,就不可更改。所以我的建议是先做大题,另外,如果大题不会做,或者最后一道大题如果做不出来,事实上是很难通过的(因为选择题才40分),所以如果最后一道题没有思路的话,可以拍拍屁股就走了 。哈哈哈哈,开玩笑的。而且如果想拿90+的话,也是要先写大题(大牛除外),一般情况下,如果题目会写的话,时间是充分的,确保大题全部对了,用剩下的时间就可以全部用在选择题上了,这样可以充分利用时间。
还有一点要注意,当抽到题目后,要做的第一件事就是把大题对应的文件夹给复制一下,放到其他位置,避免由于自己的误操作,把题目做的面目全非,这样就不好了。

这里是分割线



1.二叉树
n0=n2+1;
n0+n1+n2=总数

2.关系
自然联接是去掉重复属性的等值联接。

投影是从列中进行选择的运算。提供了垂直调整关系的手段。投影也是单目运算,该运算从表中选出指定的属性值组成一个新表,记为:ΠA(R)。
其中A是属性名(即列名)表,R是表名。

笛卡尔积:两个集合X和Y的笛卡儿积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

选择:从关系中找出满足给定条件的元组的操作
选择和投影均是对单个关系进行,不是俩个关系之间的运算。

3.sizeof
用于测基本类型和数组的长度
数组的sizeof值等于数组所占用的内存字节数
char a1[] = “abc”; int a2[3]; sizeof( a1 ); // 结果为4,字符末尾还存在一个NULL终止符
sizeof( a2 ); // 结果为3*4=12(依赖于int)

关于strlen:用于计算字符串的长度,但是不包括‘\0’

4.算法
算法的时间复杂度是用算法执行的基本运算次数来度量的
程序本身所占得的存储空间,算法执行过程中所需要的额外空间。
算法的控制结构在具体实现中影响程序执行时间,与算法复杂度无关。

5.需求分析

这里写图片描述

6.数据库
这里写图片描述

7.用户标示符
注意scanf可以用作标示符,条件是不包含stdio.h头文件

8.格式化输出
宽度指示符:指定数据的最小字宽长度,若实际位数大于定义的宽度,则按实际位数;若实际小于定义 ,则数据右对齐,左边加空格。
精度指示符:m.n对于浮点数,m表示数据占得总宽度。n表示小数的位数,当输出数据的小数位数大于n时,截去右边的,并四舍五入。当大于的时候,右边加0,其中m可以省略。
标志:-输出结果左对齐,右边不空格

9:数据类型
只有10进制才有负数。
用指数表示一个常量时,e后面应该是整数不能是小数。

10.break和continue
break用于switch和循环中。用在switch中表示跳出改switch语句。
用在循环时表示终止该循环,直接跳出改循环。
continue用在循环中表示终止本次循环,进行下一次循环的判断。

11.关于++i和i++
在for循环中是没有区别的如
for(i=0;i<4;i++)
和for(i=0;i<4;++i)
(i++,2*i)和(++i,2*i)的值一样。
但是在while(i++)和while(++i)中对结果是有影响的。

12.栈和队,链表
栈是先进后出的
栈是用指针来指示的
队列有队头和队尾俩个指针,但是仍然属于线性结构。
循环队列是队列的一种顺序存储结构
在线性链表进行插入与删除时,不需要移动表中的元素,只需要改变节点的指针域即可。

这里写图片描述

13.数据结构
这里写图片描述
一个非空的数据结构如果满足:有且只有一个根结点;每一个结点最多只有一个前件,也最多只有一个后件,则称为线性结构。否则成为非线性结构。

14
这里写图片描述

15.关于scanf和printf(记得看下书,关于scanf和printf)
printf(“%c”,”a”); 结果什么也没有。
格式化输出的时候,小数点占用的位数也算一位。

scanf当指定了数据的长度的时候,多余的部分将被截去,并且当指定宽度的时候,只能用整数而不能是实数,比如scanf(“%5.2”,&a);这种写法是错误的。

16.sizeof和strlen的区别
char str[20]=”0123456789”;
int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0’为字符串结束标记。
int b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响

17.变量的作用域
局部变量
全局变量:作用域是全局,但是会被局部变量屏蔽
auto:函数中的动态变量,动态分配存储空间,只有调用时,才会分配存储空间,调用结束后就会释放这些存储空间。
static变量:整个程序运行期间只会被初始化一次。即使退出定义它的某个函数,但是下次进入这个函数时,还是会使用被修改的值。而且如果不赋值,会被自动赋值。

18.
需求分析阶段的工作:需求获取,需求分析,编写需求规格说明书,需求评审。
需求分析阶段可以使用的工具为DFD图,数据字典dd,判定树与判定表。
n-s图:清晰明确地表示程序的运行过程
DFD图:数据流图是结构化分析方法中使用的工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型
PAD图:用来表示程序的控制流,是在详细设计过程用到的。
数据流图是一种功能模型,是在可行性研究阶段用到的。
这里写图片描述

19.关于逗号表达式:一定要注意有没有括号
a=++x,2*x; 和 a=(++x,2*x);是不一样的

20.关于switch和case
switch和case里面只能是整数,不能是是其他类型的数字

21.指针与数组
指针变量是变量,数组名是常量。
存放字符串的方法有字符数组和指针变量。

22.关于结构体和共用体
不能讲结构体变量作为一个整体输出,应该分别输出
对结构体变量进行赋值的时候要也别注意,eg:boy.name=”Li Ping”(*)
正确的方法是strcpy(boy.name,”Li Ping”)。
结构体指针变量(*pstu).num一定要记住加括号。
三种等价形式:结构体变量名.成员名
(*结构体指针变量).成员名
结构体指针变量->成员名
上面太过于抽象,eg:struct stu{
int num;
}boy,*pstu;则
boy.num<==>(*pstu).num<==>pstu->num

共用体和结构体定义差不多,主要目的是节省存储空间。
Struct与Union主要有以下区别:
1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。
2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的。

23.枚举类型
枚举类型是一种基本数据类型。

24.链表(ps:上次太浪了,没看,挂了,这次好好看)

创建链表
有俩个指针域的链表有可能是双向链表,也有可能是二叉链表。
循环链表,在单向第一个节点前增加一个头结点,最后一个节点不在指向NULL,而指向头结点,这样的链表就是循环链表。
循环队列是队列的一种顺序存储结构。
循环链表与循环队列是俩种存储结构,
双向链表节点有俩个指针域,指向前一个节点的指针,指向后一个节点的指针,带链的栈是单链表形式。

25.define和typedef的区别
关键字typedef在编译阶段有效,由于是在编译阶段
define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

26.关于null和NULL
在c语言中只有NULL,不能使用null,或者会出现
error C2065: ‘null’ : undeclared identifier的错误。

26.关于变量的初始化
看Thinking in java 的时候,提到C
和c++的最大的毛病是变量不一定被正确的初始化,当时不以为意,但是今天终于体会到了,不多说了,上代码
这里写图片描述

由于没有对*a和*c 进行初始化,得到的结果是这样的。这里写图片描述
当时就蒙蔽了,检查过后才发现原因。变量没有正确的被初始化。

27.关于数据库
数据库系统(DBS)包括数据库(DB)和数据库管理系统(DBMS)。
外模式
外模式又称子模式或用户模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图。外模式反映了数据库的用户观。
概念模式
模式又称概念模式或逻辑模式,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。反映了数据库系统的整体观。
内模式
内模式又称存储模式,对应于物理级,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。它是数据库的存储观。

28、关于二维数组
如果定义二维数组的时候第一维的长度没有指定,则定义的时候需要完成初始化,否则不知道分配多大的内存空间给他。

29.关于字符串的定义
如果用字符数组进行定义,只能在定义的时候进行赋值eg char a[]=”hello”
,否则只能对数组元素逐个赋值,如果逐个赋值,一定要包含’\0’
eg:char s[];s=”hello”(*)
char s[];s={‘h’,’t’,’y’}(*)
char s[];s={‘h’,’t’,’y’,’\0’}(对)

30.文件的读写
fwrite函数,调用格式fwrite(buffer,size,count,fp),其中buffer是一个内存区域的首地址,size是每次读入的字节数,count是要读写的次数,fp是文件指针。
fgets函数fgets(字符数组名,n,文件指针),,表示从文件中读取不超过n-1个字符串到字符数组中,最后一个是‘\0’

31.注意3/6=0不是0.5

32.实体完整约束要求关系的主键中属性值不能为空值。

33软件危机
软件需求增长得不到满足
   软件生产高成本,价格昂贵。
   软件生产进度违法控制。
   软件需求定义不准确,易偏离用户需求。
   软件质量不易保证。
   软件可维护性差。
注意软件过程不规范不属于软件危机的体现。

34.c语言中没有逻辑类型

35.关于形参和实参
形参和实参占用不同的存储单元。

36.关于运算符的优先级
初等运算符(自左向右)>单目运算符(自右向左)>算术运算符(自左向右)>关系运算符>逻辑运算符(不含!)>条件运算符>赋值运算符>逗号运算符。

36.关于运算符
按位亦或运算^ 俩位相同是0,不同是1

猜你喜欢

转载自blog.csdn.net/hjshpu/article/details/50909354