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 != c. Когда вводишь матрицы 3×2 и 2×3 выдаёт ошибку.
Для второго массива нужно делать отдельный цикл, а первый и третий можно в один.
Хех, первая задачка решается значительно тривиалнее, чем требуется в задании.. :]]
Решила Задачу№1 используя указатели в поиске максимального значения. Прокоментируйте пожалуйста можно ли так делать и на сколько это валидно?
P.S.: Сорри, я еще только учусь, поэтому такой вопрос ))
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 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; // для записи максимального значения
int buf = 0; // буфер для перестановки местами значений
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; // ну мне так показалось, для положительных чисел…
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;
}