1 Востаннє редагувалося Eff1c (25.11.2018 16:38:14)

Тема: незрозуміла умова задачі

Моя задача:
Протабулювати функцію y=f(x)задану системою рівнянь на проміжку [-2; і] з кроком h=0.1*і, де і -номер варіанта.
***Тут має бути система, яка прикріплена в файлі
Результати обчислень вивести на екран у вигляді таблиці пар чисел х, у.
1.    Виконати  пошуку даних. Якщо шуканих даних немає, вивести про це повідомлення.   Обчислити суму усіх значень функції у, для яких виконуються нерівності y<1,2 або y>4. Визначити максимальне значення функції.

Мій розв'язок:

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    double y, x = -2, i = 11, h = 0.1 * i, n = 0, max_y = 0;
    while (x <= i)
    {
        if (x >= 0 and x <= 1)
        {
            y = pow(cos(x), 2) - cos(x * x);
        }
        if (-2 <= x and x <= 0)
        {
            y = cos(x * x * x) + cos(2 * x);
        }
        x = x + h;
        cout << x << " " << y << endl;
        if (y < 1.2 || y > 4) n = n + x;
        if (y > max_y) max_y = y;
    }
    cout << "sum y<1.2 or y>4 :";
    cout << n << endl;
    cout << "max y: " << max_y;
}

Все робить, але є 2 проблемки...
1-ша - в мене 11 варіант і по умові задачі він не розрахований під умову...
2-га - не розумію про яуий саме пошук мається на увазі? Тобто зберегти це в масиві і потім зробити можливість витягати значення по порядковому номеру чи що?

Я б спитав би це все в викладача, але може бути пізно... Тому якщо хтось розуміє - поясніть будь ласка. ;)

Post's attachments

xxx.docx 14.51 kb, 299 downloads since 2018-11-25 

2

Re: незрозуміла умова задачі

1. Переказуйте великий привіт викладачеві, там немає системи рівнянь. Це функція, задана на проміжках.
2. Ви при розрахунку функції двічі обчислюєте її значення в 0. Втім, це не ваша помилка - так в умові. Ще раз переказуйте великий привіт викладачеві.
3. Функція не задана при x<-2 або 1<x. Треба окремо обробляти ці випадки і писати "функція не визначена" - а у вас зберігається останнє значення. До речі, раджу саме таку форму об'єднання кількох порівнянь з однією змінною - зі знаками < (чи <=) та впорядковану за зростанням; це покращує читанабельність, порівняйте if-и у вашому коді.
4. Так, швидше за все малося на увазі зберігати результати табулювання і шукати по них.

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

3

Re: незрозуміла умова задачі

Дякую  :)

koala написав:

Ви при розрахунку функції двічі обчислюєте її значення в 0. Втім, це не ваша помилка - так в умові. Ще раз переказуйте великий привіт викладачеві.

Да, доволі дивна і смішна ситуація  :)   Наша освіта...

koala написав:

До речі, раджу саме таку форму об'єднання кількох порівнянь з однією змінною - зі знаками < (чи <=) та впорядковану за зростанням; це покращує читанабельність, порівняйте if-и у вашому коді.

Не зрозумів  *SCRATCH*

4

Re: незрозуміла умова задачі

Що означає sh ?

Post's attachments

xxx2.docx 14.48 kb, 220 downloads since 2018-11-25 

5

Re: незрозуміла умова задачі

Гіперболічний синус

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

6

Re: незрозуміла умова задачі

Eff1c написав:

Не зрозумів  *SCRATCH*

(-2 <= x and x <= 0) // - добре
(x >= 0 and x <= 1) //- погано
//краще
(0 <= x and x <= 1)
//Якщо треба перевірити, що щось за межами проміжку, то
(x <-2 or 3 < x)

У такій формі воно більш схоже на математичний запис -2<=x<=0, 0<=x<=1 і легше читається.

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

7 Востаннє редагувалося Eff1c (27.11.2018 21:25:36)

Re: незрозуміла умова задачі

Можете будь ласка допомогти з написанням коду пошуку. Так, хочу зробити через масив, але проблема в тому, що не знаю як це записати. Хочу записувати в масив кожний вивід циклу в вигляді строки, але я не знаю як перетворити змінну з цифрою, на строку з тою цифрою, щоб зберегти в масиві... Можете хоча б навести приклад?
Зараз мій код виглядає якось так:

#include <iostream>
#include <math.h>
#include <string>
using namespace std;

int main()
{
    double y, x = -2, i = 11, h = 0.1 * i, n = 0, max_y = 0;
    int k = 0;
    string s[11];
    while (x <= i)
    {
        if (0 <= x and x <= 1)
        {
            y = pow(cos(x), 2) - cos(x * x);
            cout << x << " " << y << endl;
            if (y < 1.2 || y > 4) n = n + x;
            if (y > max_y) max_y = y;
            s[k] = ("%f %f", x, y);
        }
        if (-2 <= x and x <= 0)
        {
            y = cos(x * x * x) + cos(2 * x);
            cout << x << " " << y << endl;
            if (y < 1.2 || y > 4) n = n + x;
            if (y > max_y) max_y = y;
            s[k] = ("%f %f", x, y);
        }
        if (-2 > x or x > 1)
        {
            cout << "Function not defined" << endl;
            s[k] = "Function not defined";
        }
        x = x + h;
        k++;
    }
    cout << "search: ";
    cin >> k;
    cout << s[k] << endl;
    cout << "sum y<1.2 or y>4 :";
    cout << n << endl;
    cout << "max y: " << max_y;
    return 0;
}

Ps. Розумію, що погано читабельний, але який є...

8

Re: незрозуміла умова задачі

Пошук, гадаю, виглядатиме так: ви вводите x, програма знаходить в масиві відповідне y. А ви ще хочете зберігати в масиві значення "Function not defined" у відповідних комірках. Теоретично, тут може згодитися значення NaN; але варіант зі стрічками теж прийнятний. Але не зрозуміло, як тоді шукати. Те, що у вас - це не пошук, бо введене значення k не знаходиться в таблиці.
Можна зробити так: значення при x=-2+1.1*k знаходиться в k-му рядку таблиці. Тоді таблиця дуже проста:

double s[3];
...
cin>>x;
double k = (x+2)/1.1;
if(k-int(k)<1e9){
  if(-2<=x && x<=1){
    cout<<s[k];
  } else {
    функція не визначена
  }
} else {
  значення в таблиці немає
}

Також можна зробити два масиви - x та y:

double m_x[11];
string m_y[11];
while(...){
  отримуємо k (номер ітерації), x та y
  m_x[k]=x;
  stringstream ss; //стрічковий потік - стандартний спосіб перетворення на стрічки в C++
  ss<<y; 
  m_y[k] = ss.str();//або m_y[k]="Not found"
  cout<<x<<" "<<m_y[k];
}
а потім - шукати:
cin>>x;
for(int k=0;k<11;++k)
{
  if(m_x[k]==x){
    cout<<m_x[k]<<" "<<m_y[k];
    break;
  }
}

Тип char зберігає рівно один символ, тому нам зовсім не підходить; також для стрічок можна використати масив char-ів, тоді буде

char m_y[11][21];//довжина стрічки - до 20 символів, 21-й - символ з кодом 0, що позначає кінець стрічки

Виводити щось в такі стрічки можна за допомогою функції

sprintf(m_y[k],"%f",y);
Подякували: Eff1c1

9

Re: незрозуміла умова задачі

Дякую. Все запрацювало :)
Але робив схожу задачку і виникла проблема...
Код:

#include "pch.h"
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    double y, x = -2, i = 23, h = 0.1 * i;
    double s[3];
    int p = 0;
    while (x <= i)
    {
        if (0 <= x and x <= 1)
        {
            y = pow(cos(x), 2) - cos(x * x);
            cout << x << " " << y << endl;
            s[p] = y;
            p++;
        }
        if (-2 <= x and x <= 0)
        {
            y = cos(x * x * x) + cos(2 * x);
            cout << x << " " << y << endl;
            s[p] = y;
            p++;
        }
        if (-2 > x or x > 1)
        {
            cout << "Function not defined" << endl;
        }
        x = x + h;
    }
    cout << "search: ";
    cin >> x;
    double k = (x + 2) / 1.1;
    if (k - int(k) < 1e9)
    {
        if (-2 <= x and x <= 1)
        {
            int o = k;
            cout << s[o] << endl;
        }
        else if (-2 <= x and x <= i)
        {
            cout << "Function not defined" << endl;
        }
        else cout << "No value" << endl;
    }
    else cout << "No value" << endl;
    return 0;
}


Вивід:

-2 -0.799144
0.3 -0.0832849
Function not defined
Function not defined
Function not defined
Function not defined
Function not defined
Function not defined
Function not defined
Function not defined
Function not defined
search: 0.3
-9.25596e+61

Чому виводить -9.25596e+61 а не -0.0832849?

10

Re: незрозуміла умова задачі

double k = (x + 2) / 1.1;

Що ви тут обчислюєте?

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

11

Re: незрозуміла умова задачі

koala написав:
double k = (x + 2) / 1.1;

Що ви тут обчислюєте?

Все, зрозумів де провтикав...
Взяв з вашого коду і не подумав, що замість (x + 2) має бути (x + 1) бо тільки 2 значення х мають у
Дякую))

12

Re: незрозуміла умова задачі

Таки не подумали. Там має бути

k=(x-xmin)/h
Подякували: Eff1c1

13 Востаннє редагувалося Eff1c (29.11.2018 21:05:35)

Re: незрозуміла умова задачі

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    setlocale(LC_CTYPE, "ukr");
    double y, x = -2, i = 23.0, h = 0.1 * i;
    double s[3];
    int p = 0;
    while (x <= i)
    {
        if (-2 <= x and x <= 0)
        {
            y = exp(-x) + exp(-2 * x);
            cout << x << " " << y << endl;
            s[p] = y;
            p++;
        }
        if (0 <= x and x <= 2)
        {
            y = exp(-(x + 5)) + exp(-x / 2);
            cout << x << " " << y << endl;
            s[p] = y;
            p++;
        }
        if (-2 > x or x > 1)
        {
            cout << "Функцiя не визначена" << endl;
        }
        x = x + h;
    }
    cout << "х, до якого хочете знайти вiдповiдне у: ";
    cin >> x;
    double k = (x - (-2)) / h;
    if (k - int(k) < 1e9)
    {
        if (-2 <= x and x <= 1)
        {
            int o = k;
            cout << s[o] << endl;
        }
        else if (-2 <= x and x <= i)
        {
            cout << "Функцiя не визначена" << endl;
        }
        else cout << "Немає значення" << endl;
    }
    else cout << "Немає значення" << endl;
    return 0;
}
-2 61.9872
0.3 0.8657
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
х, до якого хочете знайти вiдповiдне у: 0.3
61.9872

Чому?

14

Re: незрозуміла умова задачі

Mea culpa.

Ми маємо перевірити, що k досить близьке до цілого, щоб його таким вважати: якщо внаслідок помилки округлення (а вони є завжди з дійсними числами) ми отримаємо не 1.0, а 1.000000000000001, то програма це проігнорує. Але написав я таки дурню, треба
if(abs(k-round(k))<1e-9)...

15 Востаннє редагувалося Eff1c (30.11.2018 20:27:47)

Re: незрозуміла умова задачі

double k = (x + 2) / h; // k = (x - (-minx)) / h
if (abs(k - round(k)) < 1e-9)

Можете будь ласка пояснити як працюють ці рядки коду, бо я щось не дуже розумію  *SCRATCH*

І чому при запуску цього коду

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    setlocale(LC_CTYPE, "ukr");
    double y, x = -2, i = 23.0, h = 0.1 * i, n = 0, min_y, x_for_m_y, lichulnuk = 0;
    double s[3];
    int p = 0;
    while (x <= i)
    {
        if (-2 <= x and x <= 0)
        {
            y = exp(-x) + exp(-2 * x);
            cout << x << " " << y << endl;
            s[p] = y;
            p++;
        }
        if (0 <= x and x <= 2)
        {
            y = exp(-(x + 5)) + exp(-x / 2);
            cout << x << " " << y << endl;
            s[p] = y;
            p++;
            n = n + y * y;
        }
        if (-2 > x or x > 1)
        {
            cout << "Функцiя не визначена" << endl;
        }
        if (lichulnuk == 0)
        {
            min_y = y;
            x_for_m_y = x;
        }
        else if (y < min_y)
        {
            min_y = y;
            x_for_m_y = x;
        }
        lichulnuk++;
        x = x + h;
    }
    cout << "х, до якого хочете знайти вiдповiдне у: ";
    cin >> x;
    double k = (x + 2) / h; // k = (x - (-minx)) / h
    if (abs(k - round(k)) < 1e-9) {
        if (-2 <= x and x <= 1)
        {
            int o = k;
            cout << s[o] << endl;
        }
        else if (-2 <= x and x <= i)
        {
            cout << "Функцiя не визначена" << endl;
        }
        else cout << "Немає значення" << endl;
    }
    else cout << "Немає значення" << endl;
    cout << "Сума квадратів усіх додатних значень функцій у: " << n << endl;
    cout << "Функція набуває мінімального значення при х: " << x_for_m_y << endl;
    system("PAUSE");
    return 0;
}

при пошуку "0.3" вибиває "61.9872", а не "0.8657"?

-2 61.9872
0.3 0.8657
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
Функцiя не визначена
х, до якого хочете знайти вiдповiдне у: 0.3
61.9872
Сума квадрат?в ус?х додатних значень функц?й у: 0.749436
Функц?я набуває м?н?мального значення при х: 0.3

Хоча в інших варіантах все норм...

16

Re: незрозуміла умова задачі

int(k) завжди округлює вниз. Робіть

int o = round(k);

Що відбувається. Ми маємо масив, який нумерується числами з 0, з таблицею, значення x в якій змінюються за правилом -2+k*h. Тобто комірка k відповідає значенню x -2+k*h. З
x = -2+k*h
знаходимо
k=(x+2)/h
Тобто значення, що відповідає x, буде в комірці № k=(x+2)/h
На перше питання відповів.
Друге. Практично всі обчислення з рухомою комою мають похибку. Так, скажімо,

cout<<setprecision(20)<<0.3+0.3;
0.5999999999999999778

Це дуже маленька похибка, але вона існує. Тому, замість перевіряти дійсні числа на рівність, їх слід перевіряти на відхилення - якщо різниця між числами не більша за якесь маленьке значення, вважаємо ці числа рівними. Ось так:

if (abs(k - round(k)) < 1e-9)
Подякували: Eff1c1