Лабораторная работа 5

Тема. Динамические матрицы.

Требования и общие указания к заданиям:

· разработать класс для работы с одной или несколькими матрицами, размерности которых являются полями класса (см. лаб. работу 1). В конструкторе создать динамическую матрицу, а в деструкторе освободить память. Предусмотреть методы для ввода, вывода динамической матрицы и в зависимости от варианта один или несколько методов для её обработки. По усмотрению преподавателя в класс можно включить методы, реализующие задачи из нескольких вариантов;

· предусмотреть цветной вывод результатов;

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

· перестановки строк матрицы выполнять с помощью указателей..

Пример 1 (+) Сортировка строк целочисленной динамической матрицы по возрастанию максимальных элементов строк. Порядок чисел в каждой строке не меняется.

/* Прототип функции для вывода матрицы D и вектора максимальных элементов строк S. */

void Myprint (int **D,int *S,int,int);

int main()

{

// 1) Объявление и создание динамической матрицы

int n, m; int **d; randomize();

n=random(5)+2; m=random(5)+2;

d=new int*[n];

for(int i=0;i<n;i++) d[i]=new int [m];

// 2) Получение элементов динамической матрицы случайным образом

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

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

d[i][j]=random(15)-6;

/* 3) Построение вектора максимальных элементов строк s. Его размерность соответствует количеству строк матрицы. */

int *s,Mymax,Mymin,nmin;

s=new int[n]; // Построение динамического одномерного массива

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

{ Mymax=d[i][0];

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

if (d[i][j]>Mymax) Mymax=d[i][j];

s[i]=Mymax;

}

// 4) Вывод не рассортированной матрицы и вектора

Myprint(d,s,n,m);

// 5)Сортировка

for(int start=0;start<=n-2;start++)

{

/* Начиная с элемента s[start], находим наименьший элемент Mymin и его номер nmin */

Mymin=s[start]; nmin=start;

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

if(s[i]<Mymin)

{ Mymin=s[i]; nmin=i;

}

/* Переставляем адреса строк матрицы с номерами start и nmin. Элементы этих строк остаются на старых местах */

int *p; p=d[start]; d[start]=d[nmin]; d[nmin]=p;

/* Переставляем элементы одномерного массива с номерами start и nmin */

int t; t=s[start]; s[start]=s[nmin]; s[nmin]=t;

}

// 6) Вывод рассортированной матрицы и вектора

Myprint(d,s,n,m);

getch(); return 0;

}

/* Функция для вывода матрицы D и вектора максимальных элементов строк S. */

void Myprint (int **D, int *S, int N, int M)

{for(int i=0;i<N;i++)

{ printf("\n");

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

printf("%5d",D[i][j]);

printf(" => %5d",S[i]);

}

printf("\n");

}

Пример 2. (+) Создание динамической ”матрицы”. В первой строке резервируем память для одного элемента, во второй строке – для двух и т. д. Другими словами, создаём в памяти нижний треугольник квадратной “матрицы” относительно главной диагонали.

int main()

{ int n1; cout<<"Size1=>";

cin>>n1; // Объявили и ввели только одну размерность

int **arr;

arr= new int*[n1];

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

arr[i]=new int[i+1];

/* В i-й строке резервируем память для (i+1) элемента Дальше работаем, как с обычной матрицей. Например, в каждой строке находим среднее значение элементов, находящихся “левее ” главной диагонали */

float s;

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

{ s=0;

// Внутренний цикл с помощью указателя и номера элемента

for (int *q=arr[i], j=0; q< arr[i]+i+1; q++, j++)

{ *q=(i+1)*(j+1);

s+=*q;

cout.width(6);

cout<< (*q);

}

/* или внутренний цикл с помощью индекса

for (int j=0;j<i+1;j++)

{ arr[i][j]=(i+1)*(j+1);

s+=arr[i][j];

cout.width(6);

cout<<arr[i][j];

} */

// В этой же строке экрана курсор переводим в позицию с номером (n1+1)*6

gotoxy((n1+1)*6, wherey());

cout<<"Average=> "<<s/(i+1)<<endl;

}

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

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

delete[]arr[i];

delete[]arr;

getch(); return 0;

}

Пример 3. (+). Создание динамической “матрицы” с различным количеством элементов в строках. В каждой строке резервируем память для количества элементов, которое вводим с экрана.

int main()

{ int n1; cout<<"Size1=>"; cin>>n1; // Количество строк

int *arr_of_size;

/*Объявление динамического одномерного массива, в котором будут храниться количество элементов в каждой строке. */

arr_of_size=new int[n1]; // Создание динамического одномерного массива

cout<<"Input the size of each row";

for (int i=0;i<n1;i++) cin>>arr_of_size[i];

// Объявление и создание динамической матрицы

int **arr;

arr= new int*[n1];

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

arr[i]=new int[arr_of_size[i]];

/* Количество элементов каждой строки берём из одномерного динамического массива*/

float s;

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

{ s=0;

for (int j=0;j<arr_of_size[i];j++)

{

arr[i][j]=(i+1)*(j+1);

s+=arr[i][j];

cout.width(6);

cout<<arr[i][j];

}

gotoxy((arr_of_size[i]+1)*6, wherey());

if (arr_of_size[i]==0)

cout<<"No elements";

else

cout<<"Average=> "<<s/arr_of_size[i]<<endl;

}

//Удаляем матрицу

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

delete[]arr[i];

delete[]arr;

delete []arr_of_size; // Удаляем динамический одномерный массив

getch(); return 0;

}

/* Замечание. Этапы 2) – 6) не отличаются от работы со статической матрицей фиксированной размерности.*/

Варианты заданий.

A.Задачи первого простого уровня.

Можно использовать любой алгоритм сортировки

1. Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по наибольшему элементу строки.

2. Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по убыванию количества чисел, принадлежащих отрезку [a, b], где a, b – одинаковые для каждой строки, a<=b.

3. Из динамической квадратной матрицы размерности n*n получить одномерный динамический массив, который содержат наименьшие элементы строк.

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

5. В динамической матрице с одинаковым количеством элементов в каждой строке получить номера строк, все элементы которых четны.

6. В динамической матрице с одинаковым количеством элементов в каждой строке есть только единицы и нули. Найти количество нулевых строк, то есть строк, в которых все нули.

7. В динамической матрице с одинаковым количеством элементов в каждой строке есть только единицы и нули. Найти количество строк, в которых есть хотя бы один нуль.

8. Найти норму заданной динамической матрицы А,с одинаковым количеством элементов в каждой строке, определенную как .

9. Создать нижний относительно главной диагонали треугольник динамической квадратной матрицы. Найти наибольший и наименьший элементы этого треугольника.

10. Создать верхний относительно главной диагонали треугольник динамической квадратной матрицы. Найти сумму всех элементов этого треугольника.

C. Задачи второго среднего уровня.

Можно использовать любой алгоритм сортировки.

1.Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по i – му наименьшему элементу строки, где i – номер строки.

2.Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по количеству простых чисел.

3.Среди наименьших элементов динамической матрицы с одинаковым количеством элементов в каждой строке найти наибольший.

4.Сколько различных чисел в каждой строке динамической матрицы с одинаковым количеством элементов в каждой строке?

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

6. Создать нижний относительно главной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию наибольших элементов строк.

7. Создать верхний относительно главной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию последних элементов строк.

8. Создать нижний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию первых элементов строк.

9. Создать верхний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию их средних значений.

10. Строки динамической матрицы с разным количеством элементов в строках рассортировать по возрастанию их сумм, а если суммы одинаковы, то сортировать по убыванию их средних значений.

11. Строки динамической матрицы с разным количеством элементов в строках рассортировать по возрастанию наибольшего элемента строки, который не повторяется.

12. Создать динамическую матрицу с разным количеством текущих оценок в строках. Рассортировать строки следующим образом: сначала должны быть строки с оценками отличников (9, 10), затем те, в которых наименьшая оценка >=6 (хорошисты) и т.д.

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: