当前位置:文档之家› C语言深度剖析读书笔记

C语言深度剖析读书笔记

C语言深度剖析读书笔记
C语言深度剖析读书笔记

1、定义:所谓定义就是(编译器)创建一个对象,为这个对象分

配一块内存并取上一个名字,这个名字就是我们经常说的变量

名或对象名。一个变量在一定的区域(比如函数内,全局等)

只能定义一次。

2、声明:

(1)告诉编译器,这个名字已经匹配到令一块内存上了,下面的代码所用到的变量或对象是别的地方定义的。

(2)告诉编译器,这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名。

3、定义和声明的区别:定义创建了对象并为这个对象分配了内存,

声明并没有分配内存。

4、Register修饰符的限制:register变量必须是能被CPU寄存器所

接受的类型。意味着register变量必须是一个单个的值,并且其

长度应小于或等于整型的长度。而且register变量可能不存放在

内存中,所以不能用取地址运算符“&”来获取register变量地

址。

5、Static的作用:

(1)修饰全局变量:静态全局变量的作用域仅限于变量被定义的文件中,其它文件中即使用extern声明也没办法使用它。准

确的说作用域是从定义之处开始,到文件结尾处结束,在定

义之前的那些代码页不能使用它,要想使用,就要要在前面

加extern ***。要避免这种问题,直接在文件顶端定义就行

了。(修饰全局变量,实际上是改变了该变量的链接属性)(2)修饰局部变量:静态局部变量,在函数体内定义的,就只能在这个函数里使用了,同一个文件中的其它函数也用不了。

由于被static修饰的变量总是存在内存的静态区,所以即使

这个函数运行结束,这个静态变量也不会被销毁,函数下次

使用时仍然能使用到这个值。(修饰局部变量时,实际上是

修改了该变量的存储属性)

(3)修饰函数:函数前加static使得函数成为静态函数。该函数的作用域被局限在本文件中(又成为内部函数)。(修饰函数

时,实际上是修改了该函数的链接属性)

6、数据类型:数据类型的作用就像大小不同的模子,在内存上根

据模子的大小(类型)刻出固定大小(类型)的一块块内存。

7、变量的命名规则:

(1)较长的单词,去掉“元音”形成缩写。

(2)标识符由多个单词构成时,每个单词的第一个字母大写,其余全小写。

(3)尽量避免名字中出现数字编号,除非逻辑上的确实需要编号。如驱动开发时为管脚命名,非编号名字反而不好。

(4)多个文件之间共同使用全局变量或函数要加范围限定符(建议使用模块名(缩写)作为范围限定符)。(GUI_,etc)(5)含义标志命名规则,变量名使用名词数组,函数名使用动词数组

(6)程序中不得出现仅靠大小写区分的相似的标识符。

(7)一个函数名禁止被用于其它之处。

(8)所以宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词。

(9)考虑到习惯问题,局部变量中可采用通用的命名方式,仅限于n,i,j等作为循环变量使用。一般说,习惯上用n,m,i,j,k

等作为int类型变量;c,ch等作为字符型变量;a等表示数

组;p等表示指针。当然这仅仅是一般习惯,除了使用i,j,

k等可以用来表示循环变量外,别的字符变量名尽量不要使

用。

(10)定义变量的时候不要忘了初始化。定义变量时编译器并不一定清空了这块内存,它的值可能是无效数据。

(11)不同类型的数据之间运算要注意精度扩展问题,一般低精度向高精度数据扩展。

8、sizeof :sizeof是关键字,而不是函数。Sizeof在计算变量所占

的内存空间大小时,括号可以省略,而计算类型(模子)大小

时不能被省略。一般情况下不要省略,加上括号,继续当做一

个“函数”来使用。

9、计算机中数据存储:计算机系统中,数值一律用补码来表示(存

储)。主要原因是使用补码,可以将符号位和其它位统一处理;

同时,减法也可以按加法来处理。另外,两个用补码表示的数

相加时,如果最高位(符号位)有进位(向符号位的进位?),

则进位被舍弃。正数的补码与其原码一致;负数的补码:符号

位为1,其余位为该数绝对值的原码按位取反,然后整个数加1。

(-1的补码为0xff)

10、Bool变量与“零值”进行比较:不要写成if(bFlag==0),会给

人一种bFlag是整型的感觉。写成if (bFlag==FALSE);或者写成

if(bFlag==TRUE),也不好。因为,FALSE的值在编译器中被定

义为0;但TRUE在Visual C++中定义为1,而在Visual Basic

中TRUE定义为-1。而写成if(bFlag);或者if(!bFlag);就比较好,该种写法既不会引起误会,也不会由于TRUE或者FALSE的不

同定义值而出错。以后写代码就要这样写。

11、Float 变量与“零值”进行比较:不能写成if(fVal==0.0),要写

成if((fVal>=-EPSINON)&&( fVal<=EPSINON)); //EPSINON

为定义好的精度

12、指针变量与“零值”进行比较

定义指针:int *p = NULL; //定义指针一定要初始化

写成if (p==0)或者if (p !=0),这样不好,给人一种p是整型的感

写成if(p)或者if(!p),这样也不好,给人一种p是布尔型的感觉

写成if(NULL==p)或者if(NULL!=P),这样比较好,把NULL

写在前面是为了避免少写个“=”时,编译器会提示错误。13、if语句有的分号:if();后的分号常常会由于误加而造成编译

器检查不出的错误,如果if()后确实需要一个空语句,写成

NULL;比较好。

14、每个case语句的结尾绝对不要忘了加break,否则将导致多个

分支重叠(除非是有意使用多个分支重叠)。

15、最后必须使用default分支。即使程序真的不需要default处理,

也应该保留语句:

default:

break;

这样做不是画蛇添足,可以避免让人误认为你忘了default处理。

16、case关键字后面的值的要求:case后面只能是整型或者字符型

的常量或者表达式。

17、case语句的排列顺序:正常情况放在前面,而把异常情况放在

后面。如果有多个正常情况和异常情况,把正常情况放在前面,并做好注释;把异常情况放在后面,同样要做注释。

18、break 和continue 的区别:break 关键字很重要,表示终止本

层循环。Continue表示终止本次循环,进入下一轮循环。

19、在多重循环中,如果有可能,应将最长的循环放在最内层,最

短的循环放在最外层,减少CPU跨切循环层的次数,从而提高

效率。

20、不能再循环体内修改循环变量,防止循环失控。例如:

For(n=0;n<10;n++)

{

……

n = 8; //不可,可能违背了你的意愿

}

21、一般不要使用goto关键字:一般来说,编码的水平与goto语句

使用的次数成反比。由于goto语句可以灵活的跳转,如果不加

限制,它的确会破坏结构化设计风格;其次,goto语句经常带

来错误或者隐患。它可能跳过了变量的初始化、重要的计算语

句。所以,一般不要使用goto语句,乃至禁用。

22、void关键字:void的字面意思是“空类型”,void* 则为“空类

型指针”,void*可以指向任何类型的数据。void 几乎只有“注

释”和限制程序的作用,因为从来没有人会定义一个void变量。

事实上,如果定义如下:void a ;编译会报错,即使不报错,

它也没有任何实际意义。

void 真正发挥作用在于:

(1)对函数返回的限定

(2)对函数参数的限定

众所周知,如果指针p1和p2的类型相同,那么我们可以把平p1和p2相互赋值,如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换成左边的指针类型。

而void*则不同,任何类型的指针都可以直接赋值给它,无需强制类型转换,如:

void *P1;

int *p2;

p1=p2;

但这不意味着,void*也可以无需强制类型转换地赋给其它类型的指针。因为“空类型”可以包容“有类型”,但“有类型”并不能包容“空类型”。所以,下面的语句编译会报错,

P2=p1;//把空类型赋给了int型

23、如果函数没有返回值,则应该声明为void类型,在C语言中,

凡是不加返回类型的函数,就被编译器作为返回整型值处理。

24、如果函数无参数,应该声明其参数为void。在C语言中,可以

给无参数函数传送任意类型的参数,但在c++中,函数参数为void的意思是这个函数不接受任何参数。如果在调用这个函数的时候,是有参数的,那么编译器会报错。无论在C还是在C++中,若函数不接受任何参数,一定要声明参数为void。

25、ANSI(American National Standards Institute)标准,不能对

void指针进行算法操作,即一下操作都是不合法的:

void * pvoid;

pvoid++;//ANSI:错误

pvoid += 1;//ANSI:错误

ANSI标准之所以这样认定,是因为它坚持:进行算法操作指针必须是确定知道其指向数据类型大小的。

例如:

int *pint;

pint++;//ANSI:正确

但是在大名鼎鼎的GNU(GNU’s Not Unix)则不这么认定,它

指定void*的算法操作与char*一致。因此,

void * pvoid;

pvoid++;//GNU:正确

pvoid += 1;//GNU:正确

在实际程序设计中,为了增强可移植性,可以这样编写:

void * pvoid;

(char*)pvoid++;//ANSI:正确;GNU:正确

(char*)pvoid += 1;//ANSI:正确;GNU:正确26、void不能代表一个真是的变量:因为定义变量时要必须分配内

存空间,定义void类型变量,编译器到底分配多大的内存呢。

下面的代码企图让void代表一个真是的变量,因此都是错误的:void a;//错误

function(void a);//错误

void 的出现只是为了一种抽象的需要,如果你正确的理解了面

向对象中“抽象基类”的概念,也很容易理解void数据类型。

正如不能给抽象基类定义一个实例,我们也不能定义一个void

(让我们类比的成void为“抽象数据类型”)变量。

27、return 关键字:return用来终止一个函数,并返回其后面跟着的

值。Return (Val);//此括号可以省略。但是一般不省略,

尤其是在返回一个表达式的值时。

28、return语句不能返回指向“栈内存”的“指针”,因为该内存在

函数体结束时被自动销毁。例如:

char * Func(void)

{

char str[30];

return str;

}

str 属于局部变量,位于栈内存中,在Func结束的时候被释放,所以,返回str将导致错误。

29、const 关键字:const是constant的缩写,是恒定不变的意思,

也翻译为常量、常数等。所以,很多人认为const修饰的值是

常量。这是不准确的,精确的说,应该是只读变量,其值在编

译时不能被使用,因为编译器在编译时不知道其存储内容。或

许当初这个关键字应该被替换为readonly。

Const推出的初始目,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

(1)定义const只读变量,具有不可变性。

例如;

const int Max = 100;

int Array [Max];

在Visual C++6.0中分别创建.c文件和.cpp文件测试。.c文件中编译会报错,而在.cpp文件中则顺利进行。为什么呢?我们

知道定义一个数组必须指定其元素个数。这也从侧面正是了C语言中,const修饰的Max仍然是变量,只不过是只读属性罢了;而在C++中,扩展了const的含义,这里不再讨论。

(2)c onst修饰的变量必须在定义的同时初始化。

(3)节省空间,避免不必要的内存分配,同时提高效率编译器通常不为普通的const只读变量分配存储空间,而是

将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。

例如:

#define M 3 //宏常量

const int N = 5;//此时并未将N放入内存中

……

int i = N; //此时为N分配内存,以后不再分配

int I = M;//预编译期间进行宏替换,分配内存

int j = N ;//没有分配内存

int J = M;//再进行宏替换,又一次分配内存

const与#define的区别:

(a)const 定义的只读变量从汇编角度来看,只是给出了对

应的内存地址,而不是像#define 一样给出的是立即数,所

以,const定义的只读变量在程序运行过程中只有一份拷贝

(因为它是全局的只读变量,存放在静态区),而#define定

义的宏变量在内存中有若干个拷贝。#define宏是在预编译

阶段进行替换,而const修饰的只读变量是在编译的时候确

定其值。

(b)#define 宏没有类型,而const修饰的只读变量具有特

定的类型。

(4)const修饰函数参数

Const可以修饰函数的参数,当不希望这个参数值被函数体

内意外改变时使用。例如:

void Fun(const int i);

告诉编译器i在函数体中不能改变,从而防止了使用者的一

些无意的或者错误的修改。

(4)c onst修饰符也可以修饰函数的返回值,返回值不可被改变。

例如:

const int Fun(void);

(5)在另一连接文件中引用const只读变量:

extern const int i;//正确的声明

extern const int j = 10;//错误!只读变量的值不能改变。

30、关键字volatile

volatile关键字和const关键字一样是一种类型修饰符,用它修

饰的变量表示可以被某些编译器未知的因素改变,不如操作系

统、硬件、或者其它线程等。遇到这个关键字声明的变量,编

译器对访问该变量的代码就不再进行优化,从而可以提供对特

殊地址的稳定访问。

volatile关键字告诉编译器,它修饰的变量是随时都可能发生变

化的,每次使用它的时候必须从内存中读出该变量的值。

31、关键字extern

extern,外面的,外来的意思。extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,下面的代码中用到

的这些变量或函数是外来的,不是本文件中定义的,提示编译

器遇到此变量和函数时,在其他模块中寻找其定义。

32、struct 关键字:struct是个神奇的关键字,它将一些相关联的数

据打包成一个整体,方便使用。平时我们要求函数的参数尽量

不要多于4个,如果函数参数多于4个使用起来非常容易出错

(包括每个参数的意义和顺序都容易弄错),效率也会降低(与

具体CPU有关,ARM芯片对超过4个参数的处理就有讲究,

具体参考相关资料)。这个时候,可以用结构体压缩参数个数。

33、空结构体的大小:空结构体的大小是1而不是0。编译器认为

任何一个结构体都是有大小的,哪怕这个结构体为空。万一结

构体真的为空,那它的大小为多少合适呢?编译器认为你构造

一个结构体数据类型是用来打包一些数据成员的,而最小的数

据成员需要1个byte,编译器为每个结构体类型数据至少预留

1个byte的空间,所以,空结构体的大小就定位1个byte。34、柔性数组(flexible array)

C99中,结构体中的最后一个元素允许是未知大小的数组,这

就叫做柔性数组成员,但结构体中柔性数组成员前面必须至少

一个其他成员。Sizeoff返回的这种结构体大小不包括柔性数组的内存。包含柔性数组成员的结构体用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。

柔性数组的使用:

typedef struct st_type

{

int i;

int a[0];

}type_a;

有些编译器可能会报错,可以写成下面的形式:

typedef struct st_type

{

int i;

int a[];

}type_a;

这样我们就可以定义一个可变长的结构体,用sizeof(type_a)得到的只有4,就是sizeof(i)= sizeof(int)。那0个数组元素的数组没有占用空间,而后我们可以进行变长操作了。通过如下表达式给结构体分配内存:

type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));

这样我们就为结构体指针p分配了一块内存。用p->item[n]就可

以简单地访问可变长元素。但是这个时候,我们再用sizeof(*p)

测试结构体的大小,发现仍然为4。是不是很诡异?我们不是

给这个数组分配了空间吗?

别急,先回忆一下我们讲过的“模子”。在定义这个结构体的时

候,模子的大小就已经确定不包含柔性数组的内存大小了。柔

性数组只是编外人员,不占结构体的编制。只是说在使用柔性

数组时需要把它当作结构体的一个成员,仅此而已。再说明白

点,柔性数组其实与结构体没什么关系,只是“挂羊头卖狗肉”

而已,算不得结构体的正式成员。

既然上面使用了malloc函数分配了内存,肯定就需要用free函

数来释放内存:

free(p);

35、struct和class的区别:struct的成员默认是public的而class的

成员默认是private的。很多人觉得不好记,其实很容易。你平

时见过结构体用public修饰它的成员了吗?既然struct关键字

与class关键字与可以通用,你也不要认为结构体内不能放函数

了。

36、union关键字:union维护足够的空间来置放多个数据成员中的

“一种”,而不是为每一个数据成员配置空间,union中所有成

员共用一个空间,同一时间只能存储其中一个数据成员,所有

的数据成员具有相同的起始地址。

一个union只配置一个足够大的空间来容纳最大长度的数据成

员,对于不可能在同一时间被用到的,可以使用union。

37、大小端模式:大端模式:字数据高字节存在低地址;小端模式:

字数据的高字节存储在高地址。

38、enum关键字:实际上enum type_name类型是对一个变量取值

范围的限定,而花括号内是它的范围。换括号内的成员是常量,也就是我们平时所说的枚举常量(常量一般用大写)。

39、枚举与#define宏的区别:

(1)#define宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值。

(2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量

(3)枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。

40、typedef关键字:typedef关键字被替换为typedef更为恰当。

Typedef的真正意思是给一个已经存在的数据类型(注意是数据类型,不是变量)取一个别名,而非定义一个新的数据类型。

41、对与const char * p和char const *p,在确定const修饰的是哪

个的时候,可以把char忽略,因为编译器在解析的时候,会把类型名忽略掉。

42、用typedef给结构体类型定义别名

Typedef struct sutudent

{

//code

}stu_st,*stu_pst;

该定义相当于:

把“struct student {/**/}”看成一个整体,typedef相当于给“struct student {/**/}”取了个别名“stu_st”,同时给“struct student {/**/}*”

取了个别名“stu_pst”。只不过这两个别名是同时取的而已。Const stu_pst stu3与stu_pst Const stu3;

上面两个语句中,const修饰的都是stu3所指向的对象。因为stu_pst 是一个类型整体(struct student {/**/}*)是不可拆分的,编译器在解析的时候会把类型名直接忽略掉,所以const在stu_pst前和在stu_pst之后的含义是一样的,都是修饰stu3所指向的对象。

跟普通类型的处理是一样的。

43、typedef 和#define 的区别

(1)#define INT32 int

Unsigned INT32 i = 10;

(2)typedef int INT32;

Unsigned INT32 j = 10;

(1)编译通过,(2)编译的时候报错,因为在预编译的时候INT32被替换成int,而unsigned int i = 10;这句是对的。但是,typedef 取的别名不支持这种类型扩展。

(3)#define PCHAR char*

PCHAR p3,p4;

(4)typedef char* pchar;

Pchar p1,p2;

两组代码都没问题,但是,这里的p4却不是指针,仅是一个char类型的字符。

44、注释中的几个问题:

(1)int/**/t

有人认为编译器在剔除掉注释后会变成intt,所以是错误的。编译器会将注释用空格来代替,而不是简单的剔除,所以,上面的注释是错误的。

(2)//Is it a \

Valid comment ?

这是一条合法的注释,因为“\”是一个连接符。

(3)char * s = “avcdefgh //hijklmn”;

我们知道双引号引起来的都是字符常量,那双斜杠也不例

外。这条注释是错误的。

(4)y = x/*p;

这个表达式不会被编译成x除以P指向的内存里的值。实际上编译器把/*当作是一段注释的开始,把/*后面的内容都当作注释内容,直到出现*/为止。可以改成下面两种形式:

y=x/ *p;

或者

y=x/(*p);

也就是说只要斜杠和星号直接没有空格,就会被当作注释的开始。

45、/* /*……*/ */

/**/注释不允许嵌套,因为/*总是选择与它最近的*/进行匹配,所以上面的注释是错误的。

46、汇编的注释是以分号开始的。

47、接续符合转义符:

C语言里以反斜杠(\)表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。反斜杠除了可以被用作接续符,还能被用作转义符的开始标识。

常用的转义符和其含义:

\n 回车换行

\t 横跳到下一制表位

\b 退格

\r 回车

\f 走纸换页

\\ 反斜杠符“\”

\’单引号符

\a 鸣铃

\ddd 1~3位八进制所代表的字符

\xhh 1~2位十六进制所代表的字符

48、单引号、双引号:

双引号引起来的都是字符串常量,单引号引起来的都是字符常量。字符在内存中是以ASCII码存储的,所以字符常量可以与正型常量或变量进行运算。如,’A’+1。

49、在用“<<”或“>>”进行移位运算时,移动的位数不能大于数

据的长度,否则会溢出,同时移动的位数也不能为负值。50、容易搞错的运算优先级

51、宏定义可以出现在任何地方,从本行宏定义开始后面的代码就认识这个宏了。

52、const和#define的区别

Const修饰的数据是有类型的,#define修饰的数据时没有类型的。为了安全,建议以后在定义宏常数的时候用const代替,编译器会给const修饰的只读变量作类型校验,减少错误的可能。但是,要注意const修饰的不是常量而是只读变量。Const修饰的只读变量不能用来定义数组的维数,也不能放在case语句后面。

53、字符串宏常量

#define除了用于定义宏常数之外,还经常用于定义字符串,尤其是路径。

(1)#define ENG_PT1 E:\EGLS\LS1\listen\listen_to_this_3

如果路径名太长,也可以写成:

(2)#define ENG_PT1 E:\EGLS\LS1\listen\listen_to_\

this_3

只有最后一个反斜杠是接续符,其它的都是路径符号,因为反斜杠在作为接续符时,在本行后面不能再有任何字符,空格也不行。

54、用#define定义表达式

#define SEC_A_YEAR 60*60*24*365

这个定义可能是错误的,在十六位的系统中,这样一个值赋给整型变量的时候可能会发生溢出。修改成如下表达式更保险,

#define SEC_A_YEAR (60*60*24*365)UL

55、int *p = NULL;和*p = NULL;的区别

int *p = NULL;

这时候我们可以通过编译器查看p 的值为0x00000000。这句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是int类型的数据;在定义变量p 的同时把p 的值设置为0x00000000,而不是把*p的值设置为0x00000000。这个过程叫做初始化,是在编译的时候进行的。

int *p;

数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)

数据结构基础及深入及考试 复习资料 习题及实验参考答案见附录 结论 1、数据的逻辑结构是指数据元素之间的逻辑关系。即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。 2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。它依赖于计算机。存储结构可分为4大类:顺序、链式、索引、散列 3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。它由基本的数据类型构成,并包括一组相关的服务(或称操作)。它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。 4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。 5、在数据结构中,从逻辑上可以把数据结构分成( C ) A、动态结构和表态结构 B、紧凑结构和非紧凑结构 C、线性结构和非线性结构 D、内部结构和外部结构 6、算法的时间复杂度取决于( A ) A、问题的规模 B、待处理数据的初态 C、问题的规模和待处理数据的初态 线性表 1、线性表的存储结构包括顺序存储结构和链式存储结构两种。 2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为( E ),删除一个元素需要移动的元素的个数为( A )。 A、(n-1)/2 B、n C、n+1 D、n-1 E、n/2 F、(n+1)/2 G、(n-2)/2 3、“线性表的逻辑顺序与存储顺序总是一致的。”这个结论是( B ) A、正确的 B、错误的 C、不一定,与具体的结构有关 4、线性表采用链式存储结构时,要求内存中可用存储单元的地址( D ) A、必须是连续的 B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以 5、带头结点的单链表为空的判定条件是( B ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 6、不带头结点的单链表head为空的判定条件是( A ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 7、非空的循环单链表head的尾结点P满足( C ) A、p->next==NULL B、p==NULL C、p->next==head D、p==head 8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( B ) A、O(1) B、O(n) C、O(n2) D、O(nlog2n) 9、在一个单链表中,若删除p所指结点的后继结点,则执行( A )

c语言书籍推荐计算机

C语言没学过,不好乱说,C++的话,就是: C++ primier,与C++标准最符合的一本。 其次是Absolute C++,绝对深入浅出的一本。 Thinking in C++,编程思想层面的书。 effective C++与more effective C++,一些很实用的很高级的技巧。 Algorithms in C++(算法I-IV(C++实现))算法书,在掌握了基本语法后可看。 我们老师说过,编程方面的书国内作者的最好不看,谭浩强与钱能的不推荐。 此外这几本书以及一些其他的C++书籍我都有高质量PDF电子版,中英都有,要的话可以联系偶,发信。 (一)入门: (二)《Primer》 (三)最新版本:第三版(第四版国外已上架,国内一些网上书店也在预订中) (四)适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是好事。 《The C++ Programming Language》/《C++程序设计语言》 最新版本:第三版特别版 简称T C++PL,有其他语言的丰富经验的。(也有人简称之为“TCPL”,但需与另《The C Programmer Language》区分开来) 《Essential C++》 《Accelerated C++》 这两本薄一些,都是不错的选择。《Accelerated C++》本人没有读过,从各方面的评价来看,完全值得推荐。 以上几都有相应的中文版,而且翻译的质量都不错。上面的书未必都需要读一遍,但无论如何,T C++PL 是应该阅读的。 (二)A: 这个路线侧重于语言本身

《Effective C++》 最新版本:第二版(第三版国外已上架,国内一些网上书店也在预订中) 简称EC。C++程序员必读!很多时候,我们说C++圣经不是指T C++PL,而是这一本。《The Pragmatic Programmer》一书中写到:“一旦你发现自己要参与C++项目的开发,赶快跑(不要走)到书店去购买Scott Mayer的《Effective C++》,可能还要《More Effective C++》”。 《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》/《C++编程规范》 个人认为此书应为C++程序员必备的案头书。几乎Effective系列和Exceptional系列都在这里得到了总结。最新的模版、异常的业界经验都在这里的到了体现。可能的唯一缺陷就是对一个新手而言,关于“为什么这么做”的问题,解释的不够。 我的看法是:如果你不理解其中的条款,记忆,并且照做;如果你理解其中的条款,我猜你一定会同意书中的观点。我认为这本书中的内容至少在2009年以前都不会过时,人们将广为传诵它制定的101条戒律。还不知道他的简称,也许“101”会成为一个候选者? 提到《Effective C++》,那么另外三本书一一浮出水面: 《More Effective C++》 《Exceptional C++》 《More Exceptional C++》。 新书《Exceptional C++ Style》也是值得一看的好书。 上述几本书,一本也不应该放过。 个人建议上述书籍按顺序阅读。并且,在将来反复阅读这几本书。 (三)进阶B: 这个路线侧重于程序库。 《The C++ Standard Library》/《C++标准程序库—自修教程与参考手册》 听说过STL吗?这本书会教你最基本的,也是最重要的STL的使用。这本书,应该是必读的。 《Effective STL》 会使用STL还不够,还必须知道什么时候选择什么STL组件,这是STL使用的必读书。 《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》/《泛型编程与STL》。 这本书理论性较强,但是真的很严谨,而且并不是非常难懂。理解其中对于Concept的解释,将是非常重要的。

C语言常用语句

printf函数调用的一般 printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用 printf 函数之前必须包含stdio.h文件。printf函数调用的一般形式为: printf(“格式控制字符串”, 输出表列) 其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如: “%d”表示按十进制整型输出; “%ld”表示按十进制长整型输出; “%c”表示按字符型输出等。 scanf函数的一般形式 scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为:scanf(“格式控制字符串”, 地址表列);(例如scanf("%d%d%d",&a,&b,&c) 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。例如:&a、&b分别表示变量a和变量b的地址。 这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 For语句 在C语言中,for语句使用最为灵活,它完全可以取代while 语句。它的一般形式为:for(表达式1; 表达式2; 表达式3) 语句 它的执行过程如下: 先求解表达式1。求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。求解表达式3。转回上面第2)步继续执行。循环结束,执行for语句下面的一个语句。 其执行过程可用下图表示。

C语言数据结构 串的基本操作

实验九串的基本操作 #include #include #include typedef char Status; int strlen(char *p) { int i=0; while(*p++)i++; return i; } typedef struct { char *ch; // 若是非空串,则按串长分配存储区,否则ch为NULL int length; // 串长度 }HString; // 初始化(产生空串)字符串T void InitString(HString *T) { (*T).length=0; (*T).ch=NULL; } // 生成一个其值等于串常量chars的串T Status StrAssign(HString *T, char *chars) { int i,j; if((*T).ch) free((*T).ch); // 释放T原有空间 i = strlen(chars); // 求chars 的长度i if(!i) { // chars的长度为0 (*T).ch = NULL; (*T).length = 0; } else { // chars的长度不为0 (*T).ch = (char*)malloc(i*sizeof(char)); // 分配串空间 if(!(*T).ch) // 分配串空间失败 exit(0); for(j = 0; j < i; j++) // 拷贝串 (*T).ch[j] = chars[j]; (*T).length = i; } return 1; } // 由串S复制得串T int StrCopy(HString *T,HString S) { int i; if((*T).ch) free((*T).ch); // 释放T原有空间 (*T).ch=(char*)malloc(S.lengt h*sizeof(char)); // 分配串空间if(!(*T).ch) // 分配串空间失败 exit(0); for(i=0;i

数据结构(C语言版)第三版__清华大学出版社_习题参考答案

附录习题参考答案 习题1参考答案 1.1.选择题 (1). A. (2). A. (3). A. (4). B.,C. (5). A. (6). A. (7). C. (8). A. (9). B. (10.) A. 1.2.填空题 (1). 数据关系 (2). 逻辑结构物理结构 (3). 线性数据结构树型结构图结构 (4). 顺序存储链式存储索引存储散列表(Hash)存储 (5). 变量的取值范围操作的类别 (6). 数据元素间的逻辑关系数据元素存储方式或者数据元素的物理关系 (7). 关系网状结构树结构 (8). 空间复杂度和时间复杂度 (9). 空间时间 (10). Ο(n) 1.3 名词解释如下: 数据:数据是信息的载体,是计算机程序加工和处理的对象,包括数值数据和非数值数据。数据项:数据项指不可分割的、具有独立意义的最小数据单位,数据项有时也称为字段或域。数据元素:数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,一个数据元素可由若干个数据项组成。 数据逻辑结构:数据的逻辑结构就是指数据元素间的关系。 数据存储结构:数据的物理结构表示数据元素的存储方式或者数据元素的物理关系。 数据类型:是指变量的取值范围和所能够进行的操作的总和。 算法:是对特定问题求解步骤的一种描述,是指令的有限序列。 1.4 语句的时间复杂度为: (1) Ο(n2) (2) Ο(n2) (3) Ο(n2) (4) Ο(n-1) (5) Ο(n3) 1.5 参考程序: main() { int X,Y,Z; scanf(“%d, %d, %d”,&X,&Y,Z); if (X>=Y) if(X>=Z) if (Y>=Z) { printf(“%d, %d, %d”,X,Y,Z);} else { printf(“%d, %d, %d”,X,Z,Y);}

城市最短路径查询(C语言)

#include #include #include #define INFINITY 32767 //INF 表示无穷大 #define MAX_VERTEX_NUM 10 typedef struct { int edge; //边的权值 }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //两点之间路径长度 typedef struct //景点信息 { char name[30]; int num; }infotype; typedef struct { infotype vexs[MAX_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数 }MGraph; MGraph b; //函数声明 MGraph InitGraph(); void Floyd(MGraph *G); void Menu(); void cmd(); MGraph InitGraph()//初始化顶点和权值 { MGraph G; int i,j; G.vexnum=6; G.arcnum=6; for(i=0;i

strcpy(G.vexs[0].name,"十堰"); strcpy(G.vexs[1].name,"襄樊"); strcpy(G.vexs[2].name,"随州"); strcpy(G.vexs[3].name,"武汉"); strcpy(G.vexs[4].name,"黄石"); strcpy(G.vexs[5].name,"荆州"); strcpy(G.vexs[6].name,"宜昌"); for(i=0;ivexnum;++v) for(w=0;wvexnum;++w) { D[v][w]=G->arcs[v][w].edge;//从v到w之间的路径长度赋值给D[v][w] for(u=0;uvexnum;++u) p[v][w][u]=0;//u不是v到w之间最短路径上的顶点 if(D[v][w]vexnum;++u)

全国计算机二级笔试水平测试答案

水平测试 一、选择题 (1)C 【解析】程序流程图是人们对解决问题的方法、思路或算法的一种描述。其中,图框表示各种操作的类型,图框中的文字和符号表示操作的内容,流程线表示操作的先后次序。带箭头的线段在数据流程图中表示数据流。带箭头的线段在程序流程图中表示控制流。题中给出的选项中,在图元之间用带有箭头的线段表示图元关系。在模块之间用带有箭头的线段表示 调用关系。构成程序流程图的基本图符及含义:→或↓表示控制流;□表示加工步骤;?表示逻辑条件。 (2)A 【解析】结构化程序设计的原则包括:"自顶而下,逐步求精"的设计思想,"独立功能,单出、入口"的模块化设计等。多态性是面向对象程序语言的特征。 (3)B 【解析】模块划分应遵循的准则包括模块之间的耦合和内聚。一般来说,要求模块之间的耦合尽可能地低,即模块尽可能独立,要求模块的内聚程度尽可能地高,即高内聚、低耦合的原则。 (4)B 【解析】需求分析阶段的工作主要包括需求获取、需求分析、编写需求规格说明书和需求评审等四方面。产生的主要文档为软件需求规格说明书,可以为用户、分析人员和设计人员之间的交流提供方便,可以直接支持目标软件系统的确认,又可以作为控制软件开发进程的依据。 (5)A 【解析】算法具有6个特性:①有穷性:一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有限时间内完成,即运行时间是有限的;②确定性:算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。③可行性:一个算法是可行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。④输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。⑤输出:一个算法有一个或多个输出。 (6)D 【解析】在最坏情况下,快速排序、冒泡排序和直接插入排序需要的比较次数都n(n-1)/2,堆排序需要比较的次数为nlog2n。 (7)B 【解析】在栈中,允许插入与删除的一端称为栈顶,而不允许插入与删除的一端称为栈底。栈顶元素总是最后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。即栈是按照"先进后出"或"后进先出"的原则组织数

C语言深度剖析

C语言深度剖析 1.4.1,数据类型与“模子” short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型。怎么去理解它们呢? 举个例子:见过藕煤球的那个东西吧?(没见过?煤球总见过吧)。那个东西叫藕煤器,拿着它在和好的煤堆里这么一咔,一个煤球出来了。半径12cm,12 个孔。不同型号的藕煤器咔出来的煤球大小不一样,孔数也不一样。这个藕煤器其实就是个模子。现在我们联想一下,short、int、long、char、float、double 这六个东东是不是很像不同类型的藕煤器啊?拿着它们在内存上咔咔咔,不同大小的内存就分配好了,当然别忘了给 它们取个好听的名字。在32 位的系统上short咔出来的内存大小是2 个byte;int咔出来的内存大小是4 个byte;long咔出来的内存大小是4 个byte;float咔出来的内存大小是4 个byte;double咔出来的内存大小是8 个byte;char咔出来的内存大小是1 个byte【(如下:图一)注意这里指一般情况,可能不同的平台还会有所不同,具体平台可以用sizeof 关键字测试一下)很简单吧?咔咔咔很爽吧?是很简单,也确实很爽,但问题就是你咔出来这么多内存块,你总不能给他取名字叫做x1,x2,x3,x4,x5…或者长江1 号,长江2 号…吧。它们长得这么像(不是你家的老大,老二,老三…),过一阵子你就会忘了到底哪个名字和哪个内存块匹配了(到底谁嫁给谁了啊?^_^)。所以呢,给他们取一个好的名字绝对 (图一) 1.4.2,变量的命名规则 一般规则: 【规则1-1】命名应当直观且可以拼读,可望文知意,便于记忆和阅读。 标识符最好采用英文单词或其组合,不允许使用拼音。程序中的英文单词一般不要太复 杂,用词应当准确。 【规则1-2】命名的长度应当符合“min-length && max-information”原则。 C 是一种简洁的语言, 命名也应该是简洁的。例如变量名MaxVal 就比MaxValueUntilOverflow 好用。标识符的长度一般不要过长,较长的单词可通过去掉“元音”形成缩写。 另外,英文词尽量不缩写,特别是非常用专业名词,如果有缩写,在同一系统中对同一 单词必须使用相同的表示法,并且注明其意思。 【规则1-3】当标识符由多个词组成时,每个词的第一个字母大写,其余全部小写。比如:int CurrentVal; 这样的名字看起来比较清晰,远比一长串字符好得多。 【规则1-4】尽量避免名字中出现数字编号,如Value1,Value2 等,除非逻辑上的确需要编号。比如驱动开发时为管脚命名,非编号名字反而不好。 初学者总是喜欢用带编号的变量名或函数名,这样子看上去很简单方便,但其实是一颗 颗定时炸弹。这个习惯初学者一定要改过来。 【规则1-5】对在多个文件之间共同使用的全局变量或函数要加范围限定符(建议使用模块名(缩写)作为范围限定符)。(GUI_ ,etc) 标识符的命名规则: 【规则1-6】标识符名分为两部分:规范标识符前缀(后缀) + 含义标识。非全局变量可以

C语言网络课程

附件2: 网络课程建设立项申请书 申请单位 课程名称C语言程序设计 课程层次■本科□专科 建设负责人 课程网址 填表日期

填写说明 一、申请书的各项内容要实事求是,真实、可靠。文字表达要明确、简洁。 二、表中空格不够时,可另附页,但页码要清楚。 三、申请书一律用A4纸双面打印,在左侧装订成册,一式二份。 四、课程类型按《丽水学院本科专业培养计划》分为公共基础课、专业基础课、专业选修课、全校性公选课。

课程名称C语言程序设计 课程类型公共基础课学时数72适用专业全校理工科类专业 所属重点建设专业名称大学计算机基础 建设负责人职称学历年龄教授课程 一、建设负责人近3年的主要教学、科研简况 教学: 近三年主要担任《C语言程序设计》,《VB程序设计》,《数据结构》等课程的教学任务。教学效果良好,所任教的班级参加浙江省计算机等级考试在全校同类课程中名列前茅。 科研: 主要参建人员职称学历年龄承担工作

二、教学理念与课程设计 1.教学指导思想(举证说明本课程在整个课程设计实施过程中采用的教育思想或理念。) 《C语言程序设计》课程是全校理工科类专业的公共基础课,是全国和浙江省计算机等级考试可选语言之一,也是实践性很强且面向实际应用的重要课程。对于非计算机专业学生而言是非常重要的一门技能和能力,程序设计语言的应用十分广泛,可以在以后的学习和工作中得到应用。 根据教育部非计算机专业计算机基础课程教学指导委员会提出的高等学校计算机基础课程教学基本要求,以及本校的办学指导思想,在该课程的建设中我们确定了“以程序设计方法为主线、以语法和结构为核心,以培养能力和提高兴趣为目标,变应试为应用。”的教学指导思想。摒弃C语言课程只以讲述语法为主的落后面貌,本着面向未来的精神,把C语言从应试课程转变为一种实践工具,主要目的不再局限于使学生单纯地了解和掌握C语言的基本语法规范,而是要致力于培养学生运用C语言解决实际问题的编程能力,以C语言为工具,介绍程序设计的基本思想和方法,重视在新形势下的新方法、新规则和新思想的传授,把程序设计领域最新、最有价值的思想和方法渗透到古老的C语言中,给C语言一个焕然一新的姿态,并让学生从多角度、以多方式去了解和掌握C语言以及程序设计的精髓,着重培养学生无论以后在学习、工作中使用什么语言编程,都能灵活应用这些思想和方法的能力。同时,让学生在学习程序设计的过程中,养成良好的编程风格,不再感到枯燥乏味,而是其乐融融,把学习程序设计变成一件快乐的事情。

C语言二叉树

C语言二叉树

#include #include #define STACK_MAX_SIZE 30 #define QUEUE_MAX_SIZE 30 #ifndef elemType typedef char elemType; #endif /**************************************** ********************************/ /* 以下是关于二叉树操作的11个简单算法 */ /**************************************** ********************************/ struct BTreeNode{ elemType data; struct BTreeNode *left; struct BTreeNode *right; }; /* 1.初始化二叉树 */ void initBTree(struct BTreeNode* *bt) { *bt = NULL;

case ' ': break; /* 对空格不作任何处理 */ case '(': if(top == STACK_MAX_SIZE - 1){ printf("栈空间太小!\n"); exit(1); } top++; s[top] = p; k = 1; break; case ')': if(top == -1){ printf("二叉树广义表字符串错误!\n"); exit(1); } top--; break; case ',': k = 2; break;

算法设计与分析c语言描述(陈慧南版)课后答案

第一章 15P 1-3. 最大公约数为1。快1414倍。 主要考虑循环次数,程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环) 若考虑其他语句,则没有这么多,可能就601倍。 第二章 32P 2-8.(1)画线语句的执行次数为 log n ????。(log )n O 。划线语句的执行次数应该理解为一格整体。 (2)画线语句的执行次数为 111 (1)(2)16 j n i i j k n n n ===++= ∑∑∑。3 ()n O 。 (3)画线语句的执行次数为 。O 。 (4)当n 为奇数时画线语句的执行次数为 (1)(3) 4 n n ++, 当n 为偶数时画线语句的执行次数为 2(2)4 n +。2 ()n O 。 2-10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。对于0n n ≥, 22()5825f n n n n =-+≤,所以,22582()n n n -+=O 。 (2) 当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。对于0n n ≥, 22()5824f n n n n =-+≥,所以,22582()n n n -+=Ω。 (3) 由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有222 12582c n n n c n ≤-+≤,所 以22 582()n n n -+=Θ。 2-11. (1) 当3n ≥时,3 log log n n n <<,所以()20log 21f n n n n =+<,3 ()log 2g n n n n =+>。可选 21 2 c = ,03n =。对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。注意:是f (n )和g (n )的关系。 (2) 当 4n ≥ 时,2 log log n n n <<,所以 2 2 ()/log f n n n n =<,2 2 ()log g n n n n =≥。可选 1c =, 04n =。对于 0n n ≥,2()()f n n cg n <≤,即 ()(())f n g n =O 。 (3)因为 log log(log )()(log ) n n f n n n ==,()/log log 2n g n n n n ==。当 4n ≥ 时,log(log ) ()n f n n n =≥,

专升本毕业实习报告

河南工程学院 毕业实习报告 系部:电气信息工程系专业:电气自动化班级:0932 学生姓名: 学号: 起止日期: 2012.2~2012.5 2012年5月9日

毕业实习报告 1 概述 渐淡的春天,愈浓的夏天,迎来了靠近的五月,也迎来了我的毕业时刻。时光飞逝,转眼间三年的大学生活就要结束了,看着身边的同学在不停地为自己的工作忙碌奔波着,心里有种说不出的感觉,也许是气定神闲,抑或是心急如焚,抑或二者兼有。说气定神闲,是因为我暂时不用为工作而到处奔波,因为我选择了升本;说心急如焚,是因为我也很想走出校园,为自己打造一片天……无论如何,我选择了升本,继续为追逐自己那最初的梦想而不懈努力,那我不是更应该,也更有理由气定神闲?!所以,该不必焦急! 走来的五月,也不免让人想起炎热的六月。六月,今年的六月是我毕业的日子,我该有多少不舍与留恋。但同时也是又一届高三或是高四,甚至高五苦读学子为传说中的“象牙塔”最后一搏的日子。更重要的也是我又一次向另一个象牙塔进军的日子。六月,高考,一下子把我拉回了三年前。距高考还有一百天的计时牌,依然悬挂在我的脑海之中,记得那夜我们是那么的疯狂:为自己的誓言而朝天狂吼,为自己的未来而沙哑喉咙。那夜,那夜,那夜我们是那么的激情澎湃,那么的慷慨激昂…… 可是,残酷的事实还是一下子把我拉了回来,高考我失败了,彻底的失败。失败了,能怎么办?从哪里跌倒就从哪里爬起来,我没那

么脆弱,失败了我依旧可以笑着哭。背起行囊,踏上新的征程,我来到了这里——河南工程学院,继续为梦想努力! 其实,当高考结束的那一天,我就毅然选择了升本,因为我始终知道自己要的是什么,所以这样的决定在我看来是那么的理所当然。升本不仅仅是让自己有一个更高的学历,更重要的是我决定了要考研,要为自己的梦想而不懈努力,也让含辛茹苦的父母不再那么辛劳! 2 我的大学生活 现实总与梦想有一段差距,大学更是如此。记得一个老师说过:大学不是大楼,而是大师。但是现在的大学更多的不还是大楼?图书馆、教学楼、科研楼、综合楼、住宿楼等等,哪一个离得开楼字,还好我的大学里的大楼是图书馆,一个装载着无限知识的海洋。 来到这所里之前所有的决定与计划已经做好,所以这三年的大学生活,尤其是学习生活,我过得是如此的充实。但我也不得不承认是大学改变了我:从懵懂到成熟,从成熟到内敛,从自卑到自信,从自信到自强……大学是人生必须经历的阶段,缺少了真的很可惜,因为大学是我们从校园到社会的过渡阶段,它也被称作小社会,完成了这个过渡在进入社会之后会少走许多弯路。 有了目标,我的努力就更加明确。在努力学习本专业知识以外,我还大量涉猎其他方面的书籍,去充实自己的大脑,拓宽自己的视野。比如文学(其实我比较钟爱文学,喜爱那优美的文字)、外语、经济、管理和机械等。除此之外,我一次顺利通过大学生英语四六级等级考试,国家计算机二级等级考试,拿到了大学阶段应该拿到的相关证书。

2015年9月全国计算机等级考试二级《C语言》真题及详解

2015年9月全国计算机等级考试 二级《C语言》真题 (总分100, 考试时间120分钟) 一、选择题(每小题1分。共40分) 1. 下列叙述中正确的是()。 A 解决同一个问题的不同算法的时间复杂度一般是不同的 B 解决同一个问题的不同算法的时间复杂度必定是相同的 C 对同一批数据作同一种处理,如果数据存储结构不同,不同算法的时间复杂度肯定相同 D 对同一批数据作不同的处理,如果数据存储结构相同,不同算法的时间复杂度肯定相同 答案:A [解析]算法的时间复杂度是指执行算法所需要的计算工作量,而计算下作量是用算法所执行的基本运算次数来度量的。解决同一个问题的不同算法的时间复杂度,可能相同也可能不相同。算法的时间复杂度与数据存储结构无关,对同一批数据做同一种处理或者不同处理,数据存储结构相同或者不同,算法的时间复杂度都可能相同或者不同。故选A选项。 2. 下列处理中与队列有关的是()。 A 操作系统中的作业调度 B 执行程序中的过程调用 C 执行程序中的循环控制 D 二叉树的遍历 答案:A [解析]队列是指允许在一端进行插入,而在另一端进行删除的线性表。由于最先进入队列的元素将最先出队,所以队列具有“先进先出”的特性,体现了“先来先服务”的原则。作业调度是指根据一定信息,按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配资源再将新创建的进程插入就绪队列的过程。执行程序中的过程调用一般指函数调用,需要调用的时候转入被调用函数地址执行程序,与队列无关。执行程序中的循环控制是指算法的基本控制结构,包括对循环条件的判定与执行循环体,与队列无关。二叉树是一个有限的节点集合,二叉树的遍历是指不重复地访问二叉树中的所有节点,与队列无关。故本题选择A选项。 3. 设栈的存储空间为S(1:m),初始状态为top=m+1。经过一系列入栈与退栈操作后,top=1。现又要将一个元素进栈,栈顶指针top值变为()。 A 发生栈满的错误 B 2 C m D 0 答案:A [解析]栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素并将其赋予指定变量。题目中初始状态为top=m+1,可知入栈栈顶指针top=top-1,出栈栈顶指针top=top+1,由于栈长为m,当top=1时栈满,不能再进行人栈操作。故选A选项。 4. 设二叉树共有150个节点,其中度为1的节点有10个,则该二叉树中的叶子节点数为()。 A 71 B 70 C 69

C语言深度剖析笔记

1定义声明最重要的区别:定义创建了对象并为这个对象分配了内存,声明没有分配内存。2编译器在缺省的情况下,所有变量都是auto的。 3最快的关键字——register:改关键字请求编译器尽可能将变量存在CPU内部寄存器中(而非通过内存寻址访问)以提高效率。只是尽可能而非绝对。限制:register变量必须是一个单个的值,并且长度应小于或等于整型的长度;而且register变量可能不存放在内存中,所以不能用取值运算符“&”来获取register变量的地址。 4静态变量static: 4.1修饰变量,又分为局部和全局变量,但都在内存的静态区。 4.1.1静态全局变量作用域仅限于变量被定义之处开始,到文件结尾处结束,在定 义前要使用需加extern。 4.1.2静态局部变量,在函数体内定义,只能在函数里使用,同一文档里其他函数 也用不了。函数运行结束后,该静态变量的值不会销毁。 4.2修饰函数,函数前添加使函数仅作用于本文件,好处不必担心自己编写的函数与 其他文件的函数同名。 5基本数据类型: 5.132位系统上各类型分配内存大小:short——2byte,int——4byte,long——4byte, float——4byte,double——8byte,char——1byte(具体平台可用sizeof得到)。 5.2变量命名规则:

5.2.1直观且可读,便于建议和阅读。 5.2.2命名应简洁,但尽量标明其专业意义 5.2.3标识名为多个词组成时,每个词首字母大写 5.2.4尽量避免数字编号,除非逻辑开发需要 5.2.5对在多个文件之间共同使用的全局变量或函数要加范围限定符(使用模块名 作为范围限定符) 5.2.6习惯上,n、m、i、j、k等表示int类型变量;c、ch表示char变量;a表示 数组;p表示指针;i、j、k常用语循环变量。 5.2.7定义变量的同时要初始化。 6Sizeof是关键字而非函数 7Signed和unsigned关键字:32位signed int类型整数的数值范围为-231~231-1;8位char 类型数的值范围为-27~27-1;32位unsigned int类型整数的数值范围为0~232-1;8位char 类型数的值范围为0~28-1;默认数据为signed。 8If、else组合 8.1Bool变量和“零值”比较的if语句:首先FALSE的值在编译器里定义为0,TRUE则 不一定为1;bool bTestFlag=FALSE相当于if(bTestFlag);if(!bTestFlag); 8.2Float变量与“零值”比较的if语句:首先不能与0.0进行直接比较;float fTestVal=0.0 其if语句应写作:if((fTestVal>=-EPSINON)&&(fTestVal<=EPSINON));EPSINON 为定义好的精度。 8.3指针变量与“零值”比较的if语句:int *p=NULL;定义指针一定要同时初始化;if (NULL==p);if(NULL!=p); 8.4If语句注意事项: 8.4.1If语句先处理正常情况,else再处理异常情况; 8.4.2确保if和else子句没有弄反; 9Switch、case组合 9.1注意事项:每个case语句结尾不要忘了使用break,除非有意多分支重叠;最后 必须要用default分支,即便不需要default处理,以应该保留default:break; 9.2Case语句后面只能是整型或字符型的常量或常量表达式; 9.3Case语句排序规则: 9.3.1按字母或数字顺序排序case语句有助于查询;

out......C语言

C++程序设计之四书五经(下篇) 荣耀/文我在上篇中“盘点”了TCPL和D&E以及入门教程、高效和健壮编程、模板和泛型编程等方面共十几本C++好书。冬去春来,让我们继续C++书籍精彩之旅。 标准库 当我还在研究院工作时,与同院另外两家研究所合作开发过一个大型水利枢纽调度集成项目。我们三家软件系统之间都要相互通信。在调试通讯模块时,细心的客户(一名好学的系统管理员)发现对于同一通信规约的解释代码,我的不超过30行,而对方的则超过了150行且很难看懂。这位系统管理员很纳闷,我说大家编程风格和习惯不一样,我使用了标准库,而他使用了传统C编程风格以及他所习惯的另外一些技术。 别误会!我绝无贬低这位合作伙伴的意思。事实上,我对那些真正有着深厚的C编程功力的程序员常常怀有钦佩之心。毕竟,C++能有今天的成功在很大程度上缘于它深深地植根于C。作为一名C++程序员,倘若不熟悉C++中的C,我往往会认为他的基本功是不扎实的,他的技术底气是不足的。 不过话又说回来,C++是一种多范型(paradigm)编程语言,具体采用哪种编程风格,专业程序员应该知道视具体情况而定。作为一名经常需要在现场做即兴开发的项目负责人,为了短平快地解决当务之急,我习惯尽量采用现有的库(和组件)。效率(以及强健性)久经验证的C++标准库已经摆在那儿了,何乐而不用呢? Nicolai M. Josuttis,《The C++ Standard Library: A Tutorial and Reference》原文版、中文版:《C++标准程序库:自修教程与参考手册》 这是一本百科全书式的C++标准库著作,是一本需要一再查阅的参考大全。它在完备性、细致性以及精确性方面都是无与伦比的。本书详细介绍了每一标准库组件的规格和用法,内

全国计算机二级C语言模拟测试【含详细解析】 (7)

1.下列叙述中正确的是 A. 所谓算法就是计算方法 B. 程序可以作为算法的一种描述方法 C. 算法设计只需考虑得到计算结果 D. 算法设计可以忽略算法的运算时间 正确答案:B你的答案: 解析:【解析】算法是指对解题方案的准确而完整的描述,算法不等于数学上的计算方法,也不等于程序,A选项错误。算法设计需要考虑可行性、确定性、有穷性与足够的情报,不能只考虑计算结果,C选项错误。算法设计有穷性是指操作步骤有限且能在有限时间内完成,如果一个算法执行耗费的时间太长,即使最终得出了正确结果,也是没有意义的,D选项错误。算法在实现时需要用具体的程序设计语言描述,所以程序可以作为算法的一种描述方法,B选项正确。

2.下列各序列中不是堆的是 A. (91,85,53,36,47,30,24,12) B. (91,85,53,47,36,30,24,12) C. (47,91,53,85,30,12,24,36) D. (91,85,53,47,30,12,24,36) 正确答案:C你的答案: 解析:【解析】若有n个元素的序列,将元素按顺序组成一棵完全二叉树,当且仅当满足下列条件时称为堆:大根堆,所有结点的值大于或等于左右子结点的值;小根堆,所有结点的值小于或等于左右子结点的值。A、B、D选项属于大根堆,C选项由于47<91,判断属于小根堆,但91>85,不满足条件,不是堆,故正确答案为C选项。 3.深度为5的完全二叉树的结点数不可能是

A. 15 B. 16 C. 17 D. 18 正确答案:A你的答案: 解析:【解析】在树结构中,定义一棵树的根结点所在的层次为1,其他结点所在的层次等于它的父结点所在的层次加1,树的最大层次称为树的深度。完全二叉树指除最后一层外,每一层上的结点数均达到最大值,在最后一层上只缺少右边的若干结点。深度为5的二叉树,结点个数最多为25-1=31,最少为24=16,不可能是15,故正确答案为A选项。 4.设二叉树如下:

C语言深度剖析读书笔记

C语言深度剖析读书笔记 第1章关键字 1.1、定义与声明的区别:定义创建了对象并为对象分配了内存,声明没有分配内存 1.2、register请求编译器尽可能将变量存在CPU寄存器中以提高访问速度,register变量必须为CPU寄存器所能接受的类型,它须是一个单一的值,并且长度<=整型的长度,由于register变量可能不放在内存中,故不可以用”&”来获取它的地址 1.3、函数前面加static使得函数成为静态函数,它的作用域仅限于本文件中,故又称内部函数 1.4、case关键字后面只能是整数或字符型的常量或常量表达式。 const int a = 5; case a: //const只读变量,编译出错,case label does not reduce to an integer constant case 1.1: //小数,编译出错,case label does not reduce to an integer constant case 3/2: //没有问题,分数会被转换成整数 1.5、“跨循环层”的概念本身是说,由外层循环进入内层循环是要重新初始化循环计数器的,包括保存外层循环的计数器和加载内层循环计数器,退出内层的时候再恢复外层循环计数器。把长循环放在里面可以显著减小这些操作的数量,还可以增加cache的命中率。在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。 for(i = 0; i < 50; i++){ for(j = 0; j < 10000; j++){ } } 效率比下面这个高 for(i = 0; i < 10000; i++){ for(j = 0; j < 50; j++){ }

相关主题
文本预览
相关文档 最新文档