#pragma once
class działania
{
public:
działania(void);
~działania(void);
double dodawanie();
double roznica();
double iloczyn();
double dzielenie();
double pierwiastek();
double potega();
double sinus();
double cosinus();
double tanges();
double cotanges();
int ONP();
};
void konwerterONP(char *wynik, char *s);
void push(double);
double pop(void);
#include "działania.h"
#include <iostream>
#include <math.h>
using namespace std;
działania::działania(void)
{
}
działania::~działania(void)
{
}
double działania::dodawanie()
{
double c,a,b;
cout<<"Podaj wartosc skladnika"<<endl;
cin>>a;
cout<<"Podaj wartosc skladnika"<<endl;
cin>>b;
c=a+b;
return c;
}
double działania::roznica()
{
double c,a,b;
cout<<"Podaj wartosc Odejmnej"<<endl;
cin>>a;
cout<<"Podaj wartosc Odejmowanej"<<endl;
cin>>b;
c=a-b;
return c;
}
double działania::iloczyn()
{
double c,a,b;
cout<<"Podaj wartosc czynnika"<<endl;
cin>>a;
cout<<"Podaj wartosc czynnika"<<endl;
cin>>b;
c=ab;
return c;
}
double działania::dzielenie()
{
double c,a,b;
cout<<"Podaj wartośc dzielonej"<<endl;
cin>>a;
cout<<"Podaj wartość dzielnej"<<endl;
cin>>b;
c=a/b;
return c;
}
double działania::pierwiastek()
{
double c,a;
cout<<"Podaj liczbe do spierwiastkowania"<<endl;
cin>>a;
c=sqrt(a);
return c;
}
double działania::potega()
{
double c,a,b;
cout<<"Podaj podstawe"<<endl;
cin>>a;
cout<<"Podaj wykladnik"<<endl;
cin>>b;
c = 1;
while(b--) c = a;
return c;
}
double działania::sinus()
{
double a,c;
cout<<"Podaj wartośc kata w stopniach"<<endl;
cin>>a;
a=a3.1415;
c=a/180;
c=sin(c);
return c;
}
double działania::cosinus()
{
double a,c;
cout<<"Podaj wartosc kata w stopniach "<<endl;
cin>>a;
a=a3.1415;
c=a/180;
c=cos(c);
return c;
}double działania::tanges()
{
double a,b,c,d;
cout<<"Podaje wartosc kata w stopniach"<<endl;
cin>>a;
a=a*3.1415;
a=a/180;
d=sin(a);
b=cos(a);
c=d/b;
return c;
}
double działania::cotanges()
{
double a,b,c,d;
cout<<"Podaje wartosc kata w stopniach"<<endl;
cin>>a;
a=a*3.1415;
a=a/180;
d=sin(a);
b=cos(a);
c=b/d;
return c;
}
int działania::ONP() //uwaga funkcja potrzebuje conajmniej dwóch liczby do obliczeń
{
int stos[512], ws = 0;
int w, b,a, ptr = 0, result = 0;
char el[256];
char out[256];
int wynik;
cout<<" Wprowadz wyrazenie matematyczne.\n Uwaga!!!: Program dziala na liczbach naturalnych.\n Dozwolone operatory: \"+\", \"-\", \"*\", \"/\", \"^\".\n"<<endl;
cin.ignore();
cin.getline(el,256);
konwerterONP( out, el );
cout<<"ONP: "<<out<<endl;
do
{
if(out[ptr] >= '0' && out[ptr] <= '9') //czy odczytany string (do pierwszej spacji) jest cyfra ?
{
result = 10 * result + out[ptr] - '0'; //konwertuj liczby z ASCII do int (-'0'), w przypadku wystąpienia kolejnej cyfry liczby podnieś wagę już wczytanej części liczby (*10 )
stos[ws++] = result; //po wczytaniu całej liczby przenies ją na stos
}
else if(out[ptr] == '=') wynik = stos[--ws]; //czy nie koniec wyrażenia ?
else if( out[ptr] ==' ' ) result = 0;
else //jeśli wprowadzony string nie był liczbą i znakiem "=" to musi być to operator arytmetyczny
{
b = stos[--ws]; a = stos[--ws]; //pobierz ze stostu dwa ostatnio odłożone liczby/wyniki - uwaga!!! należy wprowadzić conajmniej dwie liczby
switch(out[ptr]) //rozpoznaj operację
{
case '+': w = a + b; break;
case '-': w = a - b; break;
case '*': w = a * b; break;
case '/': w = a / b; break;
case '^': w = 1;
while(b--) w *= a;
break;
}
stos[ws++] = w; //wynik operacji zapisz na stosie, będzie potrzebny do następnych obliczeń - wynik pośredni
}
} while(out[ptr++] != '='); //jeśli odebrano znak "=" przerwij pętlę
return wynik; //zwróć wynik, czyli ostatnio zapisaną operację na stos !
}
void konwerterONP(char *wynik, char *s)
{
char x, y;
while (x = *s++) { /* krok 1 */
if (((x >= '0') && (x <= '9')) || (x == '.')) { /* krok 2 */
/* kopiowanie calej liczby z wejscia na wyjscie */
do
*wynik++ = x;
while (x = *s, (((x >= '0') && (x <= '9')) || (x == '.')) && s++);
*wynik++ = ' ';
} else if (x == '(') /* krok 3 */
push((double)'(');
else if (x == ')') /* krok 4 */
while ((y = (char)pop()) != '(')
*wynik++ = y, *wynik++ = ' ';
else { /* krok 5 */
while (y = (char)pop(),
y && ((y == '^') ||
((y == '*') || (y == '/')) && (x != '^') ||
((y == '+') || (y == '-')) && (x != '*') &&
(x != '/') && (x != '^')))
*wynik++ = y, *wynik++ = ' ';
push((double)y);
push((double)x);
}
}
while (x = (char)pop()) /* krok 6 */
*wynik++ = x, *wynik++ = ' ';
*wynik = '=';
wynik++;
*wynik = '\0'; /* zakonczenie lancucha wyjsciowego */
}
#define MAX_STOS 512 /* maksymalny rozmiar stosu */
double stos[MAX_STOS];
int sp = 0; /* wskaznik kolejnego wolnego miejsca na stosie */
/* push: wstawia element na stos */
void push(double element)
{
if (sp < MAX_STOS)
stos[sp++] = element;
else
printf("push: Przepelnienie stosu!\n");
}
/* pop: zdejmuje element ze stosu */
double pop(void)
{
if (sp > 0)
return stos[--sp];
return 0;
}
#include<iostream>
#include "działania.h"
#include<conio.h>
using namespace std;
void main()
{
int a,m=1,r=1,d,t,p=1;
double c;
działania b;
while(m==1)
{
cout<<"\t\tKalkulator"<<endl;
cout<<"\t1.Podstawowe operacje matematyczne"<<endl;
cout<<"\t2.Operacje trygonometryczne"<<endl;
cout<<"\t0.Zakoncz"<<endl;
cout<<"\t3.Operacje z użyciem odwrotenej notacji polskiej"<<endl<<endl;
cout<<"\tCo chcesz wykonac?"<<endl;
cin>>a;
if(a==0)
{
{
m=0;
}
break;
}
if(a==1)
{
while(r==1)
{
cout<<"\t|0.Wyjscie"<<endl;
cout<<"\t|1.Dodawanie"<<endl;
cout<<"\t|2.odejmowanie"<<endl;
cout<<"\t|3.mnozenie"<<endl;
cout<<"\t|4.Dzielenie"<<endl;
cout<<"\t|5.Pierwiastkowanie"<<endl;
cout<<"\t|6.Potega"<<endl<<endl;
cout<<"\tCo chcesz wykonac ??"<<endl;
cin>>d;
switch (d)
{
case 0:
{
r=0;
}
break;
case 1:
c=b.dodawanie();
cout<<"wynik operacji: "<<c<<endl;
break;
case 2:
c=b.roznica();
cout<<"wynik operacji: "<<c<<endl;
break;
case 3:
c=b.iloczyn();
cout<<"wynik operacji: "<<c<<endl;
break;
case 4:
c=b.dzielenie();
cout<<"wynik operacji: "<<c<<endl;
break;
case 5:
c=b.pierwiastek();
cout<<"wynik operacji: "<<c<<endl;
break;
case 6:
c=b.potega();
cout<<"wynik operacji: "<<c<<endl;
}
}
}
if(a==2)
{
while (p==1)
{
cout<<"\t|0.Wyjscie"<<endl;
cout<<"\t|1.Sinus"<<endl;
cout<<"\t|2.Cosinus"<<endl;
cout<<"\t|3.Tanges"<<endl;
cout<<"\t|4.Cotanges"<<endl;
cout<<"\tCo chcesz wykonac ??"<<endl;
cin>>t;
switch(t)
{
case 0:
{
p=0;
}
break;
case 1:
c=b.sinus();
cout<<"wynik operacji: "<<c<<endl;
case 2:
c=b.cosinus();
cout<<"wynik operacji: "<<c<<endl;
case 3:
c=b.tanges();
cout<<"wynik operacji: "<<c<<endl;
case 4:
c=b.cotanges();
cout<<"wynik operacji: "<<c<<endl;
}
}
}
if( a==3)
{
c = b.ONP();
cout<<"wynik operacji: "<<c<<endl;
}
else
{
cout<<"Wybierz jeszcze raz (Nie podano cyfry przypisanej do operacji"<<endl<<endl;
}
}
}
Postarałem sie opisac mniej wiecej ten algorytm od ONP . Mam pytanie program nie chce dodawac i robic operacji na duzych liczbach np 234+1234 zle wyniki podaje no i nie da sie dodac liczb 12,5 + 34,6 zmiennoprzecinkowych a niby wszystko jest w double ;d prosze o korekte w kodzie jesli ktos moze zrobic