0932 - Aria Poligon Simplu

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dau coordonatele în plan pentru n puncte. Să se afișeze valoarea ariei poligonului pe care acestea îl formează.

Date de intrare[edit | edit source]

Fișierul de intrare ariapoligonsimpluin.txt conține pe prima linie numărul de vârfuri ale poligonului, notat cu n. Pe următoarele n linii se găsesc câte două numere separate printr-un spațiu, reprezentând abscisa respectiv ordonata câte unui vârf. Acestea sunt date într-un sens de parcurgere a laturilor poligonului.

Date de ieșire[edit | edit source]

Fișierul de ieșire ariapoligonsimpluout.txt va conține pe prima linie un număr real, cu exact o zecimală, reprezentând valoarea cerută.

Restricţii şi precizări[edit | edit source]

  • Numerele din fișierul de intrare sunt întregi cuprinse între -1001 și 1001.
  • Poligonul nu este neapărat convex dar nu se autointersectează.

Exemplu 1[edit | edit source]

ariapoligonsimpluin.txt
4
0 0
1 0
1 1
0 1
ariapoligonsimpluout.txt
Datele de intrare corespund restrictiilor impuse
1.0


Exemplu 2[edit | edit source]

ariapoligonsimpluin.txt
4
0 0
1 0
1 5000
0 1
ariapoligonsimpluout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def calculeaza_arie(puncte):

   # Calculează aria unui poligon dat prin coordonatele punctelor sale.
   n = len(puncte)
   arie = 0.0
   for i in range(n):
       j = (i + 1) % n
       arie += puncte[i][0] * puncte[j][1]
       arie -= puncte[j][0] * puncte[i][1]
   arie = abs(arie) / 2.0
   return arie


def main():

   with open('ariapoligonsimpluin.txt', 'r') as fin, open('ariapoligonsimpluout.txt', 'w') as fout:
       n = int(fin.readline().strip())
       puncte = []
       for _ in range(n):
           x, y = map(int, fin.readline().split())
           puncte.append((x, y))
       # Verifică dacă datele de intrare respectă restricțiile
       if not all(-1001 <= x <= 1001 and -1001 <= y <= 1001 for x, y in puncte):
           fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
           return
       fout.write("Datele de intrare corespund restrictiilor impuse\n")
       arie = calculeaza_arie(puncte)
       fout.write(f"{arie:.1f}\n")


if __name__ == "__main__":

   main()


</syntaxhighlight>