![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите разобраться [D7]
Лиля © (2006-10-24 20:03:00)Текст задания
Вводятся числа a и b. Найти сумму таких чисел в диапазоне [a;b], которые являются точными квадратами.
Наиль (2006-10-25 07:00:00) [1]> [31] MikePetrichenko © (25.10.06 06:48)
Вот я и говорю, исключение из правил.
Хотя sqrt - Extended, а результат его работы как у целого.
MikePetrichenko (2006-10-25 06:48:00) [2]
> ST0: 4000 0000 0000 0000 0000
> ST1: 4000 0000 0000 0000 0000
Опечатался:
ST0: 4000 С000 0000 0000 0000
ST1: 4000 С000 0000 0000 0000
MikePetrichenko (2006-10-25 06:46:00) [3]Ну. Что я и говорил.
После вычитания
ST0: 3FFF FFFF FFFF FFFF FFFF
ST1: 4000 8000 0000 0000 0000
А вот после корней
ST0: 4000 0000 0000 0000 0000
ST1: 4000 0000 0000 0000 0000
(Для коренй сделал вот так:
procedure TForm1.Button1Click(Sender: TObject);
Var
a,b:Extended;
c,d: Integer;
begin
a:=1.1;
b:=3.1;
a:=a+0.9;
b:=b-1.1;
if a=b
then Button1.Caption:='Ok'
else Button1.Caption:='Foo';
c := 9;
d := 9;
if sqrt(c) = sqrt(d)
then Button1.Caption:='Ok'
else Button1.Caption:='Foo';
end;
)
Смотрел FPU перед сравнение но после вычислений.
MikePetrichenko (2006-10-25 06:31:00) [4]
> procedure TForm1.Button1Click(Sender: TObject);
> Var
> a,b:Extended;
> begin
> a:=1.1;
> b:=3.1;
> a:=a+0.9;
> b:=b-1.1;
> if a=b
> then Button1.Caption:='Ok'
> else Button1.Caption:='Foo';
> end;
Дык не факт, что a=2. Внутри оно вполне может быть 1.9999999999999999999
Тоже могу сказать и про b.
А в приведенном выше примере, если получилось челое число оно приводится к целому и сравнение пройдет на ура.
Наиль (2006-10-25 06:13:00) [5]Пример сравнения Extended
procedure TForm1.Button1Click(Sender: TObject);
Var
a,b:Extended;
begin
a:=1.1;
b:=3.1;
a:=a+0.9;
b:=b-1.1;
if a=b
then Button1.Caption:='Ok'
else Button1.Caption:='Foo';
end;
MikePetrichenko (2006-10-25 05:06:00) [6]
> Проверил, работает.
> В справке написано sqrt:Extended.
> Опыт показывает, что Extended и операция равенства не совместимы.
>
> Оказывается и здесь бывают исключения.
Это не исключение :)
Например
Sqrt(9) = 3 (хоть какое оно Extended или нет, но 3)
Соответственно и Round(Sqrt(9)) = 3
А вот Sqrt(10) = 3.xxxxxxxxxx
Все просто.
Наиль (2006-10-25 05:02:00) [7]> А ты проверь :)
Проверил, работает.
В справке написано sqrt:Extended.
Опыт показывает, что Extended и операция равенства не совместимы.
Оказывается и здесь бывают исключения.
MikePetrichenko (2006-10-25 04:51:00) [8]В догонку. Можешь написать Trunc(), смысл и правильность работы не изменится
MikePetrichenko (2006-10-25 04:48:00) [9]А ты проверь :)
Наиль (2006-10-25 04:43:00) [10]> Sqrt(Loop) = Round(Sqrt(Loop))- ни когда не будет True
MikePetrichenko (2006-10-25 04:39:00) [11]
> Текст задания
> Вводятся числа a и b. Найти сумму таких чисел в диапазоне
> [a;b], которые являются точными квадратами.
А не вот так?
procedure TForm1.Button1Click(Sender: TObject);
var
A: Integer;
B: Integer;
Sum: Integer;
Loop: Integer;
begin
A := StrToInt(Edit1.Text);
B := StrToInt(Edit2.Text);
Sum := 0;
for Loop := A to B do
if Sqrt(Loop) = Round(Sqrt(Loop)) then begin
Inc(Sum, Loop);
Memo1.Lines.Add('Number: ' + IntToStr(Loop));
end;
Memo1.Lines.Add('Summ: ' + IntToStr(Sum));
end;
default (2006-10-24 23:56:00) [12]1*1 2*2 3*3 4*4 5*5 6*6 7*7 ...
1 4 9 16 25 36 49 ..
это ряд квадратов натуральных чисел(целых положительных)
каждый член ряда - точный квадрат
числа a,b задают какой-то кусок этого ряда
думай
Наиль (2006-10-24 22:28:00) [13]1. Ставишь в окно Watch курсор, нажимаешь Insert.
2. Пишешь название переменой.
3. ОК.
Лиля (2006-10-24 22:17:00) [14]
> Переменые должны быть добавлены в окно заранее.
А как добавить?
Anatoly Podgoretsky (2006-10-24 22:05:00) [15]
> В строке 17. Числа - только целые?
Это не только не квадрат, это даже простое число.
Наиль (2006-10-24 21:56:00) [16]
> 2. Напиши алгоритм поиска словами, без кода, - для себя.
> Потом пошагово смотри, срабатывает ли твой алгоритм.
Это означает, что на строчке
A:= StrToInt(Edit1.Text);
нужно поставить точку останова (клавиша F5)
Запустить программу и следить за состоянием переменых i,x и sum в окне Watch (Ctrl+Alt+W). Переменые должны быть добавлены в окно заранее. Движение от строчки к строчке осуществляется клавишей F8.
Продолжить выполнение программы можно клавишей F9.
Наиль (2006-10-24 21:50:00) [17]
> Label1.Caption:=IntToStr(sum)
Лучше заменить на
ListBox1.Items.Add(IntToStr(sum));
Это должно навести тебя на некоторые мысли
Пусик (2006-10-24 21:50:00) [18]
> Всё равно ошибки выдаёт
1. Пиши обязательно, какие ошибки выдает.
2. Напиши алгоритм поиска словами, без кода, - для себя. Потом пошагово смотри, срабатывает ли твой алгоритм.
Наиль (2006-10-24 21:46:00) [19]Для начала проставь комментарии к каждой строчке, как ты понимаешь эту программу, авось поймёшь где ошибка. А потом уже покажи нам, результат твоих рассуждений.
Лиля (2006-10-24 21:44:00) [20]
> Если в [9] заменить в одном месте i на x, то получишь решение
> своей задачи.
> Для лучшего понимания этой программы напиши к ней комментарии
> и обязательно вышли сюда. Будем тебя учить.
procedure TForm1.Button1Click(Sender: TObject);
var A, B, i, x, sum: integer;
begin A:= StrToInt(Edit1.Text);
B:= StrToInt(Edit2.Text);
i:=0;
x:=0;
while (x<=B)do
begin
if (x>=A)then
sum:=sum+i;
inc(i);
x:=i*i;
Label1.Caption:=IntToStr(sum)
end;
end.
Всё равно ошибки выдаёт