《趣题学算法》—第0章0.7节算法的程序实现

0.7 算法的程序实现
有了解决问题的正确算法,就可以利用一种计算机程序设计语言将算法实现为可在计算机上运行的程序。本书选用业界使用最广泛、最成熟的C++语言来实现解决每一个问题的算法。C++语言是面向对象的程序设计语言,它为程序员提供了一个庞大的标准库。有趣的是,C++脱胎于C语言。所以,读者若具有C语言某种程度的训练,对于理解本书提供的C++代码一定是大有裨益的。闲话少说,让我们先来一睹C++语言程序的“芳容”吧。

解决问题0-1“计算逆序数”的C++程序如下。

1 #include <fstream>
2 #include <iostream>
3 #include <vector>
4 using namespace std;
5 int getTheInversion(vector<int> A){
6   int N=int(A.size());
7   int count=0;
8   for (int j=N-1; j>0; j--)
9       for (int i=0; i<j; i++)
10        if(A[i]>A[j])
11          count++;
12   return count;
13 }
14 int main(){
15     ifstream inputdata("Get The Inversion/inputdata.txt");//输入文件流对象
16     ofstream outputdata("Get The Inversion/outputdata.txt");//输出文件流对象
17     int N=0;
18     inputdata>>N;
19     while (N>0) {
20         vector<int> A(N);
21         for (int i=0; i<N; i++)
22                inputdata>>A[i];
23         int result=getTheInversion(A);
24         cout<<result<<endl;
25         outputdata<<result<<endl;
26         inputdata>>N;
27    }
28    inputdata.close();
29    outputdata.close();
30    return 0;
31 }

程序0-1 实现解决“计算逆序数”问题算法的C++程序

关于C++语言的各种细节(语言基础、支持语言的库、运用语言的各种技术等),我们将在本书的第9章,通过实现本书中算法的实际代码展开讨论。此处,我们仅仅借程序0-1做一个初步的认识。

我们可以把程序分成三部分观察。第一部分就是程序中的第1~4行,执行预编译指令。第二部分是第5~13行的函数getTheInversion定义。第三部分是第14~31行,程序的主函数。下面我们就这三个部分逐一加以简单说明。

① #include指令用来为程序引入“库”——包含各种已定义的数据类型、类、函数等,实现优质代码的重用,以提高程序设计的工作效率和程序的质量——搭建一座方便之桥。由于C++中任何运算成分(类型、变量、常量、函数……)均需先声明、后使用,所以头文件中就声明了一组程序所需的具有特殊意义的运算成分。用include指令将指定的头文件加载进来,程序员就可以方便地访问这些成分了。此处,首行指令#include 意味着本程序可以使用系统提供的文件输入输出流类的对象,方便地输入、输出数据。本书中所有算法的实现代码涉及输入输出的操作都需要进行文件的读写操作,所以这条指令将出现在每一个程序文件的首要位置。后面的两条分别引入控制台输入输出对象(cin、cout)和向量类(vector,这是C++标准模板库STL提供的可变长数组类模板)。这些类、对象的引入给大家带来了极大的方便。语句using namespace std(语句以分号结尾)指出,以上引入的类或对象都是标准库中的,可按名称直接访问。

② 细心的读者可能已经发现,第5~13行定义的函数int getTheInversion(vector A)就是对算法0-1中伪代码过程GET-THE-INVERSION(A)的实现。除了某些细节,程序代码与伪代码几乎是一样的。如果你也有这样的感觉,我们就有了一种默契:只要有了伪代码,我们就能很快地写出它的实现程序——算法伪代码就是程序开发的“施工蓝图”。

③ 第14~31行定义的main函数也就是我们在算法0-1之前描述的“计算逆序数”问题数据的输入与输出的伪代码的实现。如果了解到“>>”和“<<”是C++数据流(文本文件就是一个数据流)的输出、输入操作符,则会感觉到这段代码几乎就是伪代码的翻版。

程序0-1存储为文件夹Get The Inversion的文件Get The Inversion.cpp。读者要在计算机上运行这个程序,需要在你的计算机上安装一个C++开发软件(譬如,在PC上安装一个Visual C++软件,在iMac上安装一个Xcode),然后创建一个项目,在其中加载文件laboratory/Get The Inversion/Get The Inversion.cpp。

同样,解决问题0-2“移动电话”的C++程序是存于文件夹laboratory/Mobil Phone中的文件Mobil Phone.cpp。

时间: 2024-10-14 20:08:48

《趣题学算法》—第0章0.7节算法的程序实现的相关文章

《趣题学算法》—第0章0.1节App程序与算法

第0章 从这里开始趣题学算法0.1 App程序与算法 0.2 计算问题 0.3 算法的伪代码描述 0.4 算法的正确性 0.5 算法分析 0.6 算法运行时间的渐近表示 0.7 算法的程序实现 0.8 从这里开始 0.1 App程序与算法信息时代,人们时刻都在利用各种App解决生活.工作中的问题,或获取各种服务.早晨,手机里设定的闹钟铃声(或你喜欢的音乐)将你唤醒.来到餐厅,你用手中的IC卡到取餐处的刷卡机上支付美味早餐的费用.上班途中,打开手机上的音乐播放器,用美妙的乐声,打发掉挤在公交车上的

《趣题学算法》—第1章1.1节累积计数法

第1章 计数问题 趣题学算法 1.1 累积计数法 1.2 简单的数学计算 1.3 加法原理和乘法原理 1.4 图的性质 1.5 置换与轮换 人类的智力启蒙发端于计数.原始人在狩猎过程中为计数猎获物,手指.结绳等都是曾经使用过的计数工具.今天,我们所面对.思考的问题更加复杂.庞大,计数的任务需要强大的计算机来帮助我们完成.事实上,很多计算问题本身就是计数问题. 1.1 累积计数法 这样的问题在实际中往往要通过几个步骤来解决,每个步骤都会产生部分数据,问题的目标是计算出所有步骤产生数据的总和.对这样

《趣题学算法》目录—导读

版权 趣题学算法 • 著 徐子珊 责任编辑 张 涛 • 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn • 读者服务热线:(010)81055410 反盗版热线:(010)81055315 内容提要 趣题学算法 本书共分10章.第0章讲解了算法的概念及体例说明.第1-7章分别就计数问题.信息查找问题.组合优化问题.图中搜索问题和数论问题展开,讨论了算法的构思和设计,详

《趣题学算法》—第0章0.3节算法的伪代码描述

0.3 算法的伪代码描述 上一节最后一段使用自然语言(汉语)描述了解决"计算逆序数"问题的算法.即如何将输入数据转换为输出数据的过程.在需要解决的问题很简单的情况下(例如"计算逆序数"问题),用自然语言描述解决这个问题的算法是不错的选择.但是,自然语言有一个重要特色--语义二岐性.语义二岐性在文学艺术方面有着非凡的作用:正话反说.双关语--.由此引起的误会.感情冲突--带给我们多少故事.小说.戏剧--.但是,在算法描述方面,语义二岐性却是我们必须避免的.因为,如果对

《趣题学算法》—第0章0.6节算法运行时间的渐近表示

0.6 算法运行时间的渐近表示由于计算机技术不断地扩张其应用领域,所要解决的问题输入规模也越来越大,所以对固定的n来计算T(n)的意义并不大,我们更倾向于评估当n→∞时T(n)趋于无穷大的快慢,并以此来分析算法的时间复杂性.我们往往用几个定义在自然数集N上的正值函数Ỹ(n):幂函数nk(k为正整数),对数幂函数lgkn(k为正整数,底数为2)和指数函数an(a为大于1的常数)作为"标准",研究极限 lim_{ntoinfty}frac{T(n)=lambda }{widetilde{Y

《趣题学算法》—第0章0.5节算法分析

0.5 算法分析解决同一问题的不同算法所消耗的计算机系统的时间(占用处理器的时间)和空间(占用内部存储器空间)资源量可能有所不同.算法运行所需要的资源量称为算法的复杂性.一般来说,解决同一问题的算法,需要的资源量越少,我们认为越优秀.计算算法运行所需资源量的过程称为算法复杂性分析,简称为算法分析.理论上,算法分析既要计算算法的时间复杂性,也要计算它的空间复杂性.然而,算法的运行时间都是消耗在已存储的数据处理上的,从这个意义上说,算法的空间复杂性不会超过时间复杂性.出于这个原因,人们多关注于算法的

《趣题学算法》—第1章1.2节简单的数学计算

1.2 简单的数学计算以上那样利用循环重复将部分数据简单地累加,可以解决很多计数问题.然而,如果计数问题可以通过数学计算直接得出结果,往往可以大大改善算法的时间效率,请看下列问题. 问题1-5 小小度刷礼品图片 7 问题描述 一年一度的百度之星大赛又开始了,这次参赛人数创下了吉尼斯世界纪录.于是,百度之星决定奖励一部分人:所有资格赛提交ID以x结尾的参赛选手将得到精美礼品一份. 小小度同学非常想得到这份礼品,于是他就连续提交了很多次,提交的ID从a连续到b.他想知道能得到多少份礼品,你能帮帮他吗

《计算机科学概论(第12版)》—第0章0.4节算法

0.4.1 算法数据存储容量有限,程序设计过程复杂耗时,这些限制了早期计算机器所能处理的算法的复杂性.如今,随着这些局限性的消除,机器能完成的任务越来越大.越来越复杂.人们试图用算法表达这些任务,但单凭人类的智力无法做到,于是,越来越多的研究工作转向了算法和程序设计过程的研究. 正是在这种背景下,数学家的理论研究开始有了回报.由于哥德尔不完备性定理,数学家已经在研究有关算法过程的问题了,而这正是先进技术目前面临的问题.由此,孕育出了被称作计算机科学的这门学科. 如今,计算机科学已经奠定了它算法科

《编程珠玑(第2版•修订版)》—第2章2.8节变位词程序的实现(边栏)

2.8 变位词程序的实现(边栏)⑪ 我的变位词程序按三个阶段的"管道"组织,其中一个程序的输出文件作为下一个程序的输入文件.第一个程序标识单词,第二个程序排序标识后的文件,而第三个程序将这些单词压缩为每个变位词类一行的形式.下面是一个仅有6个单词的字典的处理过程. 输出包括三个变位词类. 下面的C语言sign程序假定没有超过100个字母的单词,并且输入文件仅包含小写字母和换行符.(因此我使用了一个一行的命令对字典进行预处理,将其中的大写字母改为小写字母.) int charcomp(c