ОПиБД 10КС
Тема лекции. МАССИВЫ
Литература:
1. Прата, Стивен. П70 Язык программирования С++. Лекции и упражнения,6-е изд.:: Пер. с англ.- М.: ООО "И.Д. Вильямс", 2012.-1248с.
2. Страуструп, Бьярне. С83 Программирование: принципы и практика использования С++.: Пер. с англ.- М.: ООО "И.Д. Вильямс", 2011.-1248с.:
Задание:
1. Лекцию изучить.
2. ПРОГРАММУ выполнить. Скрин выполненной программы прислать личным сообщение ВК - https://vk.com/id9418169.
Ребята, там несколько программ. Хорошо, если вы все их скопируете и выполните
План.
1. Определения
2. Массив как производный тип данных
3. пример программы
Массив — это тип данных, который может содержать несколько значений, все одного типа. Каждое значение сохраняется в отдельном элементе массива, и компьютер хранит все элементы массива последовательно в памяти.
Для создания массива используется оператор объявления. Объявление массива должно содержать три аргумента:
• Тип каждого элемента
• Название массива
• Число элементов в массиве
В C++ это реализуется путем изменения объявления простой переменной путем добавления скобок, которые содержат число элементов. Например, объявление
short months [12];//создает массив из 12 элементов типа short
создает массив с названием months, который содержит 12 элементов, каждый из которых может хранить значение типа short. Каждый элемент, в сущности, является переменной, и их можно обрабатывать как обычные переменные.
Общая форма для объявления массива выглядит так:
typeName arrayName[arraySize];
Выражение arraySize, которое задает число элементов, должно быть значением типа const, например 10, или другим значением типа const, либо постоянным выражением, например, 8 * sizeof (int), для которого все значения уже известны во время трансляции. В частности, arraySize не может быть переменной, значение которой устанавливается в то время, когда программа выполняется. Однако далее вы увидите, как использовать оператор new, чтобы обойти это ограничение.
|
Массив как производный тип данных
Массив именуется производным типом данных, потому что он основан на другом типе данных. Вы не можете просто объявить, что что-то является массивом; это всегда должен быть массив какого-либо специфического типа. Не существует обобщенного типа массива. Вместо этого имеются много специфических типов массивов, таких как массив типа char или long. Например, рассмотрим следующее объявление:
float loans[20];
Тип loans — не "массив"; скорее, это "массив элементов типа float". Это подчеркивает, что массив loans является производным от типа данных float.
Многие полезные свойства массива обусловлены тем фактом, что можно обращаться к элементам массива по отдельности. Для этого нужно использовать субиндекс, или индекс, для перечисления элементов. Массив в C++ нумеруется, начиная с 0. (Это правило нельзя изменить). В C++ используется запись с индексом в квадратных скобках, чтобы определить элемент массива. Например, months[0] — первый элемент массива months, a months[11] — последний элемент. Обратите внимание, что индекс последнего элемента на единицу меньше, чем размер массива. Таким образом, объявление массива дает возможность создать множество переменных одним объявлением, а затем можно использовать индекс, чтобы идентифицировать отдельные элементы.
|
В программе, которая приведена в листинге показано несколько свойств массивов, включая объявление массива, присвоение значений элементам массива и инициализацию массива.
Листинг Программа arrayone.cpp.
// arrayone.cpp — маленький массив типа int
#include <iostream>
using namespace std;
int main()
{
int yams[3];// создание массива из 3 элементов
yams[0]= 7;// присваивает значение первому элементу
yams[1]= 8;
yams[2]= 6;
int yamcosts[3]={20,30,5};//создается и инициализируется //массив
// Примечание: если компилятор или транслятор
// C++ не может инициализировать этот массив, используйте
// static int yamcosts[3] вместо int yamcosts[3]
cout «"Total yams = ";
cout «yams[0] + yams[l] + yams[2] «"\n";
cout «"The package with " «yams[l] « " yams costs ";
cout «yamcosts[l] «" cents per yam.\n";
int total = yams[0]*yamcosts[0]+ yams[l]*yamcosts[1];
total = total + yams[2]*yamcosts[2];
cout<<”The total yam expense is ”<< total<<” cents.\n”;
cout<<”\nSize of yams array = “ <<sisteof yams<<” bytes.”;
cout<<”\nSize of one element =“<<sisteof yams[0]<<” bytes.”;
return 0;}
Результат выполнения программы из листинга:
Total yams = 21
The package with 8 yams costs 30 cents per yam.
The total yam expense is 410 cents.
Size of yams array = 12 bytes.
Size of one element = 4 bytes.
Примечания к программе
Прежде всего, программа создает трехэлементный массив, называемый yams. Поскольку yams имеет три элемента, они пронумерованы от 0 до 2, и программа arrayone.cpp использует значения индекса в диапазоне 0-2, чтобы присвоить значения трем отдельным элементам. Каждый отдельный элемент yams имеет тип int со всеми правами и привилегиями типа данных int, и, таким образом, arrayone.cpp может присваивать значения элементам, а также добавлять, умножать и отображать элементы.
Программа использует длинный способ присвоения значений элементам yam. C++ также позволяет инициализировать элементы внутри инструкции объявления. В листинге используется этот короткий способ, чтобы присвоить значения массиву yamcosts:
|
int yamcosts[3]={20,30,5};
Просто задайте разделенный запятыми список начальных значений, заключенный в скобки. Пробелы в списке необязательны. Если не инициализируется массив, определенный внутри функции, значения элемента остаются неопределенными. Это свидетельствует о том, что элемент принимает любое значение, которое предварительно находилось в том же месте в памяти.
Затем программа использует значения массива в нескольких вычислениях. Эта часть программы выглядит беспорядочной из-за индексов и скобок. Цикл for предоставляет мощный способ для обращения с массивами и устраняет необходимость записывать каждый элемент явно.
Оператор sizeof возвращает размер в байтах типа или объекта данных. Заметьте, что если используется оператор sizeof с названием массива, то выводится число байтов в целом массиве. Но если используется sizeof с элементом массива, получается размер в байтах элемента. Это поясняет то, что yams — массив, но yams[l] — всего лишь элемент типа int.
Еще об инициализации массива
Язык C++ имеет несколько правил относительно инициализации массива. Они носят ограничительный характер, когда массиву присваиваются значения, и определяют, что случится, если число элементов массива не соответствует числу значений в строке инициализации. Давайте исследуем эти правила.
Можно использовать форму инициализации только при определении массива. Вы не можете использовать ее позже, а также невозможно присвоить один массив целиком другому:
int cards[4]={3,6,8,10}; // правильно
int hand[4]; // правильно
hand[4]={5,6,7,9}; // неправильно
hand = cards; // неправильно
Однако можно использовать индексы и присваивать значения элементам массива индивидуально.
При инициализации массива можно присваивать меньшее количество значений, чем количество элементов в массиве. Например, следующая инструкция инициализирует только первые два элемента массива hotelTips:
float hotelTips[5] = {5.0, 2.5};
Если массив инициализируется частично, то транслятор устанавливает оставшиеся элементы равными нулю. Таким образом, можно присвоить всем элементам массива нуль — нужно только явно присвоить нуль первому элементу и позволить компилятору инициализировать нулем оставшиеся элементы:
float totals[500] = {0};
Если при инициализации массива квадратные скобки оставить пустыми, компилятор C++ будет подсчитывать элементы массива. Предположим, например, выполняется такое объявление:
short things[] = {1, 5, 3, 8};
Компилятор создает массив things из четырех элементов.
Обычно не рекомендуется разрешать компилятору подсчитывать число элементов, поскольку полученное таким образом количество может отличаться от имеющегося согласно вашим предположениям. Однако этот подход может быть более безопасным для инициализации символьного массива строкой, как скоро будет показано. И если главное для вас — то, что сама программа знает, насколько большим будет массив, вы можете сделать что-нибудь типа:
short things[ ] = {1,5,3,8};
int num_elements = sizeof things / sizeof (short);
Является ли это полезным или нет — зависит от обстоятельств.
В случае многомерных массивов показывают столько пар скобок, какова размерность массива, а число внутри скобок показывает размер массива по данному измерению.
Например, описание двумерного массива выглядит так: int a[2][5];. Такое описание можно трактовать как матрицу из 2 строк и 5 столбцов.
Для обращения к некоторому элементу массива указывают его имя и индекс, заключенный в квадратные скобки (для многомерного массива - несколько индексов, заключенные в отдельные квадратные скобки): a[1][3], a[0][k+2].
Двумерный массив можно инициировать так:
static int matr[2][5] = {{3,4,0,1,2},{6,5,1,4,9}};
Матрица хранится в памяти построчно, т.е. самый правый индекс в наборе индексов массива меняется наиболее быстро.