收藏 分享(赏)

一个小时入门C++new.doc

上传人:dzzj200808 文档编号:2334733 上传时间:2018-09-10 格式:DOC 页数:47 大小:228KB
下载 相关 举报
一个小时入门C++new.doc_第1页
第1页 / 共47页
一个小时入门C++new.doc_第2页
第2页 / 共47页
一个小时入门C++new.doc_第3页
第3页 / 共47页
一个小时入门C++new.doc_第4页
第4页 / 共47页
一个小时入门C++new.doc_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、第一章 表述游戏的语言 1一个小时入门 C+这是 copy 得来的!和解起见,不要外传!适合将要学 C+的人这里只包含 CC+的语法,面向对象的思想!让你马上看得懂别人的 code!与一般 C+书籍的区别 ,自己找本把目录对一对就鸟然了简单的实例/*-First C+ Program-*/#include /现在你只需知道要使用输入输出语句就必须写这行。/这一行结尾不用加分号因为它不是真正的 C+语句。 using namespace std; /这是什么意思呢int a=5; int square(int x); int square(int x)return x*x; int main(

2、) /主函数,每个 DOS 窗口下的 C+程序都需要它int A; coutA; /输入 A, 注意箭头方向的更改。cout=表示,小于等于则是(右移) 非常好用,作用是把这个数的二进制形式向左或右移位(cin 和 cout中的被使用了运算符重载,所以意义不同,具体可参阅 2.4 节),举两个例子也许会好说明些:18(二进制形式为 0010010)3 得到 9(二进制形式为 0001001) 我们可以看到,左移和右移可以代替乘或除 2 的 n 次方的作用,而且这样做可以节省不少CPU 运算时间。在程序优化中这一种方法是十分重要的,例如 a*9 可用(ab)?a:b 可返回 a 和 b 中的较大

3、者。值得注意的是由于 C+的操作符众多,所以运算先后次序较复杂,如果没有注意到这一点而少加了几个括号将出现出人意料的结果。下面按优先级高到低列出了 C+中的操作符:1. ()(小括号) (数组下标 ) .(类的成员) -(指向的类的成员 )2. !(逻辑非) .(位取反) -(负号) +(加 1) -(减 1) /结构 S 的第一个成员short lo; /结构 S 的第二个成员;S s; /定义 S 类型的变量 s然后我们就可以像 s.hi 和 s.lo 一样使用 s 的成员。1.4.2 联合联合可以让不同变量共享相同的一块空间,举个例子:#include using namespace s

4、td;struct Sshort hi;short lo;union MIXlong l;S s;char c4;第一章 表述游戏的语言 8;void main ( )MIX mix;mix.l=100000;cout=9) a+; else a-;值得注意的是 C+中的“真”与“假”的意义就是这条表达式不为 0 还是为 0。比如 if (a-b) do_stuff; 的作用与 if (a!=b) do_stuff; 相同。臭名昭著的跳转语句(不过有时候你还是不得不用 )则是这样的:标号:语句;(一般来说标号用“_“开头)goto 标号;举个例子方便大家理解:#include using na

5、mespace std;void main( )int target=245; int a;couta;if (atarget)coutusing namespace std;const aaa=5;void main( )int a;cina;第一章 表述游戏的语言 11switch(a)case 0:coutusing namespace std;float pi=3.14159;float s_circle(float r);float v_cylinder(float r, float h);float v_cone(float r, float h);float v_all(floa

6、t stop, float smiddle, float sbottom,float h);第一章 表述游戏的语言 14float v_all(float stop, float smiddle, float sbottom,float h)return (stop+4*smiddle+sbottom)*h/6;float v_cone(float r, float h)return s_circle(r)*h/3;float v_cylinder(float r, float h)return s_circle(r)*h;float s_circle(float r)return pi*r*

7、r;void main( )float r,h;float st,sm,sb;coutchoice;coutr;couth;coutr;couth;coutst;coutsm;coutsb;couth;coutusing namespace std;void main( )int abc1000=0; /这样就可以使数组被预先清 0/注意 int abc1000=1;会使 abc0=1 而其它元素=0abc0=987;coutusing namespace std;void main( )int *p,*q;p=new int100000;q=第一章 表述游戏的语言 19for (int i=

8、0;i using namespace std;long a=10000,b=0,c=2800,d,e=0,f2801,g; void main() for(;b-c;)fb+=a/5; for(;d=0,g=c*2;c-=14,coutusing namespace std;extern int a;void print();#define MAIN_H#endif第一章 表述游戏的语言 23/*-main.cpp-*/#include “main.h“int a;void main()a=3;print();/*-function.cpp-*/#include “main.h“void p

9、rint()cout里面的:int rand( ):返回一个随机的整数。void srand(int):根据参数重新初始化随机数产生器。int/float abs(int/float):返回数的绝对值。min/max(a,b):返回 a 和 b 中的较小/大者,用#define 定义的,大家不用担心效率。int atoi(char *s);,返回由 s 字符串转换成的整数。double atof(char *s);,返回由 s 字符串转换成的浮点数。char* gcvt(double num, int sig, char *str);,num 为待转换浮点数,sig 为转换后数的有效数字数,s

10、tr 为目标字符串起点。函数返回指向 str 的指针。举个例子,如果 sig=5那么 9.876 会转换成“9.876“,-123.4578 会变成“-123.46“,6.7898e5 就成了“6.7898e+05“。第一章 表述游戏的语言 24然后是里面的数学函数:sin、cos、tan:这个你应该懂吧 。asin、acos 、atan:反三角函数。sinh、cosh、tanh:双曲三角函数。log、log10:自然和常用对数。exp、pow10:上面两个函数的反函数。pow(x,y):返回 x 的 y 次幂。sqrt:开平方根。ceil:返回最小的不小于 x 的整数。floor:返回最大的

11、不大于 x 的整数。hypot(x,y):返回 x 的平方加上 y 的平方再开方的值。文件读写函数在里面,使用方法是:首先定义指向文件的指针并打开文件,例如 FILE *file = fopen (“aa.bbb“, “rb“);,其中 aa.bbb 为你要打开的文件名(注意,如果在 VC.net 的开发环境中按 F5 或 Ctrl+F5 执行程序,程序的默认文件读取目录是工程的目录,而不是工程目录下的 Debug 或是 Release 目录) ,如果有路径则要用“或“/“代替“ 。“rb“是打开的模式,基本模式有这些:表 1.1可读数据? 可写数据? 打开文件时读写指针位置 如不存在则创立新

12、文件?r 是 否 文件头 否w 否 是 文件头 否a 否 是 文件尾 是r+ 是 是 文件头 否w+ 是 是 文件头 是a+ 是 是 文件尾 是在基本模式后加上 b 或 t 可设定要打开的是二进制文件还是文本文件。对于前者,我们打开文件之后用 fread 可以读入数据,读写指针也会随之后移。fread 的使用方法为:fread(p, size, n, file);,p 为指向读出的数据将存放的位置的指针,size 为每一个数据块的字节数,n为要读多少个数据块,file 则为刚才定义的指向文件的指针。例如 fread(可将数据读入二维数组 a。需要注意的是这时你得到的数据为ASCII 码!例如如

13、果文件的内容为“10“,你将读出 49 和 48 这两个数(1 和 0 的 ASCII 码) 。用fwrite 则可以写数据,形式与 fread 一模一样,使用方法也相同。对于文本文件,我们应该使用 fscanf( )和 fprintf( )函数来读取和写入数据。这两个函数比较灵活,让我们看下面一段程序:#include 第一章 表述游戏的语言 25using namespace std;char s5=“abcd“;int i=967;float f=3.1415;char c=x;void main()FILE *file=fopen(“aa.txt“,“wt+“);fprintf(fil

14、e,“str1=%s“,s); /%s 表示在这个位置上是一个字符串fprintf(file,“nint2 = %d“,i); /%d 表示整数,n 表示换行fprintf(file,“nfloat3=n%fnCH AR 4 = %c“,f,c);/%f 表示浮点数,%c 表示字符,可以把几个 fprintf 合起来写fclose(file);运行完后 aa.txt 的内容是:str1=abcdint2 = 967float3=3.141500CH AR 4 = xfscanf( )和 fprintf( )的使用方法几乎是完全一样的,唯一的区别是,如果你要把数据读入普通变量,要在变量的前面加一

15、个“,file 为文件指针,whence 为寻址开始地点,0 代表开头,1 代表当前位置,2 代表文件尾。offset 则为需移动的字节数。使用 ftell(file);可以得知当前的读写指针位置(离文件头有多少个字节的距离) 。其实还有一种简单很多的文件读写方法(也更符合 C+标准):#include using namespace std;int a;iofstream file;file.open(“abc.dat“); /使用 file.open(“abc.dat“, ios:binary);可指定为二进制模式第一章 表述游戏的语言 26filea; /就像 cinfile内有它们的定

16、义。char *strcpy(char *dest, char *src);,该函数使 dest=src 并返回新的 dest。使用它还可以实现字符串和字符数组之间的转换。char* strcat(char *dest, char *src);,将 src 连接到 dest 的后面,并返回新的 dest。char* strstr(char *s1, char *s2);,返回指向 s2 在 s1 中第一次出现的位置的指针。char* strchr(char *s1, char c);,返回指向 c 在 s1 中第一次出现的位置的指针。char* strlwr(char *s);,将 s 中的所

17、有大写字母转为小写。char* strset(char *s, char c);,将 s 内所有字符替换为字符 c。int strlen(char *s);,返回字符串的长度。最后是中的内存函数:memcpy(char *dest, char *src, int n);,将从 src 开始的 n 个字节的内存内容拷贝到从 dest 开始的内存中。注意 dest 和 src 在内存中的位置不能重叠。memmove(char *dest, char *src, int n);,也可以实现拷贝,dest 和 src 在内存中的位置可以重叠。当然,它比 memcpy 慢。memset(s, c, n)

18、;,将从 s 开始的 n 个字节都设为 c。可以用来将数组和结构清零。第二章 如何说得更地道 27面向对象C+和 C 最大的区别在于 C+是一种面向对象(object-oriented)的语言,即程序是以对象而不是函数为基础,所以严格说来,我们在第一章所讨论的还不是地道的 C+程序。类(class)正是实现面向对象的关键,它是一种数据类型,是对事物的一种表达和抽象。类拥有各种成员,其中有的是数据,标识类的各种属性;有的是函数(类中的函数又叫方法) ,表示对类可进行的各种操作。举一个例子,我们可以建立一个“草”类,它可以有“高度”等各种属性和“割” 、 “浇水”等各种方法。定义和使用类让我们先看

19、一个使用了类的程序:/-grass.h-class grass /定义 grass 类private: /声明下面的成员为私有。类外的函数如果试图访问,编译器会告诉你发生错/误并拒绝继续编译。缺省情况下类中的一切均为私有,所以这一行可以省略。int height; /一般来说,类中的所有数据成员都应为私有/不过本章后面的程序为了便于说明也拥有公有数据成员public: /下面的成员为公有,谁都可以访问。void cut( );void water( );int get_height( );void set_height(int newh); /这个分号不要漏了!/-grass.cpp-#inc

20、lude using namespace std;#include “grass.h“第二章 如何说得更地道 28/下面对类的方法进行定义void grass:cut( ) / “:“表示 cut( )是 grass 的成员。if (height=10)height-=10; /可自由访问 grass 中的任何成员。void grass:water( )height+=10;int grass:get_height( ) /在类的外部不能直接访问 height,所以要写这个函数return height;void grass:set_height(int newh) /同样我们写了这个函数if

21、 (newh=0)height=newh;void main( )grass grass1,grass2; /其实这一句和 “int a,b;“没什么区别,想一想!这一句语/句被称为实例化。grass1.set_height(20); /如果你用过 VB 一定会觉得很亲切。类以外的函数即使/是访问类的公有部分也要用“.“。coutset_height(40); /由于 grass3 是指针,这里要用“-“。其实也可以/使用(*grass3).set_height(40); (“.“操作符比“*“/操作符执行时优先 ) ,不过这样写比较麻烦。grass3-water( );coutget_hei

22、ght( );delete grass3; /释放指针看了注释你应该可以读懂这个程序,现在我们可以看到类的第一个优点了:封装性。封装指的就是像上面这样似乎故弄玄虚地把 height 隐藏起来,并写几个好像很无聊的读取和改写height 的函数。然而在程序中我们已经可以看到这样可以保护数据。而且在大型软件和多人协作中,由于私有成员可以隐藏类的核心部分,只是通过公有的接口与其它函数沟通,所以当我们修改类的数据结构时,只要再改一改接口函数,别的函数还是可以象以前一样调用类中的数据,这样就可以使一个类作为一个模块而出现,有利于大家的协作和减少错误。有的人也许会认为写接口函数会减慢速度,那么你可以在定义

23、前面加上“inline“使其成为内联函数。类以外的函数其实也有办法直接访问类的私有部分,只要在类中声明类的方法时加入形如“friend int XXX (int xxx, int xxx) “这样的语句,类以外的“int XXX (int xxx, int xxx) “函数就可访问类的私有部分了。此时这个函数称为类的友元。注意类中的函数最好不要返回类中的私有成员的引用或指针,否则我们将显然可以通过它强行访问类中的私有成员。除了 public 和 private 两种权限外还有 protected 权限,平时是和 private 一样的,后面在讲类的继承时会进一步解释它的用途。在类的定义中要注意

24、定义成员数据时不能同时初始化(好像 int a=0 这样) ,且不能用extern 说明成员数据。一种类的对象可以作为另一种类的成员。例如:class x int a;class y第二章 如何说得更地道 30x b;如果我们把上面两个类的声明互调,那么由于执行 x b;时 x 类还根本未被定义,编译器会报错。那么应如何解决呢?很简单,在最前面加一句 class x;预先声明一下即可。同一种类可以互相赋值。类可作为数组的元素。可以定义指向类的指针。总之类拥有普通的数据类型的性质。只要定义一次类,就可以大批量地通过实例化建立一批对象,且建立的对象都有直观的属性和方法。这也是类的好处之一。结构其实

25、也是一种类,只不过结构的缺省访问权限是公有。定义结构时只需把“class“换为“struct“。 一般我们在仅描述数据时使用结构,在既要描述数据,又要描述对数据进行的操作时使用类。最后介绍一下用什么办法可以得到一个变量是哪个类的对象:typeid(aaa).name( )能返回aaa 变量所属类的名称,注意这是在程序运行期实现的,很酷吧,不过不要滥用它。类的构造函数当我们将一个类实例化时,经常会希望能同时将它的一些成员初始化。为此,我们可以使用构造函数。构造函数是一个无返回值(void 都不用写)且与类同名的函数,它将在类被实例化时自动执行。构造函数的使用就象下面这样:#include using namespace std;class grasspublic:int height;grass(int height); /构造函数。当然,它需为 public 权限/虽然在这个程序中它有参数,但并不必需;grass:grass(int height)this-height=height; /对于任何一个对象的方法来说,this 永远是一个指向这个/对象的指针。所以这样写能使编译器知道是类中的height

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报