《c程序设计语言》PPT课件.ppt_第1页
《c程序设计语言》PPT课件.ppt_第2页
《c程序设计语言》PPT课件.ppt_第3页
《c程序设计语言》PPT课件.ppt_第4页
《c程序设计语言》PPT课件.ppt_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

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

文档简介

2019年12月5日,北京林业大学信息学院计算机系,算法与数据结构,Office:基础楼201Tel:62338372E_mail:study_computerftp:lidongmei,李冬梅,2019年12月5日,北京林业大学信息学院计算机系,1、C+语言的概要2、类、对象、构造函数与析构函数3、输入/输出4、函数、参数传递与函数返回值5、函数名重载与操作符重载6、动态存储分配7、友元函数与内联函数8、模板,c+程序设计语言,2019年12月5日,北京林业大学信息学院计算机系,1、C+语言概要,C+源于C语言。1970年,两位程序员BrianKernighan和DennisRitchie首创了一种新的程序设计语言,取名为C语言。设计C语言的最初目的是编写操作系统。由于其简单、灵活的特点,C语言很快就被用于编写各种不同类型的程序,从而成为世界上最流行的语言之一。,2019年12月5日,北京林业大学信息学院计算机系,C语言是一个面向过程的语言。随着软件开发技术的进步,程序员们最终发现,把数据和施加在其上的操作结合起来,会得到更易于理解的程序,由此产生了面向对象的程序设计思想。1980年代初,美国ATreturn0;/正常返回这是一个只包含一个函数的程序,程序的基本元素是数据说明、函数和注释。,2019年12月5日,北京林业大学信息学院计算机系,注释,C+的第一次注释格式源于C语言。注释开始于“/*”,结束于“*/”,在两者之间的任何内容,包括换行符都被编译器忽略。注意注释符对不可以嵌套。另一种注释符以“/”开头,它是单行注释符,在它同一行右侧的任何信息都将被认为是注释而由编译器略去。注意:上面两种注释符的两个标志符/和*,/和之间不可以分开。,2019年12月5日,北京林业大学信息学院计算机系,#include命令,C+将一些标准函数和变量说明放在头文件中。头文件中保存所有与标准函数或变量相关的信息如:#include用户也可以定义自己的头文件,把一些相关的函数和变量组织在一个文件中,当另外的程序要用到这些函数和变量时,可以将该文件作为头文件include进来。如:#include“complex.h”,2019年12月5日,北京林业大学信息学院计算机系,编译预处理命令,#include包含指令将一个源文件嵌入到当前源文件中该点处。#include按标准方式搜索,文件位于C+系统目录的include子目录下。这类文件一般是由系统给出的,并已经过编译。如:#include#include文件名首先在当前目录中搜索,若没有,再按标准方式搜索。这些头文件通常由用户自己给出如:#include“complex.h”#define宏定义指令定义符号常量,已被const定义语句取代。定义带参数宏,已被内联函数取代。条件编译,2019年12月5日,北京林业大学信息学院计算机系,#if常量表达式程序段1#else程序段2#endif/当“常量表达式”非零时编译程序段1,否则编译程序段2,条件编译,2019年12月5日,北京林业大学信息学院计算机系,#ifndef标识符程序段1#else程序段2#endif/当“标识符”未经定义时编译程序段1,否则编译程序段2,条件编译,作用:由于文件包含可以嵌套使用,利用上述条件编译可避免多次重复包含一个头文件,以引起变量及类的重复定义,2019年12月5日,北京林业大学信息学院计算机系,/main.cpp#include“file1.h”#include“file2.h”voidmain(void)/file1.h#include“head.h”/file2.h#include“head.h”,/head.hclassp1,避免类p1重复定义,类p1重复定义,2019年12月5日,北京林业大学信息学院计算机系,下面的程序给出了典型的C+程序结构,它是“Hello,world”程序的变型(教材P9)这个程序由三个文件组成:hello.h(头文件)hello.cpp(源程序文件)main.cpp(源程序文件),/*File:hello.h*/#ifndefHEAD_H#defineHEAD_Hchar*hello(char*);#endif,包含hello函数的原型。main函数可通过“#include”定向到该原型的定义文件,取得对原型的访问性。,C+的程序组成,2019年12月5日,北京林业大学信息学院计算机系,/*File:hello.cpp*/#include/*包括sprintf()的原型*/#include/*包括strlen()的原型*/#include“hello.h”/*包括hello()的原型*/char*hello(char*name)char*value;/*返回串Hello,name.*/value=newchar(9+strlen(name);sprintf(value,Hello,%s.,name);returnvalue;,hello函数的定义文件。它通过一个字符串类型的形式参数接受需要打印的串,返回一个字符串类型的值作为打印串。返回类型必须与在#include定向的“.h”文件中所给出的原型的类型匹配。,2019年12月5日,北京林业大学信息学院计算机系,/*File:main.cpp*/#include#include“hello.h”voidmain(void)cout=0)if(ch=9)cout“这是一个数字!”;elsecout=0)if(ch=9)cout“这是一个数字!”;elsecout“这不是一个数字!”;,2019年12月5日,北京林业大学信息学院计算机系,switch语句用于有多重选择的场合,形式为switch(表达式)case值1:语句组;break;/break可没有case值2:语句组;break;/break可没有case值n:语句组;break;/break可没有default:语句组;注意case后的数值必须是一个整型的常量表达式,且任意两个选择项不能相等。,switch语句(多分支选择型),2019年12月5日,北京林业大学信息学院计算机系,当switch语句执行时,先计算其后的表达式值,将表达式的值与后面各case关键字后所跟选择常量依次比较。如果与某一选择常量相等,则执行其冒号后跟的语句。如果和任何选择常量都不等,则执行default子句后的语句(如果default子句存在)或什么也不做(如果default子句不存在)。每个case子句都以break语句结束。break子句的作用是终止当前switch语句的执行。,2019年12月5日,北京林业大学信息学院计算机系,例:统计文章中各字母出现的次数。程序每读入一个字符ch,根据它的值,将相应的计数值增1,假定英文大小写不区分。intaCnt=0,bCnt=0,zCnt=0;switch(ch)casea:caseA:aCnt+;break;caseb:caseB:bCnt+;break;/casez:caseZ:zCnt+;break;,2019年12月5日,北京林业大学信息学院计算机系,循环语句提供重复处理的能力,当某一特定条件为true时,循环语句就重复执行,并且每循环一次,就会测试一下循环条件,如果为false,则循环结束,否则继续循环。C+支持三种格式的循环语句:while、dowhile和for语句。三者可以完成类似的功能,不同的是它们控制循环的方式。,循环语句,2019年12月5日,北京林业大学信息学院计算机系,while语句的一般形式为:while(条件表达式)循环体语句while循环先计算条件表达式,当条件表达式的运算结果为true时,就执行循环体语句。执行一次循环体语句后,就会重新计算条件表达式,当表达式的值为false时,循环结束。while循环可能一次也不执行。,while语句(先判断后执行),2019年12月5日,北京林业大学信息学院计算机系,do语句的一般形式为:do循环体语句while(条件表达式);do语句先执行循环体语句,然后计算条件表达式是否为true,如果是,则继续执行循环,否则结束循环。与while语句不同的是,do循环中的循环体语句至少执行一次,而while语句当条件第一次不满足时循环体语句一次也不执行。,dowhile语句(先执行后判断),2019年12月5日,北京林业大学信息学院计算机系,for语句用于预先知道循环次数的情况,其一般形式为:for(初始化语句;表达式1;表达式2)循环体语句;其中初始化语句可以是一条声明或表达式,用于对循环控制变量进行初始化或赋值。表达式1用于控制循环结束,当它的值为true时,继续循环,为false时终止循环。表达式2在每次循环执行后改变循环控制变量的值。,for语句,2019年12月5日,北京林业大学信息学院计算机系,具体来说,for循环的执行过程为:执行初始化语句;计算表达式1的值;如果表达式1的值为true:先执行循环体语句;再执行表达式2;然后转向步骤;如果表达式1的值为false,则结束循环。,2019年12月5日,北京林业大学信息学院计算机系,i=1;dosum=sum+i;i+;while(i=100),i=1;while(i用于读入类istream的一个对象。,键盘屏幕输入/输出,2019年12月5日,北京林业大学信息学院计算机系,在下面程序中使用了流cin,相继从标准输入设备上输入两个整型变量a和b,并将它们打印到标准输出设备上。在输出语句中最后输出的endl是C+的I/O操作符,它的用途是输出一个换行符并清空流。,#includevoidmain()inta,b;cinab;cout“a:”a“b:”bnum;coutnameendlnumab;swap(a,b);coutaendlbendl;,#includevoidswap(floatm,floatn)floattemp;temp=m;m=n;n=temp;,使用传值方式时,把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。这样,函数修改的是副本的值,实参的值不变。,2019年12月5日,北京林业大学信息学院计算机系,数组名作形参,#includevoidsub(char);voidmain(void)chara10=“hello”;sub(a);coutaai;m=max(a);coutthemaxnumberis:m;,intmax(intb)inti,n;n=b0;for(i=1;iN;i+)if(nbi)n=bi;returnn;,用数组作函数的参数,求10个整数的最大数,2019年12月5日,北京林业大学信息学院计算机系,练习:用数组作为函数的参数,将数组中n个整数按相反的顺序存放,要求输入和输出在主函数中完成,#include#defineN10voidsub(intb)inti,j,temp,m;m=(N-1)/2;for(i=0;iai;sub(a);for(i=0;iN;i+)couthighTemp)highTemp=temp;if(tempLowTemp)LowTemp=temp;floatTemperature:GetHighTemp()constreturnhighTemp;voidmain(void)Temperaturet1(25,4);constTemperaturet2(30,2);/常对象,必须初始化不能更新t1.UpdateTemp(10);t2.UpdateTemp(10);/错误,常对象只能调用其常成员函数t2.GetHighTemp();/正确,2019年12月5日,北京林业大学信息学院计算机系,当成员函数的返回值为引用方式时,该成员函数的返回值应是一个已存在变量(或对象)的别名。当该成员函数被重新赋值时,其对应变量(或对象)的值将改变。,目的:在内存中不产生被返回值的副本为了将该函数用在赋值运算符的左边,改变其对应变量(或对象)的值使用方法:在函数类型后加上“voidwhatitis(charc)cout“thisisstring”cendl;main()inti=1;charc=abcdef;whatitis(i);whatitis(c);,2019年12月5日,北京林业大学信息学院计算机系,运算符重载,运算符重载是一种特殊的函数重载类型名operator(形参表)其中,operator是关键字,是运算符,#includeclasscomplexpublic:complex()Re=Im=0;/不带参数的构造函数private:doubleRe,Im;/复数的实部与虚部;complexcomplex:operator+(complex,voidmain()complexc1(6,3),c2(4,8),c3;c3=c1+c2,/c3=c1.operator+(c2),2019年12月5日,北京林业大学信息学院计算机系,6、动态存储分配,new类型名T(初值列表)功能:申请用于存放T类型对象的内存空间,并依初值列表赋以初值结果值:成功:T类型的指针,指向新分配的内存失败:0(NULL),int*p1=newint;或int*p1=newint(10);,delete指针P功能:释放指针P所指向的内存。P必须是new操作的返回值,deletep1;,2019年12月5日,北京林业大学信息学院计算机系,用new创建数组:new类型名T下标表达式;,int*p2=newint10;/p2指向数组的首地址,2019年12月5日,北京林业大学信息学院计算机系,友元函数不是该类的成员函数,它可以是一个常规函数,也可以是另一个类的成员函数友元函数可以存取类的私有成员和保护成员,7、友元(friend)函数和内联(inline)函数,2019年12月5日,北京林业大学信息学院计算机系,友元函数的定义和使用方法#include“iostream.h”classX1()private:intx;public:X1(inti)x=i;intgetx();friendvoidsum(X1,2019年12月5日,北京林业大学信息学院计算机系,voidsum(X1,2019年12月5日,北京林业大学信息学院计算机系,friendostream,classcomlexpublic:complex()Re=Im=0;friendostream,2019年12月5日,北京林业大学信息学院计算机系,内联函数声明时使用关键字inline编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销,#includeinlinedoubleCalArea(doubleradius)return3.14*radius*radius;intmain()doubler(3.0);doublearea;area=CalArea(r);/编译上行被替换CalArea函数体语句coutareaendl;return0;,2019年12月5日,北京林业大学信息学院计算机系,模板就是使程序能够对不同类型的数据进行相同方式的处理C+中的模板分为函数模板和类模板,8、模板(template),函数模板的作用:函数模板可以用来创建一个通用功能的函数,使得函数的某些参数、函数的返回值,能取任意类型,以支持多种不同形参,进一步简化重载函数的函数体设计声明方法:template函数声明,2019年12月5日,北京林业大学信息学院计算机系,#includetemplateTabs(Tx)returnx0?-x:x;voidmain()intn=-5;doubled=-5.5;coutabs(n)endl;coutabs(d)endl;,运行结果:55.5,编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:intabs(intx)returnx0?-x:x;,函数模板,2019年12月5日,北京林业大学信息学院计算机系,类模板的作用类模板为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型类模板的声明方法:template类声明,类模板,2019年12月5日,北京林业大学信息学院计算机系,模板参数表:class标识符(指明可以接受一个类型参数)类型说明符标识符(指明可以接受一个由“类型说明符”所规定类型的常量作为参数)当参数有多个时,需用逗号隔开。,类模板的声明方法:template类声明,templateclassA1A1x;,templateclassA2A2y;,templateclassA3A3z;,2019年12月5日,北京林业大学信息学院计算机系,template/定义类模板classStoreprivate:Titem;/用于存放任意类型的数据inthaveValue;/用于标记item是否已被存入内容public:Store(void);/缺省形式(无形参)的构造函数TGetElem(void);/提取数据函数voidPutElem(Tx);/存入数据函数;/缺省形式构造函数的实现template/模板类的成员函数必须是模板函数Store:Store(void):haveValue(0),例:实现对任意类型数据进行存取,2019年12月5日,北京林业大学信息学院计算机系,template/提取数据函数的实现TStore:GetElem(void)/如果试图提取未初始化的数据,则终止程序if(haveValue=0)cout/存入数据函数的实现voidStore:PutElem(Tx)haveValue+;/表示item中已存入数值item=x;/将x值存入item,2019年12月5日,北京林业大学信息学院计算机系,voidmain(void)StoreS1;/定义类模板的对象StoreS2,S3;/定义类模板的对象S1.PutElem(8);S2.PutElem(-1.5);coutS1.GetElem()S2.GetElem()endl;coutS3.GetElem()endl;/输出对象S3的数据成员,运行结果:81.5Noitempresent!,/由于S3未经初始化,在执行函数S3.GetElement()时出错,2019年12月5日,北京林业大学信息学院计算机系,#includetemplateclassA

温馨提示

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

评论

0/150

提交评论