topografoi.com



Author Topic: Άσκηση: Τρίγωνα;  (Read 8224 times)

chiossif

  • Posts: 334
Άσκηση: Τρίγωνα;
« on: 26 Δεκ 2007, 17:11 »
Να και μια ασκησούλα που έβαλα για σεφτέ στην C/C++. Λύνεται και σε python και έτσι την έφερα και εδώ... Με τις πρώτες λύσεις και στις δύο γλώσσες θα συγκρίνουμε και την πιο κομψή...

Σε ένα αρχείο κειμένου υπάρχουν τρεις πραγματικοί αριθμοί σε κάθε γραμμή. Ζητείται ένα πρόγραμμα το οποίο θα διαβάσει όλες τις τριάδες μέχρι να τελειώσουν και για κάθε μία από αυτές θα ελέγχει αν είναι πλευρές τριγώνου και τότε θα υπολογίζει τα υπόλοιπα στοιχεία του τριγώνου δηλαδή γωνίες, περίμετρο και εμβαδό και θα τα εμφανίζει κατάλληλα. Προαιρετικά μπορείτε με βάση τα στοιχεία αυτά να χαρακτηρίσετε το τρίγωνο σε ορθογώνιο, οξυγώνιο ή αμβλυγώνιο, ισόπλευρο ισοσκελές ή σκαληνό ή ότι άλλο τριγωνο-σχετικό φανταστείτε...

Αυτήν την ασκησούλα όπως και πολλές άλλες δεν τις έχω "γεννήσει" και άρα δεν διεκδικώ την πατρότητα καμιάς (εκτός και αν το γράψω ρητά) (άνω τελεία) τις έχω διαβάσει σε βιβλία, που δυστυχώς δεν θυμάμαι, ή τις είχα συναντήσει όταν ήμουν φοιτητής. Επίσης μην ξεχάσετε να σχολιάσετε την λύση της...

vagvaf

  • Administrator
  • Posts: 204
  • Gender: Male
  • Not all those who wander are lost.
Απ: Άσκηση: Τρίγωνα;
« Reply #1 on: 26 Δεκ 2007, 22:33 »
το έλυσα αλλα δεν ξέρω αν πρέπει να "δώσω" την λύση τόσο νώρίς

όσοι θέλουν να την δούνε την έχω βάλει εδώ : http://users.ntua.gr/rs03080/otinanai.py

σηκώνει βελτιώσεις αλλα απο αύριο ;D


το αρχείο πάνω στο οποίο έγινε η εφαρμογή ειναι αυτο: http://users.ntua.gr/rs03080/test.txt
« Last Edit: 26 Δεκ 2007, 22:37 by Sairin_Lote »
I ♥ Python's Standard Library
Ⓐ▼▲ Ⓐ▼▲

chiossif

  • Posts: 334
Απ: Άσκηση: Τρίγωνα;
« Reply #2 on: 27 Δεκ 2007, 09:30 »
Γρήγορος είσαι...

(καλά αυτή η pythoν πως ανοίγει και διαβάζει έτσι...)

Λοιπόν προτείνω να προστεθούν μερικά "ειδικά" τριγωνάκια:


3 4 5
9 9 9
3 4 7
3.0 4.0000001 4.9999999
1 2 1
3 2 2
1 3 1


Την δική μου δεν πρόλαβα να την λύσω σε C.
Πάντως ευτυχώς που τα forum είναι χωριστά... :-)



vagvaf

  • Administrator
  • Posts: 204
  • Gender: Male
  • Not all those who wander are lost.
Απ: Άσκηση: Τρίγωνα;
« Reply #3 on: 27 Δεκ 2007, 12:16 »
Μεταφέρω εδω μια συζήτηση που έγινε σε chat

Θέμα ήταν τι περιορισμό βάζουμε για να ελέγχουμε αν δημιουργείται τρίγωνο με τις 3 δοθείσες πλευρές.
Η wikipedia (και η ευκλείδια γεωμετρία) γράφει:

Quote
The sum of the lengths of any two sides of a triangle always exceeds (or at the very least, equals) the length of the third side. That is the triangle inequality. (In the special case of equality, two of the angles have collapsed to size zero, and the triangle has degenerated to a line segment.)

Οι δυο "αντίπαλες" προτάσεις ήταν:

if a+b>=c and a+c>=b and c+b>=a :
                                                         τότε τρίγωνο
if a+b>=c or a+c>=b or c+b>=a :
                                                         τότε τρίγωνο

Ποία είναι η σωστή όμως;
Ας δούμε λίγο καλύτερα τον ορισμό του Ευκλείδη :

Quote
Το άθροισμα οποιωνδήποτε 2 πλευρών ενός τριγώνου πάντα είναι μεγαλύτερο (ή ίσο) από την τρίτη.
άρα σε ένα τρίγωνο ισχύει:
ΑΒ+ΑΓ>=ΒΓ
ΑΓ+ΒΓ>=ΑΒ
ΑΒ+ΒΓ>=ΑΓ
αυτές οι 3 σχέσεις λοιπόν ισχύουν σε ΚΑΘΕ τρίγωνο ΤΑΥΤΟΧΡΟΝΑ.

αν χρησιμοποιούσαμε το  or προφανώς θα γινόταν λάθος στους υπολογισμούς γιατί αν η σειρά με το μήκος των πλευρών ήταν κάπως έτσι:
6 3 2

6+3=9>=2
6+2=8>=3
3+2=5<=6 -> μη αποδεκτό

παρόλα αυτά το πρόγραμμα θα το δεχόταν επειδή ισχύει τουλάχιστον 1 ισότητα (or).

Άρα το or είναι λάθος?

Όχι απαραίτητα! Εξαρτάται πως εξετάζεις τον ορισμό και πως προσεγγίζεις το πρόβλημα!
Το or θα ήταν απολύτως σωστό (και το and θα ήταν λάθος) στην περίπτωση που κάποιος αντιλαμβανόταν τον ορισμό έτσι:

Quote
Σε ΚΑΘΕ τρίγωνο η τρίτη πλευρά είναι μικρότερη από το άθροισμα των άλλων δύο.
και ο περιορισμός του προγράμματος θα ήταν κάπως έτσι (προσοχή στις αντεστραμμένες ανισότητες)

if a+b<c or a+c<b or c+b<a :
                                                         τότε MH-τρίγωνο

η ίδια διαδικασία με το and θα ήταν προβληματική γιατί δεν χρειαζόμαστε να ισχύουν ΟΛΕΣ η ανισότητες αυτή τη φορά, μόνο 1.



« Last Edit: 27 Δεκ 2007, 12:21 by Sairin_Lote »
I ♥ Python's Standard Library
Ⓐ▼▲ Ⓐ▼▲

Κωστής

  • Administrator
  • Posts: 577
  • Gender: Male
    • kp
Απ: Άσκηση: Τρίγωνα;
« Reply #4 on: 27 Δεκ 2007, 17:42 »
μια αποριούλα: για 3,4,7 και για 0,0,0 (για παραδειγμα) το σκριπτακι σου βγαζει οτι σχηματιζουν τρίγωνο; με τη συνθήκα που εχεις βαλει
Code: [Select]
    if a+b>=c and a+c>=b and c+b>=a:νομιζω ότι και αυτούς του συνδυασμούς βγαζει οτι σχηματιζουν τρίγωνο... ???

vagvaf

  • Administrator
  • Posts: 204
  • Gender: Male
  • Not all those who wander are lost.
Απ: Άσκηση: Τρίγωνα;
« Reply #5 on: 27 Δεκ 2007, 18:21 »
μια αποριούλα: για 3,4,7 και για 0,0,0 (για παραδειγμα) το σκριπτακι σου βγαζει οτι σχηματιζουν τρίγωνο; με τη συνθήκα που εχεις βαλει
Code: [Select]
    if a+b>=c and a+c>=b and c+b>=a:νομιζω ότι και αυτούς του συνδυασμούς βγαζει οτι σχηματιζουν τρίγωνο... ???

Θεωρητικά και το 3 4 7 είναι τρίγωνο εκφυλισμένο σε ευθεία.

Στο  0 0 0 κάνει raise ZeroDivisionError: float division
το οποιο θα το διορθωσω, δεν περιμενα να βαλει κανεις 0 0 0 για πλευρες τριγωνου  :P
I ♥ Python's Standard Library
Ⓐ▼▲ Ⓐ▼▲

vagvaf

  • Administrator
  • Posts: 204
  • Gender: Male
  • Not all those who wander are lost.
Απ: Άσκηση: Τρίγωνα;
« Reply #6 on: 27 Δεκ 2007, 18:46 »
ανανεωμένος κώδικας

Code: [Select]
import math
x=1
f=open('/home/sairinlote/Desktop/test2.txt')
for line in f:
    (a,b,c)=line.split(' ')
    a,b,c=float(a),float(b),float(c)
    if a+b>c and a+c>b and c+b>a:
        s=0.5*(a+b+c)
        p=a+b+c
        e=math.sqrt(s*(s-a)*(s-b)*(s-c))
        a1=0.5*((b*b+c*c)-a*a)/(b*c)
        b1=0.5*((a*a+c*c)-b*b)/(a*c)
        c1=0.5*((b*b+a*a)-c*c)/(b*a)
        af=math.degrees(math.acos(a1))
        bf=math.degrees(math.acos(b1))
        cf=math.degrees(math.acos(c1))
        print '''line %s : To sxima einai trigwno
        me gwnies a=%.3f deg, b=%.3f deg, c=%.3f deg,
        perimetro:%s m kai emvado:%.6f m^2''' % (x,af,bf,cf,p,e)
        x=x+1
    elif a==0 or b==0 or c==0:
        print 'line %s : Den sximatizetai trigwno me 1 i perissoteres midenikes pleyres' %(x,)
        x=x+1
    elif a+b==c or a+c==b or b+c==a:
        print 'line %s :Sximatizetai trigwno to opoio ekfyllizetai se ey8eia' %(x,)
        x=x+1
    else:
        print 'line %s : Den sximatizetai trigwno' %(x,)
        x=x+1
I ♥ Python's Standard Library
Ⓐ▼▲ Ⓐ▼▲

vagvaf

  • Administrator
  • Posts: 204
  • Gender: Male
  • Not all those who wander are lost.
Απ: Άσκηση: Τρίγωνα;
« Reply #7 on: 27 Δεκ 2007, 20:55 »
Γιατί έχω κατά νου να φτιάξω ένα αρχείο με 2Μ τρίγωνα
για να κοντράρω τον pythonά... (εκεί ΣΙΓΟΥΡΑ του ρίχνω)

se python

Code: [Select]
import random
for i in range(1,2000000):
    print random.uniform(1,1000),' ',random.uniform(1,1000),' ',random.uniform(1,1000)

perimenw apotelesmata  :D

μετα απο 40 λεπτα και ειμαι στις 500.000 γραμμες..
« Last Edit: 27 Δεκ 2007, 21:36 by Sairin_Lote »
I ♥ Python's Standard Library
Ⓐ▼▲ Ⓐ▼▲

vagvaf

  • Administrator
  • Posts: 204
  • Gender: Male
  • Not all those who wander are lost.
Απ: Άσκηση: Τρίγωνα;
« Reply #8 on: 28 Δεκ 2007, 12:48 »
Apo ta 1999999 stoixeia 1002373 itan trigwna, 0 itan trigwna ekfylismena se ey8eia kai 997626 den itan trigwna

real    1m16.799s
user    0m38.542s
sys     0m5.536s
I ♥ Python's Standard Library
Ⓐ▼▲ Ⓐ▼▲

vagvaf

  • Administrator
  • Posts: 204
  • Gender: Male
  • Not all those who wander are lost.
Απ: Άσκηση: Τρίγωνα;
« Reply #9 on: 28 Δεκ 2007, 20:42 »
Αποτελέσματα ταχύτητας σε αρχείο 2.000.000 γραμμών:
Quote from: C
real    1m36.734s
user    0m21.165s
sys     0m6.060s

real    1m38.485s
user    0m20.661s
sys     0m6.064s

 
real    1m33.074s
user    0m21.273s
sys     0m5.904s


real    1m30.812s
user    0m20.517s
sys     0m6.012s

 
real    1m32.208s
user    0m21.153s
sys     0m5.960s


Quote from: Python

real    1m26.733s
user    0m41.247s
sys     0m6.316s

real    1m25.005s
user    0m40.147s
sys     0m5.916s

real    1m31.545s
user    0m41.783s
sys     0m6.212s

real    1m30.938s
user    0m42.355s
sys     0m6.480s
« Last Edit: 28 Δεκ 2007, 20:58 by Sairin_Lote »
I ♥ Python's Standard Library
Ⓐ▼▲ Ⓐ▼▲

 

Copyright © topografoi.com