Консультация № 153285
07.12.2008, 10:04
0.00 руб.
0 15 0
уважаемые эксперты!!!! У меня возникла проблема с задачей!!! Пожалуйста помогите ее решить срочно, насколько это возможно, для меня это очень важно!!!
Разработать программу печати текстового файла с размещением текста по 60 символов в строку с переносом в месте разрыва слова и и вставкой пустой строки перед каждым абзацем ( абзац -- 5 пробелов). Предусмотреть нумерацию страниц... В странице 50 строк...
Ответте как можно подробнее и если можно с пояснениями... Очень хочу понять!!!
Самые большие проблемы возникли (как ни странно) с размещение текста по 60 символов в строку!!!( получается так , что не больше 60 но многие строки меньше). Еще проблемы спереносом слов... Вот что у меня получилось...

Приложение:
Program FileCopy;
type ms=array[1..200] of string;
var
FFrom,FTo: Text;
NameFrom,NameTo: string;
d,b:string;
IsError:boolean;
s,k,q,w,e:integer;
A:ms;
o:string[60];
Procedure pages(k:integer);
begin
if k=50 then
begin
s:=s+1;
writeln(FTo,'--------------------Page',s,'--------------------');
k:=0;
end;
end;
Procedure y(q:integer);
begin
q:=q+1;
Read (FFrom,d);
if q-w=1 then d:=concat(b,d);
k:=k+1;
o:=d;
Pages(k);
writeln(FTo,o);
end;
begin
w:=0;
s:=1;
k:=1;
IsError:=True;
while IsError do
begin
Writeln('Specify a name of a file which is necessary for copying:');
Readln(NameFrom);
Assign(FFrom, NameFrom);
{$I-}
Reset(FFrom);
{$I+}
IsError:=IOResult>0;
if IsError then writeln('File not found!!!');
end;
Writeln('Specify a name of a file of appointment:');
Readln(NameTo);
Assign(FTo, NameTo);
Rewrite(FTo);
writeln(FTo,'--------------------Page',s,'--------------------');
while not SeekEof(FFrom) do
begin
w:=w+1;
Read(FFrom,d);
if length(d)<>60 then begin
b:=d;
k:=k+1
end
else writeln(FTo,d);
if length(d)<60 then
while not SeekEof(FFrom) do
y(q);
end;
Close(FTo);
Close(FFrom);
end.

Обсуждение

Неизвестный
08.12.2008, 10:44
общий
Уважаемые эксперты помогите пожалуйста хотя бы с алгоритмом переноса слов и втавки пустой строки!!!
Неизвестный
08.12.2008, 22:39
общий
Рекомендую текст печатать по словам, если текущая длина строки + длина слова > 60, то переходить на следующую. Если строка начнётся с 5 пробелов - это абзац, и перед его выводом надо сделать пустую строку. Чуть попозже пример напишу.
Неизвестный
08.12.2008, 23:48
общий
Да, это если я правильно понимаю формулировку "перенос в месте разрыва слова". Я подумала, что имелось в виду, что слова нельзя разрывать, это так?
Неизвестный
08.12.2008, 23:52
общий
Слова разрывать можно, просто в конце строки где кончается разорванное слово надо посавить значок "-"!!! Ответте если можно поскорее мне к завтра надо!!!!
Неизвестный
08.12.2008, 23:57
общий
С выводом по 60 в строку я уже разобрался!!! Правда я по другому сделал...
Неизвестный
08.12.2008, 23:59
общий
Вот
Код:

Program FileCopy;
var
FFrom,FTo: Text;
NameFrom,NameTo: string;
d:string[60];
IsError:boolean;
i,j:integer;
Procedure Pechat(i,j:integer);
begin
Reset(FTo);
Rewrite(FFrom);
writeln(FFrom,'------------------------- Page',j,' ------------------------------');
while not SeekEof(FTo) do
begin
Read(FTo,d);
i:=i+1;
if i=70 then
begin
j:=j+1;
i:=0;
writeln(FFrom,'------------------------- Page',j,' ------------------------------');
end;
Writeln(FFrom,d);
end;
end;
begin
j:=1;
IsError:=True;
while IsError do
begin
Writeln('Specify a name of a file which is necessary for copying:');
Readln(NameFrom);
Assign(FFrom, NameFrom);
{$I-}
Reset(FFrom);
{$I+}
IsError:=IOResult>0;
if IsError then writeln('File not found!!!');
end;
Writeln('Specify a name of a file of appointment:');
Readln(NameTo);
Assign(FTo, NameTo);
Rewrite(FTo);
while not SeekEof(FFrom) do
begin
Read(FFrom,d);
Write(FTo,d);
end;
Pechat(i,j);
Close(FTo);
Close(FFrom);
end.


Неизвестный
09.12.2008, 00:58
общий
Спасите!!!
Неизвестный
09.12.2008, 01:02
общий
В процессе спасения...
Неизвестный
09.12.2008, 01:21
общий
)
Неизвестный
09.12.2008, 01:35
общий
Я бы сделала примерно так:
Код:
Procedure Pechat;
var i,j,k,l,h,lb,bs,bw:integer;
begin
i:= 0; j:= 1; k:= 0; buf:= ''; h:= 0;
Reset(FTo);
Rewrite(FFrom);
writeln(FFrom,'------------------------- Page',j,' ------------------------------');
while not SeekEof(FTo) do
begin

Read (FTo,d);
h:=0;
d:= buf+d;
l:= length (d);
buf:= '';
while (h<l) do
begin
bs:= h;
while (h<l) and (d[h]=' ') do inc (h);
if (h-bs>=5) then
begin
if (buf<>'') then writeln(FFrom, buf);
writeln(FFrom);
buf:='';
end;
while (h<l) and (d[h]<>' ') do inc (h);
if (h-bs+length(buf)<=60) then buf:= buf+copy (d, bs, h-bs)
else begin
buf:= buf+copy (d, bs, 59-(h-bs+length(buf)))+'-';
writeln (FFrom, buf);
buf:= '';
i:=i+1;
if i=50 then
begin
j:=j+1;
i:=0;
writeln(FFrom,'------------------------- Page',j,' ------------------------------');
end;
end;
end;
end;
if (buf<>'') then writeln (FFrom, buf);
Close(FTo);
Close(FFrom);
end;

Требуется доработка, но принцип, мне кажется, должен быть такой, иначе не отследить переносы и абзацы.
Неизвестный
09.12.2008, 01:41
общий
Огромное спасибо!!!! Сейчас попробую понять....
Неизвестный
09.12.2008, 03:06
общий
Все сделал, хотя и вроде немного по другому... Осталось только разобраться со вставкой пустой строки!!! Может поможете??? Вот алгоритм который сейчас:
Код:

uses crt;
Var f1,f2:text; s,s1:string; fname1,fname2:string; IsError:boolean; k,j:integer;
Begin

clrscr;
IsError:=True;
while IsError do
begin
Writeln('Specify a name of a file which is necessary for copying:');
readln(fname1);
assign(f1,fname1);
{$I-}
reset(f1);
{I+}
IsError:=IOResult>0;
if IsError then writeln('File not found!!!');
end;
Writeln('Specify a name of a file of appointment:');
readln(fname2);
assign(f2,fname2);
rewrite(f2);
writeln(fname2,'------------------------- Page',j,' ------------------------------');
s1:='';
repeat
readln(f1,s);
s:=s1+s;
if length(s)>60 then
begin
s1:=copy(s,61,length(s)-60);
delete(s,61,length(s)-60);
end;
k:=k+1;
if k=45 then begin j:=j+1; writeln(fname2,'------------------------- Page',j,' ------------------------------'); k:=0; end;
writeln(s); writeln(f2,s);
until eof(f1);
if length(s1)>0 then
begin
writeln(s1); writeln(f2,s1);
end;
close(f1); close(f2);
end.


Неизвестный
09.12.2008, 03:10
общий
Неизвестный
09.12.2008, 03:25
общий
if (h-bs>=5) then {если 5 пробелов}
begin
if (buf<>'') then writeln(FFrom, buf);
writeln(FFrom); {вставляем пустую строку}
buf:='';
end;
Это место в моём примере - вставка пустой строки при появлении 5 пробелов.
Неизвестный
09.12.2008, 03:29
общий
Спасибо ещё даже большее чем прежнее!!!!!)
Форма ответа