1

Тема: Що означає знак оклику ? (k!)

Попередня назва: Як це розв'язувати?

https://replace.org.ua/uploads/images/9488/05ff0552017538761342f9b9494cccc1.png
Що означає знак оклику k!cos(x)??
Я не знаю як розв'язувати такі завдання, а код я написав на основі прикладу розв'язання схожого завдання.
Помилок компілятор не показує, але результат виконання завжди рівний нулю. Де помилки і що виправити?

#include "pch.h"
#include <iostream>
#include <math.h>
#define M_PI 3.141592
int main()
{
    double s = 0, u, x;
    int i, k, f;
    setlocale(LC_CTYPE, "ukr");
    printf("Введiть х:");
    scanf_s("%d", &x);
    for (i = 1; i <= 7; i++) 
    {
        f = 1;
        for (k = 1;k <= i;k++)
            u = (k*!cos(k*M_PI - x))/log(x);
        s += u;

    }
    printf("Сума=%d", s);
    return 0;
}

2

Re: Що означає знак оклику ? (k!)

https://uk.wikipedia.org/wiki/Факторіал
В C/C++ ! - це логічна інверсія, оператор НЕ. А оскільки cos практично завжди ненульовий, логічна інверсія від нього - 0. Що й маєте.

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

3

Re: Що означає знак оклику ? (k!)

koala написав:

https://uk.wikipedia.org/wiki/Факторіал
В C/C++ ! - це логічна інверсія, оператор НЕ. А оскільки cos практично завжди ненульовий, логічна інверсія від нього - 0. Що й маєте.

Отже, наскільки я зрозумів в мене постійно чисельник рівний нулю і тому кінцевий результат теж 0? Але навіть якщо прибрати '!' результат не змінюється. Потрібні кариднальні зміні коду чи тільки деякі виправлення?

4

Re: Що означає знак оклику ? (k!)

Спершу трохи математики.
ln(x) від k не залежить і його можна винести з суми. Консинус має деякі гарні властивості, такі, як періодичність, з яких можна вивести, що cos(k*PI-x) буде набувати значень cos(PI-x)=-cos(x) та cos(2*PI-x)=cos(-x)=cos(x) залежно від парності k. cos(x) також не залежить від k, і його теж можна винести. Відтак, ми маємо вираз
cos(x)/ln(x)*sum(-1k*k! при k від 1 до 7).
Тепер можна перейти до обчислень. В принципі, оскільки вираз в циклі не залежить від x, ми можемо його обчислити один раз і підставити:

#include "pch.h"
#include <iostream>
#include <cmath> //math.h - це заголовок C, а у нас C++

int main()
{
    setlocale(LC_CTYPE, "ukr");
    std::cout <<"Введiть х:";
    double x;
    std::cin >> x; //а ви вводили double x як "%d", тобто ціле
    /* //закоментований код слід виконати один раз і підставити результат
    int factorial_sum = 0, factorial = 1;
    for (int k = 1; k <= 7; k++) 
    {
        factorial *= -k;
        factorial_sum += factorial;
    }
    std::cout<<"Сума факторіалів:" << factorial_sum;*/
    double factorial_sum = -4421.; //отримано в закоментованому коді
    double result = cos(x) * factorial_sum / log(x);
    std::cout<<"Сума = "<<result;
    return 0;
}
Подякували: grinyuk309, leofun012

5

Re: Що означає знак оклику ? (k!)

koala написав:

Спершу трохи математики.
ln(x) від k не залежить і його можна винести з суми. Консинус має деякі гарні властивості, такі, як періодичність, з яких можна вивести, що cos(k*PI-x) буде набувати значень cos(PI-x)=-cos(x) та cos(2*PI-x)=cos(-x)=cos(x) залежно від парності k. cos(x) також не залежить від k, і його теж можна винести. Відтак, ми маємо вираз
cos(x)/ln(x)*sum(-1k*k! при k від 1 до 7).
Тепер можна перейти до обчислень. В принципі, оскільки вираз в циклі не залежить від x, ми можемо його обчислити один раз і підставити:

#include "pch.h"
#include <iostream>
#include <cmath> //math.h - це заголовок C, а у нас C++

int main()
{
    setlocale(LC_CTYPE, "ukr");
    std::cout <<"Введiть х:";
    double x;
    std::cin >> x; //а ви вводили double x як "%d", тобто ціле
    /* //закоментований код слід виконати один раз і підставити результат
    int factorial_sum = 0, factorial = 1;
    for (int k = 1; k <= 7; k++) 
    {
        factorial *= -k;
        factorial_sum += factorial;
    }
    std::cout<<"Сума факторіалів:" << factorial_sum;*/
    double factorial_sum = -4421.; //отримано в закоментованому коді
    double result = cos(x) * factorial_sum / log(x);
    std::cout<<"Сума = "<<result;
    return 0;
}

Дякую, але фішка в тому, що я ще не вчив ні факторіалів, ні періодичність тригонометричних функцій та ще й в додаток потрібно використовувати саме вкладений цикл, тому голова зараз кипить) Та в загальному я зрозумів код, тільки візуал свариться через дворазове оголошення factorial_sum

6 Востаннє редагувалося koala (03.11.2019 21:58:47)

Re: Що означає знак оклику ? (k!)

grinyuk309 написав:

тільки візуал свариться через дворазове оголошення factorial_sum

Свариться, бо треба прибрати друге оголошення.
А взагалі у вашого викладача неправильний метод викладання. Сильно неправильний. Математичні формули використовують для навчання програмуванню, бо математика - найбільш впорядкований шкільний предмет, і можна легко запрограмувати багато речей; але немає сенсу давати учням нові розділи математики виключно для того, щоб навчити їх програмувати. Вам уже давно треба переходити до масивів і стрічок.