Πίνακες με συχνότητες ή ταξινόμηση;

Ξεκίνησε από nikolasmer, 16 Φεβ 2014, 10:03:24 ΠΜ

« προηγούμενο - επόμενο »

nikolasmer

Καλημέρα σε όλους. Συνάντησα μια άσκηση προχτές για την οποία δεν γνωρίζω την προέλευσή της. Θέλω πάνω στην εκφώνηση να κάνω κάποιες ερωτήσεις. Αν υπάρχει κάποιο πρόβλημα που την ανέβασα ευχαρίστως να διαγράψω το θέμα.
Λοιπόν
"Να αναπτύξετε αλγόριθμο ο οποίος:
1. θα εισάγει σε μονοδιάστατο πίνακα Α[200], 200 πραγματικούς αριθμούς κάνοντας έλεγχο εισόδου ώστε οι αριθμοί να ανήκουν στο διάστημα [-100,100]
2. Θα εμφανίζει το πλήθος των άρτιων που υπάρχουν στον πίνακα Α
3. θα εμφανίζει τα διαφορετικά στοιχεία που υπάρχουν στον Α καθώς και το πλήθος τους
4. θα εμφανίζει το μήνυμα "αραιός" σε περίπτωση που είναι ....."

Τώρα οι απορίες - ερωτήσεις μου.
α) θα μπορούσε να σταθεί το ερώτημα 2 με αυτή την εκφώνηση; Καθώς στον πίνακα αποθηκεύονται πραγματικές τιμές; Και αν ναι πως θα μπορούσα να το επιλύσω;
β) Σχετικά με το 3ο ερώτημα και αν ο πίνακας περιείχε ακέραια στοιχεία, θα μπορούσα να κάνω έναν πίνακα μετρητών - μέτρησης συχνοτήτων - με 201 θέσεις, πράγμα λίγο δυσνόητο για τα παιδιά (όπως το κατάλαβα με τα μάτια μου) ή θα μπορούσα να κάνω ταξινόμηση τις θερμοκρασίες.  Δε μπορώ να σκεφτώ κάποιο άλλο τρόπο επίλυσης αυτή τη στιγμή. Τί όμως θα ήταν παιδαγωγικά πιο σωστό για τα παιδιά. Ένας πίνακας με μετρητές ή μια ταξινόμηση; Τί έπειτα θα ήταν προγραμματιστικά σωστότερο;
Ευχαριστώ.
Μερεντίτης Νικόλαος
Πληροφορικός

apoldem

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

Dinos

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

Π1: Με δημιουργία πίνακα, που περιέχει τα διαφορετικά στοιχεία
κ ← 0
Για ι από 1 μέχρι 200
  fl ← Ψευδής
  j ← 1
  Όσο fl = Ψευδής και j ≤ κ επανάλαβε
    Αν Β[j] = Α[ι] τότε
      fl ← Αληθής
    αλλιώς
      j ← j + 1
    Τέλος_αν
  Τέλος_επανάληψης
  Αν fl = Ψευδής τότε
    κ ← κ + 1
    Β[κ] ← Α[ι] 
  Τέλος_αν
Τέλος_επανάληψης
Εμφάνισε κ


Π2: με δημιουργία πίνακα-flag (τσεκάρει μόνο τα διαφορετικά στοιχεία)
Για ι από 1 μέχρι 200
  Μ[ι] ← Ψευδής
Τέλος_επανάληψης

Για ι από 1 μέχρι 200
  fl ← Ψευδής
  j ← 1
  Όσο fl = Ψευδής και j ≤ ι επανάλαβε
    Αν Μ[ι] = Αληθής και Α[j] = Α[ι] τότε
      fl ← Αληθής
    αλλιώς
      j ← j + 1
    Τέλος_αν
  Τέλος_επανάληψης
  Αν fl = Ψευδής τότε
    Μ[ι] ← Αληθής
  Τέλος_αν
Τέλος_επανάληψης

πλ ← 0
Για ι από 1 μέχρι 200
  Αν Μ[ι] = Αληθής τότε
    πλ ← πλ + 1
  Τέλος_αν
Τέλος_επανάληψης
Εμφάνισε πλ


Π3: Με ταξινόμηση
Για ι από 2 μέχρι 200
  Για j από 200 μέχρι ι με_βήμα -1
     !κατά φθίνουσα σειρά, χωρίς να έχει σημασία
    Αν Α[j - 1] < Α[j] τότε
      Αντιμετάθεσε Α[j - 1], Α[j] 
    Τέλος_αν
  Τέλος_επανάληψης
Τέλος_επανάληψης

πλ ← 1
ι ← 1
Όσο ι ≤ 190 επανάλαβε
  Αν Α[ι + 1] ≠ Α[ι] τότε
    πλ ← πλ + 1
    ι ← ι + 1
  αλλιώς
    fl ← Αληθής
    Όσο fl = Αληθής επανάλαβε
      Αν Α[ι + 1] ≠ Α[ι] ή ι = 200 τότε
        fl ← Ψευδής
      αλλιώς
        ι ← ι + 1
      Τέλος_αν
    Τέλος_επανάληψης
  Τέλος_αν
Τέλος_επανάληψης

Εμφάνισε πλ


Π4: με πίνακα συχνοτήτων (α)
Για ι από 1 μέχρι 201
  ΠΛ[ι] ← 0
Τέλος_επανάληψης


Για ι από 1 μέχρι 200
  ΠΛ[Α[ι] + 101] ← ΠΛ[Α[ι] + 101] + 1
Τέλος_επανάληψης

π ← 0
Για ι από 1 μέχρι 201
  Αν ΠΛ[ι] ≠ 0 τότε
    π ← π + 1
  Τέλος_αν
Τέλος_επανάληψης
Εμφάνισε π


Π5: με πίνακα συχνοτήτων (β)
σ_πλ ← 0
Για αρ από -100 μέχρι 100
  πλ ← 0
  Για ι από 1 μέχρι 200
    Αν Α[ι] = αρ τότε
      πλ ← πλ + 1
    Τέλος_αν
  Τέλος_επανάληψης
  Αν πλ ≠ 0 τότε
    σ_πλ ← σ_πλ + 1
  Τέλος_αν
Τέλος_επανάληψης

Εμφάνισε σ_πλ



Κατά τη γνώμη μου, πιο κατανοήσιμος και παιδαγωγικά ορθότερος είναι ο 1ος τρόπος.

nikolasmer

Πολύ κατατοπιστικός ο user Dinos.
Ωραιότατες όλες οι μεθοδολογίες. :o
Ευχαριστώ πάρα πολύ όλους.
Μερεντίτης Νικόλαος
Πληροφορικός

petrosp13

Οι ασκήσεις συχνοτήτων δεν αναφέρονται αποκλειστικά σε ακεραίους
Απλά, αυξάνεται αρκετά η δυσκολία αν οι αριθμοί δεν είναι ακέραιοι
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

gpapargi

Aν οι αριθμοί είναι πραγματικοί ή αν είναι ακέραιοι χωρίς περιορισμό τότε η λύση δε διαφέρει... πρέπει να βρεις τους διαφορετικούς και να κάνεις πίνακα συχνοτήτων. Υπάρχει τέτοια άσκηση στο τετράδιο μαθητή (κεφ 10 ΔΣ3) και είναι φυσικά εντός ύλης. Η έννοια του αρτίου και του περιττού ορίζεται μόνο στους ακεραίους.

apoldem

Τι λέει η στατιστική: πίνακα συχνοτήτων μπορούμε να κάνουμε μόνο σε μετρήσιμα σύνολα. Το σύνολο των πραγματικών δεν είναι μετρήσιμο, συνεπώς δεν μπορούμε να κάνουμε πίνακα συχνοτήτων.
Τι ισχύει στον προγραμματισμό: στην πράξη μπορούμε να χρησιμοποιήσουμε την ισότητα ως συνθήκη μεταξύ δύο πραγματικών αριθμών, αλλά η πιθανότητα να είναι δύο πραγματικοί ίσοι είναι 10-19 (αν θυμάμαι καλά). Γι' αυτό απαγορεύεται η χρήση της ισότητας ως συνθήκη σε πραγματικούς, σε όλες τις γλώσσες προγραμματισμού.

petrosp13

Παράθεση από: apoldem στις 17 Φεβ 2014, 02:00:05 ΜΜ
Τι λέει η στατιστική: πίνακα συχνοτήτων μπορούμε να κάνουμε μόνο σε μετρήσιμα σύνολα. Το σύνολο των πραγματικών δεν είναι μετρήσιμο, συνεπώς δεν μπορούμε να κάνουμε πίνακα συχνοτήτων.

Μήπως εννοείς ότι πίνακα συχνοτήτων μπορούμε να κάνουμε μόνο σε διακριτές μεταβλητές;
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

apoldem

Θα μπορούσαμε να το πούμε κι έτσι διακριτή μεταβλητή εναντίον συνεχούς.

gpapargi

Στη στατιστική όταν έχουμε συνεχή μεταβλητή φτιάχνουμε διαστήματα, αυτό είναι λογικό για διάφορους λόγους. Πχ αν πάρεις στην τύχη με ομοιόμορφη κατανομή ένα αριθμό από το 0 ως το 1, η πιθανότητα να είναι πχ ο 0.7 είναι ακριβώς 0 (γιατί τόσο είναι το εμβαδό κάτω από 0.7). Ωστόσο νομίζω ότι δεν πρέπει να αφήσουμε την ορολογία της στατιστικής να μας "πνίξει". Μπορώ κάλλιστα αν έχω ένα πίνακα με τιμές 0.2, 0.5, 0.6, 0.2, 0.7, 0.2, 0.6 κλπ και να ρωτήσω ποιοι είναι οι διαφορετικοί αριθμοί που εμφανίζονται και πόσες φορές εμφανίζεται ο καθένας. Ας μην το ονομάσουμε πίνακα συχνοτήτων αν είναι να μας δημιουργηθεί πρόβλημα με την ορολογία της στατιστικής.
Αυτό με τις ισότητες των πραγματικών, όντως είναι θέμα, απλά έχουμε την τάση μια που μας νοιάζει κυρίως το αλγοριθμικό κομμάτι και όχι οι λεπτομέρειες υλοποίησης του περιβάλλοντος να κάνουμε που και που τα στραβά μάτια (πιθανόν και κακώς). Πχ στη ΓΛΩΣΣΑ αν έχεις το 4/2 που κάνει 2 δεν μπορείς να το βάλεις σε ακέραιο, αλλά είναι κάτι που δε θα ήθελα να το πω στο μαθητή. Όπως επίσης και τα div/mod δεν μπορείς να τα χρησιμοποιήσεις με το 3.0 παρά το ότι είναι ακέραιοι σαν αξία λόγω του ότι είναι πραγματικοί ως προς το χώρο αποθήκευσης. Για το συγκεκριμένο ζήτημα δεν έχω ξεκάθαρη άποψη ως προς αν πρέπει να το θίξουμε.

itt

Παράθεση από: apoldem στις 17 Φεβ 2014, 02:00:05 ΜΜ
Τι ισχύει στον προγραμματισμό: στην πράξη μπορούμε να χρησιμοποιήσουμε την ισότητα ως συνθήκη μεταξύ δύο πραγματικών αριθμών, αλλά η πιθανότητα να είναι δύο πραγματικοί ίσοι είναι 10-19 (αν θυμάμαι καλά). Γι' αυτό απαγορεύεται η χρήση της ισότητας ως συνθήκη σε πραγματικούς, σε όλες τις γλώσσες προγραμματισμού.

Το θέμα είναι όμως ότι δεν έχουμε πραγματικούς αριθμούς, έχουμε αριθμούς με υποδιαστολή. Αν για τα δεδομένα σου επιτρέπεις συγκεκριμένη ακρίβεια, τότε πρέπει να κάνεις στατιστική ανάλυση των δεδομένων που έχεις, το τι κάνουν οι πραγματικοί αριθμοί δεν έχει πολύ νόημα.

Γενικά μπορείς να κάνεις fuzzy σύγκριση αλλά υπερβαίνει τους στόχους του μαθήματος.

apoldem

Πολύ σωστά, αν έχουμε πραγματικούς αριθμούς μέχρι κάποια ακρίβεια τότε το πρόβλημα λύνεται. Να μην ξεχνάμε ποτέ ότι η επιστήμη της πληροφορικής είναι παρακλάδι των εφαρμοσμένων μαθηματικών, οπότε τα μαθηματικά πρέπει να τα έχουμε παρά πόδας συνεχώς. Οι μαθηματικοί τα έχουν λύσει αυτά τα προβλήματα εδώ και 200 χρόνια. Το σύνολο των πραγματικών αν το περιορίσουμε μέχρι μια επιτρεπόμενη ακρίβεια γίνεται μετρήσιμο, οπότε μπορούμε να κατασκευάσουμε πίνακα συχνοτήτων. Αν ε είναι η επιτρεπόμενη ακρίβεια τότε η ισότητα δύο πραγματικών α και β ελέγχεται με την συνθήκη |α - β| < ε, και η ανισότητα α + ε < β.