04.10.2011, 11:56 | #1 (permalink) |
Студент БГПУ
Регистрация: 06.02.2010
Сообщений: 420
Записей в дневнике: 3
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 470
|
Алгоритм
Выравнивание строки заключается в том, что между ее отдельными словами дополнительно вносятся пробелы так, чтобы длина строки стала равна заданной длине, а последнее слово сдвинулось к правому краю. Решить при помощи процедуры. Решать не прошу сам хочу, а вот с алгоритмом прошу помочь. Заранее спасибо. |
04.10.2011, 11:56 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
На форуме есть похожие топики, можете их посмотреть Разработать алгоритм и составить программу для решения задачи Алгоритм с возвратом Помогите написать алгоритм и блок-схему Помогите написать алгоритм Помогите составить алгоритм на Паскале Написать алгоритм ассемблера в машинных кодах |
04.10.2011, 12:20 | #2 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
|
|
04.10.2011, 12:42 | #3 (permalink) |
Студент БГПУ
Регистрация: 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. |
04.10.2011, 14:09 | #5 (permalink) |
support
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
|
Про зацикливание: после вставки символа нужно увеличивать значение счетчика, иначе постоянно будешь на пробелы натыкаться
И переменная d в качестве граничного параметра цикла нафиг не нужна, вообще в данной задаче лучше использовать цикл While, так как длина строки меняется и значение счетчика в ходе выполнения итераций может стать больше, чем вычисленное значение переменной d еще до полного выполнения анализа строки Про алгоритм решения написано уже выше, могу сказать только одно - процедуру нужно переписывать полностью |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
04.10.2011, 14:09 | #6 (permalink) |
Специалист
Регистрация: 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. |
04.10.2011, 15:57 | #8 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|