1

Тема: Цикл While

Я студент, математику не дуже шарю. Як написати це завдання? Взагалі не знаю що дальше.

https://replace.org.ua/uploads/images/10645/c4783cf1f3f5c4a6b4f0dfd5be4daddf.jpg



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

int main()
{

while(true)
{
    double x, a;
    scanf("%lf %lf",&x, &a);
    printf("Sum = %lf\n", exp(cos(a+x)/a));
}
    return 0;
}

2

Re: Цикл While

ще раз уважно прочитай умову

3

Re: Цикл While

Ну, я теж чесно кажучи не знаю :) Для початку перевір вхідні дані:

if(x!=0 && a!=0 && e > 0); else return 0;

4

Re: Цикл While

вечір шкідливих порад пропоную вважати відкритим...
комп ти сам зрозумів, що написав?

5

Re: Цикл While

ur_naz написав:

вечір шкідливих порад пропоную вважати відкритим...
комп ти сам зрозумів, що написав?

А що не зрозуміло?

;//пуста операція аналог:
bool check=0;
if(x!=0 && a!=0 && e>0) check=1;
else return 0;

Ну може не нулик повертаємо а наприклад

#define ERROR -1
...
else return -1;

Можемо повідомлення вивести:

else printf("Error! Must be x!=0, a!=0, e>0");

Але так простіше

6

Re: Цикл While

Правильно?

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>



int main ()
{
    int k = 0;
    double a,x,e;
    printf("print a, x, e:\n");
    scanf("%lf%lf%lf", &a, &x, &e);
         a = 1;
    long long fact = 1;

    double cosx=(cos(a+x));
    double cosxak=cosx;

    double sum1,sum2 =(cosx / (fact));
    while(1) {

        k++;
        sum1 = sum2;
        fact=fact*k;
        sum2+= (cosxak / (a + (double)fact));
        if(fabs(sum1-sum2) < e)
        {
            break;
        }
    }
    printf("sum = %lf k = %d\n",sum2,k);


    return 0;
}

7

Re: Цикл While

взагалі тут ніяких циклів не потрібно  :D Хто знає чому, тому цукерку

8

Re: Цикл While

scanf("%lf%lf%lf", &a, &x, &e);
         a = 1;

Неправильно

9

Re: Цикл While

#include <stdio.h>
#include <stdlib.h>
#include <math.h>



int main ()
{
    int k = 0;
    double a,x,e;
    printf("print a, x, e:");
    scanf("%lf%lf%lf", &a, &x, &e);
  
    long long fact = 1;

    double cosx=(cos(a+x));
    double cosxak=cosx;

    double sum1,sum2 =(cosx / (fact));
    while(1) {

        k++;
        sum1 = sum2;
        fact=fact*k;
        sum2+= (cosxak / (a + (double)fact));
        if(fabs(sum1-sum2) < e)
        {
            break;
        }
    }
    printf("sum = %lf k = %d\n",sum2,k);


    return 0;
}

10 Востаннє редагувалося koala (22.11.2020 22:39:00)

Re: Цикл While

ur_naz, тут завдання не лише обчислити значення ecos(a+x)/a, а ще й кількість членів ряду до досягнення точності. А ряд не знакозмінний. Хоч би вказали, у якій формі остаточний член шукати - Коші чи Лагранжа.

11 Востаннє редагувалося koala (22.11.2020 22:57:42)

Re: Цикл While

walik691, у таких обчисленнях зазвичай легше знайти рекурсивний вираз, тобто як поточний (i-й) член ряду обчислюється з попереднього(i-1 -го). Тоді величезний факторіал стає непотрібним (що збільшує точність і швидкість обчислень).

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

12 Востаннє редагувалося ur_naz (22.11.2020 23:07:06)

Re: Цикл While

тут важливо лише з якою швидкістю він збігається. Тож максимальна кількість циклів 21. трохи раніше не вистачить точності double, тож в принципі можна обійтися без циклів за допомоги if  :D
і щось я не зрозумів про експоненту

13

Re: Цикл While

Тоді я не зрозумів про цукерку.
Там же підстановкою y=cos(a+x)/a отримуємо суму по k від 0 до нескінченості yk/k!, а це ey. Чи я щось наплутав?

А як ви швидкість збіжності отримали? При маленьких a (1e-12, скажімо) там буде досить погана збіжність, поки факторіал не перекриє експоненту.

14

Re: Цикл While

мабуть наплутав... у чисельнику завжди число не більше 1, тож в середньому вартість члена ряду буде зменшуватись на порядок. десь після 15 циклу наступні вже будуть не потрібні