Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Помогите разобраться


Автор: zarogon 27.12.2005, 20:58
Вот есть готовая прога и мне нужно что бы объяснили пошагово каждое действие и сделали похожую если не трудно (задание лежит в документе ворд).
Само задание готовой проги вот:
1. Сделать итеративную функцию вычисления значения суммы ряда.
2. Сделать рекурсивную функцию вычисления суммы ряда.
3. Сравнить результаты Ваших вычислений с результатом работы стандартной функции языка программирования.
4. Построить график функции на определенном выбранном промежутке (изобразить одним цветом график функции, точки для которого вычисляются “своей” функций, другим – график, точки для которого вычисляются стандартной функцией). Для построения графика сделать подпрограмму, параметром, которой будет функция вычисления.
5. Функция лежит тоже в ворде под номером 14.

А вот код:
Код

#include <stdio.h>
#include <math.h>
#include <graphics.h>

float fy (float x, float a, int b)
{
  return atan(x);
}

float fy_iter (float x,float eps, int b)
{
  float tmp,sum;
  int i,znac;

  tmp = fy(x, eps, b);

  if (x>-1) sum = 3.14/2;
  else sum = -3.14/2;
  i=1;
  znac = -1;
  while (fabs(sum-tmp)>eps)
  {
    sum+=1/(pow(x,i)*i)*znac;
    i+=2;
    znac=-znac;
  }
return(sum);
}

float fy_rec_tmp (float x, float eps, int i)
{
  float tmp;
  tmp = 1/(pow(x,i)*i);
  if (fabs(tmp)>eps) return tmp - fy_rec_tmp(x,eps,i+2);
  else return tmp;
}

float fy_rec (float x, float eps, int i)
{
  if (x>-1)return (3.14/2 - fy_rec_tmp(x,eps,i));
  else return (-3.14/2-fy_rec_tmp(x,eps,i));
}




void MinMax (int* min, int* max, int n, int xn, int xk)
{
  int i,tmp;
  float dx;
  dx = (float)abs(xk-xn)/n;
  *min = *max = fy(xn+dx, i, tmp);

  for (i=2; i<=n; i++)
  {
    tmp = fy(xn+dx*i, dx,n);
    if (*min>tmp) *min = tmp;
    else
      if (*max<tmp) *max = tmp;
  }
}

void init (int* x0, int* y0, int* ed_izm, int xn, int xk )
{
  int xm,ym,gd,gm, ed_izmX, min, max;

  *ed_izm = 50;
  gd=DETECT;
  initgraph(&gd,&gm,"c:\\studprog\\tc\\bgi");
  setcolor(2);
  xm=getmaxx();
  ym=getmaxy();

  MinMax(&min,&max,50, xn, xk);
  if (abs(max)>abs(min)) *ed_izm = ym/abs(max*2);
  else *ed_izm = ym/abs(min*2);

  if (abs(xk)>abs(xn)) ed_izmX = xm/abs(xk*2);
  else ed_izmX = xm/abs(xn*2);

  if (ed_izmX<*ed_izm) *ed_izm = ed_izmX;

  *y0=(int) (ym/2);
  *x0=(int) (xm/2);

  line(0,*y0,xm-7,*y0);
  line (*x0,0,*x0,ym);
  outtextxy (*x0-3,0,"^");
  outtextxy (xm-7,*y0-3,">");
  setcolor(12);

  outtextxy (*x0-10,*y0-*ed_izm,"1-");
  outtextxy (*x0+*ed_izm,*y0-3,"|");
  outtextxy (*x0+*ed_izm,*y0+9,"1");
  setcolor(12);
  line (*x0+(*ed_izm),0,*x0+(*ed_izm),ym);
  line (*x0-(*ed_izm),0,*x0-(*ed_izm),ym);
}

void ShowGraphic (float(*fn)(float, float, int),int n, int x0, int y0, float eps, int ed_izm, int color, int xn, int xk)
{
  float d,x,y;
  int x1,x2,y1,y2,i;
  d=(float)(xk-xn)/n;
  x=xn;
 setcolor(color);
 if (n<30)
 while (xk>=x)
 {
  i=1;
  y=(*fn)(x,eps,i);

  x2=(int)(x*ed_izm);
  y2=(int)(y*ed_izm);
  putpixel (x0+x2,y0-y2,color);
  circle (x0+x2,y0-y2,2);
  if (x>xn)
  line (x0+x1,y0-y1,x0+x2,y0-y2);
  x1=x2;
  y1=y2;
  x=x+d;
}
else
 while (xk>=x)
 {
  y=fy(x,x,1);
  x2=(int)(x*ed_izm);
  y2=(int)(y*ed_izm);
  putpixel (x0+x2,y0-y2,color);
  if (x>xn)
  line (x0+x1,y0-y1,x0+x2,y0-y2);
  x1=x2;
  y1=y2;
  x=x+d;
}
}

main()

 {
  float eps;
  char res;
  int x0,y0,x1,y1,x2,y2,n, ed_izm, xn, xk;
  do
  {
    clrscr();
    printf ("Vvedite n   ");
    scanf ("%d",&n);
    printf ("Vvedite epsilon   ");
    scanf ("%f",&eps);

    printf ("Vvedite xn   ");
    scanf ("%d",&xn);
    printf ("Vvedite xk   ");
    scanf ("%d",&xk);


    if (((xn>1)&&(xk>1)) || ((xn<-1) && (xk<-1)))
    {

      init(&x0,&y0, &ed_izm, xn,xk);

      ShowGraphic(fy, n, x0, y0, eps, ed_izm,15, xn, xk);
      ShowGraphic(fy_iter, n, x0, y0, eps, ed_izm,13, xn, xk);
      ShowGraphic(fy_rec, n, x0, y0, eps, ed_izm,14, xn, xk);
      getch();
      restorecrtmode ();
    }
    else printf ("Error!!!");
    printf ("Press Y to continue or any key to exit");
    res = getch();
  }
  while (res == 'y');
}



ЗАРАНЕЕ БЛАГОДАРЕН ВСЕМ КТО ПОМОЖЕТ

Автор: zarogon 30.12.2005, 05:35
Я очень сильно извиняюсь за нарушение, но пожалуйста глянти, мне надо к сесси на 10 число.


Заранее благодарен.

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