Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2008, 18:09   #1
Милено4ка
 
Аватар для Милено4ка
 
Регистрация: 03.04.2008
Сообщений: 8
Стрелка задачка на техническое редактирование текста

народ,помогите решить задачку) задачка на техническое редактирование текста
нужно создать прогу,чтобы она автоматически выравнивала текст по самой длинной строке. ну примерно как в Word'е выравнивание по ширине. что-то я ума не дам этой задачке
помогите пожалуйста)всем спасибки
Милено4ка вне форума Ответить с цитированием
Старый 03.04.2008, 19:01   #2
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Ну что можно Вам посоветовать... Очевидно после поиска самой длинной строки Вам нужно дополнять другие пробелами, на Паскале, думаю, других вариантов нет... Так же вопросы, где хранятся строки, в файле, массиве; ввод текста с клавиатуры или из файла... поподробнее, пожалуйста, опишите задачу.
Xardas вне форума Ответить с цитированием
Старый 03.04.2008, 19:34   #3
Милено4ка
 
Аватар для Милено4ка
 
Регистрация: 03.04.2008
Сообщений: 8
По умолчанию

да,только каким образом дополнять строки пробелами,так чтобы они равномерно дополнялись. строки беруться из соданного файла...
Милено4ка вне форума Ответить с цитированием
Старый 03.04.2008, 20:02   #4
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Возможно не самый лучший вариант....

Код:
//допустим, известна самая длинная строка str
k:=0;
for i:=1 to length(str1) do
if (str1[i]=' ') and (str1[i+1]<>' ') then inc(k);//считаем количество слов
ksp:=round((length(str)-length(str1))/k);//для равномерного распределения
//пробелов находим разность длин строк и делим на кол-во слов
i:=1;
//далее после каждого слова вставляем необходимое кол-во пробелов
while i<length(str) do begin
if str1[i]=' ' then 
begin
for j:=1 to ksp do insert(' ',str,i)
i:=i+ksp-1;
end;
i:=i+1;
end;
Набросал сходу, не проверял, возможно есть какие-нибудь неточности...

Последний раз редактировалось Xardas; 03.04.2008 в 20:21.
Xardas вне форума Ответить с цитированием
Старый 04.04.2008, 16:08   #5
Милено4ка
 
Аватар для Милено4ка
 
Регистрация: 03.04.2008
Сообщений: 8
По умолчанию

и если есть еще варианты ,пишите,пожалуйста) а то мне эту задачу по курсовому задали,а я ничего не пойму,что и как там делать.возможен вариант решения и на Delphy))
Милено4ка вне форума Ответить с цитированием
Старый 04.04.2008, 17:00   #6
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Цитата:
Сообщение от Милено4ка Посмотреть сообщение
ок) проверю отпишусь))
еще вопроик маленький что такое round? просто я его не использовала)
round(x) - возвращает x, округленное до ближайшего целого числа.

Цитата:
и если есть еще варианты ,пишите,пожалуйста) а то мне эту задачу по курсовому задали,а я ничего не пойму,что и как там делать.возможен вариант решения и на Delphy))
Во вложении пример реализации на Delphi
Вложения
Тип файла: zip bywidthpr.zip (16.5 Кб, 22 просмотров)
Xardas вне форума Ответить с цитированием
Старый 04.04.2008, 21:53   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а чем код от Xardas не устраивает?
вроде (внешне) вполне даже ничего!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.04.2008, 15:58   #8
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Ну что Вам можно еще предложить... Как я понял Вам нужно, чтобы на экране выводился текст из файла, выровненный по ширине. Могу предложить еще вариант, более правильный нежели набросанный мной сходу первый. По поводу приведенного ниже кода есть следующие замечания (большинство из них связано с особенностями языка Паскаль):

1) Поскольку тип данных string в паскале позволяет хранить в одной переменной не более 255 символов, соответственно длина строки в текстовом файле не должна превышать это количество, в противном случае лишний "хвост" будет "отрезан".
2) Для считывания строк из текста использую динамический массив, ограничение - в текстовом файле должно быть не больше 100000000 строк. Для снятия этого ограничения можете использовать открытые массивы.

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

Вот собственно код:
Код:
type
ArStr=array[1..100000000] of string;
p=^ArStr;//объявляем указатель на массив
var
LineCount:integer;//количество строк в файле (соответственно, и кол-во элементов в массиве
i,j:integer;
str:string;
MyFile:TextFIle;//в Паскале кажется надо заменить на File of Text

MaxCountCh:integer;//количество символов, отображаемых в одной строке экрана
//Зависит от установленного текстового режима, я использовал режим
//50 строк по 80 символов, устанавливается режим процедурой textMode

pArStr:p;

begin
LineCount:=0;
assign(MyFile,'C:\TextFile.txt');
reset(MyFile);
//считаем количество строк в файле, чтобы в дальнейшем выделить необходимое количество памяти под массив
while not eof(MyFile) do 
begin
readln(MyFile); 
inc(LineCount);
end;

//выделяем память под массив
getmem(pArStr,linecount*sizeof(string));

reset(MyFile);
i:=1;
//заполняем массив
while not eof(MyFile) do
begin
read(MyFile,str);
pArStr^[i]:=str;
inc(i);
readln(MyFile);
end;

//как было сказано выше - макс. кол-во символов в строке экрана
//поскольку я использовал режим 50 на 80, то и макс. кол-во символов = 80
MaxCountCh:=80;
for i:=1 to LineCount do
if Length(pArStr^[i])<=MaxCountCh//если строка умещается в одной строке экрана...
then writeln(pArStr^[i])//...выводим ее с переходом на следующую строку
else//иначе...
begin
for j:=1 to length(pArStr^[i]) do//..."пробегаем" по всей длине строки...
begin
write(pArStr^[i][j]);//...и выводим по одному символу...
//до тех пор пока не дойдем до конца строки экрана...
//да, пусть Вас не смущает запись pArStr^[i][j], по индексу i идет обращение к элементу массива, а по j - обращение к отдельному символу элемента массива
if (j mod MaxCountCh)=0 then writeln;//как только "дошли" до конца экрана, переходим на след. строку
end;
writeln;//не забыли перейти на след. строку экрана для вывода следующей строки 
end;
freemem(pArStr,linecount*sizeof(string));//не забыли освободить память, выделенную под массив
readln;

end.
Это один из вариантов, возможно сделать и по другому... Выбор, естественно за Вами

Последний раз редактировалось Xardas; 05.04.2008 в 17:11.
Xardas вне форума Ответить с цитированием
Старый 13.04.2008, 12:07   #9
Милено4ка
 
Аватар для Милено4ка
 
Регистрация: 03.04.2008
Сообщений: 8
По умолчанию

да,это все конечно хорошо,но эту задачку надо решить самым наипростейшим образом....а предложенный вариант сложный..
Милено4ка вне форума Ответить с цитированием
Старый 13.04.2008, 15:40   #10
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Вот тоже самое в простом варианте (намного лучший вариант, нежели первый)

Код:
var
j:integer;
str:string;
MyFile:TextFIle;
MaxCountCh:integer;

begin
MaxCountCh:=50;
assign(MyFile,'C:\TextFile.txt');
reset(MyFile);
while not eof(MyFile) do
begin
read(MyFile,str);
if Length(str)<=MaxCountCh
then writeln(str)
else
begin
for j:=1 to length(str) do
begin
write(str[j]);
if (j=MaxCountCh) or (j mod MaxCountCh=0) then writeln;
end;
writeln;
end;
readln(MyFile);
end;
А этот вариант будет сплошняком выводить текст из файла с выравниванием по ширине; минус этого фрагмента в том, что слова будут разрываться

Код:
var
i,j:integer;
str:string;
MyFile:TextFIle;
MaxCountCh:integer;
begin
MaxCountCh:=50;
i:=0;
assign(MyFile,'C:\TextFile.txt');
reset(MyFile);
while not eof(MyFile) do
begin
read(MyFile,str);
for j:=1 to length(str) do
begin
inc(i);
write(str[j]);
if i=MaxCountCh then
begin
writeln;
 i:=0;
end;
end;
readln(MyFile);
end;

Последний раз редактировалось Xardas; 13.04.2008 в 22:38.
Xardas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
редактирование текста в блокноте. Kio Помощь студентам 16 21.07.2008 17:02
Редактирование текста в Delphi Edo Помощь студентам 5 22.04.2008 08:18
Редактирование текста. Нужна помощь! quf Паскаль, Turbo Pascal, PascalABC.NET 3 12.04.2008 08:53
редактирование ячейки SveSve Microsoft Office Excel 2 11.04.2008 10:16
Редактирование AntiZero Помощь студентам 2 12.11.2007 18:02