Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include<cstdio>
- #include<fstream>
- #include<cctype>
- #include <iostream>
- using namespace std;
- //////////////////////////////////////////LISTY
- struct jeden_onp
- {
- jeden_onp *nastepny_onp;
- jeden_onp *poprzedni_onp;
- double znak;
- jeden_onp();
- };
- jeden_onp::jeden_onp()
- {
- nastepny_onp = 0;
- poprzedni_onp = 0;
- };
- struct onp
- {
- jeden_onp *pierwszy_onp;
- jeden_onp *ostatni_onp;
- void dodaj_liczbe(double a);
- void usun_liczbe();
- onp();
- };
- onp::onp()
- {
- pierwszy_onp = 0;
- }
- void onp::dodaj_liczbe(double liczba)
- {
- jeden_onp *Znak = new jeden_onp;
- Znak->znak = liczba;
- if (pierwszy_onp == 0)
- {
- Znak->nastepny_onp=0;
- Znak->poprzedni_onp=0;
- pierwszy_onp = Znak;
- ostatni_onp=Znak;
- }
- else
- {
- ostatni_onp->nastepny_onp = Znak;
- Znak->nastepny_onp = 0;
- Znak->poprzedni_onp = ostatni_onp;
- ostatni_onp=Znak;
- }
- }
- void onp::usun_liczbe()
- {
- if (pierwszy_onp == ostatni_onp)
- {
- pierwszy_onp=0;
- }
- else
- {
- jeden_onp *przed_usuwanym = ostatni_onp->poprzedni_onp;
- przed_usuwanym->nastepny_onp = 0;
- delete ostatni_onp;
- ostatni_onp=przed_usuwanym;
- }
- }
- struct Zmienna
- {
- char nazwa[100];
- double wartosc;
- int nr_nastepny;
- };
- double licze_nawias(Zmienna TablicaZmiennych[]);
- int Hasz(char TablicaDoZakodowania[]);
- int szukam_w_tablicy(char TablicaDoZnalezienia[]);
- int porownanie_ciagu(char Tablica1[], char Tablica2[])
- {
- int czy_to_samo = 1;
- int i =0;
- while ((Tablica2[i]!='\0')&&(czy_to_samo ==1))
- {
- if (Tablica2[i] != Tablica1[i])
- {
- czy_to_samo=0;
- }
- i++;
- }
- return czy_to_samo;
- }
- int Hasz(char TablicaDoZakodowania[])
- {
- int Numer_Tablicy=0;
- int pomoc;
- int i = 0;
- while (TablicaDoZakodowania[i] != '\0')
- {
- // cout<<TablicaDoZakodowania[i]<<" ma numer ";
- pomoc = (int)TablicaDoZakodowania[i];
- // cout<<"znaku "<<pomoc<<endl;
- pomoc=pomoc*123;
- Numer_Tablicy += pomoc;
- i++;
- }
- Numer_Tablicy = Numer_Tablicy*333;
- Numer_Tablicy = Numer_Tablicy/24.23454;
- Numer_Tablicy = Numer_Tablicy%10000;
- Numer_Tablicy++;
- return Numer_Tablicy;
- }
- int szukam_w_tablicy(char TablicaDoZnalezienia[], Zmienna TablicaZmiennych[])
- {
- int gdzie_powinno;
- int flaga = 0;
- int i = 0;
- gdzie_powinno = Hasz(TablicaDoZnalezienia);
- if(TablicaZmiennych[gdzie_powinno].nazwa[0] != TablicaDoZnalezienia[0])
- {
- while((TablicaZmiennych[gdzie_powinno].nazwa[i] != '\n')&&(TablicaDoZnalezienia[i]!= '\n'))
- {
- if(TablicaZmiennych[gdzie_powinno].nazwa[i] != TablicaDoZnalezienia[i])
- flaga=1;
- i++;
- }
- while(flaga==1)
- {
- gdzie_powinno=TablicaZmiennych[gdzie_powinno].nr_nastepny;
- int i = 0;
- flaga = 0;
- while((TablicaZmiennych[gdzie_powinno].nazwa[i] != '\n')&&(TablicaDoZnalezienia[i]!= '\n'))
- {
- if(TablicaZmiennych[gdzie_powinno].nazwa[i] != TablicaDoZnalezienia[i])
- flaga=1;
- i++;
- }
- }
- }
- return gdzie_powinno;
- }
- double licze_nawias(Zmienna TablicaZmiennych[])
- {
- onp *ONP = new onp;
- onp *STOS = new onp;
- char znak;
- double liczba;
- //int koniec_stosu=0;
- //int koniec_onp=0;
- ///int a=0;
- while(cin.peek()!= '\n')
- {
- if((cin.peek()=='+')||(cin.peek()=='-'))
- {
- znak=getchar();
- // int flaga = 0;
- // koniec_stosu--;
- while((STOS->ostatni_onp->znak!='(')&&(STOS->pierwszy_onp!=0))
- {
- ONP->dodaj_liczbe(STOS->ostatni_onp->znak);
- // onp[koniec_onp]=stos[koniec_stosu];
- STOS->usun_liczbe();
- // stos[koniec_stosu]=0;
- // koniec_onp++;
- // koniec_stosu--;
- // flaga = 1;
- }
- /*if(flaga==1)
- {
- koniec_onp--;
- koniec_stosu++;
- }*/
- // koniec_stosu++;
- double b = (double)znak;
- STOS->dodaj_liczbe(b);
- // stos[koniec_stosu]=(int)znak;
- // koniec_stosu++;
- }
- else if((cin.peek()=='/')||(cin.peek()=='*'))
- {
- znak=getchar();
- // int flaga = 0;
- // koniec_stosu--;
- while((STOS->ostatni_onp->znak!='(')&&(STOS->pierwszy_onp!=0)&&(STOS->ostatni_onp->znak!='+')&&(STOS->ostatni_onp->znak!='-'))
- {
- ONP->dodaj_liczbe(STOS->ostatni_onp->znak);
- // onp[koniec_onp]=stos[koniec_stosu];
- STOS->usun_liczbe();
- // stos[koniec_stosu]=0;
- // koniec_onp++;
- // koniec_stosu--;
- // flaga = 1;
- }
- /*if(flaga==1)
- {
- koniec_onp--;
- koniec_stosu++;
- }*/
- // koniec_stosu++;
- double b = (double)znak;
- STOS->dodaj_liczbe(b);
- // stos[koniec_stosu]=(int)znak;
- // koniec_stosu++;
- }
- else if((cin.peek()>=48)&&(cin.peek()<=57))
- {
- cin>>liczba;
- liczba=liczba*100;
- ONP->dodaj_liczbe(liczba);
- // onp[koniec_onp]=liczba*100;
- // koniec_onp++;
- }
- else if(((cin.peek()>='A')&&(cin.peek()<='Z'))||((cin.peek()>='a')&&(cin.peek()<='z')))
- {
- char *zmienna = new char[100];
- int help=0;
- while (cin.peek() != ' ')
- {
- znak = getchar();
- if((znak != ' ')&&(((znak>=65)&&(znak<=90))||((znak>=97)&&(znak<=122))))
- {
- zmienna[help]=znak;
- help++;
- }
- }
- zmienna[help] = '\0';
- int nr_zmiennej = szukam_w_tablicy(zmienna,TablicaZmiennych);
- liczba = TablicaZmiennych[nr_zmiennej].wartosc;
- liczba=liczba*100;
- ONP->dodaj_liczbe(liczba);
- delete[] zmienna;
- }
- else if(cin.peek()=='(')
- {
- znak=getchar();
- double b = (double)znak;
- STOS->dodaj_liczbe(znak);
- // stos[koniec_stosu]=(int)znak;
- // koniec_stosu++;
- }
- else if(cin.peek()==')')
- {
- znak=getchar();
- //koniec_stosu -= 1;
- while(STOS->ostatni_onp->znak!='(')
- {
- ONP->dodaj_liczbe(STOS->ostatni_onp->znak);
- //onp[koniec_onp]=stos[koniec_stosu];
- //stos[koniec_stosu]=0;
- //koniec_onp++;
- //koniec_stosu--;
- STOS->usun_liczbe();
- }
- //koniec_onp--;
- // stos[koniec_stosu]=0;
- STOS->usun_liczbe();
- }
- else
- {
- znak=getchar();
- }
- }
- ONP->dodaj_liczbe(61);
- jeden_onp *temp2 = ONP->pierwszy_onp;
- while(temp2->nastepny_onp!=0)
- {
- cout<<temp2->znak<<endl;
- temp2=temp2->nastepny_onp;
- }
- delete STOS;
- // double wynik [10];
- // koniec_onp=0;
- // int koniec_wynik=0;
- onp *WYNIK = new onp;
- jeden_onp *temp = ONP->pierwszy_onp;
- while ( temp->znak != 61)
- {
- if (temp->znak==43)///////////////////////////+////////////////////////////
- {
- WYNIK->ostatni_onp->poprzedni_onp->znak = WYNIK->ostatni_onp->znak + WYNIK->ostatni_onp->poprzedni_onp->znak;
- WYNIK->usun_liczbe();//koniec_wynik--;
- }
- else if (temp->znak==45)///////////////////////////-////////////////////////////
- {
- WYNIK->ostatni_onp->poprzedni_onp->znak = WYNIK->ostatni_onp->poprzedni_onp->poprzedni_onp->znak - WYNIK->ostatni_onp->poprzedni_onp->znak;
- WYNIK->usun_liczbe();//koniec_wynik--;
- }
- else if (temp->znak==42)///////////////////////////////////////////////////////
- {
- WYNIK->ostatni_onp->poprzedni_onp->znak = WYNIK->ostatni_onp->znak * WYNIK->ostatni_onp->poprzedni_onp->znak;
- WYNIK->usun_liczbe();//koniec_wynik--;
- }
- else if (temp->znak==47)///////////////////////////\////////////////////////////
- {
- WYNIK->ostatni_onp->poprzedni_onp->znak = WYNIK->ostatni_onp->poprzedni_onp->znak / WYNIK->ostatni_onp->znak;
- WYNIK->usun_liczbe();//koniec_wynik--;
- }
- else
- {
- temp->znak=temp->znak/100;
- WYNIK->dodaj_liczbe(temp->znak); // =temp->znak;
- // koniec_wynik++;
- }
- temp=temp->nastepny_onp;
- }
- cout<<WYNIK->pierwszy_onp->znak;
- return WYNIK->pierwszy_onp->znak;
- }
- void ustaw(Zmienna TablicaZmiennych[])
- {
- // cout<<"Ustawione"<<endl;
- for(int i=0;i<5;i++)
- {
- char polecenie;
- polecenie=getchar();
- }
- ///////////////////sczytuje zmiennej nazwe/////////////////
- int licznik=0;
- char *tablica_pomocnicza = new char[100];
- while(cin.peek() != ' ')
- {
- tablica_pomocnicza[licznik]=getchar();
- licznik++;
- }
- tablica_pomocnicza[licznik] = '\0';
- int nr_tab = Hasz(tablica_pomocnicza);
- ////////////////////sprawdzic czy puste/////////////////////////
- int nr2 = nr_tab;///////////////////////NR TAB to miejsce gdzie wpisze nowa zmienna
- if(TablicaZmiennych[nr_tab].wartosc != 0)
- {
- if (!porownanie_ciagu(TablicaZmiennych[nr_tab].nazwa, tablica_pomocnicza))
- {
- int Flaga = 1;
- while((TablicaZmiennych[nr_tab].nr_nastepny != 0)&&(Flaga==1))
- {
- nr_tab = TablicaZmiennych[nr_tab].nr_nastepny;
- nr2 = nr_tab;
- if (!porownanie_ciagu(TablicaZmiennych[nr_tab].nazwa, tablica_pomocnicza))
- {
- Flaga = 0;
- }
- }
- while((TablicaZmiennych[nr_tab].nr_nastepny != 0)&&(Flaga==1))
- {
- nr_tab++;
- }
- TablicaZmiennych[nr2].nr_nastepny = nr_tab;
- }
- }
- /////////////////////dalej///////////////////////
- for(int i=0; i<licznik; i++)
- {
- TablicaZmiennych[nr_tab].nazwa[i] = tablica_pomocnicza[i];
- }
- TablicaZmiennych[nr_tab].nazwa[licznik] = '\0';
- delete[] tablica_pomocnicza;
- ////////////////////sczytuje spacje rownosc i nawias//////////////////////////////////////////
- for(int i=0;i<5;i++)
- {
- char polecenie;
- polecenie=getchar();
- }
- /* char *nic = new char [2];
- nic[0] = '.';
- nic[1] = '\0';
- Para pomocniczo = licze_nawias(TablicaZmiennych, nic);
- delete[] nic;
- TablicaZmiennych[nr_tab].wartosc=pomocniczo.wynik;
- */
- TablicaZmiennych[nr_tab].wartosc=licze_nawias(TablicaZmiennych);
- /* cout<<"Wartosc w tablicy = "<<TablicaZmiennych[nr_tab].wartosc<<endl;
- cout<<"Nr komorki w tab = "<<nr_tab<<endl;
- cout<<"Nazwa zmiennej = ";
- for (int i=0; i<licznik; i++)
- {
- cout<<TablicaZmiennych[nr_tab].nazwa[i];
- }
- cout<<endl;
- */
- }
- void oblicz(Zmienna TablicaZmiennych[])
- {
- for(int i=0;i<8;i++)////////////////////sczytuje slowo
- {
- char polecenie;
- polecenie=getchar();
- }
- /*
- char *nic = new char[2];
- nic[0]='.';
- nic[1]='\0';
- Para cos = licze_nawias(TablicaZmiennych, nic);
- double wynik = cos.wynik;
- delete[] nic;
- */
- double wynik = licze_nawias(TablicaZmiennych);
- cout<<wynik<<endl;
- }
- void wyznacz(Zmienna TablicaZmiennych[])
- {
- /*
- char spacja;
- for(int i=0;i<7;i++)////////////////////sczytuje slowo
- {
- spacja=getchar();
- }
- int licznik=0;
- char *liczba_wyznaczana = new char[100];
- while(cin.peek() != ' ')
- {
- liczba_wyznaczana[licznik]=getchar();
- licznik++;
- }
- spacja=getchar();
- spacja=getchar();
- liczba_wyznaczana[licznik] = '\0';
- Para lewa, prawa;
- lewa = licze_nawias(TablicaZmiennych, liczba_wyznaczana);
- spacja=getchar();
- spacja=getchar();
- spacja=getchar();
- prawa = licze_nawias(TablicaZmiennych);
- // cout<<"ile liczb z lewej = "<<lewa.wynik<<" | ile zmiennych z lewej = "<<lewa.zmienne<<" | ile liczb z prawej = "<<prawa.wynik<<" | ile zmiennych z prawej = "<<prawa.zmienne<<endl;
- double ile_zmiennych, ile_liczb, wynik;
- ile_zmiennych=lewa.zmienne;
- ile_liczb = prawa.wynik - lewa.wynik;
- if(ile_zmiennych==0)
- {
- cout<<"Niepoprawne rownanie"<<endl;
- }
- else
- {
- wynik = ile_liczb * (1/ile_zmiennych);
- for(int i=0; i<licznik; i++)
- {
- cout<<liczba_wyznaczana[i];
- }
- cout<<" = "<<wynik<<endl;
- }
- int nr_tab = Hasz(liczba_wyznaczana);
- ////////////////////sprawdzic czy puste/////////////////////////
- int nr2 = nr_tab;///////////////////////NR TAB to miejsce gdzie wpisze nowa zmienna
- if(TablicaZmiennych[nr_tab].wartosc != 0)
- {
- if (!porownanie_ciagu(TablicaZmiennych[nr_tab].nazwa, liczba_wyznaczana))
- {
- int Flaga = 1;
- while((TablicaZmiennych[nr_tab].nr_nastepny != 0)&&(Flaga==1))
- {
- nr_tab = TablicaZmiennych[nr_tab].nr_nastepny;
- nr2 = nr_tab;
- if (!porownanie_ciagu(TablicaZmiennych[nr_tab].nazwa, liczba_wyznaczana))
- {
- Flaga = 0;
- }
- }
- while((TablicaZmiennych[nr_tab].nr_nastepny != 0)&&(Flaga==1))
- {
- nr_tab++;
- }
- TablicaZmiennych[nr2].nr_nastepny = nr_tab;
- }
- }
- /////////////////////dalej///////////////////////
- for(int i=0; i<licznik; i++)
- {
- TablicaZmiennych[nr_tab].nazwa[i] = liczba_wyznaczana[i];
- }
- TablicaZmiennych[nr_tab].nazwa[licznik] = '\0';
- TablicaZmiennych[nr_tab].wartosc=wynik;
- delete[] liczba_wyznaczana;
- */
- }
- int main()
- {
- Zmienna TablicaZmiennych[10000];
- for(int i=0; i<10000; i++)
- {
- TablicaZmiennych[i].wartosc = 0;
- TablicaZmiennych[i].nr_nastepny = 0;
- }
- int a=1;
- while(a==1)
- {
- char polecenie;
- polecenie=getchar();
- switch(polecenie)
- {
- case 'U':
- ustaw(TablicaZmiennych);
- break;
- case 'O':
- oblicz(TablicaZmiennych);
- break;
- case 'W':
- wyznacz(TablicaZmiennych);
- break;
- case 'K':
- a=0;
- break;
- default:
- cout<<"Prosze wpisac ponownie"<<endl;
- break;
- }
- cin.sync();
- }
- /*
- for(int i=0; i<10000; i++)
- {
- if(TablicaZmiennych[i].wartosc != 0)
- {
- int j=0;
- while(TablicaZmiennych[i].nazwa[j] != '\0')
- {
- cout<<TablicaZmiennych[i].nazwa[j];
- j++;
- }
- cout<<" = "<<TablicaZmiennych[i].wartosc<<endl;
- }
- }
- */
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement