? по Python

Discussion in 'PHP' started by VIP, 21 Sep 2008.

  1. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Code:
    #! usr/bin/env python
    #! -*- coding: utf-8 -*-
    x11=3
    x21=7
    x31=12
    x12=5
    x22=7
    x32=8
    y11=1
    y21=9
    y31=1
    y12=3
    y22=5
    y32=3
    
    try:
    	x11=float(x11)
    	x21=float(x21)
    	x31=float(x31)
    	x12=float(x12)
    	x22=float(x22)
    	x32=float(x32)
    	y11=float(y11)
    	y21=float(y21)
    	y31=float(y31)
    	y12=float(y12)
    	y22=float(y22)
    	y32=float(y32)
    except ValueError:
    	print "Error!"
    
    ## проверка существования треугольников
    A1_B1=((x21-x11)**2+(y21-y11)**2)**0.5 ## нахождение длины AB в первом треугольнике
    B1_C1=((x31-x21)**2+(y31-y21)**2)**0.5 ## нахождение длины BC в первом треугольнике
    A1_C1=((x31-x11)**2+(y31-y11)**2)**0.5 ## нахождение длины AC в первом треугольнике
    
    A2_B2=((x22-x12)**2+(y22-y12)**2)**0.5 ## нахождение длины AB вo втором треугольнике
    B2_C2=((x32-x22)**2+(y32-y22)**2)**0.5 ## нахождение длины BC во втором треугольнике
    A2_C2=((x32-x12)**2+(y32-y12)**2)**0.5 ## нахождение длины AC во втором треугольнике
    
    if A1_B1+B1_C1<=A1_C1 or A1_B1+A1_C1<=B1_C1 or A1_C1+B1_C1<=A1_B1:
    	print "Error"
    elif A2_B2+B2_C2<=A2_C2 or A2_B2+A2_C2<=B2_C2 or A2_C2+B2_C2<=A2_B2:
    	print "Error"
    else:
    	a=0
    
    ## построение отрезков от вершины второго к вершинам первого
    A2_A1=((x11-x12)**2+(y11-y12)**2)**0.5
    A2_B1=((x21-x12)**2+(y21-y12)**2)**0.5
    A2_C1=((x31-x12)**2+(y31-y12)**2)**0.5
    
    ## вычисление площадей треугольников
    S_A1_B1_C1=(((A1_B1+B1_C1+A1_C1)/2)*(((A1_B1+B1_C1+A1_C1)/2)-A1_B1)*(((A1_B1+B1_C1+A1_C1)/2)-B1_C1)*(((A1_B1+B1_C1+A1_C1)/2)-A1_C1))**0.5 ## площадь первого треугольника по формуле Герона
    S_A2_B2_C2=(((A2_B2+B2_C2+A2_C2)/2)*(((A2_B2+B2_C2+A2_C2)/2)-A2_B2)*(((A2_B2+B2_C2+A2_C2)/2)-B2_C2)*(((A2_B2+B2_C2+A2_C2)/2)-A2_C2))**0.5 ## площадь второго треугольника по формуле Герона
    
    S_A2_A1_C1=(((A2_A1+A1_C1+A2_C1)/2)*(((A2_A1+A1_C1+A2_C1)/2)-A2_A1)*(((A2_A1+A1_C1+A2_C1)/2)-A1_C1)*(((A2_A1+A1_C1+A2_C1)/2)-A2_C1))**0.5 ## площадь треугольника A2_A1_C1 по формуле Герона
    S_A2_A1_B1=(((A2_A1+A1_B1+A2_B1)/2)*(((A2_A1+A1_B1+A2_B1)/2)-A2_A1)*(((A2_A1+A1_B1+A2_B1)/2)-A1_B1)*(((A2_A1+A1_B1+A2_B1)/2)-A2_B1))**0.5 ## площадь треугольника A2_A1_B1 по формуле Герона
    S_A2_C1_B1=(((A2_C1+B1_C1+A2_B1)/2)*(((A2_C1+B1_C1+A2_B1)/2)-A2_C1)*(((A2_C1+B1_C1+A2_B1)/2)-B1_C1)*(((A2_C1+B1_C1+A2_B1)/2)-A2_B1))**0.5 ## площадь треугольника A2_C1_B1 по формуле Герона
    
    ## построение отрезков от вершины первого к вершинам второго
    A2_A1=((x11-x12)**2+(y11-y12)**2)**0.5
    A1_B2=((x11-x22)**2+(y11-y22)**2)**0.5
    A1_C2=((x11-x32)**2+(y11-y32)**2)**0.5
    
    ## вычисление площадей треугольников
    S_A1_A2_B2=(((A2_A1+A1_B2+A2_B2)/2)*(((A2_A1+A1_B2+A2_B2)/2)-A2_A1)*(((A2_A1+A1_B2+A2_B2)/2)-A1_B2)*(((A2_A1+A1_B2+A2_B2)/2)-A2_B2))**0.5 ## площадь треугольника A2_A1_B2 по формуле Герона
    S_A1_B2_C2=(((A1_B2+A1_C2+B2_C2)/2)*(((A1_B2+A1_C2+B2_C2)/2)-A1_B2)*(((A1_B2+A1_C2+B2_C2)/2)-A1_C2)*(((A1_B2+A1_C2+B2_C2)/2)-B2_C2))**0.5 ## площадь треугольника A1_B2_C2 по формуле Герона
    S_A1_A2_C2=(((A2_A1+A1_C2+A2_C2)/2)*(((A2_A1+A1_C2+A2_C2)/2)-A2_A1)*(((A2_A1+A1_C2+A2_C2)/2)-A1_C2)*(((A2_A1+A1_C2+A2_C2)/2)-A2_C2))**0.5 ## площадь треугольника A1_A2_C2 по формуле Герона
    
    ## сравнение площадей треугольников
    if S_A1_B1_C1==S_A2_A1_C1+S_A2_A1_B1+S_A2_C1_B1:
        print "Second triangle in first"
    elif S_A2_B2_C2==S_A1_A2_B2+S_A1_B2_C2+S_A1_A2_C2:
        print "First triangle in second"
    else:
        print "%f | %f" %(S_A2_B2_C2, S_A1_A2_B2+S_A1_B2_C2+S_A1_A2_C2)
    
    оТработал нормально, вышло 3.000000 | 9.000000 блин, в упор не вижу проблемы у себя, ткни носом плиз, цикл то работает норм, проверял то уже, где проблема ?
     
  2. VIP

    VIP Elder - Старейшина

    Joined:
    29 Dec 2004
    Messages:
    104
    Likes Received:
    3
    Reputations:
    0
    Дело в том, что если убрать третью ветку, то прога вообще ничего не выдаёт (то есть, она выполняет первое сравнение - оно у неё почему-то не выполняется, выполняет второе сравнение - оно не выполняется (это правильно, так как там и должны получаться разные числа)), а затем она тупо встаёт и ничего не делает... Последнюю ветку я сделал, для того, чтобы понять почему она встаёт и заодно просмотреть значения переменных во время выполнения проги (это пока просто для тестирования сделано).
     
  3. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    По заданным тобой данным выполняется только 3 условие, все она нормально работает, я в ней в упор не вижу того что видишь ты, хз короче
     
  4. VIP

    VIP Elder - Старейшина

    Joined:
    29 Dec 2004
    Messages:
    104
    Likes Received:
    3
    Reputations:
    0
    Code:
    #! usr/bin/env python
    #! -*- coding: utf-8 -*-
    x11=3
    x21=7
    x31=12
    x12=5
    x22=7
    x32=8
    y11=1
    y21=9
    y31=1
    y12=3
    y22=5
    y32=3
    
    try:
    	x11=float(x11)
    	x21=float(x21)
    	x31=float(x31)
    	x12=float(x12)
    	x22=float(x22)
    	x32=float(x32)
    	y11=float(y11)
    	y21=float(y21)
    	y31=float(y31)
    	y12=float(y12)
    	y22=float(y22)
    	y32=float(y32)
    except ValueError:
    	print "Error!"
    
    ## проверка существования треугольников
    A1_B1=((x21-x11)**2+(y21-y11)**2)**0.5 ## нахождение длины AB в первом треугольнике
    B1_C1=((x31-x21)**2+(y31-y21)**2)**0.5 ## нахождение длины BC в первом треугольнике
    A1_C1=((x31-x11)**2+(y31-y11)**2)**0.5 ## нахождение длины AC в первом треугольнике
    
    A2_B2=((x22-x12)**2+(y22-y12)**2)**0.5 ## нахождение длины AB вo втором треугольнике
    B2_C2=((x32-x22)**2+(y32-y22)**2)**0.5 ## нахождение длины BC во втором треугольнике
    A2_C2=((x32-x12)**2+(y32-y12)**2)**0.5 ## нахождение длины AC во втором треугольнике
    
    if A1_B1+B1_C1<=A1_C1 or A1_B1+A1_C1<=B1_C1 or A1_C1+B1_C1<=A1_B1:
    	print "Error"
    elif A2_B2+B2_C2<=A2_C2 or A2_B2+A2_C2<=B2_C2 or A2_C2+B2_C2<=A2_B2:
    	print "Error"
    else:
    	a=0
    
    ## построение отрезков от вершины второго к вершинам первого
    A2_A1=((x11-x12)**2+(y11-y12)**2)**0.5
    A2_B1=((x21-x12)**2+(y21-y12)**2)**0.5
    A2_C1=((x31-x12)**2+(y31-y12)**2)**0.5
    
    ## вычисление площадей треугольников
    S_A1_B1_C1=(((A1_B1+B1_C1+A1_C1)/2)*(((A1_B1+B1_C1+A1_C1)/2)-A1_B1)*(((A1_B1+B1_C1+A1_C1)/2)-B1_C1)*(((A1_B1+B1_C1+A1_C1)/2)-A1_C1))**0.5 ## площадь первого треугольника по формуле Герона
    S_A2_B2_C2=(((A2_B2+B2_C2+A2_C2)/2)*(((A2_B2+B2_C2+A2_C2)/2)-A2_B2)*(((A2_B2+B2_C2+A2_C2)/2)-B2_C2)*(((A2_B2+B2_C2+A2_C2)/2)-A2_C2))**0.5 ## площадь второго треугольника по формуле Герона
    
    S_A2_A1_C1=(((A2_A1+A1_C1+A2_C1)/2)*(((A2_A1+A1_C1+A2_C1)/2)-A2_A1)*(((A2_A1+A1_C1+A2_C1)/2)-A1_C1)*(((A2_A1+A1_C1+A2_C1)/2)-A2_C1))**0.5 ## площадь треугольника A2_A1_C1 по формуле Герона
    S_A2_A1_B1=(((A2_A1+A1_B1+A2_B1)/2)*(((A2_A1+A1_B1+A2_B1)/2)-A2_A1)*(((A2_A1+A1_B1+A2_B1)/2)-A1_B1)*(((A2_A1+A1_B1+A2_B1)/2)-A2_B1))**0.5 ## площадь треугольника A2_A1_B1 по формуле Герона
    S_A2_C1_B1=(((A2_C1+B1_C1+A2_B1)/2)*(((A2_C1+B1_C1+A2_B1)/2)-A2_C1)*(((A2_C1+B1_C1+A2_B1)/2)-B1_C1)*(((A2_C1+B1_C1+A2_B1)/2)-A2_B1))**0.5 ## площадь треугольника A2_C1_B1 по формуле Герона
    
    ## построение отрезков от вершины первого к вершинам второго
    A2_A1=((x11-x12)**2+(y11-y12)**2)**0.5
    A1_B2=((x11-x22)**2+(y11-y22)**2)**0.5
    A1_C2=((x11-x32)**2+(y11-y32)**2)**0.5
    
    ## вычисление площадей треугольников
    S_A1_A2_B2=(((A2_A1+A1_B2+A2_B2)/2)*(((A2_A1+A1_B2+A2_B2)/2)-A2_A1)*(((A2_A1+A1_B2+A2_B2)/2)-A1_B2)*(((A2_A1+A1_B2+A2_B2)/2)-A2_B2))**0.5 ## площадь треугольника A2_A1_B2 по формуле Герона
    S_A1_B2_C2=(((A1_B2+A1_C2+B2_C2)/2)*(((A1_B2+A1_C2+B2_C2)/2)-A1_B2)*(((A1_B2+A1_C2+B2_C2)/2)-A1_C2)*(((A1_B2+A1_C2+B2_C2)/2)-B2_C2))**0.5 ## площадь треугольника A1_B2_C2 по формуле Герона
    S_A1_A2_C2=(((A2_A1+A1_C2+A2_C2)/2)*(((A2_A1+A1_C2+A2_C2)/2)-A2_A1)*(((A2_A1+A1_C2+A2_C2)/2)-A1_C2)*(((A2_A1+A1_C2+A2_C2)/2)-A2_C2))**0.5 ## площадь треугольника A1_A2_C2 по формуле Герона
    
    ## сравнение площадей треугольников
    if S_A1_B1_C1==S_A2_A1_C1+S_A2_A1_B1+S_A2_C1_B1:
        print "Second triangle in first"
    elif S_A2_B2_C2==S_A1_A2_B2+S_A1_B2_C2+S_A1_A2_C2:
        print "First triangle in second"
    else:
        print "%f | %f" %(S_A1_B1_C1, S_A2_A1_C1+S_A2_A1_B1+S_A2_C1_B1)
    
    Вот этот код не работает. Когда он сравнивает числа, которые получаются в первой ветке цикла они получаются 36 и 36, а он уходит в ELSE.

    В этом коде он на печать выдаёт переменные из первой ветки цикла
     
    1 person likes this.
  5. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    ЫЫ (вырезано цензурой), (вырезано цензурой), (вырезано цензурой), понял, в чем срань - ты походу сравниваешь разные типы данных, попробуй первый if написать так :
    if str(S_A1_B1_C1)==str(S_A2_A1_C1+S_A2_A1_B1+S_A2_C1_B1):print "Second triangle in first" - то есть, перевести его в строку, походу у тебя сравниваются int и float - что для интерпритатора походу разные вещи

    Хотя это какие-то бакапоры самого if - он сцуко не хочет нормально сравнивать никакие значения, кроме тех случаев когда они не str() - пробовал и
    if int(S_A1_B1_C1)==int(S_A2_A1_C1+S_A2_A1_B1+S_A2_C1_B1):print "Second triangle in first"
    и
    if float(S_A1_B1_C1)==float(S_A2_A1_C1+S_A2_A1_B1+S_A2_C1_B1):print "Second triangle in first"
    корректно работает только если
    if str(S_A1_B1_C1)==str(S_A2_A1_C1+S_A2_A1_B1+S_A2_C1_B1):print "Second triangle in first"
     
    #45 login999, 8 Dec 2008
    Last edited: 8 Dec 2008
  6. VIP

    VIP Elder - Старейшина

    Joined:
    29 Dec 2004
    Messages:
    104
    Likes Received:
    3
    Reputations:
    0
    Сегодня мне объяснили в чём проблема: оказывается там не ровно 36 получается, а с хвостиком, поэтому надо было вводить погрешность =)

    Спасибо тем, кто мне помогал!