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:około 21 lat
  • Ostatnio:prawie 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:około 21 lat
  • Ostatnio:prawie 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:około 21 lat
  • Ostatnio:prawie 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! :)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)