《上机调试程序方法.ppt》由会员分享,可在线阅读,更多相关《上机调试程序方法.ppt(80页珍藏版)》请在三一办公上搜索。
1、面向对象程序设计,计算机与信息学院 李丽珊,学时安排,本课程共60学时,3.5学分,理论教学40学时,实践教学20学时,教学内容与教材章节对应关系,补充知识:面向对象相关知识 MFC基础和ViC可视化开发基础 UML相关知识,目录,第1章 C+语言特点,了解:C+与C的关系以及二者的相同点和不同点;掌握:C+的非面向对象语言特征。,目的要求,C+的起源和特点、与C的关系 最简单的C+程序C+对C的扩充C+程序的编写和实现关于C+上机实践,授课内容,1.1 C+的起源和特点、与C的关系,C语言是七十年代初贝尔实验室的Dennis Richie 等人在B语言基础上开发出来的。C最初是作为UNIX操
2、作系统的开发语言为人们所认识。七十年代末,随着微型计算机的发展,C语言开始移植到非UNIX环境中,并逐步脱离UNIX系统成为一种独立的程序设计语言。C 语言版本很多,为了让开发出来的代码能够在多种平台上运行,1988年美国国家标准协会ANSI对C语言进行了标准化,产生了ANSI C。,(1)C语言既具备高级语言的结构和编程环境,又提供类似于汇编语言那样的系统资源操纵能力及程序执行效率。适合解决有实时要求的问题。,C 语言的主要特点:,(2)有丰富的运算符和数据类型,表达式类型多样化,可以方便地实现在其他语言中较难实现的运算,对各种不同类型的程序设计都有良好的适应性。,(3)以函数为基础实现程序
3、的结构化设计,支持大型程序的多文件构成及单个文件独立编译,适合大型复杂程序的设计。,(4)语言简洁、紧凑,使用方便、灵活,书写形式自由。,(5)可移植性好。,C+是由C发展成为的以面向对象为主要特征的语言。作为C语言的超集,C+继承了C的所有优点,又对数据类型做了扩充,使得编译系统可以检查出更多类型错误。,C+支持面向对象程序设计,通过类和对象的概念把数据和对数据的操作封装在一起,通过派生、继承、重载和多态性等特征实现了软件重用和程序自动生成,使得大型复杂软件的构造和维护变得更加有效和容易。,此外,在一致性(Consistency)检查机制方面也作了加强,提高了软件开发的效率和质量。,C+与C
4、完全兼容,很多用C编写的库函数和应用程序都可以为C+所用。,但正是由于与C兼容,使得C+不是纯正的面向对象的语言,它既支持面向对象程序设计,也支持面向过程设计。但我们应当注意用面向对象的思想进行设计,以发挥出C+的优势。,C+有许多版本,国内较为流行的有Microsoft公司的Visual C+。,C+对C的“增强”,表现在两个方面:(1)在原来面向过程的机制基础上,对C语言的功能做了不少扩充。(2)增加了面向对象的机制。面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率。学习C+,既要会利用C+进行面向过程的结构化程序设计,也要会利用C+进行面向对象的程序设计。,
5、运行结果:This is a C+program.,1.2 最简单的C+程序,#include/包含头文件iostreamusing namespace std;/使用命名空间stdint main()coutThis is a C+program.;return 0;,例1.1,用main代表“主函数”的名字。每一个C+程序都必须有一个 main 函数。必须声明main函数的类型,无返回值时要声明为void类型。一般声明为int,如程序正常结束,向操作系统返回一个零值,不能正常结束时返回一个非0值。,在初学C+时,只需知道:如果程序有输入或输出时,必须使用“#include”命令以提供必要的
6、信息,同时要用“using namespace std;”,使程序能够使用这些信息,否则程序编译时将出错。,“using namespace std;”的意思是“使用命名空间std”。C+标准库中的类和函数是在命名空间std中声明的,因此程序中如果需要用到C+标准库,就需要用“using namespace std;”作声明,表示要用到命名空间std中的内容。,文件iostream的作用是向程序提供输入或输出时所需要的一些信息。iostream是i-o-stream 3个词的组合,代表“输入输出流”的意思。,#include using namespace std;int main()int
7、a,b,sum;cinab;sum=a+b;cout“a+b=”sumendl;return 0;,例1.2,#include using namespace std;int max(int x,int y)int z;if(xy)z=x;else z=y;return(z);int main()int a,b,m;cinab;m=max(a,b);cout“max=”m n;return 0;,例1.3,例1.3的程序可以改写如下:#include using namespace std;int main()int max(int x,int y);/对max函数作声明 int a,b,c;
8、cinab;c=max(a,b);/调用max函数 couty)z=x;else z=y;return(z);,int main()stud1.setdata();stud2.setdata();stud1.display();stud2.display();return 0;,程序运行情况如下:1001 98.5 1002 76.5 输出结果:num=1001score=98.5num=1002score=76.5,#include using namespace std;class Student private:int num;int score;public:void setdata(
9、)cinnum;cinscore;void display()coutnum=numendl;coutscore=scoreendl;Student stud1,stud2;,例1.4:一个包含类和对象的C+程序。,在一个类中包含两种成员:数据和函数,分别称为数据成员和成员函数。在C+中把一组数据和有权调用这些数据的函数封装在一起,组成一种称为“类(class)”的数据结构。成员函数是用来对数据成员进行操作的。也就是说,一个类是由一批数据以及对其操作的函数组成的。类可以体现数据的封装性和信息隐蔽。在大多数情况下,会把所有数据指定为私有,以实现信息隐蔽。具有“类”类型特征的变量称为“对象”(ob
10、ject)。,在上面的程序中:数据成员num,score和成员函数setdata,display组成了一个名为Student的“类”类型。在声明Student类时,把类中的数据和函数分为两大类:private(私有的)和public(公用的)。把全部数据(num,score)指定为私有的,把全部函数(setdata,display)指定为公用的。,1.3 C+对C的扩充,使用以”/”开头的注释对变量的定义可以出现在程序中的任何行(但必须在引用该变量之前)提供了标准输入输出流cin和cout用const定义常变量函数模板,简化同一类型的函数的编程工作使用带默认值的参数的函数,使函数的调用更加灵活
11、,提供变量的引用类型,将引用作为函数形参,可以实现通过函数的调用来改变实参变量的值增加了内置函数(内嵌函数),以提高程序的执行效率作用域运算符:,这样在局部变量作用域内也能引用全局变量用string类定义字符串变量,使字符串运算更加方便用new和delete运算符代替malloc和free函数,使分配动态空间更加方便,1.3 C+对C的扩充(续),C+的输入输出,输入和输出并不是C+语言中的正式组成成分,而是在编译系统提供的I/O库中定义的。C+的输出和输入是用“流”(stream)的方式实现的。C+中,可以用cin和cout函数进行输入输出.,cout语句的一般格式为 cout变量1变量2变
12、量n;在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或n,ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。,1.3.2 用const定义常变量,加上关键字const,变量的值在程序运行期间不能改变,这种变量称为常变量(constant variable)。在定义常变量时必须同时对它初始化(即指定其值),此后它的值不能再改变。可以用表达式对常变量初始化例:const int a=3;/
13、用const来声明为常变量,指定其值始终为3 const int b=3+6,c=3*cos(1.5);/b的值被指定为9,c的值被指定为3*cos(1.5),函数原型声明,C+要求在函数调用之前必须对所调用的函数做函数原型声明.函数声明的一般形式为:函数类型 函数名(参数表);参数表中一般包括参数类型和参数名,函数的重载,C+允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数的重载(function overloading)。即对一个函数名重新赋予它新的含义,使一个函数名可以多用。重载函数的参数个数、参数类型或参数顺序3者中必须至少有一种不同,函数返回值类型可以相同也
14、可以不同。,例1.6 求3个数中最大的数,#include using namespace std;int main()int max(int a,int b,int c);double max(double a,double b,double c);long max(long a,long b,long c);int i1,i2,i3,i;cini1i2i3;i=max(i1,i2,i3);coutd1d2d3;d=max(d1,d2,d3);coutg1g2g3;g=max(g1,g2,g3);coutg_max=gendl;,int max(int a,int b,int c)if(ba
15、)a=b;if(ca)a=c;return a;double max(double a,double b,double c)if(ba)a=b;if(ca)a=c;return a;long max(long a,long b,long c)if(ba)a=b;if(ca)a=c;return a;,运行情况如下:185-76 567(输入3个整数)56.87 90.23-3214.78(输入3个实数)67854-912456 673456(输入3个长整数)i_max=567(输出3个整数的最大值)d_max=90.23(输出3个双精度数的最大值)g_max=673456(输出3个长整数的最大
16、值),#include using namespace std;int main()int max(int a,int b,int c);int max(int a,int b);int a=8,b=-12,c=27;couta)a=b;if(ca)a=c;return a;int max(int a,int b)if(ab)return a;else return b;,例1.7 求两个整数或3个整数中的最大数。,运行情况如下:max(a,b,c)=27max(a,b)=8,函数模板,所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数
17、就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。用函数模板比函数重载更方便,程序更简洁。,#include using namespace std;template/模板声明,其中T为类型参数T max(T a,T b,T c)/定义一个通用函数,用T作虚拟的类型名if(ba)a=b;if(ca)a=c;return a;int main()int i1=185,i2=-76,i3=567,i;double d1=56.87,d2=90.23,d3=-321
18、4.78,d;long g1=67854,g2=-912456,g3=673456,g;i=max(i1,i2,i3);/调用模板函数,此时T被int取代 d=max(d1,d2,d3);/调用模板函数,此时T被double取代 g=max(g1,g2,g3);/调用模板函数,此时T被long取代 couti_max=iendl;coutf_max=fendl;coutg_max=gendl;return 0;,例1.8:,定义函数模板的一般形式为 template 或 template 通用函数定义 通用函数定义类型参数可以不只一个,可以根据需要确定个数。如template 注意:只适用于函
19、数的参数个数相同而类型不同,且函数体相同的情况,如果参数的个数不同,则不能用函数模板。,有默认参数的函数,多次调用同一函数且用同样的实参,可以给形参一个默认值。这种方法比较灵活,可以简化编程,提高运行效率。例1:函数声明 float area(float r=6.5);函数调用:area();/相当于area(6.5);area(7.5);/不想取默认值,通过实参另行给出。,有多个形参,可以使每个形参有一个默认值,也可以只对一部分形参指定默认值,另一部分形参不指定默认值。例2:函数声明:float volume(float h,float r=12.5);函数调用:volume(45.6);/
20、相当于volume(45.6,12.5)volume(34.2,10.4)/h的值为34.2,r的值为10.4实参与形参的结合是从左至右顺序进行的。因此指定默认值的参数必须放在形参表列中的最右端,否则出错。,例3:函数声明:void f1(float a,int b=0,int c,char d=a);/不正确void f2(float a,int c,int b=0,char d=a);/正确函数调用:f2(3.5,5,3,x)/形参的值全部从实参得到f2(3.5,5,3)/最后一个形参的值取默认值af2(3.5,5)/最后两个形参的值取默认值,b=0,d=a在调用有默认参数的函数时,实参的
21、个数可以与形参的个数不同,实参未给定的,从形参的默认值得到值。,在使用带有默认参数的函数时有两点要注意:(1)什么时候设定默认值:函数定义中给出:函数的定义在函数调用之前函数声明中给出:函数的定义在函数调用之后,在函数定义时可以不给出默认值。(2)一个函数不能既作为重载函数,又作为有默认参数的函数。,变量的引用,引用又称别名。例:int a;int 说明:(1)引用不是一种独立的数据类型,必须与某一种类型的数据相联系。(2)引用与其所代表的变量共享同一内存单元。(3)区别声明引用变量还是取地址操作:引用的声明前面有类型符。(4)对引用的初始化,可以用一个变量名,也可以用另一个引用(5)引用初始
22、化后不能再重新声明为另一个变量的别名,内置函数,能在编译时将所调用函数的代码直接嵌入到主调函数中的函数称为内置函数(inline function),又称内嵌函数。在有些书中把它译成内联函数。节省了调用函数所需要的时间和空间的开销。在函数首行的左端加一个关键字inline即可指定内置函数。,例1.13 函数指定为内置函数。#include using namespace std;inline int max(int,int,int);/声明函数,注意左端有inlineint main()int i=10,j=20,k=30,m;m=max(i,j,k);couta)a=b;/求a,b,c中的最
23、大者 if(ca)a=c;return a;,例1.15 用内置函数实现求平方值#include using namespace std;inline int power(int x)return x*x;int main()coutpower(2)endl;coutpower(1+1)endl;return 0;运行结果是:4(输出power(2)的值)4(输出power(1+1)的值),注意:在声明函数和定义函数时同时写inline,或只在其中一处声明inline,都能按内置函数处理。使用内置函数可以节省运行时间,但却增加了目标程序的长度。内置函数中不能包括复杂的控制语句,如循环语句和sw
24、itch语句。只有那些规模较小而又被频繁调用的简单函数,才适合于声明为inline函数。,作用域运算符,作用域运算符:,能指定所需要的作用域。注意:不能用”:”访问函数中的局部变量见教材P26例1.16,字符串变量,C+新的一种数据类型字符串类型(string类型),可以用来定义变量,这就是字符串变量用一个名字代表一个字符序列。实际上,string并不是C+语言本身具有的基本类型,它是在C+标准库中声明的一个字符串类,用这种类可以定义对象。每一个字符串变量都是string类的一个对象。要使用string类的功能时,必须有文件包含#include,1.定义字符串变量:用类名string2.对字符
25、串变量的赋值可以用赋值语句对它赋予一个字符串常量也可以用一个字符串变量给另一个字符串变量赋值。不要求两个字符川长度相同。可以对字符串变量中某一字符进行操作例1:string string1;/定义string1为字符串变量 string string2=China;/定义string2同时对其初始化 string1=Canada;string2=string1;例2:string word=“Then”;/定义并初始化字符串变量word word2=a;/修改后word的值为”Than”,3.字符串变量的输入输出用在cin,cout语句中直接用字符串变量名输入输出字符串如:cin string
26、1;cout string2;4.字符串变量的运算字符串复制用赋值号“=”string1=string2;字符串连接用加号“+”string string1=C+;string string2=Language;string1=string1+string2;字符串比较直接用关系运算符,5.字符串数组在一个字符串数组中包含若干个元素,每个元素相当于一个字符串变量。不要求每个字符串元素具有相同的长度,即使对同一个元素而言,它的长度也是可以变化的。在字符串数组的每一个元素中存放一个字符串。每一个字符串元素中只包含字符串本身的字符而不包括0。,如:string name5;/定义一个字符串数组,它包
27、含5个字符串元素string name5=“Zhang”,”Li”,”Fun”,”Wang”,”Tan;此时name数组的状况如图所示。,字符串运算举例,例1.17 输入3个字符串,要求将字母按由小到大的顺序输出。#include int main()string string1,string2,string3,temp;coutstring1string2string3;if(string2string3)temp=string2;string2=string3;string3=temp;/使串2串3 if(string1=string2)coutstring1“string2“string
28、3endl;/如果串1串2,则串1串2串3 else if(string1=string3)coutstring2“string1“string3endl;/如果串1串2,且串1串3,则串2串1串3 else coutstring2“string3“string1endl;/如果串1串2,且串1串3,则串2串3串1,运行情况如下:please input three strings:China U.S.A.GermanyChina Germany U.S.A.,1.3.11 动态分配/撤销内存的运算符,C+提供了运算符new和delete来取代C语言中的malloc和free函数。new运算符
29、使用的一般格式为new 类型 初值 用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL。delete运算符使用的一般格式为delete 指针变量,#include#include using namespace std;struct Student/声明结构体类型Student string name;int num;char sex;int main()Student*p;/定义指向结构体类型Student的数据的指针变量 p=new Student;/用new运算符开辟一个存放Student数据的空间 p-name=Wang Fu
30、n;/向结构体变量的成员赋值 p-num=10123;p-sex=m;coutnamenumsexendl;delete p;/撤销该空间 return 0;,例1.18 开辟空间以存放一个结构体变量。,从C+源程序到可执行程序的步骤:编辑、预处理、编译、连接、调试,1.4 C+程序的编写和实现,编辑是将源程序输入计算机,生成后缀为.cpp的文件。编译(compile)是将程序的源代码转换成机器语言代码。编译后,会生成一个.obj的目标文件,为源程序的目标代码。目标代码需要相互衔接成为一个适应一定操作系统环境的程序整体,即连接(link)。C+程序通常是通过同时连接一个或多个目标文件以及一个或
31、几个库而创建的。库(.lib)是一组由机器指令构成的程序代码,是可连接文件。库有标准库和用户生成的库。标准库是由C+提供的,用户生成的库是由软件开发商或程序员提供的。文件与库连接的结果,即生成一个后缀为.exe的计算机可执行程序。,1.5 关于C+上机实践,C+的运行环境,Microsoft公司的Visual C+6.0,Borland公司的Borland C+5.02等等,在Visual C+6.0 运行环境中建立C+应用程序的过程演示,建立新工程(Project),建立新文件(File),编辑、编译及运行程序,实例程序:/*功 能:从键盘接收两个整数,输出显示其中的较大数。*/#inclu
32、de void main()int a,b,max;/声明三个整型变量 cout a b;/从键盘接收两个整数赋给a、b if(a=b)max=a;/若a b 则将a赋给max else max=b;/否则将b赋给max cout The max is:max endl;/输出max并换行,.cpp文件.h文件.exe文件,存入软盘,将结果,关闭工程,准备输入下一个程序,ALT COMAPP向导(com应用)资源类创建向导普通 app向导(app就是application应用程序)数据类程序开发和设计附加向导扩展存储程序向导api扩展向导制作文件控制向导mfc app 向导(用于生成dll)m
33、fc app 向导(用于生成exe)新建数据类型向导通用程序win32 应用程序(做有界面的)win32 控制台应用程序(黑框)win32 动态链接库win32 静态链接库,比较Win32 Application和Win32 Console Application 都是工作在32位Windows环境的程序。其中Win32 Application 就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,比如圆形的、不规则形状的 它们都是所谓的GUI(Graphics User Interface图形用户接口),我们可以通过鼠标点击来完成控制。而Win32 Console Application
34、(win32控制台应用程序)往往是像MS-DOS窗口(XP中叫命令提示符)的样子出现,我们得用键盘输入各种命令来使用它;或者叫CUI(Character User Interface字符用户接口)。,活动服务页 Binary File 二进制文件位图文件C/C+头文件C+源文件光标文件HTML Page HTML网页lcon档案Macro File 宏观档案脚本文件资源模板SQL Script File SQL文本文件,(1)启动Visual C+6.0,打开File菜单,执行New菜单命令,出现New对话框。在Project页面窗口中选择Win32 Console Application选项
35、,创建一个Win32控制台应用程序。在Project name编辑框中输入项目名称tc1,在Location编辑框中输入保存项目的路径。(2)在Win32 Console Application-Step1 of 1对话框中设置控制台应用程序的类型。这里我们要创建一个空项目程序,因此选择第一项An empty project,单击Finish按钮,出现New Project Information对话框,单击OK按钮,将生成一个空项目。,(3)向项目 tc1 中添加源程序文件。打开Project菜单,选择Add to Project|New,出现如图1-3所示的添加项目文件对话框。在的File
36、s页面窗口中选择C+Source File,在右边的File编辑框中输入C+源程序文件名称cp1,在Location编辑框中输入保存该文件的路径。单击OK按钮,在主窗口Developer Studio左边的项目工作区窗口的Souce Files文件夹目录下出现cp1.cpp文件,双击该文件,在右边的编辑窗口中输入源程序代码。(4)编译运行源程序cp1.cpp。打开Build菜单,选择Build cp1.exe命令项或按快捷键F7,系统开始对项目cp1进行编译、连接,同时在输出窗口中显示出编译的内容,当出现Hello.exe 0 error(s),0 warning(s)字样时,表示cp1.exe可执行文件已经正确无误地生成了。在Build菜单中选取Execute cp1.exe命令项或按快捷键Ctrl+F5,就可以运行刚刚生成的cp1.exe。,