Задача: заполнение строки словомПерегруженный конструктор класса
9 thoughts on “Задачи и решения: Указатель на указатель”
Михаил Белоусов:
30.12.2015 в 00:50
#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;
}
Ответить
Михаил Белоусов:
30.12.2015 в 00:51
д/з по 2й задаче))
Ответить
Nomin:
31.12.2015 в 11:35
Вы неверно освобождаете память во втором задании, ведь a != c. Когда вводишь матрицы 3×2 и 2×3 выдаёт ошибку.
Для второго массива нужно делать отдельный цикл, а первый и третий можно в один.
Ответить
user:
11.01.2016 в 20:25
Хех, первая задачка решается значительно тривиалнее, чем требуется в задании.. :]]
Ответить
Vanda:
21.03.2016 в 11:45
Решила Задачу№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: "<showArr(doubleArr , sizeArr);
updateArr(doubleArr , sizeArr);
cout<<"Your updated Array now looks like: "<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<for (int i = 0; i < sizeArr; i++)
{
cout<<" | ";
for (int j = 0; j < sizeArr; j++)
{
cout<}
cout<<" | "<}
}
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;
}
}
Ответить
Иван:
19.08.2016 в 20:14
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, для следующей строчки
}
}
}
Слишком ужасно?
Ответить
Teddy Bear:
19.08.2016 в 23:40
Я сделяль. :) Решение отличается от вашего, но программа должна работать корректно, несколько раз проверил.
#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;
}
Ответить
Виктор:
08.01.2017 в 22:38
Поправьте меня, но в конце решения второй задачи, где освобождается память, неверно учитываются размеры массивов, что ведет к ошибке, т.к. кол-во рядов М2 (i в цикле) должно быть < с.
Ответить
Сергей:
15.02.2019 в 13:34
Сергей! По первой задачке короче получилось:
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;
}
Ответить
Do'stlaringiz bilan baham: |