Суббота, 20.04.2024, 00:59
Приветствую Вас Гость | RSS

Кузница миров

Меню сайта
Категории раздела
Мои статьи [2]
Курс : "Основы С++ для начинающих программистов игр." [25]
WindMill Engine [3]
XNA4 RPG [0]
Перевод туториалов но созданию RPG на C# c XNA4.
C# & Leadwerks [5]
Программирование Leadwerks Engine на языке С# с помощью врапера Le.NET.

Каталог статей и уроков

Главная » Статьи » Курс : "Основы С++ для начинающих программистов игр."

4.4. Массивы
Урок 4. Массивы

Сегодняшняя лекция полностью посвящена данным, поэтому сейчас я расскажу еще об одном их типе. Хотя чисто технически это не самостоятельный тип, а способ представления уже известных. Очень часто программы содержат множество, тысячи и миллионы, переменных. Чтобы хоть как-то облегчить жизнь программистам некоторые близкие по смыслу переменные можно объединять в последовательности. Такую последовательность называют массивом.

Одномерный массив


Одномерный массив это список, последовательность близких по смыслу переменных. Как и любые другие типы данных, массив также нужно объявлять. Синтаксис объявления такой:

Тип_данных имя_массива[размер массива];

Здесь:
Тип данных может быть любым известным вам типом. Ограничений нет.
Имя массива также может быть любым, главное чтобы оно соответствовало описанным ранее требованиям к именам.
Размер массива – здесь внутри квадратных скобок указывается, сколько именно переменных будет содержаться в массиве. Каждая такая переменная называется элементом массива.

Теперь, зная синтаксис, объявим массив, состоящий из 10 элементов типа int:

Code
int ar[10];


Доступ к конкретному элементу массива выполняется с помощью его индекса – порядкового номера. Для этого просто указываем индекс в квадратных скобках:

Code
ar[5];


Здесь мы обратились к элементу с индексом пять. Но не к пятому по порядку. Важно запомнить что отсчет в языке программах на языке С++ начинается с 0.
То есть самый первый элемент имеет индекс 0, второй – 1. И так далее. Так что в нашем массиве с 10 переменными, индекс последней переменной будет 9.



Инициализация массива

Свежесозданный массив является пустым. Значение, которое содержат его элементы непредсказуемо и может быть каким угодно в диапазоне объявленного типа данных.
Поскольку пустые массивы, с содержащими мусор элементами, никому не нужны, их нужно как то заполнить. Этот процесс называется инициализацией массива. Инициализировать массив можно несколькими способами.
Например, можно просто присваивать значение каждому элементу.

Code

ar[0] = 10;
ar[3] = 17;


Если всем элементам массива нужно присвоить определенное значении или последовательность значений, то это удобно делать в цикле.
Вот пример кода:

Code
#include <iostream>
using namespace std;

void main()
{
   setlocale(0,"");    // подобная запись устанавливает в консоли язык, используемый в системе по умолчанию.
   int ar[10];   // обьявляем масив
   for(int i=0;i<10;i++)
   {
    ar[i]=0;  // присваиваем значение элементам
   }
     
   for(int i=0;i<10;i++) // цикл, воторый выводит значение елементов
   {
    cout<<"Элемент ar["<<i<<"] = "<<ar[i]<<'\n';
   }
   cin.get();
}

Как он работает, видно из комментариев.

Есть еще один способ инициализации массива. Он используется во время его объявления. Вот синтаксис:

Тип_данных имя_массива[размер массива] = {список_значений};

Code

#include <iostream>
using namespace std;

void main()
{
   setlocale(0,"");   
   int ar[10]={1,2,3,4,5,6,7,8,9,10};    // обьявляем и инициализируем массив   
   for(int i=0;i<10;i++)   
   {
    cout<<"Элемент ar["<<i<<"] = "<<ar[i]<<'\n';
   }
   cin.get();
}


Количество значений в строке {1,2,3,4,5,6,7,8,9,10} желательно, но не обязательно должна соответствовать размеру массива.

Кстати, в целях экономии места подобным способом можно объявить массив, не указывая его размер.

Code
Тип_данных    имя_массива[ ] = {список_значений};


В таком случае размер массива будет равен количеству значений. То есть в результате объявления:

Code
int ar[]={5,7,133};


будет создан массив, содержащий три элемента. Таким способом часто пользуются при объявлении массивов символов, или по-другому строк.

Code
[b]Массив символов[/b]

Строка это одномерный массив, каждый элемент которого относится к типу данных char, а последний символ нулевой (‘\0’) .

image004.png

Объявлять символьный массив можно как любой другой массив, например, так:

Code
char str[7]={'q','w','e','r','t','y','\0'};


Чтобы не заморачиваться с нулевым символом и размером лучше всего использовать следующий способ:

Code
char str[]="qwerty";


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

Code
cout << "чтобы программа знала, что остановится нужно после слова здесь";


Я проиллюстрирую это примером:

Code
#include <iostream>
using namespace std;

void main()
{
   setlocale(0,"");   
   char str[]="qwerty";    // обьявляем и инициализируем массив   
   int i=0;
   while(str[i]!='\0')  // пока это не нулевой символ
   {
    cout<<str[i++]<<'\n';
   }
   cin.get();
}


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

Раньше мы вводили к компьютер только числа, сейчас же настало время научиться вводить текст. Делается это с помощью все того же оператора cin.
Просто необходимо создать соответствующую переменную, то есть массив символов, и передать ей ввод.

Code
#include <iostream>
using namespace std;

void main()
{
   setlocale(0,"");   
   char str[50];    // обьявляем массив   
     
   cin>>str;  // считываем строку
   cout<<"вы ввели: "<<str; //отображение   

   cin.get();
   cin.get();
}


Заметьте, при передаче ввода указывается только имя массива без использования квадратных скобок. То же самое и при выводе с помощью cout. И еще количество введенных символов не должно превышать заявленный размер массива.
Сейчас поясню, почему. Элементы массива размещаются в памяти компьютера друг за другом в смежных ячейках, то есть так, как это показано выше на рисунке. Если количество символов окажется больше, чем размер массива, программа без зазрения совести запишет их последующие ячейки. При это данные, которые были записаны в них ранее будут безвозвратно утеряны. В результате произойдет сбой в работе программы.
Так что будьте внимательны. Создавая массив, заранее просчитывайте, сколько места понадобится.
Описанная здесь проблема касается не только строк, это проблема любых массивов вообще.



Многомерный массив


Помимо простых одномерных массивов существуют и многомерный. Если одномерный можно сравнить с несколькими коробками, содержащими определенные предметы-значения, то многомерный массив это коробки в которых содержатся другие коробки. И так далее.
Объявляются они следующим образом:

Code
Тип_данных    имя_массива[размер_1] [размер_2]… [размер_N];


Пример:

Code

              float map[10][10]
   int terra[5][50][300];
   char text[100][2][5][500][3][15654][45][10][15];

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

Допустим, есть следующий массив:

Code
    int map[5][5];


Вот как его можно представить графически:



На что похоже. Ну, например, на урезанное шахматное поле. Таким способом, сделав массив 8 на 8 элементов можно представить шахматную доску, или если брать шире, то вообще любое игровое поле. А содержащееся значение могут, например, означать силу или количество находящихся там существ, или просто тип юнита.
Инициализируют многомерные массивы также как и обычные. Разве что есть небольшое отличие в записи.

Code
    int map[5][5]=    {{1,2,3,4,5},
       {2,50,43,75,10},   
       {3,44,45,1,9},   
       {4,16,8,5,1},   
       {5,5,8,8,7}};   

Здесь числа собраны в группы по количеству элементов.
Теперь, чтобы лучше понять, что представляют из себя многомерные массивы, напишем небольшую программу. Поскольку урок серьезный, напишем мы таблицу умножения)
Вот код. Он небольшой, так что разобраться сможете:

Code
#include <iostream>
using namespace std;

void main()
{
   setlocale(0,"");   

   int tab[10][10];  //обьявляем массив
   tab[0][0]=0;
   for(int i=1;i<10;i++)
   {
    tab[i][0]=i;  // заполняем верхнюю строку
    tab[0][i]=i;  // заполняем левый крайний столбик
   }

   for(int y=1;y<10;y++)
   {
    for(int x=1;x<10;x++)
    {
     tab[x][y]=x*y;    // заполняем всю таблицу
    }
   }

   for(int y=0;y<10;y++)
   {
    for(int x=0;x<10;x++)
    {
     cout<<tab[x][y]<<'\t';    // печатаем таблицу
    }
    cout<<"\n\n";
   }

   cin.get();

}


Укажу лишь на вложенные цикл:

Code
    for(int y=1;y<10;y++)
   {
    for(int x=1;x<10;x++)
    {
     tab[x][y]=x*y;    // заполняем всю таблицу
    }
   }


Именно так здесь заполняются «коробки, вложенные в коробки».
Завершая с массивами, выполняю данное ранее обещание и привожу код преобразования из десятичной системы в двоичную:

Code
#include <iostream>
using namespace std;

void main()
{
   setlocale(0,"");
   cout<<"введите число от 0 до 255 ";
   int i;
   cin>>i;
   int c[8];    //массив в котором будут хранится биты (1 или 0)
   int ic=7;
   for(int x=0;x<8;x++)
   {
    c[x]=0;    // обнуляем элементы массива
   }
   while(i!=0)    // пока результат деления не равен 0
   {
    c[ic--]=i%2; //присваиваем элементу массива остаток, являющийся битом
    i=i/2;  // делим на 2   
   }
   for(int x=0;x<8;x++)
   {
    cout<< c[x];    //отображаем результат
   }

   cin.get();
   cin.get();
}

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

Code
c[ic--]=i%2;


здесь используется инкремента в постфиксной записи, поэтому сначала вычисляется все выражение и только после переменная ic уменьшается на единицу.

Для преобразования типов существует намного более простой код. Его я приведу, когда мы научимся работать персонально с каждым битом.
Категория: Курс : "Основы С++ для начинающих программистов игр." | Добавил: nilrem (11.05.2012)
Просмотров: 2279 | Комментарии: 2 | Рейтинг: 5.0/1
Всего комментариев: 2
2 Roman4889  
0
здесь на интернет-ресурсе собран огромный ассортимент интересных статей про http://ublaze.ru/forum/ftopic1084.html - спутниковый ресивер gs 8302

1 Vadim8704  
0
тут на данном сайте собран огромный ассортимент интересных статей про http://medbaz.com/pages-more-746.html - тестостерон у женщин.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0