![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Здравствуйте!
Очень прошу, не кидайте в меня тапками за мои вопросы! Я совершеннеший новичок в программировании и очень нуждаюсь в помощи! Задача такова: "Необходимо высчитать квадратный корень числа (задано число в SpinEdit) вавилонским способом: 1) Нужно, что бы число было больше ноля 2) Что бы число было больше единицы. Если число отрицательное, то необходимо сделать его положительным и запомнить его. Это число нужно разделить на 2 и получить результат, который в сл. шаге будет делителем. Полученное среднее значение будет делителем в сл. шаге. Делитель и среднее значение приводят к приблизительно одному результату, которе и является квадратным корнем. Программа будет прервана после 6 попыток и именно шестая будет наиболее близка к ответу. " Уфф....если не совсем понятно, что значит по вавилонски, пожалуйста, посмотрите тут: http://en.wikipedia.org/wiki/Methods...onian_metho d Вот, мои мучения...позориться нам не привыкать ![]() Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin; type TForm1 = class(TForm) SpinEdit1: TSpinEdit; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Zahl1,Zahl2,Wurzel: Real; Quadratwurzel:Integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Zahl1:=StrToFloat(SpinEdit1.Text); If Zahl1>1 then Wurzel:= Quadratwurzel(Zahl1); Label1.Caption:=FloatToStr(Wurzel); end; If Zahl1<1 then Zahl2:=Zahl1*(1/-1); Wurzel:=Quadratwurzel(Zahl2); Label1.Caption:=FloatToStr(Wurzel); end; function TForm1.Quadratwurzel:String; Mittelwert1:= (Zahl1+1)/2; Mittelwert2:=(Mittelwert1+Zahl1/Mittelwert1); Mittelwert3:=(Mittelwert2+Zahl1/Mittelwert2); Mittelwert4:=(Mittelwert3+Zahl1/Mittelwert3); Mittelwert5:=(Mittelwert4+Zahl1/Mittelwert4); Mittelwert6:=(Mittelwert5+Zahl1/Mittelwert5); Ergebnis:=Mittelwert6; Label1.Caption:=FloatToStr(Ergebnis); end; end. Буду очень признательна за помощь! Уж хочется решить задачку и начать спокойно спать по ночам! Последний раз редактировалось Admin, 07.01.2013 в 14:26. |
#2
|
||||
|
||||
![]() Хочешь сказать, что этот код компилиться?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
![]() Нет, не хочу сказать... иначе не просила бы о помощи!
Где моя ошибка? Что я делаю неправильно? ![]() |
#4
|
||||
|
||||
![]() Для начала: куча неопределённых переменных, несоответствие типов, неверно расставлены операторные скобки (begin/end).
И после всех исправлений - неверный алгоритм. Мне лень разбираться с алгоритмом, пока только подправил ваш код Код:
type TForm1 = class(TForm) Label1: TLabel; SpinEdit1: TSpinEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure Quadratwurzel(Value : Single); end; var Form1: TForm1; Zahl1 : Single; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Zahl1 := StrToFloat(SpinEdit1.Text); if Zahl1 > 1 then Quadratwurzel(Zahl1); if Zahl1 < 1 then Quadratwurzel(Abs(Zahl1)); end; procedure TForm1.Quadratwurzel(Value : Single); var I : Integer; S : Single; begin S := Value / 2; for I := 0 to 4 do S := (S + Value) / S; Label1.Caption := FloatToStr(S); end; end. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 06.01.2013 в 01:19. |
#5
|
||||
|
||||
![]() Цитата:
Про неверный алгоритм я сразу поняла, спасибо...а вот с неопреленной кучей, пожалуй, не соглашусь. Обозвала как могла...при этом дико старалась! Ткните носом, пожалуйста! Я внимательно еще раз все просмотрела и не вижу у себя ошибок (за исключением оп. скобок begin/end) |
#6
|
||||
|
||||
![]() Ух как здорово - не согласится. Ну так возьми и откомпилируй. Пусть Дельфи натыкает носом во все неверные места.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
||||
|
||||
![]() Спасибо большое... пара слов совсем незнакомы, буду разбираться
|
#8
|
||||
|
||||
![]() Цитата:
Вам легко говорить, когда вы спец! А что делать нам, чайникам? |
#9
|
||||
|
||||
![]() Что незнакомо?
Учиться. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#10
|
||||
|
||||
![]() Цитата:
Дык учимся, вот... Незнакомо Value : Single Abs это ж функция? И почему for I := 0 to 4, а не for I:=0 to 6 do, извиняюсь? |
#11
|
||||
|
||||
![]() 1. В Дельфи тип Real оставлен для совместимости, рекомендуется использовать Single.
2. Abs - возвращает абсолютное значение от числа. 3. Цикл от 0 до 4 равен 5 "шагам" + получение первого делителя (S := Value / 2). Попытка for I:=0 to 6 do ни к чему хорошему не приведёт, так получится 7 "шагов". Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#12
|
||||
|
||||
![]() Цитата:
Огромное спасибо! Сейчас попробую... |
#13
|
||||
|
||||
![]() Ответы не те...видать формула неверна.
|
#14
|
||||
|
||||
![]() Посмотреть приведённый вариант сложно?
Код:
procedure TForm1.Quadratwurzel(Value : Single); var I : Integer; S : Single; begin S := Value / 2; for I := 0 to 4 do S := (S + Value) / S; Label1.Caption := FloatToStr(S); end; Формула, конечно, неверна. Но направление есть, теперь правьте формулу. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#15
|
||||
|
||||
![]() Цитата:
Да, я после заметила...исправила! Огромное спасибо! Вы спасли меня от мук! |