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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2015, 22:01   #1
dimonsnakes
 
Регистрация: 14.03.2015
Сообщений: 6
По умолчанию Равномерное распределение пробелов

Здравствуйте. Помогите с программой. Она должна равномерно расставить пробелы между словами, пока длина строки не будет равняться 80 символов. Сначала я отнял от 80 длину начальной строки и поделил на кол-во слов(то есть узнал, сколько пробелов нужно поставить между каждым словом(пометим его как x).
Затем я открываю цикл со счётчиком. При нахождении пробела он добавляет ещё x пробелов. Но когда он снова проганяет его через цикл, он снова видит пробел(который мы добавили). И так он добавляет пробелы в одно и тоже место, пока цикл не закончится. А мне нужно равномерное расставление пробелов.
Код:
var 
s:string;
c:char;
i,x,y,l,x1:integer;
begin
x1:=0;
y:=0;
x:=0;
Writeln('Введите предложение');
Readln(s);
For i:=1 to length(s) do begin
c:=s[i];
if c=' '
then x:=x+1; {Подсчёт слов}
end;
x:=x+1;{К подсчитаному количество слов + 1, так как после последнего слова пробела нет, и слово не засчитается}
x1:=80-length(s);{Узнаем, сколько символов осталось}
y:=(x1 div x);{Делим их на количество строк, узнаем количество пробелов перед каждым словом}
for i:=1 to x1 do begin {А вот начиная отсюда, нужно высматривать ошибку.}
c:=s[i];
if c=' '
then 
for l:=1 to y do insert(' ',s,i);
end;
Writeln(s);
Readln
end.

Последний раз редактировалось dimonsnakes; 14.03.2015 в 23:02.
dimonsnakes вне форума Ответить с цитированием
Старый 15.03.2015, 00:00   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Тут проблема в алгоритме.
Сделай вставку через вспомогательную строку.
В эту строку копируешь символы до пробела, затем добавляешь в цикле нужное число пробелов, затем продолжаешь копировать следующее слово и т.д.
В принципе, можно делать вставку и в ту же строку, вот только тогда нужно, после обнаружения пробела, сохранить позицию, выполнить вставку пробелов в строку и продолжить поиск конца следующего слова с сохраненной позиции плюс число добавленных пробелов. В этом случае, кстати, цикл for не пройдет: можно с while или repeat.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 15.03.2015, 01:33   #3
dimonsnakes
 
Регистрация: 14.03.2015
Сообщений: 6
По умолчанию

Алгоритм я понял, но как копировать символы до пробела, затем вставить пробелы, ну и так далее. Я могу через символьную переменную циклом вставить слово до пробела, потом пробелы, а дальше как? Если повторять, то циклу надо начинать уже с того места, где закончили последний раз.
А если вторым способом, то как "сохранить позицию" счетчика?
dimonsnakes вне форума Ответить с цитированием
Старый 15.03.2015, 10:44   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

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

Последний раз редактировалось Аватар; 15.03.2015 в 10:47.
Аватар вне форума Ответить с цитированием
Старый 15.03.2015, 21:08   #5
dimonsnakes
 
Регистрация: 14.03.2015
Сообщений: 6
По умолчанию

Через цикл for не получается, как я уже говорил,когда идёт цикл, и программа находит пробел, она добавляет его. Индекс соответственно сдвигается, и программа снова добавляет x пробелов, пока не достигнет 80 символов. Получается, остаётся только первое слово, а после него одни пробелы, т.к. пробелы вытесняют остальные слова(в объявлении переменных на строковой переменной ограничение (s:string[80])).
dimonsnakes вне форума Ответить с цитированием
Старый 15.03.2015, 21:28   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Через цикл for не получается
Да неужели? Вот без проверок и удаления двойных пробелов, проверь
Код:
  s:='Мама мыла Раму, выскользнуло мыло, мыла было мало';
  k:=0;
  for i:=1 to Length(s) do if s[i]=' ' then Inc(k);
  n:=(80-Length(s)) div k;
  k:=(80-Length(s)) mod k;
  for i:=Length(s) downto 1 do
    if s[i]=' ' then begin
      Insert(StringOfChar(' ',n),s,i+1);
      if k>0 then Insert(' ',s,i+1);
      Dec(k);
    end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.03.2015, 22:19   #7
dimonsnakes
 
Регистрация: 14.03.2015
Сообщений: 6
По умолчанию

Спасибо вам большое! А что делает StringOfChar?
А, всё, разобрался. Спасибо.

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


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Равномерное распределение точек в круге Arigato Мультимедиа в Delphi 12 23.11.2014 23:11
Равномерное распределение (алгоритм) Honr Помощь студентам 4 14.07.2013 16:19
Равномерное увеличение значения ячейки Kvint_Sertoriy Microsoft Office Excel 6 13.10.2012 14:06
Сложение объектов и равномерное распределение их последовательности Tarkh PHP 1 23.12.2009 20:16