2009-03-17 12 views
3

Je suis bien conscient que ce code est horrible. Je l'ai juste fait pour que je puisse essayer différentes choses Swing. C'est un problème intéressant. Cela crée 4 boutons pour ajouter, soustraire, diviser et multiplier. La multiplication et l'ajout fonctionnent parfaitement, aucun problème du tout, mais lorsque l'utilisateur tente de le soustraire, il renvoie toujours 0. Lorsque l'utilisateur essaie de le diviser, il renvoie toujours 1 ou 1.0 en fonction de l'entrée. Je ne peux pas comprendre. Voici le code:Calculatrice Clojure GUI. "-" renvoie toujours 0 et "/" renvoie toujours 1

(ns rayne.main 
    (:gen-class) 
    (:import (javax.swing JFrame JTextField JButton JOptionPane) 
      (java.awt.event ActionListener) 
      (java.awt GridLayout))) 

(def numbers (ref [])) 
(def times-clicked (ref 0)) 

(defn calc [nseq op] 
    (let [n1 (first nseq) 
     n2 (last nseq)] 
    (cond 
    (= op "+") (+ n1 n2) 
    (= op "*") (* n1 n2) 
    (= op "-") (- n2 n1) 
    (= op "/") (/ n1 n2)))) 

(defn add-op-button [op text button] 
    (.addActionListener button 
    (proxy [ActionListener] [] 
     (actionPerformed [e] 
     (dosync 
     (ref-set times-clicked (inc @times-clicked)) 
     (if (= @times-clicked 2) 
     (do 
     (let [result (.toString (calc @numbers op)) 
       result2 (read-string result)] 
      (.setText text result) 
      (ref-set numbers []) 
      (ref-set times-clicked 0))) 
     (do 
     (ref-set numbers (conj @numbers (read-string (.getText text)))) 
     (.setText text "")))))))) 

(defn -main [] 
    (let [frame (JFrame. "Calculator") 
     add-button (JButton. "+") 
     sub-button (JButton. "-") 
     mul-button (JButton. "*") 
     div-button (JButton. "/") 
     clr-button (JButton. "Clear") 
     text-field (JTextField.)] 
    (add-op-button "+" text-field add-button) 
    (add-op-button "-" text-field sub-button) 
    (add-op-button "*" text-field mul-button) 
    (add-op-button "/" text-field div-button) 
(doto frame 
    (.setLayout (GridLayout. 1 5)) 
    (.add text-field) 
    (.add add-button) 
    (.add sub-button) 
    (.add mul-button) 
    (.add div-button) 
    (.setSize 500 100) 
    (.setVisible true)))) 

L'indentation est probablement foiré, en raison de copier-coller et la mise en forme de mouche, mais il est. Encore une fois, je sais que le code est horrible.

Répondre

6

La deuxième fois que l'utilisateur clique sur un bouton, le numéro n'est pas ajouté à la liste numbers, vous faites donc calc sur une liste d'un élément.

Depuis la liste ne comporte qu'un seul élément, le premier élément (n1) et le dernier élément (n2) sont la même chose, et

x/x => 1 
x - x => 0 

Je suis surpris de votre addition et la multiplication travaillent .. .: -/

Je pense que vous pouvez résoudre ce problème en déplaçant la mise à jour @numbers à l'avant if:

(ref-set numbers (conj @numbers (read-string (.getText text)))) 
(if (= @times-clicked 2) 

ou déplacer le inc de @times-clicked pour être après le if.

+0

Oh merde! Je ne sais même pas comment l'addition et la multiplication fonctionnaient en premier lieu !! Merci beaucoup! – Rayne

+0

Aussi dans le cas où vous vous demandiez clr-bouton est un cas particulier que je n'ai pas encore ajouté. – Rayne

+0

C'est bon. Honnêtement, je suis étonné je me souviens assez de zézaiement pour même rien comprendre! ;] –

4

Il semble que l'ajout ne fait qu'ajouter le nombre à lui-même, et la fonction de multiplication est en fait juste au carré du premier nombre.

+0

Ce qui est ce que vous attendez étant donné les problèmes que j'ai décrits;] –

+0

Je testais l'addition et la multiplication apparemment en utilisant des nombres qui est sorti de la bonne façon au carré et ajouté à eux-mêmes. Que je suis bête. – Rayne

Questions connexes