C++语言程序设计
第 1讲,绪论 /5
低级语言与高级语言
?面向机器的语言是 低级语言 ;面向使用者的语
言是 高级语言 。
?机器可直接执行的语言是 低级语言 ;必须经过
,翻译, 才能执行的语言是 高级语言 。
?汇编语言是低级语言;
? Basic,Pascal,Fortran,C,MathLab,C++、
Java,C#等都是高级语言。
?低级语言 由于面向机器,所以执行效率很高;
?但可读性差、编写困难,不易维护。
人与计算机的沟通
?机器语言,
?机器直接执行
?汇编语言,
?与机器码对应
?高级语言,
?通过, 翻译,
01010010
10010011
00110011
01010010
10010011
00110011
MOV AX,A5h
MOV BX,90h
INT 13h
01010010
10010011
00110011
。。。
for(i=1,i<20;i++)
{
variable += 25;
if(variable==100) break;
}
高级语言
?高级语言屏蔽了机器的细节,提高了语言的抽
象层次,程序中可以采用具有一定涵义的数据
命名和容易理解的执行语句。这使得在书写程
序时可以联系到程序所描述的具体事物。
?高级语言的特征,使用人比较容易理解的逻辑
语言来记录计算机运算过程。
?高级语言的逻辑结构,顺序结构、选择结构、
循环结构等。
?高级语言与具体机器指令无关。
?高级语言需要通过 编译 或 解释 才能在计算机上
运行。
面向过程与面向对象
?最早面向过程 FORTRAN77, 代码
?结构化程序 ALGOL60,后发展成
PASCAL,代码
?50年代开始发展,直到 80年代。
?80年代末 C语言开始流行,一直到 90年代。
?面向过程实际上就是面向 结构 和 函数 的程
序。
软件危机
? 软件危机最早在 1968年的 NATO会议提出,
表现为,
1,对软件的需求远超出现有的生产能力;
2,人们依赖于脆弱的软件,目前的软件不可靠、缺
乏安全性、性能下降、出错、难以升级,73%的
软件项目被延迟、超资、取消或失败。
? 为了从根本上解决软件危机的危机,人类提
出了, 软件工程, 的一些列方法,然而,众
多的软件工程的方法并没有彻底解决, 软件
危机, 的问题。
软件危机
? 1986年,弗雷德里克 ·布鲁克斯提出一个著名悲
观论断:, 没有一种单纯的技术或管理上的进
步,能够独立地承诺在 10年内大幅度地提高软
件的生产率、可靠性和简洁性, 。
? 非常遗憾的是 银弹论断 迄今为止尚未打破!据
美国国家标准和技术研究院的一份报告显示,
占据世界软件销售额 85%的是大型的专用软件,
而其开发的失败率却高达 70%。
? 针对日趋复杂的软件需求的挑战,软件业界在
90年代发展出了 面向对象 ( Object-Oriented)
的软件开发模式,作为针对, 软件危机, 的最
佳对策。
面向对象的思想
?一般对象,
? 是现实世界中一个实际存在的事物。
? 可以使有形的(比如一辆汽车),也可以是无形的
(比如一项计划)。
? 是构成世界的一个独立单位,具有,
? 静态特征:可以用某种数据来描述
? 动态特征:对象所表现的行为或具有的功能
?软件中的 对象,
? 对象应可以用量化描述和处理;
? 对象具有 属性 和 行为,
? 属性:描述对象的静态特征的数据项;
? 行为:表述对象的动态特征的操作序列。
面向对象的思想
?面向过程 好比是无人管
理的阅览室,只有书架
和图书,随便看,随便
拿。
?面向对象 好比是图书馆,
图书被有效的管理(分
类),借书凭证,到期
归还。
? 属性,各种类型的图书、
各个阅览室
? 行为,图书进货,阅读
规则,借阅规则,残破
处理等。
面向对象的思想 ——类
Class
?分类 ——人类通常的思维方法
?分类所依据的原则 ——抽象
?忽略事物的非本质特征,只注意那些与当前目
标有关的本质特征,从而找出事物的共性,把
具有共同性质的事物划分为一类,得出一个抽
象的概念。
?例如,石头、树木、汽车、房屋等都是人们在
长期的生产和生活实践中抽象出的概念。
面向对象的思想 ——类
Class
?面向对象方法中的 "类 "
?具有相同属性和服务的一组对象的集合
?为属于该类的全部对象提供了抽象的描述,包
括属性和行为两个主要部分。
?类与对象的关系,
犹如模具与铸件之间的关系,一个属于某类的
对象称为该类的一个实例。
面向对象的思想 ——封装
Envelopment
?把对象的属性和服务结合成一个独立的系
统单位。
?尽可能隐蔽对象的内部细节。对外形成一
个边界(或者说一道屏障),只保留有限
的对外接口使之与外部发生联系。
?例如:图书馆的管理,由管理员验证你证
件的有效性,查找你所需要的资料等。
面向对象的思想 ——继承
Inherit
?继承对于软件复用有着重要意义,是面
向对象技术能够提高软件开发效率的重
要原因之一。
?定义:特殊类的对象拥有其一般类的全
部属性与服务,称作特殊类对一般类的
继承。
?例如:将轮船作为一个一般类,客轮便
是一个特殊类。
面向对象的思想 ——多态性
Polymorphism
?多态是指在一般类中定义的属性或行为,
被特殊类继承之后,可以具有不同的数
据类型或表现出不同的行为。这使得同
一个属性或行为在一般类及其各个特殊
类中具有不同的语义。
?例如,
?数的加法 ->实数的加法
->复数的加法
软件编写的一些常见问题
问题 1,常量与变量的区别?
?常量:在程序运行中其值不能被改变的量。
?变量:在程序运行中其值可以被改变的量。
?常量类型:整型常量、实型常量、字符常量、
符号常量(宏定义)。
? #define PI 3.1415926
?变量:变量名,变量值。原则:先定义后使用。
? int a; a = 10;
问题 2,运算符的来历?
?在低级语言中只有操作指令( instruction)和操作
数( operand)
? instruction operand1,operand2
?高级语言将能完成某项工作的一组有关指令用 函数
( function) 来表示。如,
? int c; c = Add(int a,int b) 表示 a与 b的和。
? 进一步抽象,int a,b,c; … c = a + b;
? 同样,c = Increase(int a); ? c = a++;
?根据运算符 operator的操作数的个数来确定运算符
的目数:单目、双目、三目。
问题 3,C语言中有哪些运算符?
?双目运算符:有两个操作数;单目运算符:有一个操
作数;
?双目运算符,
? +(加),-(减),*(乘),/(除),%(取余)
? = (赋值) +=,-=,/=,*=,|=,&=,^=
? ==(相等),!=(不相等),>(大于),<(小于),>=
(大于等于),<=(小于等于)。
? ||(逻辑或),&&(逻辑与)
? <<(左移),>>(右移),|(或),&(与),^(异或)
?,(结构成员),->(指针型结构成员)
?,(逗号运算)
问题 4,C语言中有哪些运算符?
?单目运算符,
? ++(递增),--(递减),-(负)。
? !(逻辑非),~(补)
? &(取地址),*(按指针取值)
? sizeof (取大小),() (类型转换),[](数组下标)
?三目运算符,
??,(条件运算), c = (a > b )? a, b;
等价于 if ( a > b ) c = a; else c = b;
问题 5,宏定义是什么?
1,定义一个常量
? #define PI 3.1415926
? float x,y; x = PI/2.0; y = 3*PI;
2,定义一个带参数的表达式
? #define DISTANT(x,y) sqrt((x)*(x)+(y)*(y))
? float x,y,d; d = DISTANT(x,y);
3,字符串可以这样定义,
#define PRINT_MYNAME(myname) \
printf(“My name is = %s”,#myname);
4,字符串还能这样,
#define NEW_VARIABLE(newtype) \
var = Var_##newtype;
问题 6,地址 是什么 回事? 指
针 又是怎么?
?地址( address)是数据在内存中存放的位置。按
字节编号。
?每个有效的变量都有 有效的 地址。
?在有效地址上存放的可能是别的地址的值。
? 例如 设 a,b 的地址分别是 A,B,A => &a,B => &b;
? 地址 B存放了地址 A的值 &a => A =>*B => b;
? 因此 a => *(&a) => *b; 所以 b 是指向 a的 指针!
? [注 ] => 为等价于(数值相同)的意思。
? int a; int* b; a = 10; b = &a;
?则 *b 的值是 10! b 是 a 的指针!
问题 7,双指针 是怎么回事?
指针与数组是什么关系?
?请看下面的例子,
int a; int* b; int** c;
a = 10; b = &a; c = &b;
c 就是指针的指针,即双指针。
? 数组有静态的(栈 stack中申请)和动态的(堆 heap
中申请)
? char Name[10]; /* Name 拥有 10个字节的空间 */
? char* Text; Text = malloc(10); /*Text 也拥有 10个字节的
空间 */
? 静态空间是自动释放的,而动态空间是需要调用 Free来
释放的。
?二维数组就应该用双指针,如 char**。
问题 8,如何理解函数的参数?
?函数有形参和实参。形参表示参数的形式,
实参表示实际的参数传递。实参的数据类型
要与形参保持一致。
?声明,void function(int var1,int var2);
?使用,int v1,v2; v1=10; v2=20; function(v1,v2);
?v1,v2 通过函数入口将数值传入 function内。
?如果 function 将 var1和 var2的值改变了,是
否会影响 function 外部呢?
问题 8,如何理解函数的参数?
? 如果函数定义,
void function (int var1,int var2)
{ var1 = 100; var2 = 200; }
? 调用,
int v1,v2; v1 = 10; v2 = 20;
function (v1,v2);
printf (“var1=%d,var2=%d”,v1,v2 );
? 结果是,var1=10,var2=20
? 这称为传值调用。
问题 8,如何理解函数的参数?
? 如果函数定义,
void function (int var1,int* pvar2)
{ var1 = 100; *pvar2 = 200; }
? 调用,
int v1,v2; v1 = 10; v2 = 20;
function (v1,&v2);
printf (“var1=%d,var2=%d”,v1,v2 );
? 结果是,var1=10,var2=200
? 这称为传指针调用。
本课考核方法
?平时成绩,20分
?上课和作业
?实验成绩,30分
?三次 MFC编程练习
?期末考试,50分
?开卷考试,基本概念和编程能力
?
?布鲁克斯用形象的譬喻来论述软件工程中存在
的, 陷阱, ——“在所有恐怖民间传说的妖怪
中,最可怕的是人狼,因为它们可以完全出乎
意料地从熟悉的面孔变成可怕的怪物,,而
,大家熟悉的软件项目具有一些人狼的特性
(至少在非技术经理看来),常常看似简单明
了的东西,却有可能变成一个落后进度、超出
预算、存在大量缺陷的怪物, 。惊悚故事里,
人们只有用银弹(银质子弹)才能消灭人狼,
而布鲁克斯认为,在软件工程中,,没有银
弹,,没有一种能够遏制软件向, 怪物, 变异、
同时还可大幅提升开发效率和产品质量的武器。
返回
第 1讲,绪论 /5
低级语言与高级语言
?面向机器的语言是 低级语言 ;面向使用者的语
言是 高级语言 。
?机器可直接执行的语言是 低级语言 ;必须经过
,翻译, 才能执行的语言是 高级语言 。
?汇编语言是低级语言;
? Basic,Pascal,Fortran,C,MathLab,C++、
Java,C#等都是高级语言。
?低级语言 由于面向机器,所以执行效率很高;
?但可读性差、编写困难,不易维护。
人与计算机的沟通
?机器语言,
?机器直接执行
?汇编语言,
?与机器码对应
?高级语言,
?通过, 翻译,
01010010
10010011
00110011
01010010
10010011
00110011
MOV AX,A5h
MOV BX,90h
INT 13h
01010010
10010011
00110011
。。。
for(i=1,i<20;i++)
{
variable += 25;
if(variable==100) break;
}
高级语言
?高级语言屏蔽了机器的细节,提高了语言的抽
象层次,程序中可以采用具有一定涵义的数据
命名和容易理解的执行语句。这使得在书写程
序时可以联系到程序所描述的具体事物。
?高级语言的特征,使用人比较容易理解的逻辑
语言来记录计算机运算过程。
?高级语言的逻辑结构,顺序结构、选择结构、
循环结构等。
?高级语言与具体机器指令无关。
?高级语言需要通过 编译 或 解释 才能在计算机上
运行。
面向过程与面向对象
?最早面向过程 FORTRAN77, 代码
?结构化程序 ALGOL60,后发展成
PASCAL,代码
?50年代开始发展,直到 80年代。
?80年代末 C语言开始流行,一直到 90年代。
?面向过程实际上就是面向 结构 和 函数 的程
序。
软件危机
? 软件危机最早在 1968年的 NATO会议提出,
表现为,
1,对软件的需求远超出现有的生产能力;
2,人们依赖于脆弱的软件,目前的软件不可靠、缺
乏安全性、性能下降、出错、难以升级,73%的
软件项目被延迟、超资、取消或失败。
? 为了从根本上解决软件危机的危机,人类提
出了, 软件工程, 的一些列方法,然而,众
多的软件工程的方法并没有彻底解决, 软件
危机, 的问题。
软件危机
? 1986年,弗雷德里克 ·布鲁克斯提出一个著名悲
观论断:, 没有一种单纯的技术或管理上的进
步,能够独立地承诺在 10年内大幅度地提高软
件的生产率、可靠性和简洁性, 。
? 非常遗憾的是 银弹论断 迄今为止尚未打破!据
美国国家标准和技术研究院的一份报告显示,
占据世界软件销售额 85%的是大型的专用软件,
而其开发的失败率却高达 70%。
? 针对日趋复杂的软件需求的挑战,软件业界在
90年代发展出了 面向对象 ( Object-Oriented)
的软件开发模式,作为针对, 软件危机, 的最
佳对策。
面向对象的思想
?一般对象,
? 是现实世界中一个实际存在的事物。
? 可以使有形的(比如一辆汽车),也可以是无形的
(比如一项计划)。
? 是构成世界的一个独立单位,具有,
? 静态特征:可以用某种数据来描述
? 动态特征:对象所表现的行为或具有的功能
?软件中的 对象,
? 对象应可以用量化描述和处理;
? 对象具有 属性 和 行为,
? 属性:描述对象的静态特征的数据项;
? 行为:表述对象的动态特征的操作序列。
面向对象的思想
?面向过程 好比是无人管
理的阅览室,只有书架
和图书,随便看,随便
拿。
?面向对象 好比是图书馆,
图书被有效的管理(分
类),借书凭证,到期
归还。
? 属性,各种类型的图书、
各个阅览室
? 行为,图书进货,阅读
规则,借阅规则,残破
处理等。
面向对象的思想 ——类
Class
?分类 ——人类通常的思维方法
?分类所依据的原则 ——抽象
?忽略事物的非本质特征,只注意那些与当前目
标有关的本质特征,从而找出事物的共性,把
具有共同性质的事物划分为一类,得出一个抽
象的概念。
?例如,石头、树木、汽车、房屋等都是人们在
长期的生产和生活实践中抽象出的概念。
面向对象的思想 ——类
Class
?面向对象方法中的 "类 "
?具有相同属性和服务的一组对象的集合
?为属于该类的全部对象提供了抽象的描述,包
括属性和行为两个主要部分。
?类与对象的关系,
犹如模具与铸件之间的关系,一个属于某类的
对象称为该类的一个实例。
面向对象的思想 ——封装
Envelopment
?把对象的属性和服务结合成一个独立的系
统单位。
?尽可能隐蔽对象的内部细节。对外形成一
个边界(或者说一道屏障),只保留有限
的对外接口使之与外部发生联系。
?例如:图书馆的管理,由管理员验证你证
件的有效性,查找你所需要的资料等。
面向对象的思想 ——继承
Inherit
?继承对于软件复用有着重要意义,是面
向对象技术能够提高软件开发效率的重
要原因之一。
?定义:特殊类的对象拥有其一般类的全
部属性与服务,称作特殊类对一般类的
继承。
?例如:将轮船作为一个一般类,客轮便
是一个特殊类。
面向对象的思想 ——多态性
Polymorphism
?多态是指在一般类中定义的属性或行为,
被特殊类继承之后,可以具有不同的数
据类型或表现出不同的行为。这使得同
一个属性或行为在一般类及其各个特殊
类中具有不同的语义。
?例如,
?数的加法 ->实数的加法
->复数的加法
软件编写的一些常见问题
问题 1,常量与变量的区别?
?常量:在程序运行中其值不能被改变的量。
?变量:在程序运行中其值可以被改变的量。
?常量类型:整型常量、实型常量、字符常量、
符号常量(宏定义)。
? #define PI 3.1415926
?变量:变量名,变量值。原则:先定义后使用。
? int a; a = 10;
问题 2,运算符的来历?
?在低级语言中只有操作指令( instruction)和操作
数( operand)
? instruction operand1,operand2
?高级语言将能完成某项工作的一组有关指令用 函数
( function) 来表示。如,
? int c; c = Add(int a,int b) 表示 a与 b的和。
? 进一步抽象,int a,b,c; … c = a + b;
? 同样,c = Increase(int a); ? c = a++;
?根据运算符 operator的操作数的个数来确定运算符
的目数:单目、双目、三目。
问题 3,C语言中有哪些运算符?
?双目运算符:有两个操作数;单目运算符:有一个操
作数;
?双目运算符,
? +(加),-(减),*(乘),/(除),%(取余)
? = (赋值) +=,-=,/=,*=,|=,&=,^=
? ==(相等),!=(不相等),>(大于),<(小于),>=
(大于等于),<=(小于等于)。
? ||(逻辑或),&&(逻辑与)
? <<(左移),>>(右移),|(或),&(与),^(异或)
?,(结构成员),->(指针型结构成员)
?,(逗号运算)
问题 4,C语言中有哪些运算符?
?单目运算符,
? ++(递增),--(递减),-(负)。
? !(逻辑非),~(补)
? &(取地址),*(按指针取值)
? sizeof (取大小),() (类型转换),[](数组下标)
?三目运算符,
??,(条件运算), c = (a > b )? a, b;
等价于 if ( a > b ) c = a; else c = b;
问题 5,宏定义是什么?
1,定义一个常量
? #define PI 3.1415926
? float x,y; x = PI/2.0; y = 3*PI;
2,定义一个带参数的表达式
? #define DISTANT(x,y) sqrt((x)*(x)+(y)*(y))
? float x,y,d; d = DISTANT(x,y);
3,字符串可以这样定义,
#define PRINT_MYNAME(myname) \
printf(“My name is = %s”,#myname);
4,字符串还能这样,
#define NEW_VARIABLE(newtype) \
var = Var_##newtype;
问题 6,地址 是什么 回事? 指
针 又是怎么?
?地址( address)是数据在内存中存放的位置。按
字节编号。
?每个有效的变量都有 有效的 地址。
?在有效地址上存放的可能是别的地址的值。
? 例如 设 a,b 的地址分别是 A,B,A => &a,B => &b;
? 地址 B存放了地址 A的值 &a => A =>*B => b;
? 因此 a => *(&a) => *b; 所以 b 是指向 a的 指针!
? [注 ] => 为等价于(数值相同)的意思。
? int a; int* b; a = 10; b = &a;
?则 *b 的值是 10! b 是 a 的指针!
问题 7,双指针 是怎么回事?
指针与数组是什么关系?
?请看下面的例子,
int a; int* b; int** c;
a = 10; b = &a; c = &b;
c 就是指针的指针,即双指针。
? 数组有静态的(栈 stack中申请)和动态的(堆 heap
中申请)
? char Name[10]; /* Name 拥有 10个字节的空间 */
? char* Text; Text = malloc(10); /*Text 也拥有 10个字节的
空间 */
? 静态空间是自动释放的,而动态空间是需要调用 Free来
释放的。
?二维数组就应该用双指针,如 char**。
问题 8,如何理解函数的参数?
?函数有形参和实参。形参表示参数的形式,
实参表示实际的参数传递。实参的数据类型
要与形参保持一致。
?声明,void function(int var1,int var2);
?使用,int v1,v2; v1=10; v2=20; function(v1,v2);
?v1,v2 通过函数入口将数值传入 function内。
?如果 function 将 var1和 var2的值改变了,是
否会影响 function 外部呢?
问题 8,如何理解函数的参数?
? 如果函数定义,
void function (int var1,int var2)
{ var1 = 100; var2 = 200; }
? 调用,
int v1,v2; v1 = 10; v2 = 20;
function (v1,v2);
printf (“var1=%d,var2=%d”,v1,v2 );
? 结果是,var1=10,var2=20
? 这称为传值调用。
问题 8,如何理解函数的参数?
? 如果函数定义,
void function (int var1,int* pvar2)
{ var1 = 100; *pvar2 = 200; }
? 调用,
int v1,v2; v1 = 10; v2 = 20;
function (v1,&v2);
printf (“var1=%d,var2=%d”,v1,v2 );
? 结果是,var1=10,var2=200
? 这称为传指针调用。
本课考核方法
?平时成绩,20分
?上课和作业
?实验成绩,30分
?三次 MFC编程练习
?期末考试,50分
?开卷考试,基本概念和编程能力
?
?布鲁克斯用形象的譬喻来论述软件工程中存在
的, 陷阱, ——“在所有恐怖民间传说的妖怪
中,最可怕的是人狼,因为它们可以完全出乎
意料地从熟悉的面孔变成可怕的怪物,,而
,大家熟悉的软件项目具有一些人狼的特性
(至少在非技术经理看来),常常看似简单明
了的东西,却有可能变成一个落后进度、超出
预算、存在大量缺陷的怪物, 。惊悚故事里,
人们只有用银弹(银质子弹)才能消灭人狼,
而布鲁克斯认为,在软件工程中,,没有银
弹,,没有一种能够遏制软件向, 怪物, 变异、
同时还可大幅提升开发效率和产品质量的武器。
返回