ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» C, С++ | страница 2 |
|
|
|
Железный канал: «C, С++» |
|
|
Loki 791 EGP
Репутация: 162 Сообщения: 2882 Откуда: понаехали тут Зарегистрирован: 04.11.2002 |
|
2 all:
Не-а Опять мимо. Нигде не стоит условий "если жо равно 0, то..." В общем, ниже полный листинг программы.
Компилятор: gnu minigw 3.2
//main
#include <iostream.h>
#include <stdlib.h>
void tab(float d,float y,float source,float end,float step);
int main()
{
float d, end, step;
float source;
for(char ans='y';ans=='y'
{
cout << "Vvedite nizhnyuyu granicu otrezka ";
cin >> source;
cout << "\nVvedite verxnyuyu granicu otrezka ";
cin >> end;
cout <<"\nVvedite shag ";
cin >> step;
cout << "\nVvedite d ";
cin >> d;
char ans2='y';
for (float y=source;y<=end&&ans2=='y';y+=2*step)
{
tab(d,y,source,end,step);
cout << "\nPokazat' znacheniya dlya sledusjego y? y/n";
cin >> ans2;
}
cout <<"\nVy xotite vvesti novye parametry? y/n ";
cin >> ans;
}
system("pause");
}
//tab
#include <iostream.h>
double func(float x,float y,float d);
void tab(float d,float y,float source,float end,float step)
{
double f;
cout << "\ny=" <<y;
for (float x=source;x<=end;x=x+step)
{
f=func(x,y,d);
cout << "\tx=" << x << "\tf=" <<f <<endl;
}
}
//func
#include <math.h>
float minimum(float x,float y);
float maximum(float x,float y);
double func(float x,float y,float d)
{
float min, max;
double f;
if (x<0&&y<0)
{
max=maximum(x,y*y);
min=minimum(max,sqrt(fabs(x)));
min=minimum(min,sqrt(fabs(y))+d);
f=min+x*y;
}
else if (x>0&&y<0)
{
max=maximum(sin(x),cos(x+d));
f=max*x+fabs(y+x);
}
else
{
max=maximum(sin(x),cos(x+d));
f=max*y+x;
}
return f;
}
//minimum
float minimum(float x,float y)
{
float min;
min=(x>=y)?y:x; //использование здесь операции IF - требование задания
return min;
}
//maximum
float maximum(float x,float y)
{
float max;
if (x>=y)max=x;
else max=y;
return max;
}
_________________ All are equal. Of course, that doesn't stop some people from being stupid fools or jerks. |
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
Зато есть условия "меньше нуля", типа if (x<0&&y<0). Значение в точке должно быть по идее ноль, сравнивается оно с нулем, а по факту там -1.3877778e-16. И идет в это ветку естественно. Вариант - сравнивать не x < 0 , а x < 0 && fabs(x) > <погрешность>.
_________________ Конец света в конце тоннеля |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Так, глянул по трезвяни...
Как правильно сказал Diff - ты проверяешь, к примеру, x<0.
Но дело в том, что уже при вводе исходных данных в прогу начинают накапливаться "погрешности" -
- ну не бывает float или double, ни long double, ни superpuperultralong double равным 0,1(0) - 0,1 с бесконечным количеством нулей.
И вот, когда ты вводишь свой step, он уже будет не 0,1, а, к примеру 0,1000000075762213. То же самое - с source, d, и end.
Потому то и -0,2+0,1+0,1 запросто может быть меньше 0, ну или больше 0.
Собственно, основной косяк будет в func, а не в tab, tab же может иногда не допечатать последний виток цикла.
|
|
|
Loki 791 EGP
Репутация: 162 Сообщения: 2882 Откуда: понаехали тут Зарегистрирован: 04.11.2002 |
|
Ндя, проверил на еще нескольких наборах данных - косяк с точностью определенно имеет место Бум приделывать сравнение с разностью...
_________________ All are equal. Of course, that doesn't stop some people from being stupid fools or jerks. |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Loki : |
Ндя, проверил на еще нескольких наборах данных - косяк с точностью определенно имеет место Бум приделывать сравнение с разностью...
|
Так, и только так. Это - по определнию работы с дробными числами.. В машине - двоичная система, нашау десятеричная - ей чужда...
|
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
Це вообще веселый язык. Напрмер, вот этот код
int a[4] = {0, 1, 2, 3};
int i = 1;
a[a[++i]++] = a[a[--i]++];
printf("a= %d %d %d\n", a[0], a[1], a[2]);
работает тремя разными способами под тремя разными компиляторами - gcc 2.95, VC++ 7.01, Watcom 10.6. Других под рукой нет. Сейчас предложил двум программерам ответить, что эта прога напишет, они чуть не подрались...
_________________ Конец света в конце тоннеля |
|
|
Pegasus 1039 EGP
Репутация: 335 Сообщения: 7085 Откуда: НН Зарегистрирован: 09.12.2002 |
|
Diff : |
int a[4] = {0, 1, 2, 3};
int i = 1;
a[a[++i]++] = a[a[--i]++];
printf("a= %d %d %d\n", a[0], a[1], a[2]);
|
0 2 2
_________________ There shall be wings! |
|
|
Remint 385 EGP
Рейтинг канала: 3(27) Репутация: 84 Сообщения: 1785
Зарегистрирован: 12.05.2003 |
|
Цитата: |
Це вообще веселый язык.
|
Потому что максимально привязан к железу, насклько это возможно
для языка высокого уровня, а дальше абстрагируй сам если
хочешь , там где хочешь, и где это действительно нужно,
и где ради этого стоит жертвовать быстродействием.
_________________ Да пребудет с вами сила... |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Pegasus : |
Diff : |
int a[4] = {0, 1, 2, 3};
int i = 1;
a[a[++i]++] = a[a[--i]++];
printf("a= %d %d %d\n", a[0], a[1], a[2]);
|
0 2 2
|
BC3.1, BCC4.5 - оба напечатали:
a= 0 3 2
|
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
Вариант VC++ 7.0 - 0 3 2
gcc 2.95 - 0 2 2 (к этому варианту пришли и те, кто решал сам)
Watcom C++ 10.6 - 1 1 2
2Remint: Привязкм к железу в этом примере я как-то не наблюдаю .
_________________ Конец света в конце тоннеля |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Diff : |
gcc 2.95 - 0 2 2 (к этому варианту пришли и те, кто решал сам)
|
Можешь объяснить, как пришли к 0 2 2 ? Я вот, решая сам, пришел к варианту 0 3 2
|
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Гы, gcc - Линуксовый? Ну так какая ОС, такие и компиляторы...
BC++ и VC++ - рулят!
Правильный вариант - все же 0 3 2 3, и будет i==1..
|
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
2VRus: Объяснить не могу, я процесс решения наблюдал со стороны. В результате услышал очень много нового о происхождении, сексуальных наклонностях и ближайших родственниках решавших, а также цифири 0 2 2. Ответ зависит, подозреваю, от того, в каком порядке вычисляются индексы, rvalue и lvalue.
Что касается компиляторов, по моему опыту - gcc наиболее близко следует стандарту C++, вижул похуже, ну а ваткому клейма ставить негде, оно и понятно - проект-то закрыт давно... Хотя VC 7.10 aka 2003.NET подтянули к стандарту, как результат - улучшилась переносимость кода между VC и gcc.
_________________ Конец света в конце тоннеля |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Diff : |
Ответ зависит, подозреваю, от того, в каком порядке вычисляются индексы, rvalue и lvalue.
Что касается компиляторов, по моему опыту - gcc наиболее близко следует стандарту C++, вижул похуже, ну а ваткому клейма ставить негде, оно и понятно - проект-то закрыт давно... Хотя VC 7.10 aka 2003.NET подтянули к стандарту, как результат - улучшилась переносимость кода между VC и gcc.
|
Я выделил в твоем посте главное...
Так вот, если следовать стандарту ANSI C, то результат будет именно 0 3 2. В данном стандарте, также, как и в хелпе (к примеру BC) - ясно написано, что в первую очередь - ("[]"), что во вторую - ("++"). Что справа налево("++"), что слева направо("[]"). Если же в том же gcc будет в хелпе написано одно, а на деле другое - ооо, это кул..
|
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
Возможно. А где по стандарту сначала надо считать индексы - справа или слева? Все позабыл ужо...
Вот еще забавный пример. Месяц назад встал на эти грабли самолично, потом долго ругался.
#include <stdio.h>
void main()
{
const int s1 = 32;
int s2 = 32;
int r1 = 1 << s1;
int r2 = 1 << s2;
printf ("%d %d\n", r1, r2);
}
r1 и r2 оказываются не равны (VC & gcc). Ясен пень, shl сдвигать больше чем на 31 разряд не умеет, берутся младшие 5 бит cl, но забавно, что в случае с константой препроцессор соптимизировал и сдвинул по-иному, нежели компилятор.
_________________ Конец света в конце тоннеля |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Про индексы - по стандарту - слева направо.. Но умножь еще на последовательность подсчета операторов в индексах..
хм, у меня получалось только 032 (по логике разбора компилятора - это правильнее, аль - по чел. логике - 111 - упс такого тут вообще не видел - а буду трезв - смогу обосновать.. )
Ну, насчет твоего теперишнего примера - дык... Как в том анехдоте - "А лом она может" - "бзззззззз" сказала японская лесопилка, и сломалась.. "Отож" - сказали русские мужыки, и пошли дальше валить лес топорами...
Найти, как поиздеваться над компилятором - можно довольно лехко.. Сложнее знать - как издевацца над компилятором так, чтоб он тебя слушался
|
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
VRus : |
Ну, насчет твоего теперишнего примера - дык... Как в том анехдоте - "А лом она может"
|
Ну не скажи. Пример реальный. В том смысле, что пару лет жизни он мне стоил . И у вижула от него крышу сорвало - при отладке в вотче он про выражение пишет одно, выполняю - оппа, результат другой.
VRus : |
Найти, как поиздеваться над компилятором - можно довольно лехко.. Сложнее знать - как издевацца над компилятором так, чтоб он тебя слушался
|
В том-то и дело, что простые и очевидные на первый взгляд вещи иногда оказываются особо изощренными издевательствами. И наоборот. Где-то был у меня код, фрагмент которого
bool l = true;
if (l) cout << "true"; else cout << "false";
выводил ... правильно, "false".
Целый день помню, с этим чудом возился. И никто специально компилятор не мучал. Оно само.
_________________ Конец света в конце тоннеля |
|
|
Remint 385 EGP
Рейтинг канала: 3(27) Репутация: 84 Сообщения: 1785
Зарегистрирован: 12.05.2003 |
|
Сегодня примерно пол часа не мог понять почему
следующий фрагмент не работал ожидаемым образом
for (i = 0; i < 8; i++);
{
::SetRect(&rect, x + i * 14, y, x + 13 + i * 14, y + 11);
::ExtTextOut( hdc, 0, 0, ETO_OPAQUE, &rect, 0, 0, 0 );
};
Гы гы, отлаживаю значит и не могу понять почему у меня
idx при первом же проходе становиться равен 8, а не 0 .
Правда у меня, при установленном разрешении, шрифте,
на моем мониторе, лишнюю ";", несколько тяжелее было
заметить .
_________________ Да пребудет с вами сила... |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Remint : |
Сегодня примерно пол часа не мог понять почему
следующий фрагмент не работал ожидаемым образом
for (idx = 0; idx < 8; i++);
|
Дык вот-вот... То перед else лишняя ";", то после for - и начинаешь материть C, исправляется - перестановкой строчек или просто набиранием куска кода заново - гы, типа полтергейст.. А все оказывается банальней и компилятор в этом не виноват..
2 Remint:
А у тебя, к тому же в вышеприведенном коде бесконечный цикл будет (пока код в конфу переносил, еще одну ошибку сделал ), прога вообще зависнет...
|
|
|
Remint 385 EGP
Рейтинг канала: 3(27) Репутация: 84 Сообщения: 1785
Зарегистрирован: 12.05.2003 |
|
Ага, енто я править начал (с чувством безысходности ),
потом енту заразу заметил ( ; ) , кинул в конфу,
а потом уж все правильно сделал .
P.S. Поправил я свой пост...
_________________ Да пребудет с вами сила... |
|
|
|
|
|
Железный канал: «C, С++» |
|
|