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.