Мне нужна помощь в создании функции - PullRequest
0 голосов
/ 21 мая 2019

Я новичок, не так хорош с функциями, и я пытаюсь решить этот вопрос:

Предположим, A, B, C - это массивы целых чисел размером [M], [N] и [M][N] соответственно.Пользователь введет значения для массива A и B.Напишите пользовательскую функцию на C ++ для вычисления третьего массива C, добавив элементы A и B.Если элементы имеют одинаковый порядковый номер, они будут умножены.C рассчитывается следующим образом: -

Использование A, B и C в качестве аргументов в функции.

This is the picture that came with it

Ниже приведена моя попытка решения проблемы.

     #include<iostream>
using namespace std;

void Mix(int(&A)[], int(&B)[], int(&C)[][100], int N, int M);
//dont understand why you used Q

int main()
{
    //variable declaration
    int A[100], B[100], C[100][100], n, m, l = 0;


    //input of size of elements for first ararys
    cout << "Enter number of elements you want to insert in first array: ";
    cin >> n;
    cout << "-----------------" << endl;
    cout << "-----------------" << endl;
    cout << "Enter your elements in ascending order" << endl;
    //input the elements of the array
    for (int i = 0; i < n; i++)
    {
        cout << "Enter element " << i + 1 << ":";
        cin >> A[i];
    }
    cout << endl << endl;
    //input of size of elements for first ararys
    cout << "Enter number of elements you want to insert in second array: ";
    cin >> m;
    cout << "-----------------" << endl;
    cout << "-----------------" << endl;
    cout << "Enter your elements in descending order" << endl;
    //input the elements of the array
    for (int i = 0; i < m; i++)
    {
        cout << "Enter element " << i + 1 << ":";
        cin >> B[i];
    }

    Mix(A, B, C, n, m);

    cout << "\nThe Merged Array in Ascending Order" << endl;


    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
        {
            cout << C[i][j] << " ";
        }
        cout << "\n"; //endline never use endl its 10 times slower
    }

    system("pause");
    return 0;
}

void Mix(int(&A)[], int(&B)[], int(&C)[][100], int N, int M)
{
    // rows is the index for the B array, cols is index for A array
    int rows = 0;
    int cols = 0;
    while (rows < M) {
        while (cols < N) {
            if (rows == cols) { // remember ==
                C[rows][cols] = B[rows] * A[cols];
            }
            else {
                C[rows][cols] = B[rows] + A[cols];
            }
            cols++; // increment here
        }
        rows++; // increment here
    }
    return;
}

Вот пример вывода:

введите изображениеописание здесь

Ответы [ 3 ]

1 голос
/ 21 мая 2019

Чтобы сделать массив C двумерным, его нужно выразить как C[100][100] вместо C[200].Это первый шаг.Далее, в вашей функции Mix() вам нужно циклически проходить через каждый элемент как A, так и B (например, два цикла for).Ваши строки изменяются при изменении B, а столбцы - при изменении A.Включите проверку идентичных индексов, которая определит, добавлять ли или умножать два значения вместе.

void Mix(int A[], int B[], int C[][], int N, int M) {
    // rows is the index for the B array, cols is index for A array
    for (int rows = 0; rows < M; rows++) {
        for (int cols = 0; cols < N; cols++) {
            if (rows == cols) { // remember ==
                C[rows][cols] = B[rows] * A[cols];
            } else {
                C[rows][cols] = B[rows] + A[cols];
            }
        }
    }
}

Убедитесь, что ваши массивы определены правильно, и распечатайте массив C по строкам и столбцам в соответствии со спецификациями.

ОБНОВЛЕНИЕ: Если вы хотите использовать циклы while, я по умолчанию буду деконструировать циклы for и применять ту же логику:

void Mix(int A[], int B[], int C[][], int N, int M) {
    // rows is the index for the B array, cols is index for A array
    int rows = 0;
    int cols = 0;
    while (rows < M) {
        while (cols < N) {
            if (rows == cols) { // remember ==
                C[rows][cols] = B[rows] * A[cols];
            } else {
                C[rows][cols] = B[rows] + A[cols];
            }
            cols++; // increment here
        }
        rows++; // increment here
    }
}

Я определенно рекомендую for Циклический подход, поскольку он более компактен, но выполняет те же самые операции.

0 голосов
/ 21 мая 2019

Поскольку M и N определены во время выполнения, вам действительно нужно использовать vector s для их представления.Кроме того, рассмотрите возможность возврата 2D-контейнера, чтобы использовать оптимизацию возвращаемого значения.

Я собираюсь написать пример, использующий vector из vector s для простоты (см. Каковы проблемы свектор векторов? , чтобы узнать, почему это действительно хорошо для примера с игрушкой):

vector<vector<int>> Mix(const vector<int>& A, const vector<int>& B) {
    vector<vector<int>> result(size(B), vector<int>(size(A)));

    for(size_t i = 0U; i < size(B); ++i) {
        for(size_t j = 0U; j < size(A); ++j) {
            result[i][j] = A[j] * B[i];
        }
    }
    return result;
}

Живой пример

РЕДАКТИРОВАТЬ:

Если вы должны использовать массивы, вы упустите оптимизацию возвращаемого значения.Я бы выбрал это как хороший вариант в следующих ситуациях:

  1. То, что вы ничего не возвращали, в этом случае ваша функция будет выглядеть примерно так:
void Mix(const int* A, const int* B, const size_t size_A, const size_t size_B) 
{
    for(size_t i = 0U; i < size_B; ++i) {
        for(size_t j = 0U; j < size_A; ++j) {
            cout << '[' << i << "][" << j << "]: " << A[j] * B[i] << '\t';
        }
        cout << endl;
    }
}
То, что вы не вызывали функцию, и вы уже получили int A[M] и int B[N] в качестве входных данных и int C[N][M] в качестве выходных данных, и в этом случае встроенный код, вероятно, будет выглядеть примерно так:
for(size_t i = 0U; i < size(B); ++i) {
    for(size_t j = 0U; j < size(A); ++j) {
        C[i][j] = A[j] * B[i];
    }
}
0 голосов
/ 21 мая 2019

С вашим кодом много чего не так.Прежде всего, двумерный массив должен быть объявлен с двумя квадратными скобками, поэтому C [200] [200].В функции Mix логическим оператором является ==, а не = в if (A[I] = B[J]) В любом случае вот функция, которая вам нужна:

#include<iostream>
using namespace std;


void Mix(int A[], int B[], int C[], int N, int M) {
    //dont understand why you used Q
    int i, j;
    for(i=0; i<N; i++) {
        for(j=0; j<M; j++) {
            if(i==j){
                C[i][j] = A[i] * B[j];
            }
            else {
                C[i][j] = A[i] + B[j];
            }
        }
    }
    return C[i][j];
}
int main()
{
    //variable declaration
    int A[100], B[100], C[200], j, i, n, m, l = 0;
    string Comma;

    //input of size of elements for first ararys
    cout << "Enter number of elements you want to insert in first array: ";
    cin >> n;
    cout << "-----------------" << endl;
    cout << "-----------------" << endl;
    cout << "Enter your elements in ascending order" << endl;
    //input the elements of the array
    for (i = 0; i < n; i++)
    {
        cout << "Enter element " << i + 1 << ":";
        cin >> A[i];
    }
    cout << endl << endl;
    //input of size of elements for first ararys
    cout << "Enter number of elements you want to insert in second array: ";
    cin >> m;
    cout << "-----------------" << endl;
    cout << "-----------------" << endl;
    cout << "Enter your elements in descending order" << endl;
    //input the elements of the array
    for (j = 0; j < m; j++)
    {
        cout << "Enter element " << j + 1 << ":";
        cin >> B[j];
    }
    C = Mix(A, B, C, n, m);

    cout << "\nThe Merged Array in Ascending Order" << endl;


    for(i=0; i<n; i++) {
        for(j=0; j<m; j++) {
           cout<<C[i][j]<<" ";
        }
        cout<<"\n" //endline never use endl its 10 times slower
    }

    system("pause");
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...