Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2008, 14:23   #1
KnDmPetr
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 20
По умолчанию Помогите найти ошибку

Условие: Дано натуральное число X. Определить число Y знаков в факториале от X. Построить усредненный график Y(X!). Способ усреднения выбрать по желанию.
Код:
program faktorial;
uses crt,graph;
const step=100;
label label1;
var
 grDriver:integer;
 grMode:integer;
 ErrCode:integer;
 massX:array[1..10] of longint;
 massY:array[1..10] of longint;
 A,B:double;
 X,Y:longint;
 i,j:integer;

procedure GetPos(v0,v1,v2,v3:integer; x:real; var x0,y0:real);
 var rx,ry,qx,qy,sx,sy,px,py:real;
 begin
  if v0<1 then v0:=1;
  if v1<1 then v1:=1;
  if v2>10 then v2:=10;
  if v3>10 then v3:=10;
  px:=(massX[v3]-massX[v2])-(massX[v0]-massX[v1]);
  py:=(massY[v3]-massY[v2])-(massY[v0]-massY[v1]);
  qx:=(massX[v0]-massX[v1])-px;
  qy:=(massY[v0]-massY[v1])-py;
  rx:=massX[v2]-massX[v0];
  ry:=massY[v2]-massY[v0];
  sx:=massX[v1];
  sy:=massY[v1];
  x0:=px*x*x*x+qx*x*x+rx*x+sx;
  y0:=py*x*x*x+qy*x*x+ry*x+sy;
 end;
procedure DrawSpline(v0,v1,v2,v3:integer; x:real);
 var nx,ny:real;
  begin
   GetPos(v0,v1,v2,v3,x,nx,ny);
   if x=0 then moveto(round(nx),round(ny))
          else lineto(round(nx),round(ny));
  end;

BEGIN
 clrscr;
{--schitaem kol-vo chisel Y v X!--}
 write('Enter X:');
 readln(X);
 if (X=0) or (X=1) then
 begin
 writeln('Y=',1);
 goto label1;
 end;
 A:=ln(sqrt(2*PI*X))/ln(X)+X-X/ln(X);
 B:=(ln(10)/ln(X));
 Y:=trunc(A/B)+1;
 writeln('Y=',Y);
 readkey;
{------------END------------------}
{-zanosim 10 znacheniy v massiv-}
   label1:
    massX[1]:=0;
    massY[1]:=1;
  for X:=1 to 10 do
   begin
    A:=ln(sqrt(2*PI*X*step))/ln(X*step)+X*step-X*step/ln(X*step);
    B:=(ln(10)/ln(X*step));
    Y:=trunc(A/B)+1;
    massX[X]:=X*step;
    massY[X]:=Y;
   end;
{------------END------------------}
{---------risuem grafik-----------}
  grDriver := Detect;
  InitGraph(grDriver, grMode,'');
  ErrCode := GraphResult;
  if ErrCode = grOk then
  begin
   line(0,0,0,getmaxY);
   line(0,getmaxY,getmaxX,getmaxY);
    for i:=1 to 9 do
     begin
    for j:=0 to step do
     begin
      putpixel(round(getmaxX*massX[i]/1000),getmaxY-round(massY[i]*getmaxY/3000),10);
      circle(round(getmaxX*massX[i]/1000),getmaxY-round(massY[i]*getmaxY/3000),3);
      DrawSpline(i-1,i,i+1,i+2,j/100);
     end;
     end;
   readkey;
   CloseGraph;
  end
  else
    Writeln('Graphics error:', GraphErrorMsg(ErrCode));
 readkey;
END.
Подсчет количества символов Y в факториале от X производится. Затем я заношу в массив 10 таких подсчетов в промежутке Х от 0 до 1000 с шагом 100. Дальше строится график. Чтобы график был плавный использую сплайны. Точки выводятся, но почему-то сплайны не рисуются, т.е. рисуются неправильно.
Помогите разобраться где у меня заковырка с отрисовкой сплайнов.

Последний раз редактировалось KnDmPetr; 11.04.2008 в 14:28.
KnDmPetr вне форума Ответить с цитированием
Старый 11.04.2008, 15:48   #2
pil69
Пользователь
 
Регистрация: 03.04.2008
Сообщений: 11
По умолчанию x может представить в виде целой переменной

Условие x=0 несколько смутило, поскольку x заявлена как вещественная. Для вещественных переменных, вычисляемых в ходе выполнения программы, очень низка вероятность что они примут значение, равное нулю или какому-то целому числу.
Код:
# procedure DrawSpline(v0,v1,v2,v3:integer; x:real);  
#  var nx,ny:real;  
#   begin  
#    GetPos(v0,v1,v2,v3,x,nx,ny);  
#    if x=0 then moveto(round(nx),round(ny))  
#           else lineto(round(nx),round(ny));  
#   end;
Хотя можно само условие записать в виде round(x)=0

Последний раз редактировалось pil69; 11.04.2008 в 15:54.
pil69 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите найти ошибку Максим_Леонидович БД в Delphi 4 20.08.2008 23:23
Помогите найти ошибку ( с++ ) JOFRIF Помощь студентам 10 23.05.2008 14:34
Помогите найти ошибку NeiL Общие вопросы Delphi 7 04.03.2008 07:14
Помогите найти ошибку Рената Паскаль, Turbo Pascal, PascalABC.NET 2 05.01.2008 04:29
help!!! Помогите найти ошибку!!! linker13 Общие вопросы Delphi 2 07.07.2007 23:15