Text37. Дан текстовый файл, содержащий текст, выровненный по левому краю. Абзацы текста разделяются одной пустой строкой. Выровнять текст по ширине (то есть и по левому, и по правому краю), увеличив в каждой непустой строке (кроме последних строк абзацев) количество пробелов между словами, начиная с последнего пробела в строке (ширину текста считать равной $$50$$).
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
program Text37; var F_in,F_out: Text; Name,S1,S2,S: string; MaxLen,CountSpace:integer; Function ResizeString(S:String;Size:integer):String; var STemp,Word:string; Len,i,i2:integer; F: Text; begin STemp:=S; len:=Size-length(S); CountSpace:=0; Assign(F,'~word'); Rewrite(F); While pos(' ',S)<>0 do begin inc(CountSpace); Word:=Copy(S,1,pos(' ',S)-1); Writeln(F,Word); Delete(S,1,pos(' ',S)); end; Writeln(F,S); Close(F); len:=len+CountSpace; Reset(F); I:=0; Readln(F,Word); S:=Word; While not eof(F) do begin Readln(F,Word); inc(i); if i<=(len mod CountSpace) then for i2:=1 to (len div CountSpace)+1 do S:=S+' ' else for i2:=1 to (len div CountSpace) do S:=S+' '; S:=S+Word; end; Close(F); ResizeString:=S; end; begin Write('File name in: '); Readln(Name); Assign(F_in,Name); Write('open'); Assign(F_out,'~'+Name); Reset(F_in); Rewrite(F_out); MaxLen:=50; Reset(F_in); Readln(F_in,S1); While not eof(F_in) do begin S2:=S1; Readln(F_in,S1); if (S1<>'') and (S2<>'') then S2:=ResizeString(S2,MaxLen); Writeln(F_out,S2); end; Writeln(F_out,S1); Close(F_in); Close(F_out); Erase(F_in); Rename(F_out,Name); end. |
Другие задачи из раздела Text можно посмотреть здесь.
Я тоже сначала часа 3 изобретал велосипед на многострок и переменных. Потом понял что всё куда проще делается:
Поспешил, вот до конца правильное решение.
24 строка не зацепилась при копировании, там end. не хватает