IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Обработка файла, нужно отформатировать текст по ширине
Jaxx
сообщение 24.04.2004 13:05
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Добрый день.
Программированием начал заниматься недавно (причем по учебе). учусь в универе на программиста, и мне нужно написать курсовую на Паскале. А у меня ничего не получается, так что, если Вам не тяжело, то помогите чем сможете - мне всего 1 прогу нужно накатать.
Задание такое:
Разработать программу "Выравнивание". Исходная информация: текст,
записанный в текстовом файле. Программа выводит этот текст с
выравниванием по краям. Тескт выводится без переносов слов. Параметры
абзаца задаются в диалоговом режиме.
Заранее очень благодарен !


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 24.04.2004 14:07
Сообщение #2


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Код
Program FORMAT_TEXT;
Uses Crt;
Var
I:longint; {­®¬Ґа н«-в  вҐЄбв®ў®Ј® д « }
F:File of byte; {д ©« ⥪бв®ўл©, Є ¦¤л© н«-в -Є®¤ ASCII }
filename:string;{Їгвм Є д ©«г}
el,ke,j,otst,g:byte;
{
  el  - Є®¤ бЁ¬ў®« , ўлў®¤Ё¬®Ј® ­  нЄа ­
  ke  - ¤«Ё­­  ўлў®¤Ё¬ле бва®Є
  j   - бзҐвзЁЄ, ­Ґ®Ўе®¤Ё¬л© ¤«п бў®ҐўаҐ¬Ґ­­®Ј® ЇҐаҐў®¤  Є аҐвЄЁ
  otst- ®вбвгЇ ®в Єа п нЄа ­ 
  g   - бзҐвзЁЄ, ®в¬ҐапойЁ© «Ґўго Ја ­Ёжг
}
Begin
ClrScr;
Write('‚ўҐ¤ЁвҐ Ё¬п зЁв Ґ¬®Ј® д ©« :'); readln(filename);
Assign(F,filename);
{$I-} reset(f); {$I+}
If IOResult<>0 then
begin
 {Їа®Ё§®и«  ®иЁЎЄ  ЇаЁ ®вЄалвЁЁ д ©«  ... }
 writeln('ERROR - FILE NOT FOUND OR UNKNOWN ERROR');
 halt {§ ўҐа襭ЁҐ а Ў®вл Їа®Ја ¬¬л}
end;
Write('ўўҐ¤ЁвҐ ¤«Ё­­г бва®Є, ўлў®¤Ё¬ле ­  нЄа ­ ');
readln(ke);
write('ўўҐ¤ЁвҐ ®вбвгЇ ®в ЏђЂ‚Ћ‰ Ја ­Ёжл нЄа ­ ');
readln(otst);
writeln;
{¤Ґ« Ґ¬ 1 ®вбвгЇ}
for g:=1 to otst do write(' ');
{зЁв Ґ¬ д ©« ...}
for I:=1 to filesize(f) do
begin
 {ЇҐаҐў®¤Ё¬ ­  ®зҐаҐ¤­®© н«-в}
 seek(f,(I-1));
 {зЁв Ґ¬ н«-в}
 read(f,el);
 {ўлў®¤Ё¬ бЁ¬ў®« ­  нЄа ­, Ґб«Ё нв® ­Ґ гЇа ў«пойЁҐ б¬Ёў®«л}
 If (el<>13) and (el<>10) then begin write(CHR(el)); inc(J,1) end;
 {ЇҐаҐў®¤Ё¬ Є аҐвЄг, ¤Ґ« Ґ¬ ®вбвгЇ}
 If J=ke then
 begin
  J:=0;
  writeln;
  for g:=1 to otst do write(' ')
 end;
end;
writeln('ђ Ў®в  Їа®Ја ¬¬л § ўҐа襭 , ­ ¦¬ЁвҐ «оЎго Є« ўЁиг...');
{¦¤Ґ¬ ­ ¦ вЁп Є« ўЁиЁ, ¬®¦­® § ¬Ґ­Ёвм ­  readkey}
while not keypressed do;
end.

Если есть вопросы, задавайте.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jaxx
сообщение 25.04.2004 10:06
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Ну спасибо. Прога работает нормально. Но есть недостаток, причем довольно существенный. В условии сказано, что текст выводится без переносов. А эта прога разрывает слова. Если есть возможность, подскажите как исправить.


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 25.04.2004 10:31
Сообщение #4


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


можно так сделать, но это сложнее, надо не просто переносить каретку после набегания счетчика, но смотреть чтобы пробел был!


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jaxx
сообщение 25.04.2004 12:19
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


А вот как это сделать ? Со сложностью проблем нет - я как нибудь разберусь.
А как убрать переносы - не знаю. Я так понимаю, что в цикле нужно сделать проверку последнего символа, и если он окажется буквой, то что с ним делать?
Ведь нужно будеть растянуть строку по ширине, а значит между словами вставить дополнительные пробелы.


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 25.04.2004 14:26
Сообщение #6


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Так, а как правилно, так (выводим строки длинной 18):

фыфпвап вапф варыа (в этой строке 18 сиволов, не считая скобку)
аврвар ыварваор врывар
ывар ырыпарыва ывр
ыавп варвар варвар

И добавить пробелы между словами, или надо так (выводим по 18, если не умещаеться, то все слово переносим):

фыфпвап вапф варыа
аврвар ыварваор
врывар ывар
ырыпарыва ывр ыавп
варвар варвар

а потом добавляем пробелы между словами.
----
Это принципиально важно.
В первом случае мы после набегания счетчика строки переводим каретку после конца слова.
(т.е. к коду надо добавить проверку конца слова, это не сложно)
А во втором случае, надо каким-то образом узнавать уместится ли слово на строке или его уже надо переносить.

----
2 способ значительно сложнее, но более правильный (как мне кажется).


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jaxx
сообщение 25.04.2004 15:46
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Мне честно говоря, больше нравится естественно второй способ, но мне от этого легче не становится.
А если попробовать так – ширина экрана равна 80 символов (т.е. макс. длина строки тоже 80). Пользователь задаёт отступ справа (напр. 3 символа), и длину строки (напр. 76 символов). И если длина первой строки файла превышает 76, то тогда нужно сделать проверку на перенос. Проверку можно сделать так: берем последний (76-й) символ в строке, и если это пробел, то идем дальше, а сели это буква, то перебираем все символы с конца до тех пор, пока не найдем пробел. Найденный пробел делаем последним символом строки, а расстояние между этим пробелом и последней буквой в строке равномерно (по возможности) распределяем между остальными пробелами в строке (но так, чтобы этот найденный пробел был последним символом и не выводился на экран).
На словах вроде не особливо сложно, но написать я попрошу все-таки Вас (если можно).


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 26.04.2004 6:54
Сообщение #8


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Цитата
Мне честно говоря, больше нравится естественно второй способ

Второй и сделаем!


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jaxx
сообщение 26.04.2004 19:24
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Буду премного благодарен за оказанное содействие.
Ибо сам я не особый гений прграммирования (может просто опыта маловато) sad.gif

Добавлено (30.04.04 14:10):
Нужно довольно срочненько !!!

Добавлено (8.05.04 10:16):
Про меня что, все забыли совсем? Это же курсовая. Обратиться мне больше не к кому. Неужели не поможете ?


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BlackShadow
сообщение 8.05.2004 11:22
Сообщение #10


Гость






6 минут работы, и вот результат... Вроде то, если что не так - пиши

Код

Var
 f:Text;
 n,i:Integer;
 s,s2:String;

const
 Delimiters=[' ',',','.','!','?',';',':'];

Begin
 Write('Enter Length Of String: ');
 ReadLn(n);
 Assign(f,'In.Txt');
 Reset(f);
 s:='';
 While Not Eof(f) Do
 Begin
   While (Not Eof(f)) And (Length(s)<n) Do
   Begin
     ReadLn(f,s2);
     s:=s+' '+s2
   End;
   If Length(s)>n Then
   Begin
     For i:=n DownTo 1 Do
       If s[i] In Delimiters Then
         Break;
     WriteLn(Copy(s,1,i));
     Delete(s,1,i)
   End
   Else
   Begin
     WriteLn(s);
     s:=''
   End
 End;
 Close(f)
End.
 К началу страницы 
+ Ответить 
Jaxx
сообщение 14.05.2004 20:56
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Вот пишу. Ибо что-то не то. У меня программа почему-то выводит только часть текстового файла, а не весь. Во-вторых, я может недоговорил насчет условия.
Понимаете, нужно чтобы текст выравнивался по ширине, как в Word, то есть
никаких разрывов слов, а между словами доставить пробелы так, чтобы последним символом в строке была буква или запятая или еще что но целиком.
Программа нужна обязательно в течение недели.
Спасибо тем кто ответил хотя бы за сочувствие...


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 14.05.2004 22:03
Сообщение #12


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Я за выходные попробую дописать ту, что сначала писал.
Не стоит отчаиваться.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jaxx
сообщение 15.05.2004 10:39
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Очень надеюсь, а то столько проблем с этим пограммированием.
Ну неуч я, неуч...Что же я могу сделать. Тяжело мне дается эта наука.


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 15.05.2004 17:59
Сообщение #14


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Код

Program FORMAT_TEXT;
Uses
CRT,GRAPH;
Var
FileName:string;
F:file of byte;
LG,PG:byte;
slovo,s:string;
c,i:byte;
{----------}
Procedure _LG(o:byte); {Їа®жҐ¤га  ¤Ґ« Ґв ®вбвгЇ}
var
m:byte;
begin
for m:=1 to o do write(' ')
end;
{----------}


{Ћб­®ў­ п Їа®Ја ¬¬ }
Begin
repeat
 ClrScr;
 Writeln('‚ўҐ¤ЁвҐ Ё¬п ®Ўа Ў влў Ґ¬®Ј® д ©« '); Readln(FileName);
 Write('ЋвбвгЇ б«Ґў ='); readln(LG);
 Write('¤«Ё­­  ўлў®¤Ё¬®© бва®ЄЁ='); readln(PG);
 ClrScr;
 Assign(F,FileName);
 {$I-} Reset(F); {$I+}
Until IOResult=0;
While Not EOF(F) do
begin
 read(F,c);
 If (C<>10) and (C<>13) then
 begin
  If C<>32 then slovo:=slovo+CHR(C);
  If C=32 then
  begin
   If ORD(s[0])+ORD(slovo[0])+1<=PG then
   begin
    If ORD(S[0])<>0 then s:=s+' '+slovo;
    If ORD(S[0])=0 then s:=s+slovo
   end;
   IF ORD(s[0])=pg then begin {!}_LG(LG); writeln(s); s:=''; s:=s+slovo end;
   If ORD(s[0])+ORD(slovo[0])>PG then
   begin {!}_LG(LG); writeln(s); S:=''; s:=s+slovo end;
   slovo:='';
  end
 end
end; {While not eof(F)}
_LG(LG);  Writeln(slovo);
end.



Занчит так, все работает, только еще не сделал дополнения пробелами.
Но теперь прога не разрывает слова, и все ОК.
Есть у кого идеи как красиво увеличить длинну строки, вставив в нее пробелы?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
APAL
сообщение 15.05.2004 18:19
Сообщение #15


Смотрю...
*****

Группа: Модераторы
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


Высчитать сколько не хватает пробелов. И более-менее равномерно распределить между словами. smile.gif

Сообщение отредактировано: APAL - 15.05.2004 19:49


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
trminator
сообщение 15.05.2004 18:37
Сообщение #16


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Может, если нужно вставлять СЛИШКОМ много пробелов между словами, то вставлять их между буквами?
Цитата
О т о р и н о л а р и н г о л о г и ч е с к и й    а в т о в ы ч и с л и т е л ь

Таких слов в строку влезет только два, ставить между ними десяток пробелов некрасиво =)


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 15.05.2004 19:35
Сообщение #17


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Цитата
Высчитать сколько не хватает пробелов. И более-менее равномерно распределить между словами. 

Так известно сколько надо пробеллов, но как их красиво распределить?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jaxx
сообщение 16.05.2004 20:12
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


Предлагаю свой вариант решения. По моему работает правильнее чем предыдущие. Последний вариант, предложенный Oleg_Z некоторые слова из текста выводит по 2 раза, почему я так и не понял. мой вариант меньше и работает нормально. К нему осталось добавить разделение лишних пробелов между остальными в строке.
Код

program format;
uses crt;
var
filename,slovo,stroka:string;
f:text;
dlina,otstup,i:byte;
simvol:char;
begin
slovo:=' ';
repeat
clrscr;
write('введите имя файла :'); readln(filename); write('введите отступ :'); readln(otstup); write('введите длину строки :'); readln(dlina); clrscr;
assign(f,filename);
reset(f);
until ioresult=0;
write(' ':otstup);
while not eof(f) do begin
read(f,simvol);
if ord(simvol)<>10 then begin
if simvol<>' ' then slovo:=slovo+simvol
else begin
if (length(stroka)+length(slovo))>dlina then begin stroka:=' ';
writeln;
write(' ':otstup);
end;
stroka:=stroka+slovo+simvol;
write(slovo,simvol);
slovo:=' ';
end;
end
else begin
write(slovo);
write(' ':otstup);
slovo:=' ';
stroka:=' ';
end;
end;
close(f);
readkey;
end.


Сообщение отредактировано: Jaxx - 16.05.2004 20:13


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 16.05.2004 20:12
Сообщение #19


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Собственно идея следующая:

Предложение: Dos Navigator лучшая оболочка в мире.

Всего имеем 5 пробелов, вставить нужно 20. Дык вот и пляшем от левого края, вставляя по пробелу на каждое пустое место. Вставили первые 5 пробелов, возвращаемся к первому и т.д. Смотрится довольно сносно..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jaxx
сообщение 17.05.2004 19:30
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 145
Пол: Мужской
Реальное имя: Павел

Репутация: -  0  +


ну вроде смотрится нормально...


--------------------
- Дорогие девушки! У вас сухая кожа? Редкие волосы? Проблемы с фигурой? Приходите к нам! У нас темно и мы пьяные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 3:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"