Kalkulator

Typ_projektu
Arduino
Zdjecie główne
Krótki opis projektu

Projektem jest kieszonkowy kalulator zbudowany w oparciu o Arduino UNO oraz Shield SIC Game Console, w skład której wchodzą m.in. 6 przycisków oraz wyświetlacz OLED Adafruit SSD1306 o rozdzielczości 128x64p. Kalkukator może wykonywać następujące czynności:
• dodawać,

• odejmować,

• mnożyć,

• dzielić,

• potęgować,

• operować nawiasami,

• wpisywać zmienną e oraz ans.

Niezbędne elementy

1. Płytka Arduino UNO lub kompatybilna

2. Shield SIC Game Console

Sprzęt

Komputer PC z Arduino IDE

Opis projektu

Metoda wprowadzania

Konsolka zawiera tylko 6 przycisków, 2 po prawej stronie („górny” i „dolny”) oraz 4 po lewej (DPad: „w górę”, „w dół”, „w lewo”, „w prawo”). Aby umożliwić użytkownikowi dostęp do wszystkich funnkcji zapożyczono i zaadaptowano Menu Kołowe z gier ModNation Racers oraz Trackmania Turbo. Użytkownik przytrzymując górny lub dolny użytkownik wybiera „rozeetkę”, tj. konkretne menu kołowe, w którym znajdują się elementy do wyboru. Następnie wciskając odpowiednie przyciski na DPadzie w odpowiedniej kolejności użytkownik wybiera 1 z 12 dostęp nych elementów. Puszczenie przycisku wyboru rozetki zamyka okno, wpisuje element do buforu i oczekuje puszczenia pozostałych przycisków. Przykładowo chcąc wybrać potęgowanie użytkownik musi wcisnąć i przytrzymać przycisk „dolny” (rozetka 2), następnie wcisnąć przycisk „w prawo”, potem „w dół”, a następnie puścić „dolny”. Przykład: wykonywanie działania 3 · 6.

Działanie wewnętrzne

Po uruchomieniu oraz wprowadzeniu przez użytkownika dzialania i wybrania „=” funkcja kalku lator_main() uruchamia funkcje z nazwą parser zgodnie z kolejnością wykonywania działań, które odpowiadają za konwersję zawartości buforu na zapis zgodny z Odwrotną Notacją Polską (RPN). Wszystkie działania zaczynają się od znaku $, a zmienne od #. Następnie uruchomiona jest rekurencyjna funkcja solver(), która po napotkaniu odpowiedniej funkcji lub nawiasu uruchamia kolejną instancję solver’a i zwraca wynik potęgowania, mnożenia, dzielenia, dodawania lub odej mowania. Pierwsza instancja solvera zapisuje wartość do zmiennej ans.

Niedziałające lub zepsute funkcje

• Przycisk C działa tak wolno, że szybciej jest zresetować Arduino,

• Wypisywanie wyników na ekran jest zawodne,

• problemy z ogólną stabilnością,

• nie można wprowadzić kropki.

Początkowe założenia projektu

Poza obecnymi funkcjami kalkulator miał posiadać następujące funkcje:

• funkcje trygonometryczne,

• funkcje hiperboliczne,

• silnia,

• stałe matematyczne,

• zmienne użytkownika,

• zapisywanie wzorów.

Wyzwania

Wiele problemów wiązało się z ograniczeniami samego Arduino UNO. Płytka posiada 16 kiB pamięci trwałej oraz 2kiB pamięci dynamicznej. Sam przykład ssd1306_128x64_i2c.ino zajmuje około 65% pamięci trwałej i dynamicznej. Z tego względu wiele funkcji zostało wyciętych. Kolejnym, nie do końca rozwiązanym problemem okazało się wyświetlanie wyniku końcowego. Funkcja String zajmowała za dużo pamięci, z tego powodu należało zapisywać wynik wprost do bufora sterownika ekranu. Ponieważ funkcja display.print() interpretuje wartości liczbowe typu int jako pojedyńcze znaki, program wykorzystuje rzutowanie zmiennej typu double na int, które to rzu towanie Arduino wykonuje niepoprawnie. Ze względu na limit czasowy nie naprawiono usterki.

Zdjęcia
kod programu

#include <SPI.h>

#include <Wire.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

 

#define SSD1306_128_64;

 

#define OLED_RESET 4

Adafruit_SSD1306 display(OLED_RESET);

 

#define NUMFLAKES 10

#define XPOS 0

#define YPOS 1

#define DELTAY 2

 

#define LOGO16_GLCD_HEIGHT 64

#define LOGO16_GLCD_WIDTH  128

 

 

#if (SSD1306_LCDHEIGHT != 64)

#error("Height incorrect, please fix Adafruit_SSD1306.h!");

#endif

/*

char* menuItems[]={

  "Start",

  "TEST",

  "Koniec"

};

*/

 

//7↑,8 ←,9 ↓,10 →    4 górniejszy, 5 dolniejszy,    

 

const int d_pad_gora = 7;

const int d_pad_lewo = 10;

const int d_pad_dol = 9;

const int d_pad_prawo = 8;

const int gora = 4;

const int dol = 5;

 

int co_dopisac_loop = -100;

 

const char* elementy_rozetki[2][12] =

{

  {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "C", "="},

  {"+", "-", "*", "/", "^", "(", ")", "e", "a", "_", "_", "_"}//,

  //{"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"},

  //{"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}

};

 

 

 

const int buformax=40;

bool verbose = true;

char bufor_roboczy[buformax];

//char bufor_roboczy_kopia[buformax];

//char bufor_uzytkownika[buformax/2];

 

//int kod_bledu = 0;

 

bool z_nawiasami = 0;

//const char* blad[1] = {""};

 

const int ile_funkcji = 5;

const char* dostepne_funkcje[ile_funkcji] =    {"$pot(", "$mnoz(", "$dziel(", "$plus(", "$minus("};

const int ile_znakow_ma_funkcja[ile_funkcji] = { 5,       6,        7,         6,        7};

 

const int ile_zmiennych = 3;

char* nazwa_zmiennej[ile_zmiennych]=      {"#a", "#pi", "#e"}; //0-19 naukowe, 20-39 uzytkownika

bool czy_zmienna_w_uzyciu[ile_zmiennych] = {1,      1,     1};

int ile_znakow_ma_zmienna[ile_zmiennych] = {2,      3,     2};

double wartosc_zmiennej[ile_zmiennych] =   {0,      M_PI,  M_E};

int kursor = 0;

 

void setup() {

  // put your setup code here, to run once:

  Serial.begin(9600);

  pinMode(4, INPUT_PULLUP);

  pinMode(5, INPUT_PULLUP);

  pinMode(7, INPUT_PULLUP);

  pinMode(8, INPUT_PULLUP);

  pinMode(9, INPUT_PULLUP);

  pinMode(10, INPUT_PULLUP);

 

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)

  display.display();

  delay(100);

  display.clearDisplay();

  display.display();

  delay(100);

  display.clearDisplay();

 

  Serial.println("");

  Serial.println("");

  Serial.println("KALKULATOR");

  wy_bufor();

  /*

  display.setRotation(2);

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(5, 10);

  display.println("KALKULATOR");

  display.display();

  display.clearDisplay();

  */

  co_dopisac_loop = -50;

}

 

bool porownaj_nazwy_funkcji (char* co, const char* z_czym[ile_funkcji], int ile, int i)

{

int j = 0;

for (j = 0; j < ile; j++)

{

if (co[kursor+j] != z_czym[i][j])

{

return 0;

}

}

kursor=kursor+ile-1;

return 1;

}

 

bool porownaj_nazwy_zmiennej (char* co, char* z_czym[ile_zmiennych], int ile, int i, bool czy_z_hasztagiem)

{

int j = 0;

    if(czy_z_hasztagiem == 0)

        j++;

for (j; j < ile; j++)

{

if (co[kursor+j] != z_czym[i][j])

{

return 0;

}

}

kursor=kursor+ile-1;

return 1;

}

//*

bool porownaj_stringi_w_tyl(char* co, const char z_czym[ile_funkcji], int ile_znakow, int i)

{

    for(int j = 0; j < ile_znakow; j++)

    {

        ////printf("co[%d] = %c, z_czym[%d] = %c\n", i-j, co[i-j], ile_znakow-1-j, z_czym[ile_znakow-1-j]);

        if(co[i-j] != z_czym[ile_znakow-1-j])

        {

            return 0;

        }

    }

    ////printf("return 1!");

    return 1;

}

//*/

void w_prawo(char* co, int od_kad, int o_ile, int co_max)

{

    if(co[co_max-o_ile] != '\0')

    {

        ////printf("Uwaga: bufor bedzie uciety przy przesuwaniu w prawo\n");

    }

 

    for(int i = co_max-1; i > od_kad; i--) //jazda do tylu

    {

        ////printf("%d = %c\n", i, co[i]);

        co[i] = co[i-o_ile];

    }

    for(int i = od_kad; i < od_kad+o_ile; i++)

    {

        co[i] = ' ';

    }

    for(int i = 0; i < co_max; i++)

    {

        ////printf("%c", co[i]);

    }

    return;

}

/*

void test()

{

    if(verbose == 1)

    {

        for(int i = 0; i < buformax; i++)

        {

            //printf("%c", bufor_roboczy[i]);

        }

        //printf("\n");

    }

    return;

}

*/

int ile_do_dolara(int i)

{

    for(int j = 0; j<ile_funkcji; j++)

    {

        if(porownaj_stringi_w_tyl(bufor_roboczy, dostepne_funkcje[j], ile_znakow_ma_funkcja[j], i) == 1)

        {

            return ile_znakow_ma_funkcja[j]-1;

        }

    }

    return 0;

}

/*

void wypluj_blad()

{

 

    if(kod_bledu > 0)

    {

        //printf("kod bledu = %d\n", kod_bledu);

        EXIT_FAILURE;

    }

    else

        return;

 

}

*/

//*

bool parser_potegowania() //1 gdy nie znaleziono potegowania, 0 gdy znaleziono

{

    kursor = 0;

    int ilenawiasow = 0;

    bool czy_wszystko = 1;

    int o_ile_cofnac = 0;

    for(kursor; kursor < buformax-1; kursor++)

    {

        ////printf("%c", bufor_roboczy[kursor]);

        if(bufor_roboczy[kursor] == '^')

        {

            czy_wszystko = 0;

            ////printf("napotkano ^\n");

            //to co stoi na dole

            if(bufor_roboczy[kursor-1] == ')')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            for(int i = kursor-1; i >= 0; i--) //jazda do tylu

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow++;

                    }

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow--;

                        if(ilenawiasow == 0)

                        {

                            o_ile_cofnac = ile_do_dolara(i);

                            if(o_ile_cofnac > 0)

                            {

                                ////printf("o_ile_cofnac = %d\n", o_ile_cofnac);

                                i -= o_ile_cofnac;

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                //w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 5, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'p';

                                bufor_roboczy[i+2] = 'o';

                                bufor_roboczy[i+3] = 't';

                                bufor_roboczy[i+4] = '(';

                                bufor_roboczy[kursor+5] = ',';

                                kursor += 5;

                            }

                            else

                            {

                                w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 3, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'p';

                                bufor_roboczy[i+2] = 'o';

                                bufor_roboczy[i+3] = 't';

                                bufor_roboczy[kursor+3] = ',';

                                kursor += 3;

                                break;

                            }

                        }

                    }

                }

                else if(z_nawiasami == 0)

                {

                    //if(bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == ',')

                    if(bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == ',' || bufor_roboczy[i] == '(')

                    {

                        ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();

                        w_prawo(bufor_roboczy, i+1, 5, buformax);

                        //w_prawo(bufor_roboczy, i, 5, buformax);

                        //test();

                        bufor_roboczy[i+1] = '$';

                        bufor_roboczy[i+2] = 'p';

                        bufor_roboczy[i+3] = 'o';

                        bufor_roboczy[i+4] = 't';

                        bufor_roboczy[i+5] = '(';

                        bufor_roboczy[kursor+5] = ',';

                        kursor+=5;

                        break;

                    }

                    if(i == 0)

                    {

                        ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();

                        w_prawo(bufor_roboczy, i, 5, buformax);

                        //test();

                        bufor_roboczy[i] = '$';

                        bufor_roboczy[i+1] = 'p';

                        bufor_roboczy[i+2] = 'o';

                        bufor_roboczy[i+3] = 't';

                        bufor_roboczy[i+4] = '(';

                        bufor_roboczy[kursor+5] = ',';

                        kursor+=5;

                        //bufor_roboczy[kursor] = ',';

                        break;

                    }

                }

            }

            //to do czego podnosimy

            ////printf("kursor stoi na %c\n", bufor_roboczy[kursor]);

            if(bufor_roboczy[kursor+1] == '(')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            //test();

            for(int i = kursor+1; i < buformax; i++)

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow++;

                    }

                    else if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow--;

                        if(ilenawiasow == 0)

                        {

                            //test();

                            w_prawo(bufor_roboczy, i, 1, buformax);

                            //test();

                            bufor_roboczy[i] = ')';

                            kursor = i+1;

                            break;

                        }

                    }

                }

                //if(z_nawiasami == 0 && (bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == '\0'))

                if(z_nawiasami == 0 && (bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == '\0' || bufor_roboczy[i] == ')' || bufor_roboczy[i] == ','))

                {

                    w_prawo(bufor_roboczy, i, 1, buformax);

                    bufor_roboczy[i] = ')';

                    kursor = i;

                    break;

                }

            }

        }

    }

    ////printf("\n");

    return czy_wszystko;

}

 

bool parser_mnozenia() //1 gdy nie znaleziono mnozenia, 0 gdy znaleziono

{

    kursor = 0;

    int ilenawiasow = 0;

    bool czy_wszystko = 1;

    int o_ile_cofnac = 0;

    for(kursor; kursor < buformax-1; kursor++)

    {

        ////printf("%c", bufor_roboczy[kursor]);

        if(bufor_roboczy[kursor] == '*')

        {

            czy_wszystko = 0;

            ////printf("napotkano *\n");

            ////printf("bufor_roboczy[%d] = %c\n", kursor, bufor_roboczy[kursor]);

            //to co stoi na dole

            if(bufor_roboczy[kursor-1] == ')')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            ////printf("z_nawiasami = %d\n", z_nawiasami);

            for(int i = kursor-1; i >= 0; i--) //jazda do tylu

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow++;

                    }

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow--;

 

                        //i -= ile_do_dolara(i);

                        ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

 

                        if(ilenawiasow == 0)

                        {

                            o_ile_cofnac = ile_do_dolara(i);

                            if(o_ile_cofnac > 0)

                            {

                                ////printf("o_ile_cofnac = %d\n", o_ile_cofnac);

                                i -= o_ile_cofnac;

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                //w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 6, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'm';

                                bufor_roboczy[i+2] = 'n';

                                bufor_roboczy[i+3] = 'o';

                                bufor_roboczy[i+4] = 'z';

                                bufor_roboczy[i+5] = '(';

                                bufor_roboczy[kursor+6] = ',';

                                kursor += 6;

                            }

                            else

                            {

                                //test();

                                w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 4, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'm';

                                bufor_roboczy[i+2] = 'n';

                                bufor_roboczy[i+3] = 'o';

                                bufor_roboczy[i+4] = 'z';

                                bufor_roboczy[kursor+4] = ',';

                                kursor += 4;

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                break;

                            }

                        }

                    }

                }

                else if(z_nawiasami == 0)

                {

                    if(bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == ',' || bufor_roboczy[i] == '(')

                    {

                        ////printf("1bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();;

                        w_prawo(bufor_roboczy, i+1, 6, buformax);

                        //w_prawo(bufor_roboczy, i, 5, buformax);

                        //test();;

                        bufor_roboczy[i+1] = '$';

                        bufor_roboczy[i+2] = 'm';

                        bufor_roboczy[i+3] = 'n';

                        bufor_roboczy[i+4] = 'o';

                        bufor_roboczy[i+5] = 'z';

                        bufor_roboczy[i+6] = '(';

                        bufor_roboczy[kursor+6] = ',';

                        kursor+=6;

                        break;

                    }

                    if(i == 0)

                    {

                        ////printf("i == 0\n");

                        ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();

                        w_prawo(bufor_roboczy, i, 6, buformax);

                        //test();

                        bufor_roboczy[i] = '$';

                        bufor_roboczy[i+1] = 'm';

                        bufor_roboczy[i+2] = 'n';

                        bufor_roboczy[i+3] = 'o';

                        bufor_roboczy[i+4] = 'z';

                        bufor_roboczy[i+5] = '(';

                        bufor_roboczy[kursor+6] = ',';

                        kursor+=6;

                        //bufor_roboczy[kursor] = ',';

                        break;

                    }

                }

            }

            //to do czego podnosimy

            ////printf("kursor stoi na %c\n", bufor_roboczy[kursor]);

            if(bufor_roboczy[kursor+1] == '(')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            //test();

            for(int i = kursor+1; i < buformax; i++)

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(bufor_roboczy[i] == '$')

                {

                    z_nawiasami = 1;

                }

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow++;

                    }

                    else if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow--;

                        if(ilenawiasow == 0)

                        {

                            //test();

                            w_prawo(bufor_roboczy, i, 1, buformax);

                            //test();

                            bufor_roboczy[i] = ')';

                            kursor = i+1;

                            break;

                        }

                    }

                }

                if(z_nawiasami == 0 && (bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == '\0' || bufor_roboczy[i] == ')' || bufor_roboczy[i] == ','))

                {

                    w_prawo(bufor_roboczy, i, 1, buformax);

                    bufor_roboczy[i] = ')';

                    kursor = i;

                    break;

                }

            }

        }

    }

    ////printf("\n");

    return czy_wszystko;

}

 

bool parser_dzielenia() //1 gdy nie znaleziono dzielenia, 0 gdy znaleziono

{

    kursor = 0;

    int ilenawiasow = 0;

    bool czy_wszystko = 1;

    int o_ile_cofnac = 0;

    for(kursor; kursor < buformax-1; kursor++)

    {

        ////printf("%c", bufor_roboczy[kursor]);

        if(bufor_roboczy[kursor] == '/')

        {

            czy_wszystko = 0;

            ////printf("napotkano *\n");

            ////printf("bufor_roboczy[%d] = %c\n", kursor, bufor_roboczy[kursor]);

            //to co stoi na dole

            if(bufor_roboczy[kursor-1] == ')')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            ////printf("z_nawiasami = %d\n", z_nawiasami);

            for(int i = kursor-1; i >= 0; i--) //jazda do tylu

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow++;

                    }

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow--;

                        if(ilenawiasow == 0)

                        {

                            o_ile_cofnac = ile_do_dolara(i);

                            if(o_ile_cofnac > 0)

                            {

                                ////printf("o_ile_cofnac = %d\n", o_ile_cofnac);

                                i -= o_ile_cofnac;

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                //w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 7, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'd';

                                bufor_roboczy[i+2] = 'z';

                                bufor_roboczy[i+3] = 'i';

                                bufor_roboczy[i+4] = 'e';

                                bufor_roboczy[i+5] = 'l';

                                bufor_roboczy[i+6] = '(';

                                bufor_roboczy[kursor+7] = ',';

                                kursor += 7;

                            }

                            else

                            {

                                //test();

                                w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 5, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'd';

                                bufor_roboczy[i+2] = 'z';

                                bufor_roboczy[i+3] = 'i';

                                bufor_roboczy[i+4] = 'e';

                                bufor_roboczy[i+5] = 'l';

                                bufor_roboczy[kursor+5] = ',';

                                kursor += 5;

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                break;

                            }

                        }

                    }

                }

                else if(z_nawiasami == 0)

                {

                    if(bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == ',' || bufor_roboczy[i] == '(')

                    {

                        ////printf("1bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();

                        w_prawo(bufor_roboczy, i+1, 7, buformax);

                        //w_prawo(bufor_roboczy, i, 5, buformax);

                        //test();

                        bufor_roboczy[i+1] = '$';

                        bufor_roboczy[i+2] = 'd';

                        bufor_roboczy[i+3] = 'z';

                        bufor_roboczy[i+4] = 'i';

                        bufor_roboczy[i+5] = 'e';

                        bufor_roboczy[i+6] = 'l';

                        bufor_roboczy[i+7] = '(';

                        bufor_roboczy[kursor+7] = ',';

                        kursor+=7;

                        break;

                    }

                    if(i == 0)

                    {

                        ////printf("i == 0\n");

                        ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();

                        w_prawo(bufor_roboczy, i, 7, buformax);

                        //test();

                        bufor_roboczy[i] = '$';

                        bufor_roboczy[i+1] = 'd';

                        bufor_roboczy[i+2] = 'z';

                        bufor_roboczy[i+3] = 'i';

                        bufor_roboczy[i+4] = 'e';

                        bufor_roboczy[i+5] = 'l';

                        bufor_roboczy[i+6] = '(';

                        bufor_roboczy[kursor+7] = ',';

                        kursor+=7;

                        //bufor_roboczy[kursor] = ',';

                        break;

                    }

                }

            }

            //to do czego podnosimy

            ////printf("kursor stoi na %c\n", bufor_roboczy[kursor]);

            if(bufor_roboczy[kursor+1] == '(')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            //test();

            for(int i = kursor+1; i < buformax; i++)

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(bufor_roboczy[i] == '$')

                {

                    z_nawiasami = 1;

                }

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow++;

                    }

                    else if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow--;

                        if(ilenawiasow == 0)

                        {

                            //test();

                            w_prawo(bufor_roboczy, i, 1, buformax);

                            //test();

                            bufor_roboczy[i] = ')';

                            kursor = i+1;

                            break;

                        }

                    }

                }

                if(z_nawiasami == 0 && (bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == '\0' || bufor_roboczy[i] == ')' || bufor_roboczy[i] == ','))

                {

                    w_prawo(bufor_roboczy, i, 1, buformax);

                    bufor_roboczy[i] = ')';

                    kursor = i;

                    break;

                }

            }

        }

    }

    ////printf("\n");

    return czy_wszystko;

}

 

bool parser_dodawania() //1 gdy nie znaleziono dodawania, 0 gdy znaleziono

{

    kursor = 0;

    int ilenawiasow = 0;

    bool czy_wszystko = 1;

    int o_ile_cofnac = 0;

    for(kursor; kursor < buformax-1; kursor++)

    {

        ////printf("%c", bufor_roboczy[kursor]);

        if(bufor_roboczy[kursor] == '+')

        {

            czy_wszystko = 0;

            ////printf("napotkano *\n");

            ////printf("bufor_roboczy[%d] = %c\n", kursor, bufor_roboczy[kursor]);

            //to co stoi na dole

            if(bufor_roboczy[kursor-1] == ')')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            ////printf("z_nawiasami = %d\n", z_nawiasami);

            for(int i = kursor-1; i >= 0; i--) //jazda do tylu

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow++;

                    }

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow--;

                        if(ilenawiasow == 0)

                        {

                            o_ile_cofnac = ile_do_dolara(i);

                            if(o_ile_cofnac > 0)

                            {

                                ////printf("o_ile_cofnac = %d\n", o_ile_cofnac);

                                i -= o_ile_cofnac;

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                //w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 6, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'p';

                                bufor_roboczy[i+2] = 'l';

                                bufor_roboczy[i+3] = 'u';

                                bufor_roboczy[i+4] = 's';

                                bufor_roboczy[i+5] = '(';

                                bufor_roboczy[kursor+6] = ',';

                                kursor += 6;

                            }

                            else

                            {

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 4, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'p';

                                bufor_roboczy[i+2] = 'l';

                                bufor_roboczy[i+3] = 'u';

                                bufor_roboczy[i+4] = 's';

                                bufor_roboczy[kursor+4] = ',';

                                kursor += 4;

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                break;

                            }

                        }

                    }

                }

                else if(z_nawiasami == 0)

                {

                    if(bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == ',' || bufor_roboczy[i] == '(')

                    {

                        ////printf("1bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();;

                        w_prawo(bufor_roboczy, i+1, 6, buformax);

                        //w_prawo(bufor_roboczy, i, 5, buformax);

                        //test();;

                        bufor_roboczy[i+1] = '$';

                        bufor_roboczy[i+2] = 'p';

                        bufor_roboczy[i+3] = 'l';

                        bufor_roboczy[i+4] = 'u';

                        bufor_roboczy[i+5] = 's';

                        bufor_roboczy[i+6] = '(';

                        bufor_roboczy[kursor+6] = ',';

                        kursor+=6;

                        break;

                    }

                    if(i == 0)

                    {

                        ////printf("i == 0\n");

                        ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();

                        w_prawo(bufor_roboczy, i, 6, buformax);

                        //test();

                        bufor_roboczy[i] = '$';

                        bufor_roboczy[i+1] = 'p';

                        bufor_roboczy[i+2] = 'l';

                        bufor_roboczy[i+3] = 'u';

                        bufor_roboczy[i+4] = 's';

                        bufor_roboczy[i+5] = '(';

                        bufor_roboczy[kursor+6] = ',';

                        kursor+=6;

                        //bufor_roboczy[kursor] = ',';

                        break;

                    }

                }

            }

            //to do czego podnosimy

            ////printf("kursor stoi na %c\n", bufor_roboczy[kursor]);

            if(bufor_roboczy[kursor+1] == '(')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            //test();

            for(int i = kursor+1; i < buformax; i++)

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(bufor_roboczy[i] == '$')

                {

                    z_nawiasami = 1;

                }

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow++;

                    }

                    else if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow--;

                        if(ilenawiasow == 0)

                        {

                            //test();

                            w_prawo(bufor_roboczy, i, 1, buformax);

                            //test();

                            bufor_roboczy[i] = ')';

                            kursor = i+1;

                            break;

                        }

                    }

                }

                if(z_nawiasami == 0 && (bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == '\0' || bufor_roboczy[i] == ')' || bufor_roboczy[i] == ','))

                {

                    w_prawo(bufor_roboczy, i, 1, buformax);

                    bufor_roboczy[i] = ')';

                    kursor = i;

                    break;

                }

            }

        }

    }

    ////printf("\n");

    return czy_wszystko;

}

 

bool parser_odejmowania() //1 gdy nie znaleziono odejmowania, 0 gdy znaleziono

{

    kursor = 0;

    int ilenawiasow = 0;

    bool czy_wszystko = 1;

    int o_ile_cofnac = 0;

    for(kursor; kursor < buformax-1; kursor++)

    {

        ////printf("%c", bufor_roboczy[kursor]);

        if(bufor_roboczy[kursor] == '-')

        {

            czy_wszystko = 0;

            ////printf("napotkano *\n");

            ////printf("bufor_roboczy[%d] = %c\n", kursor, bufor_roboczy[kursor]);

            //to co stoi na dole

            if(bufor_roboczy[kursor-1] == ')')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            ////printf("z_nawiasami = %d\n", z_nawiasami);

            for(int i = kursor-1; i >= 0; i--) //jazda do tylu

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow++;

                    }

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow--;

                        ////printf("ile_do_dolara = %d\n", ile_do_dolara(i));

                        //i -= ile_do_dolara(i);

                        if(ilenawiasow == 0)

                        {

                            o_ile_cofnac = ile_do_dolara(i);

                            if(o_ile_cofnac > 0)

                            {

                                ////printf("o_ile_cofnac = %d\n", o_ile_cofnac);

                                i -= o_ile_cofnac;

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                //w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 7, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'm';

                                bufor_roboczy[i+2] = 'i';

                                bufor_roboczy[i+3] = 'n';

                                bufor_roboczy[i+4] = 'u';

                                bufor_roboczy[i+5] = 's';

                                bufor_roboczy[i+6] = '(';

                                bufor_roboczy[kursor+7] = ',';

                                kursor += 7;

                            }

                            else

                            {

                                //test();

                                //w_prawo(bufor_roboczy, i, 1, kursor);

                                //test();

                                w_prawo(bufor_roboczy, i, 1, kursor);

                                w_prawo(bufor_roboczy, i, 5, buformax);

                                bufor_roboczy[i] = '$';

                                bufor_roboczy[i+1] = 'm';

                                bufor_roboczy[i+2] = 'i';

                                bufor_roboczy[i+3] = 'n';

                                bufor_roboczy[i+4] = 'u';

                                bufor_roboczy[i+5] = 's';

                                bufor_roboczy[kursor+5] = ',';

                                kursor += 5;

                                //test();

                                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                                break;

                            }

                        }

                    }

                }

                else if(z_nawiasami == 0)

                {

                    if(bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == ',' || bufor_roboczy[i] == '(')

                    {

                        ////printf("1bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();

                        w_prawo(bufor_roboczy, i+1, 7, buformax);

                        //w_prawo(bufor_roboczy, i, 5, buformax);

                        //test();

                        bufor_roboczy[i+1] = '$';

                        bufor_roboczy[i+2] = 'm';

                        bufor_roboczy[i+3] = 'i';

                        bufor_roboczy[i+4] = 'n';

                        bufor_roboczy[i+5] = 'u';

                        bufor_roboczy[i+6] = 's';

                        bufor_roboczy[i+7] = '(';

                        bufor_roboczy[kursor+7] = ',';

                        kursor+=7;

                        break;

                    }

                    if(i == 0)

                    {

                        ////printf("i == 0\n");

                        ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                        //test();

                        w_prawo(bufor_roboczy, i, 7, buformax);

                        //test();

                        bufor_roboczy[i] = '$';

                        bufor_roboczy[i+1] = 'm';

                        bufor_roboczy[i+2] = 'i';

                        bufor_roboczy[i+3] = 'n';

                        bufor_roboczy[i+4] = 'u';

                        bufor_roboczy[i+5] = 's';

                        bufor_roboczy[i+6] = '(';

                        bufor_roboczy[kursor+7] = ',';

                        kursor+=7;

                        //bufor_roboczy[kursor] = ',';

                        break;

                    }

                }

            }

            //to do czego podnosimy

            ////printf("kursor stoi na %c\n", bufor_roboczy[kursor]);

            if(bufor_roboczy[kursor+1] == '(')

            {

                z_nawiasami = 1;

            }

            else

            {

                z_nawiasami = 0;

            }

            //test();

            for(int i = kursor+1; i < buformax; i++)

            {

                ////printf("bufor_roboczy[%d] = %c\n", i, bufor_roboczy[i]);

                if(bufor_roboczy[i] == '$')

                {

                    z_nawiasami = 1;

                }

                if(z_nawiasami == 1)

                {

                    if(bufor_roboczy[i] == '(')

                    {

                        ilenawiasow++;

                    }

                    else if(bufor_roboczy[i] == ')')

                    {

                        ilenawiasow--;

                        if(ilenawiasow == 0)

                        {

                            //test();

                            w_prawo(bufor_roboczy, i, 1, buformax);

                            //test();

                            bufor_roboczy[i] = ')';

                            kursor = i+1;

                            break;

                        }

                    }

                }

                if(z_nawiasami == 0 && (bufor_roboczy[i] == '/' || bufor_roboczy[i] == '*' || bufor_roboczy[i] == '+' || bufor_roboczy[i] == '-' || bufor_roboczy[i] == '\0' || bufor_roboczy[i] == ')' || bufor_roboczy[i] == ','))

                {

                    w_prawo(bufor_roboczy, i, 1, buformax);

                    bufor_roboczy[i] = ')';

                    kursor = i;

                    break;

                }

            }

        }

    }

    ////printf("\n");

    return czy_wszystko;

}

 

bool parser_zmiennej() //1 gdy nie znaleziono odejmowania, 0 gdy znaleziono

{

    kursor = 0;

    bool czy_wszystko = 1;

    for(kursor; kursor<buformax-1; kursor++)

    {

        if(bufor_roboczy[kursor] == '#')

        {

            for(int i = 0; i <ile_zmiennych; i++)

            {

                if(porownaj_nazwy_zmiennej(bufor_roboczy, nazwa_zmiennej, ile_znakow_ma_zmienna[i], i, 0) == 1)

                {

                    czy_wszystko = 0;

                    w_prawo(bufor_roboczy, kursor + ile_znakow_ma_zmienna[i] -1, 1, buformax);

                    bufor_roboczy[kursor] = '#';

                    kursor = kursor + ile_znakow_ma_zmienna[i] -1;

                }

            }

        }

    }

    return czy_wszystko;

}

 

 

int sprawdzacz_numeru_zmiennej(int gdzie_hasztag) //-1 gdy nie znaleziono, 0+ numer

{

    int j = 0;

    for(int i = 0; i < ile_zmiennych; i++)

    {

        j = 0;

        for(j; j < ile_znakow_ma_zmienna[i]; j++)

        {

            if(bufor_roboczy[gdzie_hasztag+j] != nazwa_zmiennej[i][j])

                break;

        }

        if(j == ile_znakow_ma_zmienna[i])

            return i;

    }

    return -1;

}

 

int nowa_zmienna(int gdzie_hasztag)

{

    return -1;

}

 

int parser_rownania() //zwraca numer zmiennej, do ktorej nalezy zapisac wynik (0 - ans, 1+ - custom), -1 gdy wpisano cos zle lub niewspieranego.

{

    kursor = 0;

    int ilenawiasow = 0;

    int ile_rownasie = 0;

    int gdzie_znak_rownosci = 0;

    bool czy_dzialania_po_lewej = 0;

    //bool czy_dzialania_po_prawej = 0;

    int do_zwrotu = 0;

 

    for(kursor; kursor < buformax-2; kursor++)

    {

        if(bufor_roboczy[kursor] == '$' && bufor_roboczy[kursor+1] == '=')

            ile_rownasie++;

    }

    if(ile_rownasie == 0)

        return 0;

    else if(ile_rownasie > 1)

    {

        //kod_bledu = 2;

        //wypluj_blad();

        return -1;

    }

    else

    {

        kursor = 0;

        for(kursor; kursor < buformax-2; kursor++) //lewa strona rownania

        {

            if(bufor_roboczy[kursor] == '$' && bufor_roboczy[kursor+1] == '=')

                break;

            else if(bufor_roboczy[kursor] == '$')

                czy_dzialania_po_lewej = 1;

        }

        if(czy_dzialania_po_lewej == 1)

        {

            //kod_bledu = 3;

            //wypluj_blad();

            return -1;

        }

        else if(bufor_roboczy[0] == '#')

        {

            do_zwrotu = sprawdzacz_numeru_zmiennej(0);

            if (do_zwrotu == -1)

            {

                do_zwrotu = nowa_zmienna(0);

                if (do_zwrotu == -1)

                {

                    //kod_bledu = 4;

                    //wypluj_blad();

                    return -1;

                }

            }

        }

        return do_zwrotu;

    }

    return do_zwrotu;

}

//*/

 

double solver()

{

    //kursor = 0;

    int numer_zmiennej = 0;

    int numer_funkcji = 0;

    double do_zwrotu = 0;

    int tempint = 0;

    int tempintmax = 0;

    int gdzie_kropka = 0;

    double liczba_do_zwrotu = 0;

    bool tempbool = 0;

    double AA = 0;

    double BB = 0;

    double CC = 0;

    for(kursor; kursor < buformax; kursor++)

    {

        /*

        if(bufor_roboczy[kursor] == '#')

        {

            numer_zmiennej = sprawdzacz_numeru_zmiennej(kursor);

            kursor += ile_znakow_ma_zmienna[numer_zmiennej];

            return (wartosc_zmiennej[numer_zmiennej]);

        }

        */

        if(bufor_roboczy[kursor] == 'a' && bufor_roboczy[kursor+1] == 'n' && bufor_roboczy[kursor+2] == 's')

        {

            numer_zmiennej = 0;

            kursor +=4 ;

            return (wartosc_zmiennej[numer_zmiennej]);

        }

        else if(bufor_roboczy[kursor] == 'e')

        {

            numer_zmiennej = 2;

            kursor +=2 ;

            //printf("bufor_roboczy[%d] = %c liczba_do_zwrotu = %lf\n", kursor, bufor_roboczy[kursor], liczba_do_zwrotu);

            return (wartosc_zmiennej[numer_zmiennej]);

        }

        else if(bufor_roboczy[kursor] == 'p' && bufor_roboczy[kursor+1] == 'i')

        {

            numer_zmiennej = 1;

            kursor +=3 ;

            //printf("bufor_roboczy[%d] = %c liczba_do_zwrotu = %lf\n", kursor, bufor_roboczy[kursor], wartosc_zmiennej[numer_zmiennej]);

            return (wartosc_zmiennej[numer_zmiennej]);

        }

        else if(bufor_roboczy[kursor] == '$')

        {

            ////printf("znaleziono $\n");

            for(int int_taki_jakis = 0; int_taki_jakis <ile_funkcji; int_taki_jakis++)

            {

                ////printf("k = %d\n", k);

                tempbool = porownaj_nazwy_funkcji(bufor_roboczy, dostepne_funkcje, ile_znakow_ma_funkcja[int_taki_jakis], int_taki_jakis);

                ////printf("porownaj zwraca %d\n", tempbool);

                if(tempbool == 1)

                {

                    //AA = solver();

                    //BB = solver();

                    ////printf("eeeee\n");

                    numer_funkcji = int_taki_jakis;

                    kursor++;

                    ////printf("znaleziono %s kursor = %d\n", dostepne_funkcje[numer_funkcji], kursor);

                    //kursor = kursor + ile_znakow_ma_funkcja[numer_funkcji] + 1;

                    ////printf("abufor_roboczy[%d] = %c\n", kursor, bufor_roboczy[kursor]);

                    switch (numer_funkcji)

                    {

                        case 0:

                            AA = solver();

                            BB = solver();

                            CC = pow(AA,BB);

                            //printf("%lf ^ %lf = %lf\n", AA, BB, CC);

                            //return(pow(solver(),solver())); TAK NIE DZIAŁA, ale AA BB CC juz tak :)

                            break;

                        case 1:

                            AA = solver();

                            BB = solver();

                            CC = (AA*BB);

                            //printf("%lf * %lf = %lf\n", AA, BB, CC);

                            //return(solver()*solver());

                            break;

                        case 2:

                            AA = solver();

                            BB = solver();

                            CC = (AA/BB);

                            //printf("%lf / %lf = %lf\n", AA, BB, CC);

                            //return(solver()/solver());

                            break;

                        case 3:

                            AA = solver();

                            BB = solver();

                            CC = (AA+BB);

                            //printf("%lf + %lf = %lf\n", AA, BB, CC);

                            //return(solver()+solver());

                            break;

                        case 4:

                            AA = solver();

                            BB = solver();

                            CC = (AA-BB);

                            //printf("%lf - %lf = %lf\n", AA, BB, CC);

                            //return(solver()-solver());

                            break;

                    }

                    return CC;

                }

 

            }

            //printf("nie znaleziono funkcji, kursor = %d\n", kursor);

            //kod_bledu = 5;

            //wypluj_blad();

            return -1;

 

        }

        else if((bufor_roboczy[kursor] - 48) >= 0 && (bufor_roboczy[kursor] - 48) <= 9)

        {

            tempint = 0;

            for(tempint; tempint < buformax-kursor; tempint++)

            {

                ////printf("tempint = %d\n", tempint);

                ////printf("bufor_roboczy[%d] = %c\n", kursor+tempint, bufor_roboczy[kursor+tempint]);

                if(bufor_roboczy[kursor+tempint] == ',' || bufor_roboczy[kursor+tempint] == ')' || bufor_roboczy[kursor+tempint] == '\0')

                {

                    ////printf("nastapil break\n");

                    break;

                }

                else if(bufor_roboczy[kursor+tempint] == '.')

                    gdzie_kropka = tempint;

            }

            tempintmax = tempint;

            if(gdzie_kropka == 0)

                gdzie_kropka = tempint;

            tempint--;

            for(tempint; tempint >=0; tempint--) //znowuz do tylu

            {

                if(tempint > gdzie_kropka)

                {

                    liczba_do_zwrotu += (bufor_roboczy[kursor+tempint] - 48) * pow(10, gdzie_kropka-tempint);

                }

                else

                {

                    liczba_do_zwrotu += (bufor_roboczy[kursor+tempint] - 48) * pow(10, gdzie_kropka-tempint-1);

                }

            }

            kursor = kursor + tempintmax + 1;

            //printf("bufor_roboczy[%d] = %c liczba_do_zwrotu = %lf\n", kursor, bufor_roboczy[kursor], liczba_do_zwrotu);

            return liczba_do_zwrotu;

        }

        else if(bufor_roboczy[kursor] == '(')

        {

            kursor++;

            return solver();

        }

    }

    return -1;

}

 

double kalkulator_main()

{

    bool czy_wszystkie_potegi = 0;

    bool czy_wszystkie_mnozenia = 0;

    bool czy_wszystkie_dzielenia = 0;

    bool czy_wszystkie_dodawania = 0;

    bool czy_wszystkie_odejmowania = 0;

    bool czy_wszystkie_zmienne = 0;

    //sekcja testowa

 

    /*

    bufor_roboczy[0] = '(';

    bufor_roboczy[1] = '4';

    bufor_roboczy[2] = '*';

    bufor_roboczy[3] = 'e';

    bufor_roboczy[4] = ')';

    bufor_roboczy[5] = '^';

    bufor_roboczy[6] = '(';

    bufor_roboczy[7] = '2';

    bufor_roboczy[8] = '*';

    bufor_roboczy[9] = '1';

    bufor_roboczy[10] = ')';

    bufor_roboczy[11] = '-';

    bufor_roboczy[12] = '3';

    //*/

    /*

    bufor_roboczy[0] = '4';

    bufor_roboczy[1] = '*';

    bufor_roboczy[2] = '3';

    //*/

 

    //scanf("%s", bufor_roboczy);

 

    //for(int i = 0; i < buformax; i++)

        //bufor_roboczy[i] = '\0';

        //Serial.print(bufor_roboczy[i]);

    //Serial.println();

    //test();

    verbose = 0;

    czy_wszystkie_potegi = 0;

    while(czy_wszystkie_potegi == 0)

    {

        kursor = 0;

        czy_wszystkie_potegi = parser_potegowania();

        ////printf("czy_wszystkie_potegi = %d\n", czy_wszystkie_potegi);

    }

    //test();

    czy_wszystkie_mnozenia = 0;

    while(czy_wszystkie_mnozenia == 0)

    {

        kursor = 0;

        czy_wszystkie_mnozenia = parser_mnozenia();

        ////printf("czy_wszystkie_potegi = %d\n", czy_wszystkie_potegi);

    }

    czy_wszystkie_dzielenia = 0;

    while(czy_wszystkie_dzielenia == 0)

    {

        kursor = 0;

        czy_wszystkie_dzielenia = parser_dzielenia();

        ////printf("czy_wszystkie_potegi = %d\n", czy_wszystkie_potegi);

    }

    czy_wszystkie_dodawania = 0;

    while(czy_wszystkie_dodawania == 0)

    {

        kursor = 0;

        czy_wszystkie_dodawania = parser_dodawania();

        ////printf("czy_wszystkie_potegi = %d\n", czy_wszystkie_potegi);

    }

    czy_wszystkie_odejmowania = 0;

    while(czy_wszystkie_odejmowania == 0)

    {

        kursor = 0;

        czy_wszystkie_odejmowania = parser_odejmowania();

        ////printf("czy_wszystkie_potegi = %d\n", czy_wszystkie_potegi);

    }

    czy_wszystkie_zmienne = 0;

    while(czy_wszystkie_zmienne == 0)

    {

        kursor = 0;

        czy_wszystkie_zmienne = parser_zmiennej();

        //printf("czy_wszystkie_zmienne = %d\n", czy_wszystkie_zmienne);

    }

    //test();

    //test();

    //printf("\n");

    //*/

 

 

 

    /*

    bufor_roboczy[0] = '3';

    bufor_roboczy[1] = '7';

    bufor_roboczy[2] = '1';

    bufor_roboczy[3] = '2';

    bufor_roboczy[4] = '9';

    //*/

    kursor = 0;

    double wynik = 0;

    wynik = solver();

    wartosc_zmiennej[0] = wynik;

    for(int k = 0; k < buformax; k++)

      bufor_roboczy[k] = '\0';

    kursor = 0;

    //printf("solver = %lf\n", testowy_wynik);

    //Serial.println(wynik);

    //verbose = 1;

    //test();

    //printf("\nkoniec\n");

    //koniec sekcji testowej

    return 0;

}

 

 

 

int rozetka(int nr_rozetki)

{

int pin = 0;

int wybor = -100;

if(nr_rozetki == 1)

pin = gora;

else if(nr_rozetki == 2)

pin = dol;

  else

  {

    //Serial.println("koniec pamięci");

    return -100;

  }

while(digitalRead(pin) == LOW)

{

while(digitalRead(d_pad_gora) == LOW)

{

if(digitalRead(d_pad_lewo) == LOW)

      {

wybor = 11;

        OLED_w_element(nr_rozetki,wybor);

      }

else if(digitalRead(d_pad_prawo) == LOW)

      {

wybor = 1;

        OLED_w_element(nr_rozetki,wybor);

      }

      else

      {

wybor = 0;

        OLED_w_element(nr_rozetki,wybor);

      }

      //Serial.print("wybor = ");

      //Serial.println(wybor);

      if(digitalRead(pin) == HIGH)

        return wybor;

delay(10);

}

while(digitalRead(d_pad_prawo) == LOW)

{

if(digitalRead(d_pad_gora) == LOW)

      {

wybor = 2;

        OLED_w_element(nr_rozetki,wybor);

      }

else if(digitalRead(d_pad_dol) == LOW)

      {

wybor = 4;

        OLED_w_element(nr_rozetki,wybor);

      }

else

      {

wybor = 3;

        OLED_w_element(nr_rozetki,wybor);

      }

      //Serial.print("wybor = ");

      //Serial.println(wybor);

      if(digitalRead(pin) == HIGH)

        return wybor;

delay(10);

}

while(digitalRead(d_pad_dol) == LOW)

{

if(digitalRead(d_pad_lewo) == LOW)

      {

wybor = 7;

        OLED_w_element(nr_rozetki,wybor);

      }

      else if(digitalRead(d_pad_prawo) == LOW)

      {

wybor = 5;

        OLED_w_element(nr_rozetki,wybor);

      }

else

      {

wybor = 6;

        OLED_w_element(nr_rozetki,wybor);

      }

      //Serial.print("wybor = ");

      //Serial.println(wybor);

      if(digitalRead(pin) == HIGH)

        return wybor;

delay(10);

}

while(digitalRead(d_pad_lewo) == LOW)

{

if(digitalRead(d_pad_gora) == LOW)

      {

wybor = 10;

        OLED_w_element(nr_rozetki,wybor);

      }

else if(digitalRead(d_pad_dol) == LOW)

      {

wybor = 8;

        OLED_w_element(nr_rozetki,wybor);

      }

else

      {

wybor = 9;

        OLED_w_element(nr_rozetki,wybor);

      }

      //Serial.print("wybor = ");

      //Serial.println(wybor);

      if(digitalRead(pin) == HIGH)

        return wybor;

delay(10);

}

    delay(10);

}

  return wybor;

}

 

bool czy_cos_wcisniete()

{

  if(digitalRead(dol) == LOW || digitalRead(gora) == LOW || digitalRead(d_pad_lewo) == LOW || digitalRead(d_pad_prawo) == LOW || digitalRead(d_pad_gora) == LOW || digitalRead(d_pad_dol) == LOW)

    return 1;

  else

    return 0;

}

 

//*

int input()

{

  int zwrot = -1;

  if (digitalRead(gora) == LOW)

  {

    for(int i = 0; i < 30; i++)

    {

      delay(10);

      if (digitalRead(gora) == HIGH)

      {

        delay(10);

        for(int i = 0; i < 30; i++)

        {

          delay(10);

          if (digitalRead(gora) == LOW)

          {

            Serial.println("rozetka nr 3");

            zwrot = rozetka(3) + 24;

            while(czy_cos_wcisniete() == 1)

              delay(30);

            return zwrot;

          }  

        }

      }

    }

    Serial.println("rozetka nr 1");

    zwrot = rozetka(1);

    while(czy_cos_wcisniete() == 1)

      delay(30);

    return zwrot;

  }

  if (digitalRead(dol) == LOW)

  {

    for(int i = 0; i < 30; i++)

    {

      delay(10);

      if (digitalRead(dol) == HIGH)

      {

        delay(10);

        for(int i = 0; i < 30; i++)

        {

          delay(10);

          if (digitalRead(dol) == LOW)

          {

            Serial.println("rozetka nr 4");

            zwrot = rozetka(3) + 36;

            while(czy_cos_wcisniete() == 1)

              delay(30);

            return zwrot;

          }  

        }

      }

    }

    Serial.println("rozetka nr 2");

    zwrot = rozetka(2) + 12;

    while(czy_cos_wcisniete() == 1)

      delay(30);

    return zwrot;

  }

  if(digitalRead(d_pad_lewo) == LOW)

  {

    kursor--;

    return -100;

  }

  if(digitalRead(d_pad_prawo) == LOW)

  {

    kursor++;

    return -100;

  }

  if(digitalRead(d_pad_gora) == LOW)

  {

    wy_ans2(wartosc_zmiennej[0]);

    delay(2000);

    wy_bufor();

    return -100;

  }

  if(digitalRead(d_pad_dol) == LOW)

  {

    wy_ans2(wartosc_zmiennej[0]);

    delay(2000);

    wy_bufor();

    return -100;

  }

  return -100;

}

 

void loop()

{

  if(kursor < 0)

    kursor = 0;

  if(kursor >= buformax)

    kursor = buformax-1;

  co_dopisac_loop = -100;

  //delay(500);

 

  if(co_dopisac_loop < 0)

  {

    co_dopisac_loop = input();

    //Serial.println(co_dopisac_loop);

    delay(10);

  }

  if(co_dopisac_loop < 0)

    return;

 

  //Serial.print("co_dopisac_loop = ");

  //Serial.println(co_dopisac_loop);

  if(co_dopisac_loop == 11)

  {

    co_dopisac_loop = -100;

    kalkulator_main();

    Serial.print("ans = ");

    Serial.println(wartosc_zmiennej[0]);

    wy_ans2(wartosc_zmiennej[0]);

    delay(5000);

  }

 

  //Serial.println("a");

  if(co_dopisac_loop == 10) //C

  {

    co_dopisac_loop = -100;

    //w_lewo();

    for(int i = 0; i < buformax; i++)

      bufor_roboczy[kursor] = '\0';

    kursor = 0;

    delay(10);

  }

  //Serial.println("b");

  if(co_dopisac_loop > 20) //nieużyte

  {

    co_dopisac_loop = -100;

    delay(10);

    //return;

  }

  if(co_dopisac_loop < 11 || (co_dopisac_loop > 11 && co_dopisac_loop < 21)) //rzeczy

  {

    //w_prawo(bufor_roboczy, kursor, 1, buformax);

    int j = 0;

    for(j; j < 4; j++)

    {

      if(co_dopisac_loop > 11)

        co_dopisac_loop-=12;

      else

        break;

    }

    bufor_roboczy[kursor] = elementy_rozetki[j][co_dopisac_loop][0];

    kursor++;

    co_dopisac_loop = -100;

    delay(10);

  }

  //Serial.println("-=-=-=-=-=-=-=-");

  for(int j = 0; j < buformax; j++)

  {

    Serial.print(bufor_roboczy[j]);

  }

  Serial.println();

  //Serial.println("-=-=-=-=-=-=-=-");

  wy_bufor();

  co_dopisac_loop = -100;

  delay(10);

  return;

}

 

void OLED_w_element(int nr_rozetki, int index) {

  //return;

  display.clearDisplay();

  display.setRotation(2);

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(5, 10);

  display.println("Numer rozetki:");

  display.println(nr_rozetki);

  display.println("Element:");

  if (index >= 0 && index < (sizeof(elementy_rozetki[nr_rozetki-1]) / sizeof(elementy_rozetki[nr_rozetki-1][0]))) {

    display.print(elementy_rozetki[nr_rozetki-1][index]);

  } else {

    display.print("Blad");

  }

  display.display();

  return;

}

 

void wy_bufor() {

  //return;

  display.clearDisplay();

  display.setRotation(2);

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(5, 10);

  display.println("-=-=-=-=-=-=-=-");

  for(int i = 0; i < buformax; i++)

  {

    display.print(bufor_roboczy[i]);

  }

  display.println();

  display.println("-=-=-=-=-=-=-=-");

  display.display();

  return;

}

 

void wy_ans(double wynik)

{

  //return;

  display.clearDisplay();

  display.setRotation(2);

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(10,50);

  display.cp437(true);

  //return;

  //*

  // Konwersja double -> String z max 8 miejscami

  String wynikStr = String(wynik, 8);

  return;

  int dotIndex = wynikStr.indexOf('.');

  int decimalPlaces = 0;

 

   if (dotIndex != -1) {

    decimalPlaces = wynikStr.length() - dotIndex - 1;

 

    // Usuwanie końcowych zer

    while (wynikStr.endsWith("0")) {

      wynikStr.remove(wynikStr.length() - 1);

      decimalPlaces--;

    }

 

    // Usuwanie kropki jeśli nie ma nic po niej

    if (wynikStr.endsWith(".")) {

      wynikStr.remove(wynikStr.length() - 1);

    }

  }

 

    // Dodajemy wykrzyknik, jeśli miejsc po przecinku było więcej niż 5

  if (decimalPlaces > 5) {

    wynikStr += "!";

  }

  //*/

 

  display.print("ans = ");

  display.print(wynik);

  display.display();

  return;

}

 

void wy_ans2(double wynik)

{

  //return;

  display.clearDisplay();

  display.setRotation(2);

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(10,50);

  display.cp437(true);

 

  //return;

  //*

  // Konwersja double -> String z max 8 miejscami

  bool isDot = 1;

  if(wynik == (int)wynik)  

    isDot = 0;

 

  bool didNumberBegin = 0;

  int ansNumber = 0;

  display.print("ans = ");

  if(wynik < 0)

    display.print("-");

  double tempDouble = 0;

  //tempDouble = (int)wynik;

  //display.print(tempDouble);

  //*

  if(abs(wynik) >= 1)

  {

    for(int i = pow(10,4); i >= 1; i /=10)

    {

      tempDouble = wynik/i;

      ansNumber = (int)tempDouble;

      //if(i == 1)

        //ansNumber = (int)wynik; //?

      Serial.print("i = ");

      Serial.print(i);

      Serial.print(" ansNumber = ");

      Serial.println(ansNumber);

      Serial.print("wynik = ");

      Serial.println(wynik);

      //wynik -= ansNumber * i;

      if(ansNumber != 0)

      {

        didNumberBegin = 1;

        wynik -= ansNumber * i;

        Serial.print("wynik = ");

        Serial.println(wynik);

        //Serial.print("wynik = ");

        //Serial.println(wynik);

        display.print(ansNumber);

      }

      else if(didNumberBegin == 1)

      {

        display.print("0");

      }

      else

        continue;

    }

  }

  else

    display.print("0");

    //*/

  if(isDot == 1)

  {

    display.print(".");

    for(float i = 0.1; i >= 0.0001; i /=10)

    {

      ansNumber = (int)(wynik/i);

      Serial.print("i = ");

      Serial.print(i);

      Serial.print(" ansNumber = ");

      Serial.println(ansNumber);

      Serial.print("wynik = ");

      Serial.println(wynik);

      //wynik -= ansNumber * i;

      //didNumberBegin = 1;

      wynik -= ansNumber * i;

      display.print(ansNumber);

    }

 

  }

  //

  //display.print(wynik);

  display.display();

  return;

}

 

Pliki_projektu
Tagi
kalkulator arduino matematyka console