Указатели С++. Часть 2Ссылки в C++
30 thoughts on “Задачи и решения: Указатели C++” Навигация по комментариям
← Старые комментарии
Mukha:
11.12.2019 в 08:56
Не понял решения первого задания
Либо я плохо читал и смотрел видос, либо я просто что-то забыл, но как я понял, этот указатель – указатель на указатель, верно?
То есть, одной строчкой кода мы создаем два указателя, один из которых указывает на другой указатель, который в свою очередь указывает на 2.
Послушать так бред
у меня много вопросов,
Как указатель указывает просто на двойку? Или там еще и переменная создается?
почему сначала, там нужно поставить * а потом нет?
*(*(p = new double*) = new double) = 2;
И что вообще происходит в этой строке я так и не разобрался
Кто в этом разбирается помогите пожалуйста, ничего не понимаю
Ответить
Евгений:
11.12.2019 в 21:01
Указателю p присваивается адрес динамически выделенной памяти в которой хранится указатель на double, далее мы разадресуем p и получаем указатель на тип double и динамически выделяем ему память, разадресацией получаем значение этой ячейки памяти (с double) и присваиваем ему значение 2.Можно записать по другому:
p = new double*;
*p=new double;
**p=2;
Ответить
Задачи и решения: Указатель на указатель
Создать двумерный массив 5х5, заполнить его случайными числами от 10 до 99 и вывести на экран. Поменять местами максимальный элемент каждой строки с первым элементом в соответствующей строке. Задачу решить с помощью указателей.
#include
#include
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;
}
Посмотреть код:
2) Задача на умножение матриц. Пользователь произвольно задает размерность двух матриц и заполняет значениями вручную. Не забывайте, что необходимо выделить соответствующие участки памяти для матриц, которые будет заполнять пользователь и для третьей итоговой матрицы. Далее отобразите на экране обе заполненные матрицы и итоговую матрицу (их воспроизведение).
#include
#include
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;
}
Возможно кто-то не знает, как умножать матрицы. Посмотрите это короткое видео (автор: Приходовский М.А.)
Посмотреть код:
5.0
06
20.11.2015 | Posted in Задачи по программированию на C++. Практика программирования.
Do'stlaringiz bilan baham: |