1) Створити двовимірний масив 5х5, заповнити його випадковими числами від 10 до 99 і вивести на екран. Поміняти місцями максимальний елемент кожного рядка з першим елементом у відповідному рядку. Завдання вирішити за допомогою покажчиків.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <iostream> #include <ctime> using namespace std; int main() { setlocale(LC_ALL, "rus"); srand(time(NULL)); int size = 5; // выделяем память для указателей на строки матрицы int** arrWithDigits = new int* [size]; for (int i = 0; i < size; i++) { arrWithDigits[i] = new int[size]; // выделение памяти для каждого элемента строки матрицы } for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { arrWithDigits[i][j] = 10 + rand() % 90; // заполняем числами от 10 до 99 cout << arrWithDigits[i][j] << " | "; // показываем } cout << endl; } cout << endl << endl; // поиск максимального значение в строке матрицы int max = 0; // для записи максимального значения int buf = 0; // буфер для перестановки местами значений int x = 0; // для записи номера строки в котором ищем максимальное значение int y = 0; // для записи номера столбца с максимальным значением for (int i = 0; i < size; i++) { max = arrWithDigits[i][0]; for (int j = 1; j < size; j++) { if (arrWithDigits[i][j] > max) { max = arrWithDigits[i][j]; x = i; // запоминаем номер строки y = j; // запоминаем номер столбца } } // замена максимума с первым элементом в строке if (arrWithDigits[i][0] < max) { buf = arrWithDigits[i][0]; arrWithDigits[i][0] = max; arrWithDigits[x][y] = buf; } } cout << "Матрица после перестановки максимальных значений в строке: "<< endl; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { cout << arrWithDigits[i][j] << " | "; } cout << endl; } cout << endl << endl; // освобождение памяти for (int i = 0; i < size; i++) { delete[] arrWithDigits[i]; // освобождаем память ячеек } delete[] arrWithDigits; // память под указатели на строки матрицы return 0; } |
Питання про те, як виділити пам'ять під двовимірний масив, детально розкритий в цьому уроці – Завдання: Указатели в С (задача №3). В принципі, коментарів у вихідному коді повинно вистачити, щоб розібратися з вирішенням цього завдання. Але якщо питання залишилися – задавайте.
Результат работы программы:
2) Завдання на множення матриць. Користувач довільно задає розмірність двох матриць і заповнює значеннями вручну. Не забувайте, що необхідно виділити відповідні ділянки пам'яті для матриць, які буде заповнювати користувач і для третьої підсумкової матриці. Далі виведіть на екрані обидві заповнені матриці і підсумкову матрицю (їх відтворення).
Можливо хтось не знає, як множити матриці. Подивіться це коротке відео (автор: Пріходовскій М.А.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | #include <iostream> #include <conio.h> using namespace std; int main() // матрицы произвольного размера { setlocale(LC_ALL, "rus"); int a; // размерность матриц int b; int c; int d; do { system("cls"); cout << "Введите размерность 1-й матрицы: "; cin >> a; cin >> b; cout << endl; cout << "Введите размерность 2-й матрицы: "; cin >> c; cin >> d; cout << endl; if (b != c) { system("cls"); cout << " Эти матрицы невозможно умножить!"; cout << "\n Нажмите Enter для повторного ввода!"; _getch(); } } while (b != c); // выделяем память под матрицы с заданным размером int **M1 = new int*[a]; // сначала для массива указателей на строки матрицы for (int i(0); i < a; i++) M1[i] = new int[b]; // и для каждого элемента int **M2 = new int*[c]; for (int i(0); i < c; i++) M2[i] = new int[d]; int **M3 = new int*[a]; for (int i(0); i < a; i++) M3[i] = new int[d]; system("cls"); cout << "Заполните 1-ю матрицу " << a << "x" << b << endl; for (int i(0); i < a; i++) { for (int j(0); j < b; j++) { cin >> M1[i][j]; } cout << endl; } cout << "Заполните 2-ю матрицу " << c << "x" << d << endl; for (int i(0); i < c; i++) { for (int j(0); j < d; j++) { cin >> M2[i][j]; } cout << endl; } for (int i(0); i < a; i++) // обнуляем 3-ю матрицу { for (int j(0); j < d; j++) { M3[i][j] = 0; } } system("cls"); cout << "Первая матрица: " << endl; for (int i(0); i < a; i++) { cout << "| "; for (int j(0); j < b; j++) { cout << M1[i][j]; if (j < b - 1) cout << " "; else cout << " |" << endl; } } cout << "\nВторая матрица : " << endl; for (int i(0); i < c; i++) { cout << "| "; for (int j(0); j < d; j++) { cout << M2[i][j]; if (j < d - 1) cout << " "; else cout << " |" << endl; } } // умножение (произведение) матриц for (int i(0); i < a; i++) { for (int j(0); j < d; j++) { for (int m(0); m < b; m++) M3[i][j] += M1[i][m] * M2[m][j]; } } cout << "\nИтоговая матрица : " << endl; for (int i(0); i < a; i++) { cout << "| "; for (int j(0); j < d; j++) { cout << M3[i][j] << " "; } cout << "|" << endl; } // освободим память for (int i(0); i < a; i++) // сначала элементы строк { delete[] M1[i]; delete[] M2[i]; delete[] M3[i]; } delete[] M1; // затем память указателей на строки delete[] M2; delete[] M3; } |
Для вас домашнє завдання: напишіть функції для введення розмірності матриць, виділення і звільнення пам'яті, виведення на екран і для множення матриць.
Результат работы:
#include "stdafx.h"
#include "stdio.h"
#include
#include "conio.h"
#include "time.h"
#include
using namespace std;
int** give_memory (int** mass, int str, int clmn);
void fill_matrix (int** mass, int str, int clmn);
void print_matrix (int** mass, int str, int clmn);
void multiplication_matrix(int** m1, int** m2, int** m3, int str, int clmn);
void multiplication_matrix(int** m1, int** m2, int** m3, int str, int clmn, int overall);
void clean_memory(int** mass, int str);
int main()
{
setlocale(LC_ALL, "rus");
int** fst_matrix = 0;
int** scnd_matrix = 0;
int** thrd_matrix = 0;
int str_fst_matrix = 0;
int clmn_fst_matrix = 0;
int str_scnd_matrix = 0;
int clmn_scnd_matrix = 0;
int str_thrd_matrix = 0;
int clmn_thrd_matrix = 0;
//Инициализация первой матрицы
cout << str_fst_matrix;
cout << clmn_fst_matrix;
//Инициализация второй матрицы
cout << str_scnd_matrix;
cout <<; clmn_scnd_matrix;
//Инициализация третьей матрицы
str_thrd_matrix = str_fst_matrix;
clmn_thrd_matrix = clmn_scnd_matrix;
if (clmn_fst_matrix != str_scnd_matrix)
{
cout << "Умножение не возможно" << endl << "Кол-во столбцов первой матрицы должно быть равно кол-ву строк второй матрицы" << endl;
}
else
{
fst_matrix = give_memory (fst_matrix, str_fst_matrix, clmn_fst_matrix);
scnd_matrix = give_memory (scnd_matrix, str_scnd_matrix, clmn_scnd_matrix);
thrd_matrix = give_memory (thrd_matrix, str_thrd_matrix, clmn_thrd_matrix);
cout << "ЗАПОЛНЕНИЕ ПЕРВОЙ МАТРИЦЫ !!!" << endl;
fill_matrix (fst_matrix, str_fst_matrix, clmn_fst_matrix);
cout << "ЗАПОЛНЕНИЕ ВТОРОЙ МАТРИЦЫ !!!" << endl;
fill_matrix (scnd_matrix, str_scnd_matrix, clmn_scnd_matrix);
for (int i = 0; i < str_thrd_matrix; i++) // обнуляем 3-ю матрицу
{
for (int j(0); j < clmn_thrd_matrix; j++)
{
thrd_matrix[i][j] = 0;
}
}
system("cls"); //Очистка экрана консоли
cout << "ПЕРВАЯ МАТРИЦА:" << endl;
print_matrix (fst_matrix, str_fst_matrix, clmn_fst_matrix);
cout << "ВТОРАЯ МАТРИЦА:" << endl;
print_matrix (scnd_matrix, str_scnd_matrix, clmn_scnd_matrix);
multiplication_matrix(fst_matrix, scnd_matrix, thrd_matrix, str_thrd_matrix, clmn_thrd_matrix, clmn_fst_matrix);
cout << "Результат:" << endl;
print_matrix(thrd_matrix, str_thrd_matrix, clmn_thrd_matrix);
clean_memory(fst_matrix, str_fst_matrix);
clean_memory(scnd_matrix, str_scnd_matrix);
clean_memory(thrd_matrix, str_thrd_matrix);
}
_getch(); // ожидание ввода какого-либо символа (включена здесь, для того, чтобы окно консоли не пропадало по завершении задачи)
return 0;
}
int** give_memory (int** mass, int str, int clmn)
{
mass = new int* [str];
for (int i = 0; i < str; i++)
{
mass[i] = new int[clmn];
}
return mass;
}
void fill_matrix (int** mass, int str, int clmn)
{
for (int i = 0; i < str; i++)
{
cout << "Введите " << i + 1 << "строку матрицы: " << endl;
for (int j = 0; j > mass[i][j];
}
}
}
void print_matrix (int** mass, int str, int clmn)
{
for (int i = 0; i < str; i++)
{
for (int j = 0; j < clmn; j++)
{
cout << mass[i][j] << " ";
}
cout << endl;
}
}
void multiplication_matrix (int** m1, int** m2, int** m3, int str, int clmn, int overall)
{
for (int i = 0; i < str; i++)
{
for (int j = 0; j < clmn; j++)
{
int f = 0;
while (f != overall)
{
m3[i][j] += m1[i][f] * m2[f][j];
f++;
}
}
}
}
void clean_memory(int** mass, int str)
{
for (int i = 0; i < str; i++)
{
delete [] mass[i];
}
delete [] mass;
}
д/з по 2й задаче))
Ви невірно звільняєте пам'ять у другому завданні, адже a != з. Коли вводиш матриці 3×2 і 2×3 видає помилку.
Для другого масиву потрібно робити окремий цикл, а перший і третій можна в один.
хе, перше завдання вирішується значно трівіалнее, ніж потрібно в завданні.. :]]
Вирішила Задачу№1 використовуючи покажчики в пошуку максимального значення. Прокоментируйте ласка чи можна так робити і на скільки це валідність?
Постскриптум: сорри, я ще тільки вчуся, тому таке питання ))
void fillArr (int **doubleArr, int sizeArr);
void showArr (int **doubleArr, int sizeArr);
void updateArr (int **doubleArr, int sizeArr);
int main()
{
const int sizeArr=5;
int **doubleArr= new int *[sizeArr];
for (int i = 0; i < sizeArr; i++)
{
doubleArr[i] = new int [sizeArr];
}
fillArr(doubleArr , sizeArr);
cout<<"Your Array now looks like: "<<endl;
showArr(doubleArr , sizeArr);
updateArr(doubleArr , sizeArr);
cout<<"Your updated Array now looks like: "<<endl;
showArr(doubleArr , sizeArr);
for (int i = 0; i < sizeArr; i++)
{
delete [] doubleArr[i];
}
delete [] doubleArr;
return 0;
}
void fillArr (int **doubleArr, int sizeArr)
{
srand(time(0));
for (int i = 0; i < sizeArr; i++)
{
for (int j = 0; j < sizeArr; j++)
{
doubleArr[i][j] = 10 + rand()%90;
}
}
}
void showArr (int **doubleArr, int sizeArr)
{
cout<<endl;
for (int i = 0; i < sizeArr; i++)
{
cout<<" | ";
for (int j = 0; j < sizeArr; j++)
{
cout<<doubleArr[i][j]<<" ";
}
cout<<" | "<<endl;
}
}
void updateArr (int **doubleArr, int sizeArr)
{
for (int i = 0; i < sizeArr; i++)
{
int maxValue = 0;
int temp = doubleArr[i][0];
int *ptrElem = &doubleArr[i][0];
for (int j = 0; j < sizeArr; j++)
{
if (maxValue < doubleArr[i][j])
{
maxValue = doubleArr[i][j];
ptrElem = &doubleArr[i][j];
}
}
doubleArr[i][0]= *ptrElem;
*ptrElem = temp;
}
}
for (i = 0; i < str; i++)
{
cout << endl;
for (j = 0; j < sto; j++) //Алгоритм нахождения максимального элемента в строке и замены оного с первым элементов строки местами. // Обращение к строчке.
{
if ((max) < (mass[i][j])) // Если нуль меньше текущего элемента массива, то
{
max = mass[i][j];// Нулю присваиваем значение текущего элемента массива
x = j; // Переменной x присваиваем текущий шаг цикла for.
vr = mass[i][0]; // Переменной vr присваиваем значение нулевого элемента массива.
}
if (j == sto - 1) // Если строка кончилась(шаг цикла равен концу строки), то
{
mass[i][x] = vr; // элементу массива, который раньше был максимальным, присваиваем значение нулевого элемента массива
mass[i][0] = max; // элементу массива, который раньше был нулевым, присваиваем значение максимального элемента массива
max = 0; // обнуляем значение переменной max, для следующей строчки
}
}
}
занадто жахливо?
Я сделяль. :) Рішення відрізняється від вашого, але програма повинна працювати коректно, кілька разів перевірив.
#include
#include
#include
using namespace std;
int **func1(int NumberOfLines, int NumberOfColumns); //Выделение памяти
void func2(int **pointer, int NumberOfLines, int NumberOfColumns); //Заполнение и вывод на экран
void func3(int **pointer, int NumberOfLines, int NumberOfColumns); //меняем местами максимальный и первый элемент в строках
int **func4(int **pointer, int NumberOfLines, int NumberOfColumns); //Освобождение памяти
int main()
{
setlocale(LC_ALL,"rus");
srand(time(NULL));
int n,m;
cout <> n >> m;
int **a = NULL;
a = func1(n,m);
cout << "Исходная матрица: " << endl;
func2(a,n,m);
cout << "Конечная матрица: ";
func3(a,n,m);
func4(a,n,m);
}
int **func1(int NumberOfLines, int NumberOfColumns)
{
int **pointer = new int*[NumberOfLines];
for(int i(0); i < NumberOfLines; i++)
{
pointer[i] = new int[NumberOfColumns];
}
return pointer;
}
void func2(int **pointer, int NumberOfLines, int NumberOfColumns)
{
for(int i(0); i < NumberOfLines; i++)
{
for(int j(0); j < NumberOfColumns; j++)
{
pointer[i][j] = 10 + rand() % 99;
}
}
for(int i(0); i < NumberOfLines; i++)
{
for(int j(0); j < NumberOfColumns; j++)
{
cout << pointer[i][j] << " ";
}
cout << endl;
}
}
void func3(int **pointer, int NumberOfLines, int NumberOfColumns) //ошибка в этой функции
{
int max = 0;
int *c = NULL;
for(int i(0); i < NumberOfLines; i++)
{
for(int j(0); j max)
{
c = &pointer[i][j];
max = pointer[i][j];
}
}
*c = pointer[i][0];
pointer[i][0] = max;
max = 0;
}
for(int i(0); i < NumberOfLines; i++)
{
cout << endl;
for(int j(0); j < NumberOfColumns; j++)
{
cout << pointer[i][j] << " ";
}
}
}
int **func4(int **pointer, int NumberOfLines, int NumberOfColumns)
{
for(int i(0); i < NumberOfLines; i++)
{
delete [] pointer[i];
}
delete [] pointer;
}
Виправте мене, але в кінці вирішення другого завдання, де звільняється пам'ять, невірно враховуються розміри масивів, що веде до помилки, т.к. кол-во рядів М2 (i в цикле) повинно бути < з.
Сергій! За першої завданню коротше вийшло:
int main()
{
setlocale(LC_ALL, “RU”);
srand(time(NULL));
INT = Const рядки 3;
ІНТ Const кол = 4;
INT ** обр = новий INT *[рядок];
for (int i = 0; i < рядок; i )
{
arr[i] = new int[сідло];
}
for (int i = 0; i < рядок; )
{
for (int j = 0; j < сідло; j )
{
arr[i][j] = 10 + rand() % 90;
}
i ;
}
for (int i = 0; i < рядок; )
{
for (int j = 0; j < сідло; j )
{
cout << arr[i][j] << " | ";
}
cout << endl;
i ;
}
int max = 0; // для запису максимального значення
INT ЬіЕ = 0; // буфер для перестановки місцями значень
for (int i = 0; i < рядок; )
{
for (int j = 0; J макс)
{
max = arr[i][j];
arr[i][j] = ЬіЕ;
arr[i][0] = макс;
}
}
макс = 0; // ну мені так здалося, для позитивних чисел…
i ;
}
cout << "———————————————————————" << endl;
for (int i = 0; i < рядок; )
{
for (int j = 0; j < сідло; j )
{
cout << arr[i][j] << " | ";
}
cout << endl;
i ;
}
for (int i = 0; i < рядок; i ) delete[] arr[i];
delete[] arr;
return 0;
}