對比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:")) 

  這就是所謂的自定義函數,在後面的章節中我們會具體介紹。敬請期待!

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