3207 - Cercuri

From Bitnami MediaWiki

Cerință

Se dau coordonatele şi razele a două cercuri. Să se determine în câte puncte se intersectează cele două cercuri.

Date de intrare

Programul citește de la tastatură numerele reale r1, x1, y1, raza şi coordonatele primului cerc, şi numerele reale r2, x2, y2, raza şi coordonatele ale celui de-al doilea cerc.

Date de ieșire

Programul va afişa pe ecran numărul de puncte în care se intersectează cele două cercuri, sau infinit dacă cercurile sunt identice.

Restricții și precizări

  • Numerele r1 şi r2 sunt numere reale, pozitive şi mai mici decât 100000.
  • Numerele x1, x2, y1, y2 sunt numere reale cu valoarea absolută mai mică decât 10000.

Exemplul 1

Intrare
4 2 -2
2 -3 1
Ieșire
2

Exemplul 2

Intrare
8 0 5
2 0 -5
Ieșire
Datele de intrare corespund restricțiilor impuse.
1

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line="1" start="1"> def validare(r1, x1, y1, r2, x2, y2):

   if 0 < r1 < 100000 and 0 < r2 < 100000 and -10000 < x1 < 10000 and -10000 < y1 < 10000 and -10000 < x2 < 10000 and -10000 < y2 < 10000:
       return True
   return False


def puncte_cercuri(r1, x1, y1, r2, x2, y2):

   if r1 == r2 and x1 == x2 and y1 == y2:
       print("infinit")
   elif (x1 - x2) ** 2 + (y1 - y2) ** 2 == (r1 + r2) ** 2 or (x1 - x2) ** 2 + (y1 - y2) ** 2 == (r1 - r2) ** 2:
       print(1)
   elif (x1 - x2) ** 2 + (y1 - y2) ** 2 > (r1 + r2) ** 2 or (r1 - r2) ** 2 > (x1 - x2) ** 2 + (y1 - y2) ** 2 or (
           x1 - x2) ** 2 + (y1 - y2) ** 2 == 0:
       print(0)
   else:
       print(2)


if __name__ == "__main__":

   r1, x1, y1 = map(int, input('Cercul 1 = ').split())
   r2, x2, y2 = map(int, input('Cercul 2 = ').split())
   if validare(r1, x1, y1, r2, x2, y2):
       print("Datele de intrare corespund restricțiilor impuse.")
       puncte_cercuri(r1, x1, y1, r2, x2, y2)
   else:
       print("Datele de intrare nu corespund restricțiilor impuse.")

</syntaxhighlight>

Explicatie

Acest cod contine doua functii, 'validare' si 'puncte_cercuri', si un bloc 'if' care citeste datele de intrare si apeleaza cele doua functii.

Functia 'validare' verifica daca datele de intrare corespund anumitor restrictii. Aceasta accepta 6 argumente, care sunt razele si coordonatele a doua cercuri si returneaza True daca acestea se afla in intervalul permis (r1, r2 intre 0 si 100000, x1, y1, x2, y2 intre -10000 si 10000), altfel returneaza False.

Functia 'puncte_cercuri' calculeaza numarul de puncte de intersectie dintre cele doua cercuri, sau mesajul "infinit" daca cele doua cercuri sunt identice si se suprapun. Aceasta accepta aceleasi 6 argumente ca si functia 'validare'. Calculeaza distanta dintre centrul cercurilor si verifica daca sunt doua, una sau zero puncte de intersectie. Rezultatul este afisat prin intermediul instructiunii 'print'.

Blocul 'if' citeste datele de intrare de la utilizator pentru cele doua cercuri si verifica daca acestea sunt valide apeland functia 'validare'. Daca datele de intrare sunt valide, afiseaza un mesaj corespunzator si calculeaza numarul de puncte de intersectie apeland functia 'puncte_cercuri'. Daca datele de intrare nu sunt valide, afiseaza un alt mesaj corespunzator.