文档库 最新最全的文档下载
当前位置:文档库 › C++高级参考手册04

C++高级参考手册04

C++高级参考手册04
C++高级参考手册04

第4章初始化与清除

第2章利用了一些分散的典型C语言库的构件,并把它们封装在一个s t r u c t中,从而在库的应用方面做了有意义的改进。(从现在起,这个抽象数据类型称为类)。

这样不仅为库构件提供了单一一致的入口指针,也用类名隐藏了类内部的函数名。在第3章中,我们介绍了存取控制(隐藏实现),这就为类的设计者提供了一种设立界线的途径,通过界线的设立来决定哪些是用户可以处理的,哪些是禁止的。这意味着数据类型的内部机制对设计者来说是可控的和能自行处理的。这样让用户也清楚哪些成员是他们能够使用并加以注意的。

封装和实现的隐藏大大地改善了库的使用。它们提供的新的数据类型的概念在某些方面比从C中继承的嵌入式数据类型要好。现在C ++编译器可以为这种新的数据类型提供类型检查,这样在使用这种数据类型时就确保了一定的安全性。

当然,说到安全性,C ++的编译器能比C编译器提供更多的功能。在本章及以后的章节中,我们将看到许多C ++的另外一些性能。它们可以让我们程序中的错误暴露无遗,有时甚至在我们编译这个程序之前,帮我们查出错误,但通常是编译器的警告和出错信息。所以我们不久就会习惯:在第一次编译时总听不到编译器那意味着正确的提示音。

安全性包括初始化和清除两个方面。在C语言中,如果程序员忘记了初始化或清除一个变量,就会导致一大段程序错误。这在一个库中尤其如此,特别是当用户不知如何对一个s t r u c t 初始化,甚至不知道必须要初始化时。(库中通常不包含初始化函数,所以用户不得不手工初始化s t r u c t)。清除是一个特殊问题,因为C程序员一旦用过了一个变量后就把它忘记了,所以对一个库的s t r u c t来说,必要的清除工作往往被遗忘了。

在C ++中,初始化和清除的概念是简化类库使用的关键所在,并可以减少那些由于用户忘记这些操作而引起的许多细微错误。本章就来讨论C ++的这些特征。

4.1 用构造函数确保初始化

在s t a s h和s t a c k类中都曾调用i n i t i a l i z e()函数,这暗示无论用什么方法使用这些类的对象,在使用之前都应当调用这一函数。很不幸的是,这要求用户必须正确地初始化。而用户在专注于用那令人惊奇的库来解决他们的问题的时候,往往忽视了这些细节。在C ++中,初始化实在太重要了,所以不能留给用户来完成。类的设计者可以通过提供一个叫做构造函数的特殊函数来保证每个对象都正确的初始化。如果一个类有构造函数,编译器在创建对象时就自动调用这一函数,这一切在用户使用他们的对象之前就已经完成了。对用户来说,是否调用构造函数并不是可选的,它是由编译器在对象定义时完成的。

接下来的问题是这个函数叫什么名字。这必须考虑两点,首先这个名字不能与类的其他成员函数冲突,其次,因为该函数是由编译器调用的,所以编译器必须总能知道调用哪个函数。S t r o u s t r u p的方法似乎是最容易也是最符合逻辑的:构造函数的名字与类的名字一样。这使得这样的函数在初始化时自动被调用。

下面是一个带构造函数的类的简单例子:

现在当一个对象被定义时:这时就好像a 是一个整数一样:为这个对象分配内存。但是当程序执行到a 的定义点时,构造函数自动被调用,因为编译器已悄悄地在a 的定义点处插入了一个X ::X ()的调用。就像其他成员函数被调用一样。传递到构造函数的第一个参数(隐含)是调用这一函数对象的地址。

像其他函数一样,我们也可以通过构造函数传递参数,指定对象该如何创建,设定对象初始值等等。构造函数的参数保证对象的所有部分都被初始化成合适的值。举例来说:如果类t r e e 有一个带整型参数的构造函数,用以指定树的高度,那么我们就必须这样来创建一个对象:

tree t(12); // 12英尺高的树

如果t r e e (i n t )是唯一的构造函数,编译器将不会用其他方法来创建一个对象(在下一章我们将看到多个构造函数以及调用它们的不同方法)。

关于构造函数,我们就全部介绍完了。构造函数是一个有着特殊名字,由编译器自动为每个对象调用的函数,然而它解决了类的很多问题,并使得代码更容易阅读。例如在上一个代码段中,对有些i n i t i a l i z e ()函数我们并没有看到显式的调用,这些函数从概念上说是与定义分开的。在C ++中,定义和初始化是同一概念,不能只取其中之一。

构造函数和析构函数是两个非常特殊的函数:它们没有返回值。这与返回值为v o i d 的函数显然不同。后者虽然也不返回任何值,但我们还可以让它做点别的。而构造函数和析构函数则不允许。在程序中创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以确保它们被执行。如果它们有返回值,要么编译器必须知道如何处理返回值,要么就只能由用户自己来显式地调用构造函数与析构函数,这样一来,安全性就被破坏了。

4.2 用析构函数确保清除

作为一个C 程序员,我们可能经常想到初始化的重要性,但很少想到清除的重要性。毕竟,清除一个整型变量时需要作什么?只需要忘记它。然而,在一个库中,对于一个曾经用过的对象,仅仅“忘记它”是不安全的。如果它修改了某些硬件参数,或者在屏幕上显示了一些字符,或在堆中分配了一些内存,那么将会发生什么呢? 如果我们只是“忘记它”,我们的对象就永远不会消失。在C ++中,清除就像初始化一样重要。通过析构函数来保证清除的执行。

析构函数的语法与构造函数一样,用类的名字作函数名。然而析构函数前面加上一个~,以和构造函数区别。另外,析构函数不带任何参数,因为析构不需任何选项。下面是一个析构函数的声明:

class Y {

p u b l i c :

~ Y ();

} ;

当对象超出它的定义范围时,编译器自动调用析构函数。我们可以看到,在对象的定义点处构造函数被调用,但析构函数调用的唯一根据是包含该对象的右括号,即使用g o t o语句跳出这一程序块(为了与C 语言向后兼容,g o t o在C ++中仍然存在,当然也是为了方便)。我们应该注意一些非本地的g o t o语句,它们用标准C语言库中的setjmp() 和l o n g j m p()函数,这些函数将不会引发析构函数的调用。(这里作一点说明:有的编译器可能并不用这种方法来实现。依赖那些不在说明书中的特征意味着这样的代码是不可移植的)。

下例说明了构造函数与析构函数的上述特征:

58

下面是上面程序的输出结果:

我们可以看到析构函数在包括它的右括号处被调用。

4.3 清除定义块

在C中,我们总要在一个程序块的左括号一开始就定义好所有的变量,这在程序设计语言中不算少见(P a s c a l中例外),其理由无非是因为“这是一个好的编程风格”。在这点上,我有自己的看法。我认为它总是给我带来不便。作为一个程序员,每当我需要增加一个变量时我都得跳到块的开始,我发现如果变量定义紧靠着变量的使用处时,程序的可读性更强。

也许这些争论具有一定的普遍性。在C ++中,是否一定要在块的开头就定义所有变量成了一个很突出的问题。如果存在构造函数,那么当对象产生时它必须首先被调用,如果构造函数带有一个或者更多个初始化参数,我们怎么知道在块的开头定义这些初始化信息呢?在一般的编程情况下,我们做不到这点,因为C中没有私有成员的概念。这样很容易将定义与初始化部分分开,然而C ++要保证在一个对象产生时,它同时被初始化。这可以保证我们的系统中没有未初始化的对象。C并不关心这些。事实上,C要求我们在块的开头就定义所有变量,在我们还不知道一些必要的初始化信息时,就要求我们这样做是鼓励我们不初始化变量。

通常,在C ++中,在还不拥有构造函数的初始化信息时不能创建一个对象,所以不必在块的开头定义所有变量。事实上,这种语言风格似乎鼓励我们把对象的定义放得离使用点尽可能近一点。在C ++中,对一个对象适用的所有规则,对预定义类型也同样适用。这意味着任何类的对象或者预定义类型都可以在块的任何地点定义。这也意味着我们可以等到我们已经知道一个变量的必要信息时再去定义它,所以我们总是可以同时定义和初始化一个变量。

我们可以看到首先是b u f

被定义,然后是一些语句,然后x 被定义并用一个函数调用对它初始化,然后

y 和

g 被定义。在C 中这些变量都只能在块的一开始定义。一般说来,应该在尽可能靠近变量的使用点定义变量,并在定义时就初始化(这是对预定义类型的一种建议,但在那里可以不做初始化)。这是出于安全性的考虑,减少变量误用的可能性。另外,程序的可读性也增强了,因为读者不需要跳到程序头去确定变量的类型。

4.3.1 for 循环

在C ++中,我们将经常看到f o r 循环的计数器直接在f o r 表达式中定义:

上述声明是一种重要的特殊情况,这可能使那些刚接触C ++的程序员感到迷惑不解。

变量i 和j 都是在f o r 表达式中直接定义的(在C 中我们不能这样做),然后他们就作为一个变量在f o r 循环中使用。这给程序员带来很大的方便,因为从上下文中我们可以清楚地知道变量i 、j 的作用,所以不必再用诸如i _l o o p _c o u n t e r 之类的名字来定义一个变量,以表示这一变量的作用。

这里有一个变量生存期的问题,在以前这是由程序块的右大括号来确定的。从编译器的角度来看这样是合理的,因为作为程序员,我们显然想让i 只在循环内部有效。然而很不幸的是,如果我们用这种方法声明:

(无论有没有大括号,)在同一程序块内,编译器将给出一个重复定义的错误,而新的标准

C ++说明书上说,一个在f o r 循环的控制表达式中定义的循环计数器只在该循环内才有效,所以上面的声明是可行的。(当然,并不是所有的编译器都支持这一点,我们可能会遇到一些老式风格的编译器。)如果这种转变引起一些错误的话,编译器会指出,解决起来也很容易。注意,第4下载

那些局部变量会屏蔽这个封闭范围中的变量。

我发现一个在小范围内设计良好的指示器:如果我们的一个函数有好几页,也许我们正在试图让这个函数完成太多的工作。用更多的细化的函数不仅有用,而且更容易发现错误。

4.3.2 空间分配

现在,一个变量可以在某个程序范围内的任何地方定义,所以在这个变量的定义之前是无法对它分配内存空间的。通常,编译器更可能像C 编译器一样,在一个程序块的开头就分配所有的内存。这些对我们来说是无关紧要的,因为作为一个程序员,我们在变量定义之前总是无法得到存储空间。即使存储空间在块的一开始就被分配,构造函数也仍然要到对象的定义时才会被调用,因为标识符只有到此时才有效。编译器甚至会检查我们有没有把一个对象的定义放到一个条件块中,比如在s w i t c h 块中声明,或可能被g o t o 跳过的地方。

下例中解除注释的句子会导致一个警告或一个错误。

在上面的代码中,g o t o 和s w i t c h 都可能跳过构造函数的调用点,然而这个对象会在后面的程序块中起作用,这样,构造函数就没有被调用,所以编译器给出了一条出错信息。这就确保了对象在产生的同时被初始化。

当然,这里讨论的内存分配都是在一个堆栈中。内存分配是通过编译器向下移动堆栈指针来实现的(这只是相对而言,实际指针值可能增加,也可能减少,这依赖于机器)。也可以在堆中分配对象的内存,这将在第1 2章中介绍。

4.4 含有构造函数和析构函数的stash 在前几章的例子中,都有一些很明显的函数对应为构造函数和析构函数:i n i t i a l i z e ()和c l e a n u p ()。下面是带有构造函数与析构函数的s t a s h 头文件。

下面是实现文件,这里只对i n i t i a l i z e ()和c l e a n u p ()的定义作了修改,它们分别用构造函数与

析构函数代替。

注意,在下面的测试程序中,s

t

a s h 对象的定义放在紧靠对象调用的地方,对象的初始化通过构造函数的参数列表来实现,而对象的初始化似乎成了对象定义的一部分。

62 C ++编程思想

再看看

c l

e

a n

u p ()调用已被取消,但当i n t S t a s h 和s t r i n g S t a s h 越出程序块的范围时,析构函数被自动地调用了。

4.5 含有构造函数和析构函数的stack

重新实现含有构造函数和析构函数的链表(在s t a c k 内)。这是修改后的头文件:

注意,虽然s t a c k 有构造函数与析构函数,但嵌套类l i n k 并没有,这并不是说它不需要。当它被使用时,问题就来了:

第4章下载

l i

n k 是在s t a c k ::p u s h 内部产生的,但它是创建在堆栈上的,这儿就产生了一个疑难问题。如果一个对象有构造函数,我们怎么创建它呢?到目前为止,我们一直这样说:“好吧,这是堆中的一块内存,我想您就假定它是给这个对象的吧。”但构造函数并不允许我们就这样把一个内存地址交给它来创建一个对象[ 1]。对象的创建很关键,C ++的构造函数想控制整个过

64 C ++编程思想[1] 实际上,确有允许这么做的语法。但它是在特殊情况下使用的,不能解决在此描述的一般问题。

程以保证安全。有个很容易的解决办法,那就是用n e w 操作符,我们将在第1 2章讨论这个问题。现在,只要用C 中的动态内存分配就行了。因为内存分配与清除都隐藏在s t a c k 中,它是实现部

分,我们在测试程序中看不到它的影响。

t

e x t l i n e s 的构造函数与析构函数都是自动调用的,所以类的用户只要把精力集中于怎样使用这些对象上,而不需要担心它们是否已被正确地初始化和清除了。

4.6 集合初始化

集合,顾名思义,就是多个事物聚集在一起。这个定义包括各种类型的集合:像s t r u c t 和c l a s s 等。数组就是单一类型的集合。

初始化集合往往既冗长又容易出错。而C ++中集合的初始化却变得很方便而且很安全。当我们产生一个集合对像时,我们要做的只是指定初始值就行了,然后初始化工作就由编译器去承担了。这种指定可以用几种不同的风格,取决于我们正在处理的集合类型。但不管是哪种情况,指定的初值都要用大括号括起来。比如一个预定义类型的数组可以这样定义:

int a[5]={1,2,3,4,5};

如果给出的初始化值多于数组元素的个数,编译器就会给出一条出错信息。但如果给的初

始化值少于数组元素的个数,那将会怎么样呢?例如:

int b[6]={0};

这时,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素。注意,如果我们定义了一个数组而没有给出一列初始值时,编译器并不会去做这些工作。所以上面的表达式是将一个数组初始化为零的简洁方法,它不需要用一个 f o r循环,也避免了“偏移1位”错误(它可能比f o r循环更有效,这依赖于编译器)。

数组还有一种叫自动计数的快速初始化方法,就是让编译器按初始化值的个数去决定数组的大小:

int c[] = {1,2,3,4};

现在,如果我们决定增加其他的元素到这个数组上,只要增加一个初始化值即可,如果以此建立我们的代码,只需在一处作出修改即可,这样,我们在修改时出错的机会就减少了。但怎样确定这个数组的大小呢?用表达式sizeof c/sizeof *c(整个数组的大小除以第一个元素的大小)即可算出,这样,当数组大小改变时它无需修改。

for(int i = 0; i< sizeof c / sizeof *c; i++)

c [i]++;

s t r u c t也是一种集合类型,它们也可以用同样的方式初始化。因为C风格的s t r u c t的所有成员都是公共型的,所以它们的值可以直接指定:

struct X {

int i;

float f;

char c;

} ;

X x1 = {1,2.2,'c' };

如果我们有一个这种s t r u c t的数组,我们也可以用嵌套的大括号来初始化每一个对象。

X x2[3] = {{1,1.1, 'a'},{2,2.2, 'b'}};

这里,第三个对象被初始化为零。

如果s t r u c t中有私有成员,或即使所有成员都是公共成员,但有一个构造函数,情况就不一样了。在上例中,初始值被直接赋给了集合中的每个元素,但构造函数是通过外在的接口来强制初始化的。这里,构造函数必须被调用来完成初始化,因此,如果有一个下面的s t r u c t 类型:

struct Y {

float f;

int i;

Y(int A); // presumably assigned to i

} ;

我们必须指示构造函数调用,最好的方法像下面这样:

Y y2[] = {Y(1),Y(2),Y(3)};

这样我们就得到了三个对象和进行了三次构造函数调用。只要有构造函数,无论是所有成员都是公共的s t r u c t还是一个带私有成员的c l a s s,所有的初始化工作都必须通过构造函数,即使我们正在对一个集合初始化。

下面是构造函数带多个参数的又一个例子:

注意,它看上去就像数组中的每个对象都对一个没有命名的构造函数调用了一次一样。4.7 缺省构造函数

缺省构造函数就是不带任何参数的构造函数。缺省的构造函数用来创建一个“香草(v a n i l l a)对象”,当编译器需要创建一个对象而又不知任何细节时,缺省的构造函数就显得非常重要。比如,我们有一个类Y,并用它来定义对象:

Y y4[2] = {Y(1)}

编译器就会报告找不到缺省的构造函数,数组中的第二个对象想不带参数来创建,所以编译器就去找缺省的构造函数。实际上,如果我们只是简单地定义了一个Y对象的数组:Y y5[7];

或一个单一的对象

Y y;

编译器会报告同样的错误,因为它必须用一个缺省的构造函数去初始化数组中的每个对象。(记住,一旦有了一个构造函数,编译器就会确保不管在什么情况下它总会被调用)。

缺省的构造函数是如此重要,所以在一个构造类型(struct 或c l a s s)中没有构造函数时,编译器会自动创建一个。因此下面例子将会正常运行:

class Z {

int i; // private

}; // no constructor

Z z,z2[10];

然而,一旦有构造函数而没有缺省构造函数,上面的对象定义就会产生一个编译错误。

我们可能会想,缺省构造函数应该可以做一些智能化的初始化工作,比如把对象的所有内存置零。但事实并非如此。因为这样会增加额外的负担,而且使程序员无法控制。比如,如果我们把在C中编译过的代码用在C ++中,就会导致不同的结果。如果我们想把内存初始化为零,必须亲自去做。

对一个C ++的新手来说,自动产生的缺省构造函数并不会使编程更容易。它实际上要求与已有的C代码保持向后兼容。这是C ++中的一个关键问题。在C中,创建一个s t r u c t数组的情况

很常见,而在C ++中,在没有缺省构造函数时,这会引起一个编译错误。

如果我们仅仅因为风格问题就去修改我们的C代码,然后用C ++重新编译,也许我们会很不乐意。当将C代码在C ++中编译时,我们总会遇到这样、那样的编译错误,但这些错误都是C ++编译器所发现的C的不良代码,因为C ++的规则更严格。事实上,用C ++编译器去编译C代码是一个发现潜在错误的很好的方法。

4.8 小结

由C ++提供的细致精巧机制应给我们这样一个强烈的暗示:在这个语言中,初始化和清除是多么至关重要。在S t r o u s t r u p设计C ++时,他所作的第一个有关C语言产品的观察就是,由于没有适当地初始化变量,从而导致了程序不可移植的问题。这种错误很难发现。同样的问题也出现在变量的清除上。因为构造函数与析构函数让我们保证正确地初始化和清除对象(编译器将不允许没有调用构造函数与析构函数就直接创建与销毁一个对象),使我们得到了完全的控制与安全。

集合的初始化同样如此——它防止我们犯那种初始化内部数据类型集合时常犯的错误,使我们的代码更简洁。

编码期间的安全性是C ++中的一大问题,初始化和清除是这其中的一个重要部分,随着本书的进展,我们可以看到其他的安全性问题。

4.9 练习

1) 用构造函数与析构函数修改第3章结尾处的HANDLE.H,HANDLE.CPP 和USEHANDL.CPP 文件。

2) 创建一个带非缺省构造函数和析构函数的类,这些函数都显示一些信息来表示它们的存在。写一段代码说明构造函数与析构函数何时被调用。

3) 用上题中的类创建一个数组来说明自动计数与集合初始化。在这个类中增加一个显示信息的成员函数。计算数组的大小并逐个访问它们,调用新成员函数。

4) 创建一个没有任何构造函数的类,显示我们可以用缺省的构造函数创建对象。现在为这个类创建一个非缺省的构造函数(带一个参数),试着再编译一次。解释发生的现象。

QQ:917603226,danpianjikaifa@https://www.wendangku.net/doc/2a2621089.html,

学习视频,电子元件选型指导,PLC 学习指导以及PLC 和DCS 周边产品开发

TQ2440开发大全下载

linux-2.6.35.3在TQ2440上移植1--建立自己的板子.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227941

linux在TQ2440上移植2--Nandflash驱动,MTD分区.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227943

linux在TQ2440上移植3--yaffs2+文件系统移植.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227944

linux在TQ2440上移植4--yaffs2文件系统制作.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227947

linux在TQ2440上移植5--移植串口传输协议.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227948

linux在TQ2440上移植6--完善串口驱动.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227950

linux在TQ2440上移植7--完善实时时钟RTC.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227951

linux在TQ2440上移植8--启动看门狗+.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227965

linux在TQ2440上移植9--添加触摸屏.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227952

linux在TQ2440上移植10--完善网卡驱动.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227955

linux在TQ2440上移植11--完善声卡驱动.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227956

linux在TQ2440上移植12--完善SDMMC卡驱动.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227958

bootloader编写指南.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227040

第 1 页

U-boot1.1.6的移植step by step(TQ2440).pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227044

U-boot1[1][1][1].1.6的移植(TQ2440).pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227049https://www.wendangku.net/doc/2a2621089.html,/source/3227049

U-BOOT-2010.06移植到TQ2440.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227052

uboot讲义.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227054

uboot阶段1(汇编部分)详细分析.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227057

uboot使用说明.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227058

Uboot学习笔记.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227060

U-boot源代码分析.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227062

Uboot源码阅读笔记.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3227064

在uboot上制作logo的实验.ppt

https://www.wendangku.net/doc/2a2621089.html,/source/3227067

UBOOT之Makefile详解.doc

https://www.wendangku.net/doc/2a2621089.html,/source/3227068

基于TQ2440和Qt的Mp3设计.doc

https://www.wendangku.net/doc/2a2621089.html,/source/3227074

ARM9硬件接口学习之一_WatchDog.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229021

ARM9硬件接口学习之二_RTC.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229025.

第 2 页

ARM9硬件接口学习之三_GPIO.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229026

ARM9硬件接口学习之四_CLOCK.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229028

ARM9硬件接口学习之五_UART.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229030

tq2440ARM学习1

https://www.wendangku.net/doc/2a2621089.html,/source/3229044

ARM学习3流水灯实验.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229048

ARM学习4在ADS1.2中新建自己的工程.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229051

ARM学习5实现电子相框功能及LCD屏显试验中两个问题

https://www.wendangku.net/doc/2a2621089.html,/source/3229053

ARM学习6LCD屏显实现科比投篮的动画.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229057

ARM学习7对于科比投篮实验的轨迹分析.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229058

ARM学习8对于画线函数Glib_Line算法的研究.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229059

ARM学习14S3C2440 IO口的总结.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3229060

[原创]自己动手编写嵌入式Bootloader之(1).pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3230747

[原创]自己动手编写嵌入式Bootloader之(2).pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3230136

[原创]自己动手编写嵌入式Bootloader之(3).pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3230137

uC_OS-II实验指导书.pdf

第 3 页

https://www.wendangku.net/doc/2a2621089.html,/source/3231958

Ucos_II2.52 源码中文译注.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3231960

UCOS-II API 参考手册.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3231962

第 4 页

TQ2440裸机开发试验大全TQ2440裸机开发试验之ADC

https://www.wendangku.net/doc/2a2621089.html,/source/3311703

TQ2440裸机开发试验之ebook

https://www.wendangku.net/doc/2a2621089.html,/source/3311704

TQ2440裸机开发试验之interrupt

https://www.wendangku.net/doc/2a2621089.html,/source/3311708

TQ2440裸机开发试验之Mmu_Nand

https://www.wendangku.net/doc/2a2621089.html,/source/3311761

TQ2440裸机开发试验之Mmu_Nand

https://www.wendangku.net/doc/2a2621089.html,/source/3311763

TQ2440裸机开发试验之Nand_1

https://www.wendangku.net/doc/2a2621089.html,/source/3311765

TQ2440裸机开发试验之power_stop

https://www.wendangku.net/doc/2a2621089.html,/source/3311770

TQ2440裸机开发试验之PWM

https://www.wendangku.net/doc/2a2621089.html,/source/3311772

TQ2440裸机开发试验之RTC_LCD

https://www.wendangku.net/doc/2a2621089.html,/source/3311777

TQ2440裸机开发试验之Touch_Panel

https://www.wendangku.net/doc/2a2621089.html,/source/3311778

TQ2440裸机开发试验之UART

https://www.wendangku.net/doc/2a2621089.html,/source/3311780

TQ2440裸机开发试验之write_bios

https://www.wendangku.net/doc/2a2621089.html,/source/3311783

第1篇基础篇

第1章Linux简介

1.1 Linux系统概述

1.2 Linux图形界面操作

1.3 Linux字符界面操作

1.4 Shell脚本编程基础

第1章Linux简介.pdf

https://www.wendangku.net/doc/2a2621089.html,/source/3312215

新手学linux C编程第1章视频

https://www.wendangku.net/doc/2a2621089.html,/v_show/id_XMjcwMDAxNjYw.html 第2章C语言基础

excel表格的各函数常用函数

excel表格的各函数的基本操作 常用函数如下: 1、SUM()求和、总分函数 例:=SUM(B2:B5) 2、A VERAGE()求平均函数 例:=A VERAGE(B2:B5) 3、MIN()求最小值函数 例:=MIN(B2:B5) 4、MAX()求最大值函数 例:=MAX(B2:B5) 5、COUNTIF()求条件统计函数( 例:=COUNTIF(B7:B33,“>=90”) 6、COUNT()求统计函数 例:=COUNT(B7:B33) 7、IF()求逻辑函数 例:=IF(G7>=90,“优秀”,IF(G7>=80,“良好”,IF(G7)>=70,“中等”,IF(AND(G7<70,G7>0),“差生”,“没参考”)))) 8、RANK()求名次函数 例:=RANK(G7,$G$7:$G$33) 9、NOW()求电脑现在日期 例:=NOW() 10、求“性别”函数 例:=IF(MOD(MID(B6,15,1),2)=0,"女","男") 11、求“出生日期”函数 例:=CONCATENA TE(MID(B6,7,2),"-",MID(B6,9,2),"-",MID(B6,11,2)) 12、求“年龄”、“工龄”函数 例:=DATEDIF(E6,NOW(),"Y") 13、求“等级”函数 例:=IF(C6="基础班","入门级",IF(OR(C6="AUTOCAD班",C6="PHOTOSHOP",C6="CORELDRAW"),"平面设计级",IF(C6="综合班","综合办公应用级",IF(C6="OFFICE套班","办公应用级","网络设计级")))) 14、SUNIF()条件求和函数(根据指定的条件求和) 例:=SUMIF(B7:B33,">=100") 例:=SUMIF(C7:C36,"=人事",D7:D36)

excel函数公式图文说明教程

excel函数公式实例教程 excel教程珍藏版,简单明了,包你学会,欢迎转载! 教程在陆续上传添加中,敬请期待! 1、PERCENTILE函数实例:求百分比数值点 Excel中PERCENTILE函数实例:求百分 比数值点 [日期:2010-08-09] 来源:IT部落窝作者:IT部落窝阅读:8560次[字体:大中小] Excel中PERCENTILE函数的用法是:返回区域中数值的第 K 个百分点的值。 PERCENTILE函数实例:求百分比数值点 下面是IT部落窝某几天的一个流量表,详见下图。现在要统计出90%、80%、70%、60%、50%对应的百分比数值点。我们使用PERCENTILE函数设计公式来求取。 操作步骤如下:

第一步,选中B17单元格,输入公式:=PERCENTILE(C2:C14,0.9),确定,得到90%处的对应的百分比数值点。 第二步,选中B18单元格,输入公式:=PERCENTILE(C2:C14,0.8),确定,得到80%处的对应的百分比数值点。 第三步,选中B19单元格,输入公式:=PERCENTILE(C2:C14,0.7),确定,得到70%处的对应的百分比数值点。 第四步,选中B20单元格,输入公式:=PERCENTILE(C2:C14,0.6),确定,得到60%处的对应的百分比数值点。 第五步,选中B21单元格,输入公式:=PERCENTILE(C2:C14,0.5),确定,得到50%处的对应的百分比数值点。 2、frequency函数实例:统计一组数据出现的次数

frequency函数实例:统计一组数据出 现的次数 [日期:2010-08-06] 来源:IT部落窝作者:IT部落窝阅读:5390次[字体:大中小] 下表中统计了公司员工被投诉的记录。问题是统计出指定的员工编号被投诉的出现次数。 我们使用excel中frequency函数可以实现出现次数统计。frequency函数用于计算数值在某个区域内的出现频率次数,然后返回一个垂直数组。 操作步骤如下: 首先在C列建立需要参与统计投诉出现次数的员工编号,然后选中D5:D8单元格区域,在编辑栏输入公式:=FREQUENCY(B2:B11,C5:C8),然后按下“Ctrl+Shift+Enter”组合键,即可一次性统计出各个编号在B2:B11单元格区域中出现的次数。 3、frequency函数用法介绍 Excel中frequency函数用法介绍 [日期:2010-08-06] 来源:IT部落窝作者:IT部落窝阅读:6622次[字体:大中小]

C语言标准库函数

标准库函数 本附录描述了标准C支持的库函数①。使用此附录时,请记住下列要点。 为了简洁清楚,这里删除了一些细节。如果想看全部内容,请参考标准。本书的其他地方已经对一些函数(特别是printf函数、scanf函数以及它们的变异函数)进行了详细介绍,所以这里 只对这类函数做简短的描述。为了获得关于某个函数更详细的信息(包括如何使用这个函数的示 例),请见函数描述右下角用楷体列出的节号。 每个函数描述结尾都有其他与之相关函数的列表。相似函数非常接近于正在描述的函数。相关函数经常会和在描述的函数联合使用。(例如,calloc函数和realloc函数与malloc函数“类似”, 而free函数则与malloc函数“相关”。)也可参见的函数和在描述的函数没有紧密联系,但是却 可能有影响。 如果把函数行为的某些方面描述为由实现定义的,那么这就意味着此函数依赖于C库的实现方式。 函数将始终行为一致,但是结果却可能会由于系统的不同而千差万别。(换句话说,请参考手册了 解可能发生的问题。)另一方面,未定义的行为是一个不好的消息:不但函数的行为可能会因系统 不同而不同,而且程序也可能会行为异常甚至崩溃。 中许多函数的描述提到了定义域错误和取值范围错误。在本附录的末尾对这两种错误进行了定义。 601 下列库函数的行为是会受到当前地区影响的: 字符处理函数(除了isdigit函数和isxdigit函数)。 格式化输入/输出函数。 多字节字符和字符串函数。 字符串转换函数。 Strcoll函数、strftime函数和strxfrm函数。 例如,isalpha函数实际上检测字符是否在a到z之间或者在A到Z之间。在某些区域内也把其他字符看成是字母次序的。本附录描述了在"C"(默认的)地区内库函数的行为。 一些函数实际上是宏。然而,这些宏的用法和函数完全一样,所以这里不对它们区别对待。 abort 异常终止程序 void abort(void); 产生SIGABRT信号。如果无法捕获信号(或者如果信号处理函数返回),那么程序会异常 终止,并且返回由实现定义的代码来说明不成功的终止。是否清洗输出缓冲区,是否关 闭打开的流,以及是否移除临时文件都是由实现定义的。 相似函数exit函数、raise函数 相关函数assert函数、signal函数 也可参见atexit函数 26.2节abs 整数的绝对值 int abs(int j); 返回整数j的绝对值。如果不能表示j的绝对值,那么函数的行为是未定义的。 ①这些材料经ANSI许可改编自American National Standards Institude ANSI/ISO 9899?1990。这个标准的副本可从 ANSI购买(ANSI, 11 West 42nd Street, New York, NY 10036)。

1C语言入门_3简单函数_3形参和实参解读

第 3 章 简单函数 3. 形参和实参
下面我们定义一个带参数的函数, 我们需要在函数定义中指明参数的个数和每个 参数的类型,定义参数就像定义变量一样,需要为每个参数指明类型,参数的命 名也要遵循标识符命名规则。例如: 例 3.4. 带参数的自定义函数
#include
void print_time(int hour, int minute) { printf("%d:%d\n", hour, minute); }
int main(void) { print_time(23, 59); return 0; }
需要注意的是, 定义变量时可以把相同类型的变量列在一起,而定义参数却不可 以,例如下面这样的定义是错的:
void print_time(int hour, minute) {

printf("%d:%d\n", hour, minute); }
学习 C 语言的人肯定都乐意看到这句话:“变量是这样定义的,参数也是这样 定义的,一模一样”,这意味着不用专门去记住参数应该怎么定义了。谁也不愿 意看到这句话:“定义变量可以这样写,而定义参数却不可以”。C 语言的设计 者也不希望自己设计的语法规则里到处都是例外, 一个容易被用户接受的设计应 该遵循最少例外原则(Rule of Least Surprise)。其实关于参数的这条规定也不 算十分例外,也是可以理解的,请读者想想为什么要这么规定。学习编程语言不 应该死记各种语法规定,如果能够想清楚设计者这么规定的原因(Rationale), 不仅有助于记忆,而且会有更多收获。本书在必要的地方会解释一些 Rationale, 或者启发读者自己去思考, 例如上一节在脚注中解释了 void 关键字的 Rationale。 [C99 Rationale]是随 C99 标准一起发布的,值得参考。 总的来说,C 语言的设计是非常优美的,只要理解了少数基本概念和基本原则就 可以根据组合规则写出任意复杂的程序, 很少有例外的规定说这样组合是不允许 的,或者那样类推是错误的。相反,C++的设计就非常复杂,充满了例外,全世 界没几个人能把 C++的所有规则都牢记于心,因而 C++的设计一直饱受争议, 这个观点在[UNIX 编程艺术]中有详细阐述。 在本书中,凡是提醒读者注意的地方都是多少有些 Surprise 的地方,初学者如 果按常理来想很可能要想错, 所以需要特别提醒一下。而初学者容易犯的另外一 些错误, 完全是因为没有掌握好基本概念和基本原理,或者根本无视组合规则而 全凭自己主观臆断所致, 对这一类问题本书不会做特别的提醒,例如有的初学者 看完第 2 章 常量、变量和表达式之后会这样打印π 的值:
double pi=3.1416; printf("pi\n");
之所以会犯这种错误,一是不理解 Literal 的含义,二是自己想当然地把变量名 组合到字符串里去, 而事实上根本没有这条语法规则。如果连这样的错误都需要 在书上专门提醒,就好比提醒小孩吃饭一定要吃到嘴里,不要吃到鼻子里,更不 要吃到耳朵里一样。 回到正题。我们调用 print_time(23, 59)时,函数中的参数 hour 就代表 23,参 数 minute 就代表 59。确切地说,当我们讨论函数中的 hour 这个参数时,我们 所说的“参数”是指形参(Parameter),当我们讨论传一个参数 23 给函数时, 我们所说的“参数”是指实参(Argument),但我习惯都叫参数而不习惯总把 形参、实参这两个文绉绉的词挂在嘴边(事实上大多数人都不习惯),读者可以 根据上下文判断我说的到底是形参还是实参。 记住这条基本原理: 形参相当于函

EXCEL公式手册

这个东西其实是公司一个很老的培训资料,内容非常简单,说白了就是把Excel里按F1打开帮助都能找到的东西贴出来而已。这个东西的唯一价值,只是告诉你这些公式你可能会用得到,所以老手就不必看了,也不必喷了。我在原文的基础上添加了AVERAGEIF、AVERAGEIFS、SUMIFS、COUNTIFS和IFERROR函数(适用于2007以上版本)。 Contents Chapter 0:Updates内容更新 0.1 AVERAGEIF 0.2 AVERAGEIFS、SUMIFS、COUNTIFS 0.3 IFERROR Chapter 1:Text Functions文本函数 1.1 Concatenate 1.2 Exact 1.3 Upper 1.4 Lower 1.5 Left 1.6 Right 1.7 Len 1.8 Trim 1.9 Text 1.10 Substitute Chapter 2:LOOKUP查询函数 2.1 HLookup 2.2 VLookup 2.3 Lookup Chapter 3:Date and Time日期与时间函数 3.1 Today 3.2 Year

3.4 Day 3.5 Date 3.6 Time 3.7 Hour 3.8 Minute 3.9 Second Chapter 4:Math数学函数4.1 ABS 4.2 INT 4.3 PRODUCT 4.4 MOD 4.5 Rand 4.6 ROUND 4.7 ROUNDUP 4.8 ROUNDDOWN 4.9 SumIF 4.10 SumProduct 4.11 Trunc Chapter 5:Logical逻辑函数5.1 And 5.2 Not 5.3 Or 5.4 True 5.5 False 5.6 If Chapter 6:Financial财务函数6.1 PMT

如何学好并精通C语言

程序员之路——如何学习C语言并精通C语言 程序员之路——如何学习C语言 学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C 语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你需要经历艰苦的过程。 一、要读就读好书,否则不如不读 所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。 大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。虽然本人的名字(谭浩宇)跟教授仅仅一字之差,但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误。好了,这本书我也不想说太多了,有兴趣大家可以百度一下:) Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。 如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。然后你可以挑战一下《Expert C Programming》(中译名《C专家编程》),书如其名,这本书颇具难度,一旦你仔细读完并能透彻理解,你便可以放心大胆地在简历上写“精通C语言”了。 切记一个原则,不要读自己目前还看不懂的书,那是浪费生命。如果你看不懂,那你一定是缺失了某些必需基础知识。此时,你要仔细分析自己需要补充哪些内容,然后再去书店寻找讲述的这些内容的书籍。把基础知识补充完毕再回头来学习,才会真正的事半功倍。 二、Unix/Linux还是Windows,这是个很大的问题 不同的编程环境会造就出不同思维的程序员。Windows的程序员大多依赖集成开发环境,比如Visual Studio,而Unix程序员更加钟爱Makefile与控制台。显而易见,集成开发环境更容易上手,在Windows上学习C语言,只需要会按几个基本的Visutal C++工具栏按钮就可以开始写Hello, World!了,而在Unix下,你需要一些控制台操作的基本知识。有人也许认为Unix的环境更简洁,但习惯的力量是很大的,大家都很熟悉Windows的基本操作,而为了学习C语言去专门装一个Unix系统,似乎有点不划算。 对于一个只懂得Windows基本操作、连DOS是什么都不知道的新手而言,尽快做一些有趣而有意义的事情才是最重要的。用C语言写一个小程序远比学习ls、cat等命令有趣,况且我们要专注于C语言本身,就不得不暂时忽略一些东西,比如编译链接的过程、Makefile的写法等等等等。 所以我建议初学者应该以Visual C++ 6.0(不是VisualC++ .NET)或者Dev C++作为主要的学习环境,而且千万不要在IDE的使用技巧上过多纠缠,因为今后你一定要转向Unix环境的。Visual C++ 6.0使用很方便,调试也很直观,但其默认的编译器对C标准的支持并不好,而Dev C++使用gcc编译器,对C99的标准都支持良好。使用顺带提一下,很多大学的C语言课程还在使用Turbo C 2.0作为实验环境,这是相当不可取的,原因其一是TC 2.0对C标准几乎没有支持,其二是TC 2.0编译得到的程序是16位的,这对今后理解32位的程序会造成极大的困扰(当然,用djgpp之类的东西可以使TC

C++高级参考手册04

第4章初始化与清除 第2章利用了一些分散的典型C语言库的构件,并把它们封装在一个s t r u c t中,从而在库的应用方面做了有意义的改进。(从现在起,这个抽象数据类型称为类)。 这样不仅为库构件提供了单一一致的入口指针,也用类名隐藏了类内部的函数名。在第3章中,我们介绍了存取控制(隐藏实现),这就为类的设计者提供了一种设立界线的途径,通过界线的设立来决定哪些是用户可以处理的,哪些是禁止的。这意味着数据类型的内部机制对设计者来说是可控的和能自行处理的。这样让用户也清楚哪些成员是他们能够使用并加以注意的。 封装和实现的隐藏大大地改善了库的使用。它们提供的新的数据类型的概念在某些方面比从C中继承的嵌入式数据类型要好。现在C ++编译器可以为这种新的数据类型提供类型检查,这样在使用这种数据类型时就确保了一定的安全性。 当然,说到安全性,C ++的编译器能比C编译器提供更多的功能。在本章及以后的章节中,我们将看到许多C ++的另外一些性能。它们可以让我们程序中的错误暴露无遗,有时甚至在我们编译这个程序之前,帮我们查出错误,但通常是编译器的警告和出错信息。所以我们不久就会习惯:在第一次编译时总听不到编译器那意味着正确的提示音。 安全性包括初始化和清除两个方面。在C语言中,如果程序员忘记了初始化或清除一个变量,就会导致一大段程序错误。这在一个库中尤其如此,特别是当用户不知如何对一个s t r u c t 初始化,甚至不知道必须要初始化时。(库中通常不包含初始化函数,所以用户不得不手工初始化s t r u c t)。清除是一个特殊问题,因为C程序员一旦用过了一个变量后就把它忘记了,所以对一个库的s t r u c t来说,必要的清除工作往往被遗忘了。 在C ++中,初始化和清除的概念是简化类库使用的关键所在,并可以减少那些由于用户忘记这些操作而引起的许多细微错误。本章就来讨论C ++的这些特征。 4.1 用构造函数确保初始化 在s t a s h和s t a c k类中都曾调用i n i t i a l i z e()函数,这暗示无论用什么方法使用这些类的对象,在使用之前都应当调用这一函数。很不幸的是,这要求用户必须正确地初始化。而用户在专注于用那令人惊奇的库来解决他们的问题的时候,往往忽视了这些细节。在C ++中,初始化实在太重要了,所以不能留给用户来完成。类的设计者可以通过提供一个叫做构造函数的特殊函数来保证每个对象都正确的初始化。如果一个类有构造函数,编译器在创建对象时就自动调用这一函数,这一切在用户使用他们的对象之前就已经完成了。对用户来说,是否调用构造函数并不是可选的,它是由编译器在对象定义时完成的。 接下来的问题是这个函数叫什么名字。这必须考虑两点,首先这个名字不能与类的其他成员函数冲突,其次,因为该函数是由编译器调用的,所以编译器必须总能知道调用哪个函数。S t r o u s t r u p的方法似乎是最容易也是最符合逻辑的:构造函数的名字与类的名字一样。这使得这样的函数在初始化时自动被调用。 下面是一个带构造函数的类的简单例子:

C语言库函数参考手册

C语言库函数参考手册 转载说明:可能有些函数已经过时,但从学习的角度来看,还是有一定的参考价值。 分类函数,所在函数库为ctype.h int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0 int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9') 返回非0值,否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0 int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F) 返回非0值,否则返回0 int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0 int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0 int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0 int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0 int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0 int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n') 返回非0值,否则返回0 int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0 int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值, 否则返回0 int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z') int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z') 数学函数,所在函数库为math.h、stdlib.h、string.h、float.h int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fabs(double x) 返回双精度参数x的绝对值 long labs(long n) 返回长整型参数n的绝对值 double exp(double x) 返回指数函数ex的值 double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值 double log(double x) 返回logex的值 double log10(double x) 返回log10x的值 double pow(double x,double y) 返回xy的值 double pow10(int p) 返回10p的值 double sqrt(double x) 返回+√x的值 double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度double atan(double x) 返回x的反正切tan-1(x)值,x为弧度double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度

2014年3月计算机二级C语言真题及参考答案

2014年3月计算机二级C语言真题及答案 一、选择题 二、(1)下列关于栈叙述正确的是 三、A)栈顶元素最先能被删除 四、B)栈顶元素最后才能被删除 五、C)栈底元素永远不能被删除 六、D)以上三种说法都不对 七、(2)下列叙述中正确的是 八、A)有一个以上根结点的数据结构不一定是非线性结构 九、B)只有一个根结点的数据结构不一定是线性结构 十、C)循环链表是非线性结构 十一、D)双向链表是非线性结构 十二、(3)某二叉树共有7个结点,其中叶子结点只有1个,则该二叉树的深度为(假设根结点在第1层) 十三、A)3 十四、B)4 十五、C)6 十六、D)7 十七、(4)在软件开发中,需求分析阶段产生的主要文档是 十八、A)软件集成测试计划 十九、B)软件详细设计说明书 二十、C)用户手册 二十一、D)软件需求规格说明书

二十二、(5)结构化程序所要求的基本结构不包括 二十三、A)顺序结构 二十四、B)GOTO跳转 二十五、C)选择(分支)结构 二十六、D)重复(循环)结构 二十七、(6)下面描述中错误的是 二十八、A)系统总体结构图支持软件系统的详细设计 二十九、B)软件设计是将软件需求转换为软件表示的过程 三十、C)数据结构与数据库设计是软件设计的任务之一 三十一、D)PAD图是软件详细设计的表示工具 三十二、(7)负责数据库中查询操作的数据库语言是 三十三、A)数据定义语言 三十四、B)数据管理语言 三十五、C)数据操纵语言 三十六、D)数据控制语言 三十七、(8)一个教师可讲授多门课程,一门课程可由多个教师讲授。则实体教师和课程间的联系是 三十八、A)1:1联系 三十九、B)1:m联系 四十、C)m:1联系 四十一、D)m:n联系 四十二、(9)有三个关系R、S和T如下: 四十三、则由关系R和S得到关系T的操作是 四十四、A)自然连接

EXCEL VBA方法参考手册

Excel VBA 学习资料 函 数 参 考 手 册

目录 一些对象的应用方法 (4) Add 方法 (5) Add方法(Dictionary) (6) Add 方法(Folders) (6) Assert 方法 (7) BuildPath 方法 (8) Clear 方法 (8) Close 方法 (9) Copy 方法 (10) CopyFile 方法 (10) CopyFolder 方法 (11) CreateFolder 方法 (12) CreateTextFile 方法 (13) Delete 方法 (14) DeleteFile 方法 (14) DeleteFolder 方法 (15) DriveExists 方法 (15) Exists 方法 (16) FileExists 方法 (16) FolderExists 方法 (17) GetAbsolutePathName 方法 (17) GetBaseName 方法 (18) GetExtensionName 方法 (18) GetFile 方法 (19) GetFileName 方法 (19) GetFolder 方法 (20) GetParentFolderName 方法 (20) GetSpecialFolder 方法 (21) GetTempName 方法 (22) Hide 方法 (22) Item 方法 (23) Items 方法 (24) Keys方法 (24) Move 方法 (25) Move 方法(UseForm) (25) 1、应用于 (25) 2、请参阅 (25) MoveFile 方法 (25) MoveFolder 方法 (26) OpenAsTextStream 方法 (27) OpenTextFile 方法 (28) Print 方法 (30)

c语言Socket编程

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 Socket建立 为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为: int socket(int domain, int type, int protocol); domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型: SOCK_STREAM 或SOCK_DGRAM,Socket 接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值 "0"。 Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上 "建立一个Socket"意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。 Socket配置 通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。 Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。Bind 函数原型为:

写给初学者──如何学习C语言

写给初学者──如何学习C语言(For computer related professional and programming of scholars........) 学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你需要经历艰苦的过程。 一、要读就读好书,否则不如不读 所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。 大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的(PS:这句话不假,的确够浅显的,不过入门也够了,看过後在读别的书就不会太难了)。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误(PS:的确有错误,看的时候多注意下)。好了,这本书我也不想说太多了,有兴趣大家可以百度一下:) Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。 如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。然后你可以挑战一下《Expert C Programming》(中译名《C专家编程》),书如其名,这本书颇具难度,一旦

Socket编程(最新,带例程)c语言

最新版Socket编程,后面带有程序实例,并通过调试,可以直接编译运行;希望对大家有帮助。 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 Socket建立 为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为: int socket(int domain, int type, int protocol); domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型: SOCK_STREAM 或SOCK_DGRAM,Socket 接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值 "0"。 Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上 "建立一个Socket"意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。 Socket配置 通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。

在VS2019上编写运行调试C语言使用手册共11页文档

在VS2005上编写、运行、调试C语言程序 目录 前言:关于C/C++编译器的简单介绍........................ - 2 -1.编辑、编译与运行 ................................... - 2 -2.调试技术 ........................................... - 5 -设置断点........................................... - 5 -调试运行........................................... - 5 -快速监视........................................... - 7 -3.小结.............................................. - 10 -4.附:连接lib静态库文件示例......................... - 10 -

前言:关于C/C++编译器的简单介绍 Turbo C 2.0发布于1989年,对历史并不太长而发展却神速的IT业来说,确实是古董级的软件了。但它几乎是最后一个专门为C语言设计的开发环境,具备学习C语言的一切条件,没有任何非C语言的东西干扰初学者,所以一直被各大高校的C语言课堂采用。 C++的发展使C++的开发环境大行其道。因为C++几乎完全兼容C语言,两者无论编译器还是编辑器、调试器都可以用同一套程序实现,而且C++共享C的库函数,很多软件还是用两者混合编程实现,所以基本所有的C++环境都同时支持C语言。 上学期使用的Dev-c++是Windows平台下C++ IDE开发环境,属于共享软件。界面亲切优雅,size也不大,其后续版有中文语言支持,无需汉化。该编译器适合于规模较小的软件项目。 美国微软公司出品的Visual C++(以下简称VC)是Windows平台上最流行的C/C++集成开发环境。从1993年发行1.0版本开始,历经多年锤炼,于2003年推出最新的7.0版本(Visual C++ 2003)。VC系列产品具有稳定而强大的IDE开发环境,以及丰富的调试功能,微软于2005年底发布Visual Studio 2005。 本文将介绍在VS2005下如何开发C语言程序。 1.编辑、编译与运行 下面以创建一个判断是否是闰年的程序来演示如何使用VS2005开发C程序。

关务Excel实用函数技巧

关务核销EXCEL实用函数技巧 想想之前在做手册手工核销表的时候的艰辛,故把我了解的一些操作技巧与大家分享一下,操作函数有时候能大大简化数据运算和方便手册手工核销作业,甚至影响核销的成败。学习函数又是枯燥的,以下就从基础的讲起,希望能给做关务的兄弟姐妹带来点方便。(当然这方面财务做成本的多数是精英,有空也可以跟你们做成本的同事学习下) 一、基础函数:IF的使用 IF:可以根据不同的条件,对数据做相应的计算和结果选择(附表-其它函数中的第一个) 好处:可以对于一些管理表单做条件设定用,使得结果自动带出;对于手册核销差异,可以设定自动带出“余料结转/差异补税”等说明 例子:如IF((G6-F6+1) >H6,"延误",0)表示:G6栏位的值-F6栏位的值再+1,如果大于H6栏位的设定值,就显示为“延误”,否则显示为0 备注说明: 1)这个函数就有很多变数,大家也可以设定为IF((G6-F6+1) >H6,"延误","正常"),则显示为“正常”(如表) 2)对于前面的条件,也可以设置是多种状态,有时候对于数据的选择能较好的利用。 二、查找函数:VLOOK UP和TRANSPOSE 1、VLOOK UP:此函数是根据两个工作表中的一个参照值,去抓取另一个工作表中,你要的值。 好处:当在较多没有规律排列的数据中,找出另一表中其对应的值(也可以没有规律),用此最方便(参考附表) 例子:比如现列出部分没有规律的型号,要求在工作表“出口汇总”中找出其出口数量,此时就可以用该函数VLOOKUP(C13:C22,出口汇总!D:P,13,0),拉下来就可以带出你要的值了。 操作方式: 1).在出口数量第一个栏位(当然也可以是其它栏位),=后,在函数中选择“查找函数”VLOOKUP,确定后跳出选择框,此时你就可以选择你的参照数据了; 2)光标移在lookup_value中,可以选择部分参照值这一列,比如附件中将鼠标从型号xxx132栏位拖到xxx145,在跳出的选择表中第一栏lookup_value就显示“C13:C22”(刚选择的区域),当然正常的可以直接选择整列C列作为参照值的,操作更方便; 3)再将光标移在table_array之后进入要获取数据的工作表中,选择同样的参照数据,如选择在“出口汇总”的规格型号,即在D列,同时将鼠标按住从D列一直拉到你要的数据“出口数量”P这一列,注意在拖的过程中光标处会显示13C,其实也就是从参照数据的列数起第13列,此时跳出的选择表中,第二栏table_array 显示“出口汇总!D:P” 4)再在下面的两个栏位col_index_num和range_lookup中,分别填上13和0(默

相关文档
相关文档 最新文档