Witam. Wiem że podobne tematy już były ale nie admin usunął mi post jak chciałem odkopać pewien stary.
Otóż mój problem polega na tym że zjada mi ostatni znak przy zamianie.
dla przykładu (2+1)3-4(7+4) z algorytmów na ONP na 4programmers nie wyswietla ostatniego minusa...
nie mam pojęcia jak do tego dojść, co ruch wyswietlalem stos i "-"... i wiem tyle ze jest 7elelentem wyrazenia nie wiem gdzie się zagubił. Programuje niecałe pół roku i nie umiem się posługiwać debugerem :P Dlatego prosił bym o wprawne oko i nakierowanie mnie na błąd. Pozdrawiam
Kod:
#include <stdio.h>
#include "stdafx.h"
#include<fstream>
#include <iostream>
#include <string> // do odczytu dlugosci stringa
#include<stack>
using namespace std;
int main()
{
FILE *plik;
char znak;
stack<char>stos;
char wyrazenie[100];
char wyjscie[100];
int i;
for(i=0;i<100;i++) // zerowanie wyrazenie[i], wyjscie[i]
{
wyrazenie[i]=NULL;
wyjscie[i]=NULL;
}
i=0;
// --- otwarcie pliku
/*
fstream plik;
plik.open("plik.txt", ios::in);
if(plik.good()==true)
{
while( !plik.eof())
{
plik>>znak;
wyrazenie[i]=znak;
i++;
}
}
else
cout<<"Blad otawrcia pliku!";
plik.close();
// -- zamkniecie pliku
*/
plik = fopen("plik.txt","r");
if (plik == NULL)
{
cout<<"Blad otwarcia pliku"<<endl;
return (-1);
}
//--------- odczyt pliku
while( (znak=fgetc(plik)) !=EOF)
{
wyrazenie[i]=znak;
i++;
}
cout<<"Wyrazenie: "<<wyrazenie<<endl;
cout<<" ONP: ";
int dlugosc=strlen(wyrazenie);
for(i=0;i<dlugosc;i++)
{
switch (wyrazenie[i])
{
case '(': //stos.top() - '(' stos.size() =1;
stos.push( wyrazenie[i] ); // poprawne
break;
case ')': // jezeli ")" to zdjemuje wszystko ze stosu
while( stos.empty() == false )
{
if(stos.top()!='(') // jezeli natrafisz na ')' zdejmij ale nie wyswietlaj
{
cout << stos.top();
// wyjscie[i]=stos.top();
stos.pop();
}
stos.pop();
}
break;
case '+':
case '-':
while (stos.size()>0 && stos.top() != '(' )
{
cout << stos.top();
// wyjscie[i]=stos.top();
stos.pop();
}
stos.push(wyrazenie[i]);
break;
case '*':
case '/':
case '%':
while (stos.size() > 0 && (stos.top() == '*' || stos.top() == '/' || stos.top() == '%'))
{
cout << stos.top();
//wyjscie[i]=stos.top();
stos.pop();
}
stos.push(wyrazenie[i]);
break;
default:
cout << wyrazenie[i];
// wyjscie[i]=wyrazenie[i];
break;
}
}
while ( stos.empty()== false)
{
stos.pop();
cout<< stos.top();
}
cout<<endl;
system("pause");
return 0;
}
ps. wczytywanie znaków z pliku jest w jezyku c... w zapisie
// --- otwarcie pliku
/*
fstream plik;
plik.open("plik.txt", ios::in);
if(plik.good()==true)
{
while( !plik.eof())
{
plik>>znak;
wyrazenie[i]=znak;
i++;
}
}
else
cout<<"Blad otawrcia pliku!";
plik.close();
// -- zamkniecie pliku
*/
plik = fopen("plik.txt","r");
if (plik == NULL)
{
cout<<"Blad otwarcia pliku"<<endl;
return (-1);
}
//--------- odczyt pliku
while( (znak=fgetc(plik)) !=EOF)
{
wyrazenie[i]=znak;
i++;
}
cout<<"Wyrazenie: "<<wyrazenie<<endl;
dubluje ostatni znak...
ps2
co do google... to znalazlem pelno informacji na temat stosu, wyswietlania plików, whatever ale w tym błędzie mi raczej nie pomoże. Pozdrawiam