C++学习笔记
2015.1.5之前的内容复习,来自C++Primer Plus
1、什么是面向对象的编程?
简单来说,就是编程时不用考虑繁琐的格式。就好像程序有自动识别的功能,能针对不同的数据类型自动使用不同的处理方法。而且这些编程语句的编写是很简单的。编程者不需要理解这些操作的底层实现,因为这些操作的底层实现是很繁琐的,而且没必要知道的。编程者只需要正确使用这些操作,它们既简单又高效。
C++既有面向对象的特性,又有面向结构的特性,C++像是一个桥梁。向下,可以用面向过程的方法和思想编写程序。中间,能用过程化的程序实现面向对象的功能。向上,可以直接使用封装好的函数,完全实现了面向对象的编程。
2、C++中哪些特性体现了面向对象编程?
2.1 类的概念:
C++中扩展了C中结构体的概念,并形成了“类”的概念。类和结构体类似,能从不同维度描述同一个事物。例如,若将每个学生个体看做一个事物,则可以从身高、体重、相貌方面描述他。类就提供了这样一种描述方法。在这个例子中,学生个体就被称为“对象”,描述学生的角度就被称为“成员”。
但是,与C语言不同,C++不但提供了数据的表示方法,还规定了数据的处理方法,这就是成员函数的概念。C语言中,复杂的数据可以用结构体表示,但是对复杂数据的处理仍然很不方便。C语言中若想对结构体进行操作,只能单独地对结构体的某个成员进行操作。这样就非常不方便。C++中,由于定义了成员函数,程序员可以很轻松地对整个对象进行操作、对对象的多个成员进行操作或者对成员的单个成员进行操作。这样,C++类的作用就凸显了:编程人员可以更方便地处理复杂数据。另外,在使用程序时,编程人员可以不用理会程序的底层实现,而只要知道这个成员函数该如何使用就可以了。
2.2 成员函数
成员函数是在成员的类中定义的。公有的成员函数可以在其他函数中被调用,私有函数只能在类的内部被使用。成员函数最根本的特性是需要被类对象调用。成员函数看似没有形参,但实际上,类对象就是一个形参。通过这个调用过程,对象的各个值被传递到函数中。
2.3 友函数
友函数可以对私有的类成员进行操作,并且不需要由成员调用。友元函数的一大特点是,由于不需要成员函数调用,成员必须作为参数输入到函数中。例如,在具体的成员函数中,函数的一个参数就是调用函数的对象本身。但是,在友函数中,操作对象一定要闲式地被作为参数,列在友函数的形参中。
2.4 虚函数
虚函数是C++面向对象编程的一个重要特性。这个特性,可以使编程人员不必拘泥于数据格式的细节。虚函数的作用是,用相同的函数名,针对不同的类,调用不同的操作。编程人员不需要关注对象的类型,只需要调用虚函数,编译器会根据对象的类型,自动“解读”数据的类型并进行相应的操作。
2.5 操作符重载
操作符的重载与虚函数是类似的。对已有的操作符,在类中定义一种新的含义。当相应类型的对象调用这个操作时,操作符会根据对象不同,而实现不同的功能。
2015.1.12 内容很多来自网络的各类博客(cnblogs)。这些内容比书上解释的通俗易懂,是很好的资料来源
2.6 类的继承
2.6.1 成员类型:私有、公有和保护
私有成员是这个类所特有的,只有通过这个类定义的函数才能访问。即便是派生类也不能直接访问基类的私有成员,即私有成员不能被继承
保护成员:介于私有和公有之间。私有是说,他不可通过非成员函数访问。公有是说,它可以被继承。也就是说,保护成员只能被本类的函数或派生类的函数访问。
公有成员:可以在任何地方,用任何函数访问
2.6.2 继承类型
继承的声明形式:class 派生类名:访问控制基类1,访问控制基类2,……
共有继承:比较简单,就是在基类的基础上再做补充。声明方式为:class Aa:public A。Aa类就是A的公有继承。Aa可以通过调用A中的函数对A私有成员进行操作。
私有继承:基类的公有成员和保护成员全部继承为派生类的私有成员。
保护继承:基类的公有成员和保护成员全部继承为派生类的保护成员。
单继承还是多继承:单继承就是由一个基类产生一个派生类。多继承可能是一个基类产生多个派生类,也可能是一个派生类继承了多个基类。
虚基类:
2.7在类的声明中使用另一个类
2.8 析构、储存空间
2.9 模板(体现C++代码重用的思想)
C++中模板的存在是为了针对不同的类实现不同的功能。例如:编写了一个swap(a,b)函数,用来交换整数int a和int b的值。但是,如果我想这个函数如果也能交换double类型的a和b就好了。于是我在函数后面再加一个参数,用于表示这个函数该操作什么类型的数据。比如:swap
这个功能是:对有一定相似性的类,提供了简便的操作方法。以刚才的swap函数为例,无论是交换int类,还是交换double类,其功能就是交换,这就是其内在的相似性。这种内在的相似性决定了可以死使用这种模板功能,实现代码重用。
C++中的两种模板:类模板和函数模板。
类模板:声明格式:Template
调用格式:Example
分析:这种模板的基础是类结构上的相似性。比如,类声明了不同大小的堆栈,比如20个长度的堆栈和40个长度的堆栈。尽管长度不同,但都是堆栈,
这就是类结构上的相似性。这种情况下就比较适合用类模板。
函数模板:声明格式:Template
调用格式:Example
分析:这种模板的使用基础是操作上的相似性。比如刚才的swap函数的例
子,不管是int类还是double类,都是需要交换的,这就是操作上的
相似性。这种操作上的相似性就是使用类模板的基础。
2.2.10异常
C++中可能出现两类错误。一类是语法错误,这类错误可以通过编译器的检查检测出。另一类错误是算法上的错误,算法上的错误不会引起编译器告警,但是可能使运行结果出错,进而导致数组下标溢出,系统内存不足等情况。比如,func函数返回两个数的商,如果除数是0,那么运行就会出错。C++提供了一些工具,让我们能检测并处理第二类错误。
C++提供了三个函数处理这类错误:try函数,throw函数和catch函数。
首先是throw函数,这个函数用来抛出一个异常的变量。比如变量y异常,那么throw y就将表达式y抛出。
Try和catch要配合使用。其关系类似于do……while。Try{。。。},catch(数据类型){}。如果try的大括号内执行了throw语句,则接下来会跳转到catch函数中,catch的作用是根据数据类型判断抛出的数据。Catch内的函数体是用来处理异常的。
比如,double类型的变量y不能等于0,如果等于0,会被认为是异常而执行throw语句。那么程序可以这样写:
Double y=5;
Try
{
If (y==0)
Throw y;
}
Catch (double)
{
Cout<<”error”;
}
函数解析:try函数将判断y的值是否正确。若y不等于0,则不执行throw语句,那么也就不会执行后面的catch函数。如果y=0,那就会执行throw语句,抛出一个double类型的变量(也就是y的类型)。然后,程序会自动进入catch函数,处理这个异常。
2016.1.13
3、在C++中读取和输出文件
C++对文件操作的函数包含在fstream.h文件中。下面写几个简单的典型函数:
#include
Void main()
{
Ofstream SaveFile(“cpp-hone.txt”); //SaveFile的作用是,如果没有文件,则建立,
若没有,则打开一个文件。
SaveFile<<”I Live C++”; //像cout一样,可以直接输出
SaveFile.close();
}
Void main()
{
Ifstream OpenFile(“cpp-home.txt”);
Char ch;
While(!Openfile.eof()) //若没读到文件末尾,则OpenFile.eof()返回0
{
OpenFile.get(ch); //将txt文本的字符读入到ch变量中
Cout< } } 问题:C++程序怎样知道文件的位置? 4、C++中的标准模板库 标准模板库就是C++自带的、可以直接使用的模板。在编程时直接调用这些模板,可以实现对不同的类成员进行操作。比如,vector模板可以储存类的对象,并对这些对象进行排序、比较等操作。 4.1Vector模板类 Vector模板类是个容器,里面能储存任意个数的对象,但一个容器中的所有对象必须类型相同。Vector容器中的类是连续储存的。 Vector的连续储存特性和数组的连续储存特性是相似的。不同之处在于,数组的连续储存是静态的,一旦开辟就无法扩充。Vector的连续储存是动态的,当Vector需要扩容时,系统会自动寻找一片新的连续空间,然后将旧的内容全部复制过去,再把旧的储存空间销毁。 4.1.1 Vector模板类的典型用法 Vector Vector Vector Vector 相同 C++的深层理解和C++的语言思想 1、静态多态和动态多态 2016.1.16 由学生信息管理系统想到的大型C++程序设计原则: 1、对大型程序来说,软件的架构设计、逻辑设计、程序框图是非常重要的。这些问题不能等到编程的时候解决,一定要先解决这些问题再开始编程。 2、以学生信息管理系统为例,在添加学生对象的时候,要知道之前已经有多少个对象,这需要由别的函数来实现。这个问题就是在编写程序的过程中在知道的,所以添加起来就很混乱。正确的做法是在软件需求分析的时候就把这些关系分析清楚。 3、为什么说尽量少用外部变量?C++中也像C语言中一样可以定义外部变量吗?如果没有,C++中的变量是怎样跨函数进行传递的呢? C++中的容器 1、什么是容器? 简单来说,容器中储存着很多某个类的对象(前提是,这些对象必须属于同一个类)。将这些对象放到这个容器中后,我们就可以对这些对象进行统一的操作,比如查询和排序。 2、容器和类有什么不同? 同样是包含很多对象,但类和容器是有不同的。 类更偏向一种定义,着重描述数据结构上的问题。但对具体对象之间的关系,类是无法描述的。比如,将“人”这个类定义为“身高”、“体重”、“肺活量”。然后,对这个类扩充一些对象。这些对象都有“身高”、“体重”、“肺活量”这些数据,但这些对象之间没什么联系。他们可能被储存在松散的空间中。 容器偏向于描述同类数据的各个对象之间的关系。比如“人”这个类中的各个对象。一个容器中包含这些对象后,这些对象被储存在连续的储存空间中,然后我们可以对这一系列对象进行整体的操作,这些操作侧重于描述这些对象之间的联系。比如,我们可以对这些对象进行排序,或者在这些对象中查找某个对象。 3、数组、类和容器 数组、类和容器有着奇妙的对应关系。将“类”和“容器”的作用相加,就是数组的功能。 比如,定义一个数组int number[20],这个定义同时完成了两件事:第一,定义了数据的类型和结构,这里面的元素都是int类型;第二:将这些元素储存在了一片连续的储存空间中。 但是,数组只能储存结构很简单的数据,对于结构复杂的数据,数组是无能力为的。这就是为什么会有“类”和“容器”。“类”和“容器”共同出现,替代了数组的功能。“类”的作用是确定数据的结构,类似数组中“int”的功能,它定义了数据的结构。“容器”负责将这些具体的对象储存在连续的储存空间中,类似后面“number[20]”的功能。“类”和“容器”共同工作,完成了对复杂数据的归类,可以看做是对“数组”功能的扩充。 4、典型的容器种类 4.1 顺序容器 顺序容器用来排序。典型的顺序容器包括list,vector和deque,但是这三个容器的具体用法还不明确。 4.2关联容器 关联容器可以实现查询空能。典型的关联容器包括map、set。 Map包含两个要素:键(key,理解为关键词)和值(value,理解为需要的值)。例如,我们需要查询某人的电话号码,就需要输入某人的名字,然后输出这个人的电话号码。在这个例子中,key就是这个人的名字,而value就是这个人的电话号码。但是,value的值是不是可以是很多成员呢?这个问题尚不明确。 Set功能比map要稍微简单一些,set只包含单一键值,功能是查询这个键是不是出现过。比如,在一段英文文本中查询but单词是否出现过,就可以用set容器。 5、list、vector和deque容器的比较 5.1 Vector容器 Vector容器默认在末尾处新增或删除元素。比如,原来的容器有10个元素,那么,删除第10个元素或者增加第11个元素都是很方便地。因为vector容器默认就是在末尾处修 改容器。这种情况下,更改容器时,vector不需要改动其他的元素,所以这种情况下用vector 容器速度最快。 但是,如果想在vector容器的中间位置删除或者增加元素,这是不方便的。这时候,vector 容器会将所有的旧元素重新复制到新的一片储存空间中,并在这个过程中删除旧元素或增加新元素。 所以,Vector容器最适用的情况是:在容器末尾更改元素。 5.2 deque容器 Deque容器和vector容器很相似。不同的是,deque容器不仅支持在容器末尾更改元素,还支持在容器开头更改元素。因此,在两种情况下,deque容器不需要改动其他元素。 5.3 list容器 Vector容器和deque容器都是储存在一片连续的储存空间中的,所以在访问某个元素的时候效率很高(不是很懂)。与它们不同,list容器中的元素不是储存在连续储存空间中的,它们被储存在分散个空间中,通过指针,以链表的形式相互联系。 在这种情况下,对list容器添加或删除元素都是很方便的,只需要改动几处指针就可以了。但是,访问随机元素的效率被降低(不是很懂)。另外,每个元素还需要首、尾指针两个额外的储存空间开销。 6 vector容器详解 6.1 容量(capacity)和长度(size) 容量和长度的含义是不同的。容量是指:为容器分配的储存空间中,一共能储存多少元素。而长度的含义是:当前容易中共有多少元素。 以vector容器为例,实际上系统会为vector容器自动多分配一些储存空间。比如,当前vector容器中可能有10个元素,那么它的size就是10。但是,实际上系统为vector分配了15个元素的储存空间,那么它的容量就是15。这样分配储存空间,可以使vector很方便地在末尾添加元素,而不必先拷贝所有元素。 6.2 对list容器和vector容器在应对不同数据类型时的比较 暂缓 6.3 建立一个顺序容器 一个简单程序如下: #include Vector Student studentx; //定义一个student类的对象studentx While(cin>>studentx) //每次有数据读入时,将数据储存在studentx对象中studentVector.push_back(studentx); //将studentx对象添加到studentvector容器 中,注意,用的函数时push_back 疑问:这样就不用单独为对象的集合定义一个数组了,但是如何区分不同的对象,它们有不同的名字吗?类对象数组是静态的,vector容器是动态的,感觉vector容器更加智能。 6.4 vector容器元素的基本操作 Vector empty赋值 Vector 若缺省,则所有成员值为缺省值。 另外,可以人为修改studentVector的长度。 studentVector.resize(2*studentVector.size()); 注意:这里Vector 问题:若一个类的成员为私有,能用vector吗 7、迭代器 迭代器听力来有些吓人。若以数组为例解释一下,那么这个概念就好懂很多了。 比如一个数组int number[i],i是一个参数,这个参数用来确定元素的位置。将这个概念移植到vector容器中来。假设iter是某个容器的一个迭代器(iterator),这个iter其实和数组中的”i”功能是一样的,用来确定访问哪个元素。++iter是指访问容器的下一个元素。而#iter是指取出iter所指向的元素的内容。从这里可以看出,实际上iter是一个指针。 7.1 迭代器的声明和赋值 Vector 这个语句的作用是,声明一个student类型的迭代器iter,将iter的初值设定为:studentVector容器的第一个元素的指针。 8、在容器的中间插入元素 前面的文章介绍了用push_back函数在容器底部添加元素的方法。但是,通过iter迭代器,我们可以实现在容器的任意位置添加元素的操作。 8.1 一个简单的例子 #include Vector Vector Vector Vector Iter=find((iter_begin,iter_end,son); //find用来寻找son元素在容器中的位置,返回一个 指针。Son是一个student类的对象。也就是说, Vecotor中的每个对象都是有名字的。这么说来, 用一个数组来表示所有对象也是有必要的?另外, find函数似乎不能直接查找成员。那么我猜测,肯 定还有别的函数能实现“直接查找成员”的功能。 studentVector.insert(iter,spouse); //spouse是另一个student类对象的名字。Spouse将 被插在iter的前面。需要说明的是。 studentVector.begin()指向的不是最后一个元素,而 是最后一个元素的下一个元素。因为,push_back 函数等价于insert(studentVector.end(),XXX) Insert还有许多其他的操作,比如插入好多个元素,或者插入一段范围内的元素。这些用法在后面再学习。 9、储存文本行 10、上午学习知识的总结 上午主要熟悉了vector容器的用法。Vector容器可以将所有的属于同一个类的对象存到一片连续的储存空间中。典型的用法是,定义一个对象,这个对象只用于临时存储内容,而永久的内容被通过这个临时对象存在vector容器中。 在需要修改vector容器中的元素时,用insert和erase进行添加或删除操作。这个过程用到了iter指针。Iter指针被称作迭代器,它可以指向vector容器中某个具体的元素。 从另外一个角度说,不是每个vector容器中的元素都需要名字,因为iter指针可以指向任意一个元素,所以名字不是必须的。 这个体系唯一的问题是,find函数只能查找某个元素(对象)的名字,而不能查找对象的某个成员的名字。只要解决了这个问题,其他问题就很容易解决了。 这样一来,学生信息管理系统就只有两个需要解决的问题了,第一个是排序问题,第二个就是find函数的功能问题。 11、关联容器map和set 写在之前:理想的查询方式:能按照对象的某个成员的值进行查询。若查询到,能返回对象的指针。这样,我们就能直接对那个成员进行操作了。 11.1 map关联容器的两个实例 Class employee; Map 上面这个函数的作用是,根据员工的编号,找到这个雇员。Int是键(key)的类型,而employee*表明了返回值(value)的类型。Employee*是一个指向employee类对象的指针。 Class employee; Vector Map 这里看出一个有趣的现象:模板<类>=类。 这里的key仍然是vector,所不同的是,返回值value不仅仅是employee类的指针,而是vector 问题是,这里为什么不能返回employee类的指针? 11.2 map应用的一个实例 String query(“Bella”); Vector Loc=temp_map[query]; 其中,temp_map由map容器定义 Map 上面语句的含义是:temp_map将查找名为“query”的string类,这个参数叫key(关键词)。若查找到,将返回一个指向vector 唯一的问题:返回参数vector 自己尝试解答:若employee不在某个容器中,则返回employee*;若employee的对象存在某个容器中,则返回(vector 11.3 map关联容器的一个操作:如果没有则添加 下面这个函数的功能是:查找一个类型为string的,名为“Anna”的内容。如果有,则返回1;如果没有,则添加一个这样的对象,并返回0。 Map Count_name[string(“Anna”)]=1; 这样一来,问题只有一个了,解决排名问题,包括对象成员值的比较和排序算法。 用Vector表示对象是非常方便的。studentVector[x]就可以完成,非常方便!! 总结:vector容器的两个特别方便的特性: 1、vector Vector 这个函数的输入参数是vector 2、容器studentVector的某个对象可直接表示为studentVector[x],这样就可以直接对这些对象进行操作了。 这样就只剩一个问题了,比较对象的某个成员,并将各个对象排序。 C++大型程序设计的一些小问题 1、vector容器可以按顺序储存对象,这是非常方便的 2、Vector容器可以直接在各个函数之间进行传递 3、C++中没有了全局变量的概念,取而代之的是名称空间。通过在变量名前加上名称空间的前缀,变量可以被跨函数编辑,这是非常好的。比如,将某个需要在多个函数中用到的变量定义在一个单独的名称空间中,这样,这个变量就能在不同的函数中使用了。 2016.1.17 Vector向量元素的表示方法有两种 1、像数组一样,用下表表示。例如,若studentVector是一个向量,studentVector[x]可直接表示某个元素 2、像数组一样,可以用指针表示。指针的声明是:vector 2016.1.18 Vector向量的排序 1、sort函数 Sort函数在#include Sort(容器指针地址,容器指针地址,排序方式)。 比如:sort(studentVector.begin(),studentVector.end(),cmpGrade); cmpGrade是一个用户自定义的函数,它规定了排序的规则。该函数的定义是: Bool cmpGrade(比较对象的类型对象1,比较对象的类型对象2) { Return 对象1.某个值>对象2.某个值//当然也可以是< } 例如,return a>b,则当a>b时返回1,当不是时返回0。 2、Strcmp 这个函数用来比较两个字符串。如果第一个大于第二个,则返回正数。第一个小于第二 个,返回复数。两个字符串相同,则返回0。 3、关于C++做GUI 根据知乎答案的说法,C++不太适合做GUI,数据结构比较静态,用作大型程序的底层函数。 如此看来,用C#做GUI,用C++做底层是比较好的选择。那么现在只需要弄明白两个问题:1,C#中怎样写一个窗体程序。2,C#和C++混合编程(C#有接口的概念,但不是用作混合编程的) ●C语言入门手册 ●这里不是教你什么知识,而是给你澄清一些资料,只给对编程一窍不通的或 者刚入门的人看。如果你尚未学习或者才学习不够一天,一定要看这手册,这份手册已经讲述的知识,我们不会在版面给予回答,此手册我会尽量保持准确,但如有不正确,请指正,我也会不断更新此手册 ●Q:什么是C? ●A:一门面向过程的计算机语言,发明至今已经差不多有三十年历史,由于 它相对其他高级语言高效,运行效率又比较接近低级语言,所以至今仍得到广泛的引用,无论你用windows还是linux,你现在看到东西的底层都是用C 写的,而大部分的网络协议都是用C实现的,画面最漂亮的游戏用C实现的,工业控制程序也是用C实现的。C不是万能,也不是垃圾,只是一门某些方面适用,某些方面不适用的语言 ●Q:什么是C++? ●A:一门面向对象的计算机语言,发明至今已经有二十多年了。由于面向对 象编程对程序架构有较好的帮助,因为比较适合构建大型的系统(当然,学术界对此存在争论),但无论如何,C++由于和C一样接近底层,而且又面向对象,所以也得到广泛的使用。C++不是万能,也不是垃圾,只是一门某些方面适用,某些方面不适用的语言,不要向某一个笨蛋一样认为c + 类== c++ ●Q:TC,VC,BC,BCB是什么?有什么区别?谁好? ●A:它们都是开发C/C++的开发环境,是软件。它们是不同时期由不同公司 发行的软件Turbo C ,Borland公司在八十年代末期发行的C语言的开发环境Turbo C++,Borland公司在八十年代末九十年代初发行的C++语言的开发环境Visual C++,Microsoft公司在九十年代至今发行的C/C++开发环境Borland C++,Borland公司在九十年代中发行的C/C++开发环境Borlan C++ Builder,Borland公司在九十年代后期至今开发的C/C++开发环境,与其他开发环境不用的是它属于快速应用程序开发(RAD),可以让你不写代码就能建立程序,当然它的运行效率见仁见智没有什么是万能的,不同场合用不同的东西而且C/C++还有很多开发环境,譬如gcc,watcom C++,Dev C/C++ ●Q:什么语言/开发环境最好? ●A:没有最好,只有最适用某方面 ●Q:需要什么基础才能学C/C++ ●A:至少学过幼儿园语文,小学英语,小学数学才能学,所以先确定你拥有 小学学历,然后就能学了至于学习C++前是否需要学C,C++的发明者认为不用,但见仁见智 ●Q:如何更有效的学习C/C++? ●A:不断的看书+实践,先把书上的练习题做完再说,务必记住不要钻牛角尖, 很多初学者经常犯这样的错误,不要盲目的提出问题,现在看来是问题其实在以后的实践和学习中都会慢慢理解的,任何东西都需要一个过程。万万不可浮躁。 ●Q:TC能开发windows软件吗? ●A:不能,因为不同系统,生成的程序格式不同 ●Q:要多久才能成为高手? ●A:当你不再问这个问题的时候,总是会有比你技术高的人,也许你在你生 活的环境中没有,的确可以说你在这个小范围是高手,但是再在别的地方一定会有比你厉害的人只是你没有接触到而已 ●Q:学C/C++有什么用? ●A:先想想你为了什么而学,想不到就不要学 ●Q:学完C/C++又能怎样 ●A:没怎样,学是为了使用服务的,只证明你会一门语言,但不等于你会开 发软件。就像学外语,为的是跟外国人交际,但如果你不懂交际,即使精通英语,法语,日语,朝鲜语,阿拉伯语,西班牙语……还是不会跟人交际。 你应该继续学习软件开发的知识,包括数据结构,算法,软件工程等等,还有要提高数学水平,譬如微积分,离散数学,矩阵,概率,统计,数值分析。 ●Q:我有很多不懂,怎么办? ●A:查帮助,搜索引擎。最著名的帮助文档叫MSDN,我们主要使用其光盘发 行版,D版可以从电脑城买,正版可以去微软订购,如果没有光盘可以去https://www.doczj.com/doc/f76221677.html,查询。 ●二、开始学习了 ●Q:我在TC看到缺少cos.obj的提示,为什么? C#学习笔记 1.C#具有所有面向对象的语言的所有特性:封装,继承,多态。在C#系统中,所有的类型都可以看作一个对象。 C#只允许单继承,即一个类不会有多个基类,C#不会有全局函数,不会有全局变量,不会有全局常数,所有的一切只能封装在一个类中。 https://www.doczj.com/doc/f76221677.html,包括四个部分:vos类型系统。元数据;公用语言规范;虚拟执行系统。 https://www.doczj.com/doc/f76221677.html,ing system表示导入名称空间。 让我们从第一个程序开始就记得:每个东西都必须属于一个类,类里面的方法总是为我们完成某件工作的。 在C#中,程序的执行总是从main()方法开始的,一个程序中不允许出现两个或两个以上的main()方法。对于习惯学C控制台程序的读者,必须要牢记:main()方法必须包含在一个类中。 利用string可以方便地对字符串进行连接或剪切。例:string s=”good”+”morning”;char x=s[3]字符串可以通过下标进行索引,得到一个字符。 6.我们可以用//进行单行标注,/* */进行多行标注。 在C和C++中,任何非0值都表示真,在C#中,任何非0值都不能代替true.在其它类型的整型值和布尔值之间不存在任何的转换,将整型转换成布尔型是不合法的。。 把一系列相关的变量组织成单一实体的过程称为生成结构的过程。这个单一实体的类型叫结构类型,每一个变量就是结构的成员。 9.结构类型包含的成员类型可以相同,也可以不同。我们甚至可以把一个结构类型当作另一个结构成员的类型。 枚举实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。结构类型变量的值由各个成员的值组合而成。而枚举则不同,枚举类型的变量在某一时刻只能取枚举中某个元素的值。按照系统的设定,每个元素的类型都为整型。且第一个元素的值为0,后面的每个元素梯加1,也可以直接赋值。如把前面第一个元素的值设为1,后面的元素不用设,系统自动将后面元素的值递加1. C#中另一大数据类型是引有类型。其含义是该类型的变量不直接存储所包含的值,而是指向它所要存储的值。 也就是说引用类型存储实际数据引用值的地址。 类是面向对象编程的基本单位,是一种包含数据成员,函数成员和嵌套类型的数据结构。类和结构都包含了自己的成员,但它们的区别是:类是引用类型,而结构是值类型。 13.如果我们对某个类定义了一个变量,则我们就将它称为类的一个实例。 我们常用到的类:object类。这个类是其它所有类的基类,其它类型可以直接或间接地从object类中继承。因此,对一个object类的变量可以赋于任何类型的值。 代表?在声明代表时,只需要指定代表指向的原型的类型,它不能有返回值,也不能带有输出类型的参数。 如:delegate int Mydelegate().在使用的时候:Mydelegate d=new Mydelegate(p.instanceMethod).为什么不用delegate d=new Mydelegate(p.instanceMethod)呢?原因是delegate相当于class需要一个名字,class myclass{…}这个class的名字是myclass而且它包含有其它元素、常数或者函数,变量等。跟char a=a不同,它不包含有其它的元素,a就是一个变量。而myclass不是变量,它只一个名字。而myclass a=new myclass(); a才是变量,是类的一个实例。在这里,这个delegate的名字是Mydelegate,也并不是一个变量。 16.变量从用户角度来说,是存储信息的基本单元,从系统角度来说,变量就是计算机内存中的一个储存空间。 17.静态方法不能用类的实例来访问,必须用类名来访问。 数组的声明:数组的类型[数组的元素个数] 数组的名字;数组个数可以通过数组名加圆点加Length获得。如arr.Length表示arr数组的个数 19.在进行批量处理数据的时候,我们要用到数组.数组是一组类型相同的有序数据. 数组的初始化:int[] a1=new int[]{1,2,3};为什么是new int[],而不是new a1呢:因为int[]是类型,a1是int[]类型的一个实例.而且a1所代表的是{1,2,3},并不是函数.与delegate int Myclass();不同,Myclass()虽然是一个名字,但它可以代表一个函数,不是常数.原则:类型后面的名字如果可以代表函数,则这个名字就是一种类型.如果类型后面的名字代表常数,则这个名字不是一种类型,只是类型的一个变量.或者可以用另一种说法:如果名字后面含有(),{},[]则在赋值或设定实例的时候new后面要用该名字作为类型. 21.变量名不能与C#中的关键字名称相同。变量名不能与C#中库函数名称相同。 静态变量:static int a;一旦静态变量所属的类被加载,直到包含该类的程序运行结束前它将一直存在。 C#.NET是微软公司推出的一种类型安全、现代、简单、由C和C++衍生出来的面向对象的编程语言。掌握C#.NET的特点、程序结构、集成开发环境、C#语言的基本知识等,是利用好C#的前提。 本章内容 ?C#概述 ?C#语言基础 ?控制结构 ?数组 ?异常处理 1.1 C# 概述 C#是微软公司在2000年7月发布的一种全新的简单、安全、面向对象的程序设计语言。它是专门为.NET的应用而开发的语言。 https://www.doczj.com/doc/f76221677.html,简介 1..NET定义 .NET技术是微软公司推出的一个全新概念,它代表了一个集合、一个环境和一个可以作为平台支持下一代Internet的可编程结构。.NET的目的就是将互联网作为新一代操作系统的基础,对互联网的设计思想进行扩展,使用户在任何地方、任何时间、利用任何设备都能访问所需要的信息、文件和程序。.NET平台包括.NET框架和.NET开发工具等部分。.NET框架(Framework)是整个开发平台的基础,包括公共语言运行库和.NET类库。.NET开发工具包括Visual https://www.doczj.com/doc/f76221677.html,集成开发环境和.NET编程语言。.NET编程语言包括Visual Basic、Visual C++和新的Visual C#等用来创建运行在公共语言运行库(Common Language Run,CLR)上的应用程序。.NET框架结构如图1-1所示。 C#程序设计与案例教程 2 图1-1 .NET框架结构 2.公共语言运行库 公共语言运行库是.NET Framework 的基础。可以将运行库看成一个在执行时管理代码的代理,它提供核心服务(如内存管理、线程管理和远程处理),而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。公共语言运行库管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务。这些功能是在公共语言运行库上运行的托管代码所固有的。 3..NET框架类库 .NET Framework 类库是一个与公共语言运行库紧密集成的可重用的类型集合,是对Windows API封装的全新设计,它为开发人员提供了一个统一的、面向对象的、分层的和可扩展的庞大类库。该类库是面向对象的,使.NET Framework 类型易于使用,而且还减少了学习.NET Framework 的新功能所需要的时间。此外,第三方组件可与.NET Framework 中的类无缝集成。 例如,用.NET Framework 集合类实现一组可用于开发您自己的集合类的接口。您的集合类将与.NET Framework 中的类无缝地混合。 .NET Framework 类型使您能够完成一系列常见编程任务(包括字符串管理、数据收集、数据库连接以及文件访问等任务)。除这些常见任务之外,类库还包括支持多种专用开发方案的类型。例如,可使用.NET Framework 开发下列类型的应用程序和服务:?控制台应用程序。 ?Windows GUI应用程序(Windows 窗体)。 ?https://www.doczj.com/doc/f76221677.html,应用程序。 ?XML Web services。 ?Windows 服务。 例如,Windows窗体类是一组综合性的可重用类型,它们大大简化了Windows GUI 的开发。如果要编写https://www.doczj.com/doc/f76221677.html, Web窗体应用程序,可使用Web窗体类。 1.1.2什么是C# 1.C#及其特点 C#是微软公司在2000年7月发布的一种全新且简单、安全、面向对象的程序设计语 C学习笔记 一、数据 1.数据类型分类 2.变量与常量 变量是程序中数据的存储空间的的抽象。 typedef是C语言的关键字,作用是为一种数据类型定义一个新名字。 3.存储类 存储类的属性:作用域(空间)、存储期(时间)、链接点 存储方式:静态存储、动态存储。是就时间属性来区分的。 静态存储方式和静态变量是不同的概念。静态变量是就链接属性来区分的,有静态 局部变量和静态全局变量。 二、字符串格式化输入输出 三、运算符、表达式和语句 1.运算符种类 4.运算符优先级 结合性:同一优先级的运算符,运算次序由结合方向所决定。 结合方向由右向左:单目运算符、条件运算符、赋值运算符 简单优先级比较:单目运算符> 算术运算符> 关系运算符> 逻辑运算符> 赋值运算符 5.运算符相关知识点总结 算术---: 数据类型的转换:自动转换和强制转换 赋值---:赋值表达式的值与被赋值变量的值得关系; 赋值中的类型转换:特别注意有符号与无符号之间的转换造成的BUG; 关系---:if( 1 == a ){……},防止错写成“=”造成的隐藏BUG; 0为假,非0为真; 逻辑---:逻辑量,表达式的逻辑值(0 or 1); sizeof---:s izeof(<类型或变量名>); 相同运算符的的嵌套造成的表达式的拓展; 6.表达式的概念 四、程序结构和控制语句 1.3种基本结构:顺序、分支、循环 循环:当型循环和直到循环 2.C语言控制语句 (1)条件判断语句(选择语句):if、switch if:单分支、双分支、多分支 if语句的嵌套方式; if-else的配对——就近配对; 复合语句被看做是单条语句,且{……}后无“;” switch语句中case标签并没有把语句列表分为几个部分,它只是确定语 句执行的入口点,default作用和普通标号一样; (2)循环语句:while和do-while、for、goto-标号 (3)转向语句:break、continue、goto continue:之后语句不再执行,结束本次循环,开始下次循环; 51单片机C语言 相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚, 更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机 (Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没 什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大 家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想 学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什 么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机, 但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片 机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候, 我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出, 或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看 我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢这个问题,困扰了我好久。具 体选择C51还是A51呢汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上 书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似, 编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特 点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲 的全是C方面的,完全在浪费你的时间! 呵呵 ^_^ 第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件 仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使 你每天捧着本书,把那本书翻烂,也永远学不会单片机的!刚接触单片机的朋友,看了资料,一定会对以下几个词见的比较多,但是具体的概 C#工程项目学习笔记 using(C# 参考) using关键字有两个主要用途: 1作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。 using指令有两个用途:允许在命名空间中使用类型,这样,就不必在该命名空间中限定某个类型的使用;为命名空间或类型创建别名,这称为“using 别名指令”。 2作为语句,用于定义一个范围,在此范围的末尾将释放对象。 partial(分部、类型)(C# 参考) 分部类型定义允许将类、结构或接口的定义拆分到多个文件中。UserControl 类 提供一个可用来创建其他控件的空控件。 IContainer 接口 提供容器的功能。容器是在逻辑上包含零个或更多个组件的对象。override (C# Reference) 要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用override修饰符。 IDisposable .Dispose 方法 执行与释放或重置非托管资源相关的应用程序定义的任务。 base(C# 参考) base关键字用于从派生类中访问基类的成员:调用基类上已被其他方法重写的方法; 指定创建派生类实例时应调用的基类构造函数。 基类访问只能在构造函数、实例方法或实例属性访问器中进行。 从静态方法中使用base关键字是错误的。所访问的基类是类声明中指定的基类。ContainerControl .Dispose 方法 释放由容器占用的资源。 #region(C# 参考) #region使可以在使用Visual Studio 代码编辑器的大纲显示功能时指定可展开或折叠的代码块。在较长的代码文件中,能够折叠或隐藏一个或多个区域会十分便利,这样,可将精力集中于当前处理的文件部分。 https://www.doczj.com/doc/f76221677.html,ponentModel 命名空间ISupportInitialize 接口 指定该对象支持对批初始化的简单的事务处理通知。ISupportInitialize .BeginInit 方法 用信号通知对象初始化即将开始。 Control .SuspendLayout 方法 Label .AutoSize 属性 获取或设置一个值,该值指示是否自动调整控件的大小以完整显示其内容。Control .Location 属性 获取或设置该控件的左上角相对于其容器的左上角的坐标。 Point 构造函数 Control .Name 属性 获取或设置控件的名称。 Control .Size 属性 获取或设置控件的高度和宽度。 Size 构造函数 1.求两个数的最小公倍数: #include c语言学习心得体会一:c语言学习心得体会 c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,与计算机进行交流,因此,c语言的学习对我们尤其重要。 在这个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生,的在运用起来的时候还是感到很棘手,毕竟,万事开头难嘛。 由于时间的关系,我们的这次实践课程老师并没有给我们详细的介绍,只是给我们简单的介绍了几个比较重要的实际操作。包括了程序模块处理。简单界面程序。高级界面程序。程序的添加修改。用程序做一元线性回归处理以及用c语言程序来画粒度分布图等这几样比较重要的时间操作。 上机实验是学习程序设计语言必不可少的实践环节,特别是c语言灵活、简洁,更需要通过编程的实践来真正掌握它。对于程序设计语言的学习目的,可以概括为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。 c语言学习心得体会二:c语言学习心得体会(1116字) c语言是在国内外广泛使用的一种计算机语言。其语言功能丰富、表达能力强、使用灵活方便、既具有高级语言的优点,又具有低级语言的许多特点,适合编写系统软件。其功能强大,不仅用在计算机上广泛用在电子,机械等方面上,而且,所有的 windows,unix,linux,mac,os/2,无一例外,哪一个不是c语言写的?很多新型的语言如,c++,java,c#,j#,perl... 都是衍生自c语言。掌握了c语言,可以说你就掌握了很多门语言。 学习c程序这门课一年了,这是我们学的第一门专业课,在大学里c语言不但是计算机专业的必修课程而且也是非计算机专业学习计算机基础的一门必修课程。所以作为我这个计算机专业的学生来说当然十分重要,老师在第一节课说过,c语言是计算机的基础,大多数软件都需要用c语言来编写,通过一个年的学习,使我由初步掌握简单的应试知识到完成高难度的深入编程,如我们在编写一个较大的程序时应该把它分开成几个小程序来看,这样会容易得多。同时,我觉得c语言应该是操作和理论相结合的课程,在不断地编写中去思考,两者是不可分割的。 C语言基础知识 第一章数据库基础知识 1.基本概念:数据库、数据管理经历的五个阶段、数据库管理系统、数据库应用系统、数据库管理员。 2.数据库系统的组成:硬件系统、数据库集合、数据库管理系统及相关软件、数据库管理员和用户。其中数据库管理系统是数据库系统的核心。 3.数据库系统的特点:(1)实现数据共享,减少数据冗余(2)采用特定的数据模型(3)具有较高的数据独立性(4)有统一的数据控制功能 4.数据模型:实体间联系的种类:一对一、一对多、多对多。 5.数据模型的三种类型:层次模型、网状模型和关系模型。 6.关系数据库基本术语:关系、元组、属性、域、关键字、外部关键字。 关系的特点 7.关系运算:传统的集合运算(并、差、交)另一类是专门的关系运算(选择、投影、连接、等值连接、自然连接) 8.VF两种运行方式:菜单方式和交互式方式(命令方式和程序方式) 9.所谓项目是指文件、数据、文档和对象的集合,其扩展名为.pjx。 10.项目管理器包含的选项卡:全部、数据、文档、类、代码、其他 11.项目管理器各选项卡所包含的文件有哪些? 12.项目管理器可以完成对文件的新建、添加、移去、删除,但不包含重命名。 第2章 1.常量的种类:数值型、字符型、日期型、日期时间型和逻辑型 在书写字符型、日期型、日期时间型和逻辑型需要加定界符 2.变量是值能够随时改变的量。变量名的命名规则:以字母、汉字和下划线开头,后接字母、数字、汉字和下划线构成,不包含有空格 3.当内存变量与字段变量同名时,要访问内存变量需加前缀M.(或M->),例如M.姓名4.数组定义的格式DIMENSION数组名()、 创建数组后,系统自动给每个数组元素赋以逻辑假.F. 5.表达式的类型:数值表达式、字符表达式、日期时间表达式和逻辑表达式。每个表达式的运算规则与结果。 6.运算符$称为子串包含测试,格式<字符表达式1>$<字符表达式2> 7.SET EXACT ON│OFF的区别与含义。 8.逻辑型运算符有三个:NOT、AND、OR,其优先级顺序为NOT、AND、OR 9.常用函数数值函数、字符处理函数、日期类函数、数据类型转换函数、测试函数10.常用函数:LEN()、SPACE()、LEFT()、RIGHT()SUBSTR()、AT()、DATE()、TIME()、YEAR()、STR()、 VAL()、CTOD()、宏替换函数:&字符型变量、EOF()、BOF()、IIF() 11.程序文件的建立和修改命令:MODIFY COMMAND程序名 12.程序的基本结构:顺序结构、选择结构、循环结构。 13.选择结构包括条件语句(IF—ELSE--ENDIF)和分支语句(DO CASE--ENDCASE)、14.IF----ENDIF必须成对出现,在do case结构中不管有几个CASE条件成立,只有最先成立的那个CASE条件的对应命令序列被执行 15.循环结构包括:DO WHILE---ENDDO FOR---ENDFOR SCAN---ENDSCAN(其 C#关键字 as:一个转换操作符,如果转化失败,就返回null; base:用于访问被派生类或构造中得同名成员隐藏的基类成员; bool:表示布尔值的简单类型; break:用于从loop或switch语句中推出得跳转语句; byte:表示8位长度无符号整数的简单类型; case:指定在switch语句中的一个标签。如果标签中指定的常量与switch表达式的值匹配,与标签关联的语句就被执行; catch:定义一个代码块,在特定类型异常抛出时,执行块内代码。参加try和finally; char:表示16位Unicode字符的简单类型; checked:既是操作符又是语句。确保编译器和运行时检查整数类型操作或转换时出现的溢出; class:指明一个声明得类类型声明; const:标识一个可在编译时计算出来的变量值,即一经指派不可修改得值; continue:用于返回循环顶部的跳转语句; decimal:表示128位高精度十进制数的简单类型; default:在switch语句中,指定一组语句,如果前面没有匹配得case子句,就执行这些语句; delegate:指定一个声明为一种委托类型。委托把方法封装为可调用实体,能在委托实体中调用; do:一个条件语句,无论条件是否满足,都执行至少一次; double:表示64位双精度浮点值得简单类型; else:if条件语句的一部分,如果条件不为真则执行else后面的语句。 enum:表示一个已命名常量群集得值类型; event:允许一个类或对象提供通知得成员,它必须是委托类型; explicit:一个定义用户自定义转换操作符的操作符,通常用来将内建类型转换为用户定义类型或反向操作。必须在转换时调用显式转换操作符; extern:标识一个将在外部(通常不是C#语言)实现的方法; false:一个布尔字面值; finally:定义一个代码块,在程序控制离开try代码块后执行。参见try和catch关键字; fixed:在一个代码块执行时,在固定内存位置为一个变量指派一个指针; float:表示32位单精度浮点值得简单类型; for:定义一个循环语句,只要指定条件满足就继续执行; foreach:用于遍历一个群集的元素; goto:一个跳转语句,将程序执行重定向到一个标签语句; if:一个条件语句,根据一个布尔表达式的值选择一个语句执行; implicit:一个操作符,定义一个用户定义的转换操作符。通常用来将预定义类型转换为用户定义类型或反向操作。隐式转换操作符必须在转换时使用; in:foreach语句遍历语法的一部分,被放在变量名与要遍历的群集之间; #include getch(); } #include 数组 2010-3-29 22:40 一维数组的定义和一维数组的引用 内存中一串连续的存储单元(变量),叫数组。指针移动和比较只有在一串连续的数组中才有意义。 当数组中每个变量只带一个下标时,为一维数组。 定义一个一维数组: 类型名数组名【常量表达式】如:int a[8]; 说明:①定义一个一维整型名为a的数组。 ②方括号中规定此数组有8个元素,(a【0】-a【7】),不存在a【8】这个元素。 ③a数组中每个元素均为整型,且每个元素只能存放整型。 ④每个元素只有一个下标,且第一个元素的下标总为0。 ⑤c编译程序,为a数组开辟8个连续存储单元。 3)在定义数组语句中,可以有多个数组说明符;它们用逗号隔开。 例:double a【22】,v【100】,u【5】,a,b,c;注:双精度型每个单元占用8个字节的存储空间。另外,也可以和普通变量一起定义。 用逗号分隔开。 2010-3-23 10:29 一维数组元素的引用2 1) 引用形式:数组名【下标表达式】可以是:常量,变量,表达式。 如:double x【8】则x【0】x【j】x【i+k】均合法 2) (1)一个数组元素实际上就是一个变量名,代表内存中的一个存储单元。我们可以把数组元素看做一个变量名来处理。 (2)一个数组不能整体引用,数组名中存放的是一个地址常量,它代表整个数组的首地址。当学习指针时,引用的变量的地址,就是变量中第一个字节的地址。数组的首地址也是它的第一个元素的第一个字节的地址,即它的首地址。 数组的首地址存放在数组名中。所以说,数组名就代表一个地址。数组名是一个地址值。 (3)在引用数组元素时,数组元素下标表达式必须是整数,下标表达式下限为0.系统并不自动检验数组元素下标是否越界,因此编程时要注意。 如:double a,b; int c[10]; a=2.0;b=3.0; 则a[i]; 是不合法的。 给数组赋初值时,如果所赋初值少于元素个数时,后面的元素补为0,字符补为’\0’可以通过赋初值来定义一个数组的大小。如:int a[]={0,0,0,0,0}; 相当于:a[5]={0}; 『C程序设计』读书笔记 关键字:c语言 原作者姓名:loose_went 文章原出处:https://www.doczj.com/doc/f76221677.html, 写在前面: 《C程序设计》可以说是一本再基础不过的编程书了,但每读一遍的感觉却都是不同的,可以说,每读一遍,都会有很多新的收获。真所谓老书再读,回味无穷啊!此笔记是《C程序设计》谭浩强编著,清华大学出版社出版。除了将书中的重点知识点记下来外,也加入了我对知识点的理解,我想这一点是读书笔记的重要性所在。 第一章概述第二章数据类型、运算符与表达式 第三章最简单的c程序设计第四章逻辑运算和判断选取控制 第五章循环控制第六章数组 第七章函数第八章预编译处理 第九章指针第十章结构体与共用体 第十一章位运算第十二章文件 第一章概述 1. C语言的特点 ①语言简洁、紧凑,使用方便、灵活。共有32个关键字,9种控制语句。 ②运算符丰富,公有34种运算符。 ③数据结构丰富,数据类型有:整型、实型、字符型、数组、指针、结构体、共用体等。 ④具有结构化的控制语句(如if…else、while、do…while、switch、for) ⑤语法限制不太严格,程序设计自由度大。 ⑥允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。 ⑦生成目标代码质量高,程序执行效率高。 ⑧可移植性好。 2. C语言的用途 C虽不擅长科学计算和管理领域,但对操作系统和系统实用程序以及对硬件进行操作方面,C有明显的优势。现在很多大型应用软件也用C编写。 Top of Page 第二章数据类型、运算符与表达式 1. C的数据类型 C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。 2.常量与变量 常量其值不可改变,符号常量名通常用大写。变量其值可以改变,变量名只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。否则为不合法的变量名。变量在编译时为其分配相应存储单元。 3.整型数据 整型常量的表示方法:十进制不用说了,八进制以0开头,如0123,十六进制以0x开头,如0x1e。整型变量分为:基本型(int)、短整型(short int)、长整型(long int)和无符号型。不同机器上各类数据所占内存字节数不同,一般int型为2个字节,long型为4个字节。 4.实型数据 实型常量表示形式:十进制形式由数字和小数点组成(必须有小数点),如:0.12、.123、123.、0.0等。指数形式如123e3代表123×10的三次方。 实型变量分为单精度(float)和双精度(double)两类。在一般系统中float型占4字节,7位有效数字,double型占8字节,15~16位有效数字。 5.字符型数据 字符变量用单引号括起来,如'a','b'等。还有一些是特殊的字符常量,如'\n','\t'等。分别代表换行和横向跳格。 字符变量以char 来定义,一个变量只能存放一个字符常量。 字符串常量是由双引号括起来的字符序列。这里一定要注意'a'和"a"的不同,前者为字符常量,后者为字符串常量,c规定:每个字符串的结尾加一个结束标志'\0',实际上"a"包含两个字符:'a'和'\0'。 6.数值型数据间的混合运算 整型、字符型、实型数据间可以混合运算,运算时不同类型数据要转换成同一类型再运算,转换规则: char,short -> int -> unsigned -> long -> double <- float 7.运算符和表达式 c运算符包括: 算数运算符(+ - * / % ) 关系运算符( > < == >= <= != ) 网络通讯中数据大小端的问题: 大端模式:高位字节放在内存的低地址端,即该值的起始地址;低位字节排放在内存的高地址端。 小端模式:低位字节放在内存的低地址端,即该值的起始地址;高位字节放在内存的高地址端。 数组的名字是一个常量指针,如X【2】,X是一个常量指针,没有分配的内存。 数据存在存储空间,数值不存在。 在C语言里,指针可以访问到任何地方,但是对不应该访问的地址进行访问没有意义,也可能会禁止读写。 函数的接口类型,可变参数的类型和执行跳转: C语言的函数名可以看做一个地址常量(和数组一样)。 系统的堆栈:堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。、 、 预处理操作: 宏定义:#define M 3; #define M(x,y) 2*x+y; 预处理对宏的处理,分为3类: 预处理“标识符”的展开; 预处理“标识符”的判断; 预处理“标识符”的文本替换。 #if 0 。。。。 #endif 用作代码注释。 基础类型重定义:一个C程序在PC上开发,逻辑验证正确后,下需要移植到某个嵌入式系统中,但是它们对应的int的位宽定义不同,目标系统是X86时,编译器将其看做32位,而目标系统为嵌入式系统的时候,编译器将其看作16位(对应的32位为long关键词)。这种情况,就需要进行基础类型的重定义: #define _TARGET_X86_SYSYTEM 0 #define _TARGET_DEV_SYSYTEM 1 #define _TARGET_SYSYTEM _TARGET_X86_SYSYTEM #if(_TARGET_SYSYTEM = _TARGET_X86_SYSYTEM) Typedef signed int _i32 Typedef unsigned int _u32 #elif(_TARGET_SYSYTEM = _TARGET_DEV_SYSYTEM) 初学C语言常用简单程序代码素数的筛选 #include main() { int x,s,t,d; scanf("%d",&x); s=x%60; t=(x/60)%60; d=(x/60)/60; printf("%d时%d分%d秒",d,t,s); } 三个数的交换 #include C语言高级编程 2015年2月4日 16:09 ?常用ubuntu命令 printf("%p",&a);//打印变量a的地址?内存结构 ?编译四步骤 ?数据类型 告诉CPU如何读写内存。 基本数据类型:char,short,int,long,float,double...... 构造数据类型:数组,结构体,联合体。 指针类型: 空类型:void C语言中数据类型的字节长度 ?局部变量 生命周期从定义开始到函数结束,作用域在当前函数模块内。 ?全局变量 生命周期从编译开始到程序运行结束。作用域在变量定义之下。全局变量的内存地址在编译的时候就已经确定,所以无论程序运行多少次全局变量的地址都不会改变。 全部变量和局部变量重名的话全局变量就会被屏蔽。 ?static 作用:用于声明一个静态变量。不初始化存储在bass区并且自动赋值为0,初始化过的存储在data区。 生命周期:从编译开始到程序运行结束。 作用域:static修饰的局部变量,作用域在局部。static修饰的全局变量,作用域在定义之下,可见域在当前文件中。static修饰的变量外部文件无法调用。 static修饰函数用于隐藏该函数,函数可见域只在当前文件内。 ?extern 引用外部变量。 ?const 声明一个只读变量。 指针 int * p; 指针的值:p为指针变量,用来存储地址。p的值为指向的空间的地址值。 指针的类型:int *为p的类型(所有的指针类型都占4个字节,char *也占用4个字节)。 指针指向的类型:int为指针指向的空间的数据类型。 指针指向的值:*p为指针指向的值,指针指向的空间的间接引用(别名)。 指针的赋值:要操作指针必须给指针一个合法的指向。 指针初始化:char *p=NULL; 强制类型转换: char *p = NULL; int a = 258; p = (char *)&a; *p = 2;//溢出 //cha *类型指针只能指向char类型空间地址,如果要操作其他类型空间需 要强制类型转换。char *类型指针只能操作char类型空间,就是一个字节 的空间。 任何数据类型之间都可以强制类型转换,指针之间不会隐式转换。类型不 匹配不能进行运算或赋值。强制类型转换仅仅是在运算过程中有效,并没 有改变变量或者地址的类型。 赋值的规则:类型匹配。 int a; int *p=&a; int **q=&p;C语言入门手册
【G】C学习笔记c重点整理
c语言基础
C学习笔记
C语言入门教程____免费下载
C工程项目学习笔记
C语言初学者的几个经典习题
C语言学习心得体会 篇
C语言基础知识1
C学习笔记
简单易懂的C语言源代码(供初学者使用)
c语言学习笔记(数组、函数)
C程序设计 读书笔记
c语言学习笔记
初学C语言常用简单程序代码
C语言高级编程学习笔记