Страница 1 из 2
Программа из контрольной, что не так?
Добавлено: 06.11.2011 00:16:55
jet
Ниже привожу текст программы, задача состоит в построении 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.
Если нужно обнародовать само задание(а оно очень запутанное, по крайней мере для меня), могу озадачиться.
Заранее спасибо за ответы.)))
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 00:47:36
mtdu
Скопипастил, скобки убрал, вроде всё норм.
Даже в консоли отобразилось: Q[1,1]= 8.00000000000000E+000 и так до 10-го Q (значение не меняется)
win7 , лазарь
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 02:27:24
jet
Я в еще большем недоумении!
Без всяких доработок?
Добавлено спустя 1 минуту 34 секунды:
А вот интересно, в "лазаре" паскалевский код тоже "канает"?
У меня xp.
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 08:45:34
Vadim
jet
У меня тоже Ваш код без фигурных скобок компилируется и работает.
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 11:22:38
Oleg_D
------
Код: Выделить всё
{ опции компиляции с проверкой диапазонов и индексов }
{$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Успехов Вам!
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 13:24:04
jet
Vadim писал(а):У меня тоже Ваш код без фигурных скобок компилируется и работает.
В лазаре, или fpc?
Oleg_D писал(а):Счетчики циклов по выходу из них в принципе не определены, не надейтесь на них! (в этом и была ошибка).
Это значит, что нужно задать переменную для конечного значения счетчика, и проставить для нее постоянное значение?
Oleg_D писал(а):1. Вставляйте директивы компилятора в текст (Ctrl+O+O)
Этого вообще не понял))))
Oleg_D писал(а):2. Не повторяйте лишние вычисления в цикле
Если это означает применение процедур и подпрограмм, то я еще не разобрался с их корректным применением.
Oleg_D писал(а):3. Обращайте внимание на знаменатели
То есть, просчитывать все знаменатели вручную до написания программы?
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 13:32:31
Vadim
jetjet писал(а):В лазаре, или fpc?
Без разницы.
Lazarus - это всего лишь графическая оболочка-дизайнер к Freepascal.
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 17:30:55
jet
Спасибо за ответы, буду разбираться.
Трудновато идет пока, но, думаю пойму.
Если у кого будет минута времени, посмотрите пожалуйста само задание, я вообще тем путем иду?))))
Добавлено спустя 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.
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 17:52:43
Padre_Mortius
задача решается с помощью циклов for и repeat или while на усмотрение автора. У вас зачем-то используются массивы и куча циклов for, которые совершенно не нужны. Вы запутались в индексах и формулах, отсюда и все проблемы
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 19:22:58
Oleg_D
Вот схема решения Вашей задачи:
Код: Выделить всё
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.
Re: Программа из контрольной, что не так?
Добавлено: 06.11.2011 23:24:22
jet
Oleg_D,
Padre_MortiusСпасибо за направление и за решение)))
Я догадывался, что я далеко в огороды залез, но отсутствие практики и теории(в голове)...
Сейчас буду анализировать)))
Добавлено спустя 3 часа 37 минут 49 секунд:Что то я совсем запутался, как правильно оформить процедуру?
Я хочу сделать процедурой вычисление тангенса угла, введенного в градусах.
если в теле программы я внутри длинной формулы использую процедуру:
То как правильно написать в самой процедуре?
Код: Выделить всё
procedure tg(ugol: real);
begin
:=(sin(180/(pi*X)))/(cos(180/(pi*Y)));
end;
Так, или как?
Добавлено спустя 6 минут 8 секунд:Oleg_D, а Вашу книгу я скачал еще до того, как Вы ее порекомендовали)))
Очень полезно не только для школьников, но и для таких великовозрастных "гениев" как я))))))))
Но ее нужно читать последовательно, а у меня такой возможности нет физически, однако, это мой минус, но не Ваш.
Re: Программа из контрольной, что не так?
Добавлено: 07.11.2011 00:22:33
Padre_Mortius
а я всегда думал, что тангенс по другому вычисляется
Код: Выделить всё
function tan (a:real):real;
begin
tan := sin(a)/cos(a);
end;
Re: Программа из контрольной, что не так?
Добавлено: 07.11.2011 01:29:32
jet
Хорошо, когда есть что думать)))))))
Вопросы:
1. Если а - угол заданный в градусах такая запись пройдет(я думал, что переводить в радианы обязательно)?
2. Как обращаться к функции?
3. В теле программы как пишется? Q:=x*y*(tan(a)+tan(b))+"еще чегонить" так работать будет?
Я конечно извиняюсь за тупые вопросы, но другой возможности сейчас нет)))
Re: Программа из контрольной, что не так?
Добавлено: 07.11.2011 07:19:12
Vadim
jet1.
jet писал(а):Если а - угол заданный в градусах такая запись пройдет(я думал, что переводить в радианы обязательно)?
Все такие вычисления компилятор проводит в радианах, поэтому если угол
а задан в градусах, его сначала надо перевести в радианы, а потом вычислять тангенс. Чтобы не запутаться в формуле, вычисляйте тангенс в два этапа:
- сначала перевод значения угла в радианы,
- потом вычисление тангенса.
В FreePascal, в модуле math, уже есть функция вычисления тангенса:
А заодно есть и функция перевода градусов в радианы.

У Вас должно получиться что-то вроде этого:
Код: Выделить всё
Uses math;
Function TangensDegree(AngleInDegree: float): float;
Begin
TangensDegree:=tan(degtorad(AngleInDegree));
End;
2.
jet писал(а):Как обращаться к функции?
Вот как раз, как Вы написали, так и обращаться.
Re: Программа из контрольной, что не так?
Добавлено: 07.11.2011 21:39:08
jet
Что-то я не пойму где на freepascal.org искать эти доп. модули?
Типа math, или они есть в компиляторе изначально?