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.