Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2016, 17:01   #1
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию Перемещение внутри матрицы

Вчерашний ответ на /http://www.programmersforum.ru/showthread.php?t=290988 мне очень здорово помог

Теперь появился уже другой вопрос

Могу ли я взять элемент и записать его в другую ячейку иными словами переместить.

например у меня массив символов mas
и я хочу сделать такое действие.
К примеру в mas[2,3] записан 0,и я его перемещаю например в адрес [4,3] (типа прыжка) и в итоге мой 0 на новом месте,а 2,3 содержит ' - '
(У меня массив символьный)

И под вопрос
Случайно выбирать куда переместить можно?Просто по заданию нужно случайным образом.

Что мной было сделано
Я нашёл номера строк и столбцов моих элементов матрицы,которые хочу переместить.

Последний раз редактировалось schoolboy99; 25.03.2016 в 17:16.
schoolboy99 вне форума Ответить с цитированием
Старый 25.03.2016, 18:19   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Можно и переместить. Пусть перемещается элемент [i1, j1], а матрица размера NxM. Нужно выбрать новое место, и пусть это [i2, j2]. На примере выбора координаты i2:
Код:
i2 := random(N - 1) + 1;
i2 := i2 + ord(i2 >= i1);
Таким образом будет получена новая случайная координата, причем отличная от исходной. Останется только записать данные из [i1, j1] в [i2, j2], а потом в [i1, j1] записать прочерк. Ну и не забыть добавить randomize в начале программы, чтобы случайные числа менялись от запуска к запуску.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.03.2016, 19:33   #3
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Спасибо вам большое,всё прекрасно работает
schoolboy99 вне форума Ответить с цитированием
Старый 26.03.2016, 19:58   #4
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Решил реализовать не с одним а со многими элементами/
И возникла проблема

Он у меня выводит большое количество объектов,больше чем нужно и выводит 1 раз.

Ниже мой код
Я планировал сделать так,вот на матрице моей например 2 объекта.
Следовательно цикл должен все 2 объекта переместить в случайном направлении.

Например будет 10 объектов(конечно матрица будет большое) он 10 раз должен пройти и переместить каждый объект.

На рисунке ниже Заполненное это матрица после ввода данных,а после стрелочки результат процедуры moving.

По шагово он координаты запоминает но увы не перемещает.
Ошибка в цикле,но невооружённым глазом трудно заметить.


Код:
procedure moving;
var
   i, j, k, g, y, l, i2, j2: integer;
begin
for y:=1 to kolakt do // Цикл перебора,сколько активных элементов я ввёл столько раз и он должен проработать.
begin
   randomize;
   for i := 1 to n do //строки
   begin
      for j := 1 to m do //столбцы
      begin
     for g:=1 to kolakt do //ищет уже активные объекты
      begin
         if mas[i, j] = akt then ///находим ячейки где активные объекты и запоминаем их индексы.
         begin
            k := i;
            l := j;            
         end; 
          end;        
  end;
  mas[k,l]:=akt;//найденная ячейка с активным элементом.
   i2 := random(N - 1) + 2;
   i2 := i2 + ord(i2 >= k);
   j2 := random(N - 1) + 2;
   j2 := j2 + ord(j2 >= l);
   mas[i2, j2] := mas[k, l];
   mas[i, j] := mas[i2, j2];//переносим полученные индексы в массив
   mas[k, l] := '-';   //старый адрес пуст
  writeln;
  end;     
       for i := 1 to n do
   begin
      for j := 1 to m do
         write(mas[i, j], ' ');
      writeln
      end;     
   end;
   end;
Изображения
Тип файла: jpg Безымянный.jpg (5.7 Кб, 16 просмотров)

Последний раз редактировалось schoolboy99; 26.03.2016 в 20:02.
schoolboy99 вне форума Ответить с цитированием
Старый 26.03.2016, 20:42   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Замечания по вашему коду:
randomize вызывать стоит 1 раз в самом начале работы программы;
Похоже, endы не все на своих местах, поэтому код работает даже не так как предполагалось (форматирование кода не соответствует вложенности);
Цикл по g не несет никакого смысла, так как внутри него одни и те же [i, j];
поскольку k и l всего лишь переменные, а не массивы, то таким образом будет запомнен только последний активный элемент;
"random(N - 1) + 2" нужно прибавлять 1, а не 2;
"j2 := random(N - 1) + 2;" опечатка - не N, а M.

Если активных элементов немного относительно размера матрицы, то лучше, наверное, хранить их координаты списком, а не пробегать по всей матрице. Вот простой вариант с "пробегом" по всей матрице (и редактированием глобального массива напрямую, что не очень хорошо):
Код:
const
  N = 4;
  M = 4;
  active = '0';
  empty = '-';
  active_count = 3;

type
  myarray = array [1 .. N, 1 .. M] of char;

var
  mas: myarray;

procedure random_fill;
var
  i, j, k: integer;
begin
  for i := 1 to N do
    for j := 1 to M do
      mas[i, j] := empty;
  for k := 1 to active_count do
  begin
    repeat
      i := random(N) + 1;
      j := random(M) + 1;
    until mas[i, j] = empty;
    mas[i, j] := active;
  end;
end;

procedure show;
var
  i, j: integer;
begin
  for i := 1 to N do
  begin
    for j := 1 to M do
      write(mas[i, j], ' ');
    writeln
  end;
end;

procedure moving;
var
  mas_new: myarray;
  i, j, i1, j1: integer;
begin
  mas_new := mas;
  for i := 1 to N do
    for j := 1 to M do
      if mas[i, j] = active then
      begin
        repeat
          i1 := random(N) + 1;
          j1 := random(M) + 1;
        until mas_new[i1, j1] = empty;
        mas_new[i, j] := empty;
        mas_new[i1, j1] := active;
      end;
  mas := mas_new;
end;

begin
  randomize;
  random_fill;
  writeln('before:');
  show;
  moving;
  writeln('after:');
  show;
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 26.03.2016 в 20:46.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать ограничение на перемещение? Или я не знаю как называется это правильно. (См. внутри) Делфи KotyaraYa Помощь студентам 5 17.12.2012 07:42
Нахождение слов-анаграмм, Ошибка выдается. Задание внутри. Код внутри. TYMON Общие вопросы .NET 2 22.11.2010 21:07
Перемещение абзацев внутри ячейки piatka Microsoft Office Word 6 18.05.2010 18:57
Перемещение рисунков внутри формы Marsik Помощь студентам 10 01.11.2007 09:48