从硬盘安装Linux操作系统 | 基本操作 | Linux技术文章及解答Linux疑问

应用程序简介 | Shell命令行操作 | 编程基础 | 下载Linux教程

连接因特网 | 软件的安装和卸载 | 搭建个人网站 | 红联Linux论坛

 

   红联Linux门户>>红联Linux论坛>>第十五章 编程基础>>下载本章教程

学习内容

Basic 集成开发工具Gambas

需求分析--“聪明宝贝”的功能要求

设计

开发工具的选择

用户界面

后台运算

编程第一回

启动Gambas 新建工程

新建窗体

运行工程

保存和关闭工程

编程第二回

打开已有工程

添加控件

编写代码

运行

查帮助排除逻辑错误

编程第三回

添加控件组

答案的输入处理代码

答案正确性判断代码

添加注释

发布软件

制作安装包

制作源程序包

包测试

改进程序

准备源程序

编制菜单条

增加窗体

编写菜单程序

发布新软件

进一步改进的提示

基于文本的C/C++

vi 最基本操作

C 程序编译和运行

用GNU gdb 调试

C++ 程序的编译

Kdevelop

安装和启动

基本步骤

第一步,新建工程

第二步,编辑程序文件

第三步,生成源码结构

第四步,配置,即运行configure

第五步,编译连接

第六步,运行

例1 单文件面向过程C++ 编程

例2 多文件面向对象的C++ 程序

例3 改进程序

例4 使用已有的源文件

更多更新,前往论坛学习

编程基础

《中文版Linux 桌面操作系统初级教程》郭守华 宋雪娇 编著

       学习编程,主要应该学习三方面的知识,即程序开发环境的使用、编程语言的语法规则以及可供

直接使用的标准类库/函数库。限于篇幅,本章着重讨论程序开发环境的使用。

      本章附有例程,保存在目录turial-basic-redflag41-8-example中。

Basic 集成开发工具Gambas

       在红旗Linux4.1的开发工具盘中,提供了Gambas.0.99。“Gambas几乎就是Basic!”,是基于

Advanced Basic 语言的集成开发环境。该工具可视化程度高、面向对象,并且简单易学,适合编程初学

者做编程练习使用。下面将结合一个小游戏的开发来讨论Gambas 的基本使用方法

需求分析--“聪明宝贝”的功能要求

       要开发的小游戏被命名“聪明宝贝”。这是一个数字0到9 的加法游戏。每局游戏开始后,程序会

自动产生1 道题,给出两个0 到9 范围内的随机数,要求游戏者算出这两个数的和。初步分析,为了实现

上述功能,大体上应该做如下事情:

1、建立一个应用程序窗体,游戏就在这个窗体上进行;

2、寻找一种产生随机数的办法、显示题目;

3、接收游戏者输入的答案,判断正确性。

       对于“聪明宝贝”这样的小程序,上述需求分析已经足够,可以开始进行设计了。

设计

       需求分析明确了应该做什么,设计则要解决如何做的问题。象“聪明宝贝”这样的“微型”软

件,其设计工作完全可以和编程工作混合在一起做。不过,为了便于说明,这里还是专门考虑一下设计的

问题。

开发工具的选择

       显而易见,“聪明宝贝”是一个图形化的应用程序,应该选择支持可视化编程的开发工具。这里

就选择Gambas.0.99。

用户界面

      Gambas提供的一些常用控件就可以满足“聪明宝贝”用户界面的设计需要。可以用窗体控件Form建

立应用程序窗体;用标签控件Label显示题目;游戏者用鼠标点击命令按钮Button 即可输入答案。总地来

看,程序涉及的控件有Form、Label、Button。各控件的布局和数量可以在编程时确定。

后台运算

      Gambas提供了随机数生成函数Rnd,调用它就可以产生随机性的算术题目。两个0~9的数字之和有

可能是一位数字,也可能是两位数字。程序在产生一道题后,应该自动计算答案。当答案是一位数时,游

戏者输入一位数字后就可以判断其回答的正确性;当答案是两位数时,就要等游戏者输入两个数字之后再

进行判断。

编程第一回

      有了基本的设计之后,就可以着手编写程序了。编程可以由粗到细,由简到繁地进行。先绘出用户

界面轮廓,实现简单地操作,然后再逐步细化,最后达到设计目标。

启动Gambas 新建工程

从开始菜单就可以启动Gambas:【开始】→【应用程序】→【软件开发】→【Gambas】开发工具启动后,

首先会出现一个对话框,询问是要新建工程还是打开已有的工程。点击新建工程就会启动工程创建向导。

      按照工程创建向导程序的提示,可以完成有关工程的一些基本信息的设置。这主要包括:

工程类型: 用gambas可以编写图形化界面的程序,也可以开发命令行界面的程序。还可以用已有的工程

做模板创建新的工程。这里应该选“创建一个图型工程”。

工程名: 就是给工程订立一个名字。可以用smartbaby。

工程标题: 就用汉字标题“聪明宝贝”吧。

保存位置: 指定工程文件保存到哪里?

      工程创建向导收集上述信息后就会自动生成一个smartbaby目录,在其中保存所有相关的文件。

 

 

新建窗体

       完成工程创建工作后,gambas也就启动起来了。在屏幕左侧那个有菜单的窗口是gambas 的主窗口。在主窗口中用树形图表示

了本工程所涉及的类、窗口、模块、和数据,工程名smartbaby就是树根。用鼠标右键点击工程名smartbaby或者其下面的分支,都会

出现弹出菜单,其中【新建】→【窗体】就是用来给工程添加窗体的。执行此功能,建立第一个窗体。开发工具会询问窗体的名字。这

个窗体是游戏的主窗体,不妨定名为frmMain。注意,一定把“启动类”的复选框勾选上,因为程序启动时这个窗口就应该直接显示出

来。

运行工程

        现在工程已经有了可见的窗体了,不妨试着运行一下。方法很简单,用鼠标单击gambas主窗口工具栏中的绿色三角图标

即可。程序运行起来后,应该显示一个窗口,虽然上面什么也没有。但可以执行窗口的基本操作,即:最小化和关闭。可以点击窗口右

上角的最小化图标和关闭图标试试。关闭窗口,意味着程序运行的终止。
程序是在gambas的环境中运行的,也可以用鼠标单击gambas主窗口工具栏中的红色方块图标来终止程序的运行。

保存和关闭工程

执行gambas主窗口菜单【文件】→【保存工程】可以把新建的工程保存起来。

执行gambas主窗口菜单【文件】→【退出】则可以将整个工程关闭并退出gambas。

上面做的工作虽然简单,但却解决了用gambas编程的最基本问题:

• 如何建立一个新工程;

• 如何添加窗体;

• 如何在调试环境下运行程序;

• 如何保存和关闭。

编程第二回

       前面已经创建了新工程并且创建了窗体。接下来解决随机数生成和题目显示的问题。

打开已有工程

       再次启动Gambas,会出现一个对话框,询问是要新建工程还是打开已有的工程。在对话框的右侧有一个列表,列出了最近的工

程。可以从这个列表直接选择smartbaby。也可以点击“打开工程”按钮,然后在弹出的选择工程对话框中找到smartbaby。

添加控件

       双击主窗口树形图中的frmMain,主窗口就显示出来了。现在,要把一个标签控件和一个命令按钮控件加到窗体中。在屏幕右

侧,有一个工具箱窗口。需要的控件就在这个窗口里。如果工具箱窗口没有显示出来,执行Gambas主窗口菜单【视图】→【工具箱】就

可以。

标签控件,即Label,可以用来显示不可修改的文本。在“聪明宝贝”中,用它来显示算术题目。先用鼠标单击工具箱中的标签图标

,这个图标就会被黑线方框圈起来,变成的样子。这表明选中了这个图标。然后用鼠标在主窗口任意位置进行拖放,主窗口上

就会出现一个标签控件。单击控件即可选中它。可以拖放选中的控件来调整其摆放位置。用鼠标指向被选中控件的边缘然后拖放,则可

以调整控件大小。用鼠标右键点击控件,执行弹出菜单中的“属性”则可以显示出该控件的属性窗口。默认的控件名称(Name)属性为

Label1,改成lblDisplay。

        命令按钮控件,即Button,点击它可以执行命令。命令按钮控件对于的图标是同理可以调整该按钮的位置和大小并修改

其属性。控件名称(Name)改成btnNew,文本(text)设成“新局”。将来程序做好时,点击这个按钮将开始新的一局游戏。 

编写代码

        窗体上已经有了一个按钮btnNew,和一个标签lblDisplay。可以编写代码实现这样的功能:单击按钮,调用随机数函数,产

生两个随机数,作为算术题目的加数和被加数,然后组合形成字符串,通过标签显示出来。这样就解决随机数生成和题目显示的问题。

显然,这些代码应该在单击按钮时执行。“单击按钮”就是所谓的事件,而添加的代码,就是事件处理程序。如何编写btnNew“单击事

件”处理程序代码呢?用鼠标双击btnNew,就会弹出代码编辑器。在其中已经有了一些简单的代码:

' Gambas class file
PUBLIC SUB btnNew_Click()
END

这几行代码是Gambas 自动生成的。应该把btnNew“单击事件”处理程序代码写到PUBLIC SUBbtnNew_Click()与随后的END

间。PUBLIC SUB btnNew_Click()表示一个函数的开始,END 则表示一个函数的结束。这就是说,按钮btnNew发生“单击事件”时,

程序将执行btnNew_Click()这个函数。目前这个函数是空的,也就意味着按钮btnNew发生“单击事件”时,什么也不做。要实现前面

提到的功能,就要编写程序,告诉计算机应该做什么。下面是定义好的程序代码:

PUBLIC SUB btnNew_Click()
DIM a AS Integer
DIM b AS Integer
a=Int(Rnd(10))
b=Int(Rnd(10))
lblDisplay.Text =Str$(a) &"+" &Str$(b)&"="
END

       这个事件处理程序中,前两行以DIM开头定义了两个整型变量,即a和b,分别用来存加数和被加数。接下来的两行是对a、b赋

值。Rnd(10)函数将返回0到10范围内的随机数, Int()函数则是取整函数,取随机数的整数部分。最后一行把a、b转换成字符串,并

与加号(+)和等号(=)连接起来,形成算术表达式的字符串,此字符串被传递给lblDisplay的Text属性,从而把题目显示出来。

运行

       在编程过程中,每增加一些新代码之后,就要运行一次。如果新代码中有错误,就无法运行并会出现错误提示。此时应该根据

提示认真查看错误的行,修正错误,然后再尝试运行,直到成功运行起来。能运行起来,表明没有语法错误,但并不表明没有逻辑错

误。要想发现逻辑错误,只能实际用用这个软件,看它是否实现了预期的功能。到目前为止,已经编写了随机数的产生和题目显示的有

关代码,应该验证一下程序自动出的题目是否具有随机性,并被正确的显示出来。经过验证,我们发现,每次启动“聪明宝贝”之后,

第一次点击“新局”按钮产生的题目总是“0+1=”,第二道题是“7+4=”,第三道题是“5+2=”,……,依此类推。这显然与预期

的效果不同。怎样才能让每次启动后出的题目都不相同呢?

查帮助排除逻辑错误

       其实解决上面发现的问题很容易。读者在这里着重学习的,应该是解决问题的方法。为了了解导致上述问题的真正原因,应该

深入了解一下Rnd()函数,最好的办法就是查看帮助。执行Gambas主窗口菜单【帮助】→【帮助浏览器】就可以查看帮助了。在帮助浏

览器的“查找”标签中,有一个文本框,在其中输入“rnd”,然后回车,就会出现一个列表,在其中可以找到“Rnd”,单击它,就可

以看到有关Rnd()函数的介绍了。在rnd()函数介绍的下面有一个“See also”,翻译过来就是“参见”的意思。帮助系统提示参见什

么呢?“Randomize”,即,“随机化”。单击这个链接,可以看到,Randomize 是一个随机数初始化函数。它会以当前的日期和时间

为参照,对随机数进行初始化。这到底是什么意思呢?还是不太明白。没关系,可以试试。在对a、b 赋值语句之前,增加如下一行代

码:Randomize()

       然后再运行程序,可以发现每次启动程序后,题目都是各不同的。至此,随机题目的产生和显示问题就解决了。

编程第三回

下面考虑输入答案并判断其正确性的问题。

添加控件组

        要用按钮实现数字的输入,就要增加10个Button(按钮)控件,分别用来输入0、1、2、……8、9。添加控件的操作并不复

杂,在上面已经讨论过了。这里面存在一个问题:10个按钮,是不是需要编写10个事件处理程序来处理它们的点击事件呢?这会很麻

烦,显然是不合理的。应该有一种途径,能够让这10个按钮共享一段事件处理代码。这就要用到控件的Group(组)属性。当设了控件的

Group属性后,某控件所发生的事件都会当成群事件来处理,运行的是群事件处理代码。可以增加10个按钮控件,分别将其Name(名称)

属性设为btn0,btn1,…,btn9,而将它们的Group属性设为digits。这样设置之后,点击这10个按钮控件中的任何一个而产生的点

击事件都将由digits_Click()处理。

        这样又会产生另一个问题:Group(组)属性使多个按钮的事件由同一段代码处理成为可能,但对于同一组的不同控件而言,其

处理可能存在细微的差别。于是,还有必要区分出一个事件具体是由哪个控件触发的。这就要用到控件的tag(标签)属性。可以为tag

(标签)属性设置任何相关的数据。在digits_Click()中将可以引用这个属性值。因此,可以把btn0,btn1,…,btn9 的tag属性依次

设置为0,1,…,9。还有一个属性需要设置的是text(文本),它是按钮上显示出来的文字。依次设置为0,1,…,9。顺便指出,属

于某一组的控件不必是同一种控件,把Button和Label控件放到同一个组里是允许的。这比控件数组更为灵活。

答案的输入处理代码

       下面编写代码,使游戏者可以通过点击按钮来输入答案。因为各个数字按钮属于同一个组,要编写各按钮的单击事件处理程

序,实际上是要编写组事件处理程序。下面是定义好的程序代码:

PUBLIC SUB digits_Click()
lblDisplay.Caption =lblDisplay.Caption &LAST.tag
END

      当点击0,1,…,9 任何一个按钮时,都会执行这段代码。LAST代表刚刚点击过的按钮,这是在组事件处理程序中的专用标

识。而LAST.tag提取了LAST的tag属性,也就是刚刚点击过的按钮的tag属性。

答案正确性判断代码

       要判断答案是否正确,首先应该计算出正确的结果并暂存到某个变量。不妨将此变量命名为StandardAnswer,在

btnNew_Click()中,产生随机题目之后,就可以立即计算StandardAnswer的值了。在游戏者输入答案后,还需要进行比较,也就是要

在digits_Click()中增加判断程序,把StandardAnswer的值与输入的答案进行比较,如果一样,就认为回答正确。

       显然, 在btnNew_Click()和digits_Click()中引用的StandardAnswer应该是同一个值。在这种情况下,应该将

StandardAnswer 定义为公共的变量。如何定义呢?在代码编辑窗口,' Gambas class file之下添加如下代码:

STATIC PUBLIC standardAnswer AS Integer

       这段代码写在btnNew_Click()和digits_Click()之外,就表明它是一个公共变量,可以被二者引用。在btnNew_Click()增

加下列赋值语句,使standardAnswer 记录正确的结果:standardAnswer=a+b

       判断过程要稍微麻烦一些。首先是判断时机的问题。两个0~9的数字之和有可能是一位数字,也可能是两位数字。当答案是一

位数时,游戏者输入一个就可以判断;当答案是两位数时,应等游戏输入两位数字(即单击两个数字按钮)之后再进行判断。其次,要分

析游戏者单击按钮的动作,确定输入的答案是什么。第三是进行判断。第四,根据判断结果,给出适当的结论。

       为了记录输入的答案,需要定义一个字符串变量sAnswer。考虑到有的答案需要两次单击按钮,即需要两次执行digits_Click

()。在第二次执行digits_Click()时,应使sAnswer把本次输入的数字与上次输入的数字结合起来,作为答案。因此,应该将它定义

成公共变量:STATIC PUBLIC sAnswer AS String

在每次出题之后,应该将清空,做好接收新输入的准备。因此,还要在btnNew_Click()增加下列赋值语句:sAnswer=""

为了显示结论,还应该增加一个Label,放在窗口底部。将该控件定名为lblRemind。做好了上诉变量和控件准备后,即可以在

digits_Click()中增加判断代码了。具体代码如下:

sAnswer=sAnswer&LAST.tag
IF Len(Str$(Val(sAnswer)))=Len(Str$(standardAnswer))THEN
IF Val(sAnswer)=standardAnswer THEN
lblRemind.Text ="正确!"
ELSE
lblRemind.Text ="不对,正确答案应该是"&Str$(standardAnswer)
ENDIF
ENDIF

       代码行sAnswer=sAnswer&LAST.tag负责将游戏者点击的数字累积记录下来。判断语句IF Len(Str$(Val(sAnswer)))=Len

(Str$(standardAnswer))THEN确定了判断时机。当sAnswer记录的数字字串长度与standardAnswer 的数字位数相同时,就可以进行

判断了。代码段IF Val(sAnswer)=standardAnswer THEN则具体负责判断答案的正确性,然后修改lblRemind 的Text 属性,显示出

合理的提示信息作为结论。

添加注释

       增加了判断代码之后,程序已经变得比较复杂了。为了增加代码的可读性,便于将来修改和维护,应该添加注释。其实,应该

养成一边写程序,一边加注释的习惯。加注释的方法比较简单,先输入一个单引号('),然后输入相应的注释文字即可。如图,是代码

编辑窗口的截图,其中列出了本程序所有的代码及其注释。

发布软件

在程序编写并全面测试通过之后,就可以制作安装包进行发布了。如果要开放源码,还应该制作源码包。

制作安装包

       Gambas提供了安装包向导,可以把软件打成rpm包。用户得到该rpm包后,用通用的rpm包安装方法即可安装使用。执行gambas

主窗口菜单【工程】→【制作安装包】即可启动安装包向导。安装包向导首先要询问维护者的信息和对该软件的描述。这里注意,描述

文字可以用英文或者汉语拼音,但建议不要用汉字。接下来要添加修改日志。这里可以用汉字。下一步是选择安装包的运行平台。有

Mandrake, RedHat, SuSE等几种选择。至少要选择一种运行平台。比如选择RedHat。

       接下来是选择安装包的组。比如选Applications/Multimedia。再接下来是要指定该软件安装时自动创建快捷方式在开始菜单

中的保存位置。比如选Game。然后是选择包的存放目录,可以选择保存到自己的家目录中。做了上述设置后,点击“确定”就可以开始

创建安装包了。

制作源程序包

       源程序包的制作比较简单。执行gambas主窗口菜单【工程】→【制作源程序包】,指定源程序包的保存位置就可以制作源程

序包了。

包测试

        已创建的包有两种1,一种是安装包,即扩展名为.rpm的,该包的主文件名由工程名和版本号组成。另一种是源程序包,扩展

名是.tar.gz。“聪明宝贝”的安装包文件为smartbaby-0.0-1.noarch.rpm,源程序包文件为smartbaby-0.0-1.tar.gz。对于安装

包,应该测试是否能按rpm包常规安装和卸载方法进行安装或卸载。经测试,用.rpm安装包安装时,会出现确定依赖文件失败的错误

(Fail dependencies),这也许是由gambas与红旗Linux 系统配合不好引起的一个小bug。只要在系统中已安装了gambas,这种错误

可以忽略。使用“--nodeps”参数可以确保成功安装。

       安装成功后,可以在【开始】→【应用程序】→【游戏】找到相应的启动项。值得注意的是,gambas开发的软件要想成功运行

需要解释程序gbx的支持,而gbx 就在gambas之中。可以用常规方法卸载程序。对于源程序包,应该测试是否能正常解压,能否用

gambas打开。

改进程序

        在linux上运行的程序,大多都是开放源程序的。取得源程序包后,就可以对程序进行修改,提高它的性能。

--------

1Gambas的安装包向导还会自动生成一个以.src.rpm为扩展名的包,这个包实际上也是源程序包,此包不宜用来发布软件。

        这里计划对“聪明宝贝”做几点改进:程序没有菜单,这看起来不像标准的应用软件,增加菜单;增加“关于”的窗口,显

示程序的开发信息。

准备源程序

找到聪明宝贝0.0-1的源程序包smartbaby-0.0-1.tar.gz,将其解压缩。可以看到,解压缩后形成的目录名字为smartbaby。启动

gambas,找到这个目录。该目录的图标正是gambas 为每个工程设定的默认图标,这说明gambas已经识别到该目录下的文件是gambas

创建的工程文件了。

选中它,单击确定按钮,就可以打开这个工程了。运行一下,看是否正常。如果没有意外,应该能正常执行。到此,修改前的准备工作

就做好了。

编制菜单条

       双击gambas主窗口中的frmMain使程序的主窗体显示出来。在主窗体任意空白位置单击鼠标右键,执行其中的“菜单编辑

器...”,就会出现“菜单编辑器”。对于每一个菜单而言,最基本的属性是名称(Name)和题词(Caption)。“名称”相当于变量名,

“题词”则是菜单项上显示的文字。除此之外,还可以规定菜单的组(Group)和标签(Tag),以及快捷键和图标(即“图片”项)。菜单

项之间排列的先后顺序可以用按钮调节,而菜单项之间的级别关系则用按钮调节。

        这里,先定义了两个一级菜单,“文件”和“帮助”,它们并不对应具体的操作,仅仅是菜单的分类,因此定义好它们的题

词即可,名称则可以随便定。在“文件”之下设了两个子菜单:“新局”,执行它可以开始新的一局游戏,与“新局”按钮的功能是相

同的,名称定为mnuNew;“关闭”,执行它将关闭窗口,结束程序,名称定为mnuClose。在“帮助”之下设了一个子菜单:“关于”

,执行它将弹出一个提示窗口,用来显示程序的一些基础信息,比如编程时间,功能介绍等,名称定为mnuAbout。把菜单项都描述好

之后,单击“菜单编辑器”的“确定”按钮。这是就可以在主窗体的上方看到菜单条了。

增加窗体

        执行“关于”菜单时,要弹出一个提示窗,因此需要在程序中增加一个窗体。其方法同创建主窗体类似:用鼠标右键点击工

程名smartbaby或者其下面的分支,都会出现弹出菜单,执行【新建】→【窗体】即可增加窗体。开发工具会询问窗体的名字,定名为

frmAbout。如果把“默认的对话框管理”的复选框勾选上,系统会自动在窗口上添加“OK”和“Cancel”两个按钮,并添加相应的单

击事件处理程序。这里只打算用frmAbout显示关于“聪明宝贝”的一些基础信息,并不需要做任何操作。因此,应该在窗口中添加一

个Label控件,并把要显示的信息赋给写到该控件的Text属性。对于自动添加的两个按钮,理论上讲,保留其中任何一个就够了,因为

它们的单击事件处理程序都会关闭本窗口。二者的区别在于,“OK”的单击事件处理程序在关闭本窗口时会携带一个参数“TRUE”,而

“Cancel”不带。

编写菜单程序

       在frmMain主窗体上,可以看到菜单条。用鼠标单击“文件”,此菜单将被展开。用鼠标单击某子菜单,比如“新局”,就可

以编写相应的菜单项单击事件处理程序。“新局”菜单程序如下:

PUBLIC SUB mnuNew_Click()
btnNew_Click()'“新局”按钮时间处理
END

      当单击“新局”菜单时,将调用btnNew_Click()。换句话讲,“新局”菜单与“新局”按钮的功能是相同的。“关闭”菜单程

序如下:

PUBLIC SUB mnuClose_Click()
ME.Close()'关闭程序
END

     ME.Close()作用就是关闭当前窗口,而当前窗口是本程序的主要窗口,关闭窗口也就意味着关闭本程序。“关于...”菜单程序如下:

PUBLIC SUB mnuAbout_Click()
frmAbout.Run '显示“关于”对话框
END

frmAbout.Run调用了frmAbout中的方法RUN,其作用就是运行frmAbout窗口。进一步查看frmAbout.Run的代码如下:

STATIC PUBLIC FUNCTION Run() AS Boolean
DIM hForm AS Form
hForm = NEW frmAbout
RETURN hForm.ShowModal()
END

       这段代码是在创建窗口时自动生成的,其作用就是显示frmAbout 窗口。

发布新软件

       修改完成并测试没有问题后,就可以考虑发布问题的。因为已经对软件做了修改,因此版本号应该有变化。

具体操作请参见。在Gambas的主窗口上执行【工程】→【属性】,就会弹出工程属性的设置窗口,在这里可以对版本号进行修改。这里

定义新软件版本号为0.0-2,因此只需把“释放”后面的数字改成“2”即可。最后,按前面的“发布软件”介绍的方法制作安装包和源

程序包,就可以发布新的软件了。

进一步改进的提示

       程序还有更多的改进余地,下面给出一些提示,以便读者练习。首先从界面上看,有10数字按钮,1个“新局”按钮,布局不

对称,可以考虑再增加一个按钮,使界面的布局更合理。这个新增按钮的功能与“新局”按钮相同,用图而不是用文字表明其功能。其

次,“聪明宝贝”显然是为为2-4 岁的学龄前儿童设计的。这么小的孩子也许根本就不认识数字,更不会加法运算。可以考虑为数字

加图形提示,用图形示意加法的运算。最后,为了增加游戏的趣味性,可以规定一局出几道题,比如每5 题一局。在每一局游戏中,每

答对一道题时就奖励一颗星,而答错了就给一个小红脸。

基于文本的C/C++

       C/C++语言非常灵活,是众多专业程序员最为喜欢的编程语言之一。下面讨论基于文本的C/C++编程问题,主要涉及:如何编写

程序,如何编译,如何调试,如何运行。涉及的开发工具有GNU C/C++、GNU GDB。

vi 最基本操作

       要编程,第一步就是要写程序。用什么写呢?用文本编辑器Kedit和高级文本编辑器KWrite编写当然可以。但这里要介绍是基

于纯文本环境的编辑工具,那就是大名鼎鼎的vi。在以命令行方式启动Linux,或者通过ssh 远程登陆到某Linux 系统时,很可能只有

vi这样一个工具可以用来编写程序。

        vi用不同的颜色表示不同的程序元素,增加了程序的可读性,看起来也特别漂亮。好,下面结合一个简单的例子,来讨论vi

的最基本操作。值得注意的是,vi支持的操作是非常丰富的,这里只介绍最常用的操作。执行下面的指令,在当前目录下建立一个文件

名为calculator.c的程序文件。如果该文件已存在,此命令将打开这个文件。

vi calculator.c

        执行完上面的指令后,就进入了vi编辑界面。下面说说vi最基本的操作方法。进入编辑界面后,按i键就进入了“插入”模

式,按Esc 键就退出了“插入”模式。如此可以来回切换。

       不管哪种模式,都可以用光标键(←↑↓→)及Home、End、PageUp、PageDn键移动光标。这与图形方式下的操作习惯是一致

的。在“插入”模式下就可以输入字符了。可以用Delete 和BackSpace键删除字符。在非“插入”模式下可以执行一些带冒号的指

令。例如:w存盘,注意是输入一个冒号后面再跟一个字母w。还有一些其他指令,列举如下:

:wq 存盘并退出vi。

:q 退出vi。如果尚未保存,vi会提示,并拒绝退出。

:q! 不保存已做的修改,强制退出。

:g/str1/s//str2/g 寻找str2,并全都替换成str1。注意,s后面是两个斜杠(/)。如果斜杠(/)本身就是str1或str2中的字符,则加

前导反斜杠(\)区别。这一点对用vi编辑html文件的操作尤为有用。

要进行复制、粘贴、查找等操作,也必须在非“插入”模式下输入指令完成,这时输入的指令不带冒号。现列举如下:

y5y 包括光标所在行,往下数,复制5 行到内存。若只复制一行,可以不写数字。

y3w 复制光标后面的3 个英文单词。

p 小写,把剪贴板内容粘贴到光标之后。

P 大写,把剪贴板内容粘贴到光标之前。

d3d 包括光标所在行,往下数,剪切3行到内存。若只剪切一行,可以不写数字。接下若不进行粘贴操作,就相当于删除操作。

/str1 寻找字符串str1,str1就是要寻找的字符串。如果斜杠(/)本身就是str1中的字符,则加前导反斜杠(\)区别。

C程序编译和运行

       假设已经写好了一段C 程序,源代码文件是calculator.c。那么,如何把它编译成可执行文件呢?很简单,只需执行如下指

令即可。-o表示要指定可执行文件的名字,可执行的文件名是calc。gcc -o calc calcutlator.c如果编译成功,就可以执行这个程

序了。编译形成的可执行文件有5KB。./calc

用GNU gdb 调试

       如果编译时,使用下面的指令(增加了参数-g),就会生成带源代码调试符号的可执行文件。编译形成的可执行文件有7KB。之

所以增加了2KB,就是因为增加的调试符号。

gcc -o calc calcutlator.c -g

进一步地,就可以执行下面的指令启动调试工具进入调试环境对程序进行调试了。

gdb calc

在调试环境下,可以输入下列指令来控制调试。

l 28 第一个字母是小写的L,列出第28行附近的源程序。

b sum 在sum函数处设断点

b 25 在第25行处设断点

r 运行程序

n 单步执行,不进入函数

s 单步执行,进入函数

c 继续连续执行

p choice 显示变量choice 的值

q 退出调试环境

k 杀死程序

C++程序的编译

       假设用vi编写好了一个C++程序,源程序文件名为hello.cxx。如何编译?编译,指定生成的可执行文件名为hw。

g++ -o hw hello.cxx

带源代码调试符号进行编译。g++ -o hw hello.cxx -g

Kdevelop

安装和启动

        在红旗Linux4.1的开发工具盘中,提供了集成开发环境Kdevelop3.0.92。可以下载相应的ISO文件并利用其中的安装程序进

行安装。安装完成后,从开始菜单中就可以启动Kdevelop:【开始】→【应用程序】→【软件开发】→【Kdevelop】利用Kdevelop可

以编写C和C++程序,它把编辑、编译、调试和运行集成到一起,给编程工作带来很大方便。

基本步骤

       一般而言,用Kdevelop编程大体要经历如下几个步骤。编程是比较复杂的,很难一次成功,这些步骤可能要反复进行多次。

第一步,新建工程

       可以通过菜单操作启动相应的向导程序,借助它完成工程的初建工作。【Project】→【New Project】在新建工程过程中,

主要需要指定工程文件保存位置、工程名称、工程类型,并且可以填写编程作者的信息。根据所选工程类型(比如,是文本界面的程序

还是图形界面的程序,是C 程序还是C++程序),向导程序会自动生成一批模板文件。

第二步,编辑程序文件

       向导程序一般会创建一些程序文件,应该对这些文件进行编辑以满足特定的编程需要。还可以执行菜单操作来增加新的文件。

【File】→【New】上述操作后,会出现一个对话框,用于指定文件名和文件类型。根据文件类型的不同,会自动设定合适的扩展名。

注意,“Add to project”复选框应该勾选上以确保新文件被加入到当前的工程中。

第三步,生成源码结构

       在编辑好程序文件后,要先借助GNU Build System 生成系统生成源码结构。在增加了新文件(或目录)、修改了文件(或目录)

名、改变文件的保存位置之后,都应该重新生成源码结构。具体而言,生成源码结构包括autoconf、automake等操作,把每个子目录

的Makefile.am变成了Makefile.in。具有源码结构的程序文件包可以在任何UNIX、LINUX的系统上使用简单的命令(即

configure/make/make install等)进行配置、编译、连接和安装。可以执行菜单操作来生成源码结构:

【Build】→【Run automake&conf】

第四步,配置,即运行configure

       configure是一个脚本,用来确定所处系统的细节,比如使用何种编译器、何种库,以及编译器和库的保存位置,并把

Makefile.in的相应部分进行替换,形成Makefile。可以执行菜单操作来进行配置:【Build】→【Run configure】

第五步,编译连接

        执行菜单操作【Build】→【Built Project】即可完成编译连接,形成可执行文件。默认情况下,这种可执行文件是带有源

码调试符号的。对于多文件的程序,一般需要对每一个文件分别进行编译生成目标文件。当每个文件的编译通过之后,再统一进行编译

连接。单独编译当前正在编辑的文件的菜单操作是:【Build】→【Compile File】

第六步,运行

        如果想在KDevelop的控制下运行已编译连接好的程序,可以执行菜单操作:【Build】→【Excecute program】如果想单独

运行程序,则需要先安装,然后在命令行中输入相应的可执行文件的名字(一般来讲,就是工程的名字)即可。KDevelop会把可执行文

件放在/usr/local/bin之中【Build】→【Install】

例1 单文件面向过程C++编程

        有观点认为,非跨平台病毒在操作系统混合部署的环境中,其扩散速度比较低。这里要编写一个程序来模拟计算机病毒的扩

散过程,直观地验证这个观点。这里将使用C++语言。为简单起见,仍然使用面向过程的编程方法,程序文件也只有一个。学习本例

时,应着重理解用KDevelop编程的基本步骤。

问题陈述

        假设有一个封闭的环境,其中有计算机N 台。这N 台计算机都可以选择安装A或B种操作系统。有一种非跨平台病毒病毒,能

感染运行安装A操作系统的计算机。当染毒计算机与未染毒计算机交换时,此病毒将以概率pA 扩散。同理,设有另一种非跨平台病毒病

毒,能感染运行安装B操作系统的计算机,扩散概率为pB 。把操作系统单一部署2条件下的病毒扩散情况与两种操作系统按比例r:1 混

合部署时的{2即所有计算机都安装同一种操作系统}扩散情况进行比较。初始条件:设N=70, pA = pB =p=0.3, rO{0,1,2,3} ,

r=0 对应单一部署,其他对应混合部署;单一部署时,有两台计算机已经感染了病毒;混合部署时,每种操作系统的计算机各有一台

计算机已经感染了病毒。输出:用数值和图形来表示感染病毒的计算机总数和增量的变换情况。终止条件:当所有计算机都感染病毒

时,停止模拟。

设计

首先,定义一个TComputer类型的数组,每个元素代表一台计算机。TComputer是用户自定义类型,其中记录计算机上的操作系统类

型、以及是否感染了病毒等信息。应根据初始条件,对这个数组进行初始化。

       其次,定义一个模拟计算机交互的函数ComputerContact(),用以模拟任意两台计算机的交互。当这两台计算机的操作系统一

样,并且其中一台已经感染了病毒时,另一台计算机将以概率p感染病毒。为了方便,可以产生一个0 到9 范围内的随机数,当此随机

数小于p*10时,就认为病毒扩散了。

第三,可以产生两个小于N 的互不相等的随机数,来确定一次交互中的两台计算机。

编写程序文件

        通过菜单操作【Project】→【New Project】启动新建工程向导程序,选择工程类型,并指定工程名称及其保存位置,如图

所示。接下来一路点击Next即可完成工程的创建工作。

向导程序会自动生成一个含有主函数的文件。以此文件是一个模板,在它的基础上修改并添加代码,即可编写需要的程序。本例的源程

序见linuxv-viruspread-0.0.1.tar.gz中的/src/viruspread.cpp。

编译

程序写好后,应该把文件保存起来,然后按照前面提到的步骤,生成源码结构、配置、编译,即依次执行如下菜单操作:

【Build】→【Run automake&conf】
【Build】→【Run configure】
【Build】→【Compile File】

        每一个操作若能正常完成,在Messages 窗口中会出现Success的提示。如果没有Success 的提示,则表明相应的操作失败,

应查明原因。一般来讲,生成源码结构和配置这两个操作都能顺利通过。如果编译连接是首次进行,则一般会失败,因为很少有人能一

次写出没有任何语法错误的程序。查看Messages窗口中的提示信息,可以了解哪些地方出现了语法错误。单击某一条错误提示信息,

KDevelop会自动把光标定位到发生该错误的语句上。依据错误提示,修正程序中的语法错误,然后再次尝试编译,直到出现Success的

提示。经常出现的一种情况是,程序上的一个语法错误会导致多条错误信息的出现。因此,应该把第一条错误信息认真处理好,再从随

后的错误信息中随机选择几条加以处理,然后就再次尝试编译,看还有没有错误信息。如此反复多次,直到把所有的错误提示消除掉,

编译就成功了。不要把所有错误信息都依次处理完再尝试编译,那样的效率比较低。

生成可执行文件

  编译成功后,执行菜单操作【Build】→【Built Project】即可生成相应的生成可执行文件。本例的可执行文件见viruspread 。

调试

        接下来,可以执行菜单操作【Build】→【Excecute program】试运行程序。这种运行是在KDevelop的控制下进行的。因

此,如果出现“死循环”,可以执行菜单操作【Build】→【Stop】或按Esc 键即可中止程序的运行。如果在程序中存在逻辑错误,就

得不到期望的结果。逻辑错误的排除比较困难。必须对程序进行仔细的分析才能找到错误的原因。

       一般的逻辑错误可以根据程序的运行表现加以判断。比较深层次的逻辑错误则需要借助调试工具。本章前面介绍的调试工具

GNU gdb就是一个很好的工具,可以用它对程序进行仔细分析,查找逻辑错误的根源。默认情况下,经过【Build】→【Built

Project】操作之后,可以在工程目录下的/debug/src/中找到带源代码调试符号的可执行文件。发现逻辑错误后,就要修改程序,重

新编译连接。然后再试运行。如果仍然得不到期望的结果,说明程序中还有逻辑错误,应再次进行分析。如此反复多次,直到消除全部

的逻辑错误。

发布可执行文件

如果只想发布程序的可执行文件,可以先调整项目的编译连接选项,选择优化编译的方式。这样可以得到更小更快的可执行文件。

可以通过菜单【Project】→【Build Configuration】修改编译连接选项。此菜单之下有三种选项,默认为Debug,生成的可执行文

件中含有源程序调试符号;还可以选择Default或Optimized。选择Optimized时,编译连接时将进行优化,生成的可执行文件更小,

执行起来也更快。

        选择Debug时,可执行文件保存在工程目录下的/debug/src/中;选择Optimized时, 可执行文件保存在工程目录下的

/optimized/src/中;选择Default时, 可执行文件保存在工程目录下的/src/中。对于本例,三种选择所生成的可执行文件的大小差

别很大。选择Debug 时,93kb;选择Default时,42kb ;选择Optimized 时,只有8.8kb(见viruspread)。因此,如果要发布可执

行文件,应该选择Optimized的方式进行编译连接。

发布源程序

        把工程目录及其中的所有文件打包即可形成源程序包。linuxv-viruspread-0.0.1.tar.gz是本例的源程序包。用户得到这

个源程序包并解压后,不必安装KDevelop 就可以按标准方法进行编译和安装,即支持configure,make,make install,make

clean,make uninstall等命令。这个包也含有KDevelop的工程文件和其他相关的信息。因此,如果用户安装了KDevelop,可以直接

打开该工程进行修改。

例2 多文件面向对象的C++程序

        前例程序中虽然有一些C++的成分,但程序的设计思想还是面向过程的。本例将采用面向对象的思想对其进行改进。对象是

C++中非常重要的成分。面向对象的编程往往可以使程序设计更直观,更简捷。

设计

       首先,定义一个CComputer对象数组,每个对象代表一台计算机。CComputer是用户自定义的类,其属性包括操作系统类型和

所染病毒的传染概率(用0 到9 范围内的整数表示,0 代表无病毒),成员函数Contact()则用于模拟与其他计算机的交互。当一台染毒

计算机与另一台计算机未染毒计算机进行交互时,病毒将扩散。为了方便,可以产生一个0到9范围内的随机数,当此随机数小于染毒计

算机的传染概率时,就认为病毒扩散了。其次,在主函数中产生两个小于N 的互不相等的随机数,来确定一次交互中的两台计算机。

编写程序文件

        创建工程的操作与前例相同。这里将工程命名为virus_os。除了向导程序自动生成的那个含有主函数的文件virus_os.cpp

外,还应该增加两个新文件,即ccomputer.h和ccomputer.cpp,前者是含有CComputer类声明的头文件,后者含有CComputer类的实

现方法。执行菜单操作【File】→【New】即可增加新文件。注意在对话框中输入正确的文件名和文件类型,并且“Add to

project”复选框应该勾选上。本例的源程序见linuxv-virus_os-0.0.1.tar.gz中的/src

编译

         程序写好后,依前例进行生成源码结构、配置、编译等操作即可。这个工程包括三个文件。执行菜单操作

【Build】→【Compile File】只是对当前的文件进行编译。这为分别排除每个文件的语法错误提供了方便。

其他

编译成功后,即可依前例进行“生成可执行文件、调试、发布可执行文件、发布源程序”等操作,就不再赘述了。本例的可执行文件见

virus_os。

例3 改进程序

       如果得到了某个用KDevelop开发的软件的全套工程文件,可以很容易地对其进行升级,然后发布新的版本。下面举例说明。取

得linuxv-virus_os-0.0.1.tar.gz后,解压缩形成一个目录,virus_os-0.0.1的全套工程文件就保存在其中。启动KDevelop,然后

执行【Project】→【Open Project】,找到virus_os.kdevelop并打开它,相应的工程也就打开了。调试成功后,可以按前面提到

的方法发布修改后的软件即可。在发布前应修改版本号。修改方法是,执行菜单操作【Project】→【Project Options】,在随后出

现的工程属性窗口中进行修改即可。

例4 使用已有的源文件

前例的程序还有改进的余地:在CComputer类的基础上创建一个病毒扩散类CViruSpread 来模拟病毒扩散。当需要模拟不同计算机数

量、不同操作系统布置比例以及不同病毒扩散概率条件下的病毒扩散情况时,就可以通过创建相应的对象来进行了。

       新建工程virusimulator,创建CViruSpread 的文件cviruspread.h 和cviruspread.cpp。这里需要把ccomputer.h 和

ccomputer.cpp 两个文件添加到本工程中来。操作方法:在KDevelop 主窗口的右侧有一个Automake Manager标签。点击该标签,就

可以看到本工程源文件所在的文件夹以及各文件。在列有文件的那个窗口上方有工具条,其中就是用来添加文件的。添加文件有两种方

式,一种是链接(link)方式,另一种是复制(copy)方式。

          本例的源程序见linuxv-virusimulator-0.0.1.tar.gz中的/src,可执行文件见virusimulator。

点击进入下一章的学习

下一章的学习内容:搭建个人网站

推荐主题:

Linux实用培训学习教程1.0(最终版)下载:http://www.linuxdiyf.com/zs/sj.htm
Linux教程及Linux资料下载:http://www.linuxdiyf.com/bbs/forum-6-1.html
Linux技术文章及解答Linux疑问专区:http://www.linuxdiyf.com/bbs/forum-3-1.html
安装Linux及学习Linux指导:http://www.linuxdiyf.com/bbs/forum-3-1.html
获取Linux荣誉证书:http://www.linuxdiyf.com/zs/


        

   Linuxdiyf.com
红联Linux论坛 关于我们 联系我们 本网解释权归红联论坛,如有不妥请来信告之,我们将做一处理