Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Текст

Автор: _JC_ 13.10.2005 17:45

Помогите решить задачку!
Дано: текст на русском языке.
Задане: переформатировать текст так, чтобы длина любой строки не превосходила 40 символов.(Выравнивать по правому краю не требуется).
Спасибо заранее!

Автор: volvo 13.10.2005 18:24

_JC_, поиском пользоваться когда-нибудь будем? angry.gif
http://forum.pascal.net.ru/index.php?showtopic=3675&view=findpost&p=33020

Автор: Shura 13.10.2005 18:27

Думаю, можно сделать так:
Открываем исходный файл для чтения, и новый - для записи (в конце старый удаляем, а новый переименовываем по имени старого). А дальше, считываем слова из исходного файла и записываем их в новый. Причем если при записи нового слова в очередную строку нового файла, длина строки превышает сорок, то НЕ дописываем это слово на этой строке - переносим на следующее.

Автор: _JC_ 13.10.2005 19:09

Спасибо большое прости что не воспользовался поиском!
У меня появился вопрос, а можноли сделать так что бы вводишь текст с клавиатуры и он разбивается по 40 символов в строку? Если да то ты не мог бы сказать как это сделать???

Автор: klem4 13.10.2005 19:23

объяви 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 13.10.2005 19:45

klem4, а проверять на нажатие "расширенной" клавиши не надо? А то если юзер нажмет клавишу "Стрелка вверх", то в строке появятся символы #0 и "H" ...

Автор: klem4 13.10.2005 19:54

исправил вроде unsure.gif

Автор: _JC_ 13.10.2005 20:01

А почему каждый символ воспринимается только со 2-ого нажатия можно ли это исправить? И как сделать чтобы он переносил не на серидине слова а его целиком если оно не влазит в строку??? huh.gif

Автор: klem4 13.10.2005 20:06

Цитата(_JC_ @ 13.10.2005 17:01)
А почему каждый символ воспринимается только со 2-ого нажатия можно ли это исправить? И как сделать чтобы он переносил не на серидине слова а его целиком если оно не влазит в строку??? huh.gif


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

Автор: _JC_ 13.10.2005 20:07

Volvo мщжет ты мне подскажешькак мне сделать эту задачу???

Автор: klem4 13.10.2005 20:09

Цитата
переносил не на серидине слова а его целиком


и как ты себе это представляешь при твоей постановке задачи ?!? ты же сказал что тебе нужено сокращать строку до 40 символов !? В этом случае вполне вероятно что какое-либо слово обрубится...

Автор: _JC_ 13.10.2005 20:35

Да вероятно ты прав извини!

Автор: volvo 13.10.2005 21:10

Цитата(_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_ 15.10.2005 2:22

Извиняюсь за то что беспокою, но этот Му.....ЖИК сказал что нужно что бы текст был загружен из файла! Вобщем задача звучит так : загруженый текст из файла разбить на строки не длиннее 40 символов! Поможите??? Спасибо!

Автор: volvo 15.10.2005 2:34

_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