Здрасте ))) Мне тут попросили написать на паскале функцию (число пи=pi) P=(-1)^x*cos((pi/4)+(x/25))/(pi/4)+(x/25); х-от 0 до 10, шаг-1 и с отправкой результатов в файл
Реализовал так:
[syntax=Pascal]
program zoch;
var P, x, pi, c, d, g :real;
outf :text;
begin
assign(outf, 'zoch.txt');
rewrite(outf);
pi:=3.14;
x:=0;
while x<=10 do begin
if int(x/2)=x/2
then c:=1
else c:=-1;
d:=(pi/4)+(x/25);
g:=exp(x*(ln(1)))*c;
P:=(g*cos(d))/d;
writeln(outf,'If x=',x:1:0,' then P=',P:7:4);
x:=x+1;
end;
close(outf);
end.
[/syntax]
Лично мне нравится но может есть какие то скрытые баги?
Табулирование функции. Проверьте реализацию.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Перенес из тему "Алгоритмы", так как с точки зрения алгоритмов тут ничего примечательного.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Скрытые баги всегда есть
1) Используйте функцию Pi (для этого надо убрать объявление и присвоение одноименной переменной).
2) Я бы заменил while на for
3) ... и тогда X была бы целым числом и можно было бы отказаться от вычисдения Exp(Ln()) а просто определять знак по четности числа
4) Опс! Кстати! А зачем Вам переменная C? (Или G) Одна из них не нужна. Вы уж либо определяйте знак по четности числа, либо возводлите -1 в степень. Что-нибудь одно. Иначе у Вас все время получает противоположный знак!
Вообще exp(X*(ln(1))) всегда дает единицу, которую Вы умножаете на.... Вобщем Вы тут все напутали
5) еще в догонку int(x/2)=x/2 в вещественном типе может запросто пропустить кратность числа из-за ошибки округления. При делении на 2 это конечно весьма мало вероятно, но в общем - это реальный скрытый баг.
Вобщем надо, например, так:
[syntax=pascal]
program zoch;
var
P, c, d:real;
x: integer;
outf :text;
begin
assign(outf, 'zoch.txt');
rewrite(outf);
for x:=0 to 10 do begin
if odd(x) then c:=-1 else c:=1;
d:=(pi/4)+(x/25);
P:=(c*cos(d))/d;
writeln(outf,'If x=',x:2,' then P=',P:7:4);
end;
close(outf);
end.
[/syntax]
Слева мой вывод, справа Ваш. Сравните. Мой правильнее
1) Используйте функцию Pi (для этого надо убрать объявление и присвоение одноименной переменной).
2) Я бы заменил while на for
3) ... и тогда X была бы целым числом и можно было бы отказаться от вычисдения Exp(Ln()) а просто определять знак по четности числа
4) Опс! Кстати! А зачем Вам переменная C? (Или G) Одна из них не нужна. Вы уж либо определяйте знак по четности числа, либо возводлите -1 в степень. Что-нибудь одно. Иначе у Вас все время получает противоположный знак!
Вообще exp(X*(ln(1))) всегда дает единицу, которую Вы умножаете на.... Вобщем Вы тут все напутали
5) еще в догонку int(x/2)=x/2 в вещественном типе может запросто пропустить кратность числа из-за ошибки округления. При делении на 2 это конечно весьма мало вероятно, но в общем - это реальный скрытый баг.
Вобщем надо, например, так:
[syntax=pascal]
program zoch;
var
P, c, d:real;
x: integer;
outf :text;
begin
assign(outf, 'zoch.txt');
rewrite(outf);
for x:=0 to 10 do begin
if odd(x) then c:=-1 else c:=1;
d:=(pi/4)+(x/25);
P:=(c*cos(d))/d;
writeln(outf,'If x=',x:2,' then P=',P:7:4);
end;
close(outf);
end.
[/syntax]
Слева мой вывод, справа Ваш. Сравните. Мой правильнее
Код: Выделить всё
If x= 0 then P= 0.9003 If x=0 then P= 0.9011
If x= 1 then P=-0.8217 If x=1 then P=-0.8225
If x= 2 then P= 0.7492 If x=2 then P= 0.7499
If x= 3 then P=-0.6819 If x=3 then P=-0.6825
If x= 4 then P= 0.6192 If x=4 then P= 0.6198
If x= 5 then P=-0.5607 If x=5 then P=-0.5613
If x= 6 then P= 0.5059 If x=6 then P= 0.5064
If x= 7 then P=-0.4544 If x=7 then P=-0.4549
If x= 8 then P= 0.4060 If x=8 then P= 0.4065
If x= 9 then P=-0.3603 If x=9 then P=-0.3607
If x=10 then P= 0.3171 If x=10 then P= 0.3176
спасибо ))))
а как табулировать функцию 2sinX/cosX
в Visual Basic?
в Visual Basic?
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
как минимум в другом разделе