对比python学julia(第一章)--(第五节)八十天环游地球

5.1.  问题描述

  《八十天环游地球》是法国作家儒勒·凡尔纳创作的一部长篇小说,讲述了这样一个神奇的故事。

  在1872年的伦敦,英国绅士福格跟俱乐部的朋友以巨资打赌他能在80天实现环游地球。在人们的质疑中,他带着新雇佣的仆人“万事通”从伦敦出发了。一路上,他们乘坐的是邮轮、蒸汽火车、马车、大象等交通工具,还经历了密探追捕、恶僧捣乱、印第安人劫车、海浪肆虐……眼看约定的时间就要到了,福格竟然奇迹般地回到了伦敦。

  福格的环球路线:伦敦苏伊士→孟买→加尔各答→新加坡亠中国香港→横滨→旧金山→纽约→亠伦敦,总行程约40000km。其中,走水路穿越地中海、红海、印度洋、太平洋和大西洋,行程约32000km;走陆路穿越法国、意大利、印度次大陆、北美大陆,行程约8000km。

如果使用现在的交通工具重走一次福格环球路线,在理想情况下需要多少天?请编写一个程序,只要输入水路和陆路的前进速度,就能计算岀福格环球路线需要的时间。

5.2.  算法分析

  虽然福格的环球路线曲折复杂,时而坐轮船横渡大洋,时而乘火车穿越大陆,但是归纳起来就是水路和陆路两种。已知福格环球路线的水路行程约32000km、陆路行程约8000km,只要分别计算水路和陆路需要的时间,再把两者相加即可,使用如下公式表:

环球时间=水路行程÷水路速度十陆路行程÷陆路速度

  这个程序要求水路和陆路的速度由外部输入。一般来说,外部输入指的是使用键盘输入数据,这样程序就能根据输入的数据进行运算,变得很灵活。

5.3.  编程解题

  编写程序通常可以分为3个步骤,即输入数据、处理数据和输出数据。下面将按这3个步骤进行编程,计算福格环球路线需要的时间。

  首先来看python程序:

  

 1 #输入数据
 2 water_speed= input('请输入水路前进时速km/h:’)
 3 land_speed= input('请输入陆路前进时速km/s:’)
 4 #处理数据
 5 water_speed =int(water_speed)
 6 land _speed =int (land _speed)
 7 hours=32000/water speed+ 8000/land speed
 8 days=round (hours/24, 1)
 9 #输出数据
10 print(‘按福格路线环游地球要'+str(days)+’天’)

  再来看julia代码该怎么写。

  1. 在上一节“冰雹猜想”中,我们已经知道,对应python的input函数的julia函数是readline,它接受控制台输入。然而要想实现input(>在上一节“冰雹猜想”中,我们已经知道,对应python的input函数的julia函数是readline,它接受控制台输入。然而要想实现input('请输入水路前进时速km/h:)这样的效果,julia需要两行代码:
    print(“请输入水路前进时速km/h”)
    water_speed=readline()
  2. 第5-8行计算水路和陆路需要的时间。我们可以看到water_speed>第5-8行计算水路和陆路需要的时间。我们可以看到water_speed=int(water_speed)时会发现,python的变量是无类型的,赋值给它的值是什么类型,它就是什么类型。事实上,python的变量相当于一个容器,里面放的是数据。相同的,julia也继承了这种特性,它的变量也是无类型的。其次int()是一个类型转换,将字符串转换位整数类型。julia必须用转换函数里实现:water_speed =parse(Int, water_speed),因为在julia中Int()函数是获取一个字符的Unicode code值,例如Int(‘3’)得到的是51,注意括号里面的单引号,不能用双引号,以及Int函数的首字母大写。。第8行在这行代码中,使用 round()函数对 hours/24的计算结果进行四舍五入,并保留1位小数。Julia中也是用round()函数,但是书写方式是这样的:days=round(hours/24;digits=1),注意括号里面的“;”,不是“,”。
  3. 第9行是计算结果的输出。注意其中str()函数将整数类型的变量days转换得到一个字符串,再用加号(十)把几个字符串拼接成为一个字符串,作为这个程序的处理结果。在 Julia 中,可以用string()函数,字符串拼接用的是操作符( * ),而不是( +)。之所以julia与大多数编程语言用(+)作为字符串连接符,是因为Julia 语言的缔造者们是站在抽象代数的角度来看待这一问题的。在抽象代数中, (+ )通常被用在那些满足交换律的运算中,而 (*) 常常被用在不满足交换律的运算中。对于字符串拼接来说, "A" 拼接 "B" 与 "B" 拼接 "A" 肯定不是一回事,一定会得到不同的结果。所以,操作符 (* )理应被用在这里。
  4. 在VSCODE中编写julia代码并运行:先在windows资源管理器中新建一个文件夹,例如:F:\work\me\julia,然后打开VSCODE,从“文件”菜单中或左侧的资源管理器中打开刚才建的文件夹,再新建一个文件hydq.jl,并在打开的编辑器中输入以下代码:
 1 #输入数据
 2 println("请输入水路前进时速km/h:")
 3 water_speed= readline()
 4 println("请输入陆路前进时速km/s:")
 5 and_speed= readline()
 6 #处理数据
 7 water_speed =parse(Int,water_speed)
 8 land_speed =parse(Int,land_speed)
 9 hours=32000/water_speed+ 8000/land_speed
10 days=round(hours/24;digits=1)
11 #输出数据
12 println("按福格路线环游地球要"*string(days)*"")

  在VSCODE“运行”菜单下,选择“以非调试方式运行”,可以得到如下结果:

请输入水路前进时速km/h:

50

请输入陆路前进时速km/s:

200

按福格路线环游地球要28.3天

大家通过上面的代码,可能会觉得julia要用两行代码才能实现python的input()函数相同的功能。如果需要多次输入,显得比较繁琐。那我们是否可以自己实现这个函数,在用到的时候调用它呢?当然可以,看下面的代码:

function input(prompt::String="")::String
    print(prompt)
    return chomp(readline())
end

  调用方式可以这样:

 water_speed = parse(Int, input("请输入水路前进时速km/h:")) 

  这就是所谓的自定义函数,在后面的章节中我们会具体介绍。敬请期待!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章