C语言复习及C++基础知识 课件讲座_第1页
C语言复习及C++基础知识 课件讲座_第2页
C语言复习及C++基础知识 课件讲座_第3页
C语言复习及C++基础知识 课件讲座_第4页
C语言复习及C++基础知识 课件讲座_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二章 C语言复习及C+基础知识2.1.1 C+的起源2.1.2 C+的特点 *.c C的源程序 以下的文件C和C+都可用: *.h C的头包含文件 *.cpp C+的源程序 *.hpp C+的头包含文件 /* */ C的注释 / C +的注释2.1 C+的起源和特点12.2 C+源程序的构成2.2.1 C+程序的一般格式例2.1 说明C+构造的示例程序#include / 系统头文件int add(int a, int b); /函数原型的说明int main( ) /主函数 int x,y,sum; /定义三个整型变量 cout输入二个数:x; /从键盘输入变量x的值 ciny; /从键盘

2、输入变量y的值 sum=add(x,y); /调用函数add,将函数返回值赋给变量sum cout二数和是:sumn; /输出 return 0;int add(int a, int b) /定义函数add,函数(返回)值为整型 int c; /定义临时变量c c=a+b; /求和 return c; /将c的值返回,通过add带回调用处22.2.2 C+程序的结构特性 printf(格式说明,表达式表列); scanf(格式说明,地址表列); cout3.新行 “n” endl4.主函数 void main( ) .5. 一般的函数 函数头 int add (int a, int b) 函数

3、体 int c; /变量定义 c=a+b; /执行部分 return c; 3 类的声明部分 类的使用部分例2.2 #include /类的声明部分class A int x,y,z; /类A的数据成员声明 fun( ) /类A的成员函数声明 ;/类的使用部分void main( ) A a; /创建一个类A的对象a . a.fun( ); /给对象a发消息,调用成员函数fun( )2.3 C+在非面向对象方面的一些特性2.3.1 注释行/* */ C的注释 / C +的注释2.3.2 新的I/O流cin是标准输入流,在程序中代表标准输入设备,即键盘。 运算符“”表示向右cout是标准输出流,

4、在程序中代表标准输出设备,即屏幕。 运算符“”表示向左使用cin或cout进行I/O操作时,在程序中必须嵌入头文件iostream.h/#include int main( ) char name20; coutname; coutnameendl; return 0;#include void main( ) int x=25;couthexxdecxoctx=0;k-) . .以上的写法在C程序中都是错误的,但在C+程序中都是正确的。52.3.4 结构、联合和枚举名可直接作为类型名定义枚举类型名:enum bool FALSE, TRUE;定义结构枚举类型名:Struct student

5、int sno; char *sneme;C语言中定义枚举类型变量: enum bool done;定义结构类型变量: struct student s1, s2;C+语言中定义枚举类型变量: bool done;定义结构类型变量: student s1, s2;62.3.5 const修饰符#define LIMIT 100这里 LIMIT 是一个标志,代表 100const int LIMIT=100;这里 LIMIT 是一个常量名,在内存有空间放了100,因此有地址,可以用指针指向这空间,但不能修改它。int i=100;这里 i 是一个变量名,在内存有空间放了100,因此有地址,可以用

6、指针指向这空间,且可以改放别的整数。(1) 可以用一个指向常量的指针变量指向常量: const char *name=“chen”; name3=a; /错误 name=“zhang”;/正确(2)指针常量 char *const name=“chen”; name3=a; /正确 name=“zhang”; /错误(3) const char *const name =“chen”;namechen常量zhang常量nXanamechenzhang常量anaX7#include main( ) int a=1; #define T1 a+a #define T2 T1-T1 coutT2 i

7、s T2endl; return 0; cout“T2 is “a+a-a+aendl;/#include main( ) int a=1; const T1=a+a; const T2=T1-T1; coutT2 is T2endl; return 0;T2a+aa+aT1-T182.3.6 内置函数#include int main( ) 3次 for(int i=1;i=3;i+) coutr=i area=circle(i)endl; return 0;在函数前加以 inline ,成为内置函数#include int main( ) 代码嵌入 for(int i=1;i=3;i+)

8、coutr=i area=circle(i)endl; return 0;float circle(float r) return 3.1416*r*r; inline float circle(float r) return 3.1416*r*r; 9#include #define doub(x) x*2int main( ) for(int i=1;i=3;i+) couti doubled is doub(i)endl; cout1+2 doubled is doub(1+2)endl; return 0;/#include inline int doub(int x) return

9、x*2; int main( ) for(int i=1;i=3;i+) couti doubled is doub(i)endl; cout1+2 doubled is doub(1+2)endl; return 0;102.3.7 函数原型返回类型 函数名(参数表);#include void write(char *s); /函数原型或叫函数声明 void main( ) write(Hello, world!); void write(char *s)无分号 coutsendl; 使用在前,定义在后,要先声明。若定义在前,使用在后,就可不必声明。说明: (1) - (8)112.3.8

10、 带有缺省参数的函数C+在说明函数原型时,可以为一个或多个参数指定缺省参数值,以后调用此函数时,若省略其中某一实参,C+自动以缺省值作为相应參数的值。int special(int x=5, float y=5.3);合法的调用;special();special(25);special(100,79.8);说明:(1)所有取缺省值参数都必须出现在不取缺省值参数的右边。 int fun(int i,int j=5, int k) 是错误的 int fun(int i, int k,int j=5) 是正确的(2)调用时,若某个参数省略,则其后的参数皆应省略。不合法的调用;special(,21

11、.5);122.3.9 函数重载C+中,只要函数的參数的类型不同,或者參数个数不同,或者二兼有之,几个函数可以用相同的函数名。称为函数重载#include int square(int i) return i*i; float square(float f) return f*f; double square(double d) return d*d; void main( ) int i=12; float f=3.4; double d=5.67; couti*i=square(i)endl; coutf*f=square(f)endl; coutd*d=square(d)endl;13#

12、include int mul(int x, int y) return x*y; int mul(int x, int y, int z) return x*y*z; void main( ) int a=3,b=4,c=5; couta*b=mul(a,b)endl; couta*b*c=mul(a,b,c)endl; 说明:(1)重载函数应在参数个数或参数类型上有所不同,编译才能识别调用哪一个重载版本,即使返回类型不同也不行。如:int mul(int x, int y) ;和 double mul(int x, int y); 是不能重载的。(2)一般而言,重载函数应对不同的参数情况执

13、行相同的功能。如:abs(int x); 和 abs(float x);都是求绝对值,一个是整数的绝对值,一个是实数的。14(3) 函数的重载与带默认值的函数一起使用时,有可能引起二义性如: void Drawcircle(int r=0; int x=0; int y=0); void Drawcircle(int r);当调用: Drawcircle(20); 编译程序无法确定用哪一个函数。(4) 在函数调用时,当实参与形参类型不相符,C+会自动做类型转换,但有时也可能产生错误: void f_a(int x); void f_a(long x); int c=f_a(5.56); ?2.

14、3.10 作用域运算符:当全局变量和局部变量同名时,函数中不能使用全局变量。#include int avar=10; /全局变量void main( ) int avar=25; /局部变量 coutavar is avarendl; 局部变量#include int avar;void main( ) int avar; avar=25; /局部变量avar :avar=10; /全局变量avar coutlocal avar = avarendl; coutglobal avar = :avarendl;152.3.11 无名联合C语言的共用体:union data int i; cha

15、r ch; float f;union data a,b,c;引用:a.i a.ch a.f 等C+的无名联合:union int i; char ch; float f; 直接可用 i ch f 等16a4字节ichf2.3.12 强制类型转换C语言的强制类型转换:int i=10;float x=(float)i;C+的强制类型转换:int i=10;float x=float(i);float y=(float)i;两种方法C+都可以。172.3.13 new和delete C语言用函数malloc()和free()动态分配内存和释放动态分配的内存。C+使用运算符new和delete能更

16、好、更简单地进行内存的分配和释放。 如C语言中用: int *p; p=(int *) malloc ( sizeof(int) ); *p=10; 而C+#include void main( ) int *p; /定义一个整型指针变量p p=new int; /动态分配一个整型存储区,并把首地址赋给p *p=10; cout*pendl; delete p; /释放p指的空间,撤消指针pnew 和 delete 的优点:(1)new可以自动计算所要分配内存的类型的大小,而不必用sizeof来计算。p18(2)new能够自动返回正确的指针类型,而不必进行类型转换。(3)可以用new将分配的对

17、象初始化。(4)new 和 delete 都可以被重载,允许建立自定义的分配系统。说明:(1)使用new可以为数组动态分配内存空间(但不能赋初值)。 int *pi=new int10; int *pi=new int234;(2)new可在为简单变量分配内存空间的同时,进行初始化。#include void main( ) int *p; p=new int(99); /动态分配内存,并将99作为初始值赋给它 cout*pendl; delete p;(3)释放动态分配的数组存储区: delete p;19(4)使用动态分配内存时,分配失败,将返回空指针(NULL)。因此通常要对内存的动态分

18、配是否成功进行检查。 分配内存失败,p=NULL/*#include void main( ) int *p; p=new int; if(!p) /若分配内存失败 coutallocation failuren; return ; *p=20; cout*pendl; delete p;(5) 用new分配的空间,使用结束后应用delete显式地释放。p NULL202.3.14 引用引用可为变量起别名,主要有变量的引用、函数參数的引用、函数返回值的引用。1.引用变量 数据类型 &别名=已定义的变量名;/*#include void main( ) int i; int &j=i; / i

19、又叫 j i i=30; j couti=ij=jn; j=80; couti=ij=jn; cout“Address of i ”&i“n”; /显示 i 的地址 coutAddress of j &jn;(1)定义引用时,必须立即对它进行初始化,不能以后再赋值。 int i; int &j; /错误 j=i;21(2) 引用实际上是一种隐式指针,可以少用 “*” 号 /*例2.19 #include void main( ) int i=15; /整型变量i int *iptr=&i; /iptr指向i int &rptr=i; /rptr引用i couti is iendl; cout*

20、iptr is *iptrendl; coutrptr is rptrendl; i=29; cout After changing i to 29endl; couti is iendl; cout*iptr is *iptrendl; coutrptr is rptrendl;i is 15 i is 29*iptr is 15 *iptr is 29rptr is 15 rptr is 29iptrirptr22(3)引用不可重新赋值,不可使其作为另一个变量的别名。int i, k;int &j=i;j=&k; /错误(4)并不是任何类型的数据都可引:int &a10; /不能建立引用数

21、组int &*p; /不能建立指向引用的指针int &r; /不能建立引用的引用(5)当使用取地址运算符时&,取的是被引用变量的地址。int num=50;int &ref=num;int *p=&ref;则p中保存的是变量num的地址。(6) 引用符虽然与地址符一样,但不会引起二义性。2. 引用作为函数參数引用參数的方法可以代替C语言中的指针地址调用的方式。23/*例2.20 C语言中的指针地址调用的方式#include void swap(int *m, int *n) int temp; temp=*m; *m=*n; *n=temp;void main( ) int a=5,b=10;

22、 couta=a b=bendl; swap(&a,&b); couta=a b=bendl;a=5 b=10a=10 b=524m &aatemn &bb/*例2.21 引用參数的方法#include void swap(int &m, int &n) int temp; temp=m; m=n; n=temp;main( ) int a=5,b=10; couta=a b=bendl; swap(a,b); couta=a b=bendl; return 0;a=5 b=10a=10 b=525 matem nb3. 引用返回值函数可返回一个引用,其目的是可将函数用在赋值运算符的左边。#i

23、nclude int a=1,3,5,7,9;int &index(int); /声明返回引用的函数void main( ) index(2)=25; /将a2重新赋值为25 coutindex(2)endl;int &index(int i) return ai; 264. 引用举例例2.23 /引用参数和引用返回值#include int &max(int &num1, int &num2);int &min(int &num1, int &num2);main( ) int num1, num2; coutnum1; coutnum2; max(num1,num2)=0; coutn把大

24、的数置成 0 后, 这两个数是:; coutnnum1 和 num2n; coutn再一次输入二个数:n; coutnum1; coutnum2;27 min(num1,num2)=0; coutn把小的数置成 0 后, 这两个数是:; coutnnum1 和 num2num2)?num1:num2; int &min(int &num1, int &num2) /两数中找小数 return (num1num2)?num1:num2; 运行结果:输入第一个数: 45输入第二个数: 78把大的数置成 0 后, 这两个数是: 45 和 0 再一次输入二个数:输入第一个数: 13输入第二个数: 56

25、把小的数置成 0 后, 这两个数是:0 和 5628 2.3.15 void 指针void 型指针是一通用型指针,可指任何类型:void pa; /错误,不能声明void类型的变量void *pa; /正确,可以声明void类型的指针 int i=456; char c=a; pc=&i; pc=&c;#include void main() void *pc; int i=456; char c=a; pc=&i; cout*(int*)pcendl; pc=&c; cout*(char*)pcendl;以下部分是C语言复习参考2.4 存储类存储类 类型修饰符 类型 变量名表列;存储类 au

26、to static extern register 类型修饰符 const volatile2.4.1 自动变量和寄存器变量2.4.2 静态变量2.4.3 外部变量292.5 基本运算符和表达式2.5.1 关系运算符2.5.2 算术运算符2.5.3 逻辑运算符2.5.4 位运算符2.5.5 条件运算符2.5.6 逗号表达式sizeof运算符2.7 类型转换302.8 语句2.8.1 表达式语句、空语句和块语句2.8.2 选择语句 1. if 语句 2. switch 语句2.8.3 循环 1. while 语句 2. do while 语句 3. for 语句2.8.4 转移 1. break

27、 与 continue 语句 2. goto 语句2.8.5 return 语句312.9 函数2.9.1 函数的基础知识 函数先声明再调用后定义的例子 #include void main( ) int a,b,c; int sum(int, int); /先申明sum()函数 a=25; b=36; c=sum(a,b); /调用sum()函数 cout c endl; int sum(int x, int y) /定义sum()函数 int temp; temp=x+y; return temp; 32/习题 函数(7.1)#include void main() int m,n,l,s

28、; int maxj(int a, int b); int minb(int a, int b); printf(输入个正整数:); scanf(%d,%d,&m,&n); if (m0 & n0) l=maxj(m,n); s=minb(m,n); printf(%d和%d的最大公约数为%dn,m,n,l); printf(%d和%d的最小公倍数为%dn,m,n,s); else printf(输入了负数!n); return;int maxj(int a, int b) int r,t; if(ab) t=a;a=b;b=t; r=a%b; while(r!=0) a=b; b=r; r=

29、a%b; return b;int minb(int a, int b) int r; r=maxj(a,b); if (r!=0) return a*b/r; else return 0;sln78m56trb78a56rb78a5633/习题 函数(7.5)#include #include #include void main() char a255; void convert(char b); printf(请输入一个字符串: n); gets(a); convert(a); printf(该字符串反序为: n); puts(a); return;void convert(char b

30、) int l,i; char c; l=strlen(b); for(i=0; i=l/2 ;i+) c=bi; bi=bl-i-1; bl-i-1=c; return ;caba1a0b1b0acbdefa254034m#include #include void main() float a,b,c,d,x2; void root0(float a, float b, float c, float d,float x); void root1(float a, float b, float c,float x); void root2(float a, float b, float c,

31、 float d, float x); printf(请输入一元二次方程的三个系数 a,b,c:n); scanf(%f,%f,%f,&a,&b,&c); if(a=1e-6) printf(不是一元二次方程!n); else printf(f)x*x+(%4.1f)x+(%4.1f)=0n,a,b,c); d=b*b-4*a*c; if (d0) root0(a,b,c,d,x); printf(由于b*b-4*a*c0 因此有二个实根:n); printf(x1 = %f n,x1); printf(x2 = %f n,x2); return;362.9.2 参数传递及函数返回值 (1)

32、值传 一般变量 (2) 传地址 结构, 数组 (3) 传引用 一般变量, 结构, 数组 缺省参数2.9.3 使用C+系统函数372.10 数组定义 类型 数组名大小; int a4; int b34; int c234;使用时数组元素 数组名表达式 a0=10; i=3; ai=5; b03=20; 初始值 定义时 int a=2,4,6,8,10; int b3=2,4,6,8,10,12;382.11 指针定义 类型 *指针变量名;2.11.1 使用指针 取地址运算符 & 取内容运算符 * 位移取值 #include void main( ) int a10=2,4,6,8,10; for

33、(int *p=a;pa+10;p+) cout p+0 endl; 这里 p+0 位移+0 ,等价于 *p p=a; p+2 即 *(p+2) p-i 即 *(p-i)392.11.2 指针运算1. 赋值 int x,*px,*q; px=&x; q=px; 表示 q 和 px 同指一个地方(q跟着px指)2. 比较 px= =q q!=px 判断 q 和 px 是否同指一个地方 p q 判断 p 和 q 指在数组元素的前后3. 移动指针 p=p+3; + - 运算 y=*px+; /y=*(px+); y=*+px; /y=*(+px); y=+*px; /y=+(*px); y=(*px

34、)+; 402.11.3 指针和数组1. 指向一维数组的指针 int a4, *p; p=a; 或 p=&a0; 即 p 指向 a0; 2. 指针数组 许多个指针变量在一起都可用来指向整数 int *pa2; char *pc57; 例#include void main( ) int a23=2,4,6,8,10,12; int *pa2; /有二个指针 pa0 和 pa1 pa0=a0; pa1=a1; for (int i=0; i2; i+) for(int j=0; j3; j+,pai+) cout aij=” *paiendl; 413. 指向整个数组的指针(行指针) 如:int

35、 (*a)5; int b25=0,1,2,3,4,5,6,7,8,9 a=b; a b 0 1 2 3 4 5 6 7 8 9 #include void main( ) int (*a)5; int b25=0,1,2,3,4,5,6,7,8,9; a=b; for(int i=0;i5;i+) cout i : *(*a+i)endl; a+; for(int i=0;i5;i+) cout i : *(*a+i)endl; 42一维数组的地址 int a4; a+0 是第 0 列的地址 a+i 是第 i 列的地址 *( a+0) 是第 0 列的数据 *(a+i) 是第 i 列的数据地址

36、 a 数据 *a &a0 a0一维数组的指针 int a4, *p; p=a; 可以p+指针p 数据 *p a043二维数组的地址 *a a0 int a34; *(a+i)+j是第 i 行第 j 列地址 *(*(a+i)+j) a+0 是第 0 行的地址 . a+i 是第 i 行的地址 *( a+0)是第 0 行第 0 列的地址.*(a+0)+j是第 0 行第 j 列的地址 *(a+i)是第 i 行第 0 列的地址 . *(a+i)+j是第 i 行第 j 列的地址 *(*(a+0)+0)是第0行第0列的数据.(*(a+0)+j) 是第0行第j列的数据 *(*(a+i)+0)是第i行第0列的数

37、据.*(*(a+i)+j) 是第i行第j列的数据行地址 a+0 列地址 *(a+0)行地址 a+i 44二维数组的指针 *a a0 int a34; (p+i*4+j)是第i行第j列地址 (1) int *p;(小指针) p=*a; p=a; p=a0; *(p+i*4+j) p=&a00; 元素地址: p=*a+j; p+j p+; 元素数据: *p *(p+j) pj *( a+0)是第 0 行第 0 列的地址.*(a+0)+j是第 0 行第 j 列的地址 *(a+i)是第 i 行第 0 列的地址 . *(a+i)+j是第 i 行第 j 列的地址 *(*(a+0)+0)是第0行第0列的数据

38、.(*(a+0)+j) 是第0行第j列的数据 *(*(a+i)+0)是第i行第0列的数据.*(*(a+i)+j) 是第i行第j列的数据 p 当一维数组名用但可 p=p+i p+ 走 (i)一行 元素地址: *p+j 数据: *(*p+j) (*p)j列地址 *(a+0)45struct student int num; float score; struct student *next;struct student *p; nextnumscore结点#include 申请空间函数:malloc(字节数)测试字节运算符:sizeof(类型)p=(struct student * )malloc

39、(sizeof(struct student);释放空间函数:free(指针); free( p );nextnumscore结点p46p1=p2=(struct student * )malloc(LEN);scanf(“%d,%f”,&p1-num,&p1-score);nextnumscore结点p1p220101headNULLn= 0 1head=p1;headnextnumscorep1p1=(struct student * )malloc(LEN);20103902(n=2) p2-next=p1;p2=p1; p2scanf(“%d,%f”,&p1-num,&p1-score

40、);nextnumscore p10NULLp1-num=047pp0103070811NULLheadp1p2p1p20103070811NULLheadp005p1p01030811headNULLp1p2482.11.4 引用 引用可为变量起别名,它主要用作函数参数以及函数的返回类型。有参数引用和返回值引用。 1. 引用说明 int num=50; int& ref=num; 表示放整数 50 的内存空间 可叫 num,又可叫 ref 引用实质上是为另一个变量建立别名。 2. 引用参数(传引用) 493. 返回引用的函数当一个函数的返回值需重新赋值的时候,我们也可对返回值进行引用,这时函

41、数可出现在赋值号的左边。这种函数称为返回引用的函数。 形式 类型& 函数名(参数)#include int a=2,4,6,8,10,12; int& index(int i); void main( ) index(3)=16; /index(3) 即返回值ai,i=3,a3改为16 coutindex(3)endl; cout a3endl; int& index(int i) return ai; 注意: 返回值是函数内的局部变量时不能引用 50例#include int e(int i) return i+1; int &f() int i=1; return +i;int g(int &i) i=i+1; return i;main() int r1=e(3); int &r2=e(4); int r3=f(); int &r4=f(); int a=0,b=0,c=0,d; d=g(4); a+=g(g(c); b+=g(e(3); return 1;512.11.5 void类型指针 void指针是一个特殊指针,它可以指向任一类型的C+对象。 void main() void *vp; int i=5; floatf=7.8; char c=A; int *ip; float *fp; char *cp; ip=&i; vp=&i; cp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论