1

Тема: Функція с++

Створити фунцкію яка визначає добуток елементів прямокутної матриці в тих рядках, які не
містять від’ємних елементів, а також максимум серед сум елементів
діагоналей, паралельних головній діагоналі матриці.

2

Re: Функція с++

П.3.5 Правил
Усе погано.

Подякували: Taras_2000, leofun012

3

Re: Функція с++

Я тільки недавно  почав вивчати С++
Якщо потрібно, тримай ( ніби працює )

Прихований текст
/*
Створити фунцкію яка визначає добуток елементів прямокутної матриці в тих рядках, які не
містять від’ємних елементів, а також максимум серед сум елементів
діагоналей, паралельних головній діагоналі матриці. 
*/
#include <iostream>
#include <algorithm>

using namespace  std;

int const m = 5;
int const n = 3;

int Matrix[m][m] = {{ 1, 1, 2, 10, 18},{-8, 8, 0, 16, -2},{45, 43, 1, 34, 91}};
int Sum_diagonal[m];


int product_of_elements(int i)
{    
    int product;

    product = 1;

    for (int j = 0; j < m; ++j)
    {
        if (Matrix[i][j] < 0)
        {
            return -1;
        }
        
        product = product * Matrix[i][j];
    }

    return product;
}


int sum_diagonal_i(int i)
{
    int sum;
    sum = 0;
    for (int j = 0; j < n; ++j)
    {
        sum += Matrix[j][i+1];
        i++;
    }

    return sum;
}


int max_sum()
{
    int max;

    sort(Sum_diagonal, Sum_diagonal+m);
    reverse(Sum_diagonal, Sum_diagonal+m);

    max = Sum_diagonal[0];

    return max;
}


int main()
{
    int product;
    int sum_i;
    int max;

    cout << "Добуток елементів прямокутної матриці в тих рядках,\nякі не містять від’ємних елементів:\n";

    for (int i = 0; i < n; ++i)
    {
        product = product_of_elements(i);

        if (product != -1)
        {
            cout << product << endl;
        }
    }

    cout << "максимум серед сум елементів діагоналей, паралельних головній діагоналі матриці:\n";

    for (int i = 0; i < m; ++i)
    {
        sum_i = sum_diagonal_i(i);
        Sum_diagonal[i] = sum_i;
    }

    max = max_sum();
    cout << max << endl;

    return 0;
}
Подякували: Taras_20001

4

Re: Функція с++

мда...

int const m = 5;
int const n = 3;

int Matrix[m][m]

Подякували: leofun011

5

Re: Функція с++

ur_naz написав:

мда...

int const m = 5;
int const n = 3;

int Matrix[m][m]

а що нетак?

далі в коді щоб не виникло магічних чисел використовуются змінні m та n

6

Re: Функція с++

ur_naz написав:

мда...

int const m = 5;
int const n = 3;

int Matrix[m][m]

Він тільки недавно  почав вивчати С++ і ще погано розрізняє літери ;)

7 Востаннє редагувалося "mamkin haker" (12.05.2021 22:16:38)

Re: Функція с++

koala написав:
ur_naz написав:

мда...

int const m = 5;
int const n = 3;

int Matrix[m][m]

Він тільки недавно  почав вивчати С++ і ще погано розрізняє літери ;)

коли я пишу замість [m][m] [n][m] то воно показує дивні цифри :D тому, так задумано

8 Востаннє редагувалося Droid 77 (12.05.2021 22:25:20)

Re: Функція с++

Так тоді розмір матриці 5х5, а не 3х5.  *SCRATCH* магія  8)

9 Востаннє редагувалося "mamkin haker" (12.05.2021 22:28:15)

Re: Функція с++

Droid 77 написав:

Так тоді розмір матриці 5х5, а не 3х5.  магія

так і було задумано :D

10

Re: Функція с++

mamkin haker написав:

воно показує дивні цифри

Значить, щось ви не так робите. Швидше за все - читаєте з-за меж масиву.

mamkin haker написав:

так і було задумано

Ні, не було.

Подякували: "mamkin haker"1

11

Re: Функція с++

koala написав:
mamkin haker написав:

воно показує дивні цифри

Значить, щось ви не так робите. Швидше за все - читаєте з-за меж масиву.

Знайшов і виправив, ось кінцевий результат

Прихований текст
#include <iostream>
#include <algorithm>

using namespace  std;

int const m = 5;
int const n = 3;

int Matrix[n][m] = {{ 1, 1, 2, 10, 18},{-8, 8, 0, 16, -2},{45, 43, 1, 34, 91}};
int Sum_diagonal[m];


int product_of_elements(int i)
{    
    int product;

    product = 1;

    for (int j = 0; j < m; ++j)
    {
        if (Matrix[i][j] < 0)
        {
            return -1;
        }
        
        product = product * Matrix[i][j];
    }

    return product;
}


int sum_diagonal_i(int i)
{
    int sum;
    sum = 0;
    for (int j = 0; j < n; ++j)
    {
        i++;
        sum += Matrix[j][i];
    }

    return sum;
}


int max_sum()
{
    int max;

    sort(Sum_diagonal, Sum_diagonal+m);
    reverse(Sum_diagonal, Sum_diagonal+m);

    max = Sum_diagonal[0];

    return max;
}


int main()
{
    int product;
    int sum_i;
    int max;

    cout << "Добуток елементів прямокутної матриці в тих рядках,\nякі не містять від’ємних елементів:\n";

    for (int i = 0; i < n; ++i)
    {
        product = product_of_elements(i);

        if (product != -1)
        {
            cout << product << endl;
        }
    }

    cout << "максимум серед сум елементів діагоналей, паралельних головній діагоналі матриці:\n";

    for (int i = 0; i < n; ++i)
    {
        sum_i = sum_diagonal_i(i);
        Sum_diagonal[i] = sum_i;
    }

    max = max_sum();
    cout << max << endl;

    return 0;
}
Подякували: tchort1

12

Re: Функція с++

Такс вибачаюся за мої бздури але ось гарний код

#include <iostream>
#include <utility> // для std::pair


struct Name // структура імені людини
{
    char surname[50]; // фамілія
    char name[50]; // ім'я
    char father[50]; //по-батькові
};

void addBackElem(std::pair<char*, int>*& arr, int& n, char* newName) // функція, що додає в кінець масиву arr, розміром n новий елемент newName
{
    std::pair<char*, int>* bufArr = new std::pair<char*, int>[n + 1];
    for (size_t i = 0; i < n; i++)
    {
        bufArr[i] = arr[i];
    }
    bufArr[n] = { newName, 1 };
    if (arr) delete[] arr;
    arr = bufArr;
    n++;
}

int main()
{
    system("chcp 1251 && cls"); // для укр мови
    const int qNames = 4; // кількість імен
    Name* structNames = new Name[qNames]; // створюємо массив структур імен
    for (size_t i = 0; i < qNames; i++)
    {
        char tempName[200]; // для вводу строки імені
        std::cout << "Введіть ім'я номер " << i + 1 << ": ";
        gets_s(tempName); // вводимо ПІБ


        int j = 0;
        while (tempName[j] == ' ') // поки пробіл
        {
            j++;
        }
        int k = 0;
        while (tempName[j] != '\0' && tempName[j] != ' ') // поки не кінець строки, або поки не пробіл
        {
            structNames[i].surname[k] = tempName[j]; // зчитуємо кожний символи з tempName у structNames[i].surname
            k++;
            j++;
        }
        structNames[i].surname[k] = '\0';// не забуваэмо про нуль термінатор, що означає кінець строки

        while (tempName[j] == ' ') // поки пробіл
        {
            j++;
        }
        k = 0;
        while (tempName[j] != '\0' && tempName[j] != ' ') // поки не кінець строки, або поки не пробіл
        {
            structNames[i].name[k] = tempName[j]; // зчитуємо кожний символи з tempName у structNames[i].name
            k++;
            j++;
        }
        structNames[i].name[k] = '\0';// не забуваэмо про нуль термінатор, що означає кінець строки

        while (tempName[j] == ' ') // поки пробіл
        {
            j++;
        }
        k = 0;
        while (tempName[j] != '\0' && tempName[j] != ' ') // поки не кінець строки, або поки не пробіл
        {
            structNames[i].father[k] = tempName[j]; // зчитуємо кожний символи з tempName у structNames[i].father
            k++;
            j++;
        }
        structNames[i].father[k] = '\0'; // не забуваэмо про нуль термінатор, що означає кінець строки
    }

    std::pair<char*, int>* arr = nullptr; // створюємо массив arr з типом елементів std::pair<char*, int>, де (char*) - ім'я, (int) - кількість такого імені
    int N = 0; // розмір массиву arr
    for (size_t i = 0; i < qNames; i++) // йдемо по масиву структур з іменами
    {
        bool flag = false; // для знаходження імені
        for (size_t j = 0; j < N; j++) // йдемо по масиву імен і їх кількості
        {
            if (strcmp(structNames[i].name, arr[j].first) == 0) // якщо таке ім'я є(first - перше значення в std::pair)
            {
                flag = true;
                arr[j].second++;// додаємо 1 до кількості таких імен(second - друге значення в std::pair)
            }
        }
        if (!flag) // якщо такого імйя не знайшлось
        {
            addBackElem(arr, N, structNames[i].name); // то додаємо його в кінець з кількістю 1
        }
    }
    int min = arr[0].second;
    for (size_t i = 0; i < N; i++) // йдемо по масиву імен і їх кількості
    {
        if (arr[i].second < min) // шукаємо мінімальну кількість
        {
            min = arr[i].second;
        }
    }
    std::cout << "Ім'я, що повторюються менш за все: ";
    for (size_t i = 0; i < N; i++) // йдемо по масиву імен і їх кількості
    {
        if (arr[i].second == min) // якщо кількість таких імен додівнює min
        {
            std::cout << arr[i].first << "   "; // то выводимо це ім'я
        }
    }

    delete[]structNames;
    return 0;
}

13

Re: Функція с++

До чого цей код до цієї гілки?

14

Re: Функція с++

ойойой переплутав файли це до іншого
А тут є нормальний код

int sum_rows(int** arr, int rows, int columns)
{
    cout << "Product of elements,\nwhich do not contain negative elements:\n";

    for (int i = 0; i < rows; ++i)
    {
        bool flag = false;
        int temp_ = 1;
        for (int j = 0; j < columns; ++j)
        {
            if (arr[i][j] < 0)
            {
                flag = true;
                break;
            }
            temp_ = temp_ * arr[i][j];
        }
        if (!flag)
        {
            cout << i + 1 << "row:  " << temp_ << endl;
        }
        else
        {
            cout << i + 1 << "row:  gap" << endl;
        }
    }
    cout << endl;
    return 1;
}
void diagonal(int** arr, int rows, int columns)
{
    //int sum = 0;
    int tempSum = 0;
    int maxSum = MIN_INT;

    for (int i, k = 1; k < rows; k++)
    {
        tempSum = 0;
        i = 0;
        for (int j = k; j < columns; j++)
        {

            tempSum = tempSum + arr[i][j];

            i++;

        }
        if (maxSum < tempSum)
        {
            maxSum = tempSum;
        }
    }
    for (int i, k = 1; k < rows; k++)
    {
        tempSum = 0;
        i = k;
        for (size_t j = 0; j < columns - k; j++)
        {
            tempSum = tempSum + arr[i][j];

            i++;
        }
        if (maxSum < tempSum)
        {
            maxSum = tempSum;
        }
    }
    cout << "maximum among the sums of the elements of the diagonals,parallel to the main diagonal of the matrix:\n";
    cout << maxSum << endl;
    system("PAUSE");


}

15

Re: Функція с++

Taras_2000 написав:

Такс вибачаюся за мої бздури але ось гарний код

Прихований текст
#include <iostream>
#include <utility> // для std::pair


struct Name // структура імені людини
{
    char surname[50]; // фамілія
    char name[50]; // ім'я
    char father[50]; //по-батькові
};

void addBackElem(std::pair<char*, int>*& arr, int& n, char* newName) // функція, що додає в кінець масиву arr, розміром n новий елемент newName
{
    std::pair<char*, int>* bufArr = new std::pair<char*, int>[n + 1];
    for (size_t i = 0; i < n; i++)
    {
        bufArr[i] = arr[i];
    }
    bufArr[n] = { newName, 1 };
    if (arr) delete[] arr;
    arr = bufArr;
    n++;
}

int main()
{
    system("chcp 1251 && cls"); // для укр мови
    const int qNames = 4; // кількість імен
    Name* structNames = new Name[qNames]; // створюємо массив структур імен
    for (size_t i = 0; i < qNames; i++)
    {
        char tempName[200]; // для вводу строки імені
        std::cout << "Введіть ім'я номер " << i + 1 << ": ";
        gets_s(tempName); // вводимо ПІБ


        int j = 0;
        while (tempName[j] == ' ') // поки пробіл
        {
            j++;
        }
        int k = 0;
        while (tempName[j] != '\0' && tempName[j] != ' ') // поки не кінець строки, або поки не пробіл
        {
            structNames[i].surname[k] = tempName[j]; // зчитуємо кожний символи з tempName у structNames[i].surname
            k++;
            j++;
        }
        structNames[i].surname[k] = '\0';// не забуваэмо про нуль термінатор, що означає кінець строки

        while (tempName[j] == ' ') // поки пробіл
        {
            j++;
        }
        k = 0;
        while (tempName[j] != '\0' && tempName[j] != ' ') // поки не кінець строки, або поки не пробіл
        {
            structNames[i].name[k] = tempName[j]; // зчитуємо кожний символи з tempName у structNames[i].name
            k++;
            j++;
        }
        structNames[i].name[k] = '\0';// не забуваэмо про нуль термінатор, що означає кінець строки

        while (tempName[j] == ' ') // поки пробіл
        {
            j++;
        }
        k = 0;
        while (tempName[j] != '\0' && tempName[j] != ' ') // поки не кінець строки, або поки не пробіл
        {
            structNames[i].father[k] = tempName[j]; // зчитуємо кожний символи з tempName у structNames[i].father
            k++;
            j++;
        }
        structNames[i].father[k] = '\0'; // не забуваэмо про нуль термінатор, що означає кінець строки
    }

    std::pair<char*, int>* arr = nullptr; // створюємо массив arr з типом елементів std::pair<char*, int>, де (char*) - ім'я, (int) - кількість такого імені
    int N = 0; // розмір массиву arr
    for (size_t i = 0; i < qNames; i++) // йдемо по масиву структур з іменами
    {
        bool flag = false; // для знаходження імені
        for (size_t j = 0; j < N; j++) // йдемо по масиву імен і їх кількості
        {
            if (strcmp(structNames[i].name, arr[j].first) == 0) // якщо таке ім'я є(first - перше значення в std::pair)
            {
                flag = true;
                arr[j].second++;// додаємо 1 до кількості таких імен(second - друге значення в std::pair)
            }
        }
        if (!flag) // якщо такого імйя не знайшлось
        {
            addBackElem(arr, N, structNames[i].name); // то додаємо його в кінець з кількістю 1
        }
    }
    int min = arr[0].second;
    for (size_t i = 0; i < N; i++) // йдемо по масиву імен і їх кількості
    {
        if (arr[i].second < min) // шукаємо мінімальну кількість
        {
            min = arr[i].second;
        }
    }
    std::cout << "Ім'я, що повторюються менш за все: ";
    for (size_t i = 0; i < N; i++) // йдемо по масиву імен і їх кількості
    {
        if (arr[i].second == min) // якщо кількість таких імен додівнює min
        {
            std::cout << arr[i].first << "   "; // то выводимо це ім'я
        }
    }

    delete[]structNames;
    return 0;
}

Vidtcuv peredoz Vajliv zamistj Foriv.

16

Re: Функція с++

1. flag - погане ім'я для прапорця. Може, краще negativeFound?
2. temp_ - ще гірше. Це ж добуток, product, правильно? А _ в кінці що покликано означати? Іноді так позначають елементи класу, але ж це не той випадок.
3. Використовуйте += і *=, це зручно.
4. Якщо функція завжди повертає 1, то нащо це значення потрібне? Повертайте void, на return-і зекономите. Або, оскільки це C++, повертайте std::vector з добутками, обчислювати і виводити в одній функції - погано. Хоча з пропусками тоді щось треба робити.
5. Маленька таємниця:

        if (maxSum < tempSum)
        {
            maxSum = tempSum;
        }

значно красивіше записується як

maxSum = std::max(maxSum, tempSum);

Ну і в цілому переходьте вже на std::vector та std::string, якщо ви на C++ пишете.

Подякували: leofun011