第八章 顺序流程

8.1 顺序流程

  8.1.1 加法计算器(DOS版)

  8.1.2 加法计算器(WIN版)

 

你喝一杯水,一般是这样:

1, 往杯里倒满开水; 

2, 等开水冷却; 

3, 往嘴里倒。

从这个生活的例子中,你可以想到,完成事情,总是要有顺序的,并且执行顺序往往还很需讲究。譬如喝水的例子,如果你把第2步和第3步调序,结局可能会很难受;而如果你想把第1步放到最后去执行,大概你将永远也喝不了水。

 

程序是用来解决现实生活的问题的,所以流程在程序中同样重要。我们已经学习过语句,当我们写下一行行代码时,这些代码必须按照一定次序被执行,这就是程序的流程。

 

我们先为熟悉最简单的流程:顺序流程。

 

8.1 顺序流程

 

笔直的长安街,东西走向,长达40公里。

顺序流程就像一条笔直的,没有分叉的路。程序执行完第一行,然后第二行、第三行……。我们这一节课用两个例子来熟悉什么叫顺序流程。

 

电脑,原称计算机(computer)。你的电脑是奔III、奔IV,或其它什么,据说它每秒钟能计算几百几千万次云云,反正就是很厉害。现在,既然我们学编程了,是该到我们亲手出道让计算机为我们算算的时候了。

一道很简单的题,加法。我们准备做两个版本。先来DOS版本。

 

8.1.1 加法计算器(DOS版)

 

来生成一个空白的控制台工程,很熟悉了吧?黑体是你要加入的,它们的作用你知道。

//---------------------------------------------------------------------------

#include <iostream.h>

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

getchar();

return 0;

}

//---------------------------------------------------------------------------

现在,我们来加入实现加法计算的代码:

 

int main(int argc, char* argv[])

{

int js1,js2; //加数1,加数2

int he;      //和

 

cout << "请输入第1个加数:" << endl;

cin >> js1;

 

cout << "请输入第2个加数:" << endl;

cin >> js2;

 

he = js1 + js2;   // 和 = 加数1 + 加数2

cout << js1 << " + " << js2 << " = " << he << endl;

 

getchar();

return 0;

}

//---------------------------------------------------------------------------

 

上面的代码,你应该都能看懂。不过我还是解释一下(你不妨在输入后按一下F9,看一下运行结果,可以更有助于理解)。

 

这段代码从功能上分,可以分为三个部分。

 

int js1,js2; //加数1,加数2

int he;      //和

 

这是第一部分,两行代码定义了三个变量:加数1、加数2及和。至于 “//加数1,加数2 ”双斜杠到行末的代码,那是注释。也就是写给程序员自已看的“程序说明”。你可以不理它。

 

第二部分为输入部分,用来输入

 

cout << "请输入第1个加数:" << endl;

cin >> js1;

 

cout << "请输入第2个加数:" << endl;

cin >> js2;

 

cout 输出一行提示,告诉用户(现在就是我们自已)做什么。而cin则将用户的输入存到变量中。如:

cin > js1;

这一行执行时,会等待用户输入一个数,直到用户回车后(别忘了,回车结束输入),用户输入的数值会被自动赋值给变量js1;js1是“加数1”的拼音首字母,而非你更熟悉的“奸商1”或“句神1 :(”。

 

最后一部分实现计算和输出。

he = js1 + js2;    // 和 = 加数1 + 加数2

cout << js1 << " + " << js2 << " = " << he << endl;

 

这段程序的核心代码就行:

he = js1 + js2;    // 和 = 加数1 + 加数2

它实现将js1和js2相加,并附值给he。

最后一句 cout 将结果输出,你可以只写成这样:

cout << he;

这样写也把计算结果输出了,但可能会被人说成“用户界面不友好”噢。

 

来看看我们程序运行时的某种结果。我决定让它计算:2002 + 1973。你要让它算什么?你自已试吧。

 

虽然是个很不起眼的小程序,虽然只是一道小学低年级的算术题,可是必竟我们亲手证明了我们的爱机具有计算能力。得意5秒钟,我们来继续我们的课程。我将通过单步运行来亲眼程序是如何一步一步地按顺序运行的。

如果你在还在运行着程序,回车键关掉那个黑色窗口。

切换回C++ Builder的代码窗口。

 

单步运行是一种最必要的调试方法(其它众多调试方法几乎都基于该方法),它可以让程序按代码行一步步运行。

 

在CB中,通过按F7或F8键,可以实现单步运行一个完整的代码行(不一定是物理上的一行代码)。F7和F8的功能区别现暂不必理。本章中,我们使用F8。对应的功能菜单为:

从菜单中看到,F8对应的功能名称为:Step Over (单步越过)。

按下F8后, 程序开始运行,但并没有直接出现结果窗口。相反,代码窗口出现了变化:

左边栏上的 表示该行是一可以单步中断的代码行,而则指示了当前正要运行的代码行,注意,是正要运行,而不是正在运行。

现在让我们再按一次F8(在代码窗口里),可以看到程序往下走到第二个可中断行。

 

再按一次F8,程序又往下走了一行(为了方便观察,我将输出窗口拉近了一并抓下图)。

输出窗口(DOS窗口)有出输出,并且有光标闪烁,但你可以试着在输出窗口里敲敲键盘,会发现你并不能在这一步输入加数1,因为此时程序运行到 cin >> js1,但并未执行这一行。只有我们再按一下F8(记得在CB的代码窗口里,而不是在DOS窗口里),程序将要求并允许我们输入加数1。如果你还没有再按一次F8,现在按一下。结果如下:

我们发现代码窗口里暂时没有了,因为控制权已暂时移交到我们程序,它现在可以输入了。我们输入2002,然后回车,很快又出现在代码窗口里,并且,已经越过 cin >> js1这一行。

 

 

接下来是提示输入第二个加数,大同小异。只要你记得当控制权转到程序时,你需要切换到输出窗口输入第二个数。 注意了:最后当程序运行:getchar(),需要我们输入一个回车时,控制权也会移到程序。由于是在单步运行,所以当我们在输出窗口最后敲一个回车时,程序同样不会直接运行到结束。所以你仍得到CB的代码窗口里按F8。

getchar() 以后,程序仍将在return 0; 和最后的一个 ‘}' 上作单步运行两次才退出。

如果你懒得这样一步步运行到结束,想结束单步运行,可以直接按F9,程序将恢复全速运行,直接运行到结束。

 

就这样,我们一步一步地运行完这个程序。我们学会了如何通过F8来单步运行程序,我们也理解了什么叫顺序流程。这个程序中每一个可中断点(事实上也是可执行点),在程序运行时,被依照其先后次序,一一执行。

如果你还是不理解什么叫“顺序”,那就从椅子上站起来,然后双眼直直地瞄住一面墙(挑结实一点的),然后直直地走过去,听到“砰”的一声后,你一定会开窍。

(一般不传之秘笈:当程序员觉得被眼前的代码弄得头晕脑胀的时候,大多数人都会起来走走,下楼抽颗烟,或者只是坐坐,吹吹风……最佳方法是挪到不远处某漂亮的女测试员的桌边胡说八道几句,再挪回电脑前,往往发现问题的答案很简单!)

8.1.2 加法计算器(WIN版)

 

我们一直在写DOS下的程序(控制台程序)。趁今天的课程知识点不多,我们来写一个正宗的Windows应用程序。它还是实现一个加法计算器。

 

不要做得太顺手了!听我说,如果刚才那个DOS版你还没保存,请先 Shift + Ctrl + S 保存全部。接着,最好执行一下这个菜单命令:File | Close All。如图:

 

然后,我们重复一下如何建立一个空白的Windows应用程序工程,我们在以前的课程中曾经做过一次,在作业里也考过一次。

其实很简单。菜单: File | New Applicaton (如果是CB6,可能略有不同)。也可以按工具栏上的这个图标:

然后选择:Application。

 

新的空白工程建成以后。我们需要来设计程序界面--毕竟,这是一个有图形用户界面(GUI)的Windows程序。

其实很简单,我们需要两个编辑框,让用户输入两个加数。再来一个编辑框用于显示和。还要一个按钮,当用户按下时,加法运算才开始。当然还需要一些标签用于显示提示文字。

下面先把要用到三种控件在控件栏位置说一下:

这三个控件都在控件栏的Standard页上。上图中,

①:标签控件(TLabel);②:编辑框控件(TEdit);③:按钮控件(TButton)。

 

先在表单上放三个标签,三个编辑框:(在控件栏上按下控件图标,然后在表单上单击)

然后,用鼠标单击表单上的 Label1,如果你看不到下面这个窗口(属性检视器),请按F11。

将其Caption(标题)属性,由原来默认的Label1改为:“请输入第一个加数:”如图:

同样的方法,修改Label2,Label3的标题,分别为:“请输入第二个加数”和“和”。

 

三个编辑框中默认的文本“Edit1”、“Edit2”、“Edit3”我们都不要。编辑框中的文字属于TEdit的Text属性。让我们一起将它们清除:

首先拉动鼠标,一起选中三个编辑框:

将上图中Text属性的值:Edit1清空。

现在,设计结果如图:

 

前两个编辑框我们准备让用户输入加数,最后一个编辑框要用来显示相加结果(和),所以最后一个编辑框不能让用户修改。编辑框(TEdit)有一个属性名为ReadOnly(只读),当它被设置为真(true)时,编辑框的内容不能手工修改。

如上图,将Edit3的ReadOnly属性改为true(原来默认为false)。修改ReadOnly的结果并不能直接在设计期间看出。

 

最后,让我们再加上一个按钮(TButton),并改变其Caption属性为:“加(&A)”

 

界面设计完成。下面开始代码设计。

双击 “加”按钮,CB将自动切换到代码窗口,并且自动生成以下代码:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

     

}

//---------------------------------------------------------------------------

 

请加入以下黑体部分的代码:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

   int js1,js2;

   int he;

 

   js1 = Edit1->Text.ToIntDef(0);

   js2 = Edit2->Text.ToIntDef(0);

 

   he = js1 + js2;

   Edit3->Text = IntToStr(he);

}

//---------------------------------------------------------------------------

js1 = Edit1->Text.ToIntDef(0);用来得到用户输入到Edit1里的数值,你现在可能看不懂,可以不必理会。只要你能看出 js1 = ...这是一句赋值语句。

保存,运行这个程序。我们可以反复输入不同数让程序运算。当然,每次运算前,需正确输入合适的加数,然后按那个按钮。如果你没有输入加数,或者输入的是非法的字符,如:"ABC"、"-2-3"等无法转换为数值的内容,则该加数将被当成0。

以下是运行时的一个界面:

你还可以试着在第三个编辑框里敲敲键盘,会发现的确无法改变其内容。

 

很开心的一章:我们终于能做些有点意义的小程序了。从身边找一个会电脑,但没有学习编程的家伙,我们大可用这个程序小小的炫耀一番。

不过,现在你也应该能理解,为什么我们在学习C,C++语言时,我们为什么大多会采用DOS下程序来作为例子,因为若使用Windows程序,它的界面设计很容易让我们分心。并且,我们还必须面对如Edit2->Text.ToIntDef(0)这些后面才学到的内容。

 

[到页首]