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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Карта - Массив 
V
    Опции темы
Zverushka
Дата 5.1.2012, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здрасте, есть код который про логике должен работать, но если дело доходит до компилятора то все мои представления о массиве переворачиваются  smile . Помогите разобраться

Код

#include <iostream>
#include <conio.h>
using namespace std;
 
void main(){
  const int size = 10;
  int map[size][size];
  int user;
  int a;

  while(true){
    user = getch(); //считываем данные клавиатуры
    a = 0; //я так думаю этой а каждый раз присваивается 0
  for(int i = 0; i<size; i++){
      for(int j = 0; j<size; j++){
          map[i][j] = 0;
          if(user == 'd'){
              a++; //увиличиваем а тем самым ходим по массиву
              map[0][a] = 1; //так мы видим что походили
          }
      }
  }
    cout << endl;
  for(int i = 0; i<size; i++){
      for(int j = 0; j<size; j++){
          cout << map[i][j];
      }
      cout << endl;
  }


  }
}


Нажали кнопку 1 перешла правее 
|0|1|0|
|0|0|0|
|0|0|0|

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




Это сообщение отредактировал(а) Zverushka - 5.1.2012, 11:58
PM MAIL   Вверх
redwhite90
Дата 5.1.2012, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не совсем понял, что вы пыаетесь сделать, но все изменения при нажатии клавиши d, происходящие в массиве идут под откос из-за
Код

 map[i][j] = 0;

PM MAIL   Вверх
Zverushka
Дата 5.1.2012, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(redwhite90 @ 5.1.2012,  12:28)
не совсем понял, что вы пыаетесь сделать, но все изменения при нажатии клавиши d, происходящие в массиве идут под откос из-за
Код

 map[i][j] = 0;

Ведь эта строка инициализирует весь массив 0 

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


Опытный
**


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

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



тогда уж используй отдельный цикл для обнуления массива

вот возьми i=0 j=0
сначала 
m[0][0]=0;
на этой итерации a прибавилось
значит m[0][1]=1;
а на следующей итерации цикла
m[0][1]=0;

Добавлено @ 13:36
научитесь пользоваться отладчиком

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


Новичок



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

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



Цитата(redwhite90 @ 5.1.2012,  13:24)
тогда уж используй отдельный цикл для обнуления массива

вот возьми i=0 j=0
сначала 
m[0][0]=0;
на этой итерации a прибавилось
значит m[0][1]=0;
а на следующей итерации цикла
m[0][1]=0;

Добавлено @ 13:36
научитесь пользоваться отладчиком

Попробуйте запустить мой код и тогда вы поймете в чем проблема
PM MAIL   Вверх
redwhite90
Дата 5.1.2012, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



отредактировал свой пост.перечитайте
PM MAIL   Вверх
feodorv
Дата 5.1.2012, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Был дан очень дельный совет:
Цитата(redwhite90 @  5.1.2012,  13:24 Найти цитируемый пост)
научитесь пользоваться отладчиком 


Однако и без отладчика видно что значение переменной a зашкалит и выйдет за пределы массива.

Не хотите отладчик, хотя бы ставьте вывод ключевых переменных:
Код

         ...
         printf( "before: map[i=%d][j=%d] = %d, user = %.2x, a = %d\n", i, j, map[i][j], user, a);
         map[i][j] = 0;
         printf( "after:  map[i=%d][j=%d] = %d, user = %.2x, a = %d\n", i, j, map[i][j], user, a);
         ...


И увидите такой выход:

Цитата

before: map[i=0][j=0] = -1212762700, user = 64, a = 0
after:  map[i=0][j=0] = 0, user = 64, a = 0
before: map[i=0][j=1] = 1, user = 64, a = 1
after:  map[i=0][j=1] = 0, user = 64, a = 1
before: map[i=0][j=2] = 1, user = 64, a = 2
after:  map[i=0][j=2] = 0, user = 64, a = 2
before: map[i=0][j=3] = 1, user = 64, a = 3
after:  map[i=0][j=3] = 0, user = 64, a = 3
before: map[i=0][j=4] = 1, user = 64, a = 4
...
before: map[i=9][j=2] = 0, user = 64, a = 100
after:  map[i=9][j=2] = 0, user = 64, a = 100
before: map[i=1][j=3] = 0, user = 64, a = 101
after:  map[i=1][j=3] = 0, user = 64, a = 101
before: map[i=1][j=4] = 0, user = 01, a = 102
after:  map[i=1][j=4] = 0, user = 01, a = 102
before: map[i=1][j=5] = 0, user = 01, a = 102
after:  map[i=1][j=5] = 0, user = 01, a = 102
...


Невооружённым взглядом видно, что:
Цитата(redwhite90 @  5.1.2012,  12:28 Найти цитируемый пост)
все изменения при нажатии клавиши d, происходящие в массиве идут под откос из-за map[i][j] = 0;


Более того, из-за
Код

      map[0][a] = 1; //так мы видим что походили

происходит постепенный выход за пределы массива, затираются стековые переменные, user на 102-ом шаге превращается в 1, что и предотвращает программу от краха.

Цитата(Zverushka @  5.1.2012,  11:55 Найти цитируемый пост)
все мои представления о массиве переворачиваются

Какие именно? smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Zverushka
Дата 5.1.2012, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(feodorv @ 5.1.2012,  19:42)
Был дан очень дельный совет:
Цитата(redwhite90 @  5.1.2012,  13:24 Найти цитируемый пост)
научитесь пользоваться отладчиком 


Однако и без отладчика видно что значение переменной a зашкалит и выйдет за пределы массива.

Не хотите отладчик, хотя бы ставьте вывод ключевых переменных:
Код

         ...
         printf( "before: map[i=%d][j=%d] = %d, user = %.2x, a = %d\n", i, j, map[i][j], user, a);
         map[i][j] = 0;
         printf( "after:  map[i=%d][j=%d] = %d, user = %.2x, a = %d\n", i, j, map[i][j], user, a);
         ...


И увидите такой выход:

Цитата

before: map[i=0][j=0] = -1212762700, user = 64, a = 0
after:  map[i=0][j=0] = 0, user = 64, a = 0
before: map[i=0][j=1] = 1, user = 64, a = 1
after:  map[i=0][j=1] = 0, user = 64, a = 1
before: map[i=0][j=2] = 1, user = 64, a = 2
after:  map[i=0][j=2] = 0, user = 64, a = 2
before: map[i=0][j=3] = 1, user = 64, a = 3
after:  map[i=0][j=3] = 0, user = 64, a = 3
before: map[i=0][j=4] = 1, user = 64, a = 4
...
before: map[i=9][j=2] = 0, user = 64, a = 100
after:  map[i=9][j=2] = 0, user = 64, a = 100
before: map[i=1][j=3] = 0, user = 64, a = 101
after:  map[i=1][j=3] = 0, user = 64, a = 101
before: map[i=1][j=4] = 0, user = 01, a = 102
after:  map[i=1][j=4] = 0, user = 01, a = 102
before: map[i=1][j=5] = 0, user = 01, a = 102
after:  map[i=1][j=5] = 0, user = 01, a = 102
...


Невооружённым взглядом видно, что:
Цитата(redwhite90 @  5.1.2012,  12:28 Найти цитируемый пост)
все изменения при нажатии клавиши d, происходящие в массиве идут под откос из-за map[i][j] = 0;


Более того, из-за
Код

      map[0][a] = 1; //так мы видим что походили

происходит постепенный выход за пределы массива, затираются стековые переменные, user на 102-ом шаге превращается в 1, что и предотвращает программу от краха.

Цитата(Zverushka @  5.1.2012,  11:55 Найти цитируемый пост)
все мои представления о массиве переворачиваются

Какие именно? smile

Большое Спасибо. подскажите как тогда сделать верное условие и увеличение a  smile 
PM MAIL   Вверх
feodorv
Дата 5.1.2012, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Zverushka @  5.1.2012,  20:41 Найти цитируемый пост)
Большое Спасибо. подскажите как тогда сделать верное условие и увеличение a  smile 

Я туплю, конечно, но просто не понимаю условие задачи. Если Вам в нулевом массиве нужно двигать единственную единичку, то достаточно хранить её координаты (всего две переменные!). Но ведь массив Вам для чего-то нужен smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
redwhite90
Дата 5.1.2012, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Zverushka @  5.1.2012,  20:41 Найти цитируемый пост)
подскажите как тогда сделать верное условие и увеличение a


для  переменной a можно использовать остаток от деления.

я так понимаю при нажатии клавиши надо перемещать единичку.Если да то.

-изначально обнулять массив в отдельном цикле и ставить куда надо единичку.
в цикле
по нажатии кнопки ставить единичку в новую ячейку и стирать из старой

и будет тебе счастье

З.Ы. научитесь пользоваться отладяиком



PM MAIL   Вверх
Zverushka
Дата 6.1.2012, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(feodorv @ 5.1.2012,  21:02)
Цитата(Zverushka @  5.1.2012,  20:41 Найти цитируемый пост)
Большое Спасибо. подскажите как тогда сделать верное условие и увеличение a  smile 

Я туплю, конечно, но просто не понимаю условие задачи. Если Вам в нулевом массиве нужно двигать единственную единичку, то достаточно хранить её координаты (всего две переменные!). Но ведь массив Вам для чего-то нужен smile

Да именно мне нужно двигать единичку, сделал как вы говорите создал 2 переменные x, y вот код

Код

#include <iostream>
#include <conio.h>
using namespace std;

void main(){
    const int size = 10;
    int map[size][size];
    int y = 0, x = 0;
    int user;

    while(true){
        user = getch();
//Инициализироем весь массив 0
    for(int i = 0; i<size; i++){
        for(int j = 0; j<size; j++){
            map[i][j] = 0;
        }
    }
    
    for(int i = 0; i<size; i++){
        for(int j = 0; j<size; j++){
            if(user == 'd'){
                x = x%size + 1;
                map[y][x] = 1;
            }
        
            map[y][x-1] = 0;
        }
    }

    for(int i = 0; i<size; i++){
        for(int j = 0; j<size; j++){
            cout << map[i][j];
        }
        cout << endl;
    }


    }    
}




Это сообщение отредактировал(а) Zverushka - 6.1.2012, 09:07

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  1.png 7,76 Kb
PM MAIL   Вверх
redwhite90
Дата 6.1.2012, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Zverushka @  6.1.2012,  09:07 Найти цитируемый пост)
//Инициализироем весь массив 0
    for(int i = 0; i<size; i++){
        for(int j = 0; j<size; j++){
            map[i][j] = 0;
        }
    }

это надо 1 раз сделать перед циклом while(true)

Добавлено через 1 минуту и 50 секунд
Цитата(Zverushka @  6.1.2012,  09:07 Найти цитируемый пост)
  x = x%size + 1;

тут можно вылезти за пределы массива опять же
PM MAIL   Вверх
xvr
Дата 6.1.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Для передвижения единички цикл не нужен.
Код

#include <iostream>
#include <conio.h>
using namespace std;
void main(){
    const int size = 10;
    int map[size][size];
    int y = 0, x = 0;
    int user;
    while(true){
        user = getch();
//Инициализироем весь массив 0
    for(int i = 0; i<size; i++){
        for(int j = 0; j<size; j++){
            map[i][j] = 0;
        }
    }

///////
    if (user == 'd') (++x)%=size;
    map[y][x] = 1;
//////

    for(int i = 0; i<size; i++){
        for(int j = 0; j<size; j++){
            cout << map[i][j];
        }
        cout << endl;
    }
    }    
}

PM MAIL   Вверх
redwhite90
Дата 6.1.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(xvr @  6.1.2012,  16:14 Найти цитируемый пост)
//Инициализироем весь массив 0
    for(int i = 0; i<size; i++){
        for(int j = 0; j<size; j++){
            map[i][j] = 0;
        }
    }


xvr, вам не кажется, что этот цикл одним оператором заменить можно?
PM MAIL   Вверх
xvr
Дата 6.1.2012, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(redwhite90 @  6.1.2012,  17:39 Найти цитируемый пост)
xvr, вам не кажется, что этот цикл одним оператором заменить можно? 

Можно конечно -
Код

memset(map,0,sizeof(map));
но надо же что то оставить и ТС для реализации  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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