Skocz do zawartości
aurel

C++, Spoj, Wartość Formuły

Rekomendowane odpowiedzi

treść zadania:

https://www.spoj.pl/LP2007/problems/NL01WF/

 

program, który napisałam opiera się o przepisanie formuły na odwróconą notację polską, następnie prostym algorytmem jest obliczana wartość.

działa dla wszystkich testów jakie udostępnił wykładowca, działa dla wszystkich, które jestem w stanie wymyśleć.

byłabym niezmiernie wdzięczna, gdyby ktoś znalazł chociaż jakiś źle obliczany test...

 

#include <cstdlib>#include <iostream>using namespace std;char negacja(char a);char koniunkcja(char a, char b);char alternatywa(char a, char b);char implikacja(char a, char b);char rownowaznosc(char a, char b);int main(int argc, char *argv[]){	int  c, i, j, w, s, l1, l2, l3, l4, l, wmax, kropka;	char a, b, wejscie[100001], wejsc[100001], formula[100001], stos[100001], dane[40001];		while ((c=getchar())!=EOF)	{		  ungetc(c, stdin);		  		  i=0;	  		  j=0;		  scanf("%s", &dane);		  scanf("%s", &wejsc);		  		  for (w=0; wejsc[w]!=NULL; w++) 		  if (wejsc[w]>=48 && wejsc[w]<=57)			 if (wejsc[w+1]>=48 && wejsc[w+1]<=57)				if (wejsc[w+2]>=48 && wejsc[w+2]<=57)				   if (wejsc[w+3]>=48 && wejsc[w+3]<=57)				   {						 l1=wejsc[w]-48;						 l2=wejsc[w+1]-48;						 l3=wejsc[w+2]-48;			 						 l4=wejsc[w+3]-48;						 l=1000*l1+100*l2+10*l3+l4; 						 wejsc[w]='.';						 wejsc[w+1]='.';						 wejsc[w+2]='.';						 w=w+3;						 wejsc[w]=dane[l];				   }			 				   else				   {						 l1=wejsc[w]-48;						 l2=wejsc[w+1]-48;						 l3=wejsc[w+2]-48;						 l=100*l1+10*l2+l3;					  						 wejsc[w]='.';						 wejsc[w+1]='.';						 w=w+2;						 wejsc[w]=dane[l];				   }				else		 				{					l1=wejsc[w]-48;					l2=wejsc[w+1]-48;					l=10*l1+l2;					wejsc[w]='.';					w++;					wejsc[w]=dane[l];				}			 else 			 {				  			   l=wejsc[w]-48;			   wejsc[w]=dane[l];			 } 		  wmax=w;		   		  w=0;		  kropka=0;		  		  for (s=0; s!=wmax; s++) 		  {			  if (wejsc[s]!='.')			  {				   wejscie[w]=wejsc[s];				   w++;			  }			  else kropka++;		  }		  wmax=wmax-kropka;		  		  for (kropka=wmax+kropka; kropka!=-1; kropka--) wejsc[kropka]=NULL;								  		  for (w=0; w!=wmax; w++)		  {			   if (wejscie[w]=='0' || wejscie[w]=='1')			   {					formula[i]=wejscie[w];					i++;			   }			   else			   {					if (wejscie[w]=='n') 					{						 stos[j]=wejscie[w];						 j++;					}					if (wejscie[w]=='a') if (stos[j-1]!='n') 										 {											  stos[j]=wejscie[w];											  j++;										 }										 else 										 {												  j--; 											  while (stos[j]=='n')											  {   												   formula[i]=stos[j];												   i++;												   j--;							   											  } 											  j++;											  stos[j]=wejscie[w];											  j++;										 }					if (wejscie[w]=='o') if (stos[j-1]!='n' && stos[j-1]!='a')										 {											  stos[j]='o';											  j++;										 }										 else										 {											  j--;											  while (stos[j]=='n' || stos[j]=='a')											  {												   formula[i]=stos[j];												   i++;												   j--;											  } 											  j++;											  stos[j]=wejscie[w]; 											  j++;										 }					if (wejscie[w]=='e' || wejscie[w]=='i')  										 if (stos[j-1]!='n' && stos[j-1]!='a' && stos[j-1]!='o') 										 {											   stos[j]=wejscie[w];  											   j++;										 }										 else										 {											   j--; 											   while (stos[j]=='n' || stos[j]=='a' || stos[j]=='o')											   {													 formula[i]=stos[j];													 i++;													 j--;											   } 											   j++;											   stos[j]=wejscie[w];											   j++;										 }					if (wejscie[w]=='(') 					{  						 stos[j]=wejscie[w];						 j++;					}					if (wejscie[w]==')') 					{						 j--;					 						 while (stos[j]!='(')						 {					   							  formula[i]=stos[j];							  i++;							  j--;						 }						 					} 			   			   } 						   		  }   				   		  j--;		  while (j>=0) 		  {				if (stos[j]!='(') 				{					  formula[i]=stos[j];					  i++;				}				j--;		  }				 		  j=0;		  for (s=0; s!=i; s++) 		  {			   if (formula[s]=='0' || formula[s]=='1') 			   {					stos[j]=formula[s];					j++;			   } 			   else			   {						if (formula[s]=='n')					{						 j--;						 a=stos[j];						 stos[j]=negacja(a);					}					else					{						 j--;						 b=stos[j];						 j--;						 a=stos[j];									 						 if (formula[s]=='a') stos[j]=koniunkcja(a,b); 						 if (formula[s]=='o') stos[j]=alternatywa(a,b);						 if (formula[s]=='i') stos[j]=implikacja(a,b);						 if (formula[s]=='e') stos[j]=rownowaznosc(a,b);					}					j++;			   }		 		  } 		  j--;   		  cout << stos[j] << "\n";	}			  	return 0;}char negacja(char a){	 if (a=='1') a='0';	 else a='1';	 return a;}char koniunkcja(char a, char b){ 	if (a=='1' && b=='1') a='1';	else a='0';	return a;}  char alternatywa(char a, char b){	if (a=='1' || b=='1') a='1';	else a='0';	return a;}  char implikacja(char a, char b){	if (b=='1') a='1';	else if (a=='0') a='1';		 else a='0';	return a;}char rownowaznosc(char a, char b){	if (a==b) a='1';	else a='0';	return a;}
Edytowane przez aurel

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

masz kontest z litma w plecy na pg? ;) nie mam jak sprawdzić twojego programu, pamiętam jak sam męczyłem się z onp na 1 roku, ale na szczeście zrobiłem z nim wszystkie projekty, także ten.

wiesz, jedno z rzeczy jakich nas uczą na tej uczelni to pisanie komentarzy. powinnaś też to robić, bo to bardzo ułatwia pracę nie tylko Tobie, ale również ludziom którym pokazujesz kod...

w razie czego odezwij sie na gg (profil)

 

pozdrawiam

m

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...