Postfixový kalkulátor – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Postfixový kalkulátor – C / C++ – Fórum – Programujte.comPostfixový kalkulátor – C / C++ – Fórum – Programujte.com

 

Kanax
~ Anonymní uživatel
1 příspěvek
15. 11. 2010   #1
-
0
-

Zdravím, byl bych rád, kdyby jste mi pomohli. Mám problém s postfixovým kalkulátorem, fungují mi funkce součet, rozdíl a součin. Funkce podíl mi nejde a nevím proč, modulo a další funkce jsem ještě neřešil. A ještě bych potřeboval převést zadané operandy na typ double pomocí funkce atof, aby kalkulátor uměl počítat i s čísly s plovoucí řádovou čárkou.

Kód programu:



#include <iostream>
#include <stdlib.h>
using namespace std;

class Zasobnik
{
private:
int StavZasobniku;
int* items;
int MaxVelikost;

public:
Zasobnik(int MaxVelikost);

int Vyjmout();
void Ulozit(int x);
};

Zasobnik::Zasobnik(int MaxVelikost)
{
this->MaxVelikost = MaxVelikost;
StavZasobniku = 0;
items = new int [MaxVelikost];
}

void Zasobnik::Ulozit(int x)
{
if (StavZasobniku == MaxVelikost - 1)
printf("Zasobnik je plny.");
else
{
items[StavZasobniku + 1] = x;
StavZasobniku++;
}
}

int Zasobnik::Vyjmout()
{
if (StavZasobniku == 0)
printf("Zasobnik je prazdny.");
else
{
StavZasobniku--;
return items[StavZasobniku + 1];
}
}

int main()
{
Zasobnik MujZasobnik(100);

cout << "Postfixovy kalkulator\n\n";
cout << "Zadejte priklad pro vypocet:";

char *token = NULL;
char input[100];

double atof(char *token);

gets(input);

token = strtok(input, " ");

while (token != NULL)
{
int a=0, b=0;

if (strcmp(token, "+") == 0)
{
a = MujZasobnik.Vyjmout(); b = MujZasobnik.Vyjmout();
MujZasobnik.Ulozit(a + b);
}
else if (strcmp(token, "-") == 0)
{
a = MujZasobnik.Vyjmout(); b = MujZasobnik.Vyjmout();
MujZasobnik.Ulozit(a - b);
}
else if (strcmp(token, "*") == 0)
{
a = MujZasobnik.Vyjmout(); b = MujZasobnik.Vyjmout();
MujZasobnik.Ulozit(a * b);
}
else if (strcmp(token, "/") == 0)
{
a = MujZasobnik.Vyjmout(); b = MujZasobnik.Vyjmout();
MujZasobnik.Ulozit(a / b);
}
else if (strcmp(token, "%") == 0)
{
a = MujZasobnik.Vyjmout(); b = MujZasobnik.Vyjmout();
MujZasobnik.Ulozit(a % b);
}
else
MujZasobnik.Ulozit(atoi(token));

token = strtok(NULL, " ");
}

cout << "Vysledek vaseho zapisu je: " << MujZasobnik.Vyjmout() << endl;

return 0;
}





Děkuji, za vaše rady a odpovědi. Budu Vám velice vděčný, jsem úplně v lese :(

Nahlásit jako SPAM
IP: 88.81.95.–
zdenda
~ Anonymní uživatel
257 příspěvků
16. 11. 2010   #2
-
0
-

Ten zásobník je LIFO (last in, first out) - hodnoty jsou vyjímány v opačném pořadí než v jakém byly vkládány.

5 3 /

Ulozit(5)
Ulozit(3)
a = Vyjmout() // 3
b = Vyjmout() // 5
3/5 != 5/3
Pro operandy v double prostě použij atof() a uprav datový typ zásobníku (items,konstruktor,ulozit,vyjmout,a,b).
Hlídání StavZasobniku a indexování items máš blbě, zkus si ho celý naplnit. (A zbytečně mícháš C a C++)

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 75 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý