2015-09-17 1 views
0

Я пишу программу с Паскалем. И иметь некоторые проблемы с условиями.Сложности с условиями pascal

Например, если вы пишете на входе

tArea1 = 6 и sumAreas = 6 слишком
но в "если" структура этой работает неправильно.

Помогите мне, пожалуйста. Tnx.

var 
    x1,x2,x3,x4,y1,y2,y3,y4: real; 
    line1Length, line2Length, line3Length : real; // Length of the triangle area 
    tArea1, tArea2, tArea3, tArea4, sumAreas : real; 

    function segmentLength (x,y,x0,y0:real); 
    begin 
    segmentLength := sqrt(sqr(x-x0) + sqr(y-y0)); 
    end; 

    function triangleArea (a,b,c:real); 
    var 
    p: real; // Half of the perimetr 
    begin 
    p := (a+b+c)/2; 
    triangleArea := sqrt(p*(p-a)*(p-b)*(p-c)); 
    end; 

begin 
    writeln('write x1,y1'); 
    readln(x1,y1); 
    writeln('write x2,y2'); 
    readln(x2,y2); 
    writeln('write x3,y3'); 
    readln(x3,y3); 
    writeln('write x4,y4'); 
    readln(x4,y4); 

    // First triangle 
    line1Length := segmentLength(x1,y1,x2,y2); 
    line2Length := segmentLength(x2,y2,x3,y3); 
    line3Length := segmentLength(x3,y3,x1,y1); 

    tArea1 := triangleArea(line1Length, line2Length, line3Length); 

    // Second triangle 
    line1Length := segmentLength(x4,y4,x2,y2); 
    line2Length := segmentLength(x2,y2,x3,y3); 
    line3Length := segmentLength(x3,y3,x4,y4); 

    tArea2 := triangleArea(line1Length, line2Length, line3Length); 

    // Third triangle 

    line1Length := segmentLength(x4,y4,x1,y1); 
    line2Length := segmentLength(x1,y1,x3,y3); 
    line3Length := segmentLength(x3,y3,x4,y4); 

    tArea3 := triangleArea(line1Length, line2Length, line3Length); 

    // Fourth Triangle 

    line1Length := segmentLength(x4,y4,x1,y1); 
    line2Length := segmentLength(x1,y1,x2,y2); 
    line3Length := segmentLength(x2,y2,x4,y4); 

    tArea4 := triangleArea(line1Length, line2Length, line3Length); 

    // Check dot situated 

    sumAreas := tArea4+tArea2+tArea3; 

    writeln(tArea1, ' // ', sumAreas); // 

    if (sumAreas = tArea1) then 
    begin 
    writeln('In'); 
    end 
    else 
    begin 
    writeln('Out'); 
    end; 

end. 
+3

Что вы пытаетесь сделать, и в чем проблема, с которой вы сталкиваетесь? http://stackoverflow.com/help/how-to-ask – hemflit

+0

Домашние задания ленивых учеников? – Marusyk

ответ

2

Из-за того, что числа с плавающей запятой представлены компьютером, могут быть несоответствия при сравнении двух чисел, которые кажутся одинаковыми. В отличие от целых чисел, числа с плавающей запятой IEEE являются приблизительными, а не точными числами. Необходимость преобразования чисел в форму, которую компьютер может хранить в двоичном коде, приводит к незначительным отклонениям от точности или округления. Например, 1.3 действительно может быть представлен как 1.29999999999.

Поэтому вы не должны использовать = или <> для сравнения двух чисел с плавающей запятой. Вместо этого вычтите два числа и сравните их с очень маленьким числом.

Для вас дела пытаются использовать:

if abs(sumAreas - tArea1) < 0.00001 then 

Там может особенно быть проблемы при использовании функции преобразования, такие как StrToFloat, TextToFloat и StrToCurr

if FloatToStr(sumAreas) = FloatToStr(tArea1) then 

Кроме того, но не рекомендуется:

if Round(sumAreas) = Round(tArea1) then 

Справка: Problems comparing floating point numbers.

+0

ty очень много;) –

+0

Ваши IF имеют избыточные брекеты. :-) –

+0

@MarcovandeVoort Вы имеете в виду 'if (....) then'? – Marusyk

2

Вы сравниваете значения с плавающей точкой с равенством (=) оператора. При сравнении значений с плавающей запятой очень небольшая разница в значении (из-за числовых причин) может привести к отклонениям, что приведет к сбою сравнения.

Лучше тест равенство

if abs(value-valuetocompareto)<eps then 
    writeln('bingo') 
else 
    writeln('tryagain'); 

с ЭПС соответствующий допуск на сколько значение допускается отклонение. (попробуйте с 0.0001 для начала)

Если это домашнее задание, добавьте мотивацию для размера EPS на основе логики или числовой математики в комментарии.

+0

спасибо. Оно работает! –