Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Uzikan

[c++] odwrotna notacja polska

Rekomendowane odpowiedzi

Witam wszystkich, na wstępie muszę od razu dodać że przejrzałem masę tematów na ten temat i wiele kodów jednak odpowiedzi nie znalazłem. Otóż: napisałem program konwertujący wyrażenie algebraiczne typu (5-3)*6 na odwrotną notację polską. Utworzyłem sobie klase stos i na niej działałem. W tej klasie mam dwie tablice (typu char oraz double), jedna służy do przechowywania ONP, a druga już przy wyliczaniu wartości przechowuje liczby. Wszystko działa bez zarzutu... jakiego bym wyrażenia nie wpisał - działa.

Analogicznie napisałem wg. algorytmu obliczanie wartości takiego wyrażenia... I tu pojawił się problem, bo nie rozumiem dlaczego nie liczy poprawnie. Znalazłem problem ale nie wiem gdzie jest błąd. Otóż przy w momencie gdy działam na dwóch liczbach ze stosu odpowiednim operatorem, obliczona wartość nie jest poprawnie dopisywana na stos... Przykładowo gdy na stosie mamy liczby 2 oraz 3, dochodzimy do momentu gdzie trzeba zdjąć je ze stosu, a zamiast nich wrzucić wynik. I tu właśnie mój program się wysypuje.... Oto kod programu głównego, jeśli będzie potrzeba wrzucę także implementacje klasy Stos.

#include "stdafx.h"
#include "Stos.h"
#include <iostream>
#include <cmath>
#include <string>
using namespace std;

int priorytet(char &op){
if(op=='+' ||  op=='-') return 1;
if(op=='*' ||  op=='/') return 2;
return 0;
}



int _tmain(int argc, _TCHAR* argv[])
{

string in,out;
in="(4*2)+(5/3)";
out="";
Stos stack;
int i=0; //i- indeks znaku na wejściu
char o1,o2;

while(in[i]!='\0'){
	if((int)in[i]>47 && (int)in[i]<58) { out+=in[i]; }					 	//jeśli liczba, dodaj na wyjście
	if(in[i]=='+'	||	in[i]=='-'	||	in[i]=='*'	||	in[i]=='/'){	//jeśli operator
		o1=in[i];
		o2=stack.Szczyt();
		while(priorytet(o1)<=priorytet(o2)){
			out+=stack.Szczyt();
			stack.Zdejmij();
			o2=stack.Szczyt();
		}

		stack.Dodaj(o1);
	}
	if(in[i]=='(') { stack.Dodaj('('); }
	if(in[i]==')') { 
		while(stack.Szczyt()!='('){
			out+=stack.Szczyt();
			stack.Zdejmij();
		}
		if(stack.Szczyt()=='('){ stack.Zdejmij(); }
	}
	i++;
}

while(stack.Ilosc()>0){
	out+=stack.Szczyt();
	stack.Zdejmij();
}	

//wyswietl ONP
for(int x=0;x<out.length();x++){
	cout<<out[x]<<" ";
}



//OBLICZANIE WARTOŚCI
Stos stack2;
double a,b;
double wynik=0;
string temp;
temp="";
for(int i=0;i< out.length();i++){
	if((int)out[i]>47 && (int)out[i]<58) { temp=out[i]; stack2.DodajWart(atof(temp.data())); temp=""; }		//jesli liczba, daj na stos
	if(out[i]=='+'	||	out[i]=='-'	||	out[i]=='*'	||	out[i]=='/')	//jeśli operator
	{
		a=stack2.SzczytWart();
		stack2.ZdejmijWart();
		b=stack2.SzczytWart();
		stack2.ZdejmijWart();	

		switch(out[i]){
			case '+':	stack2.DodajWart(b+a);
			case '-':	stack2.DodajWart(b-a);
			case '*':	stack2.DodajWart(b*a);
			case '/':	stack2.DodajWart(b/a);
		}
	}
}

wynik=stack2.SzczytWart();
stack2.ZdejmijWart();
cout<<endl<<wynik<<endl;

system("PAUSE");
return 0;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Problem rozwiązany.... nigdy bym nie pomyślał że coś takiego może być przyczyną... Po prostu w instrukcji switch brakowało po każdej opcji "break;" :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Skoro nigdy byś nie pomyślał to jak znalazłeś rozwiązanie? Kiedyś też się na tym przejechałem z tym że u mnie było widać od razu że brakuje break'a

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja raz cały dzień szukałem błędu - okazało się, że w konstruktorze kopiującym zapomniałem o const. Cały czas się dziwiłem czemu kompilator mi krzyczy coś o operatorze= (o tym ile razy rzucałem k...wami kiedy się okazywało że w ifie mam = zamiast == to nawet nie będę wspominać :D )

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Skoro nigdy byś nie pomyślał to jak znalazłeś rozwiązanie?

właściwie to jakoś przypadkiem...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...