!===================================================================================================================================
! Στον αλγόριθμο συμπίεσης RLE ελέγχεται μια ακολουθία χαρακτήρων και οι συνεχόμενες επαναλήψεις ενός χαρακτήρα
! αντικαθίστανται με το πλήθος τους ακολουθούμενο από το χαρακτήρα.
! Για παράδειγμα η πρόταση "βββββεεεεααα φφφφαααα" (22 χαρακτήρες) θα συμπιεστεί ως "5β4ε3α2 4φ4α"(12 χαρακτήρες)
! στην οποία πετυχαίνουμε συμπίεση 45.4%. Να αναπτύξετε πρόγραμμα το οποίο:
! α)θα δημιουργεί ένα μονοδιάστατο πίνακα 40 χαρακτήρων. (είτε διαβάζεται, είτε τον δημιουργείτε με δικά σας κριτήρια)
! β)θα προσδιορίζει και θα εμφανίζει τη συμπίεση κατά τον αλγόριθμο RLE. (νέος συμπιεσμένος πίνακας)
! γ)αν η συμπίεση είναι μεγαλύτερη του 50% θα εμφανίζει το μήνυμα "Πολύ καλή συμπίεση", όπως και το ποσοστό συμπίεσης που επιτεύχθηκε.
!===================================================================================================================================
ΠΡΟΓΡΑΜΜΑ Συμπίεση_RLE
ΣΤΑΘΕΡΕΣ
Ν=40
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: i,ιδια,διαφ,ΤΠ1[Ν]
ΧΑΡΑΚΤΗΡΕΣ:Π[Ν],ΤΠ2[Ν]
ΛΟΓΙΚΕΣ:όμοιο
ΑΡΧΗ
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ Ν !δημιουργία αρχικού πίνακα
ΑΝ i<=9 ΤΟΤΕ
Π[i] <-- 'a' ! ------ Εναλλακτικός τρόπος -----
ΑΛΛΙΩΣ_ΑΝ i<=17 ΤΟΤΕ ! ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ Ν
Π[i] <-- 'b' ! ΓΡΑΨΕ 'Δώσε ',i,'o χαρακτήρα'
ΑΛΛΙΩΣ_ΑΝ i<=21 ΤΟΤΕ ! ΔΙΑΒΑΣΕ Π[i]
Π[i] <-- 'κ' ! ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΛΛΙΩΣ_ΑΝ i<=32 ΤΟΤΕ ! --------------------------------
Π[i] <-- 'y'
ΑΛΛΙΩΣ
Π[i] <-- 'd'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
διαφ <-- 0 ! πληθος συνολικών διαφορετικών χαρακτήρων
ιδια <-- 1 ! πλήθος όμοιων συνεχόμενων χαρακτήρων
ΓΙΑ i ΑΠΟ 2 ΜΕΧΡΙ Ν
όμοιο <-- ψευδής
ΑΝ Π[i-1]=Π[i] ΤΟΤΕ ! έλεγχος ομοιότητας ακολουθίας χαρακτήρων
ιδια <-- ιδια+1 ! αν πχ το Π[1]=Π[2], αυξάνουμε το πλήθος των ομοιων συνεχόμεων χαρακτήρων κατά 1
όμοιο <-- αληθής
ΑΛΛΙΩΣ
διαφ <-- διαφ+1 ! αλλίως έχουμε ακόμη ένα διαφορετικό
ΤΕΛΟΣ_ΑΝ
!Θα μπορούσαμε ισοδύναμα να ελέξουμε ως εξής: ΑΝ Π[i-1]<>Π[i] ΤΟΤΕ... και να είναι περιττή η λογική μεταβλητή όμοιο
ΑΝ ΟΧΙ όμοιο ΤΟΤΕ ! αν δεν έχουμε όμοιο
ΤΠ1[διαφ] <-- ιδια ! καταχωρούμε το πληθος των προηγούμενων όμοιων σε ένα μονοδιαστατο πίνακα ακεραίων ΤΠ1
ΤΠ2[διαφ] <-- Π[i-1] ! και τον προηγούμενο χαράκτηρα σε ένα δευτερο μονοδιαστάτο χαρακτήρα
ιδια <-- 1 ! ο μετρητής των επόμενων όμοιων πρέπει να επανακινήσει από 1
ΤΕΛΟΣ_ΑΝ
ΑΝ i=Ν ΤΟΤΕ ! δυστυχώς κάποια στιγμή θα φτάσουμε στο Ν-οστο χαρακτήρα και καθώς δεν θα υπάρχει Ν+1 χαρακτήρας
διαφ <-- διαφ+1 ! πρέπει μονοι μας να δηλώσουμε ότι είναι διαφορετικός !!!!
ΤΠ1[διαφ] <-- ιδια
ΤΠ2[διαφ] <-- Π[i]
ΤΕΛΟΣ_ΑΝ
!ενδιαφέρον παρουσίαζει να απεργοποιήσει κανείς το συγκεκριμένο έλεγχο "Αν" και να παρατηρήσει τα αποτελέσματα του!
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ 'Ο αρχικός πίνακας είναι ο:' ! παρουσίαση του αρχικού ασυμπίεστου πίνακα
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ Ν
ΓΡΑΨΕ_ Π[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ
ΓΡΑΨΕ
ΓΡΑΨΕ 'Ο τελικός πίνακας είναι ο:' ! παρουσίαση του τελικού συμπιεσμένου πίνακα
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ διαφ
ΓΡΑΨΕ_ ΤΠ1[i],ΤΠ2[i] ! o οποίος θα είναι η σύνθεση των πινάκων ΤΠ1 και ΤΠ2
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ ! παρουσίαση ποσοστού σύμπιεσης
ΓΡΑΨΕ ! Η ποσότητα 2*διαφ εκφράζει το συμπίεσμένο μέγεθος: θεωρούμε πως πχ η ποσότητα "17b3α" έχει μέγεθος 4 και όχι 5
ΑΝ 2*διαφ<50/100*Ν ΤΟΤΕ
ΓΡΑΨΕ 'πολύ καλή συμπίεση ', (Ν-2*διαφ)/Ν*100,' %'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ