Uchebnoe_posobie_GLAVA_7m3
.pdfint main(void)
{
setlocale(NULL,"Russian"); int **A,n,m; srand(time(NULL));
cout<<"введите разметноcть по строкам и столбцам\n"; cin>>n>>m;
A=new_mas(n,m); // выделение памяти под массив zap_mas(A,n,m,-10,10);
print_mas(A,n,m);
cout<<"сумма длавной диагонали = "<<sun_d_mas(A,n,m)<<endl; A=del_mas(A,n); // удаление памяти
}
Измененные строки для новой версии программы откомментированы в примере, комментарии прошлого примера удалены, что бы не затруднять чтение кода.
Следует объяснить некоторые моменты не очевидные из кода программы.
Первое: заголовок функции для выделения памяти под массив имеет вид: int** new_mas(int n,int m); не имеет в параметрах указателя на начало массива. В этой функции существует локальный указатель для динамичсеского выделения памяти. Это не создает проблемы, так как динамическая память остается выделенной пока не отработает оператор delete. Если ввести указатель в параметры функции, то Microsoft Visual Studio 2008 сообщит об ошибке использования неинициализированного указателя. В этом случае необходимо в main() строку int **A,n,m; заменить на int **A=0,n,m; Внутри функции new_mas() станет ненужна локальная переменная mas, а заголовок функции примет вид:
int** new_mas(int* mas[], int n,int m);
Второе: после работы оператора delete[] сиавится оператор присваения удаленному указателю значения. 0. Дело в том, что Microsoft Visual Studio 2008 при окрнчании работы программы числит выделенную плд нее память. То есть ко всем указателям применяется оператор delete. Ситуация, когда оператор delete применяется у указателю два раза подряд приводит к ошибке выделения памяти. Поэтому присваивание указателю значения 0 исключает подобную ситуацию. Использование оператора delete необходимо, так как при работе программы из командной строки без управления Microsoft Visual
Studio 2008 очистки памяти не происходит и запуская приложение большое количество раз можно исчерпать всю свободную оператовную память.
Контрольные вопросы
1.Дайте определение массиву
2.Каким образом в памяти расположены данные массива
3.Опишите синтаксис объявления одномерного массива в языке С
4.Как происходит инициализация массива. В чем заключается особенность инициализации массивов
5.Каким образом можно определить объѐм памяти необходимой для хранения массива
6.Что такое индекс элемента массива? Как получить доступ к значению элемента массива, зная его индекс?
7.Какие виды выделения памяти под массивы вам известны. Поясните особенности выделения памяти и высвобождения памяти для каждого вида.
8.Приведите общий вид оператора выделения статической памяти под массив
9.Каким образом происходит динамическое выделение памяти под
массив, приведите примеры
10.Как представляются строки в языке ISO/ANSI C++
11.Каким образом происходит инициализация строк,
12.В чем заключается особенность инициализации строк?, приведите пример.
13.Как располагаются в памяти элементы двумерного массива?
14.Опишите синтаксис объявления двумерного массива в программе. Каким образом производится индексация элементов двумерного массива?
15.Каким образом можно инициализировать многомерный массив.
16.Как изменяются индексы элементов матрицы, лежащих:
-на главной диагонали;
-на побочной диагонали;
-выше главной диагонали;
-ниже главной диагонали;
-выше побочной диагонали;
-ниже побочной диагонали?
17.Напишите фрагменты программ для решения следующих задач:
-подсчет нулевых элементов в заданном одномерном массиве;
-вычисление суммы положительных элементов в заданном одномерном массиве;
-поиск первого максимального элемента и его индекса в заданном одномерном массиве;
-поиск последнего минимального элемента и его индекса в заданном одномерном массиве;
18.Напишите фрагмент программы для решения следующей задачи:
-вычисление произведения отрицательных элементов в каждом столбце двумерного массива;
-вычисление суммы положительных элементов в каждой строке двумерного массива.
-Проверка на идентичность главной и побочной диагонали (т.е. элементы главной диагонали в таком же или в обратном порядке находятся на побочной диагонали)