singlepost

График в полярной системе координат на С++ << На главную или назад  

Ребята, нужна ваша помощь.
К сожалению задача не идет, т.к. программа говорит о том, что идет где-то деление на ноль. Хотя при выводе 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;
}

52 ответов в теме “График в полярной системе координат на С++”

Страницы: [1] 2 »

  1. 1
    Жека Кирпичев ответил:

    Научись пользоваться отладчиком (debugger).
    Во все места, где в программе производится деление, поставь проверки, сравнивающие знаменатель с нулем. поставь туда брейкпоинты и дойди отладчиком. Так и разберешься, откуда там ноль взялся.

  2. 2
    Codigo Pensador ответил:

    спасибо большое.

  3. 3
    Владимир Стебунов ответил:

    Есть еще такое понятие как assert, туда можно засунуть, ту же самую проверку, что знаменатель не нулевой.

  4. 4
    Вася Пупкинъ ответил:

    Жека Кирпичев:
    "…поставь проверки, сравнивающие знаменатель с нулем…"

    Это ты так отладчиком пользоватся умеешь?

  5. 5
    Жека Кирпичев ответил:

    А что тебя не устраивает?

  6. 6
    Александр Кручинин ответил:

    вообще если нажать F5 даже в VC++ 6.0 и запустить программу – то программа остановится в том месте, гдк производится деление на ноль

  7. 7
    Вася Пупкинъ ответил:

    jkff
    > А что тебя не устраивает?

    "Во все места, где в программе производится деление, поставь проверки, сравнивающие знаменатель с нулем"

    Зачем тогда отладчик нужен? =)

  8. 8
    Жека Кирпичев ответил:

    Ну не знаю, чтобы попялиться на значения других переменных :) В общем согласен, глупость сказал.

  9. 9
    Константин Смотритель ответил:

    Жека, не совсем глупость. Обычно бывает полезно проверять инварианты задолго до того, как они приведут к краху =) assert() используется как в отладочной версии, так и используются подобные макросы, например, для логирования нарушения инвариантов и т.п. Отладчиком тут много не накопаешь =))) Хотя, в некоторых ОС на некоторых платформах можно и отладчиком всё это сделать, ИМХО в общем случае логирование гораздо приятнее на вкус =) Почти как REP =)

  10. 10
    Вася Пупкинъ ответил:

    assert надо ставить на входные данные, а не в каждой строчке, где может возникнуть ексепшн:

    "задолго до того, как они приведут к краху" == true

Страницы: [1] 2 »

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.