slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
VISUAL C++ 程序设计基础 PowerPoint Presentation
Download Presentation
VISUAL C++ 程序设计基础

Loading in 2 Seconds...

play fullscreen
1 / 110

VISUAL C++ 程序设计基础 - PowerPoint PPT Presentation


  • 141 Views
  • Uploaded on

VISUAL C++ 程序设计基础. 主讲:张道德 湖北工业大学机械电子工程系 2005.3 E-mail:hgzdd@126.com QQ:461889699. 参考书目. VC++ 教材 Visual C++6.0 编程基础 . 王世同 . 清华大学出版社 Visual C++6 24 小时学习教程 .Mickey Williams 蓍 . 康博创作室译 . 机械工业出版社 Visual C++ 面向对象可视化程序设计,黄维通 . 清华大学出版社 精通 MFC. 刘思华 . 电子工业出版社 . C ++教材

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'VISUAL C++ 程序设计基础' - jaron


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

VISUAL C++ 程序设计基础

主讲:张道德

湖北工业大学机械电子工程系

2005.3

E-mail:hgzdd@126.com QQ:461889699

slide2
参考书目

VC++教材

  • Visual C++6.0 编程基础.王世同.清华大学出版社
  • Visual C++624小时学习教程.Mickey Williams 蓍.康博创作室译.机械工业出版社
  • Visual C++面向对象可视化程序设计,黄维通.清华大学出版社
  • 精通MFC.刘思华.电子工业出版社.

C++教材

  • C++程序设计教程.钱能.清华大学出版社
  • C++程序设计习题及解答.钱能.清华大学出版社
  • 面对对象程序设计循序渐近.田志良等.学苑出版社
slide3
主要学习内容
  • 面对对象编程及C++基础知识
  • Windows编程基础知识
  • Visual C++基础编程
  • MFC程序设计开发
slide4
C++基础知识目录

第一章 软件设计概论

第二章 C++基础知识(1)

第二章 C++基础知识(2)-类与对象

第二章 C++基础知识(3)-继承与多态

第三章 动态内存分配

第四章 异常处理

第五章 输入/输出流类库及标准模板类库(STL)

slide5
第一章 软件设计概述

1.4 算法的设计与分析

1.1软件与软件危机

1.5 C语言和面向对象的C++

1.2软 件 工 程

1.3程序设计方法

1.6 一个简单的C++程序

slide6
1.1软件与软件危机

什么是软件

软件 程序

什么是软件危机

软件危机首次爆发于二十世纪六十年代。在大型程序设计中,人们发现投入大量的人力、物力、时间开发出的软件,其成本、效率、质量等方面却处于失控状态,尤其软件维护异常困难。程序的修改扩充往往需要大量重复性投入。

slide7
1.1软件与软件危机

软件危机产生的原因主要有三个:

1软件开发者不熟悉用户问题的领域,或没有理解用户需求,软件产品与要求不一致。

2软件是一种逻辑产品而非物理产品,软件的开发过程本质上是人的思考过程。

3人的智力在面对越来越复杂的问题时,处理问题的效率会越来越低。

slide8
1.2 软件工程

软件危机的 出现迫使人们重新认识软件和软件开发过程。

大型软件开发也应该借鉴建筑、机械等行业的发展过程,由“手工方式”向“工程化”方向发展。1968年在北大西洋公约组织(NATO)的年会上首次提出软件工程的概念,此后又逐步提出软件生命期的概念。

slide9
1.2 软件工程

软件工程的提出和软件的定义

软件是程序、方法、规则、相关文档以及在计算机上运行所必需的数据的集合。而软件工程是开发、运行、维护软件的系统方法。

软件生命期

软件生命期指从开始研制到废弃不用的整个期间,可划分为五个阶段:需求分析、设计、编程、测试和运行维护。

软件的质量标准

正确性健壮性可维护性

可用性 可重用性 效率等

slide10
1.2 软件工程

正确性

软件的正确性指的是软件系统在正常条件下能够正确工作,完成规定功能。这是软件的首要指标。

例如,要求设计程序,输入一批数据,计算它们的累加和。在这里,正确性就是正确能正确计算累加和。

slide11
1.2 软件工程

健壮性

软件的健壮性指的是在意外情况下(如输入数据不合理或某些硬件故障),软件系统仍能适当地工作,并对意外情况进行适当处理,而不致于导致错误结果甚至系统的瘫痪或死机。

例如,要求设计程序,根据输入的三边a、b、c的长度判别三角形类型。现有如下设计思想:若a、b、c中只有两个量相等,则为等腰三角形,若三个量均相等,则为等边三角形,否则为一般三角形。如果输入为(-2,-2,-2)时,程序输出为:等边三角形。这个结果显然是错误的。这是由于程序对不合理数据不能进行适当处理,我们就说这个程序的健壮性不好。

slide12
1.2 软件工程

可维护性

软件的维护包括发现并改正软件的错误,以及由于软件运行环境发生变化或软件功能扩充而对软件进行的改动。

软件的可维护性指的是软件容易维护的程度。一般地说,软件的可读性好,容易理解,维护起来也就比较容易。因此可读性是可维护性的基础。

slide13
1.3 程序设计方法

1.3.1传 统 的 结 构 化 程 序 设 计

SP (Structured Programming)

1.3.2面 向 对 象 的 程 序 设 计

OOP (Object Oriented Programming)

1 3 1
1.3.1 传统的结构化程序设计

传统的程序设计方法可以归结为“程序=算法+数据结构”,将程序定义为处理数据的一系列过程。这种设计方法的着眼点是面向过程的,特点是将数据与程序分开存储,即数据与数据处理分离。

结构化程序设计的基本思想是采用自顶向下、逐步细化的设计方法和单入单出的控制结构。

1 3 11

程 序

模块 1

模块 2

模块 3

1.1

1.2

1.3

2.1

2.2

3.1

3.2

1.3.1

1.3.2

1.3.3

3.1.1

3.1.2

1.3.1 传统的结构化程序设计
1 3 12

1. 读入数据;

正整数个数为0;负整数个数0;

取第一个整数

2. 统计正数、负数的个数;

2.1 如果该数大于 0,正整数个数加1;

2.2 如果该数小于0,负整数个数加1;

2.3: 取下一个整数;

重复

至统

计完

3. 输出结果;

1.3.1 传统的结构化程序设计

举一个简单的例子,要求读入一组整数,统计其中正整数和负整数的个数。

该任务的模块结构及细化过程如下:

1 3 13
1.3.1 传统的结构化程序设计

结构化程序设计为处理复杂问题提供了有力手段,但到80年代末,这种设计方法逐渐暴露出以下缺陷:

(1)难以适应大型软件的设计。

(2)程序可重用性差。

1 3 2
1.3.2 面向对象的程序设计

为什么要引入面向对象的设计方法

面向对象的设计方法与面向过程的设计方法有什么关系

1 3 21
1.3.2 面向对象的程序设计

面向过程程序设计缺点的根源在于数据与数据处理分离。

面向对象程序设计模拟自然界认识和处理事物的方法,将数据和对数据的操作方法放在一起,形成一个相对独立的整体——对象(object),同类对象还可抽象出共性,形成类(class )。一个类中的数据通常只能通过本类提供的方法进行处理,这些方法成为该类与外部的接口。对象之间通过消息(message)进行通讯。

1 3 22
1.3.2 面向对象的程序设计

1 基 本 概 念

2 面向对象的软件开发方法

3“面向对象”程序设计的特点

slide21
基 本 概 念

对 象(object)

类(class)

消 息(message)

slide22

表针

旋钮

其他机械机构

属性

行为

1 基 本 概 念

对 象

调节旋钮

slide23

类的一个具体实现,称为实例

类对象

描述这类对象共有的、本质的属性和行为

具体到一只圆形的或方形的手表

手表一块手表

手表共有的属性(表针、旋钮、内部结构)

和行为(调节旋钮)

1 基 本 概 念

类是一个抽象的概念,用来描述某一类对象所共有的、本质的属性和行为。

slide24

发送消息

接收并响应消息

基 本 概 念

消 息

我们把对象之间产生相互作用所传递的信息称做消息。

启 动

slide25

发送消息

接收并响应消息

1 基 本 概 念

消 息

我们把对象之间产生相互作用所传递的信息称做消息。

转 向

slide26
面向对象的软件开发方法

面向对象软件开发的根本合理性在于它符合可观世界的组成方式和大脑的思维方式。

在大型程序开发过程中,编码只是其中很小一部分,应当采用工程化的方法,并将面向对象的思想贯穿于软件开发全过程,这就是面向对象的软件工程。

面相对象的软件工程同样遵循分层抽象、逐步细化的原则。软件开发过程包括以下五个阶段:

slide27

面向对象的分析(OOA)

面向对象的设计(OOD)

面向对象的编程(OOP)

面向对象的测试(OOT)

面向对象的维护(OOSM)

面向对象的软件开发方法

分析阶段的主要任务是按照面向对象的概念和方法,从问题中识别出有意义的对象,以及对象的属性、行为和对象间的通信,进而抽象出类结构,最终将它们描述出来,形成一个需求模型。

设计阶段从需求模型出发,分别进行类的设计和应用程序的设计。

编程阶段实现由设计表示到面向对象程序设计语言描述的转换。

测试的任务在于发现并改正程序中的错误。

slide28
“面向对象”程序设计的特点
  • 封装性

(2) 继承与派生性

(3) 多态性

slide29

机械零件

动作

调节旋钮

读表盘

3 “面向对象”程序设计的特点

封装性

对象是一个封装体,在其中封装了该对象的属性和操作。通过限制对属性和操作的访问权限,可以将属性“隐藏”在对象内部,对外提供一定的接口,在对象之外只能通过接口对对象进行操作。

C++通过建立数据类型——类来支持封装和数据隐藏。封装性增加了对象的独立性,从而保证了数据的可靠性。一个定义完好的类可以作为独立模块使用。

slide30

汽车

载人

载货

客车

货车

小,速度快

大,速度慢

小轿车

大客车

3 “面向对象”程序设计的特点

继承与派生

以汽车为例看客观世界描述事物的方式:

面向对象程序设计提供了类似的机制:

当定义了一个类后,又需定义一个新类,这个新类与原来的类相比,只是增加或修改了部分属性和操作,这时可以用原来的类派生出新类,新类中只需描述自己所特有的属性和操作。

新类称为子类或派生类,原来的类称为基类。派生可以一直进行下去,形成一个派生树。

继承性大大简化了对问题的描述,大大提高了程序的可重用性,从而提高了程序设计、修改、扩充的效率。

slide31
“面向对象”程序设计的特点

多态性

多态性指,同一个消息被不同对象接收时,产生不同结果,即实现同一接口,不同方法。

高中生

语文、数学、英语、政治、物理、化学、生物

计 算平均成绩

slide32
“面向对象”程序设计的特点

多态性

多态性指,同一个消息被不同对象接收时,产生不同结果,即实现同一接口,不同方法。

大学生

高数、英语、计算机、线性代数

计 算平均成绩

slide33
“面向对象”程序设计的特点

继承和多态性组合,可以生成很多相似但又独一无二的对象。继承性使得这些对象可以共享许多相似特性,而多态又使同一个操作对不同对象产生不同表现形式。这样不仅提高了程序设计的灵活性,而且减轻了分别设计的负担。

slide34
1.4 算法的设计与分析

1.4.1 算 法 的 概 念

1.4.2 算法的表示及三种基本结构

1.4.3 常 用 算 法 介 绍

1.4.4 算 法 的 时 空 复 杂 度

1 4 1
1.4.1 算 法 的 概 念
  • 通俗地说,算法就是解决问题的步骤。
  • 用计算机解决问题的算法应具有以下特征:
  • 可执行性
  • 确定性
  • 有穷性
  • 可输入输出信息
1 4 2
1.4.2算法的表示及三种基本结构

1 顺 序 结 构

2 分 支 结 构

3 循 环 结 构

1 4 21

块1

块2

块3

流程图

1.4.2算法的表示及三种基本结构

(1) 顺序结构

【例1.1】求两数之和。

num115;

num220;

sumnum1+num2;

输出sum;

1 4 22

num1

块1

块2

块3

流程图

1.4.2算法的表示及三种基本结构

(1) 顺序结构

【例1.1】求两数之和。

num115;

15

num220;

sumnum1+num2;

输出sum;

1 4 23

num1

num2

块1

块2

块3

15

流程图

1.4.2算法的表示及三种基本结构

(1) 顺序结构

【例1.1】求两数之和。

num115;

num220;

20

sumnum1+num2;

输出sum;

1 4 24

num2

num1

块1

块2

块3

15

寄存器

sum

流程图

1.4.2算法的表示及三种基本结构

(1) 顺序结构

【例1.1】求两数之和。

num115;

35

num220;

20

20

sumnum1+num2;

输出sum;

35

1 4 25

块1

块2

块3

num1

寄存器

num2

sum

流程图

1.4.2算法的表示及三种基本结构

(1) 顺序结构

显示结果:35

【例1.1】求两数之和。

num115;

15

35

num220;

20

sumnum1+num2;

输出sum;

35

1 4 26

条件

(2) 分支结构

块1

块2

流程图

1.4.2算法的表示及三种基本结构

【例1.2】输入三个数,输出其中的最大数。

x7;

y12;

z10;

if(x>y) maxx;

else max y;

if (z>max) maxz;

输出max;

1 4 27

条件

(2) 分支结构:

块1

块2

x

流程图

1.4.2算法的表示及三种基本结构

【例1.2】输入三个数,输出其中的最大数。

7

x7;

y12;

z10;

if(x>y) maxx;

else max y;

if (z>max) maxz;

输出max;

1 4 28

条件

(2) 分支结构

块1

块2

y

x

流程图

1.4.2算法的表示及三种基本结构

【例1.2】输入三个数,输出其中的最大数。

7

x7;

y12;

12

z10;

if(x>y) maxx;

else max y;

if (z>max) maxz;

输出max;

1 4 29

条件

块1

块2

z

x

y

流程图

1.4.2算法的表示及三种基本结构

(2) 分支结构

【例1.2】输入三个数,输出其中的最大数。

7

x7;

y12;

12

z10;

10

if(x>y) maxx;

else max y;

if (z>max) maxz;

输出max;

1 4 210

条件

块1

块2

z

y

x

寄存器

比较

max

流程图

1.4.2算法的表示及三种基本结构

(2) 分支结构

【例1.2】输入三个数,输出其中的最大数。

7

x7;

y12;

12

z10;

10

12

if(x>y) maxx;

else max y;

if (z>max) maxz;

输出max;

1 4 211

条件

块1

块2

y

x

z

寄存器

比较

比较

max

流程图

1.4.2算法的表示及三种基本结构

(2) 分支结构

【例1.2】输入三个数,输出其中的最大数。

7

x7;

y12;

12

z10;

10

12

if(x>y) maxx;

else max y;

if (z>max) maxz;

输出max;

1 4 212

条件

块1

块2

z

x

y

寄存器

比较

比较

max

流程图

1.4.2算法的表示及三种基本结构

(2) 分支结构

【例1.2】输入三个数,输出其中的最大数。

7

x7;

y12;

12

z10;

10

12

if(x>y) maxx;

else max y;

显示结果:12

if (z>max) maxz;

输出max;

1 4 213

条件

(3) 循环结构

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

count4; //整数个数

sum0; //累加和的初值

while (count>0) {

x输入一个整数;

sumsum+x;

countcount-1;

}

输出sum;

1 4 214

条件

(3) 循环结构

count

sum

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

4

count4; //整数个数

sum0; //累加和的初值

0

while (count>0) {

x输入一个整数;

sumsum+x;

countcount-1;

}

输出sum;

1 4 215

条件

(3) 循环结构

count

sum

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

4

count4; //整数个数

sum0; //累加和的初值

0

while (count>0) {

x输入一个整数;

sumsum+x;

countcount-1;

}

输出sum;

1 4 216

条件

(3) 循环结构

count

sum

x

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

3

count4; //整数个数

sum0; //累加和的初值

12

while (count>0) {

x输入一个整数;

12

sumsum+x;

countcount-1;

}

输出sum;

1 4 217

条件

(3) 循环结构

count

sum

x

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

3

count4; //整数个数

sum0; //累加和的初值

12

while (count>0) {

x输入一个整数;

12

sumsum+x;

countcount-1;

}

输出sum;

1 4 218

条件

(3) 循环结构

count

sum

x

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

2

count4; //整数个数

sum0; //累加和的初值

21

while (count>0) {

x输入一个整数;

9

sumsum+x;

countcount-1;

}

输出sum;

1 4 219

条件

(3) 循环结构

count

sum

x

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

2

count4; //整数个数

sum0; //累加和的初值

21

while (count>0) {

x输入一个整数;

9

sumsum+x;

countcount-1;

}

输出sum;

1 4 220

条件

(3) 循环结构

count

sum

x

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

1

count4; //整数个数

sum0; //累加和的初值

44

while (count>0) {

x输入一个整数;

23

sumsum+x;

countcount-1;

}

输出sum;

1 4 221

条件

(3) 循环结构

count

sum

x

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

1

count4; //整数个数

sum0; //累加和的初值

44

while (count>0) {

x输入一个整数;

23

sumsum+x;

countcount-1;

}

输出sum;

1 4 222

条件

(3) 循环结构

count

sum

x

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

0

count4; //整数个数

sum0; //累加和的初值

59

while (count>0) {

x输入一个整数;

15

sumsum+x;

countcount-1;

}

输出sum;

1 4 223

条件

(3) 循环结构

count

sum

x

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

0

count4; //整数个数

sum0; //累加和的初值

59

while (count>0) {

x输入一个整数;

15

sumsum+x;

countcount-1;

}

输出sum;

1 4 224

条件

(3) 循环结构

count

sum

x

流程图

1.4.2算法的表示及三种基本结构

【例1.3】求4个整数的和。

0

count4; //整数个数

sum0; //累加和的初值

59

while (count>0) {

x输入一个整数;

15

sumsum+x;

countcount-1;

显示结果:59

}

输出sum;

1 4 3
1.4.3 常用算法介绍

解决的问题的种类与复杂程度各不相同决定了算法的多样性,但从其思想方法上可以将其归为以下几种:直接法、枚举法、递推法、递归法、回溯法等等。本节 将介绍以下三种:

1. 直接法

2.枚举法

3.递推法

1 4 31
1.4.3 常用算法介绍

1 直接法

直接法就是根据问题给出的条件直接求解,前面的很多例子都是这种算法的运用。这里不再举例。

1 4 32
1.4.3 常用算法介绍

2 枚举法

枚举法也称穷举法,基本思想是,在有限范围内列举所有可能的结果,找出其中符合要求的解。

枚举法适合求解的问题是:问题可能的答案是有限个且答案是可知的,但又难以用解析法描述。这种算法通常需要用循环结构来完成。

请看下例:

1 4 33
1.4.3 常用算法介绍

【例1.4】给定一个正整数,判断其非负整数立方根是否存在,若存在,输出该立方根。

分析:设某正整数为27,则非负整数立方根的取值范围为1—27,因此可在这一范围内对所有整数进行检测,满足立方根为27的就是所求整数。

算法如下:

1 4 34
1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

num27;

cube_root0;//立方根初值

while (cube_root<=num) {

if (cube_root*cube_root* cube_root=num) {

输出cube_root;

break; //终止循环

}

else cube_rootcube_root+1;

}

if (cube_root>num) 输出“无整数立方根”;

1 4 35

num27;

cube_root1;//立方根初值

num

cube_root

1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

while (cube_root<=num) {

if (cube_root*cube_root*cube_root=num) {

输出cube_root;

27

break; //终止循环

}

1

else cube_rootcube_root+1;

}

if (cube_root>num) 输出“无整数立方根”;

1 4 36

num

cube_root

1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

num27;

cube_root1;//立方根初值

while (cube_root<=num) {

if (cube_root*cube_root*cube_root=num) {

输出cube_root;

27

比较

break; //终止循环

}

1

else cube_rootcube_root+1;

}

if (cube_root>num) 输出“无整数立方根”;

1 4 37

num

cube_root

1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

num27;

cube_root1;//立方根初值

while (cube_root<=num) {

if (cube_root*cube_root*cube_root=num) {

输出cube_root;

27

比较

break; //终止循环

}

1

else cube_rootcube_root+1;

c*c*c

}

if (cube_root>num) 输出“无整数立方根”;

1 4 38

num

cube_root

1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

num27;

cube_root1;//立方根初值

while (cube_root<=num) {

if (cube_root*cube_root*cube_root=num) {

输出cube_root;

27

break; //终止循环

}

2

else cube_rootcube_root+1;

}

if (cube_root>num) 输出“无整数立方根”;

1 4 39

num

cube_root

1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

num27;

cube_root1;//立方根初值

while (cube_root<=num) {

if (cube_root*cube_root*cube_root=num) {

输出cube_root;

27

break; //终止循环

}

9

else cube_rootcube_root+1;

}

if (cube_root>num) 输出“无整数立方根”;

1 4 310

num

cube_root

1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

num27;

cube_root1;//立方根初值

while (cube_root<=num) {

if (cube_root*cube_root*cube_root=num) {

输出cube_root;

27

比较

break; //终止循环

}

9

else cube_rootcube_root+1;

c*c*c

}

if (cube_root>num) 输出“无整数立方根”;

1 4 311

num

cube_root

1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

num27;

cube_root1;//立方根初值

while (cube_root<=num) {

if (cube_root*cube_root*cube_root=num) {

输出cube_root;

27

break; //终止循环

}

9

else cube_rootcube_root+1;

}

if (cube_root>num) 输出“无整数立方根”;

显示结果:9

1 4 312

num

cube_root

1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

num27;

cube_root1;//立方根初值

while (cube_root<=num) {

if (cube_root*cube_root*cube_root=num) {

输出cube_root;

27

break; //终止循环

}

9

else cube_rootcube_root+1;

}

if (cube_root>num) 输出“无整数立方根”;

显示结果:9

1 4 313

num

cube_root

1.4.3 常用算法介绍

【例1.4】求非负整数立方根算法:

num27;

cube_root1;//立方根初值

while (cube_root<=num) {

if (cube_root*cube_root*cube_root=num) {

输出cube_root;

27

break; //终止循环

}

9

else cube_rootcube_root+1;

}

if (cube_root>num) 输出“无整数立方根”;

显示结果:9

1 4 314
1.4.3 常用算法介绍

【例1.5】判断一个正整数是否素数,给出相应结果。

分析:假设正整数num, 如果num不是2,需要检测它是否含有除1和它本身之外的其他因子,如果有,就不是素数。检测方法是在2num-1范围内逐个验证。实际上可以证明在2 num平方根范围内逐个验证即可。

假定num为27,算法如下:

1 4 315
1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num27;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

while (i<=k) {

if (num/i余数为0) break; //不是素数

else ii+1

}

}

if (i>k) 输出“是素数”;

else 输出“不是素数”;

1 4 316

num

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num27;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

if (num/i余数为0) break; //不是素数

else ii+1

}

}

if (i>k) 输出“是素数”;

else 输出“不是素数”;

1 4 317

i

num

k

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num27;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

if (num/i余数为0) break; //不是素数

else ii+1

2

}

}

5

if (i>k) 输出“是素数”;

else 输出“不是素数”;

1 4 318

k

i

num

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num9;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

if (num/i余数为0) break; //不是素数

else ii+1

2

比较

}

}

5

if (i>k) 输出“是素数”;

else 输出“不是素数”;

1 4 319

k

i

num

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num9;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

求余

break; //不是素数

不为0

if (num/i余数为0)

else ii+1

2

}

}

5

if (i>k) 输出“是素数”;

else 输出“不是素数”;

1 4 320

k

i

num

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num9;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

break; //不是素数

if (num/i余数为0)

else ii+1

3

}

}

5

if (i>k) 输出“是素数”;

else 输出“不是素数”;

1 4 321

k

i

num

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num9;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

break; //不是素数

if (num/i余数为0)

else ii+1

3

比较

}

}

5

if (i>k) 输出“是素数”;

else 输出“不是素数”;

1 4 322

k

i

num

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num9;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

求余

break; //不是素数

为0

if (num/i余数为0)

else ii+1

3

}

}

5

if (i>k) 输出“是素数”;

else 输出“不是素数”;

1 4 323

k

i

num

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num9;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

break; //不是素数

if (num/i余数为0)

else ii+1

3

}

}

5

if (i>k) 输出“是素数”;

else 输出“不是素数”;

1 4 324

k

i

num

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num9;

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

break; //不是素数

if (num/i余数为0)

else ii+1

3

比较

}

}

5

if (i>k)

输出 “是素数”;

else 输出“不是素数”;

1 4 325

k

i

num

1.4.3 常用算法介绍

【例1.5】判断9是否素数算法

num9;

显示结果:不是素数

if (num=2) 输出“是素数”;

else {

i2;

ksqrt(num);//平方根取整

27

while (i<=k) {

break; //不是素数

if (num/i余数为0)

else ii+1

3

}

}

5

if (i>k)

输出 “是素数”;

else 输出“不是素数”;

1 4 326
1.4.3 常用算法介绍

3.递推法

递推算法是通过问题的一个或多个已知解,用同样的方法逐个推算出其他解,如数列问题以及一些近似计算问题等。通常也要借助于循环。

请看下例:

1 4 327
1.4.3 常用算法介绍

【例1.6】 求n!

分析:n!=123n,因此可以从1开 始,由1!乘以2得到2!,再乘以3得到3!,以此推出n!。

假定n=4,算法如下:

1 4 328
1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

while (i<=n) {

factorialfactorial*i;

ii+1;

}

输出factorial;

1 4 329

factorial

i

n

1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

1

while (i<=n) {

factorialfactorial*i;

2

ii+1;

}

4

输出factorial;

1 4 330

factorial

n

i

1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

1

while (i<=n) {

factorialfactorial*i;

2

ii+1;

比较

}

4

输出factorial;

1 4 331

factorial

i

n

1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

2

while (i<=n) {

factorialfactorial*i;

3

ii+1;

}

4

输出factorial;

1 4 332

factorial

n

i

1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

2

while (i<=n) {

factorialfactorial*i;

3

ii+1;

比较

}

4

输出factorial;

1 4 333

factorial

i

n

1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

6

while (i<=n) {

factorialfactorial*i;

4

ii+1;

}

4

输出factorial;

1 4 334

factorial

n

i

1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

6

while (i<=n) {

factorialfactorial*i;

4

ii+1;

比较

}

4

输出factorial;

1 4 335

factorial

i

n

1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

24

while (i<=n) {

factorialfactorial*i;

5

ii+1;

}

4

输出factorial;

1 4 336

factorial

n

i

1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

24

while (i<=n) {

factorialfactorial*i;

5

ii+1;

比较

}

4

输出factorial;

1 4 337

factorial

i

n

1.4.3 常用算法介绍

【例1.6】 求n!算法:

factorial1; //阶乘初值

i2;

n 4;

24

while (i<=n) {

factorialfactorial*i;

5

ii+1;

}

4

输出factorial;

显示结果:24

1 4 4
1.4.4 算法的时空复杂度

解决一个问题的算法往往不止一种,我们总希望选择一个较好的算法。算法的指标中有一项是效率,指占用计算机资源情况,包括执行程序消耗的时间和占用的存储空间(主要指辅助存储器)两个方面,这两方面分别用以下两个概念进行描述。

1 时间复杂度(Time Complexity)

2 空间复杂度(Space Complexity)

1 4 41
1.4.4 算法的时空复杂度

空间复杂度

程序在计算机中执行所消耗的时间取决于以下因素:

(1)输入输出数据的总量;

(2)编译及指令执行速度;

(3)指令数量;

从算法选择的角度,执行时间取决于算法的指令数量,其中指令的重复执行次数所起的影响作用最大。

1 4 42
1.4.4 算法的时空复杂度

定义:

频度:语句重复执行的次数

执行时间函数:频度n的函数F(n)称为程序的执行时间函数,用来表示时间复杂度。

计算机执行速度极快,有限的指令数量差异不能反映执行时间的快慢。我们理解执行时间不同指的是当频度n∞时,F(n)的变化趋势明显不同。

执行时间函数的阶:设有另一个n的函数G(n),当n∞时,F(n)/G(n) 常数,就称F(n)是G(n)阶的,记为F(n)=O(G(n))。通常用执行时间函数的阶对算法执行时间进行比较。

请看下例:

1 4 43
1.4.4 算法的时空复杂度

sum0; i0;

while(i<n) { //频度为n

x输入数据; //频度为n

sumsum+x; //频度为n

ii+1; //频度为n

}

输出sum;

F(n)=n+n+n+n=4n,当n∞时,F(n)/ n4,所以F(n)是n阶的。

1 4 44
1.4.4 算法的时空复杂度

常用算法时空复杂度的阶有:

常数阶、对数阶、线性阶、平方阶、立方阶、指数阶等。按这个顺序描述的算法,时间复杂度是从优到劣的。

在有些情况下,算法的执行时间不仅与算法有关,还和处理的数据集合有关,比如对数据排序,原始数据杂乱无章和原始数据已经有序两种情况执行时间差别甚至会很大。对这种情况,通常按照最坏情况估算时间复杂度,有时也在某种约定下(如等概率)估算平均时间复杂度。

1 4 45
1.4.4 算法的时空复杂度

空间复杂度

一个程序在运行时所占用的存储空间大小通常也是问题规模的函数,和时间复杂度类似,这个函数就称为空间复杂度。关于空间复杂度的计算这里不详细介绍,可参阅数据结构及其他相关书籍。

1 4 46
1.4.4 算法的时空复杂度

我们总希望一个算法能够既执行得快,又占用较少的空间,但实际上这两个方面往往是一个矛盾,所以要根据所解决问题的要求和计算机的特点进行选择。

1 5 c c
1.5 C语言与面向对象的C++

C语言是七十年代初贝尔实验室的Dennis Richie 等人在B语言基础上开发出来的。C最初是作为UNIX操作系统的开发语言为人们所认识。七十年代末,随着微型计算机的发展,C语言开始移植到非UNIX环境中,并逐步脱离UNIX系统成为一种独立的程序设计语言。C 语言版本很多,为了让开发出来的代码能够在多种平台上运行,1988年美国国家标准协会ANSI对C语言进行了标准化,产生了ANSI C。

1 5 c c1
1.5 C语言与面向对象的C++

C语言的主要特点:

(1)C语言既具备高级语言的结构和编程环境,又提供类似于汇编语言那样的系统资源操纵能力及程序执行效率。适合解决有实时要求的问题。

(2)有丰富的运算符和数据类型,表达式类型多样化,可以方便地实现在其他语言中较难实现的运算,对各种不同类型的程序设计都有良好的适应性。

(3)以函数为基础实现程序的结构化设计,支持大型程序的多文件构成及单个文件独立编译,适合大型复杂程序的设计。

(4)语言简洁、紧凑,使用方便、灵活,书写形式自由。

(5)可移植性好。

1 5 c c2
1.5 C语言与面向对象的C++

C++是由C发展成为的以面向对象为主要特征的语言。作为C语言的超集,C++继承了C的所有优点,又对数据类型做了扩充,使得编译系统可以检查出更多类型错误。

C++支持面向对象程序设计,通过类和对象的概念把数据和对数据的操作封装在一起,通过派生、继承、重载和多态性等特征实现了软件重用和程序自动生成,使得大型复杂软件的构造和维护变得更加有效和容易。

此外,在一致性(Consistency)检查机制方面也作了加强,提高了软件开发的效率和质量。

1 5 c c3
1.5 C语言与面向对象的C++

C++与C完全兼容,很多用C编写的库函数和应用程序都可以为C++所用。

但正是由于与C兼容,使得C++不是纯正的面向对象的语言,它既支持面向对象程序设计,也支持面向过程设计。但我们应当注意用面向对象的思想进行设计,以发挥出C++的优势。

C++有许多版本,国内较为流行的有Microsoft公司的Visual C++。

1 6 c
1.6 一个简单的C++程序

【例1.7】一个简单的C++程序。

// 程序文件名为EX1_6.cpp

/* C++程序基本结构 */

# include <iostream.h>

max(int i, int j) { //A

if (i>=j) return i;

else return j;

}

void main(void) { //B

cout<<″输入i,j:″; //显示提示信息

int i, j; //说明变量

cin>>i>>j; //从键盘上输入变量值

cout<<″max number is:″<<max(i, j)<<′ \n ′; //输出提示和结果

}

程序组成:

注释

编译预处理指令

程序体

由若干函数组成,其中有且仅有一个主函数main(),这是程序的执行入口。在MFC编程中定义为winmain()。