Pomoc przy napisaniu programu

Odpowiedz Nowy wątek
2019-01-03 21:25
0

Witam,
czy znalazłby się ktoś kto pomógłby mi z napisaniem tego programu, albo chociaż polecił jakiś kurs w którym są wyjaśniane dość dokładnie wskaźniki i stosy w języku Pascal.
Treśc:
Stos na wskaźnikach (wierzchołek ST typu PStos, PStos=^TStos;)
Dane:Liczba rzeczywista Operacje: a)Wkładanie na stos,zdejmowanie ze stosu; b)dodawanie,odejmowanie, mnożenie i dzielenie liczb z wierzchołka stosu: np function dodaj(a,b: Double): double. W programie głównym wykonać ciąg operacji z godnie z zasadą odwrotenj notacji polskiej."
Z góry dziękuje za odpowiedzi.

Pozostało 580 znaków

2019-01-03 22:02
1

Odnośnie wskaźników oraz stosow - jest tego naprawdę dużo na 4programmers, więc obawiam się, że zamiast szukać, po prostu założyłeś nowy wątek, bo tak pewnie jest łatwiej :p

Ale żeby nie było, że nie pomagam, to poza poleceniem przejrzenia 4p (albo skorzystania z wyszukiwarki), dam jeszcze jakiś link - http://www.algorytm.org/klasyczne/stos.html oraz PowerPoint na ten temat - https://www.google.com/url?q=[...]orytmyIStruktury/Wyklad10.pdf. W pierwszym linku masz mniej teorii, ale jest jakaś implementacja w Pascalu, natomiast drugi ma dużo teorii, ale za to przykłady są w C+.

Jak to przejrzysz oraz poczytasz we własnym zakresie, to dopytaj o konkretne problemy, postaramy się jakoś pomóc ;)


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2019-01-03 22:03

Pozostało 580 znaków

2019-01-03 22:16
0

Problem w tym, że spędziłem dość dużo czasu nad tym zagadnieniem(materiały które podlinkowałeś widziałem)i teoretycznie wiem co to stos, na jakiej zasadzie działają wskaźniki, problem w tym że nie umiem tego przenieść na kod jeśli chodzi o pascala(myślę, że w innym języku poszło by mi łatwiej) do którego nie ma zbyt wiele materiałów które były by pomocne, a przynajmniej ja nie znalazłem kursów które by tłumaczyły dość dobrze sposób zapisu wskaźnika czy też stosu. Mam nadzieję, że zrozumiałeś o co mi chodzi.

Pozostało 580 znaków

2019-01-03 23:05
1

No to może inaczej - jeśli dla Ciebie problemem (tak przynajmniej rozumiem to, co napisałeś) jest raczej sam język, to napisz proszę swoimi slowami/opisowo, jak byś chciał zrealizować ten program, jakie kroki wykonać, jaki masz pomysł na trzymanie danych itp. Będziemy po kolei się starali zamieniać/tłumaczyć te rzeczy na Pascala :)

A tak w ogóle to w czym piszesz? Jakiego środowiska używasz? Czy masz coś narzucone przez szkołę, czy sam mogłes wybrać?


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-01-04 12:04
0

Program musi być napisany w Lazarusie. Najpierw muszę zdefiniować stos(na początku myślałem czy nie wykorzystać tablicy dynamicznej ) korzystając z algorytmu podlinkowanego wyżej będzie to wyglądało chyba tak:

type PStos = ^TStos;  /PStos to wskaźnik wskazujacy na typ record(jeśli dobrze rozumiem) 
TStos = record /To nasza struktura danych typu record  zawierająca zmienna liczba typu integer i wskaznik wskazujacy nastepny element w stosie
        liczba: integer;
        wskaznik: PStos;
  end;

Mam nadzieje że dobrze to zrozumiałem i rozpisałem.
Teraz potrzeba funkcji które będą dodawać lub zdejmować liczby na stosie.

edytowany 1x, ostatnio: k0d1, 2019-01-04 12:05

Pozostało 580 znaków

2019-01-04 12:32
1

Na razie jest OK :) Masz zaprojektowaną strukturę oraz typ wskaźnikowy do niej.

Jedna uwaga - komentarze mają dwa ukośniki - czyli //, jeden to trochę za mało ;)

Co do Lazarusa - słuszny wybór. Bałem się, że walczysz z jakimś zabytkiem w stylu DOS'owego Turbo Pascala. Czy piszesz to w ramach aplikacji konsolowej, czy okienkowej?

Odnośnie "dodawania i zdejmowania liczb" - sprawdź, jak w podanym linku jest to rozwiązane. Walczą tam wprawdzie ze stosem przechowujący nazwiska, a Ty chcesz liczby - ale zasada jest taka sama. Ewentualnie napisz, czego konkretnie nie rozumiesz.

Poza tym możesz skorzystać z Pastebin (link na górze 4P) i wkleić cały kod, który już napisałeś (a nie jedynie deklarację samego typu) - w ten sposób będziemy mogli sobie zrobić Ctrl+C i Ctrl+V u siebie i mieć ten sam kod, co Ty. Ułatwia to pracę.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2019-01-04 12:35

Pozostało 580 znaków

2019-01-04 13:41
1

Aplikacja konsolowa, tak jak napisałeś wzorowałem się na podanym linku.Tutaj link do pastebin'a https://4programmers.net/Pastebin/10374 opisałem to jak to rozumie mniej więcej. Kompilator kompiluje, jednak teraz trzeba napisać wyświetlenie stosu i sprawdzenie czy to działa. Wyświetlenie trzeba zrobić w procedurze a w instrukcji głównej zrobi się switcha z elementami dodaj/usuń/wyświetl.

edytowany 4x, ostatnio: k0d1, 2019-01-04 13:44

Pozostało 580 znaków

2019-01-04 14:50
1

Teraz nie mogę za wiele Ci napisać, ale postaram się pod wieczór.
Do tego czasu mam propozycję - zajmij się obsługą interakcji z użytkownikiem, czyli wyborem akcji do wykonania, wczytywaniem liczb itp. Na razie to będzie tylko taki szkielet, więc np. po wybraniu przez użytkownika opcji "wprowadź liczbę" wywołaj jedynie funkcję "wczytaj_liczbe", która będzie pusta. Analogicznie z wyborem operacji do wykonania oraz innych rzeczy, które aplikacja ma robić. Ten sposób ma też taki plus dla Ciebie, że sam sobie poukładasz pewne rzeczy w głowie oraz zastanowisz się nad tym, co dokładnie ma program robić, jakie operacje wykonywać itp. Jak będziesz miał szkielet, to zajmiemy się wypełnianiem treści procedur.

Jedyna rzecz, którą możesz już zrobić "porządnie" i ostatecznie, to obsługa zakończenia działania aplikacji. Jeśli wiesz, jak zrobić sterowanie aplikacją oraz jak ją zakończyć, gdy użytkownik będzie chciał, to nie czytaj dalej i zrób "po swojemu" - jeśli się uda, to będziesz miał większą radość :D

Postaraj się zrobić to wszystko o czym napisałem i do zobaczenia wieczorem.

.
.
.
.
.
.
.
.
.
.
.
.

Jednak czytasz dalej :D

W takim razie ja bym pętlę obsługującą interakcje z użytkownikiem zrobił mniej-więcej w następujący sposób (podaję sposób realizacji, a nie gotowy kod):
1) najpierw deklarujesz zmienną globalną typu boolean. Ja ją nazwałem koniec. Dajesz jej jakąś wartość początkową - np. False.
2) w głównym bloku aplikacji (odpowiednik void main z C, w Twoim Pastebin trzy ostatnie linie - między begin a end z kropką) dajesz pętlę typu while, której warunkiem zakończenia jest zmieniona wartość zmiennej koniec
3) podczas wczytywania poleceń od użytkownika sprawdzasz, czy nie chce on zakończyć aplikacji (przykładowo - "1-dodaj liczbę, 2-zsumuj liczby, 3-zakończ aplikację". W chwili wciśnięcia przez użytkownika liczby 3 zmieniasz wartość zmiennej koniec na stan odwrotny
4) pętla while z pkt.2 w chwili zmiany wartości zmiennej koniec kończy swoje działanie, a co za tym idzie (zakładając, że nie ma po niej żadnych innych poleceń) cała aplikacja się kończy.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-01-04 14:53
0

Dodawanie i wyświetlanie działa wyśmienicie(zastanawiam się czy nie dodać jakiś indeksów przy wyświetlanych liczbach), problem mam z usuwaniem ze stosu nie rozumiem jakie parametry mam dostarczyć do tej procedury. https://4programmers.net/Pastebin/10375

Pozostało 580 znaków

2019-01-04 15:12
1

Niestety, nie działa wyśmienicie, a jedynie jako-tako (swoją droga, mogłeś wrzucić ten kod za pierwszym razem, nie musiałbym się produkować w poprzednim poście :P ).

Po pierwsze - wpisz sobie "d" a potem "34rs" albo cokolwiek innego, co nie jest liczbą. Program się wychrzania. Przydałoby się zrobić jakieś sprawdzanie wprowadzonych wartości.
Po drugie - lista opcji wyświetla się tylko raz, podczas pracy może ona przewinąć się za ekran.
Po trzecie - po dodaniu wartości nie dostaję żadnej informacji, po prostu wciskam Enter i widzę nic. Jakaś informacja dla użytkownika by się przydała.
Po czwarte - ja bym za każdym razem po wykonaniu czynności przez użytkownika czyścił ekran, wyświetlał potwierdzenie zrobienia danej czynności i ponawiał wypisanie listy dostępnych opcji
Po piąte - nie wiem, ile liczb planujesz przechowywać, ale jeśli 10 lub więcej, to może lepiej je wymienić w poziomie a nie pionowo, bo ich wyświetlenie może zajmować zbyt wiele miejsca.
Po szóste - TAK, ponumerowanie wpisanych liczb ułatwi przeglądanie
Po siódme - do kroku opisanego pod nr czwartym, dodał jeszcze informację w stylu "obecnie jest wprowadzonych X liczb"
Po ósme - wybierając jakąś literę/polecenie nieistniejące w menu nic się nie dzieje. Dobrze by było dodać informację w stylu "wybrano nieprawidłowe polecenie".


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-01-04 19:32
0

Patrząc na twoje rady poprawiłem trochę kod i wygląda on następująco https://4programmers.net/Pastebin/10380 , pierwszego kroku nie zrobiłem ponieważ nie mam pomysłu(myślałem nad sprawdzaniem kodu ascii wprowadzanej zmiennej ale to ograniczało by się tylko do licz od 0 do 9, szkoda że nie ma czegoś takiego jak typeof w js ), co do wypisywania zostawię w pionie lepiej to obrazuje działanie stosu. Teraz myślę nad podpunktem b)> b)dodawanie,odejmowanie, mnożenie i dzielenie liczb z wierzchołka stosu: np function dodaj(a,b: Double): double. W programie głównym wykonać ciąg operacji z godnie z zasadą odwrotenj notacji polskie np obliczanie wyrażeń c:=a+(bc);d:=(a+b)/(c-d);d=a(b-c). Zakładam że trzeba pobrać dwa najwyższe elementy ze stosu(można też sprawdzić czy na stosie jest więcej niż 1 element ) i je dodać.Co do notacji nie mam pojęcia jak to zrealizować. Co do poprzedniej sytuacji porostu zły timing z tym wklejeniem kodu :)
P.S da się jakoś aktualizować poprzedniego PasteBina ?

edytowany 3x, ostatnio: k0d1, 2019-01-04 19:39

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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