1

Тема: Обчислити суму членів послідовності (w)

Попередня назва: Допоможіть знайти помилку

https://replace.org.ua/uploads/images/9488/cada5663c43a59b2326589b6f3034580.png

#include "pch.h"
#include <stdio.h>
#include <math.h> 

int main()
{
    int i,k,y;
    printf("k=");
    scanf_s("%i", &k);
    double w = 0,f,u;
    for (i = 1; i <= k; i++)
    {
        if (i != 2)
        {
            f = 1;
            for (y = 1; y <= i + 1; y++)
                f *= y;
            u = (((pow(-1, i)*(i + 1)))*f) / (i*i - 4);
            w += u;
        }
    }
    printf("w=%5.2f", w);    
    return 0;
}

Результати:
k=1
w= 1.33

k=2
w= 1.33

k=3
w=-17.87

k=4
w=32.13

k=10
w=4150720.19

Сумніваюсь в правильності написання коду, плюс результат додавання виходить дуже великий.
Де помилки?

2

Re: Обчислити суму членів послідовності (w)

У вас у числівнику зайве i+1. І зайві дужки. І зайва умова для i==2, у формулі такого немає.

3

Re: Обчислити суму членів послідовності (w)

Мені здається, вам було б непогано трохи розповісти про себе в розрізі програмування. Бо я так бачу, ви намагаєтеся ґрунтовно підходите до питання, але трохи не з того боку. Ви на яку спеціальність навчаєтеся? Плануєте в майбутньому програмувати?

4

Re: Обчислити суму членів послідовності (w)

koala написав:

Мені здається, вам було б непогано трохи розповісти про себе в розрізі програмування. Бо я так бачу, ви намагаєтеся ґрунтовно підходите до питання, але трохи не з того боку. Ви на яку спеціальність навчаєтеся? Плануєте в майбутньому програмувати?

Інженерія програмного забезпечення, 2 курс, фактично 1 місяць вивчаю С++. Оскільки пішов після 9 класу, то зараз мало профільних предметів і доводиться паралельно програмуванню вчити шкільні предмети. Планую програмувати в майбутньому тому намагаюсь акцентувати увагу на математиці і ОП (основи програмування),тому я тут.

5

Re: Обчислити суму членів послідовності (w)

koala написав:

У вас у числівнику зайве i+1. І зайві дужки. І зайва умова для i==2, у формулі такого немає.

int main()
{
    int i,k,y;
    setlocale(LC_CTYPE, "ukr");
    printf("Введiть  значення k=");
    scanf_s("%i", &k);
    double w = 0,f,u;
    for (i = 1; i <= k; i++)
    {
            f = 1;
            for (y = 1; y <= i + 1; y++)
                f *= y;
            u = ((pow(-1, i))*f) / (i*i - 4);
            w += u;
        
    }
    printf("w=%5.2f", w);    
    return 0;
}


  Введiть  значення k=4
w=  inf
Тепер постійно виводить inf

6

Re: Обчислити суму членів послідовності (w)

Це добре, значить є сенс розписувати.
Завдання, які ви тут викладаєте, створюють враження, що вашого викладача ОП колись на уроці інформатики покусав математик :)
Конкретно по цьому завданню - цей вираз не має сенсу при k>=2; можу припустити, що там переплутані числівник і знаменник, тоді ряд непогано сходиться. Можна також припустити, що в знаменнику має бути i2+4, але не думаю, бо тоді воно розбігається, про що ви й питали.

Тепер по коду.
Звісно, можна обчислювати факторіал у кожній ітерації, але можна помітити, що при першій ітерації значення виразу (i+1)! буде 2, при другій - 6, при третій - 24, ..., при i-й він збільшується в i+1 разів. Тобто його можна також накопичувати в окремій змінній, без внутрішнього циклу. Те саме, і навіть простіше, стосується (-1)i - цей вираз просто змінює знак туди-сюди, він не потребує обчислення експоненти. Десь так:

float factorial = 1., sign = 1, total = 0.;
for(int i=1;i<=k;++i)
{
    sign = -sign;
    factorial *= (i+1);
    total += sign * factorial / (i*i-4); //цей вираз треба виправити відповідно до виправлення умови
}
printf("%f",total);

Можна звернути увагу, що нас не дуже цікавлять окремі значення sign та factorial, і їх можна об'єднати:

float signed_factorial = 1., total = 0.;
for(int i=1;i<=k;++i)
{
    signed_factorial *= -(i+1);
    total += signed_factorial  / (i*i-4); //але тоді можуть виникнути проблеми при виправленні виразу
}
printf("%f",total);

Загалом метод обчислення через попереднє значення зветься рекурсією, але в практичному програмуванні ця назва закріпилася за рекурсивними функціями.
І ще раджу давати змінним імена, які щось означають. На наборі ви зекономите значно менше часу, ніж витратите потім на спроби прочитати, що у вас відбувається. Тут добре видно, що обчислюється факторіал зі знаком та загальна сума; що таке f та w - можна лише здогадуватися.

Подякували: leofun01, grinyuk309, fed_lviv3

7

Re: Обчислити суму членів послідовності (w)

Так, там INF. Я ж кажу - при k>=2 вираз не має значення, бо там ділення на нуль відбувається.

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

8

Re: Обчислити суму членів послідовності (w)

koala написав:

Так, там INF. Я ж кажу - при k>=2 вираз не має значення, бо там ділення на нуль відбувається.

Моїй вдячності немає меж! Дякую, що витратили частинку свого час на мене.
у