1

Тема: Масиви у функціях

Завдання:
Розмір масиву 15 цілий тип
Обчислити факторіал першого елемента масиву, значення якого менше 8-ми.

#include "pch.h"
#include <iostream>

    int fact(int arr[], int n)
    {
        for (int i = 0; i < n; i++)
        {
            if (arr[i] < 8)
            {
                return !arr[i];
            }
        }
        return 0;
    }
    

        

int main()
{
    int arr[15];
    printf("Enter array:");
    for (int i = 0; i < 15; i++)
    {
        scanf_s("%i", &arr[15]);
    }
    if (fact(arr,15) == 0)
    {
        printf("error");
    }
    printf("%i", fact(arr, 15));
}

Консоль закривається після введення останнього елемента масиву і нічого не виводить.
У чому проблема?
https://replace.org.ua/uploads/images/9626/69fc4e20562772095b4827233e4b926a.png

2 Востаннє редагувалося P.Y. (09.12.2019 19:43:15)

Re: Масиви у функціях

Мабуть, вас спантеличив знак «!», що в математиці використовується як факторіал, але в Сі це логічний оператор «ні».

                return !arr[i];
Подякували: Bogaty1

3

Re: Масиви у функціях

P.Y. написав:

Мабуть, вас спантеличив знак «!», що в математиці використовується як факторіал, але в Сі це логічний оператор «ні».

                return !arr[i];

А як тоді мені записати факторіал?

4 Востаннє редагувалося koala (09.12.2019 20:01:21)

Re: Масиви у функціях

У вас в умові ж написано: обчислити.
Раджу написати дві функції: першу, що повертає потрібний елемент масиву, і другу, що обчислює факторіал аргумента.

5

Re: Масиви у функціях

koala написав:

У вас в умові ж написано: обчислити.
Раджу написати дві функції: першу, що повертає потрібний елемент масиву, і другу, що обчислює факторіал аргумента.

#include "pch.h"
#include <iostream>

    int min(int arr[], int n)
    {
        for (int i = 0; i < n; i++)
        {
            if (arr[i] < 8)
            {
                return arr[i];
            }
        }
        return 0;
    }
    int f(int x)
    {
        if (x == 0) return 1;
        else return x * f(x - 1);
    }

        

int main()
{
    int arr[15], mini;
    printf("Enter array:");
    for (int i = 0; i < 15; i++)
    {
        scanf_s("%i", &arr[15]);
    }
    if (min(arr,15) == 0)
    {
        printf("error");
    }
    mini = min(arr, 15);
    printf("%i", f(mini));
}


https://replace.org.ua/uploads/images/9626/81b622269fe882287ac9c1ffac4d58ad.png
Функція не повертає начення в x

6

Re: Масиви у функціях

попробуйте замінити функцію fact на таку

unsigned long long fact(int n)
{
    unsigned long long factorial = 1;

    for (int i = 1; i <= n; ++i)
    {
        factorial *= i;
    }

    return factorial;
}

але якщо ви хочете рахувати факторіал дійсно великих чисел можете почитати це

https://www.geeksforgeeks.org/factorial-large-number/

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

7

Re: Масиви у функціях

Зрозумів чому вибиває помилка

#include "pch.h"
#include <iostream>

    int min(int arr[], int n)
    {
        bool x = false;
        int y;
        for (int i = 0; i < n; i++)
        {
            if(x==false)
                if (arr[i] < 8)
                {
                    y=arr[i];
                    x = true;
                }
        }
        return y ;
    }
    unsigned long long fact(int n)
    {
        unsigned long long factorial = 1;

        for (int i = 1; i <= n; ++i)
        {
            factorial *= i;
        }

        return factorial;
    }

        

int main()
{
    int arr[15], mini;
    printf("Enter array:");
    for (int i = 0; i < 15; i++)
    {
        scanf_s("%i", &arr[i]); // в цьому місті я звертався до індекса масиву тобто до 15, а не до значення і :D
    }
    if (min(arr,15) == 0)
    {
        printf("error");
    }
    mini = min(arr, 15);
    printf("%i\n", fact(mini));
    system("pause");
    return 0;
}

8

Re: Масиви у функціях

У вас, схоже, нав'язлива ідея додавати змінні x та y :)
По-перше, як гадаєте, що поверне ваша функція min, якщо в масиві не буде потрібного елемента?
По-друге, для булевих змінних x==false краще записувати як !x (читається "не x").
По-третє, оскільки це цикл C++, а x зміниться лише один раз, ми можемо змінити умову продовження замість if:

        for (int i = 0; !x && (i < n); i++)
        {
            if (arr[i] < 8)
            {
                y=arr[i];
                x = true;
            }
        }

але це не потрібно, бо насправді, щойно ми знайшли потрібне arr[ i ], можна просто вийти з функції:

        for (int i = 0; i < n; i++)
        {
            if (arr[i] < 8)
            {
                return arr[i];
            }
        }

Так, це порушує принципи структурного програмування, але в такій простій конструкції це порушення цілком виправдане.
Лишається тільки питання, що повернути, якщо потрібного числа немає. Можна 8, arr[0] чи arr[n-1] - вони всі будуть не задовільняти умові, і це можна відстежити. Я б повертав INT_MAX з <climits> - очевидно неправильне значення, тільки десь треба перевіряти, що повертається коректне значення.

#include <climits>
int min(int arr[], int n)
{
    for (int i = 0; i < n; i++)
        if (arr[i] < 8)
                return arr[i];
    return INT_MAX;
}

Просто й елегантно.

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