Ребята, нужна ваша помощь.
К сожалению задача не идет, т.к. программа говорит о том, что идет где-то деление на ноль. Хотя при выводе xmax ymax там ноль не получается. Помогите,пожалуйста, разобраться и найти в чем может состоять ошибка.
#define kr 20
main()
{float ymax,ymin,xmax,xmin,Mx,My,h,r,p,t,Z;
int driver, mode, kod, curmode,rx,ry,xg,yg,otx,oty,i,n,m,x,y,a,k;
printf("Vvedite razmer & kol-vo");
scanf("%d%d",&a,&k);
getch();
driver=DETECT;
initgraph(&driver, &mode, "");
kod=graphresult();
if(kod!=0)
{ puts("Graph Error");
printf("%s\n", grapherrormsg(kod));
getch();
exit(1);
}
t=0;
r=a*sin(k*t);
x=r*cos(t);
y=r*sin(t);
h=2*M_PI/1000;
for(t=0; t<2*M_PI; t+=h)
{r=a*sin(k*t);
x=r*cos(t);
y=r*sin(t);
ymax=y;
ymin=y;
y=y+h;
if(y>ymax)
ymax=y;
if(y<ymin)
ymin=y;
//--------------------------------------------------
xmax=x;
xmin=x;
x=x+h;
if(x>xmax)
xmax=x;
if(x<xmin)
xmin=x;
}
rx=getmaxx();
ry=getmaxy();
Mx=(rx-2*kr)/fabs(xmax-xmin);
// if(Z==0)Z=0.0001;
// Mx=Z;
My=(ry-2*kr)/fabs(ymax-ymin);
// if(Z==0)Z=0.0001;
// Mx=Z;
otx=kr-xmin*Mx;
oty=kr+ymax*My;
xg=otx+x*Mx;
yg=oty-y*My;
t=0;
while(t<2*M_PI)
{r=a*sin(k*t);
x=r*cos(t);
y=r*sin(t);
xg=otx+x*Mx;
yg=oty-y*My;
putpixel(xg,yg,14);
t+=h;
}
getch();
closegraph();
return 0;
}
15 ноября 2009 в 20:04
Научись пользоваться отладчиком (debugger).
Во все места, где в программе производится деление, поставь проверки, сравнивающие знаменатель с нулем. поставь туда брейкпоинты и дойди отладчиком. Так и разберешься, откуда там ноль взялся.
15 ноября 2009 в 20:05
спасибо большое.
15 ноября 2009 в 22:00
Есть еще такое понятие как assert, туда можно засунуть, ту же самую проверку, что знаменатель не нулевой.
16 ноября 2009 в 1:01
Жека Кирпичев:
"…поставь проверки, сравнивающие знаменатель с нулем…"
Это ты так отладчиком пользоватся умеешь?
16 ноября 2009 в 8:02
А что тебя не устраивает?
16 ноября 2009 в 12:01
вообще если нажать F5 даже в VC++ 6.0 и запустить программу – то программа остановится в том месте, гдк производится деление на ноль
16 ноября 2009 в 22:04
jkff
> А что тебя не устраивает?
"Во все места, где в программе производится деление, поставь проверки, сравнивающие знаменатель с нулем"
Зачем тогда отладчик нужен? =)
16 ноября 2009 в 23:00
Ну не знаю, чтобы попялиться на значения других переменных
В общем согласен, глупость сказал.
17 ноября 2009 в 7:04
Жека, не совсем глупость. Обычно бывает полезно проверять инварианты задолго до того, как они приведут к краху =) assert() используется как в отладочной версии, так и используются подобные макросы, например, для логирования нарушения инвариантов и т.п. Отладчиком тут много не накопаешь =))) Хотя, в некоторых ОС на некоторых платформах можно и отладчиком всё это сделать, ИМХО в общем случае логирование гораздо приятнее на вкус =) Почти как REP =)
17 ноября 2009 в 12:01
assert надо ставить на входные данные, а не в каждой строчке, где может возникнуть ексепшн:
"задолго до того, как они приведут к краху" == true