Αποστολέας Θέμα: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ  (Αναγνώστηκε 1430 φορές)

petros93

  • Νέος
  • *
  • Μηνύματα: 9
ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ
« στις: 11 Νοέ 2010, 03:10:35 μμ »
ΚΑΛΗΣΠΕΡΑ.
Η ΚΑΘΗΓΗΤΡΙΑ ΜΑΣ ΕΒΑΛΕ ΜΙΑ ΑΣΚΗΣΗ ΓΙΑ ΕΥΡΕΣΗ ΤΟΥ ΜΙΚΡΟΤΕΡΟΥ ΤΡΙΩΝ ΑΡΙΘΜΩΝ.
ΤΗΝ ΕΚΑΝΑ ΩΣ ΕΞΗΣ:

ΔΙΑΒΑΣΕ Χ,Υ,Ζ
ΑΝ Χ<=Υ ΚΑΙ Χ<=Ζ ΤΟΤΕ
   ΜΙΚ<-Χ
ΑΛΛΙΩΣ_ΑΝ Χ<=Υ ΚΑΙ Χ>=Ζ ΤΟΤΕ
  ΜΙΚ<-Ζ
ΑΛΛΙΩΣ_ΑΝ Υ<=Χ ΚΑΙ Υ<=Ζ ΤΟΤΕ
  ΜΙΚ<-Υ
ΑΛΛΙΩΝ_ΑΝ Υ<=Χ ΚΑΙ Υ>=Ζ ΤΟΤΕ
  ΜΙΚ<-Ζ
ΤΕΛΟΣ_ΑΝ

ΘΑ ΗΘΕΛΑ ΤΗ ΓΝΩΜΗ ΣΑΣ ΑΝ ΕΙΝΑΙ ΣΩΣΤΗ, ΓΙΑΤΙ Η ΚΑΘΗΓΗΤΡΙΑ ΜΑΣ ΤΗΝ ΕΚΑΝΕ ΜΕ ΑΛΛΟ ΤΡΟΠΟ
ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ.

Eri

  • Καθηγήτρια Πληροφορικής
  • Δεινόσαυρος
  • *****
  • Μηνύματα: 135
Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ
« Απάντηση #1 στις: 11 Νοέ 2010, 11:20:29 μμ »
Πέτρο, γεία σου!
Απάντας σε ένα κλασσικό θέμα εύρεσης μικρότερου από αριθμούς που διαβάζονται (εν προκειμένω 3, θα μπορούσε να ταν 4 και σταματάμε εδω γιατί ακόμη είσαι κατά τα φαινόμενα στη δομή επιλογής).

Εφόσον λοιπόν λύνεις τον αλγόριθμο με την Αλλίως_Αν το πας καλά και θέτεις με σωστή συνθηκη ως ΜΙΚ τον Χ και ακολούθως Υ, γιατι το κουράζεις τόσο με το Ζ;; Θα πρότεινα να πάς με την ίδια φιλοσοφια και για τον Ζ. Δηλαδή μια σύνθετη συνθήκη Ζ<=Χ ΚΑΙ Ζ<=Υ και καθάρισες...


Αναλυτικα:

ΔΙΑΒΑΣΕ Χ,Υ,Ζ
ΑΝ Χ<=Υ ΚΑΙ Χ<=Ζ ΤΟΤΕ
   ΜΙΚ<-Χ
ΑΛΛΙΩΣ_ΑΝ Ζ<=Χ ΚΑΙ Ζ<=Υ ΤΟΤΕ
  ΜΙΚ<-Ζ
ΑΛΛΙΩΣ_ΑΝ Υ<=Χ ΚΑΙ Υ<=Ζ ΤΟΤΕ
  ΜΙΚ<-Υ
ΤΕΛΟΣ_ΑΝ

Κατα τα αλλα ...γνώμη μου είναι να διαβάσεις και να καταλάβεις και τον τρόπο με τον όποιο έλυσε το ίδιο θέμα η καθηγητριά σου. Φαντάζομαι ήταν αυτος που έθεσε ως ΜΙΚ αρχικά αυθαίρετα τον Χ και κατόπιν εκανε σύγκριση του ΜΙΚ με τους άλλους 2.. Ειναι χρήσιμος για μετέπειτα στις επαναλήψεις!!

Πανάγος94

  • Βετεράνος
  • ****
  • Μηνύματα: 65
  • what doesn't kill you only makes you pissed off..
Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ
« Απάντηση #2 στις: 04 Δεκ 2011, 08:29:32 μμ »
πιο εύκολο θα είταν:

ΔΙΑΒΑΣΕ Χ,Υ,Ζ
min <-- Χ
αν Υ < min τοτε min <-- Υ
αν Ζ < min τοτε min <--Z

χωρίς πολλαπλές και τέλος_αν

eara

  • Βετεράνος
  • ****
  • Μηνύματα: 79
Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ
« Απάντηση #3 στις: 08 Δεκ 2011, 02:04:53 μμ »
Η λύση σου πάντως ήταν ΣΩΣΤΗ, αλλά όχι "κομψή".

Σχετικά με την λύση σου, ως προγραμματιστής ... ας προσπαθήσουμε να την δούμε αναλυτικά...

ΑΝ Χ<=Υ ΚΑΙ Χ<=Ζ ΤΟΤΕ
   ΜΙΚ<-Χ


Αν πετύχει ο έλεγχος τότε όντως ο χ είναι ο μικρότερος, αν αποτύχει όμως τι μάθαμε από αυτόν τον έλεγχο;
μάθαμε ότι ισχύει η άρνηση του: Χ>Υ Η Χ>Ζ δηλ. αποκλείεται ο Χ να είναι ο μικρότερος, άρα θα είναι κάποιος από τους άλλους δύο....

ΑΛΛΙΩΣ_ΑΝ Ζ<=Χ ΚΑΙ Ζ<=Υ ΤΟΤΕ
  ΜΙΚ<-Ζ

Οπότε στην συνέχεια εξετάζεις την περίπτωση του Ζ που ζητάς να είναι μικρότερος και από τον Χ και τον Υ, ομοίως εδώ αν πετύχει ο έλεγχος ο μικρότερος θα είναι ο Ζ,
αν αποτύχει τι αποκομίζουμε από την 2η αποτυχία; ότι δεν είναι ο Χ, αλλά ούτε και ο Ζ.... και εφόσον έχεις τρεις μόνο αριθμούς τι έμεινε; να είναι ο Υ!
παρόλα αυτά συνεχίζεις τις συγκρίσεις....

ΑΛΛΙΩΣ_ΑΝ Υ<=Χ ΚΑΙ Υ<=Ζ ΤΟΤΕ
  ΜΙΚ<-Υ

το οποίο έρχεται να επιβεβαιώσει ότι είναι ο Υ, να αποτύχει δεν υπάρχει περίπτωση... οπότε ναι μεν είναι σωστό αλλά.... απλώς είναι περιττός έλεγχος.... μιας και αν η εκτέλεση φτάσει σε αυτήν την εντολή θα εκτελεστεί το MIK<-Υ

τώρα οπότε από εδώ και στο εξής ότι περιπτώσεις και να βάλεις δεν επηρεάζουν την λύση σου... αρκεί να είναι συντακτικά σωστές, αφού δεν υπάρχει περίπτωση να εκτελεστούν ποτές...
εσύ έγραψες...

ΑΛΛΙΩΝ_ΑΝ Υ<=Χ ΚΑΙ Υ>=Ζ ΤΟΤΕ
  ΜΙΚ<-Ζ

Που στην ουσία ελέγχεις την ανισότητα Z<=Y<=X ... Η εντολή αυτή απλώς δεν θα εκτελεστεί ποτέ!!! (βάλε και ένα συντακτικό λάθος "ΑΛΛΙΩΝ_ΑΝ" αλλά ας το παραβλέψουμε)
Είναι σωστή η λύση που έδωσες; (αν εξαιρέσουμε το συντακτικό λαθάκι)
....υπό το πρίσμα ότι κάνει αυτό που ζητήθηκε (δηλ. βρίσκει τον μικρότερο από τρεις αριθμούς) .... ΝΑΙ ΕΙΝΑΙ!
Η τελευταία πάντως εντολή ευτυχώς την έβαλες στο τέλος και δεν εκτελείται γιατί αν την είχες πιο πριν θα ήταν λάθος το πρόγραμμα σου... γιατί πιάνει τον Ζ ως μικρότερο μόνο στην περίπτωση που ο Υ<=Χ και όχι όταν ο Υ>Χ.

τώρα η απάντηση ώς καθηγητής και προγραμματιστής είναι ότι
ναι μεν είναι σωστή η λύση, αλλά η ποιο "κομψή" είναι αυτή του Πανάγος94 και την "στρατηγική" της την περιγράφει το βιβλίο σου...

1. Ξεκινάς με την παραδοχή ότι άν έχεις έναν αριθμό μόνο (π.χ. τον Υ) αυτός θα είναι και ο μικρότερος!!! (οξύμωρο, αλλά αφού δεν έχεις άλλον αριθμό εκτός από αυτόν κάνεις τα στραβά μάτια και λες ότι αφού έχω μόνο έναν αριθμό αυτός θα είναι και ο μικρότερος αριθμός που έχω... αν μιλούσαμε π.χ. για αχλάδια θα ήταν πιο κατανοητό;).

2. Στην συνέχεια παίρνεις έναν καινούργιο αριθμό ακόμα (π.χ. τον Υ) και τον συγκρίνεις με αυτόν που θεωρούσες μέχρι πριν ως μικρότερο.
Αν σου βγεί μικρότερος τότε αυτός είναι ο νέος μικρότερος, αν όχι παραμένει ο παλιός...

Και στην συνέχεια παίρνεις έναν καινούργιο αριθμό ακόμα (π.χ. τον Ζ) και κάνεις τα ίδια...

Και γιατί είναι αυτή πιο "κομψή" λύση, από την δική σου;
1. Είναι ότι μπορεί να γενικευτεί ... όταν μάθετε και την δομή επανάληψης για περισσότερους αριθμούς...
Σκέψου π.χ. την περίπτωση που είχες να βρεις τον μικρότερο ανάμεσα σε 10.000 αριθμούς, θα ήθελες 10.000 εντολές αν!
Ενώ με την επανάληψη και την προσέγγιση που αναφέρει ο Πανάγος94 θα χρειαστείς μόνο μια δομή επανάληψης και ένα Αν.
2. Δεν περιέχει εντολές που δεν θα εκτελεστούν ποτέ (αλλά καταλαμβάνουν χώρο στην μνήμη ενός υπολογιστή).

Η στρατηγική αυτή που την αναφέρει το βιβλίο σου (κάπου) είναι ότι υπάρχουν προβλήματα που ξεκινάς με την μερική λύση, (π.χ. ο μικρότερος αριθμός, όταν έχεις έναν μόνο αριθμό) και σταδιακά προσθέτεις δεδομένα και βρίσκεις νέες μερικές λύσεις, (ο μικρότερος από 2, από 3 κ.ο.κ.).
Στο τέλος όταν έχεις προσθέσει όλα τα δεδομένα σου η μερική λύση θα είναι ...  και η τελική!

Με την ίδια φιλοσοφία και άλλα πολλά προβλήματα, π.χ. ο μεγαλύτερος αριθμός, Το άθροισμα Ν αριθμών, Το γινόμενο Μ αριθμών κ.ο.κ.
Γι αυτό είναι σημαντικό να κατανοήσεις τον τρόπο αυτόν...
« Τελευταία τροποποίηση: 08 Δεκ 2011, 05:03:32 μμ από eara »