Программа из контрольной, что не так?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Программа из контрольной, что не так?

Сообщение jet » 06.11.2011 00:16:55

Ниже привожу текст программы, задача состоит в построении 2-ух массивов(двух-мерных), изменения значения Q в зависимости от ufi[i] и uro[j], для 2 значений P(p1,p2). При этом ufi[i] и uro[j] даны в градусах(углы).
Если убрать фигурные скобки, то компилятор скажет:"ошибка 201". Что это за ошибка я уже посмотрел, но все-равно не вкуриваю. Прошу громко не смеяться, осваиваю по книжке, а на лекции я узнал только о том, что программа состоит из заголовка, описания переменных и тела.))))

Код: Выделить всё
program zadanie4_3;
var
q:array[1..11,1..4] of real;
tanuro,uro:array[1..4] of real;
ufi,tanufi:array[1..11] of real;
i,j,n,m,z,y:integer;
tan,dufi,duro,uron,urok,ufin,ufik,p1,p2,db,dm,l,s:real;
begin
  p1:=200;
  p2:=400;
  db:=90;
  dm:=60;
  l:=200;
  s:=8;
  uron:=0.5;
  urok:=0.75;
  ufin:=10;
  ufik:=20;
  dufi:=1;
  duro:=0.1;
  for i:=1 to 3 do uro[i]:=uron+((i-1)*duro);
  uro[4]:=urok;
  for j:=1 to 10 do ufi[j]:=ufin+((j-1)*dufi);
  ufi[11]:=ufik;
  for z:=1 to 4 do
    tanuro[z]:=round((sin(180/(pi*uro[i])))/(cos(180/(pi*uro[i]))));
  for y:=1 to 11 do
    tanufi[y]:=round((sin(180/(pi*ufi[j])))/(cos(180/(pi*uro[j]))));

   {for n:=1 to 4 do
      begin
       for m:=1 to 11 do
          begin
            q[n,m]:=round(1.57*p1*(tanuro[z]+tanufi[y])*(db+dm)*l+s);
            write('Q[',n,',',m,']=',q[n,m],'    ');
          end;
       writeln(' ');
      end;}

    for i:=1 to 4 do
     write('uro(',i,')=',uro[i]:2:2);
  writeln(' ');
    for j:=1 to 11 do
     write('ufi(',j,')=',ufi[j]:2:2);
end.


Если нужно обнародовать само задание(а оно очень запутанное, по крайней мере для меня), могу озадачиться.
Заранее спасибо за ответы.)))
jet
новенький
 
Сообщения: 16
Зарегистрирован: 30.10.2011 22:21:49

Re: Программа из контрольной, что не так?

Сообщение mtdu » 06.11.2011 00:47:36

Скопипастил, скобки убрал, вроде всё норм.
Даже в консоли отобразилось: Q[1,1]= 8.00000000000000E+000 и так до 10-го Q (значение не меняется)
win7 , лазарь
mtdu
новенький
 
Сообщения: 31
Зарегистрирован: 22.11.2009 13:56:51

Re: Программа из контрольной, что не так?

Сообщение jet » 06.11.2011 02:25:50

Я в еще большем недоумении!
Без всяких доработок?

Добавлено спустя 1 минуту 34 секунды:
А вот интересно, в "лазаре" паскалевский код тоже "канает"?
У меня xp.
jet
новенький
 
Сообщения: 16
Зарегистрирован: 30.10.2011 22:21:49

Re: Программа из контрольной, что не так?

Сообщение Vadim » 06.11.2011 08:45:34

jet
У меня тоже Ваш код без фигурных скобок компилируется и работает.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Программа из контрольной, что не так?

Сообщение Oleg_D » 06.11.2011 11:22:38

------
Код: Выделить всё
{ опции компиляции с проверкой диапазонов и индексов }
{$A+,B-,D+,E-,F-,G+,I-,L+,N+,O-,P-,Q+,R+,S+,T-,V-,X+,Y+}

program zadanie4_3;
var
q:array[1..11,1..4] of real;
tanuro,uro:array[1..4] of real;
ufi,tanufi:array[1..11] of real;
i,j,n,m,z,y:integer;
tan,dufi,duro,uron,urok,ufin,ufik,p1,p2,db,dm,l,s:real;

test : extended;

begin
  p1:=200;
  p2:=400;
  db:=90;
  dm:=60;
  l:=200;
  s:=8;
  uron:=0.5;
  urok:=0.75;
  ufin:=10;
  ufik:=20;
  dufi:=1;
  duro:=0.1;
  for i:=1 to 3 do uro[i]:=uron+((i-1)*duro);
  uro[4]:=urok;
  for j:=1 to 10 do ufi[j]:=ufin+((j-1)*dufi);
  ufi[11]:=ufik;
  for z:=1 to 4 do begin
    test:= cos(180/(pi*uro[i])); Writeln(z,' -z- ',Test);
    tanuro[z]:=round((sin(180/(pi*uro[i])))/(cos(180/(pi*uro[i]))));
  end;
  for y:=1 to 11 do begin
    Writeln(j);  { j=10, а массов объявлен как uro[1..4] ************************ }
    test:= cos(180/(pi*uro[j])); Writeln(y,' -y- ',Test);
    tanufi[y]:=round((sin(180/(pi*ufi[j])))/(cos(180/(pi*uro[j]))));
  end;

   for n:=1 to 4 do
      begin
       for m:=1 to 11 do
          begin
            q[n,m]:=round(1.57*p1*(tanuro[z]+tanufi[y])*(db+dm)*l+s);
            write('Q[',n,',',m,']=',q[n,m],'    ');
          end;
       writeln(' ');
      end;

    for i:=1 to 4 do
     write('uro(',i,')=',uro[i]:2:2);
  writeln(' ');
    for j:=1 to 11 do
     write('ufi(',j,')=',ufi[j]:2:2);
end.

Error 201 - Range check error - Нарушение диапазона - это ошибка исполнения, а не компиляции.
Место ошибки отмечено звездочками - ошибка в индексе массива.
Счетчики циклов по выходу из них в принципе не определены, не надейтесь на них! (в этом и была ошибка).
Попутные советы:
1. Вставляйте директивы компилятора в текст (Ctrl+O+O)
2. Не повторяйте лишние вычисления в цикле
3. Обращайте внимание на знаменатели
4. Применяйте именованные константы для объявления границ индексов.
Да и сюда не лишне заглянуть:
viewtopic.php?f=23&t=7029
Успехов Вам!
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Программа из контрольной, что не так?

Сообщение jet » 06.11.2011 13:24:04

Vadim писал(а):У меня тоже Ваш код без фигурных скобок компилируется и работает.

В лазаре, или fpc?

Oleg_D писал(а):Счетчики циклов по выходу из них в принципе не определены, не надейтесь на них! (в этом и была ошибка).

Это значит, что нужно задать переменную для конечного значения счетчика, и проставить для нее постоянное значение?
Oleg_D писал(а):1. Вставляйте директивы компилятора в текст (Ctrl+O+O)

Этого вообще не понял))))
Oleg_D писал(а):2. Не повторяйте лишние вычисления в цикле

Если это означает применение процедур и подпрограмм, то я еще не разобрался с их корректным применением.
Oleg_D писал(а):3. Обращайте внимание на знаменатели

То есть, просчитывать все знаменатели вручную до написания программы?
jet
новенький
 
Сообщения: 16
Зарегистрирован: 30.10.2011 22:21:49

Re: Программа из контрольной, что не так?

Сообщение Vadim » 06.11.2011 13:32:31

jet
jet писал(а):В лазаре, или fpc?

Без разницы.
Lazarus - это всего лишь графическая оболочка-дизайнер к Freepascal.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Программа из контрольной, что не так?

Сообщение jet » 06.11.2011 16:49:40

Спасибо за ответы, буду разбираться.
Трудновато идет пока, но, думаю пойму.
Если у кого будет минута времени, посмотрите пожалуйста само задание, я вообще тем путем иду?))))
Изображение

Добавлено спустя 41 минуту 15 секунд:
Ужас, я еще больше запутался!
Вроде задал конечные значения для индексов, а оно все тоже!
Код: Выделить всё
{ ????? ?????????? ? ????????? ?????????? ? ???????? }
    {$A+,B-,D+,E-,F-,G+,I-,L+,N+,O-,P-,Q+,R+,S+,T-,V-,X+,Y+}

    program zadanie4_3t;
    var
    q:array[1..11,1..4] of real;
    tanuro,uro:array[1..4] of real;
    ufi,tanufi:array[1..11] of real;
    i,j,n,m,z,y,nz,ny,nj,ni,nn,nm:integer;
    tan,dufi,duro,uron,urok,ufin,ufik,p1,p2,db,dm,l,s:real;

    test : extended;

    begin
      p1:=200;
      p2:=400;
      db:=90;
      dm:=60;
      l:=200;
      s:=8;
      uron:=0.5;
      urok:=0.75;
      ufin:=10;
      ufik:=20;
      dufi:=1;
      duro:=0.1;
      ni:=4;
      for i:=1 to ni-1 do uro[i]:=uron+((i-1)*duro);
      uro[ni]:=urok;
      nj:=11;
      for j:=1 to nj-1 do ufi[j]:=ufin+((j-1)*dufi);
      ufi[nj]:=ufik;
      nz:=4;
      for z:=1 to nz do begin
        test:= cos(180/(pi*uro[i])); Writeln(z,' -z- ',Test);
        tanuro[z]:=round((sin(180/(pi*uro[i])))/(cos(180/(pi*uro[i]))));
      end;
      ny:=11;
      for y:=1 to ny do begin
        Writeln(j);  { j=10, ? ?????? ???????? ??? uro[1..4] ************************ }
        test:= cos(180/(pi*uro[j])); Writeln(y,' -y- ',Test);
        tanufi[y]:=round((sin(180/(pi*ufi[j])))/(cos(180/(pi*uro[j]))));
      end;

       for n:=1 to 4 do
          begin
           for m:=1 to 11 do
              begin
                q[n,m]:=round(1.57*p1*(tanuro[z]+tanufi[y])*(db+dm)*l+s);
                write('Q[',n,',',m,']=',q[n,m],'    ');
              end;
           writeln(' ');
          end;

        for i:=1 to 4 do
         write('uro(',i,')=',uro[i]:2:2);
      writeln(' ');
        for j:=1 to 11 do
         write('ufi(',j,')=',ufi[j]:2:2);
    end.
jet
новенький
 
Сообщения: 16
Зарегистрирован: 30.10.2011 22:21:49

Re: Программа из контрольной, что не так?

Сообщение Padre_Mortius » 06.11.2011 17:52:43

задача решается с помощью циклов for и repeat или while на усмотрение автора. У вас зачем-то используются массивы и куча циклов for, которые совершенно не нужны. Вы запутались в индексах и формулах, отсюда и все проблемы
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Программа из контрольной, что не так?

Сообщение Oleg_D » 06.11.2011 19:22:58

Вот схема решения Вашей задачи:
Код: Выделить всё
const D0=60; D1=90; L=200; S=8;
var F, R  : real; { F - фи, R- ро }
     Q1, Q2 : real;
begin
F:=10;
repeat
  R:= 0.5;
  repeat
   Q1:= ... { формула для чистовой }
   Q2:= 2*Q1; { для черновой вдвое больше }
   Writeln (F, R, Q1, Q2);
   R:= R+0.1;
  until R>0.751;
  F:= F+1;
until F>20.1;
end.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Программа из контрольной, что не так?

Сообщение jet » 06.11.2011 19:40:25

Oleg_D,Padre_Mortius
Спасибо за направление и за решение)))
Я догадывался, что я далеко в огороды залез, но отсутствие практики и теории(в голове)...
Сейчас буду анализировать)))

Добавлено спустя 3 часа 37 минут 49 секунд:
Что то я совсем запутался, как правильно оформить процедуру?
Я хочу сделать процедурой вычисление тангенса угла, введенного в градусах.
если в теле программы я внутри длинной формулы использую процедуру:
Код: Выделить всё
q=a*b*(tg(X)+tg(Y));

То как правильно написать в самой процедуре?
Код: Выделить всё
procedure tg(ugol: real);
   begin
    :=(sin(180/(pi*X)))/(cos(180/(pi*Y)));
   end;

Так, или как?

Добавлено спустя 6 минут 8 секунд:
Oleg_D, а Вашу книгу я скачал еще до того, как Вы ее порекомендовали)))
Очень полезно не только для школьников, но и для таких великовозрастных "гениев" как я))))))))
Но ее нужно читать последовательно, а у меня такой возможности нет физически, однако, это мой минус, но не Ваш.
jet
новенький
 
Сообщения: 16
Зарегистрирован: 30.10.2011 22:21:49

Re: Программа из контрольной, что не так?

Сообщение Padre_Mortius » 07.11.2011 00:22:33

а я всегда думал, что тангенс по другому вычисляется
Код: Выделить всё
function tan (a:real):real;
begin
  tan := sin(a)/cos(a);
end;
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Программа из контрольной, что не так?

Сообщение jet » 07.11.2011 01:29:32

Хорошо, когда есть что думать)))))))
Вопросы:
1. Если а - угол заданный в градусах такая запись пройдет(я думал, что переводить в радианы обязательно)?
2. Как обращаться к функции?
3. В теле программы как пишется? Q:=x*y*(tan(a)+tan(b))+"еще чегонить" так работать будет?
Я конечно извиняюсь за тупые вопросы, но другой возможности сейчас нет)))
jet
новенький
 
Сообщения: 16
Зарегистрирован: 30.10.2011 22:21:49

Re: Программа из контрольной, что не так?

Сообщение Vadim » 07.11.2011 07:19:12

jet
1.
jet писал(а):Если а - угол заданный в градусах такая запись пройдет(я думал, что переводить в радианы обязательно)?

Все такие вычисления компилятор проводит в радианах, поэтому если угол а задан в градусах, его сначала надо перевести в радианы, а потом вычислять тангенс. Чтобы не запутаться в формуле, вычисляйте тангенс в два этапа:
- сначала перевод значения угла в радианы,
- потом вычисление тангенса.

В FreePascal, в модуле math, уже есть функция вычисления тангенса:
Код: Выделить всё
Functn tan(x: float): float;

А заодно есть и функция перевода градусов в радианы. :)
У Вас должно получиться что-то вроде этого:
Код: Выделить всё
Uses math;

Function TangensDegree(AngleInDegree: float): float;
Begin
  TangensDegree:=tan(degtorad(AngleInDegree));
End;

2.
jet писал(а):Как обращаться к функции?

Вот как раз, как Вы написали, так и обращаться.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Программа из контрольной, что не так?

Сообщение jet » 07.11.2011 21:39:08

Что-то я не пойму где на freepascal.org искать эти доп. модули?
Типа math, или они есть в компиляторе изначально?
jet
новенький
 
Сообщения: 16
Зарегистрирован: 30.10.2011 22:21:49

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru