Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 04.10.2011, 11:56   #1 (permalink)
shrek=)
Студент БГПУ
 
Аватар для shrek=)
 
Регистрация: 06.02.2010
Сообщений: 420
Записей в дневнике: 3
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 470
По умолчанию Алгоритм

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

Решать не прошу сам хочу, а вот с алгоритмом прошу помочь.
Заранее спасибо.
shrek=) вне форума   Ответить с цитированием

Старый 04.10.2011, 11:56
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

На форуме есть похожие топики, можете их посмотреть

Разработать алгоритм и составить программу для решения задачи
Алгоритм с возвратом
Помогите написать алгоритм и блок-схему
Помогите написать алгоритм
Помогите составить алгоритм на Паскале
Написать алгоритм ассемблера в машинных кодах

Старый 04.10.2011, 12:20   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от shrek=) Посмотреть сообщение
Не могу понять алгоритм решения задачи:
Выравнивание строки заключается в том, что между ее отдельными словами дополнительно вносятся пробелы так, чтобы длина строки стала равна заданной длине, а последнее слово сдвинулось к правому краю. Решить при помощи процедуры.

Решать не прошу сам хочу, а вот с алгоритмом прошу помочь.
Заранее спасибо.
Миша, да что же тут непонятного? Допустим, требуется, чтобы длина строки составляла 150 символов. Оператором Length(S) определяем реальную длину исходной строки, пусть, например, она составляет 142 символа. Отсюда следует, что нужно в строку впихнуть 8 дополнительных пробелов. И всего-то.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.10.2011, 12:42   #3 (permalink)
shrek=)
Студент БГПУ
 
Аватар для shrek=)
 
Регистрация: 06.02.2010
Сообщений: 420
Записей в дневнике: 3
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 470
По умолчанию

Вот что сделал, но происходит зацикливание
Код:
const
p=' ';
var
s_n,s:string;
i,n,d:integer;
procedure rav;
begin
for i:=1 to d do begin
if s[i]=' ' then insert(p,s,i);
end;
s_n:=s_n+s[i];
end;
begin
d:=length(s);
writeln ('Enter string');
readln (s);
write ('Length (s) = ');
readln (n);
rav;
writeln (s_n);
readln
end.
shrek=) вне форума   Ответить с цитированием
Старый 04.10.2011, 12:57   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от shrek=) Посмотреть сообщение
Вот что сделал, но происходит зацикливание
Кошмар! Ошибок очень много, сейчас попробую исправить. Но есть такие, что сразу просто в глаза лезут: ну как можно определять длину строки ДО ее ввода?
Миша, Вы, по-моему, влюбились. Ну тогда это простительно. Иначе - нет!
Vladimir_S вне форума   Ответить с цитированием
Старый 04.10.2011, 14:09   #5 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Про зацикливание: после вставки символа нужно увеличивать значение счетчика, иначе постоянно будешь на пробелы натыкаться
И переменная d в качестве граничного параметра цикла нафиг не нужна, вообще в данной задаче лучше использовать цикл While, так как длина строки меняется и значение счетчика в ходе выполнения итераций может стать больше, чем вычисленное значение переменной d еще до полного выполнения анализа строки
Про алгоритм решения написано уже выше, могу сказать только одно - процедуру нужно переписывать полностью
AlexZir вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 04.10.2011, 14:09   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ну вот вариант отлаженной программы. Не очень просто получилось, к сожалению. Но работает.
Суть:
1. Вводится строка.
2. В ней определяется количество имеющихся пробелов.
3. Вводится требуемая длина строки.
4. Определяется, по скольку дополнительных пробелов нужно добавить к каждому имеющемуся. "Остаток" добавляется к первому пробелу. Например:
Пусть в строке 5 пробелов, а надо ее удлинить на 7 позиций. Тогда к каждому пробелу добавляется еще один, а оставшиеся два - к первому. Не очень красиво, но что поделаешь - и так сложно.
Код:
var
 s_n,s:string;
 n,j,d,dv,md,dif:integer;
procedure rav(var s_r:string);
 var
  k,i,m:integer;
  sr:string;
 begin
  sr:=s;
  i:=0;
  k:=0;
  repeat
   inc(i);
   inc(k)
  until s[i]=' ';
  for m:=1 to dv+md do
   begin
    insert(' ',sr,k);
    inc(k);
   end;
  Repeat
   inc(i);
   inc(k);
   if s[i]=' ' then
    begin
     for m:=1 to dv do
      begin
       insert(' ',sr,k);
       inc(k);
      end;
    end;
  Until i=Length(s);
  s_r:=sr;
end;
begin
 writeln ('Enter the string:');
 readln (s);
 d:=0;
 for j:=1 to Length(s) do
  if s[j]=' ' then inc(d);
 write ('Final length = ');
 readln(n);
 dif:=n-Length(s);
 dv:=dif div d;
 md:=dif mod d;
 if n>Length(s) then rav(s_n) else s_n:=s;
 writeln(s_n);
 readln
end.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.10.2011, 14:17   #7 (permalink)
shrek=)
Студент БГПУ
 
Аватар для shrek=)
 
Регистрация: 06.02.2010
Сообщений: 420
Записей в дневнике: 3
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 470
По умолчанию

Я вот тоже думал будет не сложно, а оно оказалось. И раз:
Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Миша, Вы, по-моему, влюбились. Ну тогда это простительно. Иначе - нет!
сделаем вид, что так оно и есть.
shrek=) вне форума   Ответить с цитированием
Старый 04.10.2011, 15:57   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от shrek=) Посмотреть сообщение
сделаем вид, что так оно и есть.
Ну тогда сделаем вид, что поверили.
Название: girl_crazy.gif
Просмотров: 196

Размер: 8.1 КбНазвание: crazy.gif
Просмотров: 216

Размер: 18.6 Кб
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 20:09.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.