Kalkulator z interfejsem graficznym - problem z funkcją "wynik"

0

Jak w temacie. Zrobiłem kalkulatorek w NB 7.2 IDE z dwoma oknami jTextField. Pierwsze (jTextField1) wyświetla bieżąco wprowadzaną liczbę, która po wybraniu operatora przeskakuje do drugiego okna (jTextField2) tym samym zerując jTextField1. Jak widać na screenie jTextField 2 sumuje tekst i robi to dopóki, dopóty nie wybierzemy operatora "CE". Problem jest następujący - jak mogę obliczyć ciągi znaków wprowadzone do jTextField2 za jednyk kliknięciem "="? Dobrze by było, gdyby znak "=" uwzględniał również wartość w jTextField1. Będę ogromnie wdzięczny za sugestie. Aha, operator "=" jest na jButton16ActionPerformed(java.awt.event.ActionEvent evt), oczywiście private void. Pozdrawiam.

user image <-- link do screena

0

Lekcja na dziś: odwrotna notacja polska. Możesz też liczyć na bieżąco.

0

Liczenie po kolei odpada. A można to rozwiązać za pomocą StreamTokenizer? No bo mogę zrobić np.

String tekst = jTextField2.getText();
StringTokenizer tekstST = new StringTokenizer(tekst);

Tylko teraz jak podzieliłem "tekst" na tokeny, to dalej nie wiem jak wykonać na nich operacje, bo ciągle są to dane typu String. Ps co do odwrotnej notacji polskiej niestety nie widzę tego oczami wyobraźni, bo dopiero zaczynam swoją przygodę :) będę wdzięczny za jakieś rozjaśnienie (obczytałem czym owa odwrócona notacja jest itp. ale nie wiem jak to zastosować). Pozdrawiam.

0

Sama zamiana stringów na liczby jest banalna, ot Integer.parseInt(cośtam). Ale żeby poprawnie liczyc to musisz te swoje dane wejściowe sparsować do postaci ONP albo innej w której łatwo się liczy.

0

Ok, załóżmy, że już mam ciąg postfiksowy i całość sparsowałem do np. double, ale ciągle nie mam pomysłu jak wykonać obliczenia na rozdzielonych tokenach ;/

Mając ciąg "ONP = 125 356 35 34 65 + - * /" rozbity dodatkowo na tokeny jak to policzyć? ;/

0

http://pl.wikipedia.org/wiki/Odwrotna_notacja_polska

przecież tam masz ładnie opisany przykład jak to obliczyć

0

Spróbuję to jakoś napisać :) dzięki wielkie za rady! Pozdrawiam.

0

Hej, mam problem :)

Uczę się właśnie ONP, ale mam problem z nadaniem priorytetów dla operatorów. Mam już stos w "stacku" (zaimportowałem java.util.*) itp., ale nie znam metody dla (String) do nadania priorytetów. Wygląda to tak:

if (s.equals("+") || s.equals("*") || s.equals("-") || s.equals("/"))
{
while (!stos.empty() && priorytet(stos.peek()) >= priorytet(s))
{
pole1AND2Postfiks += stos.pop() + " ";
stos.push(s);
}
}

PS tu akurat chodzi o priorytet wkładania i ściągania operatorów ze stosu :)

Będę wdzięczny za sugestie :) Pozdrawiam!

0

Ok, robi się :)

Jak na razie działa.

package my.kalkulator;

// priorytet(String) zwraca priorytet dla poszczególnych operatorów.

public class Priorytet
{
int op;

public int priorytet(String opPro)
{
          
    if (opPro == "+")
    {
        op = 1;
    }
    else if (opPro == "-")
    {
        op = 1;
    }
    else if (opPro == "*")
    {
        op = 2;
    }
    else if (opPro == "/")
    {
        op = 2;
    }
    else
    {
        return 0;
    }
    return op;
    
 }

}

Jesteśmy co raz bliżej końca :D Jak się wszystko uda pochwalę się wynikiem :) i z chęcią prześlę kod osobom podobnie do mnie początkującym :) Pozdrawiam!

1

Uf, udało się :) Jaka satysfakcja, matko :D Na początku dałem ciała, bo jako tokenizery wybrałem znaki operatorów i przez to nie było ich na stosie :D wybrałem więc na tokenizera spację i wszystko zaczęło pięknie śmigać :> teraz pozostało jedynie obliczyć postfiks :D życie jest piękne!

0

Ok, a więc prace dobiegły końca i wszystko działa jak należy! Uwzględnianie nawiasów, pierwiastki, procenty etc itd.

http://imageshack.us/photo/my-images/809/kalkulatorek.jpg/ <-- link do screena kalku

Ale! Nie mogę go skompilować do .jre ;/. Gdy wybieram opcję "clean & build" wyjeżdża mi z błędem..

Dotyczącym tego --> http://imageshack.us/photo/my-images/855/badzs.jpg/

A tu w większej ilości ;/ ---> http://imageshack.us/photo/my-images/577/43338516.jpg/

Problem w tym, że usuwałem i wstawiałem owe felerne buttony, a i tak wykrzacza mi z hasłem "illegal start of expression".. Co robić?

Pozdrawiam :)

0

Tak bywa jak generujesz kod wątpliwej jakości narzędziem. Gdybyś użył eclipsa i windowbuildera nie byłoby takich problemów. Zapewne problem to jakaś niedomknięta klamra albo coś.

0

No ale sęk w tym, że kod gra.. to jest bezsensu, że wykrzacza taki błąd, bo tego błędu tam nie ma.. jakieś rady?

JEST!! DZIAŁA!! Powód? Niedomknięta klamra!!!!! D:D Dzięki! :D

PS temat do zamknięcia :) dzięki za wszelkie porady i nakierowania :)
PS2 jakby jakieś osoby podobnie do mnie początkujące interesowała konstrukcja takiego kalkulatorka, to walcie śmiało :D

Pozdrawiam i życzę miłego wieczoru :)

0

Witam ponownie!

Mimo prośby o zamknięcie tematu proszę się wstrzymać z realizacją mojej prośby :) kwestia dotyczy kalkulatora, więc..

W czym rzecz? Ano spieszę z omówieniem problemu. Dodałem do interfejsu kalkulatorka przycisk ".", który dodaje do ciągu znaków "string" ową kropkę na koniec. Teraz moje pytanie: co zrobić by po jednorazowym postawieniu kropki przy kolejnym naciśnięciu przycisku "." program nie stawiał drugiej kropki? Uderzyłem w stronę StringTokenizer i to obecnie wygląda tak:

String tekst = jTextField1.getText();
StringTokenizer st = new StringTokenizer(tekst);
        
        while (st.hasMoreTokens())
        {
            String s = st.nextToken();
            
            if (!s.equals("."))
            {
                String tekst2 =jTextField1.getText();
                jTextField1.setText(tekst2 + ".");
            }
            else
            {
                break;
            }
        }

Ale niestety nie działa. Mógłbym wstawić spację między kolejne znaki i wtedy StringTokenizer pewnie rozpoznałby ".", ale jest jakiś inny sposób rozwiązania tej kwestii?

Przykład --> http://imageshack.us/photo/my-images/51/vvvvcb.jpg/

A druga kwestia (podobna) dotyczy operatorów. Załóżmy dodaję do siebie dwie liczby - pierwsza to 34 a druga to 33. (uwaga na kropkę na końcu!). Co zrobić by tak wpisaną liczbę "33." rozpoznać jako np. "33.0"?

No i trzecia kwestia, równie tożsama z powyższymi - klawisz "del". Co zrobić, by usuwał ostatni wprowadzony znak ciągu? :)

Pozdrawiam!

0

Hej, pisałem kiedyś podobny kalkulator pod Androida i rozwiązałem to tak:

  1. dodałem zmienną
boolean czyKropka

którą ustawiałem na true po dodaniu "." do wyrażenia, przed dodaniem "." należy sprawdzić czy zmienna jest false, oraz po wstawieniu znaku operatora do wyrażenia, zmienną czyKropka ustawiasz na false
2) sprawdzasz ostatni znak w wyrażeniu i jeżeli jest "." to dopisujesz 0
3) używając metody

substring(int begin, int end)

wstawiasz wyrażenie bez ostatniego znaku np.:jTextField.setText(strLcd.substring(0, strLcd.length() - 1));

0

Super!! Dziękuję Ci bardzo!! :D właśnie wróciłem do domu i siadam do roboty :D musi się udać :)

A tu stan pracy na chwilę obecną :) ->> http://imageshack.us/f/696/prezentacjaoc.jpg/

Pozdrawiam!

0
pk_82 napisał(a):
  1. dodałem zmienną
boolean czyKropka

którą ustawiałem na true po dodaniu "." do wyrażenia, przed dodaniem "." należy sprawdzić czy zmienna jest false,

Siedzę i próbuję, ale mam problem. Żeby dodać kropkę muszę sprawdzić, czy 'czyKropka' jest 'false'. Jeśli jest to dodaję kropkę i zmieniam wartość na 'true'. Ale.. na początku muszę przecież zainicjalizować zmienną, więc piszę przed warunkiem 'if', że 'czyKropka' jest 'false'.. tylko teraz to jest bez sensu, bo zawsze przy naciśnięciu klawisza od kropki, będzie mi ustawiał wartość zmiennej na 'false' i tym samym zawsze będzie dodawał kropkę ilekroć go nacisnę ;/ Mógłbyś mi to jakoś rozjaśnić? Będę bardzo wdzięczny. W sumie myślałem też o sprawdzaniu ciągu tekstu (String) i gdyby np były w nim 'ilość kropek <= 1' to przycisk ową kropkę by dodawał, a gdyby 'ilość kropek > 1' to robiłby 'break'. Ale nie znam do tego metody. Próbowałem jak powyżej StringTokenizera, ale nie wychodzi. Będę wdzięczny za nakierowanie, pozdrawiam :)

EDIT##

Ok, zrobione :)

Trochę innym sposobem, ale działa jak należy :)

Po kolei:

  1. Nowa klasa "Kropka"
package my.kalkulator;

import java.util.*;
import java.io.*;


public class Kropka extends KalkulatorUI
{
    
    public int czyKropka(String x)
    {
        int y = 0;
        StringTokenizer st = new StringTokenizer(x, "1234567890");
        
        
        while (st.hasMoreTokens())
        {
            String s = st.nextToken();
            
            if (!s.equals("."))
            {
                y = 1;
                return y;
            }
            else
            {
                y = 2;
                return y;
            }
        }
        return y;
    }
}

No i kod przycisku:

private void jButton25ActionPerformed(java.awt.event.ActionEvent evt)                                          
{                                              
        Kropka ustal = new Kropka();
        String tekst2 = jTextField1.getText();
        
        if (ustal.czyKropka(tekst2) == 1 || ustal.czyKropka(tekst2) == 0)
        {
            String tekst = jTextField1.getText();
            jTextField1.setText(tekst + ".");
        }  
}         

Pozdrawiam! :)

EDIT###

Ok, wszystko działa :) problem z kropką, klawiszem backspace, usuwaniem kropki po dodaniu operatora, wszystko rozwiązane :) w sprawie samego kalkulatorka pozostała jedynie mała drobnostka, mianowicie - jeżeli wpiszę następujące wyrażenie "0 - 9 + 6", to program obliczy wynik i wypluje "0 - 9 + 6 = -3.0" plus ONP "0 9 - 6 +", ale gdy pominę przy działaniu "0", czyli wpiszę "- 9 + 6", program nie podaje wyniku, ale wypluwa ONP w postaci "9 - 6 +". Problem dotyczy drugiej fazy rozwiązywania wyrażenia, bo po przełożeniu wyrażenia na ONP proszę, by wyświetlił postfiks w okienku i następnie przechodzi do obliczania pracując na ONP. W czym jest tutaj problem? Wyskakuje mi błąd, że stos jest pusty. Ale przecież "9" powinna wskoczyć tak czy siak na stos. Będę wdzięczny za rady :)

0

Może to będzie przydatne http://old.koalateam.com/djava/ (mógłbyś wtedy zrezygnować z ONP).
Nieźle wygląda. Zamiast sqrt możesz pisać symbol pierwiastka: "\u221a".

0

Kalkulatorek prawdę mówiąc skończony :)

http://imageshack.us/photo/my-images/201/beztytuuzzu.jpg/

Jakby ktoś chciał przetestować i wytknąć błędy, niedociągnięcia i powiedzieć co poprawić itd. to byłbym bardzo wdzięczny. Sam kalkulatorek miałby służyć za liczydełko dla biblioteki funkcji i działań znajdującej się w tym samym programie (zakładki).

Mam również pytanie. Można zaaplikować jakoś do tego programiku moduł (?) do rysowania funkcji po podaniu np parametrów? Czy coś podobnego? Będę wdzięczny za odpowiedzi! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1