Laboratorium programowania zad 7

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.

Leave a Reply