Quantcast
Channel: Forum Pasja Informatyki - Najnowsze pytania bez odpowiedzi
Viewing all articles
Browse latest Browse all 21942

Kalkulator z kolejnością wykonywania działań

$
0
0

Witam, mam mały problem z kalkulatorem napisałem kalkulator z zachowaniem kolejności wykonywania działań. Dostałem to zadanie na studiach ale ktoś już oddał mój program (nie potrzebnie mu go wysłałem a on się pod tym podpisał) a ja teraz muszę go zmieniać. Kalkulator działa tak, że użytkownik podaje jakieś długie działanie            np  2^2^2/4+8*4-12 a on mu zwraca wynik z kolejnością wykonywania działań. Kalkulator uwzględnia dodawanie, odejmowanie, mnożenie, dzielenie i potęgowanie. Bez pierwiastków i nawiasów. Nie za bardzo mam pomysł jak to pozmieniać i dlatego prosiłbym kogoś o pomoc i naniesienie zmian w moim kodzie.

#include <cstdio>
#include <string>
#include <vector>
#include <iostream>
#include <stdlib.h>
#include <cctype>
#include <cstring>
#include <cmath>
using namespace std;


void dzialanie_podzial(string &dzialanie_matematyczne, vector <double>& tablica_liczb, vector <char>& tablica_znakow, int iRozmiar)
{
	int a = 0;
	string bufor_liczb;
	for (a = 0; a < iRozmiar; a++)
	{
		if (isdigit(dzialanie_matematyczne[a]) || (dzialanie_matematyczne[a] == '.'))
		{
			bufor_liczb = bufor_liczb + dzialanie_matematyczne[a];
		}
		else
		{
			tablica_liczb.push_back(atof(bufor_liczb.c_str()));
			bufor_liczb = "";
			tablica_znakow.push_back(dzialanie_matematyczne[a]);
		}
		if (a == (iRozmiar - 1))
		{
			tablica_liczb.push_back(atof(bufor_liczb.c_str()));
		}
	}

}

void dodawanie(vector <double> &tablica_liczb, vector <char> &tablica_znakow, int &i)
{
	tablica_liczb[i] = tablica_liczb[i] + tablica_liczb[i + 1];
	tablica_liczb.erase(tablica_liczb.begin() + i + 1);
	tablica_znakow.erase(tablica_znakow.begin() + i);
	i--;

}

void odejmowanie(vector <double> &tablica_liczb, vector <char> &tablica_znakow, int &i)
{
	tablica_liczb[i] = tablica_liczb[i] - tablica_liczb[i + 1];
	tablica_liczb.erase(tablica_liczb.begin() + i + 1 );
	tablica_znakow.erase(tablica_znakow.begin() + i);
	i--;
}

void mnozenie(vector <double> &tablica_liczb, vector <char> &tablica_znakow, int &i)
{
	tablica_liczb[i] = tablica_liczb[i] * tablica_liczb[i + 1];
	tablica_liczb.erase(tablica_liczb.begin() + i + 1);
	tablica_znakow.erase(tablica_znakow.begin() + i);
	i--;
}

void dzielenie(vector <double> &tablica_liczb, vector <char> &tablica_znakow, int &i)
{
	tablica_liczb[i] = tablica_liczb[i] / tablica_liczb[i + 1];
	tablica_liczb.erase(tablica_liczb.begin() + i + 1);
	tablica_znakow.erase(tablica_znakow.begin() + i );
	i--;
}

void potegowanie(vector <double> &tablica_liczb, vector <char> &tablica_znakow, int &i)
{
	tablica_liczb[i] = pow(tablica_liczb[i], tablica_liczb[i + 1]);
	tablica_liczb.erase(tablica_liczb.begin() + i + 1);
	tablica_znakow.erase(tablica_znakow.begin() + i );
	i--;
}

int main()

{

	string dzialanie_matematyczne;
	vector < double > tablica_liczb;
	vector < char > tablica_znakow;
	int iRozmiar;
    int wybor;

	cout << "Witaj Drogi U¿ytkowniuku!"<< endl;
	cout << "Proszê podaæ dzia³anie matematyczne, które ma zostaæ obliczone: " ;
	cout << endl;
	cin >> dzialanie_matematyczne;
	iRozmiar = dzialanie_matematyczne.length();

	dzialanie_podzial(dzialanie_matematyczne, tablica_liczb, tablica_znakow,iRozmiar);
	int f = 0 ;
	int d = tablica_znakow.size();

	while (f < d)
	{
		if (tablica_znakow[f] == '^')
		{
			potegowanie(tablica_liczb, tablica_znakow, f);
			d--;
		}
		f++;
	}

	f = 0;

	while (f < d)
	{
		if (tablica_znakow[f] == '*')
		{
			(mnozenie(tablica_liczb, tablica_znakow, f));
			d--;
		}
		else if (tablica_znakow[f] == '/')
		{
			dzielenie(tablica_liczb, tablica_znakow, f);
			d--;
		}
		f++;
	}

	f = 0;

	while (f < d)
	{
		if (tablica_znakow[f] == '+')
		{
			dodawanie(tablica_liczb, tablica_znakow, f);
			d--;
		}
		else if (tablica_znakow[f] == '-')
		{
			odejmowanie(tablica_liczb, tablica_znakow, f);
			d--;
		}
		f++;
	}

	cout << "Wynik podanego dzia³ania to: "<< tablica_liczb[0];

	return 0;

}

 


Viewing all articles
Browse latest Browse all 21942