Niechce liczyc dużych liczb

0

#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=a
3.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=a
3.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

0
  1. Spaghetti
  2. Tragiczne formatowanie.
  3. Karykatura OOP. Po coś tam tą chorą klasę w ogóle wstawił?
  4. Separatorem dziesiętnym jest kropka a nie przecinek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1