Помощь - Поиск - Пользователи - Календарь
Полная версия: Текст
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
_JC_
Помогите решить задачку!
Дано: текст на русском языке.
Задане: переформатировать текст так, чтобы длина любой строки не превосходила 40 символов.(Выравнивать по правому краю не требуется).
Спасибо заранее!
volvo
_JC_, поиском пользоваться когда-нибудь будем? angry.gif
Разбить текст на строки
Shura
Думаю, можно сделать так:
Открываем исходный файл для чтения, и новый - для записи (в конце старый удаляем, а новый переименовываем по имени старого). А дальше, считываем слова из исходного файла и записываем их в новый. Причем если при записи нового слова в очередную строку нового файла, длина строки превышает сорок, то НЕ дописываем это слово на этой строке - переносим на следующее.
_JC_
Спасибо большое прости что не воспользовался поиском!
У меня появился вопрос, а можноли сделать так что бы вводишь текст с клавиатуры и он разбивается по 40 символов в строку? Если да то ты не мог бы сказать как это сделать???
klem4
объяви s : string[40], больше сорока ты в нее не запишеш, но все лишнее просто исчезнет, еще можешь вводить строку по символьно.

можно как-то на подобии вот этого, только наприер реализовать это как ф-ю, которая еще будет возвращать кол-во строк :

uses crt;
type
TText = array[1..50] of string[40];
var
T : TText;
ch: char;
i : integer;

Begin
clrscr;

i :=1 ;

repeat
ch := readkey;
write(ch);
if not(ch=#27) and not(ch=#0) then
T[i] := T[i]+ch;

if length(T[i])=40 then begin
inc(i);
writeln;
end;

until (i=51)or(ch=#27);

readln;

End.


можно обойтись и без массива и например сразу записывать строку в файл.
volvo
klem4, а проверять на нажатие "расширенной" клавиши не надо? А то если юзер нажмет клавишу "Стрелка вверх", то в строке появятся символы #0 и "H" ...
klem4
исправил вроде unsure.gif
_JC_
А почему каждый символ воспринимается только со 2-ого нажатия можно ли это исправить? И как сделать чтобы он переносил не на серидине слова а его целиком если оно не влазит в строку??? huh.gif
klem4
Цитата(_JC_ @ 13.10.2005 17:01)
А почему каждый символ воспринимается только со 2-ого нажатия можно ли это исправить? И как сделать чтобы он переносил не на серидине слова а его целиком если оно не влазит в строку??? huh.gif


не заню, у меня воспринимает с первого нажатия нормально, а поповоду второго ... мне кажется ты не понял, тут осуществляется ввод текста следующим образом : начинаешь ввод, если ввел 40 символов, то начинается заполнение второй строчки , после ее заполнения следует третья и т.д. или же весь процесс останавливается при нажатии ESC.
_JC_
Volvo мщжет ты мне подскажешькак мне сделать эту задачу???
klem4
Цитата
переносил не на серидине слова а его целиком


и как ты себе это представляешь при твоей постановке задачи ?!? ты же сказал что тебе нужено сокращать строку до 40 символов !? В этом случае вполне вероятно что какое-либо слово обрубится...
_JC_
Да вероятно ты прав извини!
volvo
Цитата(_JC_ @ 13.10.2005 15:01)
как сделать чтобы он переносил не на серидине слова а его целиком если оно не влазит в строку??? huh.gif

Вот так:
uses crt;

const
maxLen = 40;
delimit = [' ', '.', ','];
var
s, T: string;
ch: char;

begin
s := '';
repeat
ch := readkey;
case ch of
#0 : readkey;
#27: ; { ничего не делать ... }
else begin

write(ch);
s := s + ch;

if length(s) = maxLen then begin

T := '';
while not (s[length(s)] in delimit) do begin
T := s[length(s)] + T;
delete(s, length(s), 1);
gotoxy(wherex - 1, wherey); clreol;
end;
s := T;
writeln;
write(s);

end;
end;
end;
until ch = #27;
end.
_JC_
Извиняюсь за то что беспокою, но этот Му.....ЖИК сказал что нужно что бы текст был загружен из файла! Вобщем задача звучит так : загруженый текст из файла разбить на строки не длиннее 40 символов! Поможите??? Спасибо!
volvo
_JC_, приводим задачу к уже решенной :D :
uses crt;

const
maxLen = 40;
delimit = [' ', '.', ','];
var
s, T: string;
ch: char;

f: text;

begin
assign(f, 'text.txt');
reset(f);

s := '';
while not eof(f) do begin

read(f, ch);
write(ch);
s := s + ch;

if length(s) = maxLen then begin
T := '';
while not (s[length(s)] in delimit) do begin
T := s[length(s)] + T;
delete(s, length(s), 1);
gotoxy(wherex - 1, wherey); clreol;
end;
s := T;
writeln;
write(s);

end;

end;
close(f);
end.


P.S. Это будет работать, когда весь текст забит в файле в одну строку. Если есть символы #13 (перевод строки), то нужно будет их соответствующим образом обрабатывать... Тестировалось на файле:
Цитата
start finish end begin end begin start finish end begin end begin start finish end begin end begin start finish end begin end begin
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.