![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
День добрый.
Подскажите, пожалуйста, где ошибка в вычислении среднего арифметического, и как округлить результат до 2-х знаков после запятой. Компилится но выдает ошибку при введении числа:Exception class EConvertError with message ''''' is not a valid integer value'. Спасибо Код:
procedure TForm1.Edit1Change(Sender: TObject);
var
i,sum,kol: integer;
sr:real;
begin
sum:=Strtoint(Edit1.Text)+Strtoint(Edit2.Text);
kol:=2;
sr:=sum/kol;
Label1.Caption:=Floattostr(sr);
end; |
|
#2
|
|||
|
|||
|
Ругается т.к. в Edit попадает значение которе нельзя преобразовать, использкуй TryStrToInt. Округлить можно умножением на 10^n и отбрасыванием остального, либо подключить модуль Math и использлвать RoundTo.
Код:
procedure TForm1.Edit1Change(Sender: TObject); var i,j: integer; begin if TryStrToInt(Edit1.Text, i) and TryStrToInt(Edit2.Text, j) then Label1.Caption:=Floattostr(trunc((i+j)/2*100)/100) else Label1.Caption:='error'; end; |
|
#3
|
|||
|
|||
|
Сделал так:
Код:
procedure TForm1.Edit1Change(Sender: TObject); var i,j: integer; begin if TryStrToInt(Edit1.Text, i) and TryStrToInt(Edit2.Text, j) then Label1.Caption:=Floattostr(trunc((i+j)/2*100)/100) else Label1.Caption:=Floattostr(trunc((i+j)/1*100)/100); end; procedure TForm1.Edit2Change(Sender: TObject); var i,j: integer; begin if TryStrToInt(Edit1.Text, i) and TryStrToInt(Edit2.Text, j) then Label1.Caption:=Floattostr(trunc((i+j)/2*100)/100) else Label1.Caption:=Floattostr(trunc((i+j)/1*100)/100); end; Теперь при вводе в Edit1 и пустом Edit2 показывает правильный результат, но при вводе в Edit2 выдает ошибку результата, непонятное число... Есть вычисления с 4-5 полями(для этого и округление до сотых), при этом, если поле или поля пустые, не должны участвовать... Подкажите, пожалуйста, как реализовать это. Спасибо |
|
#4
|
||||
|
||||
|
Очисти переменные...
Код:
i:=0; j:=0; |
|
#5
|
|||
|
|||
|
Исправил, во втором onchange поменял местами Edit1 и Edit2, теперь работает.
Еще вопрос: Как ограничить написание значения в Edit, скажем до 30? Подскажите, пожалуйста, как при значении, скажем Edit1 от 1 до 10 выдать Label2.Caption один, при вводе другого промежутка значения, соответственно другой результат? При попытке записать так: Код:
for i := 0 to 10 do Label2.Caption:= '1'; for i := 11 to 20 do Label2.Caption:= '2'; Спасибо Последний раз редактировалось doctordradd, 09.11.2010 в 18:49. |
|
#6
|
|||
|
|||
|
1) Проверяй в OnChange значение
Код:
TryStrToInt(Edit1.Text, i); if i>30 then Edit1.Text:='30'; Код:
case i of
0..10: Label2.Caption:='1';
11..20: Label2.Caption:='2';
else Label2.Caption:='3';
end; |
|
#7
|
|||
|
|||
|
Цитата:
В этом случае всегда выдает значение "1", т.е вводится первая цифра двузначного числа и срабатывает первая формула.... |
|
#8
|
|||
|
|||
|
Значит значение i всегда находится в диапазоне 0..10, ищи ошибку в коде, возможно у тебя где-то переписывается значение переменной или еще что-то...
|
|
#9
|
|||
|
|||
|
Вычисляется среднее арифметическое из 3 уже средних значений, каждое из которых формата:
Код:
Label1.Caption:='Среднее значение: '+Floattostr(trunc((i+j)/2*100)/100) Можно ли Вычислить среднее значение таких label, не разделяя их на 2 части, 1 текст и другую цифровое значение? Проблема в 'Среднее значение: ' ... |
|
#10
|
||||
|
||||
|
среднее всех label:
функцией Pos вырезай "Среднее значение: ", потом StrToFloat что0-то типа: PHP код:
Последний раз редактировалось SerginhoLD, 12.11.2010 в 11:05. |