Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сдвиг двумерного массива. 
V
    Опции темы
Santa12
Дата 4.6.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



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

Пользователь вводит матрицу размерностью N*M.
Выведете на экран матрицу N*M, элементы которой сдвинуты на один элемент влево
относительно исходной матрицы.т.е. первый элемент матрицы будет равен второму элементу исходной матрицы,
а последний равен первому.

Проблема в сдвиге... С массивом 2*2 проходит вроде как без проблем, а вот с другими...


Код


    int i,j,temp;

     for(j=0;j<max_m;j++)
   {
           for(i=0;i<max_n;i++)
           {
                  printf("%d",mass[j][i]);       
           }// for(i=0;i<max_n;i++)
    }// for(j=0;j<max_m;j++)

    temp = mass[0][0];

    printf("\n"); 

    for(i=0; i<max_m; i++)
    {
            for(j=0; j<max_n; j++)
            {
                if(j==(max_n-1))
                {
                   mass[i][max_n-1] = mass[max_m-1][0]; //Проблема вот здесь, или вообще все неправильно?
               }
                else
                {
                    mass[i][j] = mass[i][j+1];       
               }
            }// for(j=0;j<max_n;j++)
    }// for(i=0;i<max_m;i++)

   mass[max_m-1][max_n-1] = temp;

     for(j=0;j<max_m;j++)
   {
           for(i=0;i<max_n;i++)
           {
                  printf("%d",mass[j][i]);       
           }// for(i=0;i<max_n;i++)
    }// for(j=0;j<max_m;j++)




Были мысли запихнуть в одноменрый массив, сдвинуть, а потом обратно в двумерный, но, это ж, я так понимаю, не верно?
Заранее спасибо за любую помощь )

PM MAIL WWW ICQ   Вверх
gosn1ck
Дата 4.6.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



и что же вы все пробелы то не любите.... ?

Код


   int i,j,temp, mass[4][4];
   for(j = 0; j < 4; j++)
   {
     for(i = 0; i < 4 ; i++)  scanf("%d", &mass[j][i]);
     printf("\n");
   }

    temp = mass[0][0];

       for(j = 0; j < 4; j++)
   {
     for(i = 0; i < 4 ; i++)  printf("%d ",mass[j][i]);;
     printf("\n");
   }


    printf("\n");

    for( i = 0 ; i < 4; i++)
    {
      for( j = 0; j < 4; j++)
      mass[i][j] = mass[i][j+1];
    }

    mass[3][3] = temp;

    for(j = 0; j < 4; j++)
   {
     for(i = 0; i < 4 ; i++)  printf("%d ",mass[j][i]);;
     printf("\n");
   }

PM MAIL ICQ   Вверх
Santa12
Дата 4.6.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Пробелы я люблю... Только  здесь нагляднее было в строку, ну да ерунда это...
Да, ваш код работает. Спасибо.
Вот только... Делал я так... и на моем коде, если брать массив 4*4, то 4,8 и 12 значения получаются... эм... не знаю, как это правильно сказать... вобщем длинным отрицательным числом (поэтому я и вставлял проверку на равность j)... Потому и обратился за помощью - сам ен могу найти где именно я накосячил (
Если я правильно понимаю, то в какой-то момент j+1 становится равным 4, а такого значения ведь нет...

Это сообщение отредактировал(а) Santa12 - 4.6.2009, 14:00
PM MAIL WWW ICQ   Вверх
fry
Дата 4.6.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Цитата

братился за помощью - сам ен могу найти где именно я накосячил


Советую поднабраться знаний в сторону отладчиков. Этот вопрос думаю легко бы решился (см. пошаговая отладка).
PM MAIL   Вверх
Santa12
Дата 4.6.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Цитата(fry @  4.6.2009,  14:11 Найти цитируемый пост)
пошаговая отладка


Именно поэтому, я и говорю, что ставил проверку на j... Пошагово прошел по всему что можно... Но моих познаний не хватило.

в моем случае, при массиве 4*4 в случае: mass[0][3] = mass[0][3+1]  -- у меня в этом месте mass[0][3+1] равняется -33686019  а если напрямую копирую код gosn1ck - в этом месте появляется 5, т.е. значение, которое должно быть в mass[1][0]


Это сообщение отредактировал(а) Santa12 - 4.6.2009, 14:35
PM MAIL WWW ICQ   Вверх
fry
Дата 4.6.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Ты сам ответил на свой вопрос.........

Цитата

при массиве 4*4 в случае: mass[0][3] = mass[0][3+1]  -- у меня в этом месте mass[0][3+1] равняется -33686019


Поясняю, в C индексы массивов начинаются с 0, т.е. [0], [1], [2], [3] уже 4 элемента.

У тебя:
mass[0]   [3+1]  <----

Добавлено через 1 минуту
Если поподробнее, то ты обращаешься к элементу за массивом, который естессно не инициализирован никаким значением.
PM MAIL   Вверх
Santa12
Дата 4.6.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Цитата(fry @  4.6.2009,  14:38 Найти цитируемый пост)
mass[0]   [3+1]  <---- 


Я и говорю про это!!! Ммм... Как объяснить... я знаю, что значения 4 тут не существует, и из-за этого, у меня появляется непонятное число. Именно поэтому, я и ставил проверку J, не равно ли оно 4 (в случае 4*4). Но, при этом:

Цитата(Santa12 @  4.6.2009,  14:22 Найти цитируемый пост)
если напрямую копирую код gosn1ck - в этом месте появляется 5, т.е. значение, которое должно быть в mass[1][0]




PM MAIL WWW ICQ   Вверх
fry
Дата 4.6.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Ты меняешь каждый элемент i,n на m,0. Ты этого хотел? Сомниваюсь.
n,m - размерность массива
ЗЫ Если в голове не можешь проработать задачу делай рисунки - на порядок проще думать.

ЗЫ Приводи кусок своего  кода в постах, ч-то искать по листингу влом, думаю не только мне.

Т.к. двигаешь влево надо скопировать первый элемент заранее. А то он затирается при первой же итерации. В конце копируешь это значение в конец.

Это сообщение отредактировал(а) fry - 4.6.2009, 14:58
PM MAIL   Вверх
Santa12
Дата 4.6.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Цитата(fry @  4.6.2009,  14:54 Найти цитируемый пост)
Приводи кусок своего  кода в постах


Ок.

Значит, попробую еще раз... я создаю динамически массив N*M. Передаю его в функцию, которая его сдвигает на одно значение. Первый элемент я сперва копирую в темп, в конце копирую его в последний элемент массива.

Код


(mass[max_m][max_n])

    temp = mass[0][0];

    for(i=0; i<max_m; i++)
    {
            for(j=0; j<max_n; j++)
            {
                if(j==(max_n-1))
                {
                   mass[i][max_n-1] = mass[max_m-1][0]; //вот тут отрабатывает не всегда правильно.
               }
                else
                {
                    mass[i][j] = mass[i][j+1]; //в этом месте, например при 4*4, при условии j == 3, я получаю -33686019. Потому чуть выше и есть
                                                            // проверка   if(j==(max_n-1)) 
               }
            }// for(j=0;j<max_n;j++)
    }// for(i=0;i<max_m;i++)

   mass[max_m-1][max_n-1] = temp;




А если я просто беру код gosn1ck 

Код

   for( i = 0 ; i < 4; i++)
    {
      for( j = 0; j < 4; j++)
      mass[i][j] = mass[i][j+1]; // в этом месте при 4*4, при условии  j == 3, получается число 5,
                                               // т.е. значение, которое должно быть в mass[1][0]
    }



Рисовать - рисую, но в данном случае - не помогло...
PM MAIL WWW ICQ   Вверх
fry
Дата 4.6.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Код

                if(j==(max_n-1))
                {
                   mass[i][max_n-1] = mass[max_m-1][0]; //вот тут отрабатывает не всегда правильно.
               }
                else
                {
                    mass[i][j] = mass[i][j+1]; //в этом месте, например при 4*4, при условии j == 3, я получаю -33686019. Потому чуть выше и есть
                                                            // проверка   if(j==(max_n-1)) 
                }


Проверка как раз и сделана для того, чтобы этого не случилось, т.е. при j=3 она срабатывает и выполняется то, что я описал в предыдущем посте.

Код

mass[max_m-1][0];

будет возвращать один и тотже элемент, а тебе, по моему, надо всего лишь  
Код

mass[i+1][0];

Только надо проверять чтобы [i+1] не было за пределами массива (последняя итерация).

Кстати, гораздо легче будет если ты будешь создавать массив одномерный. его и сдвигать проще и быстрее работать будет.
Конкретный элемент в нем можно искать так: i+j*n. Работать будет быстрее, чем у gosn1ck . smile 


Это сообщение отредактировал(а) fry - 4.6.2009, 15:29
PM MAIL   Вверх
Santa12
Дата 4.6.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Цитата(fry @  4.6.2009,  15:27 Найти цитируемый пост)
Проверка как раз и сделана для того, чтобы этого не случилось, т.е. при j=3 она срабатывает и выполняется то, что я описал в предыдущем посте.


ну, для этого я ее и сделал ;)
При этом, в коде gosn1ck все отрабатывает без такой проверки. Почему?

Цитата(fry @  4.6.2009,  15:27 Найти цитируемый пост)
Только надо проверять чтобы [i+1] не было за пределами массива (последняя итерация).


вот примерно об этом я изначально и спрашивал... на последней итерации в этом случае вылетает, все правильно, не могу сообразить, как обработать правильно... сообразил. Изначально в этом и была моя ошибка - стормозил, и начал городить огород...

Цитата(fry @  4.6.2009,  15:27 Найти цитируемый пост)
гораздо легче будет если ты будешь создавать массив одномерный


Цитата(Santa12 @  4.6.2009,  13:09 Найти цитируемый пост)
Были мысли запихнуть в одноменрый массив, сдвинуть, а потом обратно в двумерный


Я хочу с многомерными массивами разобтаться, не переводя их в одномерные  ))) С одномерными, вроде бы уже вопросов и не возникает )))


Что ж, всем спасибо ;) Вопрос решен.


Это сообщение отредактировал(а) Santa12 - 4.6.2009, 15:42
PM MAIL WWW ICQ   Вверх
fry
Дата 4.6.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Цитата

Я хочу с многомерными массивами разобтаться, не переводя их в одномерные  ))) С одномерными, вроде бы уже вопросов и не возникает )))


Т.е. "не наигралсо".

В том варианте, который я описал, не надо ничего переводить, он (2мерный) будет храниться в памяти как 1мерный и усе.

Цитата

При этом, в коде gosn1ck все отрабатывает без такой проверки. Почему?


Цитата

Код

    for( i = 0 ; i < 4; i++)
    {
      for( j = 0; j < 4; j++)
      mass[i][j] = mass[i][j+1];
    }
    mass[3][3] = temp;




Потому, что у него ошибка:
На последней итерации
Код

   mass[3][3] = mass[3][3+1];

   
Вообще лучше не решать задачу разными способами, при том что они заведомо хуже первого, а заняться другой. Еще лучьше поставить более менее реальную задачу и ее решить, а не двигать элементы матрицы в двойном цикле.
PM MAIL   Вверх
mes
Дата 4.6.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Santa12 @  4.6.2009,  14:13 Найти цитируемый пост)
в этом месте при 4*4, при условии  j == 3, получается число 5,
                                               // т.е. значение, которое должно быть в mass[1][0]


Santa12, в статических многомерных массивах элементы располагаются линейно. Т.е весь массив в памяти занимает непрерывный кусок памяти и за последним элементом одной строки идет первый элемент следующей. Динамические многомерные массивы представлены многоуровнево, т.е 2х мерный массив является массивом указателей на одномерные массивы, которые могут лежать в произвольных местах памяти. Именно из этого расхождения представления и получается различное поведение.



Это сообщение отредактировал(а) mes - 4.6.2009, 15:55


--------------------
PM MAIL WWW   Вверх
fry
Дата 4.6.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Цитата

Цитата(Santa12 @  4.6.2009,  14:13 Найти цитируемый пост)
в этом месте при 4*4, при условии  j == 3, получается число 5,
                                               // т.е. значение, которое должно быть в mass[1][0]


Santa12, в статических многомерных массивах элементы располагаются линейно. Т.е весь массив в памяти занимает непрерывный кусок памяти и за последним элементом одной строки идет первый элемент следующей. Динамические многомерные массивы представлены многоуровнево, т.е 2х мерный массив является массивом указателей на одномерные массивы, которые могут лежать в произвольных местах памяти. Именно из этого расхождения представления и получается различное поведение.


Я и говорил ему о динамическом варианте с линейным расположением элементов.
Однако, о каком представлении идет речь если проги работают именно с 2мерным динамическим?
ЗЫ И то неправильно.


PM MAIL   Вверх
mes
Дата 4.6.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(fry @  4.6.2009,  14:59 Найти цитируемый пост)
Однако, о каком представлении идет речь если проги работают именно с 2мерным динамическим?

нет, не обе. У gosn1ck используется статический 2х мерный smile

Цитата(gosn1ck @  4.6.2009,  12:30 Найти цитируемый пост)
  int i,j,temp, mass[4][4];




--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1183 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.