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.

veelck

ONP

Rekomendowane odpowiedzi

Potrzebuje kursu do odwrotnej notacji polskiej - jest ktos szczesliwym posiadaczem?

a moze ktos wie jak zrobic taki program bez uzywania ONP?

Kalkulator (+,-,*,/,^) obliczajacy wartosc wyrazen arytmetycznych mogacych skladac sie z tych dzialan. Uwzglednic prawidlowa kolejnosc wykonywania poszczegolnych dzialan. Dodac rozpoznawanie nawiasow '(' i ')' wraz z mozliwoscia ich zagniezdzania. Zalozyc rozsadna maksymalna dlugosc wpisywanego wyrazenia/ Dane oraz wyniki podawane moga byc w systemie dziesietnym z uwzg. liczb ujemnych oraz ulamkow.

przyklad: dla podanego wyrazenia ((2+2)*2)^2 program powinien podac wart. 64

 

TIA

veelck

 

ps. aha, zapomnialem dodac, chodzi o programowanie w C/C++

 

[Edytowane: 15/11/2003 przez veelck]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeżeli chodzi o ONP to tu chyba nie ma wielkiej filozofii. Cały kurs sprowadza się do tego, że najpierw piszesz parametry działania, a potem symbol (np. zamiast 2 + 3 piszesz 2 3 +).

 

Dzięki temu bardzo łatwo napisać analizator. Wrzucasz kolejne parametry na stos i jak natrafisz na operator, to wykonujesz operację na ostatnich dwóch, a wynik znowu na stos. Nie ma problemu z kolejnością działań i z nawiasami. Jedyny problem to niejednoznaczność czy operator jest binarny czy unarny (np. minus od odejnowania i zmieniający znak). Takich przypadków chyba nie może być. Wszystkie operatory muszą mieć unikalne symbole. Chociaż pewności nie mam.

 

Inna sprawa, że treść zadania sugeruje, że jednak nie o to chodzi. Wgląda na to, że to ma być analizator wyrażeń w normalnej notacji. Jeżeli tak, to musisz napisać sobie parser. Jest z tym nieco zabawy. Można sobie trochę ułatwić zadanie. W LibC jest zbiór funkcji do "dopasowywania" wyrażeń regularnych. Poczytaj sobie w dokumentacji (jeżeli ją masz) co jest pod hasłem "regex". Jest też taki program FLEX, do budowania analizatorów składniowych. Tylko nie wiem czy jest sens uczyć się obsługi tych narzędzi, jeżeli chodzi tylko o mały programik. Poza tym musiałbyś wiedzieć co to jest wyrażenie regularne, gramatyka itd.

 

Jeżeli tego wszystkiego nie wiesz, to może zostań przy tej ONP.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

dobra, mam teraz problem, znalazlem takie zrodlo:

 

#include

#include

 

typedef enum {FALSE, TRUE} bool;

 

bool wyrazenie (char **napis, int *wynik);

 

bool liczba (char **napis, int *wynik) {

char *pom = *napis;

 

if (!isdigit(*pom)) return FALSE;

*wynik = 0;

do {

*wynik = 10 * *wynik + *pom++ - '0';

} while (isdigit(*pom));

*napis = pom;

return TRUE;

}

 

bool czynnik (char **napis, int *wynik) {

char *pom = *napis;

 

if (*pom == '(') {

pom++;

if (!wyrazenie(&pom,wynik)) return FALSE;

if (*pom != ')') return FALSE;

pom++;

} else if (!liczba(&pom,wynik)) return FALSE;

*napis = pom;

return TRUE;

}

 

bool skladnik (char **napis, int *wynik) {

char *pom = *napis, c;

int n;

 

if (!czynnik(&pom,wynik)) return FALSE;

while (*pom == '*' || *pom == '/') {

c = *pom++;

if (!czynnik(&pom,&n)) return FALSE;

if (c == '*')

*wynik *= n;

else *wynik /= n;

}

*napis = pom;

return TRUE;

}

 

bool wyrazenie (char **napis, int *wynik) {

char *pom = *napis, c;

int n;

 

if (!skladnik(&pom,wynik)) return FALSE;

while (*pom == '+' || *pom == '-') {

c = *pom++;

if (!skladnik(&pom,&n)) return FALSE;

if (c == '+')

*wynik += n;

else *wynik -= n;

}

*napis = pom;

return TRUE;

}

 

bool oblicz (char *napis, int *wynik) {

if (!wyrazenie(&napis,wynik)) return FALSE;

if (*napis) return FALSE;

return TRUE;

}

 

#define DLUGOSC_WIERSZA 80

 

int main (void) {

char wiersz [DLUGOSC_WIERSZA];

int wynik;

 

printf("kalk> ");

while (gets(wiersz) != NULL)

if (oblicz(wiersz,&wynik))

printf ("%dnkalk> ", wynik);

else printf ("Bladnkalk> ");

return 0;

}

 

ale guzik z tego rozumiem ( no moze poza printf... ;) ) Z tego co zauwazylem po odp. programu, to jest to kalk. obl. dla czeterech dzialan (+ - * /) tylko ze ja nie kumam jak to sie dzieje ze on dziala :(

ja dopiero zaczynam sie uczyc programowac (ostatnio skonczylem tablice [ale nie dynam.]) - moze bylby ktos taki wspanialomyslny i objasnil mi tak w skrocie ten prog.?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

widzę że kolega nie lubi czytać ksiązek a w niedzielę pomyśleć :(

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

myęlę że funkcja main() też powinna się obić o uszy. analizę zacznijmy od niej:

printf - wiadomo

czeka na wporwadzenie informacji

wywołuje funkcję

konczy działanie

:P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
widzę że kolega nie lubi czytać ksiązek a w niedzielę pomyśleć  :( 

 

 

gdybym mial z czego sie tego nauczyc, to nie prosilbym na forum o pomoc. Tylko dlatego, ze musze to zrobic, a nie mam skad wziac materialow, pytam tutaj. Szukalem po necie czegokolwiek i znalazlem tylko takie zrodlo...

a ksiazki lubie czytac :D

 

[Edytowane: 16/11/2003 przez veelck]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie obrażaj się, ale nie wiem czy się uda nauczyć C (nie mówiąc o C++) jeśli posiadasz tylko wiedzę o funkcji printf. co jeszcze wiesz?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
nie obrażaj się, ale nie wiem czy się uda nauczyć C (nie mówiąc o C++) jeśli posiadasz tylko wiedzę o funkcji printf. co jeszcze wiesz?

 

mam Ci zapodac co juz umiem?hmm, ok, wrzuce Ci zrodelko poprzedniego mojego kalkulatora, ktory to teraz niby mamy rozbudowac o kolejnosc dzialan itp...

tylko nie uciekaj ;P

 

#include

#include

#include

#include

 

char tab[33]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','W','X','Y'};

 

void main()

{

int j, i, dl_ul, na, r;

char znak, ulam[40], t[1000];

double a, b, wynik, c, d, k;

 

start:

for (i=0; i!=40; i++)

ulam='0';

clrscr();

gotoxy(35,1);

printf( "KALKULATOR" );

printf( "nnMozliwe operacje:" );

printf( "n (+) wynik = A + B" );

printf( "n (-) wynik = A - B" );

printf( "n (*) wynik = A * B" );

printf( "n (/) wynik = A / B" );

printf( "n (^) wynik = A ^ B ");

printf( "nPodaj pierwsza liczbe A=" );

scanf( "%lf" ,&a );

 

powtznak:

printf( "nPodaj znak operacji:" );

flushall( );

znak= getchar();

if (znak== '+' || znak== '-' || znak== '*' || znak== '/' || znak== '^')

{

powtB:

flushall();

printf( "nPodaj druga liczbe B =" );

scanf( "%lf" , &b );

switch(znak)

{

case '+' : wynik = a + b; break;

case '-' : wynik = a - b; break;

case '*' : wynik = a * b; break;

case '/' :{

if (b==0)

{

printf("Niewlasciwa liczbanr");

goto powtB;

}

wynik = a / b; break;

}

case '^' : wynik = pow(a,B); break;

default:;break;

}

}

else

goto powtznak;

printf("nn%.2lf %c %.2lf = %lfn", a, znak, b, wynik);

printf("nnWynik obliczen w systemie szesnastkowym:nn");

c= floor(wynik);

d= wynik - c;

if (d!=0)

{

for(i= 0; i==10; i++)

{

d= d * 16;

j= d;

ulam= tab[j];

d= d - j;

}

}

i= 0;

if ( c==0 ) printf("0");

while (c != 0)

{

k= floor(c/16);

 

d= fmodl(c,16);

r= d;

t= tab[r];

c= k;

i++;

}

for (i= i-1; i>=0; i--)

printf("%c",t);

 

printf(",");

for (j= 0; j!=10; j++)

printf("%c", ulam[j]);

 

printf("nnWynik obliczen w systemie binarnym:nn");

c= floor(wynik);

d= wynik - c;

 

if (d!=0)

{

for(i= 0; i!=10; i++)

{

d= d * 2;

j= d;

ulam= tab[j];

d= d - j;

}

}

i= 0;

if ( c==0 )

printf("0");

while (c!= 0)

{

k= floor(c/2);

 

d= fmodl(c,2);

r= d;

t= tab[r];

c= k;

i++;

}

for (i= i-1; i>= 0; i--)

printf("%c",t);

 

printf(",");

for (j= 0; j != 10; j++)

printf("%c", ulam[j]);

do

{

printf("nnPodaj podstawe systemu mniejsza od 34, na jaki ma zostac przeliczony wynikn");

flushall();

scanf("%d",&na);

}

while (na<2 || na>33);

c= floor(wynik);

d= wynik - c;

dl_ul= 1;

ulam[0]= '0';

if (d!=0)

{

do

{

printf("Podaj ilosc cyfr do prezentacji czesci ulamkowej (nie wiecej niz 40)n");

scanf("%d", &dl_ul);

}

while ( dl_ul< 0 || dl_ul> 40 );

for(i= 0; i!=dl_ul; i++)

{

d= d * na;

j= d;

ulam= tab[j];

d= d - j;

}

}

i= 0;

if ( c==0 )

printf("0");

while (c != 0)

{

k= floor(c/na);

d= fmodl(c,na);

r= d;

t = tab[r];

c= k;

i++;

}

printf("nWynik obliczen w systemie o podstawie %d:nn",na);

for (i=i-1; i>=0; i--)

printf("%c",t);

printf(",");

 

for (j= 0; j != dl_ul; j++)

printf("%c", ulam[j]);

 

printf("nnAby zakonczyc nacisnij 'k'nAby kontynuowac obliczenia nacisnij [ENTER]nW celu wykorzystania wyniku tych obliczen do nastepnych przycisnij 'd'n");

while (kbhit());

checkznak:

znak= getche();

switch(znak)

{

case 13 : goto start; break;

case 'd':

{

a= wynik;

goto powtznak; break;

}

case 'k':

{

clrscr();

printf("nAutor: Damian Walczak, nr albumu: 133399nPrzepraszam za bledy :)n");

getch(); break;

}

default : goto checkznak; break;

}

}

 

 

to Ci chyba juz da m/w do zrozumienia co umiem, a czego jeszcze nie ;)

a swoja droga to sie nie obrazilem...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie wiem czemu tabulatorow nie pokazuje... :/

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

taak...

Dużo rzeczy:

1. w swoich programach nie używasz swoich funkcji - to nieładnie i nieczytelnie

2. w swoich programach używasz goto - to nieładnie i nieczytelnie

3. wcięcia też upraszcają analize programu - szczególnie początkującym

4. nie uzywasz wskaźników - a to prawie podstawa w C

 

z C wiesz niewiele, z Basica trochę więcej

 

po pierwsze - rozrysuj na kartce takie schemaciki działania: co program robi gdy znajduje liczbę, co robi gdy znak typu +-*/, co gdy znak typu nawias. schematy bardzo ułatwiają pisanie programu bo wiesz co program ma robić (a jak to już inna sprawa)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Popatrzyłem na ten twój kod (dosyć pobieżnie przyznam) i nie bardzo rozumiem gdzie tu miejsce na nawiasy. Ten program jako wejście dostaje dwie liczby i symbol operacji. Jak do tego dodać kolejność działań i nawiasy?

 

Czy możesz podać przykład wejścia jakie ma dostawać ten twój program?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

pewnie wpisujesz wyrażenie, Enter i wyskakuje wynik. ale chyba lepiej zmodyfikować ten pierwszy program. albo napisać na nowo. veelck chwilowo jest trochę za zielony

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
pewnie wpisujesz wyrażenie, Enter i wyskakuje wynik. ale chyba lepiej zmodyfikować ten pierwszy program. albo napisać na nowo. veelck chwilowo jest trochę za zielony
Tak też myślałem na początku i dlatego napisałem, że musi napisać parser.

 

Ale on ma niby rozbudować ten programik, którego listing podał. Tylko że przerobienie programu, który dostaje dwie liczby i zwraca sumę czy coś tam, na program, który dostaje wyrażenie i je oblicza to nie jest właściwie rozbudowa, tylko napisanie od nowa. Szczerze mówiąc, to chyba będzie miał problem. No chyba, że będzie czytał wejście w tej ONP, wtedy nie będzie tak trudno.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

dziwnie uczą sie tego programowania. i po co w C. lepiej zacząć od Pascala. nauczyć schematów przepływu, korzystania z funkcji, poprawnej budowy programu. Pewnie teraz wszystko w jeden semestr - i do Microsoftu :-)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
lepiej zacząć od Pascala
Z tym, to się akurat nie zgodzę. Moim zdaniem można zupełnie spokojnie zaczynać naukę od C/C++. W ostateczności może i nawet od Javy, chociaż to jednak wyrabia złe nawyki.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

to prawda, można zacząć od C ale:

1. musi być dobry prowadzący lub kumaty uczeń

2. programy w C mogą byż za bardzo zagmatwane dla początkujących (vide program od veelcka alne nie jego) jakieś gwiazdki, podwójne gwiazdki itp. :-) - chłopak nie rozumie co tam jest napisane, chociaż jego program jest bardziej nieczytelny

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

z calym szacunkiem cZyNo, moze moj program jest nieczytelny, ale chcialem kilka rzeczy zauwazyc:

1. pisalem ze nie wiem dlaczego nie pokazuje tabulatorow, ktore w moim zrodle mialem..

2. goto uzywalem tylko dlatego, ze sie spieszylem z pisaniem tego i nie robilem tego wszytkiego np. na do while'u a chcialem miec od razu skok w dane miejsce, przy czym wiem ze sie tego nie uzywa obecnie, bo mozna sobie niezle program rozwalic

3. funkcji nie uzywalem, bo nie wiedzialem jak mam wprowadzic dwie liczby typu double a wyprowadzic ciag charow...

4. wskaznikow po prostu jeszcze nam nie wprowadzili, ale jak beda mi potrzebne to sam sobie przerobie. Do napisania tego poprzedniego programu MUSIELISMY miec tablice, bo inaczej tego nie widze, jak przeliczac na dowolny system liczbowy bez wykorzystania chociaz jednej tablicy, a o takim czyms nawet nie wspomnieli...

5. Pascala mialem w LO :)

6. w zyciu nie pisalem w basic'u (kiedys w LO troche w visual basic'u)

7. i ostatnie fajnie ze mi napisaliscie ze nie umiem programowac (i tak jest w istocie i wiem o tym) ale nie po to wstawilem to wszystko zeby teraz sie dowiedziec ze nie mam zielonego pojecia o tym, tylko zeby sie czegos nauczyc ew. dowiedziec w czym dokladnie mam to zrobic. Podalem wam to, co musze miec zrobione. O przerobce napisalem tylko dlatego, ze w poleceniu bylo, ze mamy skorzystac z poprzedniego kalkulatora. Tylko ze ja nie widze sensu zeby korzystac z tego zrodla (jak juz tez zauwazyliiscie) bo po prostu wiekszosc poprzedniego programu to bylo przeliczanie na inne systemy... a teraz to jest niepotrzebne...

takze, jesli ktos ma cos budujacego, to chetnie przeczytam, ale nie chce mi sie juz wiecej patrzec, jak ktos mi mowi "tu nie ma taba, a tu masz goto ale tego sie nie uzywa" bo to mi na pewno w niczym nie pomoze.

pozdrawiam

veelck

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No offence, ja nigdzie nie pisałem, że nie umiesz programować. Wygląda na to, że rzeczywiście nie umiesz zbyt dobrze, ale to nie powód do śmiechu, bo każdy kiedyś zaczynał.

 

A teraz coś konstruktywnego.

Skoro nie wiesz co to jest wskaźnik (albo wiesz ale nie używasz), to raczej dobrego parsera (nawet dla takich prostych wyrażeń) nie napiszesz. Dlatego jeżeli możesz (pozwala ci na to prowadzący), to napisz program, który dostaje na wejściu wyrażenie w ONP. W pierwszym poście napisałem mniej więcej jak ma analizować to swoje wejście. Jak masz jakieś wątpliwości, to pytaj.

 

I jeszcze jedno. Napisz dokładnie co ma dostawać ten program i co ma zwracać.

 

[Edytowane: 16/11/2003 przez KaZet]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

na wejscie dostaje po kolei dzialania typu (jak bylo na poczatku): ((2+2)*2)^2

na wyjsciu ma byc liczba w systemie dziesietnym, najlepiej chyba double bo ma byc z ulamkiem i ujemna, a po co ograniczac ;)

co do wskaznikow to tylko slyszalem ze cos takiego istnieje i to wszystko. Nie wiem jak sie uzywa itp.

 

co do ONP to nie rozumiem troche dlaczego podajac najpierw liczby a pozniej znaki nie wystepuje problem kolejnosci dzialan - mozesz to troche rozjasnic. W polskich stronach nic nie znalazlem, natomiast na jednej angielskiej byl jakis przyklad, ale tez nie skumalem.

na razie to chyba tyle

 

co do Ciebie KaZet to looz - tylko cZyNo troche mnie wpienil o tyle, ze czepial sie nieistotnych (IMO) rzeczy, a nic mi nie pomogl. To co mi wypisal, to ja akurat wiedzialem ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
na wejscie dostaje po kolei dzialania typu (jak bylo na poczatku): ((2+2)*2)^2
Jeżeli po kolei, to po co nawiasy i rozpoznawanie kolejności działań? Przecież dostajesz je po kolei, czyli w dobrej kolejności. Tak to rozumiem.

 

Generalnie pytanie brzmi: czy dostajesz całe wyrażenie na raz, czy nie. Jeżeli całe, to jest problem, bo trzeba je przeanalizować, rozpoznając kolejność działań itd. W wyniku takiej analizy dostałbyś drzewko przedstawiające wyrażnie i korzystając z niego obliczyłbyś wynik.

Z tego co napisałeś wyżej wynika jednak, że nie o to chodzi, czyli dostajesz kolejne polecenia w stylu: dodaj 2 do 2, pomnóż wynik przez 2, wynik mnożenia podnieś do potęgi 2. Jeżeli tak właśnie ma być, to od wpisującego dane do programu zależy kolejność działań, czyż nie?

 

co do ONP to nie rozumiem troche dlaczego podajac najpierw liczby a pozniej znaki nie wystepuje problem kolejnosci dzialan - mozesz to troche rozjasnic
Nie występuje, bo tak to zostało pomyślane. To jest notacja beznawiasowa i nigdy nie ma w niej niejasności. Symbol operacji zawsze odnosi się do bezpośrednio poprzedzających ją wyrażeń/liczb. Od tworzącego wyrażenie zależy jaka będzie kolejność działań.

 

Przykład:

(a + b * c) -> analizator leci od lewej do prawej. Mógłby próbować najpierw dodać a do b, ale to byłby błąd. O tym dowiaduje się jednak dopiero później, gdy natrafi na *. Dlatego jest pewien problem przy analizowaniu takich wyrażeń.

 

(b c * a +) -> tu nie ma wątpliwości. Analizator natrafia na * i wie, że ma pomnożyć b przez c. Później natrafia na + i wie, że ma dodać wynik (b*c) (który wcześniej zapamiętał) do a. Nie można się pomylić analizując wyrażenie od lewej do prawej.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

oj nie denerwuj się. na formum ciężkio uczyć programowania. a programować jeszcze nie umiesz, ale pewnie się nauczysz - boś ciekawski i mam nadzieję że pracowity. gdybym miał taki program to bym ci go przesłał (pamiękam że robiłem coś takiego na komputerze co się nazywał meritum i było to całe wieki temu) ale nie mam już źródła. a czasu na napisanie też nie mam :-(

a na początek pomyśl (i napisz) co ty robisz jak liczysz take działanie. jak sobie to przygotujesz pójdzie ci łatwiej

i jakich tabulatorów?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

wiesz, wyglada na to ze jednak nie do konca od wprowadzajacego dane zalezy kolejnosc dzialan, bo w poleceniu jest Uwzglednic prawidlowa kolejnosc wykonywania poszczegolnych dzialan.

zreszta, w pierwszym poscie dokladnie napisalem polecenie. gosc cos wspominal tylko o tym zeby rozbudowywac ten stary kalk, ale to nie ma sensu.

ponadto wydaje mi sie ze cale wyrazenie ma byc wprowadzane w calosci. (Kalkulator (+,-,*,/,^) obliczajacy wartosc wyrazen arytmetycznych)

Przyklad z polecenia polega na tym (tak mi sie wydaje) ze po prostu program musi rozpoznawac nawiasy na tej zasadzie, ze pomimo tego, iz mamy uwzgledniona kolejnosc dzialan, operacje w nawiasach musza byc nadrzedne.

 

cZyNo>> chodzilo tylko o przejrzystosc - nie wiem dlaczego forum nie pokazalo tabulatorow. :(

jak sprobujesz zaquote'owac moja wypowiedz ze zrodlem to zobaczysz ze byly wciecia (o tym pisales w poscie o 13.43 w 3. podpkt.). Swoja droga, program to nie problem. Juz mialem propozycje od kumpla, ktory ma taki progz. Ale co z tego, jak ma zrodlo, jak nic z tego on nie wie - a jest troche lepszy w tych klockach niz ja. A mi nie chodzi o to, zeby tylko dostac ocene z laborek, chce sie czegos nauczyc, bo studia dopiero zaczynam, a programowania jeszcze troche bede mial.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
cale wyrazenie ma byc wprowadzane w calosci
No skoro tak, to nie ma wyjścia, musisz napisać parser. Ostrzegam, że to nie będzie programik na 2 ekrany. Jak pisałem już wyżej musi przeanalizować całe wejście i stworzyć drzewko, które mu odpowiada (formalnie drzewo wywodu wyrażenia, w odpowiedniej gramatyce), a potem policzyć wynik. Ale jak to zrobić nie korzystając nawet z wskaźników?

 

W sumie to trochę dziwne, że dali wam taki program do napisania już na początku.

 

I jeszcze takie pytanie: skąd tytuł tego wątku? Możez stosować to ONP, czy nie? Mi się coś zdaje, że jednak nie, ale jeżeli tak, to to by baaardzo uprościło sprawę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ONP bo przy obliczaniu wartości nawiasowych wyrażen arytmetycznych powinno się je zamienić na ONP. a właściwie dzieli się na małe elementy i te elemnty (tokeny) zamienia na ONP. i to nie jest na pierwsze laborki. Przy obliczeniach korzysta się ze stosu i innych pierduł. Możliwe że gdzieś mam skrypt z uczelni to opisujący

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
cale wyrazenie ma byc wprowadzane w calosci
No skoro tak, to nie ma wyjścia, musisz napisać parser. Ostrzegam, że to nie będzie programik na 2 ekrany. Jak pisałem już wyżej musi przeanalizować całe wejście i stworzyć drzewko, które mu odpowiada (formalnie drzewo wywodu wyrażenia, w odpowiedniej gramatyce), a potem policzyć wynik. Ale jak to zrobić nie korzystając nawet z wskaźników?

 

W sumie to trochę dziwne, że dali wam taki program do napisania już na początku.

 

I jeszcze takie pytanie: skąd tytuł tego wątku? Możez stosować to ONP, czy nie? Mi się coś zdaje, że jednak nie, ale jeżeli tak, to to by baaardzo uprościło sprawę.

 

Powiem tak - poprzedni program mielismy zrobic bez tablic - a ja sie pytam "JAK"?? co malem walnac swicha na 34 ewentualnosci ?? metoda zrobienia to bym sie akurat nie przejmowal. Tego nikt nam nie narzucil - ma byc w c/c++ i to sa cale zalozenia. Jesli bede mogl wprowadzic wyrazenie i otrzymam poprawny wynik to wszystko bedzie ok. Ostatnio koles sprawdzal, nawet nie zerknal w zrodlo jak to jest napisane... bez roznicy czy ktos mial zrobione na dynamicznych tablicach ze wszystkimi bajerami i przeliczaniem na system uzupelnieniowy czy nie, dostalal albo 4 albo 5 bo tak sie facetowi spodobalo.

 

tytul watku stad, ze jak juz wspominalem mam kumpla ktory troche programuje i ten ma kumpla ktory jest 3 lata wyzej od nas na tym samym. Kiedys go spotkalismy na miescie (jak robilismy jeszcze ten progs z przeliczaniem systemow) i nam mowil, ze najprosciej kalkulator sie pisze przy uzyciu ONP i wtedy mamy nawet kolejnosc dzialan zachowana. A tu jak na ironie teraz mamy cos takiego zrobic.. wiec sie przypomnialo ;)

 

OK, mam teraz takie pytanie - moze masz w takim razie jakis dobry kurs (albo strone z dobrym kursem) do C??

szukalem troche po sieci ale wszystko co widzialem jest slabe, albo konczy sie na programie typu obliczanie pola trojkata.

 

bo widze ze z obecnym stanem wiedzy to moge najwyzej isc na spacer... a opisac cala procedure tworzenia np. 'parsera' to mi sie wydaje ze na forum nie jest latwe. co do wskaznikow to mysle ze bede musial sie tego douczyc i tak, zanim ten program oddam, wiec...

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ę...