Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

C++ задача

C++ задача

Мнениеот Гост » 15 Яну 2019, 18:33

Здравейте, как може функция да върне двумерен масив.
Във main() ако са въведени 2 масива и трябва да се напише функция която връща трети масив3 елементите на който примерно са сборове от ел. на масив1 и масив2. Този масив да се изведе от main(). Ще съм много благодарен на някакво решение , много е важно за мен.
Гост
 

Re: C++ задача

Мнениеот aifC » 15 Яну 2019, 20:32

void sum(int a[], int b[], int c[], int sizeArray)
{
for (int i = 0; i < sizeArray; ++i)
c[i]= b[i] + a[i];

cout << setw(7) << a[i] << setw(3) << "+" << setw(10)
<< b[i] << setw(3) << "=" << setw(10) << c[i] << endl;
}
sum( first_array, second_array, third_array, arraySize); -----> това е за мейна
Да знаеш само че copy paste няма да проработи , дадох ти нагледен пример, прояви малко фантазия и ще се справиш.
На теория няма разлика между теорията и практиката. Но на практика има.
Аватар
aifC
Напреднал
 
Мнения: 364
Регистриран на: 17 Окт 2017, 19:33
Рейтинг: 249

Re: C++ задача

Мнениеот Гост » 16 Яну 2019, 13:03

Това го знам . Имах предвид с return, да връща масива в main а не да го изведе
Гост
 

Re: C++ задача

Мнениеот Добромир Глухаров » 16 Яну 2019, 21:01

Мисля, че не може да върне самия масив, а само указател към него:

Код: Избери целия код
#include <iostream>

using namespace std;

int** Sum(int a[][2], int b[][2])
{
    int** c = new int*[3];

    for(int i = 0; i < 3; i++)
    {
        c[i] = new int[2];

        for(int j = 0; j < 2; j++)
            c[i][j] = a[i][j] + b[i][j];
    }
    return c;
}

int main()
{
    int a[3][2] = {{1, 2}, {3, 4}, {5, 6}},
        b[3][2] = {{7, 8}, {9, 10}, {11, 12}};

    int** c = new int*[3];

    for(int i = 0; i < 3; i++)
        c[i] = new int[2];

    c = Sum(a, b);

    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 2; j++)
            cout << c[i][j] << "\t";
        cout << endl;
    }
    cout << endl;

    for(int i = 0; i < 3; i++)
        delete[] c[i];

    delete c;

    return 0;
}


Само, че при това положение не виждам как ще изтрием указателя съм 'с' в Sum. Не можем да го направим преди return, защото ще го изгубим, и няма да върнем нищо. Сигурно е по-добре да не заделяме памет за 'c' в main(). Така в main() ще използваме указател, върнат от Sum, към резултатния масив, изчислен в Sum:

Код: Избери целия код
#include <iostream>

using namespace std;

int** Sum(int a[][2], int b[][2])
{
    int** c = new int*[3];

    for(int i = 0; i < 3; i++)
    {
        c[i] = new int[2];

        for(int j = 0; j < 2; j++)
            c[i][j] = a[i][j] + b[i][j];
    }
    return c;
}

int main()
{
    int a[3][2] = {{1, 2}, {3, 4}, {5, 6}},
        b[3][2] = {{7, 8}, {9, 10}, {11, 12}};

    int** c = Sum(a, b);

    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 2; j++)
            cout << c[i][j] << "\t";
        cout << endl;
    }
    cout << endl;

    for(int i = 0; i < 3; i++)
        delete[] c[i];

    delete c;

    return 0;
}


А с шаблон е още по-добре (така размерите на масивите се предават автоматично):

Код: Избери целия код
#include <iostream>

using namespace std;

template <int m, int n> int** Sum(int (&a)[m][n], int (&b)[m][n])
{
    int** c = new int*[m];

    for(int i = 0; i < m; i++)
    {
        c[i] = new int[n];

        for(int j = 0; j < n; j++)
            c[i][j] = a[i][j] + b[i][j];
    }
    return c;
}

int main()
{
    int a[4][2] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}},
        b[4][2] = {{9, 10}, {11, 12}, {13, 14}, {15, 16}};

    int** c = Sum(a, b);

    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 2; j++)
            cout << c[i][j] << "\t";
        cout << endl;
    }
    cout << endl;

    for(int i = 0; i < 4; i++)
        delete[] c[i];

    delete c;

    return 0;
}
Аватар
Добромир Глухаров
Математик
 
Мнения: 2080
Регистриран на: 11 Яну 2010, 13:23
Рейтинг: 2178

Re: C++ задача

Мнениеот Добромир Глухаров » 16 Яну 2019, 22:34

А, и съм пропуснал едни квадратни скоби след втория delete:

Код: Избери целия код
#include <iostream>

using namespace std;

template <int m, int n> int** Sum(int (&a)[m][n], int (&b)[m][n])
{
    int** c = new int*[m];

    for(int i = 0; i < m; i++)
    {
        c[i] = new int[n];

        for(int j = 0; j < n; j++)
            c[i][j] = a[i][j] + b[i][j];
    }
    return c;
}

int main()
{
    int a[4][2] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}},
        b[4][2] = {{9, 10}, {11, 12}, {13, 14}, {15, 16}};

    int** c = Sum(a, b);

    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 2; j++)
            cout << c[i][j] << "\t";
        cout << endl;
    }
    cout << endl;

    for(int i = 0; i < 4; i++)
        delete[] c[i];

    delete[] c;

    return 0;
}
Аватар
Добромир Глухаров
Математик
 
Мнения: 2080
Регистриран на: 11 Яну 2010, 13:23
Рейтинг: 2178


Назад към C, C++



Кой е на линия

Регистрирани потребители: Google [Bot]

Форум за математика(архив)