• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Алгоритм

  • Автор темы Автор темы shrek=)
  • Дата начала Дата начала

shrek=)

Студент БГПУ
Почётный участник
Регистрация
6 Фев 2010
Сообщения
420
Реакции
6
Баллы
0
Алгоритм

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

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

Решать не прошу сам хочу, а вот с алгоритмом прошу помочь.
Заранее спасибо.
Миша, да что же тут непонятного? Допустим, требуется, чтобы длина строки составляла 150 символов. Оператором Length(S) определяем реальную длину исходной строки, пусть, например, она составляет 142 символа. Отсюда следует, что нужно в строку впихнуть 8 дополнительных пробелов. И всего-то.
 
Вот что сделал, но происходит зацикливание
Код:
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.
 
Вот что сделал, но происходит зацикливание
Кошмар! Ошибок очень много, сейчас попробую исправить. Но есть такие, что сразу просто в глаза лезут: ну как можно определять длину строки ДО ее ввода?
Миша, Вы, по-моему, влюбились. Ну тогда это простительно. Иначе - нет! :D
 
Про зацикливание: после вставки символа нужно увеличивать значение счетчика, иначе постоянно будешь на пробелы натыкаться :D
И переменная d в качестве граничного параметра цикла нафиг не нужна, вообще в данной задаче лучше использовать цикл While, так как длина строки меняется и значение счетчика в ходе выполнения итераций может стать больше, чем вычисленное значение переменной d еще до полного выполнения анализа строки :)
Про алгоритм решения написано уже выше, могу сказать только одно - процедуру нужно переписывать полностью :)
 
Ну вот вариант отлаженной программы. Не очень просто получилось, к сожалению. Но работает.
Суть:
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.
 
сделаем вид, что так оно и есть.
Ну тогда сделаем вид, что поверили.
girl_crazy.gifcrazy.gif
 
Назад
Сверху