![]() |
|
|
Регистрация | << Правила форума >> | 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 Оно конечно к заданию отношения не имеет. Но уж очень занятная игрушка. |
#7
|
|||
|
|||
![]() Охохо это всё переписывать по новой (
Оставлю так как есть, если препод скажет переписывать буду переписывать, там ещё 7 прог надо написать к экзамену ))) Вот ими пока и займусь. Главное то в этих заданиях - освоить тему "Циклы", тут вроде циклы есть, авось простят мне непонятливость )) Последний раз редактировалось toper, 28.11.2011 в 04:27. |
#8
|
|||
|
|||
![]() Для Лейбница и Эллера у меня получился вот такой код:
Код:
function TForm1.PI_leib(e: Extended; var Cnt : Integer): Extended; var I : Integer; Sng : Integer; dx : Extended; begin Cnt := 0; I := 1; Sng := 1; dx := 1; Result := 0; While Abs(dx) > Abs(e) Do Begin Result := Result + dx; Inc(Cnt); Inc(I,2); Sng := Sng * (-1); dx := Sng/I; End; Result := Result * 4; end; function TForm1.PI_eiler(e: Extended; var Cnt : Integer): Extended; var I : Integer; dx : Extended; begin Cnt := 0; Result := 0; I := 1; dx := 1; While Abs(dx) > Abs(e) Do Begin Result := Result + dx; Inc(Cnt); Inc(I); dx := 1/Sqr(I); End; Result := Sqrt(Result*6); end; procedure TForm1.Button1Click(Sender: TObject); var Cnt : Integer; P : Extended; begin P := PI_leib(0.000001,Cnt); //P := PI_eiler(0.000001,Cnt); ShowMessage(Format('Pi = %.6f; %d steps.',[P,Cnt])); end; Последняя процка - просто пример вызова с выводом результата. Чем выше задашь точность (чем меньше значение е), тем точнее считает. Только вот кол-во итераций получается большим... |