logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Kalkulator jeszcze raz. Gdzie znajdę informacje na temat działania?

arkady25 15 Kwi 2006 17:35 1635 4
REKLAMA
  • #1 2531467
    arkady25
    Poziom 16  
    Posty: 362
    Pomógł: 5
    Ocena: 18
    Witam,
    Czy ktoś może po krótce objaśnić (lub wie gdzie znajdę jakiekolwiek info) w jaki sposób działa prosty kalkulator.
    Kiedyś czytałem o tym, ale niestety było to dawno i nawet nie pamiętam gdzie to było.
    Chce napisać programik, który bedzie działał tak jak tanie kalkulatory. Tylko nie mówcie żebym wchodził w odwrotną notację polską. Jakoś nie chce mi się wierzyć że jest w nich stosowana taka metoda.
    Programik oczywiście na konsolę.
  • REKLAMA
  • #2 2531515
    Faust
    Poziom 17  
    Posty: 135
    Pomógł: 22
    Ocena: 4
    W jakim języku? Jakie operacje miałby wykonywać?
    Bo jeżeli chodzi o ten najprostszy - 4 podstawowe działania, i maksymalnie dwie liczby do przetworzenia na raz, to można to zrobić w kilkaście linijek.
  • REKLAMA
  • #3 2531566
    arkady25
    Poziom 16  
    Posty: 362
    Pomógł: 5
    Ocena: 18
    Język C++
    nie chcę najpierw wybierać działania, a potem podawać odpowiednią ilość liczb.
    Nie chcę też podawać całego wyrażenia i po wciśnięciu ENTER dostać wynik.
    Chce żeby to działało jak kalkulator za 5 zeta, a nie jakiś naukowy.

    O ile uda mi się to pokazać, chcę uzyskać mniej więcej taki efekt :

    dla mnożenia
    Wciśnięte klaw.: 2 | * | 3 | * | 4 | * | 5 | = |
    Wyświetlacz : 2 | 2 | 3 | 6 | 4 |24| 5 |120

    dla dodawania
    Wciśnięte klaw.: 2 | + | 3 | + | 4 | + | 5 | = |
    Wyświetlacz : 2 | 2 | 3 | 5 | 4 | 9 | 5 | 14

    Jeżeli takie działanie wymaga ONP, to trudno.

    Przykładowo:
    Cytat:
    case '+':
    {
    wyswietl(akum + liczba1);
    akum = akum + liczba1;
    } ;

    działa bardzo ładnie, ale:
    Cytat:
    case '*':
    {
    wyswietl(akum * liczba1);
    akum = akum * liczba1;
    } ;

    już nie, bo wartością początkową dla akum jest zero i dostaję ciągle zero
    Pozdrawiam i czekam na wszelkie odpowiedzi.
  • REKLAMA
  • #4 2543796
    ZeeWolf
    Poziom 28  
    Posty: 989
    Pomógł: 115
    Ocena: 58
    Witam.

    
    double       last_lcd, cur_lcd = 0.0;
    bool          new_value = true;
    bool          new_entry = true;
    
    // tu troche kodu wyrwanego z kontekstu :)
    
    case /* od 0 do 9 */ :
    {
       if(new_value) new_value = false;
       last_lcd = // pobierz wartosc z wyswietlacza
       // tu nalezy zmienic zawartosc wyswietlacza uwzgledniajac wlasnie
       // wklepana cyfre...
    }
    
    case /* klawisze dzialan +, -, *, /  */":
    {
        if(!new_entry)
        {
              wynik = new_lcd + last_lcd    // lub odpowiednio - , * lub /
              // wysylamy wynik na wyswietlacz
              new_value = true;
        }
        else
        {
             new_entry = false;
        }
    }
    
    case '=':
    {
              wynik = new_lcd + last_lcd    // lub odpowiednio - , * lub /
              // wysylamy wynik na wyswietlacz
              new_value = true;
              new_entry = true;
    }
    
    case 'C':
    {
              // na wyswietlacz wysylamy '0'
              new_value = true;
              new_entry = true;
    }
    

    Powinno byc ok - oczywiscie, kod mozna znacznie ulepszyc (pisalem z glowy :) ). W razie pytan - prosze pytac. Pozdrawiam.
  • #5 2558722
    arkady25
    Poziom 16  
    Posty: 362
    Pomógł: 5
    Ocena: 18
    Troszkę inaczej zrobiłem no i nie działa w pełni poprawnie, ale może komuś pomoże.
    Pozdrawiam
    Załączniki:
    • Unit1.cpp (4.37 KB) Musisz być zalogowany, aby pobrać ten załącznik.
REKLAMA