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

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

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

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


Новичок
*

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

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


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

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

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


Профи
****

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

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


Выложите то что смогли сделать,даже если не работает.Чтоб было видно,что вы пытались хотябы это решить.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Gothar
сообщение 31.05.2009 20:19
Сообщение #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 - 31.05.2009 22:26
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 31.05.2009 20:48
Сообщение #4


Профи
****

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

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


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


Новичок
*

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

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



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

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


Я.
****

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

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


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

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

Сообщение отредактировано: sheka - 31.05.2009 21:10
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Gothar
сообщение 31.05.2009 21:24
Сообщение #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 - 31.05.2009 22:25
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 31.05.2009 21:58
Сообщение #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 
 К началу страницы 
+ Ответить 
Gothar
сообщение 31.05.2009 22:07
Сообщение #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 
 К началу страницы 
+ Ответить 
Client
сообщение 31.05.2009 22:12
Сообщение #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 
 К началу страницы 
+ Ответить 
Gothar
сообщение 31.05.2009 22:21
Сообщение #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 - 31.05.2009 22:25
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.05.2009 22:23
Сообщение #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;

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

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

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


Новичок
*

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

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


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

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


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


Профи
****

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

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


Цитата
Исправил!
Еще и название темы smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Gothar
сообщение 31.05.2009 22:32
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.05.2009 22:36
Сообщение #16


Гость






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

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


Профи
****

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

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


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

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

for i := 1 to k mod n do begin

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

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


Новичок
*

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

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


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

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

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



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


Гость






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

Добавлено через 2 мин.
Цитата
не нужны ли скобки при к mod n
Нет, скобки не нужны, приоритет ни при чем. Приоритет важен, когда в выражении больше одной операции, а здесь она всего одна...
 К началу страницы 
+ Ответить 
Gothar
сообщение 31.05.2009 22:45
Сообщение #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 - 31.05.2009 22:45
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 25.04.2024 23:15
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"