Jump to content



Λίγη βοήθεια με αλγόριθμους σε ψευδοκώδικα


A-L-I-V-E

Recommended Posts

Έχω να παραδώσω μια εργασία μέχρι την τρίτη και έχω ψιλοκολλήσει στην τελευταία άσκηση. Δεν θέλω λύσεις, απλά όποιος μπορεί να βοηθήσει, να μου δείξει σχετικές σημειώσεις που θα μπορούσα να διαβάσω ούτως ώστε να βρω το δρόμο για τη λύση. Έχω κάτι στο μυαλό μου αλλά δεν ξέρω κατά πόσο θα μπορέσω να το υλοποιήσω και να είναι σωστό. Στο spoiler έχω όλη την εκφώνηση της τελευταίας άσκησης. Το πρώτο κομμάτι που αφορά την εισαγωγή δεδομένων σε μονοδιάστατο πίνακα το έχω. Στα υπόλοιπα είμαι 50-50. Ευχαριστώ προκαταβολικά.

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

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

Μία πιθανή τεχνική που μπορείτε να ακολουθήσετε είναι η εξής:

Βήμα 1 - Προεπεξεργασία:

Βήμα 1.1: Βάλε όλα τα γραπτά που αρχίζουν από ‘Α’ σε μια ομάδα.

Βήμα 1.2: Βάλε όλα τα γραπτά που αρχίζουν από ‘Β’ σε μια άλλη ομάδα.

Βήμα 1.3: Επανάλαβε την ίδια διαδικασία για τα υπόλοιπα γραπτά τοποθετώντας τα στις αντίστοιχες ομάδες.

Βήμα 2 - Ταξινόμηση: Ταξινόμησε την κάθε ομάδα ξεχωριστά. Χρησιμοποίησε οποιονδήποτε αλγόριθμο επιθυμείς.

Βήμα 3 - Συνένωση: Ξεκινώντας από την πρώτη ομάδα (και συνεχίζοντας με τις υπόλοιπες κατά σειρά), τοποθέτησε τα γραπτά σε μια νέα, τελική ομάδα. Η ομάδα αυτή θα περιέχει όλα τα γραπτά ταξινομημένα.

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

Χρησιμοποιήστε την πιο πάνω τεχνική ώστε να ταξινομήσετε ένα πλήθος Ν φυσικών αριθμών. Για λόγους ευκολίας, θεωρήστε ότι οι αριθμοί αυτοί βρίσκονται στο διάστημα [0, 99], δηλαδή από το 0 μέχρι και το 99.

Να γραφούν διαδικασίες σε ψευδοκώδικα, σύμφωνα με τις ακόλουθες προδιαγραφές:

• Το πλήθος Ν των αριθμών δίνεται ως σταθερά. Θεωρήστε ότι όλοι οι αριθμοί εισάγονται από το πληκτρολόγιο, με τον απαραίτητο αμυντικό προγραμματισμό, και τοποθετούνται σε έναν μονοδιάστατο πίνακα με όνομα DATA. Η είσοδος των δεδομένων θα πρέπει να γίνει με το υποπρόγραμμα ΕΙΣΑΓΩΓΗ_ΔΕΔΟΜΕΝΩΝ.

• Χρησιμοποιήστε ακριβώς 10 ομάδες για το στάδιο της προεπεξεργασίας. Η πρώτη ομάδα θα περιέχει τους αριθμούς που ανήκουν στο διάστημα [0, 9], η δεύτερη ομάδα θα περιέχει τους αριθμούς που ανήκουν στο διάστημα [10, 19] κ.ο.κ. Χρησιμοποιήστε έναν δισδιάστατο πίνακα με όνομα GROUPS για να αποθηκεύσετε αυτές τις ομάδες. Ο πίνακας αυτός θα έχει 10 γραμμές (μία για κάθε ομάδα). Το πλήθος των στηλών του πίνακα ανήκει στα ζητούμενα της υποεργασίας και θα πρέπει να σχολιάσετε την επιλογή σας. Η προεπεξεργασία των δεδομένων να αναπτυχθεί στο υποπρόγραμμα ΠΡΟΕΠΕΞΕΡΓΑΣΙΑ.

• Στο υποπρόγραμμα ΤΑΞΙΝΟΜΗΣΗ, ταξινομήστε τα δεδομένα που έχουν ομαδοποιηθεί στο στάδιο της προεπεξεργασίας. Χρησιμοποιήστε οποιονδήποτε αλγόριθμο επιθυμείτε, από αυτούς που βρίσκονται στο 2ο Τόμο ή οπουδήποτε.

(Υπόδειξη: Θα πρέπει προφανώς να γνωρίζετε το πλήθος των αριθμών που ανήκουν σε κάθε ομάδα - γραμμή του δισδιάστατου πίνακα. Το πλήθος αυτό πρέπει να υπολογίζεται στο στάδιο της προεπεξεργασίας και να αποθηκεύεται σε πίνακα με όνομα PLITHOS.)

• Στο υποπρόγραμμα ΣΥΝΕΝΩΣΗ, συνενώστε τα ταξινομημένα δεδομένα εισάγοντάς τα στον αρχικό πίνακα.

• Τυπώστε τον ταξινομημένο πίνακα με το υποπρόγραμμα ΕΚΤΥΠΩΣΗ_ΔΕΔΟΜΕΝΩΝ.

Για λόγους ομοιομορφίας, ακολούθως δίνεται η επικεφαλίδα, το τμήμα δηλώσεων και το κυρίως πρόγραμμα.

Αναπτύξτε τα υποπρογράμματά σας στο σημείο που υποδεικνύεται. Δηλώστε και σχολιάστε κατάλληλα το πλήθος των στηλών του πίνακα GROUPS.

ΑΛΓΟΡΙΘΜΟΣ ΤΑΞΙΝΟΜΗΣΗ_4_ΥΠΟΕΡΓΑΣΙΑ

ΣΤΑΘΕΡΕΣ

Ν=15; //Το μέγεθος του πίνακα//

ΔΕΔΟΜΕΝΑ

DATA: ARRAY[1..N] OF INTEGER; //Ο πίνακας των στοιχείων//

GROUPS: ARRAY[1..10, 1..??] OF INTEGER; //Ο πίνακας των ομάδων//

//Σημειώστε στη δήλωση το πλήθος των στηλών του πίνακα GROUPS//

//Εξηγήστε σε αυτό το σχόλιο τον λόγο για τον οποίο επιλέξατε// //αυτό το πλήθος//

PLITHOS:ARRAY[1..10] OF INTEGER; //περιέχει το πλήθος κάθε// //ομάδας, υπολογίζεται κατά την προεπεξεργασία//

//_________________________________________________________________//

//_____Εδώ θα γράψετε τα υποπρογράμματά σας________________________//

//_________________________________________________________________//

ΑΡΧΗ //Κυρίως πρόγραμμα//

//Εισαγωγή δεδομένων//

ΥΠΟΛΟΓΙΣΕ ΕΙΣΑΓΩΓΗ_ΔΕΔΟΜΕΝΩΝ(%DATA);

//Προεπεξεργασία//

ΥΠΟΛΟΓΙΣΕ ΠΡΟΕΠΕΞΕΡΓΑΣΙΑ(DATA, %GROUPS, %PLITHOS);

//Ταξινόμηση//

ΥΠΟΛΟΓΙΣΕ ΤΑΞΙΝΟΜΗΣΗ(%GROUPS, PLITHOS);

//Συνένωση//

ΥΠΟΛΟΓΙΣΕ ΣΥΝΕΝΩΣΗ(%DATA, GROUPS, PLITHOS);

//Εκτύπωση τελικού πίνακα//

ΥΠΟΛΟΓΙΣΕ ΕΚΤΥΠΩΣΗ_ΔΕΔΟΜΕΝΩΝ(DATA)

ΤΕΛΟΣ //Κυρίως Προγράμματος//

Link to comment
Share on other sites

Καλησπέρα,

για να βρεις το πλήθος των στηλών του πίνακα GROUPS θα πρέπει να σκεφτείς ποιά είναι η χειρότερη

περίπτωση που έχεις (όσον αφορά την είσοδο) για το πρόγραμμά σου:

Αν κάποιος σου δώσει Ν αριθμούς να ταξινομήσεις και πρέπει να μπούν και οι Ν αριθμοί

σε μία γραμμή του πίνακα GROUPS (πχ έχεις είσοδο Ν αιθμούς στο διάστημα [0, 9]).

Άρα το πλήθος των στηλών του GROUPS πρέπει να είναι Ν για να καλύπτεις αυτές τις περιπτώσεις.

Στην υπορουτήνα ΥΠΟΛΟΓΙΣΕ ΠΡΟΕΠΕΞΕΡΓΑΣΙΑ διαβάζοντας τα δεδομένα DATA και ελέγχοντας σε

ποιο διάστημα ανήκουν (με ένα CASE ή IF-ELSEIF-ELSE) τα τοποθετείς στην ανάλογη γραμμή του

πίνακα GROUPS και καθε φορά που βάζεις έναν αριθμό στη γραμμή k του GROUPS αυξάνεις την μεταβλητή

PLITHOS[k] κατα 1, ωστε να υπολογίζεις και το πλήθος των αριθμών κάθε γραμμής (έχεις αρχικοποιήσει όλες

τις γραμμές του PLITHOS στο 1 ή στο 0).

Στην υπορουτήνα ΥΠΟΛΟΓΙΣΕ ΤΑΞΙΝΟΜΗΣΗ θα ταξινομήσεις κάθε γραμμή του πίνακα GROUPS με βάση

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

με τη σειρά σε ένα τελικό πίνακα (ταξινομημένο) στην υπορουτήνα ΥΠΟΛΟΓΙΣΕ ΣΥΝΕΝΩΣΗ.

Link to comment
Share on other sites

Για τις στήλες του πίνακα GROUPS το είχα σκεφτεί αυτό το ενδεχόμενο αλλά ήθελα και μια επιβεβαίωση. Στην ΠΡΟΕΠΕΞΕΡΓΑΣΙΑ κατάφερα να ξεχωρίσω τις ομάδες και να τις καταχωρήσω στις αντίστοιχες στήλες του GROUPS αλλά τώρα που βλέπω την απάντησή σου μάλλον ο δικός μου τρόπος ήταν λίγο ανορθόδοξος. Έκανα τα εύκολα δύσκολα δηλαδή. Το άλλαξα όπως μου πρότεινες και ταξινόμησα τον GROUPS με ταξινόμηση δυαδικής παρεμβολής. Μέχρι στιγμής μου φαίνονται όλα εντάξει μιας και στα υπόλοιπα συμφωνούν οι γνώμες μας. Θα τα τσεκάρω πάλι πριν στείλω την εργασία και ελπίζω να είμαστε σωστοί. Σε ευχαριστώ πολύ για τη βοήθεια και το χρόνο σου. Αν έρθεις καμιά βόλτα από το Βόλο στείλε πμ να κεράσω τσίπουρα... :T:

Link to comment
Share on other sites

Κάτι ακόμα... αν έχω τις παρακάτω μεταβλητές...

i:integer και out:boolean

τι είναι πιο σωστό;

να γράψω πχ ενόσω i<10 and out=false επαπανάλαβε ή ενόσω i<10 and (not out) επαπανάλαβε;

ή είναι και τα δύο σωστά;

Link to comment
Share on other sites

Κάτι ακόμα... αν έχω τις παρακάτω μεταβλητές...

i:integer και out:boolean

τι είναι πιο σωστό;

να γράψω πχ ενόσω i<10 and out=false επαπανάλαβε ή ενόσω i<10 and (not out) επαπανάλαβε;

ή είναι και τα δύο σωστά;

Καλησπέρα, και τα 2 σωστά είναι απο προγραμματιστική άποψη αλλα δε ξέρω αν είναι

και τα 2 σωστά για ψευδοκώδικα. Νομίζω το πρώτο είναι πιο ασφαλές.

Link to comment
Share on other sites

Νομίζω ισχύει ο ίδιος άγραφος κανόνας με τον κώδικα:

- Γράψε κώδικα όσο απλά θα ήθελες να διαβάζεις κώδικα

δηλαδή

Μπορείς να το γράψεις και ως

WHILE(NOT(i>= 10 AND out))
...

και πάλι σωστό είναι απλά αυξάνεις την δυσκολία να το καταλάβει κάποιος.

Link to comment
Share on other sites

Ευχαριστώ πολύ για την πολύτιμη βοήθειά σας! Παρέδωσα την εργασία και από τις λιγοστές γνώσεις που έχω αποκτήσει μέχρι στιγμής είμαι ικανοποιημένος από τις απαντήσεις μου. Ελπίζω για τα καλύτερα. Θα σας ενημέρωσω μόλις βγει η βαθμολογία.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.