The basics of programming in c++ for beginners

Tasks and Solutions: A pointer to a pointer

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.

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)

15 thoughts on “Tasks and Solutions: A pointer to a pointer

  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. 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.

  3. 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;
    }
    }


  4. 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?

  5. 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;

    }

  6. 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.

  7. 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;
    }

Leave a Reply

Your email address will not be published. Required fields are marked *