Informatyka I rok
Laboratorium Metod Programowania
2001/2002

Zadanie z dnia: 25.03.02
Termin odbioru: 15.04.02

Zad. 2  

Edytor wierszowy.

Napisz program implementujący edytor wierszowy. Edytor wierszowy
pozwala wczytać plik tekstowy i edytować go usuwając i przestawiając
wiersze (nie pozwala edytować zawartości poszczególnych wierszy).

Ekran edytora powinien być podzielony na następujące obszary:
- Okno stanu programu.
Na samej górze ekranu w dwu wierszach mają być wypisane:
- nazwa edytowanego pliku,
- numer bieżącego wiersza,
- numer(y) wiersza/y z markerami (0, 1 lub 2 liczby),
- liczba wierszy edytowanego pliku,
- wielkość pamięci zużyta do zapamiętania edytowanego pliku
(policzona jako iloczyn liczby wierszy i rozmiaru pamięci
przeznaczonej na pamiętanie jednego wiersza),
- wielkość dostępnej pamięci (funkcje MemAvail i MaxAvail),
- łączna wielkość pamięci dynamicznej (suma pamięci zużytej
i MemAvail).
- Okno z edytowanym plikiem.
Obszar pomiędzy oknem stanu a oknem podpowiedzi ma zawierać
widoczny fragment edytowanego pliku. Pierwszym od góry wyświetlanym
wierszem ma być wiersz bieżący.
- Okno podpowiedzi.
Na samym dole ekranu ma być obszar zawierający spis dostępnych komend.

Uruchamianie programu
Program ma być wywoływany z jednym parametrem (nazwą edytowanego
pliku). Po wywołaniu program ma wczytwać plik do pamięci operacyjnej
i wyświetlić początkowe wiersze tego pliku. Jeśli plik o podanej nazwie
nie istnieje, to należy wypisać komunikat o błędzie. Plik powinien
zawierać wiersze nie dłuższe niż 80 znaków, jeśli tak nie jest, to program
powinien obcinać je do pierwszych 80 znaków. Bieżącym wierszem staje
się pierwszy wiersz pliku (plik pusty należy traktowac jak plik składający
się z jednego wiersza). Na początku nie ma żadnych markerów.

Komendy
Użytkownik może wydawać następujące komendy:
d - Przesunięcie bieżącego wiersza o jeden wiersz dalej (jeśli bieżący
wiersz jest ostatnim, to ta komenda nic nie robi),
g - Przesunięcie bieżącego wiersza o jeden wiersz wcześniej (jeśli bieżący
wiersz jest pierwszym, to ta komenda nic nie robi),
s - Przesunięcie bieżącego wiersza o jeden ekran dalej (ale nie dalej niż
do ostatniego wiersza pliku),
h - Przesunięcie bieżącego wiersza o jeden ekran wcześniej (ale nie wcześniej niż
do pierwszego wiersza pliku),
z - Ustawienie markera w bieżącym wierszu (jeśli nie było dotąd ustawionych
markerów lub był ustaiony tylko jeden, to teraz liczba markerów jest o jeden
wyższa, jeśli wcześniej były ustawione dwa, to teraz jest tylko jeden - ten
właśnie ustawiony),
c - Skopiowanie wierszy z obszaru wyznaczonego zamarkowanymi wierszami za wiersz
bieżący (czyli tą komendą nie można skopiować wierszy na sam początek pliku).
Jeśli bieżący wiersz jest pomiędzy wierszami z markerami lub nie ma ustawionych
dwu markerów, to ta komenda nic nie robi.
p - Przesunięcie wierszy z obszaru wyznaczonego zamarkowanymi wierszami za wiersz
bieżący (czyli tą komendą nie można przenieść wierszy na sam początek pliku).
Jeśli bieżący wiersz jest pomiędzy wierszami z markerami lub nie ma ustawionych
dwu markerów, to ta komenda nic nie robi.
u - Usunięcie wierszy z obszaru wyznaczonego zamarkowanymi wierszami. Jeśli bieżący
wiersz jest pomiędzy wierszami z markerami lub nie ma ustawionych dwu markerów,
to ta komenda nic nie robi.
k - Koniec działania programu. Program zapisuje aktualną postać edytowanego pliku
na dysku, zwalnia zajętą pamięć dynamiczną, czyści ekran i wypisuje wielkość
dostępnej pamięci z momentu rozpoczęcia programu i w chwili obecnej (MemAvail
i MaxAvail).

Pożyteczne operacje:
MemAvail - podaje całkowitą wielkość dostępnej pamięci dynamicznej,
MaxAvail - podaje wielkość największego spójnego fragmentu dostępnej pamięci dynamicznej,
SizeOf(x) - podaje rozmiar argumentu w bajtach, x może być zmienną bądź typem,
GotoXY(x,y) - ustawia kursor we wskazanym miejscu ekranu (moduł CRT),
ReadKey - wczytuje z klawiatury jeden znak (nie wypisując go na ekranie, moduł CRT).

Struktura danych:
Do pamiętania wierszy pliku użyj listy dwukierunkowej, zawartość wiersza pamiętaj w polu
typu String[80].

Wskazówki:
- podziel program na krótkie procedury (np. OdswiezEkran),
- możesz odświeżać cały ekran po każdej operacji,
- zacznij od procedur(y) odświeżających ekran a w trakcie testowania
programu zwracaj uwagę na informacje wyświetlane w oknie stanu,
- pisz program przyrostowo - tzn. nie implementuj od razu wszystkiego, napisz
mały fragment przetestuj go, ew. popraw i dopiero wtedy dodawaj następne
funkcje programu.