ONP (Prosba o pomoc)

0

Witam
Mam maly problem. chodzi o to ze mam do napisania program w ansi c ktory powinnien kompilowac sie pod gcc (djgpp). Tresc programu to:
Dane wyrażenie w odwrotnej notacji polskiej przekształć do postaci "normalnej" z nawiasami(nie zakładaj nic o priorytetach operacji).
I otoz mam juz troche napisanego programu i mam prosbe czy pomogl by mi ktos znaleŹĆ blad. Bo jak wpisuje wyrazenie to caly czas program nie chce go przyjac, gdyz gdzies popelnilem blad :( I czy trzeba jakies jeszcze porawki naniesc do programu aby dobrze dzialal??

oto kod programu: Z gory dziekuje za wszelaka pomoc. Pozdrawiam

/* "Program zamieniajacy wyrazenie z Odwrotnej Notacji Polskiej na zwykla " */

#include<stdio.h>
#include<conio.h>

#define MAX 100

typedef struct WEZEL {
	struct WEZEL* nast;
	char znak[MAX]; } Wezel;

Wezel* push(Wezel*wierzcholek, char co_dod[MAX]);	/*odklada na stos tablice co_dod*/
Wezel* pop(Wezel *wierzcholek, char co_zdj[MAX]);	/*zejmuje (i kasuje)ze stosu tablice co_zdj*/
void przerwij();		/*przerywa dzialanie programu gdy wprowadzono zle dane*/
void info();


void main()
{
	char *a;
	int i, j=0, m=1, k;		/*liczniki petel*/
	int ile_arg=0, ile_oprt=0;			/*ile wystapilo argumentow*/
	char onp[MAX], tmp1[MAX],tmp2[MAX],out[MAX],out1[MAX];
	Wezel *wierzcholek;
	char odwrotna[MAX];
	
	
	printf("Podaj wyrazenie w Odwrotnej Notacji Polskiej: ");
	scanf("%c", odwrotna[MAX]);
	
		
	for (i=0; i<MAX; i++) 		/*zerowanie tablic*/
	{
		onp[i]=NULL;
		out[i]=NULL;
		out1[i]=NULL;
		tmp1[i]=NULL;
		tmp2[i]=NULL;
	}

	for (i=0; i<MAX; i++) 		/*wczytuje do tablicy onp zapis w notacji onp*/
	{
		onp[i]=odwrotna[MAX];
		if ( (onp[i]=='(') || (onp[i]==')') ) przerwij();
		
	}
	for (i=0; onp[i]!=EOF; i++)
		if ( (onp[i]=='+') || (onp[i]=='-') || (onp[i]=='*') || (onp[i]=='/') ) 
		{	
			if(ile_arg<2) przerwij();	/*operator dotyczy 2 operandow*/
			else
			{
				wierzcholek=pop(wierzcholek,tmp1);
				wierzcholek=pop(wierzcholek,tmp2);
				out[0]='(';
				for (k=0; tmp2[k]!='\0'; k++) out[m++]=tmp2[k];
				out[m++]=onp[i];
				for (k=0; tmp1[k]!='\0'; k++) out[m++]=tmp1[k];
				out[m++]=')';
				out[m++]='\0';
				wierzcholek=push(wierzcholek,out);
				m=1;
				ile_oprt++;
			}
		}
		else 
		{
			out1[0]=onp[i];
			out1[1]='\0';
			wierzcholek=push(wierzcholek,out1);
			ile_arg++;
		}
	if(ile_arg!=(ile_oprt+1)) przerwij();	
	info();
	printf("%s",wierzcholek->znak);			/*wypisuje ostateczny wynik (w notacji zwyklej)*/
		
}

Wezel* push(Wezel *wierzcholek, char co_dod[MAX])
{
	int i;
	Wezel *nowy;
	nowy=(Wezel*)malloc(sizeof(Wezel));
	nowy->nast=wierzcholek;
	for (i=0; co_dod[i]!='\0'; ++i)	nowy->znak[i]=co_dod[i];
	return nowy;
}

Wezel* pop(Wezel *wierzcholek, char co_zdj[MAX])
{
	int i;
	Wezel *temp=wierzcholek->nast;
	for (i=0; i<MAX;++i) co_zdj[i]=wierzcholek->znak[i];
	free(wierzcholek);
	return temp;
}

void przerwij()
{
	printf("Wprowadzono zle dane...\n");
	exit(1);
}

void info()
{
	printf("\n\n\n\nProgram zamienia wyrazenia z Odwrotnej Notacji Polskiej na zwykla.\n");
	printf("Wyrazenie w onp dla pojedynczych znakow.\n");
	printf("Dozwolone operatory: +, - , *, / \n");
	printf("Zapis w zwyklej notacji z nawiasami:\n");
}


1

scanf( "%c"... etc
myslalem ze wczytujesz wyrazenie a nie jeden char
wiec
scanf("%s"...
a najlepiej chyba gets ;>

poza tym, EOF (czyli -1 lub ~0 jak kto woli) nie stoi na koncu stringa, '\ 0' czy tam NULL stoi. Wiec for z EOF na pewno ci sie wykolei.. zmien to na '\ 0'
Z pierwszy rzut oka tyle widze...

0

http://4programmers.net/view_file.php?id=1343

Nie wiem czemu, ale dałes mi niejaką inspirację do stworzenia całego kalkulatorka onp. Może przyda ci się. Mam nadzieję, że nie za późno.

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