Основи програмування на С ++ для початківців

Задачі та рішення: Покажчик на покажчик

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

2) Завдання на множення матриць. Користувач довільно задає розмірність двох матриць і заповнює значеннями вручну. Не забувайте, що необхідно виділити відповідні ділянки пам'яті для матриць, які буде заповнювати користувач і для третьої підсумкової матриці. Далі виведіть на екрані обидві заповнені матриці і підсумкову матрицю (їх відтворення).

Можливо хтось не знає, як множити матриці. Подивіться це коротке відео (автор: Пріходовскій М.А.)

15 думки про "Задачі та рішення: Покажчик на покажчик

  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 != з. Коли вводиш матриці 3×2 і 2×3 видає помилку.
    Для другого масиву потрібно робити окремий цикл, а перший і третій можна в один.

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

  4. Вирішила Задачу№1 використовуючи покажчики в пошуку максимального значення. Прокоментируйте ласка чи можна так робити і на скільки це валідність?
    Постскриптум: сорри, я ще тільки вчуся, тому таке питання ))

    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 рядки 3;
    ІНТ Const кол = 4;
    INT ** обр = новий INT *[рядок];
    for (int i = 0; i < рядок; i )
    {
    arr[i] = new int[сідло];
    }
    for (int i = 0; i < рядок; )
    {
    for (int j = 0; j < сідло; j )
    {
    arr[i][j] = 10 + rand() % 90;
    }
    i ;
    }
    for (int i = 0; i < рядок; )
    {
    for (int j = 0; j < сідло; j )
    {
    cout << arr[i][j] << " | ";
    }
    cout << endl;
    i ;
    }
    int max = 0; // для запису максимального значення
    INT ЬіЕ = 0; // буфер для перестановки місцями значень
    for (int i = 0; i < рядок; )
    {
    for (int j = 0; J макс)
    {
    max = arr[i][j];
    arr[i][j] = ЬіЕ;
    arr[i][0] = макс;
    }
    }
    макс = 0; // ну мені так здалося, для позитивних чисел…
    i ;
    }
    cout << "———————————————————————" << endl;
    for (int i = 0; i < рядок; )
    {
    for (int j = 0; j < сідло; j )
    {
    cout << arr[i][j] << " | ";
    }
    cout << endl;
    i ;
    }
    for (int i = 0; i < рядок; i ) delete[] arr[i];
    delete[] arr;
    return 0;
    }

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *