Слайд 1Массивы, одномерные массивы, многомерные массивы, динамические массивы
Лекция 5
Слайд 2Содержание
Массив
Одномерный массив
Динамический массив
Способы инициализации
Принципы нахождения величин
Пример работы
Многомерные массивы
Динамический многомерный массив
Видео-урок
«Массивы в С++»
Список литературы
Слайд 3Массив
Массив – это пронумерованный набор однотипных элементов. Массивы бывают статическими и
динамическими. У статического массива количество элементов известно заранее и не
может быть изменено. У динамического массива количество элементов заранее неизвестно и определяется в процессе выполнения программы.
Также массивы различаются по размерности: одномерные, двумерные, трехмерные и т.д. Примером одномерного массива может послужить вектор а{1,4,3,5}. Примером двухмерного массива может послужить матрица. Примером трехмерного массива может послужить набор высот местности.
Слайд 4Массивы различают по типу элементов. Бывают целочисленные, вещественные (состоящие из
дробных чисел), символьные массивы.
Примеры массивов:
вектор а{1,-4,3,5} – одномерный вещественный массив из трех
элементов;
матрица – двумерный целочисленный массив из шести элементов;
{“x”3”%”} – одномерный символьный массив;
{“x-3.31,”%”} – не является массивом, т.к. часть элементов символы, часть элементов числа.
Слайд 5Индекс – это номер элемента в массиве.
У одномерного массива один индекс, обычно
он обозначается .
Чтобы использовать одномерный массив в программе, необходимо:
объявить массив в функции main():
тип_данных
имя_массива[количество элементов];
double a[3]; //статический массив а из трех дробных чисел
int b[7]; //статический массив b из семи целых чисел проинициализировать массив, т.е. задать каждому элементу конкретное числовое значение;
провести вычисления, исследования.
Примечание. Индексация в массиве начинается с 0, т.е. индекс у самого первого элемента в массиве i = 0. Индексация в массиве a(7)={-10;0.2;3;-4.7;0.5;-8;11} указана таблице
Слайд 6Одномерные массивы
При использовании простых переменных каждой области памяти для хранения
данных соответствует свое имя. Если с группой величин одинакового типа
требуется выполнять однообразные действия, им дают одно имя, а различают по порядковому номеру. Это позволяет компактно записывать множество операций с помощью циклов. Конечная именованная последовательность однотипных величин называется массивом. Описание массива в программе отличается от описания простой переменной наличием после имени квадратных скобок, в которых задается количество элементов массива (размерность):
float а [10]; // описание массива из 10 вещественных чисел
Слайд 7При описании массивов квадратные скобки являются элементом синтаксиса, а не
указанием на необязательность конструкции.
Элементы массива нумеруются с нуля. При описании
массива используются те же модификаторы (класс памяти, const и инициализатор), что и для простых переменных. Инициализирующие значения для массивов записываются в фигурных
скобках. Значения элементам присваиваются по порядку. Если элементов в массиве больше, чем инициализаторов, элементы, для которых значения не указаны, обнуляются:
int b[5] = {3. 2. 1}; / / b[0]=3. b[l]=2. b[2]=l. b[3]=0. b[4]=0
Слайд 8Для доступа к элементу массива после его имени указывается номер
элемента
(индекс) в квадратных скобках. В следующем примере подсчитывается сумма элементов
массива.
#include "pch.h"
#include
using namespace std;
int main(){
const int n = 10;
int i, sum;
int marks[n] = {3, 4, 5, 4, 4};
for (i = 0; sum = 0; 1cout << "Сумма элементов: " << sum;
return 0;
}
Слайд 9Размерность массивов предпочтительнее задавать с помощью именованных констант, как это
сделано в примере, поскольку при таком подходе для ее изменения
достаточно
скорректировать значение константы всего лишь в одном месте программы. Следует обратить внимание, что последний элемент массива имеет номер, на единицу меньший заданной при его описании размерности.
При обращении к элементам массива автоматический контроль выхода индекса за границу массива не производится, что может привести к ошибкам.
Слайд 10Пример
Сортировка целочисленного массива методом выбора. Алгоритм состоит в том, что
выбирается наименьший элемент массива и меняется местами с первым элементом,
затем рассматриваются элементы, начиная со второго, и наименьший из них меняется местами со вторым элементом, и так далее п-1 раз (при последнем проходе цикла при необходимости меняются местами предпоследний и последний элементы массива). Пример кода на следующем слайде.
Слайд 11Пример кода
#include "pch.h"
#include
using namespace std;
int main() {
const int n
= 20:
// количество элементов массива
int b[n]; // описание массива
int i;
for (i = 0; i
> b[i]; // ввод массива
for (i = 0; i// принимаем за наименьший первый из рассматриваемых элементов:
int imin = 1:
// поиск номера минимального элемента из неупорядоченных:
for (int j = i + 1; j// если нашли меньший элемент, запоминаем его номер:
if (b[j] < b[imin]) imin = j;
int a = b[i]; // обмен элементов
b[i] = b[imin]; // с номерами
b[imin] = a; // i и imin
}
// вывод упорядоченного массива:
for (i = 0; ireturn 0:
}
Слайд 12Процесс обмена элементов массива с номерами 1 и 1m1n через
буферную переменную а на 1-м проходе цикла проиллюстрирован на рисунке
Слайд 13Динамический массив
Динамические массивы создают с помощью операции new, при этом
необходимо указать тип и размерность, например:
int n = 100:
float *р
= new float [n];
В этой строке создается переменная-указатель на float, в динамической памяти
отводится непрерывная область, достаточная для размещения 100 элементов вещественного типа, и адрес ее начала записывается в указатель р. Динамические массивы нельзя при создании инициализировать, и они не обнуляются. Преимущество динамических массивов состоит в том, что размерность может быть переменной, то есть объем памяти, выделяемой под массив, определяется на этапе выполнения программы.
Слайд 14Способы инициализации одномерного массива
Слайд 15Способы инициализации одномерного массива
Слайд 17Принципы нахождения таких величин, как сумма, произведение, минимальное, максимальное значение
Слайд 24Пример
Далее представлен пример, в котором даны четыре одномерных массива: a(8)
= {1,2,3,4,5,6,7,8}, b(8) вводится с клавиатуры, c(8) вычисляется по формуле ci=2i, d(8)
вычисляется по формуле di=ai+bi+ci. Построить таблицу значений массивов.
Для решения сначала необходимо проинициализировать массивы согласно условию задачи. Массив a задан числами (первый способ инициализации), поэтому он будет проинициализирован при объявлении.
Слайд 25Код программы (Visual Studio) с оператором for:
// proga.cpp: определяет точку входа для
консольного приложения
#include "pch.h«
#include
#include
using namespace std;
int main(){
double a[8]={1,2,3,4,5,6,7,8}; double b[8],
c[8], d[8]; int i;
for(i=0; i<8; i=i+1){
cout<<"b["< cin>>b[i];
c[i]=2.0*i;
d[i]=a[i]+b[i]+c[i];
} cout< for(i=0; i<8; i=i+1){ cout< }
return 0;}
Слайд 27Многомерные массивы
Многомерные массивы в С++ задаются указанием каждого измерения в
квадратных скобках, например, оператор
int matr [6][8]:
задает описание двумерного массива из
6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее всего изменяется последний индекс. Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j], или более экзотическим способом: *(matr[i]+j) или *(*(matr+i)+j). Это возможно, поскольку matr[i] является адресом начала i-й строки массива.
Слайд 28При инициализации многомерного массива он представляется либо как массив из
массивов, при этом каждый массив заключается в свои фигурные скобки
(в этом
случае левую размерность при описании можно не указывать), либо задается общий
список элементов в том порядке, в котором элементы располагаются в памяти:
int mass2 [][]={ {1, 1}, {0, 2}, {1, 0} };
int mass2 [3][2]={1, 1, 0, 2, 1, 0};
Далее рассмотрен пример программы, которая определяет в целочисленной матрице номер строки, которая содержит наибольшее количество элементов, равных нулю.
Слайд 29Код программы
#include "pch.h"
#include
using namespace std;
int main(){
const int nstr =
4. nstb = 5; // размерности
массива
int b[nstr][nstb]; // описание массива
int i, j;
for (i = 0; i
for (j = 0; jint istr = -1, MaxKol = 0;
for (i = 0; iint Kol = 0;
for (j = 0; jif (Kol > MaxKol){istr = i; MaxKol = Kol;}
}
printf(" Исходный массив:\n");
for (i = 0; ifor (j = 0; jprintf("\n");}
if (istr == -1)printf("Нулевых элементов нет");
else printf("Номер строки: %d", istr);
return 0;}
Слайд 30Номер искомой строки хранится в переменной istr, количество нулевых элементов
в текущей (i-й) строке - в переменной Kol, максимальное количество
нулевых элементов - в переменной MaxKol. Массив просматривается по строкам, в каждой из них подсчитывается количество нулевых элементов (обратите внимание, что переменная Kol обнуляется перед просмотром каждой строки). Наибольшее количество и номер соответствующей строки запоминаются.
Слайд 31Динамический многомерный массив
Для создания динамического многомерного массива необходимо указать в
операции new все его размерности (самая левая размерность может быть
переменной), например:
int nstr = 5;
int ** m = (int **) new int [nstr][10];
Более универсальный и безопасный способ выделения памяти под двумерный массив, когда обе его размерности задаются на этапе выполнения программы, приведен ниже:
int nstr, nstb;
cout << " Введите количество строк и столбцов :";
cin >> nstr >> nstb;
int **a = new int *[nstr];
for(int i = 0; ia[i] = new int [nstb];
…
Слайд 33Контрольные вопросы
Что такое массив?
Перечислите виды массивов.
Что такое индекс?
Как добиться отображения
массива на экране в виде ровной таблицы?
Назовите способы инициализации массивов
Слайд 34Список литературы
Павловская Т.А. С/С++. Программирование на языке высокого уровня /
Т. А. Павловская. - СПб.: Питер, 2004. - 461 с.:
ил.
Павловская Т.А. С/С ++. Структурное программирование: Практикум / Т.А. Павловская, Ю.А. Щупак. СПб.: Питер, 2007. - 239 с.: ил.
Павловская Т. А., Щупак Ю. А. C++. Объектно-ориентированное программирование: Практикум. - СПб.: Питер, 2006. - 265 с: ил.
Кольцов Д.М. 100 примеров на Си. - СПб.: “Наука и техника”, 2017 - 256 с.
5 Доусон М. Изучаем С++ через программирование игр. - СПб.: “Питер”, 2016. - 352.
Седжвик Р. Фундаментальные алгоритмы на С++. Анализ/Структуры данных/Сортировка/Поиск: Пер. с англ. Роберт Седжвик. - К.: Издательство “Диасофт”, 2001. - 688с.
Сиддкхартха Р. Освой самостоятельно С++ за 21 день. - М.: SAMS, 2013. - 651 с.
Стивен, П. Язык программирования С++. Лекции и упражнения, 6-е изд. Пер. с англ. - М.: ООО "И.Д. Вильямс", 2012. - 1248 с.
Черносвитов, А. Visual C++: руководство по практическому изучению / А. Черносвитов . - CПб. : Питер, 2002. - 528 с. : ил.
Слайд 35Список литературы
Страуструп Б. Дизайн и эволюция языка С++. - М.:
ДМК, 2000. - 448 с.
Мейерс С. Эффективное использование С++. -
М.: ДМК, 2000. - 240 с.
Бадд Т. Объектно-ориентированное программирование в действии. - СПб: Питер, 1997. - 464 с.
Лаптев В.В. С ++. Объектно-ориентированное программирование: Учебное пособие.- СПб.: Питер, 2008. - 464 с.: ил.
Страуструп Б. Язык программирования С++. Режим доступа: http://8361.ru/6sem/books/Straustrup-Yazyk_programmirovaniya_c.pdf.
Керниган Б., Ритчи Д. Язык программирования Си. Режим доступа: http://cpp.com.ru/kr_cbook/index.html.
Герберт Шилдт: С++ базовый курс. Режим доступа: https://www.bsuir.by/m/12_100229_1_98220.pdf,
Богуславский А.А., Соколов С.М. Основы программирования на языке Си++. Режим доступа: http://www.ict.edu.ru/ft/004246/cpp_p1.pdf.
Линский, Е. Основы C++. Режим доступа: https://www.lektorium.tv/lecture/13373.
Конова Е. А., Поллак Г. А. Алгоритмы и программы. Язык С++: Учебное пособие. Режим доступа: https://vk.com/ doc7608079_489807856?hash=e279524206b2efd567&dl=f85cf2703018eeaa2