0932 - Aria Poligon Simplu
De la Universitas MediaWiki
Cerinţa
Se dau coordonatele în plan pentru n puncte. Să se afișeze valoarea ariei poligonului pe care acestea îl formează.
Date de intrare
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
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
- 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
- ariapoligonsimpluin.txt
4 0 0 1 0 1 1 0 1
- ariapoligonsimpluout.txt
Datele de intrare corespund restrictiilor impuse 1.0
Exemplu 2
- ariapoligonsimpluin.txt
4 0 0 1 0 1 5000 0 1
- ariapoligonsimpluout.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare
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()