Notacja Polska

0

Witam!
Mam taki problem. Muszę napisać program który zamienia wyrażenie na notację polską.
Tj.
Mamy wyrażenie np. (x-3)4/5*(y+6)7
Wynikiem ma byc: */-x345+y67

lub prościej:
4/(2+3)
/4+23

Ma ktoś jakiś pomysł jak to zrobić ?
Proszę o pomoc.

0

Tak, ja ktoś mam jakiś pomysł. Jakiej pomocy oczekujesz?

Dobrze się zastanów nad odpowiedzią, bo post śmierdzi prośbą o gotowca i jest na granicy wywalenia.

0

opisany algorytm znajdziesz na wikipedii

0
gosc napisał(a)

opisany algorytm znajdziesz na wikipedii
Na wiki jest tylko do ONP, a nie NP.

0
manfredek napisał(a)
gosc napisał(a)

opisany algorytm znajdziesz na wikipedii
Na wiki jest tylko do ONP, a nie NP.

?????????????

http://pl.wikipedia.org/wiki/Notacja_polska

0

Moim zdaniem najprosciej będzie jak przyjmiesz jakis ciąg znaków, który będzie analizowany przez pętlę do pojawienia sie NULL w pętli

0
reichel napisał(a)

?????????????

http://pl.wikipedia.org/wiki/Notacja_polska
Przeczytaj powoli, nie ma tam opisanego algo zmiany z infixa na NP.

0

Mam prosty niedopracowany algorytm do ONP może przyda się w opracowaniu.

#include <iostream.h>

void wyswietl( char wzor[], char efekt[], int rozmiar );

main()
{
const int rozmiar = 80;
char wzor[rozmiar] = { "a+b" };
char efekt[rozmiar] = {""};

        wyswietl(wzor, efekt, rozmiar);

        system("PAUSE");
}

void wyswietl ( char wzor[], char efekt[], int rozmiar )
{
int i = 0, j = 0, k = 0;
char stos[80] = {""};

        while( wzor[i] != NULL)
        {

                if(wzor[i] >= 'a' && wzor[i] <= 'z' )
                {
                        efekt[j] = wzor[i];
                        j += 1;
                }

                if(wzor[i] == '+')
                {
                        stos[k] = wzor[i];
                }
                i++;
        }

        if(wzor[i] == NULL)
        {
                efekt[j] = stos[k];
        }
        cout << endl;

        puts (efekt);

        return;
}
0

Nie o ONP tylko o NP chodzi.

0

majac gotowca imho nietrudno w nim zmienic A-fix na B-fix..

0

Nie chce gotowca :) Drzewo prefix było by ciężko skonstruować (przynajmniej dla mnie) po wyrażeniu.
Moja koncepcja (jeszcze niedopracowana działa dla wyrażeń z dwoma nawiasami):

// W0.cpp : Defines the entry point for the console application.
//

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

         class osoba
   {
   private:
    char wyr[256];
	char nawias1[256];
	char nawias2[256];
	char bez_nawiasow[256];
	int n;
     
    public:
		osoba (char *wyr_)				{kopiuj_string (wyr_, wyr);}

   char * wez_wyr()						{return wyr;}
   void wpisz_wyr (char *wyr_)			{kopiuj_string (wyr_, wyr);}

   char * wez_nawias1()					{return nawias1;}
   void wpisz_nawias1 (char *nawias1_)	{kopiuj_string (nawias1_, nawias1);}

   char * wez_nawias2()					{return nawias2;}
   void wpisz_nawias2 (char *nawias2_)	{kopiuj_string (nawias2_, nawias2);}

   char * wez_bez_nawiasow()			{return bez_nawiasow;}
   void wpisz_bez_nawiasow (char *bez_nawiasow_)	{kopiuj_string (bez_nawiasow_, bez_nawiasow);}

   int wez_n()				{return n;}
   void wpisz_n (int n_)	{n= n_;}


   void kopiuj_string (char *string_zrodlo, char *string_cel);
   void znajdz_nawias (char *zrodlo, char *cel);
   void znajdz_bez (char *zrodlo, char *cel);
   void zmien (char *zrodlo,int nr);
   void finish(char *zrodlo);
   void disp(){cout<<"\nwyrazenie: "<<wez_wyr()<<"\n\n";};
   void n1disp(){cout<<"\nNawias1: "<<wez_nawias1()<<"\nNawias2: "<<wez_nawias2()<<"\nbez_nawiasow: "<<wez_bez_nawiasow()<<"\n\n";};
   void n2disp(){cout<<"\nNawias1: "<<wez_nawias1()<<"\nNawias2: "<<wez_nawias2()<<"\nbez_nawiasow: "<<wez_bez_nawiasow()<<"\n\n";};
    };


  void osoba::kopiuj_string (char *string_zrodlo, char *string_cel)
    {
    for (int i = 0; ; i++)
    {
    string_cel [i] = string_zrodlo [i];
    if (string_zrodlo [i] == NULL) break;
    }
    }
  
  void osoba::znajdz_nawias (char *zrodlo, char *cel)
  {
	  n=wez_n();
	  int m=0;
	  while(zrodlo[n]!='(')
	  {
		  n++;
	  }
	  	  while(zrodlo[n]!=')')
	  {
		cel[m]=zrodlo[n];n++;m++;
	  }
	  if (zrodlo[n]==')')
	  {
		  cel[m]=zrodlo[n];n++;m++;
	  }
	  if (zrodlo[n]=='^')
	  {
		  while((zrodlo[n]!='+')&&(zrodlo[n]!='*')&&(zrodlo[n]!='-')&&(zrodlo[n]!='/')&&(zrodlo[n]!=NULL))
		  {
			  cel[m]=zrodlo[n];
			  n++;m++;
			  if (zrodlo [n] == NULL) break;
		  }
	  }cel [m]=NULL;
	  wpisz_n (n+1);
  }
  
void osoba::znajdz_bez (char *zrodlo, char *cel)
{
	int i=0,n=0;
	while(zrodlo[i]!=NULL)
	{
		while (	(zrodlo[i]!='(')&&(zrodlo[i]!=NULL)	)
		{
			cel[n]=zrodlo[i];		
			i++;n++;
		}
		while(	(zrodlo[i]!=')')&&(zrodlo[i]!=NULL)	)
		{
		i++;
		}

		if (zrodlo[i+1]!='^')   // znacznik1 !!! je�li (...)_
		{			
			cel[n]='_';		// znacznik 1!!!
			n++;// znacznik1 !!!
		}


		if (zrodlo[i+1]=='^')
			{
				while((zrodlo[i]!='+')&&(zrodlo[i]!='*')&&(zrodlo[i]!='-')&&(zrodlo[i]!='/')&&(zrodlo[i]!=NULL))
				{
					i++;
				}
				if ((zrodlo[i]=='+')&&(zrodlo[i]=='*')&&(zrodlo[i]=='-')&&(zrodlo[i]=='/')&&(zrodlo[i]==NULL))
				{
					break;
				}
				cel[n]='_';		// znacznik 1!!! je�li (...)^x_
				n++;// znacznik1 !!!
			}
	}
	cel[n]=NULL;
}

 

void osoba::zmien (char *zrodlo,int nr)
{
	char pom[256];
	int i=255,n=0;
		while (i>=0)
	{
		if((zrodlo[i]=='+')||(zrodlo[i]=='*')||(zrodlo[i]=='-')||(zrodlo[i]=='/')||(zrodlo[i]=='^'))
		{
			
			pom[n]=zrodlo[i];n++;
		}
		i--;
	}
	i=0;
	while(zrodlo[i]!=NULL)
	{		
		if((zrodlo[i]!='(')&&(zrodlo[i]!=')')&&(zrodlo[i]!='+')&&(zrodlo[i]!='*')&&(zrodlo[i]!='-')&&(zrodlo[i]!='/')&&(zrodlo[i]!='^')&&(zrodlo[i]!=NULL))
		{
			
			pom[n]=zrodlo[i];
			n++;
		}
		i++;
	}
	pom[n]=NULL;
	
	if (nr==1)
		kopiuj_string (pom, wez_nawias1());
	if (nr==2)
		kopiuj_string (pom, wez_nawias2());
	if (nr==3)
		kopiuj_string (pom, wez_bez_nawiasow());

}

void osoba::finish(char *zrodlo)
{
	int	i=0;
	cout<<"NOTACJA POLSKA: ";
	while (zrodlo[i]!=NULL)
	{
		while(zrodlo[i]!='_')
		{cout<<zrodlo[i];i++;}
		cout<<wez_nawias1();
		i++;
		while(zrodlo[i]!='_')
		{cout<<zrodlo[i];i++;}
		cout<<wez_nawias2();
		i++;
	}
	cout<<endl;
}
int main()
{           int i=0,n=0; // ilosć objektów (...)^x
	char wyrazenie[256]="(x-3)^2/2*(y+2)^5";
	//cin>>wyrazenie;
	while(wyrazenie[i]!=NULL) // n dla pozniejszego
	{if (wyrazenie[i]=='(')
	n++;
	i++;}
    osoba gostek(wyrazenie);
	gostek.disp();

	gostek.wpisz_n(0);	 
	//cout<<"podaj wyrazenie";
	//cin>>wyrazenie;
	//gostek.kopiuj_string (wyrazenie,gostek.wez_wyr ());
	gostek.znajdz_nawias (gostek.wez_wyr(),gostek.wez_nawias1());
	gostek.znajdz_nawias (gostek.wez_wyr(),gostek.wez_nawias2());
	gostek.zmien (gostek.wez_nawias1(),1);
	gostek.zmien (gostek.wez_nawias2(),2);
	gostek.znajdz_bez (gostek.wez_wyr(),gostek.wez_bez_nawiasow());
	gostek.zmien (gostek.wez_bez_nawiasow(),3);
	gostek.n2disp();
	gostek.finish(gostek.wez_bez_nawiasow());
	system("pause");
	return 0;
}

0

za 4 polskie złocisze można nabyć drogą kupna w pobliskim kiosku numer miesięcznika chyba pod tytułem "Delta", zdaje mnie mi się że warto zobaczyć ostatni numer

0

Szczerze przyznam, że zaszokował mnie poziom tutejszej dyskusji. Wygląda mniej więcej tak: "Słuchajcie, mam problem, czy wie ktoś jak wygląda algorytm na zrobienie z notacji infiksowej prefiksowej?" "Tak, wszyscy wiemy, ale ci nie powiemy". Ręce opadają. Czemu służą takie komentarze? Czy człowiek może chcieć gotowca? Jasne, na pewno. W końcu pyta jak to zrobić. Czyli trzeba usunąć wszystkie posty typu: "Pomóżcie, nie rozumiem jak to działa".

Jeśli ktoś nie rozumie jak skonstruować algorytm, a chce wiedzieć jak to zrobić, żeby było w miarę optymalnie, żeby nie narobić błędów, to zdecydowanie nie jest to miejsce dla niego. To jest miejsce dla ludzi, którzy algorytmikę opanowali do perfekcji, ale nie odkryli jeszcze czym jest pseudokod. (No, chyba, że algorytm w pseudokodzie to też jest gotowiec :| ).

Polska Wikipedia jest zaiste skarbnicą wiedzy. Popatrzcie zatem na cudowną stronę dotyczącą Notacji Polskiej, a nie znajdziecie tam śladu konstrukcji algorytmu, a jedynie jakiś pojedynczy przykład użycia. Zaiste, godne polecenia!

Doświadczenie jednak uczy, że ludziska nader dobrze wyczuwają, jak mniej więcej konstruować ciąg wyjściowy, dobrze operują kolejkami, ale nagle okazuje się, że cudowny algorytm, choć wie czym jest (a + b) * c, nie potrafi zrozumieć czym jest c * (a + b). To normalne wśród początkujących. Myślę, że tu bardziej pomóc może, niż zaszkodzić, taki pseudokod.

No, nic. Wiem, popisałam sobie w "zamkniętym" już temacie. Jeśli ktoś to przeczyta, niech nie traktuje tego jak obelgi, ale przemyśli to i zastanowi się dwa razy, nim napisze posta.

Dziękuję za uwagę i pozdrawiam wszystkich!

0

Nekrofile ciągle w sile (chociaż ostatnio ich nie było)!

0

@Ktoś
jest różnica między "Nie umiem tego zrobić, napiszcie za mnie", a "Napisałem już to: .... ale nie chce mi działać, co jest nie tak?"
Chodzi o to żeby wykazać przynajmniej odrobinę samodzielności i własnego wkładu. Bo jak ktoś wrzuci kod, nawet z masą błędów, to jest spora szansa ze ktoś to poprawi. Ale jak ktoś wrzuca tylko przepisany temat swojej pracy domowej, to bardzo mi przykro.

0

@manfredek
Oczywiście. Jak umrzesz, przyjdę po Ciebie ;)

@Shalom
Spoko, rozumiem o co Ci chodzi, ale nie wszyscy pracują w ten sposób. Na swoim przykładzie. Może nie jestem wymiataczem, ale zanim zacznę pisać kod, lubię pomyśleć, być pewna, że mam całkowity jego zarys. Jak dotąd, zaoszczędzało mi to zwykle masę pracy.

Poza tym dla mnie dziwne jest podawanie komuś pytającemu o algorytm, gotowego kodu. To bez sensu. Raz, że zabiera się mu całą frajdę tworzenia, dwa, że daje mu się "zezwolenie" na powielenie czyjejś pracy. Zdaję sobie jednak sprawę, że niektórzy mogą mieć problem z samą konstrukcją (całkowicie poglądową) algorytmu. Albo przynajmniej z jego optymalizacją.

Dla mnie prywatnie, jest szczytem lenistwa dać komuś <ort>nie działający </ort>kod, z prośbą o jego poprawienie. Chyba, że chodzi o bardzo nietrywialne, czy trudne do wykrycia błędy, lub ewentualnie nieznajomość składni języka, nie używanej na co dzień. Wtedy ok.

Innymi słowy, dla mnie nie tylko pomocą jest "użyj tu fgets() zamiast gets(), to nie będziesz pisać po pamięci", ale też "Robi się to tak. Wczytujesz znaki z ciągu wejściowego. Jeśli wczytasz zmienną rób to, a jeśli argument to to, a jeśli nawias zamykający to tamto...", podobnie jak "tu nie potrzebna jest ta struktura danych, można to zrobić prościej"... itp.

Dlatego tak bardzo zdziwiły mnie wasze odpowiedzi.

Pozdrawiam!

0

od dawna zagladasz na podobne fora? pozagladaj przez pare lat, to moze przestanie Cie szokowac fakt, ze odpowiada sie delikwentowom roznie, zaleznie od humoru, zaleznie od postaci poprzednich postow (zwlaszcza pierwszego postu), w zaleznosci od chwilowego natezenia (pseudo)studentow żebrzących na dzien-przed o gotowce, albo, zgrozo, ostatnimi czasy odzywajacych sie podczas egzaminu z prośbą o rozwiazanie zadan na tenże. wbrew szumnemu i dumnemu terminowi "forum dyskusyjne", 99% watkow dyskusja nie jest i nawet, sorry, nie zasluguje lub nie ma szans by sie w nia rozwinac.

w istocie, obserwujac obecne trendy, trafniejsza nazwa na to cos byloby w stylu HELPDESK z dopiskiem POOR MAN'S na poczatku..

jesli watek nosi znamiona żebraniny bez wkladu wlasnego, jest odwalany [patrz post 1wszy]
jesli watek nosi znamiona "niechcemisienapiszciemi" jest odwalany [patrz post 1wszy, 'anulowane' dopiero w poscie z 09-12-2008 16:10, TYDZIEN POZNIEJ.. zakryj ten post i spojrzyj jak watek wygladal przed nim]
jesli ktos napisze jakis post bezsensu, lub z niewielkim sensem, trudno sie dziwic, ze na niego ludzie odpowiedza krotkimi sprostowaniami [ranides, gosc, reichel, ja]
jesli ktos ma wskazowki gdzie szukac informacji - podaje GDZIE [czyt.: podaje link, ksiazke, zrodlo, etc], a nie wkleja wskazowki (dobrowolski). taka pradawna dobra zasada cytowania z bibliografii..

jesli teraz spojrzysz na ten watek nie jako na calosciowa "dyskusje", tylko jak na przytastajaca kolektywna samokorygujaca sie odpowiedz, i uwzglednisz powyzsze "jezeli", to okaze sie, ze tak na prawde mozna to wszystko skompresowac do kilku (sensownych) zdan zapytania i kilku odpowiedzi/linkow/zrodel. reszta to korekty wypowiedzi poprzednikow.

nie skomentuje juz dziwnej tendencji do offtopikowania celem zrugania ew. pozalenia sie na wątpliwie wątpliwy poziom osob udzielajacych sie, najwyrazniej bez zrozumienia calej specyfiki problemu 'spolecznosciowego', nie wspominajac juz o drobiazgu ze na takie rozwazania jest dzial 'spolecznosc' lub przynajmniej 'offtopic'.

dlatego tez zamykam, nie kosz, zebys mial szanse przeczytac.

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