Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Результат выполнения программы. Исходный массив чисел:



Исходный массив чисел:

mas[6]={3.6 -1 4 3.4 -0.5 0 }

Отсортированный массив чисел:

mas[6]={-1 -0.5 0 3.4 3.6 4 }

!! Проанализируйте программу. Создав новый файл проекта с именем ukaz_1.ide, наберите в нем текст данной программы, откомпилируйте ее и произведите запуск программы на выполнение.

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


Рис. 7.3. Размещение динамического двумерного массива в памяти

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

Пример. Формирование двумерного целочисленного массива размерностью n x m с вводом элементов матрицы с клавиатуры и последующим вычислением нормы матрицы по формуле

.

Программа для решения данной задачи приведена в листинге 7.2.

Листинг 7.2. ukaz_2. сpp

#include <iostream.h>

#include <stdlib.h> //Для функции exit

#include <iomanip.h> //Для функции setw

void main()

{

int n,m,**mas; //mas - указатель на указатель

//Ввод размерностей массива

cout<<"Введите размерность матрицы:\n";

cout<<"число строк n=",cin>>n;

cout<<"число столбцов m=",cin>>m;

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

if(mas==NULL) //Проверка выделения памяти

{

cout<<"Свободной памяти нет"<<endl;

exit(1);

}

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

{ mas[i]=new int[m]; //Выделение памяти для i строки

if(mas[i]==NULL ) //Проверка выделения памяти

{

cout<<"Свободной памяти нет"<<endl;

exit(1);

}

}

//Ввод массива

cout<<"Введите элементы массива:\n";

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

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

{

cout<<"mas["<<i<<"]"<<"["<<j<<"]=";

cin>>mas[i][j];

}

//Вывод исходной целочисленной матрицы

cout<<"\nИсходный массив чисел:"

<<"\nmas["<<n<<"]"<<"["<<m<<"]=\n";

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

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

{ cout<<setw(6)<<mas[i][j];

if(j==m-1)cout<<endl;

}

cout<<endl;

//Вычисление нормы матрицы

int max=0;

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

{ int s=0;

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

s+=abs(mas[i][j]);

if (s>max) max=s;

}

cout<<"Норма матрицы="<<max;

for(int i=0;i<n;i++) //Освобождение памяти, отведенную

delete mas[i]; // под матрицу

delete [] mas; //Освобождение памяти под указатели

}

Результат выполнения программы

Исходный массив чисел:

mas[3][4]=

5 8 4 2

4 9 6 4

1 5 6 8

Норма матрицы=23

!! Проанализируйте программу. Создав новый файл проекта с именем ukaz_2.ide, наберите в нем текст данной программы, откомпилируйте ее и произведите запуск программы на выполнение.

Указатели и динамическое распределение памяти – мощное средство С++. Однако возможности, которые получает программист при работе с указателями, накладывают на него большую ответственность, так как наибольшее количество ошибок вносится в программу именно при работе с указателями. К характерным ошибкам можно отнести следующие "промахи" неопытных программистов.

1. Использование неверного адреса в операции delete. В результате внутренняя структура памяти будет испорчена, что может привести к порче нужной информации.

2. Пропущено освобождение памяти, т.е. отсутствует операция delete. Такие ошибки называют "утечками памяти". В результате многократных утечек памяти ее в итоге может не хватить, и произойдет сбой программы.

3. Запись по неверному адресу. В результате, скорее всего, будут испорчены какие-либо данные, получен неверный результат, сбой программы и т.п. Ошибку определить в этом случае очень сложно, так как она обычно проявляется не сразу.





Дата публикования: 2014-11-02; Прочитано: 318 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...