close

最近在學怎麼用vi 寫小程式。

vi 是Unix/Linux 眾多變種系統中,地位猶如"筆記本"之於比爾蓋茲的文書處理軟體,他所占用的資源很少,可以做很多事情,最重要的是,在瞬息萬變的Unix/Linux 世界裡面,它是唯一一個像蟑螂一樣從史前時代就一直存活到現在的編輯軟體。簡單說,它就像蟑螂一樣小,也像蟑螂一樣運作迅速,更像蟑螂一樣可以適應任何大環境(OS),vi(vim)基本上就是POSIX(Portable Operating System Interface) 系統裡面的超級小強!

這也是我們愛用它的原因。

很基礎,一點都不難。

而且就像是蟑螂之於這個世界,所有人都認識它一樣,不認識vi,別說你玩過Unix/Linux。

--

扯遠了。

下面要來解釋一下,怎麼用vi 寫一個簡單的小計算機出來。有寫過C或者是C++的人應該一看就懂,沒寫過的人應該也不難懂。不過這本來就不是讓別人懂的東西,只是讓自己不要忘記所做的網路備份而已。我可不想要哪一天倒霉,遠端主機跟家裡電腦都沒有檔案卻要交作業的時候還要浪費時間打一份。太累了。

 

題目是這樣的:

Alex, Joe, and Milap work at TouchHi cellphone software solution company. They’re arranged the first team project in 2009. 

 

First of all, as the first basic user interface among the cell phone interfaces, they must make a small calculator.

The manager wants them to show +(addition), -(subtraction), *(multiplication), /(division) with 2 numbers.

If a customer divides by 0, you should show error messages.

 

 

You must use shell arrays, variables, and quotations.

(If you want, you can use if statement to calculate the number like the following formats)

 

The format of output must be:

 

           $./TouchHi add 1 2

        ------------------------------------------

The addition of 1 and 2 is:     3

        ------------------------------------------

 

$./TouchHi subtract 1 2

        ------------------------------------------

The addition of 1 and 2 is:     -1

        ------------------------------------------

簡單說,就是一定要用array,一定要有變數,也一定要做引用。

很簡單的東西幹嘛搞得這麼複雜?相信我,如果你的老師也要你寫這樣的作業,他大概是找你麻煩;因為幫我上課的老師在出題目前一星期,才被學生向辦公室投訴英文太差沒人聽得懂。

anyway, 大致上解答都在下面。

#!/bin/bash
#Programming Purpose: Using two numbers which user enters to operate.
#Don't be STUPID to CHEAT your teacher please, you lean what you are spending time on, not from copy and paste.
以上這三行,前面都有一個#字號,基本上跟C或者是C++的//雙斜線用處很像,在執行程式的時候,都會被略過(屏蔽掉了),不被執行。所以任何廢話,或者是那些你覺得需要提醒你自己一下,以免將來除錯的時候累死自己的東西,都可以用這種方式寫上去。下面的說明,我也會在前面都加上#,以確保各位可以直接拿來執行。


read -p "Please input (Y/N): " yn

#上面這一行的作用,就是把輸入的字元跟你自己設的變數關連起來。read -p "<你想要跟操作者說的話:>" <變數>
if [ "$yn" == "N" -o "$yn" == "n" ]; then

#上面這一行的作用,.就是很標準的if 條件判斷;如果變數yn 等於大寫N或者是小寫n,接著...如果電腦會說話,它一定一邊翻白眼一邊這樣說。

#下面這一行echo ,就是滿足上述條件之後,電腦將會做的事情。我這樣寫的話,就會輸出Thank you for choosing TouchHi! 這一段文字,以及結束程式。順便說&&就是and,-o是 or的意思,也可以用 || 兩條直線代替可是如果用|| 兩條直線代替,那一開始的條件事就必須寫成 if [ "$yn" == "N" ] ||[ "$yn" == "n" ]; then 才可以。

echo "Thank you for choosing TouchHi!" && exit 0
elif [ "$yn" == "Y" -o "$yn" == "y" ]; then

#elif 是else if 的縮寫,也就是另外,如果的意思,之後一樣可以用echo放進你想要機器運作的東西。順便說,在使用 if 的時候,當所有的條件都執行完了,最後面一定要有一個終止判斷的fi (把if 倒過來寫而已,end if的意思)。
echo "Let's Rock!"


echo -e "Enter two number you want count please: "
read -p "First number:" a[1]
read -p "Second number:" a[2]

#上這三行,第一行是提醒使用者準備輸入要求,第二行第三行是輸入要求,並且把輸入的值跟我設計的變數關連起來。在這一行裡面,a[1], a[2]就是我設的變數,你也可以攝很簡單的x,不過因為本次題目要求要用array,所以只好設成a[1]或者是a[2]。這就是為什麼我說老師找麻煩的原因,設x不但不用打這麼多字,後面的操作也沒有這麼麻煩...。




adding=$((a[1]+a[2]))
Subtraction=$((a[1]-a[2]))
Multiplication=$((a[1]*a[2]))
Dividing=$((a[1]/a[2]))

#然後,上面這四行,分別是把加減乘除的結果設成四個變數,為了做比對,我直接用一般變數去設定,然後等一下在寫的時候,你就會發現直接設變數簡單很多。
#下面,開始一樣是執行條件式,然後輸出我要的結果。

        if [ "${a[2]}" == "0" ]; then
                echo -e "TouchHi addtion ${a[1]}, ${a[2]}\n----------\nTouchHi Add ${a[1]} and ${a[2]} = $adding\n----------\n"
                echo -e "TouchHi subtraction ${a[1]}, ${a[2]}\n----------\nTouch Subtracte ${a[1]} and ${a[2]} = $Subtraction\n----------\n"
                echo -e "TouchHi multiplication ${a[1]}, ${a[2]}\n----------\nTouch multiplicate ${a[1]} and ${a[2]} = $Multiplication\n----------\n"
                echo -e "The division failed because of the divisor equal 0\n\n\a"
        else
                echo -e "TouchHi addtion ${a[1]}, ${a[2]}\n----------\nTouchHi Add ${a[1]} and ${a[2]} = $adding\n----------\n"
                echo -e "TouchHi subtraction ${a[1]}, ${a[2]}\n----------\nTouch Subtracte ${a[1]} and ${a[2]} = $Subtraction\n----------\n"
                echo -e "TouchHi multiplication ${a[1]}, ${a[2]}\n----------\nTouch multiplicate ${a[1]} and ${a[2]} = $Multiplication\n----------\n"
                echo -e "The division failed ${a[1]}, ${a[2]}\n----------\nTouchHi divide ${a[1]} and ${a[2]} = $Dividing\n----------\n"


        fi

#從if 到 fi ,你可以很清楚的看到完整的if... then...條件式。如果不符合A方案,就照著B方案去做。當然你也可以有C方案,D方案或者更多的方案,不過這麼複雜就要用到elif;或者乾脆點用case判斷搞不好更快...。然後是變數的寫法,我剛剛有說a[1]是array的模式對不對,一般變數名稱可以是x, y, z 這種容易搞錯的簡單數學代號,也可以是很完整像是adding這樣,拎杯一看就知道的名稱,不管是哪一種都好,我都可以直接用$<變數名稱>來表示,可是如果,我需要用到array去當作變數關連一個值,那當我要輸出的時候,就必須用${<array名稱>}這樣的方式去表示。第一不夠直觀,第二多按兩個鍵,因為要加上括號。沒錯,麻煩死了= = ||

 #anyway, echo -e的意思就是,"...."裡面的內容,可以用 \n 或者是 \a 來做簡單的區隔,\n 的意思是換行,\a 的意思是alarm(警告聲),另外比較常用的應該是 \t,鍵盤上tab的意思。兩個要注意的地方是不管是 \n, \a, 還是 \t,別忘記都是反向的斜線 \;另外沒有加上操作參數 -e 的echo 沒辦法自動換行,自動對齊,當然也不會像聖誕老公公的麋鹿一樣跑過去還會叮叮噹噹響。


#基本上,題目到剛剛就已經差不多完成了,我也是學生,恐怕沒有做得很完美...。但不管如何,我覺得啊!只有辦法把所有結果一次輸出的程式很蠢,你看過可以把所有加減乘除都一次列出來的計算機嗎?那要多少行才寫得完?計算機當然就是讓使用者自己選要加減乘除才好用啊!所以我下面寫了一段用case的表達方式,這樣就可以自己選加減乘除了。

read -p "please enter the number 1 for addition, 2 for subtraction, 3 for Multiplication, or 4 for division to choose the function: " FunctionPick

#上面這一行主要事先設FunctionPick為<變數名稱>



case $FunctionPick in
        "1")
        echo -e "\n\nThe result of ${a[1]} + ${a[2]} = $adding\n\n"
        ;; #case結束之後用兩個冒號當句點。


        "2")


        echo -e "\n\nThe result of ${a[1]} - ${a[2]} = $Subtraction\n\n"
        ;;
        "3")
        echo -e "\n\nThe result of ${a[1]}* ${a[2]} = $Multiplication\n\n"
        ;;
        "4")
        if [ "${a[2]}" == "0" ]; then
        echo -e "\n\nError! The divisor has to big than 0!\n\n\n\n\n\n\a"
        else
        echo -e "\n\nThe result of ${a[1]} / ${a[2]} = $Dividing\n\n"
        fi
        ;;
esac #跟if 結束的時候一樣,case結束符號也是倒過來寫的esac(聽說某崇拜撒旦的邪教,經文也都道過來寫的XDDD)


else #最後不要忘記這個else,忘記大概就沒有辦法執行了= = 
echo -e "Please Enter N/n(NO) or Y/y(Yes)"
fi #這個 fi 也是,忘了就掰掰了XDD

 

以上,大致上結束了。

東西我當然都測試過了,不能用的話請將我的中文說明通通拿掉。

那種東西看得懂就好,不需要寫在作業上面。

然後?如果還是看不懂的話,請google 鳥哥+你不懂的關鍵字

比如說 鳥哥 if 這樣。

鳥哥是很屌的人,華人圈裡面他未必最厲害,可是網路上會用Unix的人裡面,他的網站應該是最出名的幾個。當然東西也多,盛名之下無虛士嘛!哈哈哈!

arrow
arrow
    全站熱搜

    archerdevil 發表在 痞客邦 留言(1) 人氣()