![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Доброго времени суток всем.
Есть такая задача
Сравнить полученные значения, в качестве критерия сравнения использовать количество членов ряда, необходимых для вычисления числа π. ************ Начал писать программу, запнулся на ряде Лейбница, да и Эйлера тоже, что-то я неправильно пишу походу - значения неверные выдаёт Помогите пожалуйста, я первый раз сам пишу программу. Код:
unit VichisleniePi;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Sharp: TEdit;
Leybnitc: TEdit;
Eyler: TEdit;
Calc: TBitBtn;
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
lbl4: TLabel;
Tochnost: TEdit;
lbl5: TLabel;
procedure CalcClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CalcClick(Sender: TObject);
var i, n, sign1: integer;
s, curr:Extended;
BEGIN
begin
n := StrToInt(Tochnost.Text);
s := 0; curr := 1;
for i := 1 to n do
begin
s := s + 1 / (curr * (2 * i - 1));
curr := - curr * 3;
end;
s := s * sqrt(12);
Sharp.Text:=FloatToStr(s);
end;
begin
s :=0;
sign1 := 1;
for i := 0 to n do ;
begin
s := s + sign1 * 4 / ( 2*i + 1);
sign1:= -sign1;
end;
Leybnitc.Text:=FloatToStr(s)
end;
begin
s:= 0;
for i := 1 to n do
begin
s:= 1/sqr(n) ;
end;
s:= Sqrt (6*s) ;
Eyler.Text:=FloatToStr(s)
end;
END;
end. |
|
#2
|
|||
|
|||
|
у лейбница:
; после do - цикл не выполняется 4 не там где надо s = 0 sign = 1 и вто же время Leybnitc.Text:=FloatToStr(s) ?? у эйлера как минимум: s:= 1/sqr(n) - касяк вобще есть отладка по шагам, брейкпоинты, рекомендую узнать что это такое |
|
#3
|
||||
|
||||
|
Цитата:
Цитата:
Цитата:
Цитата:
|
|
#4
|
|||
|
|||
|
Всё дотумкал в Эйлере что да как =))
Код сейас такой Код:
unit VichisleniePi;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Sharp: TEdit;
Leybnitc: TEdit;
Eyler: TEdit;
Calc: TBitBtn;
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
lbl4: TLabel;
Tochnost: TEdit;
lbl5: TLabel;
procedure CalcClick(Sender: TObject);
procedure TochnostKeyPress(Sender: TObject; var Key: Char);
procedure SharpKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CalcClick(Sender: TObject);
var i, n, sig: integer;
s, cur:Extended;
BEGIN
if Tochnost.Text='' then ShowMessage('Введите точность')
else
begin
n := StrToInt(Tochnost.Text);
if n>10300 then ShowMessage('Слишком большая точность')
else
begin
begin
s := 0; cur := 1;
for i := 1 to n do
begin
s := s + 1 / (cur * (2 * i - 1));
cur := - cur * 3;
end;
s := s * sqrt(12);
Sharp.Text:=FloatToStr(s);
end;
begin
s :=0;
sig := 1;
for i := 0 to n do
begin
s := s + sig * 4 / ( 2*i + 1);
sig := -sig;
end;
Leybnitc.Text:=FloatToStr(s)
end;
begin
s:= 0;
for i := 1 to n do
begin
s:= s + 1/sqr(i) ;
end;
s:= Sqrt(6*s) ;
Eyler.Text:=FloatToStr(s)
end;
end;
end;
END;
procedure TForm1.TochnostKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9',#8]) then key:=#0;
end;
procedure TForm1.SharpKeyPress(Sender: TObject; var Key: Char);
begin
Key:=#0
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Tochnost.SetFocus;
end;
end. Теперь надо Цитата:
Помогите, а? ![]() Последний раз редактировалось toper, 27.11.2011 в 10:12. |
|
#5
|
|||
|
|||
|
Есть число пи. Оно иррациональное, т.е. после запятой у него бесконечно много знаков. Есть точность его определения - необходимое кол-во знаков.
пи с точностью до целых = 3 пи с точностью до десятых = 3.1 пи с точностью до тысячных = 3,142. В любом случае его можно считать только приближенно - оставляем определенное кол-во знаков после запятой, остальное отбрасываем. Код:
...
if n>10300 then ShowMessage('Слишком большая точность')
...
for i := 1 to n do
...n - кол-во членов ряда при такой постановке, а не точность. точность может быть 0.0001 - т.е. твое значение отличается от значения пи не более чем на указанную величину. По поводу кода: вместо Код:
for i := 0 to n Код:
count := 0; while (tochnost <= abs(Pi - sum)) begin //прибавляешь очередной член ряда к сумме count := count + 1; end; В переводе на человеческий : пока точность меньше разницы между пи и суммой твоего ряда. Count - счетчик кол-ва просуммированных членов ряда P.S. В uses добавь модуль Math, константа называется Pi. |
|
#6
|
|||
|
|||
|
а вот здесь занятный метод вычисления PI
путем подбрасывания монеты. Суть вот в чем В квадрат вписывам круг и бросаем туда монету. Считаем сколько раз она оказалась внутри круга. Отношение и дает число PI Оно конечно к заданию отношения не имеет. Но уж очень занятная игрушка. |