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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2011, 23:43   #1
NFXrus
 
Регистрация: 14.10.2011
Сообщений: 8
Вопрос Выход за пределы массива

Вот вообщем то сама задачка
Код:
#include <iostream> // cin, cout
#include <clocale>  // поддержка русского языка
#include <conio.h>  // _getch()
#include <stdlib.h> // поддержка функции очистки экрана system("cls")

using namespace std;

int main()
{

setlocale(LC_CTYPE,"Russian"); // установка русского языка


char act;    // переменная для хранения ввода пользователя
int ch;      // ввод пользователя приведённый к типу int
int x = 0;   // две переменные для хранения координат пользователя
int y = 0;
char map[15][20]; // двумерный массив для хранения игровой карты


// блок инициализации массива
// внешний цикл отвечает за строки
for (int i = 0; i< 15; i++)
{
	// внутренний цикл отвечает за столбцы
	for (int j = 0; j< 20; j++)
	{
		map[i][j] = ' ';
	}
}

map[0][0] = 'Т'; // помещаем игровой персонаж в начало координат
while (1)
{
	system("cls"); // вызов функции очистки экрана

	for (int i = 0; i < 15; i++)
	{
		for (int j = 0; j < 20; j++)
		{
			cout << map[i][j]; // в циклах поэлементно выводится массив
		}
		cout << "\n"; // переход на новую строку после каждого "ряда"
	}

	act = _getch();
	ch = static_cast<int>(act);
	{
		if (ch == -32)
		{}
		else if (ch == 27)
		{break;}
		else if (ch == 75)
			{map[x][y] = ' '; // "Убираем" объект со старой координаты
			y--;             // изменяем координаты
			map[x][y] = 'Т'; // "рисуем" объект на новом месте
		}
		else if (ch == 77)
			{map[x][y] = ' ';
			y++;
			map[x][y] = 'Т';}
		else if (ch == 80)
			{map[x][y] = ' ';
			x++;
			map[x][y] = 'Т';}
		else if (ch == 72)
			{map[x][y] = ' ';
			x--;
			map[x][y] = 'Т';}
	}
} // конец цикла while

	_getch();
	return 0;
}



Сейчас в программе возможна запись в несуществующие элементы массива. Нужно сделать проверку на выход за пределы карты. Вообщем, чтоб когда "Т" крайнюю точку (15:20), нужно оставался на месте и не выходил за пределы поля(когда нажимаешь вниз - он выходит за пределы и выскакивает ошибка). Помогите пожалуйста=) я пол дня ломаю голову=))

Последний раз редактировалось NFXrus; 15.10.2011 в 05:09.
NFXrus вне форума Ответить с цитированием
Старый 14.10.2011, 23:59   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Используйте тег [CODE] (значок # ) для сохранения форматирования и подсветки кода в сообщении. Кнопка Правка снизу справа.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.10.2011, 14:39   #3
NFXrus
 
Регистрация: 14.10.2011
Сообщений: 8
По умолчанию

Походу я встрял=))
NFXrus вне форума Ответить с цитированием
Старый 15.10.2011, 14:55   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что-то не очень понял, что надо сделать.
Цитата:
Сейчас в программе возможна запись в несуществующие элементы массива. Нужно сделать проверку на выход за пределы карты.
Надо запретить ввод некорректных данных? Ну, например, можно сделать ввод в цикле пока не будут введены правильные данные.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.10.2011, 15:33   #5
NFXrus
 
Регистрация: 14.10.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что-то не очень понял, что надо сделать.

Надо запретить ввод некорректных данных? Ну, например, можно сделать ввод в цикле пока не будут введены правильные данные.
Попробуйте скопировать код к себе в программу и запустить его, "Т" принимает значение (0;0) это
Код:
map[0][0] = 'Т';
. По сторонам он двигается как положено, но выходит за пределы массива размером 15х20, т.е. исчезает, если нажать влево или вверх в локации (0;0); вверх, в локациях (0;y); а внизу, при выходе за пределы - вовсе выдает ошибку. Мне лишь надо чтоб "Т" не выходил за пределы массива(т.е. оставался на месте при нажатии влево или вверх в локе (0;0) и т.п.).

Последний раз редактировалось NFXrus; 15.10.2011 в 15:35.
NFXrus вне форума Ответить с цитированием
Старый 15.10.2011, 15:46   #6
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

добавь функцию
Код:
bool validCoords(int x, int y, int n, int m) {
return x>=0 && x<=n-1 && y>=0 && y<=m-1;
}
и собсно проверяй ей в каждом условии.
как-то так.
onewho вне форума Ответить с цитированием
Старый 15.10.2011, 15:52   #7
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

Просто добавь условия проверки на выход за пределы массива. Например, если увеличиваешь y:
Код:
else if (ch == 77 && y + 1 < 20)
{
     map[x][y] = ' ';
     y++;
     map[x][y] = 'Т';
}
Если уменьшаешь, то сравнивай с 0:
Код:
y - 1 >= 0
Аналогично с x
_Alerter_ вне форума Ответить с цитированием
Старый 15.10.2011, 16:15   #8
NFXrus
 
Регистрация: 14.10.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от _Alerter_ Посмотреть сообщение
Просто добавь условия проверки на выход за пределы массива. Например, если увеличиваешь y:
Код:
else if (ch == 77 && y + 1 < 20)
{
     map[x][y] = ' ';
     y++;
     map[x][y] = 'Т';
}
Если уменьшаешь, то сравнивай с 0:
Код:
y - 1 >= 0
Аналогично с x
Помогло, но все равно ограничения x с низу нету, как выходил, так и выходит, причем размер предела по вертикали 15, а не 20, как устанавливалось..
NFXrus вне форума Ответить с цитированием
Старый 15.10.2011, 16:50   #9
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

Вроде всё работает
Код:
            if (ch == -32)
            {}
            else if (ch == 27)
            {break;}
            else if (ch == 75 && y - 1 >= 0)
            {map[x][y] = ' ';
            y--;             
            map[x][y] = 'Т'; 
            }
            else if (ch == 77 && y + 1 < 20)
            {map[x][y] = ' ';
            y++;
            map[x][y] = 'Т';}
            else if (ch == 80 && x + 1 < 15)
            {map[x][y] = ' ';
            x++;
            map[x][y] = 'Т';}
            else if (ch == 72 && x - 1 >= 0)
            {map[x][y] = ' ';
            x--;
            map[x][y] = 'Т';}
_Alerter_ вне форума Ответить с цитированием
Старый 15.10.2011, 20:38   #10
NFXrus
 
Регистрация: 14.10.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от _Alerter_ Посмотреть сообщение
Вроде всё работает
Код:
            if (ch == -32)
            {}
            else if (ch == 27)
            {break;}
            else if (ch == 75 && y - 1 >= 0)
            {map[x][y] = ' ';
            y--;             
            map[x][y] = 'Т'; 
            }
            else if (ch == 77 && y + 1 < 20)
            {map[x][y] = ' ';
            y++;
            map[x][y] = 'Т';}
            else if (ch == 80 && x + 1 < 15)
            {map[x][y] = ' ';
            x++;
            map[x][y] = 'Т';}
            else if (ch == 72 && x - 1 >= 0)
            {map[x][y] = ' ';
            x--;
            map[x][y] = 'Т';}
Спасибо большое=)))
Я вот тут
Код:
 else if (ch == 77 && y + 1 < 20)
            {map[x][y] = ' ';
            y++;
            map[x][y] = 'Т';}
            else if (ch == 80 && x + 1 < 15)
перепутал 20 и 15. Поменял - все заработало=))
NFXrus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ListBox, выход текста за пределы видимости _-Re@l-_ Общие вопросы Delphi 3 31.08.2011 14:51
C++ выход за пределы строки (char) Alex11223 Помощь студентам 4 20.04.2011 20:27
Пределы страницы GoldmasteR JavaScript, Ajax 0 24.11.2010 07:02
C++ - выход за пределы массива kefir Помощь студентам 5 12.06.2010 14:09
Как определить выход курсора за пределы объекта Image Дамир Общие вопросы Delphi 7 29.03.2009 21:59