Цель лекции: изучить объявление, выделение и
Под двумерным массивом понимается
Динамическим массивом называют массив с переменным размером, то есть количество элементов может изменяться во время выполнения программы.
Для создания двумерного
Под объявлением двумерного
Синтаксис:
Тип ** ИмяМассива;
ИмяМассива – идентификатор массива, то есть имя двойного указателя для выделяемого
Тип – тип элементов объявляемого void.
Например:
int **a; float **m;
При формировании двумерного
(рис 26.1) Выделение памяти под двумерный массивПри работе с динамической памятью в языке С++ существует 2 способа выделения памяти под двумерный
1) при помощи операции new, которая позволяет выделить в динамической памяти участок для размещения массива соответствующего типа, но не позволяет его инициализировать.
Синтаксис выделения памяти под массив указателей:
ИмяМассива = new Тип * [ВыражениеТипаКонстанты];
Синтаксис выделения памяти для массива значений:
ИмяМассива[ЗначениеИндекса] = new Тип [ВыражениеТипа Константы];
ИмяМассива – идентификатор массива, то есть имя двойного указателя для выделяемого
Тип – тип указателя на массив.
ВыражениеТипаКонстанты – задает количество элементов (
Например:
int n, m;//n и m – количество строк и столбцов матрицы
float **matr; //указатель для массива указателей
matr = new float * [n]; //выделение динамической памяти
под массив указателей
for (int i=0; i<n; i++)
matr[i] = new float [m]; //выделение динамической памяти
для массива значений
При выделении динамической памяти размеры массивов должны быть полностью определены.
2) при помощи библиотечной функции malloc (calloc), которая предназначена для выделения динамической памяти.
Синтаксис выделения памяти под массив указателей:
ИмяМассива = (Тип **) malloc(N*sizeof(Тип *));
или
ИмяМассива = (Тип **) calloc(N, sizeof(Тип *));
Синтаксис выделения памяти для массива значений:
ИмяМассива[ЗначениеИндекса]=(Тип*)malloc(M*sizeof(Тип));
или
ИмяМассива[ЗначениеИндекса]=(Тип*)calloc(M,sizeof(Тип));
ИмяМассива – идентификатор массива, то есть имя двойного указателя для выделяемого
Тип – тип указателя на массив.
N – количество строк массива;
M – количество столбцов массива.
Например:
int n, m;//n и m – количество строк и столбцов матрицы float **matr; //указатель для массива указателей matr = (float **) malloc(n*sizeof(float *)); //выделение динамической памяти под массив указателей for (int i=0; i<n; i++) matr[i] = (float *) malloc(m*sizeof(float)); //выделение динамической памяти для массива значений
Так как функция malloc (calloc) возвращает void *, то необходимо выполнять его преобразование в указатель объявленного типа.
Удаление из динамической памяти двумерного массива осуществляется в порядке, обратном его созданию, то есть сначала освобождается память, выделенная под одномерные массивы с данными, а затем память, выделенная под
1) при помощи операции delete, которая освобождает участок памяти ранее выделенной операцией new.
Синтаксис
delete ИмяМассива [ЗначениеИндекса];
Синтаксис
delete [] ИмяМассива;
ИмяМассива – идентификатор массива, то есть имя двойного указателя для выделяемого
Например:
for (int i=0; i<n; i++) delete matr [i]; //освобождает память, выделенную для массива значений delete [] matr; //освобождает память, выделенную под массив указателей
Квадратные скобки [] означают, что освобождается память, занятая всеми элементами массива, а не только первым.
2) при помощи библиотечной функции free, которая предназначена для освобождения динамической памяти.
Синтаксис
free (ИмяМассива[ЗначениеИндекса]);
Синтаксис
free (ИмяМассива);
ИмяМассива – идентификатор массива, то есть имя двойного указателя для выделяемого
Например:
for (int i=0; i<n; i++) free (matr[i]); //освобождает память, выделенную для массива значений free (matr); //освобождает память, выделенную под массив указателей
Адресация элементов
Синтаксис:
ИмяМассива[ВыражениеТипаКонстанты][ВыражениеТипаКонстанты];
или
ИмяМассива[ЗначениеИндекса][ЗначениеИндекса];
Например:
– индекс задается как константа,
– индекс задается как переменная,
array[4*p][p+5] – индекс задается как выражение.
Пример 1. Сформируйте и выведите на экран
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
int n,i,j;
int **matr;//указатель для массива указателей
cout << "Input matrix order:";
cin >> n;
matr = new int *[n];
//выделение памяти под массив указателей
for(i=0; i<n; i++){
matr[i] = new int[n];
//выделение памяти для массива значений
for (j=0; j<n; j++) //заполнение матрицы
matr[i][j] = (i==j ? 1 : 0);
}
cout << "Result: ";
for(i=0; i<n; i++){
cout << "\n";
for (j=0; j<n; j++)
cout << " " << matr[i][j];
delete matr[i];
//освобождение памяти из-под массива значений
}
delete [] matr;
//освобождение памяти из-под массива указателей
system("pause");
return 0;
}
Пример 2. Вычислить сумму элементов, лежащих на диагоналях матрицы N x N (обратить внимание на N ). Размер массива должен задаваться пользователем с клавиатуры.
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <time.h>
void gen (int nn,int a, int b,int ***mas);
//объявление функции генерации массива
int summa(int nn, int **mas);
/*объявление функции вычисления суммы заданных элементов массива*/
void out (int nn,int **mas);
//объявление функции вывода массива
int _tmain(int argc, _TCHAR* argv[]){
int **mass, n;
int s;
printf("Введите n: ");
scanf("%d",n);
printf("\nГенерация массива \n");
gen(n,0,10,mass);
s=summa(n,mass);
out(n,mass);
printf("\nСумма элементов = %d",s);
system("pause");
return 0;
}
void gen(int nn, int a, int b, int ***mas){
//функция генерации массива
int i,j;
srand(time(NULL)*1000);
*mas=(int**)malloc(nn*sizeof(int*));
for (i=0;i<nn;i++){
(*mas)[i]=(int*)malloc(nn*sizeof(int));
for (j=0;j<nn;j++)
(*mas)[i][j]=rand()%(b-a)+a;
}
}
int summa(int nn, int **mas) {
//функция вычисления суммы элементов диагоналей
int i,j, sum=0;
for (i=0;i<nn;i++)
for (j=0;j<nn;j++) {
if ((i==j) || (i==nn-j-1)) {
//нахождение элементов диагоналей
sum+=mas[i][j];
//суммирование элементов диагоналей
}
}
return sum;
}
void out (int nn,int **mas){
//функция вывода массива
int i,j;
for (i=0;i<nn;i++) {
for (j=0;j<nn;j++)
printf("%4d",mas[i][j]);
printf("\n");
free (mas[i]);
}
free (mas);
}
В языке С++ предусмотрено использование указателя вида ***. В данном примере в функцию генерации массива передается не адрес указателя, а его значение. Передача **.
Двумерный динамический массив – это
Динамический массив – это массив, размер которого заранее не фиксирован и может меняться во время исполнения программы.
Значение указателя на двумерный динамический массив – это адрес массива указателей на одномерные массивы или адрес выделяемой области динамической памяти, если
Тип двумерного динамического массива – это тип элементов массива.
Указатель на двумерный динамический массив – это указатель на массив указателей на одномерные массивы или на начало выделяемого участка динамической памяти, если
Цель работы: изучить объявление, выделение и
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе числовые данные (в зависимости от постановки задачи), выполняет генерацию и вывод двумерного массива указанного типа. Хранение оговоренных в каждой задаче двумерных массивов следует осуществить, используя ресурсы динамической памяти. В каждой задаче необходимо выполнить обработку двумерного массива. Для этого необходимо разработать алгоритм (поиска, замены или численной обработки в двумерных массивах) и реализовать его в виде отдельной функции. Ввод данных осуществляется с клавиатуры с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является диапазон используемого числового типа данных в языке С++ и максимально допустимый размер динамической памяти.
Теоретические сведения.
Ознакомьтесь с материалом лекции 26.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
new и delete ; 2) с помощью библиотечных функций malloc (calloc) и free.Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами объявления, генерации и вывода двумерных динамических массивов в языке С++. Обработку данных необходимо выполнить, используя алгоритмы поиска, замены или перестановок данных в двумерных массивах. В задаче 4 перед заменой следует выполнить числовую обработку данных массива. Вывод входных данных и результатов их обработки следует осуществить на экран. При разработке программного кода требуется использовать метод процедурной абстракции и комментировать фрагменты кода.
Следует реализовать каждое задание в соответствии с приведенными этапами:
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
Контрольные вопросы
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.