2014-10-17 30 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)))