1) Create a two-dimensional array of 5x5, fill it with random numbers from 10 to 99 and display. Swap the maximum element of each row with the first element in the corresponding row. The problem solved by the pointer.
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; } |
The question of, how to allocate memory for the two-dimensional array, disclosed in detail in this lesson – Tasks: Указатели в С (task №3). Basically, comments in the source code should be enough, to deal with the solution of this problem. But if questions remain – ask.
The result of the program work:
2) The challenge for the multiplication of matrices. The user arbitrarily sets the dimension of the two arrays and fills the values manually. Do not forget, that it is necessary to allocate the appropriate memory locations for matrices, that the user will fill in for the final third of the matrix. Next, display on the screen, both the matrix and filled the resulting matrix (their play).
Maybe someone knows, how to multiply matrices. Watch this short video (author: Prihodovsky MA)
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; } |
For your homework: Write a function for entering matrices of dimension, allocation and deallocation, display and matrix multiplication.
Результат работы:
#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;
}
d / s on 2nd Tasks))
You are wrong to rid the memory of the second task, after a != c. When you enter the matrix 3×2 and 2×3 gives an error message.
For the second array to do a separate cycle, and the first and the third may be one in.
heh, The first task is solved much trivialnee, than is required in the job.. :]]
Decided Zadachu№1 using pointers in the search for the maximum value. Prokomentirujte please can you do that and how much it is validly?
P.S.: sorri, I'm still just learning, so this question ))
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, для следующей строчки
}
}
}
too awful?
I sdelyal. :) The solution is different from yours, but the program should work correctly, several times I checked.
#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;
}
Correct me, but at the end of the second task, where the memory is freed, incorrectly accounted array sizes, which leads to an error, tk. Quantity M2 series (i in the cycle) must be < with.
Sergei! On the first problem it turned out shorter:
int main()
{
setlocale(LC_ALL, “ru”);
srand(time(NULL));
int const row = 3;
int const col = 4;
int **arr = new int*[row];
for (int i = 0; i < row; i )
{
arr[i] = new int[col];
}
for (int i = 0; i < row; )
{
for (int j = 0; j < col; j )
{
arr[i][j] = 10 + rand() % 90;
}
i ;
}
for (int i = 0; i < row; )
{
for (int j = 0; j < col; j )
{
cout << arr[i][j] << " | ";
}
cout << endl;
i ;
}
int max = 0; // to record the maximum value
int buf = 0; // buffer for swapping values
for (int i = 0; i < row; )
{
for (int j = 0; j max)
{
max = arr[i][j];
arr[i][j] = buf;
arr[i][0] = max;
}
}
max = 0; // well it seemed to me so, for positive numbers…
i ;
}
cout << "———————————————————————" << endl;
for (int i = 0; i < row; )
{
for (int j = 0; j < col; j )
{
cout << arr[i][j] << " | ";
}
cout << endl;
i ;
}
for (int i = 0; i < row; i ) delete[] arr[i];
delete[] arr;
return 0;
}