IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Помогите пожалуйста. Массив нужно свернуть в "кольцо".
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Массив целых чисел х[1]... х[п] «свернуть в кольцо» и повернуть вправо на К позиций (К может быть больше п).

Заранне спасибо!

Сообщение отредактировано: Gothar -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Выложите то что смогли сделать,даже если не работает.Чтоб было видно,что вы пытались хотябы это решить.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Цитата(Krjuger @ 31.05.2009 21:15) *

Выложите то что смогли сделать,даже если не работает.Чтоб было видно,что вы пытались хотябы это решить.


Вот что попытался сделать. получается бред

program jopa;
uses crt;
type mas=array[1..1000] of integer;
var m:mas;k,tmp,i,n:integer;
begin
clrscr;
writeln('vvedi n');
readln(n);
writeln('vvedi ',n,' elementov massiva');
for i:=1 to n do
readln(m[i]);
writeln('vvedi kolichestvo pozicii sdviga');
readln(k);
for i:=1 to k do
begin
tmp:=n;
for i:=n downto k do
m[i]:=m[i-1];
m[1]:=tmp
end;
for i:=1 to n do
write(m[i]:3);
readln;
end.


Сообщение отредактировано: Gothar -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Посмотри тут
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +



Посмотрел! Всё равно правильно работать не хочет(( Видимо я вообще дурак полный(

Сообщение отредактировано: Gothar -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


2 аll
что означает «свернуть в кольцо»?
для чего предназначена процедура Move(A[2], A[i], (size - 1)*Sizeof(integer)); и что за переменные в нее вводятся?

расскажите пожалуйста.

Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Цитата(sheka @ 31.05.2009 22:09) *

2 аll
что означает «свернуть в кольцо»?
для чего предназначена процедура Move(A[2], A[i], (size - 1)*Sizeof(integer)); и что за переменные в нее вводятся?

расскажите пожалуйста.


Вот что получается! Где косяк! Помогите понять ПОжалуйста!

program jopa;
uses crt;
type mas=array[1..1000] of integer;
var m:mas;k,tmp,i,n:integer;
begin
clrscr;
writeln('vvedi n');
readln(n);
writeln('vvedi ',n,' elementov massiva');
for i:=1 to n do
readln(m[i]);
writeln('vvedi kolichestvo pozicii sdviga');
readln(k);
for i:=1 to k do
begin
tmp:=n;
for i:=n downto k do
{m[i]:=m[i-1];}
Move(m[2], m[i], (n - 1)* n, of(integer))
m[1]:=tmp;
end;
for i:=1 to n do
write(m[i]:3);
readln;
end.


Сообщение отредактировано: Gothar -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Ну во первых ты в tmp присваиваеш n а потом первому элементу присваиваеш n,это уже косяк,тебе надо значение н-ого элемента....А во вторых тебе четко написали,как работает процедура movе,а ты что мудриш зачем какие то два цикла???плюс сдвинуть надо вправо,а ты влево двигаеш.И повторить эту операцию надо n-k раз.

for j:=1 to n-k do
begin
tmp:=m[n];
Move(m[1], m[i], (n + 1)* n, of(integer))
m[1]:=tmp;
end;


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Цитата(Krjuger @ 31.05.2009 22:58) *

Ну во первых ты в tmp присваиваеш n а потом первому элементу присваиваеш n,это уже косяк,тебе надо значение н-ого элемента....А во вторых тебе четко написали,как работает процедура movе,а ты что мудриш зачем какие то два цикла???плюс сдвинуть надо вправо,а ты влево двигаеш.И повторить эту операцию надо n-k раз.

for j:=1 to n-k do
begin
tmp:=m[n];
Move(m[1], m[i], (n + 1)* n, of(integer))
m[1]:=tmp;
end;



mega_chok.gif косяк тут понял!!!!! Но проблема осталась!!!! При сдвиге на 1 он не сдвигает! При 2х на 1! и т.д.
Да и к тому же не читает сдвиги выше 5ти! тоесть условие задания (k может быть больше n) не выполняется! blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


for k:=1 to n1 do begin //n1-это сколько сдвигов
j:=a[n];
for i:=n downto 2 do a[i]:=a[i-1];
a[1]:=j
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Цитата(Client @ 31.05.2009 23:12) *

for k:=1 to n1 do begin //n1-это сколько сдвигов
j:=a[n];
for i:=n downto 2 do a[i]:=a[i-1];
a[1]:=j
end;



Блин((( Я запутался!!!!!!
Тоесть надо вместо процедуры
for j:=1 to n-k do
begin
tmp:=m[n];
Move(m[2], m[i], (n - 1)* n);
m[1]:=tmp;
end;


Надо
for j:=1 to k do 
begin
tmp:=m[n];
for i:=n downto 2 do
m[i]:=m[i-1];
m[1]:=tmp;
end;


ТАК?

Сообщение отредактировано: Gothar -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Лучше - так:
// k = число сдвигов, n = размер массива
for i := 1 to k mod n do begin
tmp := m[n];
Move(m[1], m[2], (n-1)*sizeof(integer));
m[1]:=tmp;
end;

, чтоб не делать заведомо лишнее...

Автору: как ты думаешь, Правила тебя не касаются? Мало того, что тема названа не пойми как, еще и тегами не пользуешься... В следующий раз такая тема сразу улетит в мусорку.

А чтоб не улетела сейчас - исправляй...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 31.05.2009 23:23) *

Автору: как ты думаешь, Правила тебя не касаются? Мало того, что тема названа не пойми как, еще и тегами не пользуешься... В следующий раз такая тема сразу улетит в мусорку.
А чтоб не улетела сейчас - исправляй...


Исправил! Спасибо за предупреждение! Редко на форумах бываю просто
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
Исправил!
Еще и название темы smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 31.05.2009 23:23) *

Лучше - так:
// k = число сдвигов, n = размер массива
for i := 1 to k mod n do begin
tmp := m[n];
Move(m[1], m[2], (n-1)*sizeof(integer));
m[1]:=tmp;
end;

, чтоб не делать заведомо лишнее...

Автору: как ты думаешь, Правила тебя не касаются? Мало того, что тема названа не пойми как, еще и тегами не пользуешься... В следующий раз такая тема сразу улетит в мусорку.

А чтоб не улетела сейчас - исправляй...


Впринципе сдвигает нормально. с одним но! k не может быть больше n!!!!! виснет! Как быть?

Добавлено через 2 мин.
Цитата(Client @ 31.05.2009 23:30) *

Еще и название темы smile.gif


А как? mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Цитата
А как?
Редактировать первое сообщение...

Цитата
k не может быть больше n!!!!! виснет!
Неправда, проверял на k = 8, n = 5, работает прекрасно...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


А что есть сдвиг на К при К больше N??По сути это сдвиг на разность К и N,просто делаеш условие,если к меньше N оставляеш то что было,если больше то чуть чуть изменяеш и вуаля...

Вольво а у меня вопрос о приотитете действий.
Цитата

for i := 1 to k mod n do begin

если к меньше n,то получается мы сдвигаем на остаток дробной части чтоли?И или не нужны ли скобки при к mod n или они чисто формальны в данном случае(?

Сообщение отредактировано: Krjuger -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 31.05.2009 23:36) *

Редактировать первое сообщение...

Неправда, проверял на k = 8, n = 5, работает прекрасно...



Всё! Нашел косяк! Спасибо Огромное! smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Krjuger в первую очередь, а с ним и все остальные: ВНИМАТЕЛЬНО смотрим на ответы, которые появляются в теме: там MOD не для красоты, между прочим... Я надеюсь, объяснять, как работает MOD не надо? Какие, блин, условия еще придумали? Запустите компилятор уже, и проверьте, а не ДОГАДЫВАЙТЕСЬ...

Добавлено через 2 мин.
Цитата
не нужны ли скобки при к mod n
Нет, скобки не нужны, приоритет ни при чем. Приоритет важен, когда в выражении больше одной операции, а здесь она всего одна...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Название темы изменено!)
Вот итоговый код программы:

program jopa;
uses crt;
type mas=array[1..1000] of integer;
var m:mas;k,tmp,i,n,n1:integer;
begin
clrscr;
writeln('vvedi n');
readln(n);
writeln('vvedi ',n,' elementov massiva');
for i:=1 to n do
readln(m[i]);
writeln('vvedi kolichestvo pozicii sdviga');
readln(k);
for i := 1 to k mod n do
begin
tmp := m[n];
Move(m[1], m[2], (n-1)*sizeof(integer));
m[1]:=tmp;
end;
for i:=1 to n do
write(m[i]:3);
readln;
end.


Всем спасибо огромное! good.gif

Сообщение отредактировано: Gothar -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.11.2020 2:16
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name