Edytor tekstu w Pascalu oparty na strukturach dynamicznych - problemy ze zrozumieniem algorytmu

0

*Z racji na to, że to mój pierwszy post na forum chciałbym wszystkich przywitać. Ze względu na wybrany kierunek studiów myślę, że będę tutaj częściej zaglądał nie tylko jako osoba potrzebująca pomocy ale także pomagająca innym ;) *

W ramach zaliczenia z przedmiotu mam stworzyć w Pascalu konsolowy edytor tekstu oparty na strukturach dynamicznych. Według podanych założeń:
*linie tekstu mają być elementami listy dwukierunkowej,
*linia tablicą znaków lub listą znaków,
*program ma posiadać funkcję wczytywania i zapisywania do pliku oraz prostą edycję tekstu: usuwanie i dodawanie znaków oraz linii.
Niestety na razie nie wpadłem na żaden dobry pomysł, jak podejść do tematu. Z tego co zrozumiałem, linia tekstu to tablica char czytająca wprowadzony znak np. za pomocą readkey'a i każda z tych tablic to osobna linia czyli także osobny element listy dwukierunkowej. Wtedy każda linia jest zarazem elementem listy jak i tablicy char. Nie jestem pewien czy to rozwiązanie jest dobre dlatego proszę o pomoc. Myślę, że temat jest rozwojowy i podczas pisania kodu pojawi się jeszcze wiele pytań z mojej strony. Z góry dziękuję za udzielone wsparcie.

1

myślę, że będę tutaj częściej zaglądał nie tylko jako osoba potrzebująca pomocy ale także pomagająca innym

Powiedział pytacz działu newbie.

Z tego co zrozumiałem, linia tekstu to tablica char czytająca wprowadzony znak np. za pomocą readkey'a i każda z tych tablic to osobna linia czyli także osobny element listy dwukierunkowej.

Tak.

Wtedy każda linia jest zarazem elementem listy jak i tablicy char

Linia (tj. tablica char) to element listy.
Zanim zaczniesz rozwiązywać zobacz co to

  • char (to co zwraca GetKey)
  • string
    i stwierdź że string to tablica charów na dobrą sprawę.

Nie jestem pewien czy to rozwiązanie jest dobre dlatego proszę o pomoc.

Gdy masz coś powiedziane to nie masz z tym dyskutować tylko tak robić. Każdy wie że TStringList dużo lepiej spełni rolę przechowywania danych.

Myślę, że temat jest rozwojowy i podczas pisania kodu pojawi się jeszcze wiele pytań z mojej strony.

Jeżeli twoje pytania będą przemyślane i zrobione zgodnie z zasadą think & bing (albo jak ktoś nie lubi M$ - google).

0
-321oho napisał(a):

myślę, że będę tutaj częściej zaglądał nie tylko jako osoba potrzebująca pomocy ale także pomagająca innym

Powiedział pytacz działu newbie.

Z tego co zrozumiałem, linia tekstu to tablica char czytająca wprowadzony znak np. za pomocą readkey'a i każda z tych tablic to osobna linia czyli także osobny element listy dwukierunkowej.

Tak.

Wtedy każda linia jest zarazem elementem listy jak i tablicy char

Linia (tj. tablica char) to element listy.
Zanim zaczniesz rozwiązywać zobacz co to

  • char (to co zwraca GetKey)
  • string
    i stwierdź że string to tablica charów na dobrą sprawę.

Nie jestem pewien czy to rozwiązanie jest dobre dlatego proszę o pomoc.

Gdy masz coś powiedziane to nie masz z tym dyskutować tylko tak robić. Każdy wie że TStringList dużo lepiej spełni rolę przechowywania danych.

Myślę, że temat jest rozwojowy i podczas pisania kodu pojawi się jeszcze wiele pytań z mojej strony.

Jeżeli twoje pytania będą przemyślane i zrobione zgodnie z zasadą think & bing (albo jak ktoś nie lubi M$ - google).

Ekhem, nie rozumiem po co ten jad na początku? Przecież nie twierdzę, że już dzisiaj zacznę pomagać innym, ale zawsze jest szansa, że za jakiś czas stanę się pomocny. Przepraszam, że chciałem się miło przywitać :P Za resztę serdecznie dziękuję, jak tylko pojawią się kolejne wątpliwości i przemyślane pytania to nie omieszkam je zadać

3

Ekhem, nie rozumiem po co ten jad na początku?

Taka już moja specyfika. Zresztą i tak jestem milutki jak baranek. No ale im milszy jestem tym mniej się to docenia.

Przecież nie twierdzę, że już dzisiaj zacznę pomagać innym, ale zawsze jest szansa, że za jakiś czas stanę się pomocny.

Wątła szansa. Jakiś czas wynosi parę lat żeby móc odpowiadać w paru tematach. Nie każdy uznaje że warto.

Przepraszam, że chciałem się miło przywitać

Przeżyję. Bardziej zadowolony byłbym gdybyś chociaż zadał jakieś ciekawe pytanie (chociaż na to w newbie nie można liczyć). A tak to póki nie jesteś sexi laską to twoje przywitania nie są mi do szczęścia potrzebne.

Patryk27 napisał(a)

Przyzwyczaisz się do stylu -321oho ;] Może.

Jeżeli ma ciągle zamiar tu być, to obawiam się że będzie się musiał do tego przyzwyczaić. Ale nigdy nie zrozumiem jak można nie lubić trollingu mieszanego z przydatną odpowiedzią. Albo uda się pomóc albo ztrollować, jedno i drugie dobre.

0

Witam, w końcu zabrałem się za pisanie tego edytora. Postanowiłem, że każda linia tekstu będzie osobną TStringList, która następnie będzie wczytywana do listy. Mam nadzieję, że ten pomysł jest choć odrobinę sensowny. W każdym razie przy poniższej procedurze:

procedure zapisz_do_linii  ; {zapisuje wprowadzone przez użytkownika znaki do linia_zn}
var
linia_zn: TStringList;
a:String;
glowa:p_linia_tekstu;
begin
  linia_zn:=TStringList.create;
  writeln ('Podaj co chcesz wprowadzic');
  read (a);
  linia_zn.Add (a);
  zapisz_do_listy (glowa,linia_zn);  
end; 

pojawia się problem z obsługą nowych linii tekstu. Nie wiem do końca w jaki sposób zmienić ten kod aby po wciśnięciu klawisza Enter lub gdy użytkownik zapisze całą linię w konsoli (80 znaków), program automatycznie przechodził do funkcji: zapisz_do_listy. Myślałem o czytaniu pozycji X kursora za pomocą WhereX i stworzeniu pętli, która dodaje nowe znaki do TStringList dopóki pozycja X kursora nie zmieni się ale przy

read(a)

to i tak nie zadziała tak jak powinno. W takim razie czym mógłbym zastąpić tą procedurę?

0

że każda linia tekstu będzie osobną TStringList

Czyli, że każda linia ma być zbiorem linii?
TStringList samo w sobie jest "przechowywaczem" tych linii, wystarczy jedno na cały plik tekstowy.

0

Postanowiłem, że każda linia tekstu będzie osobną TStringList
Wat?

Przecież już TStringList jest listą stringów, więc każdy element listy to osobna linia, a cały plik jedną listą stringów...

0

var Str:String[5];

ReadLn(Str);

Z tym że nie zagwarantuje ci to tego że użytkownik nie wpisze dłuższego niż 5 znaków wiersza, ale nie zagwarantuje ci to tego że użytkownik nie wprowadzi więcej niż 5 znaków jedynie wczytasz pierwsze 5.

0

Wat?

Przecież już TStringList jest listą stringów, więc każdy element listy to osobna linia, a cały plik jedną listą stringów...

W takim razie TStringList przechowuje wszystkie wprowadzone znaki... Więc za pomocą czego wprowadzać kolejne linie tekstu do listy?

0

Metoda Add.

0
Patryk27 napisał(a):

Metoda Add.

Czyli mam czytać wprowadzone w linii znaki do String i później każdą z tych linii do TStringList ?

2

Tak; czyli coś w rodzaju:

Var Line: String;
    List: TStringList;
Begin
 List := TStringList.Create;
 Repeat
  Readln(Line);
  List.Add(Line);
 Until (Line = '');
 {...}
 // nie zapomnij na koniec wywołać desktruktora:
 List.Free;
End;
3

Niestety na razie nie wpadłem na żaden dobry pomysł, jak podejść do tematu. Z tego co zrozumiałem, linia tekstu to tablica char czytająca wprowadzony znak np. za pomocą readkey'a i każda z tych tablic to osobna linia czyli także osobny element listy dwukierunkowej. Wtedy każda linia jest zarazem elementem listy jak i tablicy char. Nie jestem pewien czy to rozwiązanie jest dobre dlatego proszę o pomoc.

Obawiam się, że z programowaniem (zarówno w Delphi jak i ogólnie) masz tyle samo wspólnego, co z lotami kosmicznymi; Nie chodzi mi o to, by Cię obrażać, a wyjaśnić, że jeżeli w ten sposób będziesz zadawał pytania to nie dziw się, że spotkasz się z "konstruktywną krytyką";

Na razie to Twój problem przedstawia się mniej więcej tak: Mam zadanie (jak dla początkującego dość trudne), wiem coś o begin i end, coś tam słyszałem o listach, więc może napiszę na forum to mi wszystko napiszą, a może nawet kod dostanę;

Jeżeli nie wykażesz się wiedzą i chęciami do nauki i próbowania/kombinowania to większość odpowiedzi, jakie dostaniesz będą wskazywać albo na kursy programowania, albo na wyrocznię: Google;

Tak więc serdecznie zapraszam do działu Kompendium programisty - Delphi, a w szczególności do działów pt. Podstawy Delphi oraz Programowanie obiektowe - jedna z wielu kopalni wiedzy, trzeba jedynie pożądnego kilofa; Trzeba usiąść, uczyć się, testować, a jak ma się kod, który nie spełnia oczekiwań dopiero pytać, jak go naprawić;

Więcej o Nas i pomocy na forum przeczytaj w opisie pod moim postem;


Patryk27 napisał(a)

Tak; czyli coś w rodzaju:

W ten sposób to wątek przerodzi się w epopeję na temat tworzenia edytora tekstowego w konsoli - ciekaw jestem, na ilu postach (a raczej stronach postów) się zakończy;

0

W sumie to zgadzam się w całej rozciągłości. Moja wiedza z programowania rzeczywiście jest dość mierna, ale ciężko mi coś poradzić na to, że programy które mamy pisać na zaliczenie wybiegają o jeden krok do przodu względem tego co umiemy. Nie piszę po to aby wysępić kod bo zdaję sobie sprawę, że tak się niczego nie nauczę a egzaminu nikt za mnie nie napisze. Po prostu jestem niecierpliwy i kiedy próbując pisać coś od samego rana, pod wieczór okazuje się, że wszystkie moje pomysły są kompletnie do niczego i w sumie trzeba zacząć od nowa to trochę słabo mi się robi i zaczynam panikować :P. Aha, to też nie jest tak, że nie mam żadnego kodu i proszę o pomoc - po prostu gdy jestem pewny, że to co stworzyłem nie ma sensu nie wysyłam tego tylko próbuję dowiedzieć się jak inaczej ugryźć problem.
Cóż, poczytam kompendium programisty, trochę jeszcze o TStringList spróbuję stworzyć coś sensownego i odezwę się jeśli nie będzie działało... Mimo wszystko chciałbym podziękować Patryk27 za ten krótki kawałek kodu. Czasem taka podpowiedź może pomóc zrozumieć albo naprowadzić na dobry trop.

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