1、第 1 章 问题解决与软件工程如果我们真正理解了问题本身,自然就得到了问题的答案,因为答案从来不会背离问题。Jiddu Krishnamurti人们总在努力获得他们想要的东西;但惟一的问题在于,在真正得到之前他们并不知道他们要的是 什么。奥尔多贺胥黎这是我惟一能想到的融工程和艺术为一体的工作。其中有令人难以置信的精密的技术成分,因为你必须要进行十分深入的思考;而另一方面,它具有广泛的创造空间,在那里惟一的限制只在于你的想象范围。安德鲁赫茨菲尔德本章目标 揭示计算机广泛多样的应用。 初识 C+程序。 阐明软件生命周期的各个基本阶段,包括以对象为中心的设计(Object-Centered Desi
2、gn ) 。 (可选)突出了计算机专家们面临的难题,同时提出某些道德原则。 (可选)初识类和面向对象设计。从前一章的介绍中可知,在很多领域计算机已经成为人们必不可少的工具。以下所列出的只是计算机诸多应用的一部分,所有这些应用都需要编写软件,而本书的重点则是教授如何使用 C+来开发这些软件。本章中我们来看看一个简单的 C+例子,并且演示如何使用以对象为中心的设计思想(Object-Centered Design,OCD)来解决问题。本书的第一个事例学习引入了一个更为实际的问题,在本书的Web 站点上提供了包括 OCD 设计在内的完整解答。同时提供了“对象化思维”这样的选学内容以方便那些希望对 C
3、+类有所了解的读者。本章以一个相关知识作为结束,而相关知识将贯穿本书始终,它将向读者介绍计算机科学的主要领域。下面例举一些计算机应用的主要领域:(1)商业和金融邮件列表和订单 工资单和账单库存控制 预定系统(航班、座舱等)文字处理 数据管理电子表格 EFT(电子转账)ATMs(自动柜员机) 电子邮件家庭银行 理财保险索赔处理(2)工业装配线上的机器人 生产调度CAD(计算机辅助设计) CAM(计算机辅助制造)CIM(计算机集成制造) 市场分析工程管理和控制第 1 章 问题解决与软件工程17(3)政府部门国防系统 航天计划人口普查 自动化交通控制系统国家和地方彩票 FBI 的 NCIS(国家刑事
4、情报处)NOAA(国家海洋和气象局)的天气预报(4)医疗生命维持系统监控 专家诊断系统CAT(计算机轴向 X 光摄影)扫描 MR(磁共振)扫描在线病历访问(5)娱乐电影动画 电影特技电影布景 计算机和电视游戏(6)科学分子分析 晶体结构研究食物质量测试 大型动态系统模拟(7)信息科技数字图书馆 在线画廊多媒体参考著作开发适用于这些应用的软件是一个融科学和艺术于一炉的复杂过程,需要想象力、创造力和天赋,也需要一整套技术和方法。软件工程正是解决问题的一整套技术和方法的应用。本章将通过一个例子来讲解一些方法和软件开发过程的几个基本阶段。1.1 欢迎来到 C+世界一个程序就是一个用某种编程语言编写的语
5、句集合。正如英语的语法规定了英语句子怎样构成一样,C+的语法规则规定了如何书写基本语句以及如何将基本语句结合起来构成更为复杂的语句并最终构成程序。本书的大部分内容都将讲解怎样书写 C+语句以及如何将语句有机组合起来形成完整的程序。在本节中,先看一个简单的 C+例子。例 1.1 是一个向用户问好的程序,它首先提示用户输入他(她)的名字,然后显示一条信息欢迎他(她)来到 C+世界。在该程序样本的运行中,用户输入的信息(sarah)被标以下划线从而与程序的输出相区分。该程序用来演示 C+程序的基本结构。例 1.1 问候其用户/ * greeting.cpp 问候其用户*输入:用户名*输出:个性化问候
6、*/#include / cin, cout, #include / stringusing namespace std;int main( )C+现代大学教程18cout firstName;cout firstName;使用 操作符读入用户从键盘(cin)输入的字符串并将其存储到 firstName 变量中。再下一条语句是:1 1997 年,C+ANSI 标准重新命名了标准库,并把所有预定义的标识符存储在命名空间中。命名空间是相关名字的逻辑容器,ANSI 标准的标识符存储在 std 命名空间中。而在与 ANSI 不兼容的编译器中则需要使用以前的库名,即用 iostream.h 和math.
7、h 分别代替 iostream 和 cmath,同时删除 using namespace iostream;行。第 1 章 问题解决与软件工程19cout 从 cin(也就是键盘)中读取值并将其存储在变量对象中,这里可以用这个操作符从键盘输入实型值然后存储在 radius变量中。计算球的重量需要一点额外的工作,这可以通过如下公式算出:重量( weight)=密度(density)体积(volume)一个半径为 r 的球体积 V 为: 34*rV结合以上两个公式得到重量的公式: 3.0.adiusweightdnsiy这意味着需要列一个详细的操作列表,如下:(1)向 cout 输出球半径的提示信
8、息,提示输入球的半径。(2)从 cin 输入一个实型值并存储在 radius 变量中。(3)向 cout 输出球密度的提示信息,提示输入球的密度。(4)从 cin 输入一个实型值并存储在 density 变量中。(5)计算 weight: 计算 radius 的 3 次方; 做实数乘法(作 3 次) ; 做实数除法。(6)向 cout 输出 weight。同很多编程语言一样,在 C+中实数的乘法和除法运算符分别是 *和/;尽管没有指数运算符,但标准库中提供了函数 pow()来做指数运算;因此所有解决问题所需要的操作都可以顺利进行。这样,计算球重的公式就增加了 6 个新的对象,如表 1-2 所示
9、。表 1-2软 件 对 象现 实 对 象类 型 类 别 名 字提示球半径信息 string 常量 无C+现代大学教程24续表软 件 对 象现 实 对 象类 型 类 别 名 字屏幕 ostream 变量 cout球的半径 double 变量 radius键盘 istream 变量 cin提示信息(density) string 常量 无球的密度 double 变量 density球的重量 double 变量 weight4.0 double 常量 无double 常量 PI3 integer 常量 无3.0 double 常量 无这里给 取一个名字,因为这样既增加了程序的可读性,又使得当精度要求
10、变化时修改程序更加容易。4算法(Algorithm )当确定了所有的对象和操作以后,就可以将这些操作组合起来形成算法。如果前面的步骤正确无误,这一步非常简单。算法:(1)初始化常量 PI。(2)向 cout 输出提示信息,提示输入半径。(3)从 cin 中读入一个实型值并将其存储在 radius 变量中。(4)向 cout 输出提示信息,提示输入密度(density ) 。(5)从 cin 中读入一个实型值并将其存储在 density 变量中。(6)计算:weight=density *4.0* *radius3/3.0。(7)向 cout 输出 weight。上述操作序列有时也被称做伪码算法
11、,因为它不用任何一种程序设计语言编写,却非常像程序代码。这个算法是下一阶段开发的蓝图。1.2.3 用 C+编码一旦为这个问题设计好了算法,就可以用像 C+这样的高级语言来编写程序。步骤如下:(1)创建一个程序框架,它包含开放文档、包含对象和操作所需要库代码的编译指令、空的 main 函数。(2)把每一个算法步骤转换成代码。如果它用到了没有声明的软件对象,则需添加一条声明语句指明对象的名字和类型。对于上面的例子,程序框架如下:/*sphereWeight.cpp 计算球的重量第 1 章 问题解决与软件工程25*输入:球的半径(英尺)和密度(磅/立方英尺)*输出:球重(磅)*/#include /
12、cin,cout,#include /pow()using namespace std;int main()这里用#include 编译指令将提供了注释后的这些对象和方法的库 iostream 和 cmath 包含到程序中,这个程序框架其实是一个可以正确编译和执行的完整程序。下面把算法的每个步骤转换成代码。(1)初始化常量 PI 可以转换成如下 C+语句:const double PI = 3.14159;然后将这个语句插入到 main 函数中:.int main()const double PI = 3.14159;(2)向 cout 输出提示信息,提示输入半径可以用 C+写为:cout “
13、Enter the spheres radius (feet):“;然后把这个语句加到 main 函数中:.int main()const double PI = 3.14159;cout “Enter the spheres radius (feet):“;(为了增加可读性,在这个语句与前面的常量声明语句间增加一个空行)(3)从 cin 中读入一个实型值并将其存储在 radius 变量中这里使用了两个对象 cin 和 radius。第一个对象 cin 由 iostream 库提供,并且已经被#include 编译指令加入到了程序当中;然而对 radius 来说,必须增加一条声明语句以说明它的类型和名称:double radius;然后把实现了算法步骤(3)的语句添加到 main 函数中.