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

Kalkulator z interfejsem graficznym - problem z funkcją "wynik"
HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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

edytowany 2x, ostatnio: Hilek
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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ć? ;/

SW
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:426
0

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

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

HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
0

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

HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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!

edytowany 1x, ostatnio: Hilek
Shalom
o_O napisz taką metodę.
HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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!

HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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!

edytowany 5x, ostatnio: Hilek
HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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 :)

edytowany 1x, ostatnio: Hilek
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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ś.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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: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 :)

edytowany 2x, ostatnio: Hilek
airborn
Tą niedomkniętą klamrę od razu widać na przedstawionym screenie. Ułatwił byś sobie życie gdybyś wcinał kod (alt-shift-f)
HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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:

Kopiuj
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!

P8
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 6 lat
0

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

  1. dodałem zmienną
Kopiuj
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

Kopiuj
substring(int begin, int end)

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

Kopiuj
HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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!

HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
0
pk_82 napisał(a):
  1. dodałem zmienną
Kopiuj
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"
Kopiuj
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:

Kopiuj
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 :)

edytowany 5x, ostatnio: Hilek
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
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".


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
HI
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:55
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! :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.