1 Востаннє редагувалося nicoliafox (06.11.2015 20:52:38)

Тема: Програма та компілятор дивно себе поводять.

Компілятор програму компілює, але видає попередження на скріні.
Після того, як змінив:

while (x=3)

на

while (x!=3)

.
Ще одна проблема, що програма опрацьовує число -3, як значення більше ніж 3.

Post's attachments

Untitled-2.jpg 108.68 kb, 186 downloads since 2015-11-06 

2 Востаннє редагувалося mike (06.11.2015 20:54:54)

Re: Програма та компілятор дивно себе поводять.

може спробуйте

while (x==3)

// x=3 присвоєння 
// x==3 порівняння 

3

Re: Програма та компілятор дивно себе поводять.

Пробував і так, але програма просто виконує

printf("Кiлькiсть значень <X> при яких y=0: %i\n", i);

і припиняє свою роботу та попередження не зникає.

4

Re: Програма та компілятор дивно себе поводять.

ну я б чимось допоміг , але не вкурсі що там у вас відбувається в коді і як воно повинне працювати

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

5

Re: Програма та компілятор дивно себе поводять.

Топікстартер себе дивно поводить.
Почитайте тут: http://segfault.kiev.ua/smart-questions-ru.html

6

Re: Програма та компілятор дивно себе поводять.

При значеннях х рівних -5, 0 та 5 – значення функції не визначено. Вихід з циклу здійснюється при значенні х = 3. В програмі повинні підраховуватися кількість значень, при яких функція дорівнює нулю (у=0).

x > -3 або x < 3 - y=x
x < -3 - y = (x^2 - 3 * x + 2) / 2
x > 3 - y=x^3

7

Re: Програма та компілятор дивно себе поводять.

koala написав:

Топікстартер себе дивно поводить.
Почитайте тут: http://segfault.kiev.ua/smart-questions-ru.html

та да, коротка вижимка є і в наших правилах, але їх як завжди ніхто не читає, ібо нема часу

жаль що не по українськи

Вопрос:   
Моя {программа, конфигурация, мой оператор SQL} не работает

Ответ:   
Это вообще не вопрос, и я не собираюсь задавать еще десяток наводящих вопросов, чтобы выяснить, в чем на самом деле состоит ваша проблема — у меня есть дела и поинтереснее. Когда я вижу подобные вопросы, то обычно посылаю один из следующих ответов:

Вам к этому больше нечего добавить?

Ой, это очень плохо. Надеюсь, вы уже это исправили.

И какое это имеет отношение лично ко мне?

8

Re: Програма та компілятор дивно себе поводять.

nicoliafox написав:

При значеннях х рівних -5, 0 та 5 – значення функції не визначено. Вихід з циклу здійснюється при значенні х = 3. В програмі повинні підраховуватися кількість значень, при яких функція дорівнює нулю (у=0).

x > -3 або x < 3 - y=x
x < -3 - y = (x^2 - 3 * x + 2) / 2
x > 3 - y=x^3

це знов нам ні про що не говорить, ми любим код читати

9

Re: Програма та компілятор дивно себе поводять.

Якщо не знайду відповіді, скину словесний алгоритм виконання програми.

10

Re: Програма та компілятор дивно себе поводять.

Судячи з тексту попередження, компілятор інформує, що змінній x до початку циклу початкове значення не присвоюється, тому там може лежати що-завгодно. Поки присвоєння (замість порівняння) було в умові циклу, компілятор не лаявся, бо така конструкція формально є правильною: змінній присвоюється значення 3, воно ж використовується як умова циклу — це не нуль, тому працює як true, ми отримали нескінченний цикл. Коли ж замість присвоєння стало порівняння (!= чи ==), компілятор побачив, що змінна x не ініціалізована.

11 Востаннє редагувалося -=ЮрА=- (08.11.2015 19:39:13)

Re: Програма та компілятор дивно себе поводять.

Ще одна проблема, що програма опрацьовує число -3, як значення більше ніж 3.

- розрахунок йде у  дійсних, а порівнюємо з цілим(так не можна), потрібно порівнювати з наперед заданою похибкою (у моєму прикладі похибка дорівнює 2E-6) Також не рекомендую строгі умовні перевірки для дійсних.

#include <iostream>
using namespace std;

/*
x > -3 або x < 3 - y=x
x < -3 - y = (x^2 - 3 * x + 2) / 2
x > 3 - y=x^3
*/

float f(float x);

int main(){
    float y, x;
    float xn = -5.5f;
    float xk =  5.5f;
    float hx = 0.1f;
    size_t zero = 0;
    cout<<"\tx\tf(x)"<<endl;
    for( x = xn; x < xk && x != 3; x += hx )
    {
        cout<<x<<"\t"<<(y = f(x))<<endl;
        if( fabs(y) < 2E-6 )
            zero++;
    }
    cout<<"zero count : "<<zero<<endl;
    cin.get();
    return 0;
}

float f(float x){
    float y = 0;
    if( x < -3 )
        y = (x*x - 3*x + 2) / 2;
    else
    if( x > 3 )
        y = x*x*x;
    else
        y = x;
    return y;
}

http://codepad.org/1BDgsGwi

12

Re: Програма та компілятор дивно себе поводять.

Щоб було зрозуміло про що йде мова - надаю приклад як то кажуть з власного "життя"

#include <iostream>
using namespace std;

float f(float x);

int main(){
    float x = 1000;
    cout<<"x = "<<x<<endl;
    x = x + 1E-5;
    cout<<"x = "<<x<<endl;
    return 0;
}

float f(float x){
    float y = 0;
    if( x < -3 )
        y = (x*x - 3*x + 2) / 2;
    else
    if( x > 3 )
        y = x*x*x;
    else
        y = x;
    return y;
}

http://codepad.org/PatrqlpE
Вивід консолі

x = 1000
x = 1000

13

Re: Програма та компілятор дивно себе поводять.

-=ЮрА=- написав:

Щоб було зрозуміло про що йде мова - надаю приклад як то кажуть з власного "життя"

Щоб було зрозуміло, треба робити не від балди:

    double x = 1000;
    cout.width(10);
    cout.precision(10);
    cout<<"x = "<<x<<endl;
    x = x + 1E-5;
    cout<<"x = "<<x<<endl;
    cin.get();
    return 0;

Не знаю що ти своїм прикладом мав на увазі, але точність треба задавати коли ж бо використовується форматовані оператори.

14

Re: Програма та компілятор дивно себе поводять.

muhasjo написав:

може спробуйте

while (x==3)

// x=3 присвоєння 
// x==3 порівняння 

Типова помилка Дельфі-програмістів? :D

15

Re: Програма та компілятор дивно себе поводять.

КиївОболонь написав:

Типова помилка Дельфі-програмістів? :D

І не тільки. Більшість компіляторів вже давно навчилися показувати попередження про це; а щоб уникнути такої проблеми, Йоди нотація придумана:

while( 3 == x )

і присвоювання випадкове гарантовано компілятора помилку викличе.

16

Re: Програма та компілятор дивно себе поводять.

muhasjo написав:
nicoliafox написав:

При значеннях х рівних -5, 0 та 5 – значення функції не визначено. Вихід з циклу здійснюється при значенні х = 3. В програмі повинні підраховуватися кількість значень, при яких функція дорівнює нулю (у=0).

x > -3 або x < 3 - y=x
x < -3 - y = (x^2 - 3 * x + 2) / 2
x > 3 - y=x^3

це знов нам ні про що не говорить, ми любим код читати

А мені це багато про що говорить.

17 Востаннє редагувалося -=ЮрА=- (08.11.2015 22:12:58)

Re: Програма та компілятор дивно себе поводять.

Itari,

Щоб було зрозуміло, треба робити не від балди:

- а тепер відвори це з флоатом у якого точність обмежена(ось такі приколи як у автора теми дуже часто пов'язані саме з float). А це щоб тобі краще було зрозуміло, що являє собою число з плаваючою комою http://codepad.org/JSzottiL

#include <iostream>
using namespace std;

int main(){
    float x = 1000;
    cout<<"x = "<<x<<endl;
    x = x + 1E-5;
    cout.width(10);
    cout.precision(10);
    cout<<"x = "<<x<<endl;
    x = x + 1E-5;
    cout<<"x = "<<x<<endl;
    return 0;
}

Не знаю що ти своїм прикладом мав на увазі, але точність треба задавати коли ж бо використовується форматовані оператори.

- то зараз є гарна можливість занотувати собі на майбутнє мій приклад.

18

Re: Програма та компілятор дивно себе поводять.

nicoliafox написав:

Компілятор програму компілює, але видає попередження на скріні.
Після того, як змінив:

while (x=3)

на

while (x!=3)

.
Ще одна проблема, що програма опрацьовує число -3, як значення більше ніж 3.

Є деякі дивні компілятори котрбі видають таку помилку, не звертайте уваги.

19

Re: Програма та компілятор дивно себе поводять.

Є деякі дивні компілятори котрбі видають таку помилку, не звертайте уваги.

Це що за компілятори такі?

програма опрацьовує число -3, як значення більше ніж 3.

Здається мені, що топікстартеру вже пора викласти свої опрацьовування, тоді можно буде зрозуміти, як автор теми нарвався на неприемності, і на які саме.

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

20

Re: Програма та компілятор дивно себе поводять.

Гадаю, там є чарівне слово unsigned, але я не телепат, так що напевне не знаю.