魅力博客

魅力Linux|魅力空间|魅力博客|学习Linux|ubuntu日记|电脑教程|手机软件

linux教程 基于文本的C/C++



基于文本的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安装和启动

在红旗Linux的开发工具盘中,提供了集成开发环境Kdevelop3.0.92。可以下载相应的ISO文件并利用其中的安装程序进行安装。安装完成后,从开始菜单中就可以启动Kdevelop:【开始】→【应用程序】→【软件开发】→【Kdevelop】利用Kdevelop可以编写C和C++程序,它把编辑、编译、调试和运行集成到一起,给编程工作带来很大方便。

Kdevelop基本步骤

一般而言,用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】

Kdevelop

例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。



返回顶部

发表评论:

Powered By Z-BlogPHP 1.7.3


知识共享许可协议
本作品采用知识共享署名 3.0 中国大陆许可协议进行许可。
网站备案号粤ICP备15104741号-1