Мегаобучалка Главная | О нас | Обратная связь


Практическая работа №5



2016-09-16 1011 Обсуждений (0)
Практическая работа №5 0.00 из 5.00 0 оценок




Динамические массивы

1. Цель работы:

1. Получить практические навыки выделения, перераспределения и освобождение памяти при работе с динамическими массивами

Теоретические сведения

Для работы с динамической памятью используют указатели. С их помощью осуществляется доступ к участкам динамической памяти, которые называются динамическими переменными. Динамические переменные создаются с помощью специальных функций и операций. Они существуют либо до конца работы программ, либо до тех пор, пока не будут уничтожены с помощью специальных функций или операций.

Для создания динамических переменных используют операцию new, определенную в C++:

указатель = new имя_типа[инициализатор];

где инициализатор – выражение в круглых скобках.

Операция new позволяет выделить и сделать доступным участок динамической памяти, который соответствует заданному типу данных. Если задан инициализатор, то в этот участок будет занесено значение, указанное в инициализаторе.

int* x=new int(5);

Для удаления динамических переменных используется операция delete, определенная в C++:

delete указатель;

где указатель содержит адрес участка памяти, ранее выделенный с помощью операции new.

delete x;

Операция new при использовании с массивами имеет следующий формат:

new тип_массива

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

//выделение динамической памяти 100*sizeof(int) байт

int* a = new int[100];

 

При формирование матрицы сначала выделяется память для массива указателей на одномерные массивы, а затем в цикле с параметром выделяется память под n одномерных массивов.

 

/*выделение динамической памяти под двумерный динамический массив*/

int** form_matr(int n,int m)

{

int **matr=new int*[n];//выделение памяти по массив указателей

for(int i=0;i<n;i++)

//выделение памяти 100*sizeof(int) байт для массива значений

matr[i]=new int [m];

return matr;//возвращаем указатель на массив указателей

}

 

*matr[0] *matr[1] *matr[2] ….. *matr[n]

 

 

Рис. Выделение памяти под двумерный массив

 

Изменять значение указателя на динамический массив надо аккуратно, т. к. этот указатель затем используется при освобождении памяти с помощью операции delete.

 

/*освобождает память, выделенную под массив, если а адресует его начало*/

delete[] a;

 

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

int find(int **matr,int m,int I)

{

for(int i=0;i<m;i++)

if(matr[I][i]<0) return 1;

return 0;

}

 

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

int **del(int **matr,int &n,int m)

{//удаление четных строк

int k=0,t=0;

for(int i=0;i<n;i++)

if(i % 2!=0)k++;//количество нечетных строк

//выделяем память под новую матрицу

int **matr2=form_matr(k,m);

for(i=0;i<n;i++)

if(i % 2!=0)

{

//если строка нечетная, то переписываем ее в новую матрицу

for(int j=0;j<m;j++)

matr2[t][j]=matr[i][j];

t++;

}

n=t;//изменяем количество строк

//возвращаем указатель на новую матрицу как результат функции

return matr2;

}

Постановка задачи

1. Сформировать динамический одномерный массив, заполнить его случайными числами и вывести на печать.

2. Выполнить указанное в варианте задание и вывести полученный массив на печать.

3. Сформировать динамический двумерный массив, заполнить его случайными числами и вывести на печать.

4. Выполнить указанное в варианте задание и вывести полученный массив на печать.

Варианты

№ варианта Одномерный массив Двумерный массив
Удалить первый четный элемент Добавить строку с заданным номером
Удалить первый отрицательный элемент Добавить столбец с заданным номером
Удалить элемент с заданным ключом (значением) Добавить строку в конец матрицы
Удалить элемент равный среднему арифметическому элементов массива Добавить столбец в конец матрицы
Удалить элемент с заданным номером Добавить строку в начало матрицы
Удалить N элементов, начиная с номера K Добавить столбец в начало матрицы
Удалить все четные элементы Добавить К строк в конец матрицы
Удалить все элементы с четными индексами Добавить К столбцов в конец матрицы
Удалить все нечетные элементы Добавить К строк в начало матрицы
Удалить все элементы с нечетными индексами Добавить К столбцов в начало матрицы
Добавить элемент в начало массива Удалить строку с номером К
Добавить элемент в конец массива Удалить столбец с номером К
Добавить К элементов в начало массива Удалить строки, начиная со строки К1 и до строки К2
Добавить К элементов в конец массива Удалить столбцы, начиная со столбца К1 и до столбца К2
Добавить К элементов, начиная с номера N Удалить все четные строки
Добавить после каждого отрицательного элемента его модуль Удалить все четные столбцы
Добавить после каждого четного элемента элемент со значением 0 Удалить все строки, в которых есть хотя бы один нулевой элемент
Добавить по К элементов в начало и в конец массива Удалить все столбцы, в которых есть хотя бы один нулевой элемент
Добавить элемент с номером К Удалить строку, в которой находится наибольший элемент матрицы
Удалить элемент с заданным номером Добавить строки после каждой четной строки матрицы
Удалить N элементов, начиная с номера K Добавить столбцы после каждого четного столбца матрицы
Удалить все четные элементы Добавить К строк, начиная со строки с номером N
Удалить все элементы с четными индексами Добавить К столбцов, начиная со столбца с номером N
Удалить все нечетные элементы Добавить строку после строки, содержащей наибольший элемент
Удалить все элементы с нечетными индексами Добавить столбец после столбца, содержащего наибольший элемент

Методические указания

1. Для выделения памяти под массивы использовать операцию new, для удаления массивов из памяти – операцию delete.

2. Для выделения памяти, заполнения массивов, удаления и добавления элементов (строк, столбцов) написать отдельные функции. В функции main() должны быть размещены только описания переменных и обращения к соответствующим функциям:

int main()

{

int n;

cout<<"N?";cin>>n;

person*mas=form_mas(n);

init_mas(mas,n);

print_mas(mas,n);

return 1;

}

 

3. Для реализации интерфейса использовать текстовое меню:

….

do

{

cout<<”1. Формирование массива\n”;

cout<<”2. Печать массива\n”;

cout<<”3. Удаление из массива\n”;

cout<<”4. Добавление в массив\n”;

cout<<”5. Выход\n”;

cin>>k;

switch (k)

{

case 1: mas=form_mas(SIZE);input_mas(mas,SIZE); break;//выделение памяти и заполнение

case 2: print_mas(mas,SIZE); break;//печать

case 3: del_mas(mas,SIZE);break;//удаление

case 4: add_mas(mas,SIZE);break;//добавление

}

while (k!=5);//выход

4. При удалении элементов (строк, столбцов) предусмотреть ошибочные ситуации, т. е. ситуации, в которых будет выполняться попытка удаления элемента (строки, столбца) из пустого массива или количество удаляемых элементов будет превышать количество имеющихся элементов (строк, столбцов). В этом случае должно быть выведено сообщение об ошибке.

Содержание отчета

1. Постановка задачи (общая и для конкретного варианта).

2. Определения функций для реализации поставленных задач.

3. Определение функции main().

4. Тесты



2016-09-16 1011 Обсуждений (0)
Практическая работа №5 0.00 из 5.00 0 оценок









Обсуждение в статье: Практическая работа №5

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (1011)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.01 сек.)