Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюк паскаля??? объясните 
:(
    Опции темы
vicq
Дата 8.7.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



Написал прогу. при пошаговом выполнении считает верно. ответ сходится с точным. а по Ctrl-F9 совсем другие результаты выдает. Паскаль или прога? в чем косяк? smile 
PM MAIL ICQ   Вверх
m0ro
Дата 8.7.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 800
Регистрация: 19.5.2007

Репутация: нет
Всего: 68



код в студию?
PM MAIL   Вверх
vicq
Дата 8.7.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



в коде бардак... и без коментов:

Код

Program KRAI;
Uses CRT;
Type
   mix=Array[1..50,1..50] of Real;
   intmx=Array[1..50] of Integer;
Var k,i,j:Byte;
    A,B,R,h,x,y,m,n,d,d1,ep,e:Real;
    u,u2,u3:mix;
    indx:intmx;

Function Uh(x,y:Real):Real;
Begin
   Uh:=sqr(x)*sqr(y);
End;

Function way(x2,y2,x1,y1:Real):Real;
Begin
   way:=sqrt(sqr(x2-x1)+sqr(y2-y1));
End;

Function d_x(A,B,R,x,y:Real):Real;
Var dx:Real;
Begin
   If (R-B*y*y)/A>=0 Then
     Begin
        dx:=sqrt((R-B*y*y)/A);
        d_x:=way(x,y,dx,y);
     End
   Else
     d_x:=h+1;
End;

Function d_y(A,B,R,x,y:Real):Real;
Var dy:Real;
Begin
   If (R-B*x*x)/A>=0 Then
     Begin
        dy:=sqrt((R-A*x*x)/B);
        d_y:=way(x,y,x,dy);
     End
   Else
     d_y:=h+1;
End;

Procedure min_d(Var m,n:Real; A,B,x,y:Real);
Var min:Real;
Begin
   If d_x(A,B,R,x,y)<h Then
      min:=d_x(A,B,R,x,y);
   If d_y(A,B,R,x,y)<h Then
     If d_y(A,B,R,x,y)<min Then
       Begin
          n:=sqrt((R-A*sqr(x))/B);
          m:=x;
       End
     Else
       Begin
          n:=y;
          m:=sqrt((R-B*y*y)/A);
       End;
End;



Procedure Calc;
Begin
   For i:=k DownTo 1 Do
     Begin
        j:=1;
        Repeat
          Begin
             x:=(j-1)*h;
             y:=(i-1)*h;
             If ((way(x,y,0,0)>=d) and (way(x,y,0,0)<d1)) Then
               If (d_x(A,B,R,x,y)<h) or (d_y(A,B,R,x,y)<h) Then
                 Begin
                    If i>k-sqrt(R)/2 Then
                      Begin
                         min_d(m,n,A,B,x,y);
                         u[i][j]:=Uh(m,n);
                         u[j][i]:=u[i][j];
                      End;
                 End
               Else
                 Begin
                   indx[i]:=j-1;
                   Continue
                 End
             Else
               Begin
                  If ((x=0) and (y<k+1) and (y>0)) Then
                    u[i][j]:=1/4*(u[i+1][j]+u[i-1][j]+2*u[i][j+1]);
                  If ((y=0) and (x<k+1) and (x>0)) Then
                    Begin
                       u[i][j]:=1/4*(2*u[i+1][j]+u[i][j+1]+u[i][j-1]);
                       u[j][i]:=u[i][j];
                    End;
                  If ((x=0) and (y=0)) Then
                    u[i][j]:=1/4*u[i+1][j];
                  If ((x>0) and (y>0)) Then
                    u[i][j]:=1/4*(u[i+1][j]+u[i-1][j]+u[i][j+1]+u[i][j-1]);
               End;
             j:=j+1;
          End;
        Until(indx[i]>0)
     End;
End;




Procedure init;
Begin
   For i:=1 To 50 Do
     For j:=1 To 50 Do
       u[i][j]:=0;
   For i:=1 To 50 Do
       indx[i]:=0;
End;
Begin ClrScr;
   WriteLn('Ax^2+By^2=R^2');
   WriteLn('vvedite A, B, R');
   Read(A); Read(B); ReadLn(R);
   WriteLn('Vvedite shag setki H'); ReadLn(h);
   WriteLn('Vvedite tochnost E'); ReadLn(e);
   init;
   k:=round(sqrt(R)/h)+1;
   i:=0; j:=k;
   d:=sqrt(R)-(sqrt(2*sqr(h))/7);
   d1:=sqrt(R)+2*h-h/30;
   Calc;
   Repeat
     Begin
        ep:=0;
        For i:=k DownTo 1 Do
           Begin
             For j:=1 to indx[i] Do
               Begin
                  x:=(j-1)*h;
                  y:=(i-1)*h;
                  If ((way(x,y,0,0)>=d) and (way(x,y,0,0)<d1)) Then
                    Begin
                       If (d_x(A,B,R,x,y)<=h) or (d_y(A,B,R,x,y)<=h) Then
                         Begin
                            If i>k-sqrt(R)/2 Then
                              Begin
                                 min_d(m,n,A,B,x,y);
                                 u2[i][j]:=Uh(m,n);
                                 u[j][i]:=u2[i][j];
                              End;
                         End;
                    End
                  Else
                    Begin
                       If ((x=0) and (y<k+1) and (y>0)) Then
                         u2[i][j]:=1/4*(u[i+1][j]+u[i-1][j]+2*u[i][j+1]);
                       If ((y=0) and (x<k+1) and (x>0)) Then
                         Begin
                            u2[i][j]:=1/4*(2*u[i+1][j]+u[i][j+1]+u[i][j-1]);
                            u[j][i]:=u2[i][j];
                         End;
                       If ((x=0) and (y=0)) Then
                         u2[i][j]:=1/4*4*u[i+1][j];
                       If ((x>0) and (y>0)) Then
                         u2[i][j]:=1/4*(u[i+1][j]+u[i-1][j]+u[i][j+1]+u[i][j-1]);
                    End;
                  If u2[i][j]-u[i][j]>ep Then
                    ep:=u2[i][j]-u[i][j];
                  u[i][j]:=u2[i][j];
                End;
           End;
     End;
   Until (ep<e);

   For i:=k DownTo 1 Do
     Begin
     WriteLn;
       For j:=1 to indx[i] Do
             Write(' ',u[i][j]:2:2);
     End;
ReadLn;
End.

PM MAIL ICQ   Вверх
vicq
Дата 8.7.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



дело не в коде наверное... почему пошагово одно, а целиком - другое????
PM MAIL ICQ   Вверх
volvo877
Дата 8.7.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Можно посмотреть, с какими данными программа ВООБЩЕ работает? У меня на любых - зацикливается...

Добавлено через 3 минуты и 51 секунду
А вообще - очень интересная позиция: задания - нет, комментариев - нет, исходных данных - нет, что ищем - непонятно. Но "не работает", и сразу виноват во всем Паскаль.
PM MAIL   Вверх
vicq
Дата 8.7.2007, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



есть вапще разница между обычным выполнением проги и пошаговым???
PM MAIL ICQ   Вверх
Crot
Дата 9.7.2007, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 31.1.2004

Репутация: нет
Всего: 3



Программу не запускал, просто просмотрел.
В твоём коде есть потенциальная ошибка. Читай комментарии:

Код
Procedure min_d(Var m,n:Real; A,B,x,y:Real);
Var min:Real; { здесь ты заводишь ЛОКАЛЬНУЮ переменную min }
Begin
   If d_x(A,B,R,x,y)<h Then  { здесь, ЕСЛИ СРАБАТЫВАЕТ условие }
      min:=d_x(A,B,R,x,y);     { то в переменную min что-то записывается }

  { однако заметь, условие может и не сработать, }
  { и тогда в переменной min будет находиться какое-то заранее не известное число }

   If d_y(A,B,R,x,y)<h Then
     If d_y(A,B,R,x,y)<min Then  { а здесь ты переменную min используешь в логич.выражении }
                                                { хотя записано в ней может быть невесть что }
       Begin
          n:=sqrt((R-A*sqr(x))/B);
          m:=x;
       End
     Else
       Begin
          n:=y;
          m:=sqrt((R-B*y*y)/A);
       End;
End;


Надо учитывать, что:
Значения глобальных переменных к моменту начала выполнения программы обнуляются.
Значения же локальных переменных к моменту начала выполнения ПОДПрограммы - не определены.

P.S.: На всякий случай:
Глобальные переменные - те, которые описанны внутри самой программы.
Локальные переменные - те, которые описанны в любой подпрограмме.
Подпрограмма - процедура или функция.


Цитата
есть вапще разница между обычным выполнением проги и пошаговым???

В твоём случае - есть, так как, ещё раз повторюсь, при вызове процедуры min_d, значение переменной min может быть любое, причём различное при каждом вызове.

Добавлено через 6 минут и 58 секунд
Ещё кое-что заметил:

Код
  ...
   If d_y(A,B,R,x,y)<h Then
     If d_y(A,B,R,x,y)<min Then
       Begin
          n:=sqrt((R-A*sqr(x))/B);
          m:=x;
       End
     Else
       Begin
          n:=y;
          m:=sqrt((R-B*y*y)/A);
       End;
  ...


Следует избегать таких конструкций, используя операторные скобки BEGIN..END. Иначе не ясно, к какому условному оператору IF принадлежит ветка ELSE.
PM MAIL WWW ICQ   Вверх
vicq
Дата 9.7.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



Спасибо огромное! определил min и заработало. правда там ещё косяк, но это уже в алгоритме вроде бы. я 2 дня не вставая из-за компа исправлял эту прогу, вот и получилась кривая, с минимумом подпрограмм.
PM MAIL ICQ   Вверх
Nite
Дата 10.7.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



vicq, второе замечание Крота про if не забудь.
надо делать так
if ... then
  if ... then
  begin
   ...
  end
  else
  begin
   ...
  end
else ;

иначе конструкция
else
begin
 ...
end
будет отнесена к внешнему if !
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.1050 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.