2014-10-17 59 views
-1

我想這樣做Clojure中:如何在Clojure中的函數內部有多個if語句?

int i=1;j=2;k=3; 
str r; 
cin>>r; 
if(r=="A") 
cout<<i; (i.e., print 1) 
if(r=="J") 
cout<<j; (i.e., print 2) 
if(r=="K") 
cout<<k; (i.e., print 3) 
else 
do something else 

我做它像這樣用Clojure:

(defn str-to-num [c] 
    (if (= (str (first c)) "A") 
     1 
    (java.lang.Integer/valueOf (str (first c)))) 

(if (= (str (first c)) "J") 
     2 
    (java.lang.Integer/valueOf (str (first c)))) 

(if (= (str (first c)) "K") 
     3 
    (java.lang.Integer/valueOf (str (first c)))) 

) 

但是,我發現了一個錯誤。有人可以告訴我做錯了什麼嗎?

+0

什麼是錯誤您收到? – munk 2014-10-17 02:23:45

+0

NumberFormatException對於輸入字符串:「A」java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) – 2014-10-17 02:26:51

+0

如果我只有一條if語句,只說:(if(=(str(first c))「A」) (java.lang.Integer/valueOf(str(first c)))) 然後它工作正常。發生了什麼? – 2014-10-17 02:27:32

回答

2

所有的if塊都會一個接一個地運行,而不管它們中的哪一個返回。如果你想要if/else/chaining,你應該使用condcase(儘管標準的兩個分支如果只有兩個選項可以正常工作)。

你的前兩個如果塊不能做任何有意義的事情,除了拋出一個錯誤。這正是大多數投入會發生的情況。

「A」,「J」和「K」不是有效的數字,所以試圖解析它們會引發錯誤。

此函數可以做的唯一有意義的事情是將字符串的第一個字母作爲數字返回,如果它可以作爲一個可解析的話。

user> (str-to-num "A") 
NumberFormatException For input string: "A" java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) 
user> (str-to-num "J") 
NumberFormatException For input string: "J" java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) 
user> (str-to-num "K") 
NumberFormatException For input string: "K" java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) 
user> (str-to-num "100") 
1 

也許你想要的東西,如:

user> (defn str-to-num [c] 
     (case (first c) 
       \A 1 
       \J 2 
       \K 3 
       (int (first c)))) 
#'user/str-to-num 
user> (str-to-num "A") 
1 
user> (str-to-num "J") 
2 
user> (str-to-num "K") 
3 
user> (str-to-num "L") 
76 
user> (str-to-num "☃") 
9731 

或者:

user> (defn str-to-num [c] 
     (case (first c) 
       \A 1 
       \J 2 
       \K 3 
       (Integer/parseInt (subs c 0 1)))) 
#'user/str-to-num 
user> (str-to-num "9") 
9 
+0

所以當我做了(str-to-num「AR」),它仍然給出了相同的錯誤! – 2014-10-17 02:39:20

+0

不與此代碼,它不會。 – noisesmith 2014-10-17 02:40:46

+0

嘗試輸入「AR」。因爲我得到這個錯誤,我想給兩個字符作爲輸入,如「2B」,「AD」,「3F」;如果第一個字符是A,J,K等,那麼它將返回這些數字,否則它將返回給定的數字(從第一個字符),如上面的2,3等。 – 2014-10-17 02:44:43

1

問題是與你的if語句

你有

(if (= (str (first c)) "A") 
    1 
(java.lang.Integer/valueOf (str (first c)))) 
形式

,如果是

(if (cond) 
    trueResult 
    falseResult) 

的形式,以便你的「工作版本」將返回1,如果你輸入答:如果您輸入的任何其他字符串,它實際上拋出一個錯誤。但是,如果沒有拋出錯誤,所有三個if語句都將被執行,並且最後一個的結果實際上被返回。

這是更接近你的C++代碼:

(defn str-to-num [c] 
    (if (= (str (first c)) "A") (print 1)) 
    (if (= (str (first c)) "J") (print 2)) 
    (if (= (str (first c)) "K") (print 3)))