Zadanie 2 z laboratorium programowania na Informatyce UW.
Zadanie 7 (termin wysylania rozwiazan: 29 II 2008, godz. 23:59) (Kolumny) Napisz program, ktory wczyta z wejscia tekst i wypisze ten tekst na wyjscie w dwoch kolumnach rozdzielonych spacja, znakiem kreski pionowej | i jeszcze jedna spacja. Jesli liczba wierszy tekstu (N) jest parzysta, w pierszej kolumnie znajdzie sie kolejno N/2 pierwszych wierszy, a w drugiej N/2 nastepnych. Jesli liczba wierszy jest nieparzysta, srodkowy wiersz nalezy umiescic na koncu kolumny pierwszej. Spacje, kreske i spacje rozdzielajace kolumny nalezy wypisac w tym samym miejscu kazdego wiersza. Znaki te powinny sie znalezc bezposrednio za koncem najdluzszego wiersza pierwszej kolumny. Krotsze wiersze pierwszej kolumny nalezy uzupelnic na koncu odpowiednia liczba spacji. Np. dla danych: ala ma kota to jest kot ali ela ma psa azor to pies eli ola nie ma psa program powinien wypisac: ala ma kota | azor to pies eli to jest kot ali | ola nie ma psa ela ma psa | Uwaga: Wolno zalozyc, ze wiersze tekstu wejsciowego nie sa bardzo dlugie i moga byc wartoscia typu string. Nie wolno nakladac ograniczenia na liczbe wierszy na wejsciu. Wskazowka: Przed rozpoczeciem wypisywania, tekst z wejscia nalezy wczytac do listy, ktorej kazdy wezel bedzie przechowywal w polu typu string zawartosc jednego wiersza.
A oto rozwiązanie:
program zad7; type //Struktura danych to lista dwuwymiarowa. //Tutaj beda przechowywane litery litera=^literka; literka=record nastepny:litera; txt:char; end; //A tu cale wiersze wiersz=^wier; wier=record txt:litera; nastepny:wiersz; dlugosc:integer; end; var znak:char; pierwszy,teraz,tmp,prawy:wiersz; teraz_znak,tmp_znak:litera; wierszy,dlugosc,najdluzszy,obrotow,i,j,liter:integer; begin if not EOF then begin //Wczytujemy pierwszy wiersz na liste. new(pierwszy); pierwszy^.nastepny:=nil; teraz:=pierwszy; read(znak); new(teraz^.txt); teraz_znak:=teraz^.txt; teraz_znak^.nastepny:=nil; teraz_znak^.txt:=znak; dlugosc:=1; //Wczytujemy litery w wierszach az nie trafimy na koniec while ((znakchar(10)) AND (not EOF)) do begin read(znak); new(teraz_znak^.nastepny); teraz_znak:=teraz_znak^.nastepny; teraz_znak^.nastepny:=nil; teraz_znak^.txt:=znak; dlugosc:=dlugosc+1; end; wierszy:=1; teraz^.dlugosc:=dlugosc; while not EOF do begin new(teraz^.nastepny); teraz:=teraz^.nastepny; teraz^.nastepny:=nil; //wczytujemy kolejne wiersze na liste read(znak); new(teraz^.txt); teraz_znak:=teraz^.txt; teraz_znak^.nastepny:=nil; teraz_znak^.txt:=znak; //Musimy wiedziec ile bedzie wierszy wierszy:=wierszy+1; dlugosc:=1; //Wczytujemy litery w wierszach az nie trafimy na koniec while znakchar(10) do begin read(znak); new(teraz_znak^.nastepny); teraz_znak:=teraz_znak^.nastepny; teraz_znak^.nastepny:=nil; teraz_znak^.txt:=znak; dlugosc:=dlugosc+1; end; //Szukamu najdluzszego wiersza. teraz^.dlugosc:=dlugosc; end; najdluzszy:=0; //Teraz powinnismy miec wszystko w liscie dwuwymiarowej i dane w zmiennych najdluzszy i wierszy. //Zeby wypisywac wszycstko w ten ladny sliczny sposob, znajdziemy wskaznik do pierwszego wiersza prawej kolumny. obrotow:=(wierszy div 2) + (wierszy mod 2); teraz:=pierwszy; //Wskaznik do pierwszego wiersza prawej kolumny for i:=1 to obrotow do begin if teraz^.dlugosc>najdluzszy then najdluzszy:=teraz^.dlugosc; teraz:=teraz^.nastepny; end; prawy:=teraz; teraz:=pierwszy; //Wypisujemy. for i:=1 to obrotow do begin tmp:=teraz; teraz_znak:=teraz^.txt; liter:=0; //Wypisujemy litery i caly czas sprzatamy po sobie. while teraz_znak nil do begin //Mie chcemy przeciez wypisac koncow wierszy /r i /n if ((ord(teraz_znak^.txt)10) AND (ord(teraz_znak^.txt)13)) then write(teraz_znak^.txt); tmp_znak:=teraz_znak; teraz_znak:=teraz_znak^.nastepny; dispose(tmp_znak); liter:=liter+1; end; // spacje for j:=liter to najdluzszy-1 do write(' '); //Kreseczka write(' | '); teraz:=teraz^.nastepny; dispose(tmp); //Jesli jest prawy - wypisujemy if (prawynil) then begin tmp:=prawy; teraz_znak:=prawy^.txt; liter:=0; //Wypisujemy litery i caly czas sprzatamy po sobie. while teraz_znak nil do begin write(teraz_znak^.txt); tmp_znak:=teraz_znak; teraz_znak:=teraz_znak^.nastepny; dispose(tmp_znak); end; prawy:=prawy^.nastepny; dispose(tmp); end else writeln(); //Jesli go nie bylo - musimy znak nowego wiersza. end end end.