Εμένα πάντως με ζόρισε...

Ξεκίνησε από Cloud_Strife, 26 Απρ 2010, 03:12:26 ΜΜ

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

Cloud_Strife

Εκφώνηση:
"Να γράψετε πρόγραμμα το οποίο θα καταχωρεί σε ένα πίνακα 50 ακέραιες τιμές από το 10 έως το 20 και θα βρίσκει την τιμή που εμφανίζεται με μεγαλύτερη συχνότητα."
Σημείωση: Επειδή δεν διευκρινίζει αν η τιμή είναι μοναδική ή όχι, σε περίπτωση που υπάρχουν δύο ή περισσότεροι αριθμοί με ίδια συχνότητα, τους εμφανίζω όλους.

Πριν σας παραθέσω την λύση την οποία σκέφτηκα θέλω να σας πω ότι η παρούσα άσκηση με ζόρισε όσο καμία άλλη φέτος στην ΑΕΠΠ. Μου πήρε περίπου δυόμιση ώρες να την λύσω. Φυσικά έκανα πολλές δοκιμές και αλλαγές και πάντα κάτι μου έλειπε. Δεν μου έλειπε ο αριθμός εμφάνιση ενός αριθμού στον πίνακα των 50 θέσεων,  αλλά ο ίδιος ο αριθμός. Για αυτό τον λόγο έφτιαξα τον πίνακα ΑΡ[11]. Δείτε την λύση που σας παραθέτω και περιμένω τα σχόλια ή τις διορθώσεις σας.
(Σας επισυνάπτω και αρχείο *.psc για την ΓλωσσοΜάθεια)

Μπορεί να γελάσετε αλλά ενώ στην ΑΕΠΠ τα πηγαίνω εξαιρετικά και περιμένω να γράψω πολύ ψηλά, εδώ τα είδα όλα και πιστέυω ότι είναι υπερβολικά δύσκολη, τόσο στην κατανόηση όσο στην λύση.

Λύση:


ΠΡΟΓΡΑΜΜΑ Άσκηση_D
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι, j, Μ, ΠΙΝ[50], ΣΥΧΝ[11], ΑΡ[11], max
ΑΡΧΗ
! Γεμίζω έναν πίνακα  ΑΡ[11] με αριθμούς από το 10 εώς το 20
  ΓΙΑ ι ΑΠΟ 10 ΜΕΧΡΙ 20
    ΑΡ[ι-9] <-- ι
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ! Γεμίζω τον πίνακα ΠΙΝ[50] με τυχαίους αριθμούς από το 10 εώς το 20
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 50
    ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
      ΔΙΑΒΑΣΕ ΠΙΝ[ι]
    ΜΕΧΡΙΣ_ΟΤΟΥ ΠΙΝ[ι]>=10 ΚΑΙ ΠΙΝ[ι]<=20
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ! Γεμίζω τον πίνακα ΣΥΧΝ[11] με τον αριθμό εμφάνισης κάθε αριθμού στον πίνακα ΠΙΝ[50]
  ΓΙΑ j ΑΠΟ 10 ΜΕΧΡΙ 20
    Μ <-- 0
    ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 50
      ΑΝ ΠΙΝ[ι]=j ΤΟΤΕ
        Μ <-- Μ+1
      ΤΕΛΟΣ_ΑΝ
      ΣΥΧΝ[j-9] <-- Μ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ! Βρίσκω το μέγιστο αριθμό εμφάνισης (max) στον πίνακα ΣΥΧΝ[11]
  max <-- ΣΥΧΝ[1]
  ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ 11
    ΑΝ max<ΣΥΧΝ[ι] ΤΟΤΕ
      max <-- ΣΥΧΝ[ι]
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ! Εμφανίζω τον αριθμό ή τους αριθμούς με την μεγαλύτερη συχνότητα εμφάνισης
  ΓΡΑΨΕ 'Βρέθηκε (αν) στον πίνακα με μεγαλύτερη συχνότητα (',max,'φορές ), ο αριθμός ή οι αριθμοί:'
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 11
    ΑΝ max=ΣΥΧΝ[ι] ΤΟΤΕ
      ΓΡΑΨΕ ΑΡ[ι]
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


Φιλικά, Αλέξανδρος.

evry

Αν έχεις χρόνο προσπάθησε να λύσεις το ίδιο ακριβώς πρόβλημα αλλά χωρίς να ξέρεις τις τιμές των αριθμών, δηλαδή δεν ξέρεις ότι είναι από 10-20, οι τιμές μπορεί να είναι οποιεσδήποτε.

Δες και την παρακάτω αλλαγή και πες μου τη γνώμη σου, αν σου φαίνεται καλύτερο έτσι δηλαδή από θέμα κατανόησης
Παράθεση από: Cloud_Strife στις 26 Απρ 2010, 03:12:26 ΜΜ
  ! Γεμίζω τον πίνακα ΣΥΧΝ[11] με τον αριθμό εμφάνισης κάθε αριθμού στον πίνακα ΠΙΝ[50], αφού πρώτα μηδενίσω τον ΣΥΧΝ
    ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 50
      ΣΥΧΝ[ ΠΙΝ[ι] - 9 ] <-- ΣΥΧΝ[ ΠΙΝ[ι] - 9 ] + 1
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Cloud_Strife

Παράθεση από: evry στις 26 Απρ 2010, 03:53:06 ΜΜ
Αν έχεις χρόνο προσπάθησε να λύσεις το ίδιο ακριβώς πρόβλημα αλλά χωρίς να ξέρεις τις τιμές των αριθμών, δηλαδή δεν ξέρεις ότι είναι από 10-20, οι τιμές μπορεί να είναι οποιεσδήποτε.

Δες και την παρακάτω αλλαγή και πες μου τη γνώμη σου, αν σου φαίνεται καλύτερο έτσι δηλαδή από θέμα κατανόησης
Παράθεση
  ! Γεμίζω τον πίνακα ΣΥΧΝ[11] με τον αριθμό εμφάνισης κάθε αριθμού στον πίνακα ΠΙΝ[50], αφού πρώτα μηδενίσω τον ΣΥΧΝ
    ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 50
      ΣΥΧΝ[ ΠΙΝ[ι] - 9 ] <-- ΣΥΧΝ[ ΠΙΝ[ι] - 9 ] + 1
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Ο πίνακας ΣΥΧΝ είναι 11 θέσεων, αφού 11 είναι οι ακέραιοι αριθμοί μεταξύ 10 μέχρι 20.
Αν τρέξω την παραπάνω ΓΙΑ θα βγω εκτός ορίου.
Αν μπορείς σε παρακαλώ πόλυ, επεξήγησε λίγο τη λειτουργία.

Σούλας Βασίλης

#3
!ΓΕΜΙΣΜΑ ΠΙΝΑΚΑ
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 50
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ ΄ΔΩΣΕ ΤΟΝ΄,Ι,΄ ΑΡΙΘΜΟ ΤΟΥ ΠΙΝΑΚΑ΄
ΔΙΑΒΑΣΕ ΠΙΝ[Ι]
ΜΕΧΡΙΣ_ΟΤΟΥ ΠΙΝ[Ι]>=10 ΚΑΙ ΠΙΝ[Ι]<=20
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
!ΜΗΔΕΝΙΣΜΑ ΠΙΝΑΚΑ ΣΥΧΝΟΤΗΤΩΝ
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 11
ΣΥΧΝ[Ι] <- 0
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
!ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ ΣΥΧΝΟΤΗΤΩΝ
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 50
Χ <- ΠΙΝ[Ι]
ΣΥΧΝ[Χ-9] <- ΣΥΧΝ[Χ-9]+1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
!ΜΕΓΙΣΤΟ ΣΤΟ ΠΙΝΑΚΑ ΣΥΧΝΟΤΗΤΩΝ
ΜΕΓ <- ΣΥΧΝ[1]
ΓΙΑ Ι ΑΠΟ 2 ΜΕΧΡΙ 11
ΑΝ ΜΕΓ<ΣΥΧΝ[Ι] ΤΟΤΕ
ΜΕΓ <- ΣΥΧΝ[Ι]
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

! ΕΜΦΑΝΙΖΩ ΤΟΝ ΑΡΙΘΜΟ Η ΤΟΥΣ ΑΡΙΘΜΟΥΣ ΜΕ ΤΗΝ ΜΕΓΑΛΥΤΕΡΗ ΣΥΧΝΟΤΗΤΑ ΕΜΦΑΝΙΣΗΣ 
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 11
ΑΝ ΜΕΓ=ΣΥΧΝ[Ι] ΤΟΤΕ
ΓΡΑΨΕ ΄Ο ΑΡΙΘΜΟΣ ΄,Ι+9,΄ΕΜΦΑΝΙΣΤΗΚΕ ΤΙΣ ΠΕΡΙΣΣΟΤΕΡΕΣ ΦΟΡΕΣ΄
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

Σούλας Βασίλης
Ηλεκτρολόγος Μηχανικός & Μηχανικός Η/Υ Δ.Π.Θ.
Καθηγητής Πληροφορικής ΠΕ19
http://users.sch.gr/vasisoulas
http://eclass.sch.gr/modules/auth/opencourses.php?fc=%D4-52

Keep Growing

! Γεμίζω τον πίνακα ΣΥΧΝ[11] με τον αριθμό εμφάνισης κάθε αριθμού στον πίνακα ΠΙΝ[50], αφού πρώτα μηδενίσω τον ΣΥΧΝ
    ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 50
      ΣΥΧΝ[ ΠΙΝ[ι] - 9 ] <-- ΣΥΧΝ[ ΠΙΝ[ι] - 9 ] + 1
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Το έχω ξαναγράψει. Ο Ευριπίδης είναι "μανούλα" στη συμπίεση κώδικα.
Το αποτέλεσμα όμως είναι να παθαίνει σοκ  :o ο ανυποψίαστος μαθητής.

Ο μαθητής μπερδεύει την έννοια του περιεχομένου μιας θέσης πίνακα(αλλά και της ίδιας της θέσης), όταν η θέση αυτή προσδιορίζεται από το περιεχόμενο μιας θέσης ενός άλλου πίνακα. 
Έτσι και αλλιώς πάντως και η "αναερόβια" άσκηση έχει την αξία της.
Ο Έρωτας (του Εκπ/κου Πληροφορικού) στ' αλώνια της καλδέρας (του υπνωτισμού).

evry

Δεν θα βγεις εκτός ορίου. Προσπάθησε να τρέξεις τη Για για μερικές τιμές του πίνακα και θα καταλάβεις τι εννοώ.

@keep growing
Αυτό που λες είναι ο στόχος μου και όχι η συμπίεση κώδικα
Δεν είναι μόνο θέμα συμπίεσης κώδικα από την οπτική πλευρά, αλλά αποφεύγεις και περιττές συγκρίσεις.
Από διδακτικής πλευράς, είναι μια καλή εξάσκηση για να δεις αν ο μαθητής έχει καταλάβει πραγματικά τι σημαίνει πίνακας και αν έχει χωνέψει ότι το στοιχείο πίνακα είναι στην ουσία μια μεταβλητή που μπορεί να παίξει ακόμα και τον ρόλο του δείκτη σε έναν άλλο πίνακα ή ακόμα και στον ίδιο.
   Το θεωρώ σημαντικό δηλαδή από εννοιολογική πλευρά. Κάνω copy paste την εξήγηση που δίνω στους μαθητές μου για το συγκεκριμένο "κόλπο"


Έστω βαθμός[Ν] ο πίνακας των βαθμών και σ[20] ο πίνακας των συχνοτήτων. Τότε παρατηρούμε ότι :
Αν ο βαθμός είναι 1 (βαθμός[ι] = 1)       αυξάνουμε το μετρητή σ[1]
Αν ο βαθμός είναι 2 (βαθμός[ι] = 2)       αυξάνουμε το μετρητή σ[2]
Αν ο βαθμός είναι 3 (βαθμός[ι] = 3)       αυξάνουμε το μετρητή σ[3]
..................................................            ..........................................                                                   
Αν ο βαθμός είναι 19 (βαθμός[ι] = 19)  αυξάνουμε το μετρητή σ[19]
Αν ο βαθμός είναι 20 (βαθμός[ι] = 20)  αυξάνουμε το μετρητή σ[20]
ΆΡΑ
Αν ο βαθμός είναι βαθμός[ι]  αυξάνουμε το μετρητή σ[ βαθμός[ι] ]

Από τα παραπάνω είναι φανερό ότι κάθε φορά αυξάνουμε το μετρητή 
σ[βαθμός[ι]]
Άρα ο τελικός αλγόριθμος για τον υπολογισμό των συχνοτήτων έχει τη μορφή

ΓΙΑ   ι   ΑΠΟ   1   ΜΕΧΡΙ   Ν   
σ[βαθμός[ι]]   <--  σ[βαθμός[ι]]  + 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

αντί  μιας αλληλουχίας 20 ΑΝ...ΤΟΤΕ (ένα ΑΝ...ΤΟΤΕ για κάθε βαθμό) που ήταν η πρώτη σκέψη, δηλαδή κάτι σαν

ΑΝ βαθμός[ι] = 1 ΤΟΤΕ
   σ[1]   <--  σ[1]  + 1   
ΑΛΛΙΩΣ_ΑΝ  βαθμός[ι] = 2 ΤΟΤΕ   
σ[2]   <--  σ[2]  + 1   
ΑΛΛΙΩΣ_ΑΝ  βαθμός[ι] = 3 ΤΟΤΕ   
σ[3]   <--  σ[3]  + 1

ΑΛΛΙΩΣ_ΑΝ  βαθμός[ι] = 20 ΤΟΤΕ   
σ[20]   <--  σ[20]  + 1
ΤΕΛΟΣ_ΑΝ
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Keep Growing

Αυτό υπέθεσα και γω, ως προς τον στόχο.
Όσο για την συμπίεση κώδικα, αυτό ήταν απλά μια φιλοφρόνηση. :)
Ο Έρωτας (του Εκπ/κου Πληροφορικού) στ' αλώνια της καλδέρας (του υπνωτισμού).

Cloud_Strife

Παράθεση από: Keep Growing στις 26 Απρ 2010, 04:56:14 ΜΜ
! Γεμίζω τον πίνακα ΣΥΧΝ[11] με τον αριθμό εμφάνισης κάθε αριθμού στον πίνακα ΠΙΝ[50], αφού πρώτα μηδενίσω τον ΣΥΧΝ
    ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 50
      ΣΥΧΝ[ ΠΙΝ[ι] - 9 ] <-- ΣΥΧΝ[ ΠΙΝ[ι] - 9 ] + 1
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Το έχω ξαναγράψει. Ο Ευριπίδης είναι "μανούλα" στη συμπίεση κώδικα.
Το αποτέλεσμα όμως είναι να παθαίνει σοκ  :o ο ανυποψίαστος μαθητής.

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

Πάντως σας ευχαριστώ όλους και για την βοήθεια όσο και για την υπομονή σας να μου το εξηγήσετε.

Cloud_Strife

Παράθεση από: Σούλας Βασίλης στις 26 Απρ 2010, 04:46:23 ΜΜ
!ΓΕΜΙΣΜΑ ΠΙΝΑΚΑ
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 50
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ ΄ΔΩΣΕ ΤΟΝ΄,Ι,΄ ΑΡΙΘΜΟ ΤΟΥ ΠΙΝΑΚΑ΄
ΔΙΑΒΑΣΕ ΠΙΝ[Ι]
ΜΕΧΡΙΣ_ΟΤΟΥ ΠΙΝ[Ι]>=10 ΚΑΙ ΠΙΝ[Ι]<=20
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
!ΜΗΔΕΝΙΣΜΑ ΠΙΝΑΚΑ ΣΥΧΝΟΤΗΤΩΝ
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 11
ΣΥΧΝ[Ι] <- 0
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
!ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ ΣΥΧΝΟΤΗΤΩΝ
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 50
Χ <- ΠΙΝ[Ι]
ΣΥΧΝ[Χ-9] <- ΣΥΧΝ[Χ-9]+1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
!ΜΕΓΙΣΤΟ ΣΤΟ ΠΙΝΑΚΑ ΣΥΧΝΟΤΗΤΩΝ
ΜΕΓ <- ΣΥΧΝ[1]
ΓΙΑ Ι ΑΠΟ 2 ΜΕΧΡΙ 11
ΑΝ ΜΕΓ<ΣΥΧΝ[Ι] ΤΟΤΕ
ΜΕΓ <- ΣΥΧΝ[Ι]
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

! ΕΜΦΑΝΙΖΩ ΤΟΝ ΑΡΙΘΜΟ Η ΤΟΥΣ ΑΡΙΘΜΟΥΣ ΜΕ ΤΗΝ ΜΕΓΑΛΥΤΕΡΗ ΣΥΧΝΟΤΗΤΑ ΕΜΦΑΝΙΣΗΣ 
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 11
ΑΝ ΜΕΓ=ΣΥΧΝ[Ι] ΤΟΤΕ
ΓΡΑΨΕ ΄Ο ΑΡΙΘΜΟΣ ΄,Ι+9,΄ΕΜΦΑΝΙΣΤΗΚΕ ΤΙΣ ΠΕΡΙΣΣΟΤΕΡΕΣ ΦΟΡΕΣ΄
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Ευχαριστώ πολύ... Τώρα κατάλαβα πως γίνεται και πιο απλά.  :)