Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > программа с решением графика


Автор: Huey 10.5.2011, 17:49
Есть рабочая программа, считает все правильно. Всего у задачи 2 решения (x=0 и x=1,51). Однако выводится два раза ответ x=0. Как от этого избавиться? Может массив какой вшить, чтобы если ответы равны, то выдавать только один. Помогите, пжл))

Код

#include <stdio.h>
#include <math.h>
#include <graph.h>
#include <conio.h>
#define a 0.7
#define b 1.1
#define c 0.2
double ur (double x)
{return a*sin(b*sqrt(x))-c*(x*x*x);}
main (){
double x, xn,xk,px,py,ymax,ymin,koy,kot,y;
char tms[5];
int n=0;
puts("Write xn and xk:");
scanf("%lf%lf",&xn,&xk);
px = 640/(-xn+xk);
_setvideomode(_VRES16COLOR);
_clearscreen(_GCLEARSCREEN);
ymax= -ur (xn);
ymin=ymax;
for (x=xn; x<=xk;x+=0.0001)
{ y=-ur(x);

if((-ur(x-0.0001)*y)<=0.)
{printf("  x[%d]=%0.2lf \n",n+1,x);
n++}
if (ymax<y) ymax=y;
if (ymin>y) ymin=y;}
if (n==0) puts("net resheniy");
_setwindow (1,xn,-ymin,xk,-ymax);
_moveto_w (xn,0.);
_lineto_w(xk,0.);
_moveto_w (0.,-ymax);
_lineto_w(0.,-ymin);
py = 480/fabs(-ymax+ymin);
koy= (ymax-ymin)/2;
_setvieworg(320,240);
_setcolor (7);
_settextposition (14,76);
sprintf(tms,"%2.2f",xk);
printf("%s\n",tms);
_outtext(tms);
_settextposition (14, 1);
sprintf(tms,"%2.2f",xn);
_outtext(tms);
_settextcolor(7);
_settextposition(1, 42);
sprintf(tms,"%2.2f",-ymin);
_outtext(tms);
_settextposition(28, 42);
sprintf(tms,"%2.2f",-ymax);
_outtext(tms);
kot = (xk-xn)/2;
x = xn;
y = -ur(x);
_moveto (((x-(xn+kot))*px), ((y-(ymin+koy))*py));
for (x =xn;x <= xk;x+=0.01) {
    y =  -ur(x);
    _lineto((x-(xn+kot))*px, (y-(ymin+koy))*py);}
    getch();
    return 0;}





Автор: bsa 10.5.2011, 20:41
Huey, почитай http://forum.vingrad.ru/forum/topic-269805/kw-faq-coding-style-%D1%81%D1%82%D0%B8%D0%BB%D1%8C-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F.html и примени полученные знания к своему коду. Иначе, такое ощущение, что ты нас (форумчан) не уважаешь.

Автор: Huey 10.5.2011, 21:36
ok, к завтра исправлю)

Автор: bsa 12.5.2011, 11:25
Huey, что, отформатировал код и ошибка нашлась? smile

Автор: borisbn 12.5.2011, 13:06
Huey
1. Ну откуда ж, действительно, такое неуважение ? Программа практически нечитабельна
Цитата(Huey @  10.5.2011,  17:49 Найти цитируемый пост)

for (x=xn; x<=xk;x+=0.0001)
{ y=-ur(x);

if((-ur(x-0.0001)*y)<=0.)
{printf("  x[%d]=%0.2lf \n",n+1,x);
n++}
if (ymax<y) ymax=y;
if (ymin>y) ymin=y;}

ужс
2. Она вообще не должна компилироваться, т.к. не хватает ; после ++
Цитата(Huey @  10.5.2011,  17:49 Найти цитируемый пост)
n++}

3. Вот так - работает.
http://liveworkspace.org/code/3444a25a63119b3386b89728240a523a
4. Какие ты задаёшь xn и xk ?

Автор: Huey 16.5.2011, 16:17
Я ввел твою программу с точностью до скобки, но он все равно на экран выводит 3 ответа. х[1]=0; x[2]=0; x[3]=1,51. Я понять не могу почему, вроде все верно

Автор: Huey 16.5.2011, 16:48
В той среде, в которой ты работал, действительно выдается правильно. Посоветуй тогда программу для работы в С на Windows 7, пожалуйста.

Автор: bsa 16.5.2011, 17:34
http://forum.vingrad.ru/index.php?show_type=forum&showtopic=269794&kw=faq-c++

Автор: Huey 16.5.2011, 18:09
спс

Автор: Huey 16.5.2011, 19:43
Я разобрался, где ошибка:

у нас в for
 
Код

for (x=xn; x<=xk;x+=0.0001)

x+=0.0001

А в if 
Код

if((-ur(x-0.0001)*y)<=0

x-0.0001
получается на первом шаге 0.0001-0.0001=0
Избавиться от этого можно подкорректировав for
Код

for (x=xn; x<=xk;x+=0.00011)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)