Основы программирования на С++ для начинающих

Задачи и решения: Указатель на указатель

1) Создать двумерный массив 5х5, заполнить его случайными числами от 10 до 99 и вывести на экран. Поменять местами максимальный элемент каждой строки с первым элементом в соответствующей строке. Задачу решить с помощью указателей.

2) Задача на умножение матриц. Пользователь произвольно задает размерность двух матриц и заполняет значениями вручную. Не забывайте, что необходимо выделить соответствующие участки памяти для матриц, которые будет заполнять пользователь и для третьей итоговой матрицы. Далее отобразите на экране обе заполненные матрицы и итоговую матрицу (их воспроизведение).

Возможно кто-то не знает, как умножать матрицы. Посмотрите это короткое видео (автор: Приходовский М.А.)

15 thoughts on “Задачи и решения: Указатель на указатель

  1. #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 выдаёт ошибку.
    Для второго массива нужно делать отдельный цикл, а первый и третий можно в один.

  3. Хех, первая задачка решается значительно тривиалнее, чем требуется в задании.. :]]

  4. Решила Задачу№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;
    }
    }


  5. 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, для следующей строчки
    }
    }
    }

    Слишком ужасно?

  6. Я сделяль. :) Решение отличается от вашего, но программа должна работать корректно, несколько раз проверил.

    #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;

    }

  7. Поправьте меня, но в конце решения второй задачи, где освобождается память, неверно учитываются размеры массивов, что ведет к ошибке, т.к. кол-во рядов М2 (i в цикле) должно быть < с.

  8. Сергей! По первой задачке короче получилось:
    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;
    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *