ΣΥΓΚΡΙΣΗ ΣΥΜΒΟΛΟΣΕΙΡΩΝ

Ξεκίνησε από George Eco, 09 Οκτ 2019, 12:47:13 ΜΜ

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

alkisg

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

> Εφόσον 1111 > 99, ισχύει ότι και 'ΑΑΑΑ' > 'ΩΩ'.

Αυτή η πρόταση είναι λάθος. Μια πιο σωστή θα ήταν:

> Εφόσον 0.1111 < 0.99, ισχύει ότι και 'ΑΑΑΑ' < 'ΩΩ'.

Δηλαδή οι συγκρίσεις αλφαριθμητικών δεν πρέπει να παρομοιάζονται με συγκρίσεις ακεραίων αριθμών. Μοιάζουν λίγο με τις συγκρίσεις του δεκαδικού μέρους των πραγματικών αριθμών. Με το που βλέπουμε ότι ένας δεκαδικός ξεκινάει από 0.1xxx, δεν μας ενδιαφέρει καν ποιο είναι το επόμενο δεκαδικό ψηφίο του, ξέρουμε ήδη ότι είναι μικρότερος από έναν άλλον που ξεκινάει από 0.9x. Η σύγκριση γίνεται ανά ψηφίο και σταματάει με το που θα εντοπιστεί η πρώτη διαφορά, χωρίς να μας ενδιαφέρει το συνολικό μήκος τους. Το π=3.14... έχει άπειρα δεκαδικά ψηφία αλλά είναι μικρότερο από το 3.2 που έχει ένα μόνο δεκαδικό ψηφίο. Αντίστοιχα με το που βλέπουμε ότι το 'ΑΑΑΑ' ξεκινάει από 'Α', ξέρουμε ότι είναι μικρότερο από το 'ΩΩ' επειδή ξεκινάει από 'Ω', χωρίς καν να ασχοληθούμε με το δεύτερο γράμμα τους, η σύγκριση σταματάει στο πρώτο γράμμα.

Ας θεωρήσουμε κι άλλη μια πρόταση:

> Το όνομα 'ΑΑΑΑ' στον τηλεφωνικό κατάλογο είναι στη σελίδα 24, ενώ το 'ΩΩ' είναι στη σελίδα 1.

Και αυτή η πρόταση είναι λάθος. Το 'ΑΑΑΑ' στον κατάλογο θα ήταν στη σελίδα 1, που είναι μικρότερη από τη σελίδα 24 στην οποία θα βρίσκαμε το 'ΩΩ', και έτσι 'ΑΑΑΑ' < 'ΩΩ'.

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

petrosp13

H λογική είναι πολύ απλή
Στο λεξικό το ΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑ μπαίνει πριν το Ω
Δεν έχει σημασία ο αριθμός των γραμμάτων
Η μόνη περίπτωση να έχει σημασία ο αριθμός των γραμμάτων είναι να μιλάμε για δυο παρόμοιες λέξεις που η μια έχει απλά μερικούς χαρακτήρες παραπάνω
Π.χ. ΑΥΤΟ < ΑΥΤΟΣ
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

George Eco

#17
Πολύ ωραία Άλκη. Άρα μας νοιάζει η ΠΡΩΤΗ διαφορά τι θα μας πει, πέραν του μεγέθους. Είναι ΣΑ να αντιμετωπίζω δεκαδικούς, το έπιασα.

Τι συμβαίνει under the hood;

alkisg

> Τι συμβαίνει under the hood;

Ακριβώς αυτό που είπες, γίνεται σύγκριση ανά χαρακτήρα και η σύγκριση σταματάει στην πρώτη διαφορά.
Παράδειγμα υλοποίησης: https://www.techiedelight.com/implement-strcmp-function-c/

gpapargi

Παράθεση από: George Eco στις 16 Φεβ 2022, 03:07:18 ΠΜ
Σε άλλο thread μίλησα για τη σύγκριση των strings στη ΓΛΩΣΣΑ κι αναρωτήθηκα πως ακριβώς γίνεται, γιατί κάτι δε μου κάθεται καθόλου καλά.


ΠΡΟΓΡΑΜΜΑ ΑΑ
ΑΡΧΗ
  ΓΡΑΨΕ 'ΒΑΑ' = 'ΒΑΑ' ! ΑΛΗΘΗΣ
  ΓΡΑΨΕ 'ΒΑΑ' > 'ΑΒΑ' ! ΑΛΗΘΗΣ
  ΓΡΑΨΕ 'ΑΒΑ' = 'ΒΑΑ' ! ΨΕΥΔΗΣ
  ΓΡΑΨΕ 'ΑΝΝΑ' = 'ΝΑΝΑ' ! ΨΕΥΔΗΣ

  ΓΡΑΨΕ 'ΑΑΑΑ' > 'ΩΩ' ! ΨΕΥΔΗΣ ( γιατί;;;; )
  ΓΡΑΨΕ 'ΑΑΑΑ' > '  ΩΩ' ! ΑΛΗΘΗΣ
  ΓΡΑΨΕ 'ΨΨΨ' > 'ΩΩ' ! ΨΕΥΔΗΣ ( γιατί;;;; )


  ΓΡΑΨΕ 'ΚΑΛΗΜΕΡΑ' < 'ΚΑΛΟΙ' ! ΑΛΗΘΗΣ ( γιατί;;;; )

  ΓΡΑΨΕ 'Ω' > 'ΨΨΨ' ! ΑΛΗΘΗΣ ( γιατί;;;; )

ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


Η θέση κάθε γράμματος έχει σημασία. Έχει βαρύτητα. Με άλλα λόγια ΑΒΑ <> ΒΑΑ και μάλιστα ΒΑΑ > ΑΒΑ όπως κανείς λογικά θα περίμενε.

Έχω τεράστιο πρόβλημα, όταν πρόκειται να εκτιμήσω ένα string με λιγότερα σύμβολα.

Θα περίμενα 'ΑΑΑΑ' > 'ΩΩ' να ισχύει, μιας κι έχει περισσότερα σύμβολα το 'ΑΑΑΑ' κι άρα το πιο αριστερό Α είναι υψηλότερης σημαντικότητας. Ωστόσο επιστρέφεται ΨΕΥΔΗΣ. Γιατί;;;;

Εικάζω πως το 'ΑΑΑΑ' συγκρίνεται λάθος με ένα αντίστοιχο 'ΩΩ__' (όπου κάτω παύλα, το κενό) όμως θα έπρεπε να συγκρίνεται με '__ΩΩ'.


Να τονισθεί εδώ πως αυτό μπορεί να είναι πολύ δυσάρεστο και μπερδευτικό, όταν έχεις να συγκρίνεις 'ΚΑΛΗΜΕΡΑ' με 'ΚΑΛΟΙ'


Χωρίς να διαφωνώ σε τίποτα με αυτά που ανέφεραν οι φίλοι παραπάνω, γράφω 2 λόγια που ίσως σου φανούν χρήσιμα.
ΑΝτιμετωπίζεις τα strings σαν αριθμούς. Πχ περιμένεις το ΒΑΑ<ΑΑΑΑΑ. Αυτό θα συνέβαινε αν ήταν αριθμοί πχ στο δεκαεξαδικό γιατί υπάρχει η έννοια της αξίας κάθε ψηφίου ανάλογα με τη θέση. ΑΥτό δεν υπάρχει στα αλφαριθμητικά. Η σύγκριση είναι με βάση της σειρά που θα τα έβλεπες στο λεξικό. ΑΝ θέλεις να τα δεις τα αλφαριθμητικά και τους αριθμούς με ενιαίο τρόπ σύγκρισης, μπορείς να σκεφτείς ότι μπορούμε να γράψουμε τους αριθμούς προσθέτοντας άπειρα μηδενικά μπροστά από το ακέραιο μέρος και πίσω από το δεκαδικό. Πχ τον αριθμό 12,34 μπορούμε να τον φανταστούμε σαν ...0000012,3400000... όπου οι τελείες συμβολίζουν άπειρα μηδεμνικά. ΑΝ το δεις έτσι, μπορείς να θεωρήσεις ότι γίνεται κατά κάποιο τρόπο λεξικογραφική σύγκριση. Πχ 12>9 γιατί 12>09 και αντιμετωπίζουμε τους ακέραιους σαν να έχουν ίδιο αριθμό ψηφίων προσθέτοντας μηδενικά μπροστά από τον μικρότερο.
Δεν είναι ο καλύτερος τρόπος αυτός που περιγράφω, καλύτερα να καταλάβεις πως ορίζεται η σύγκριση, αλλά ίσως σου φανούν τα παραπάνω χρήσιμα.

George Eco

@gpapargi γνωρίζω πως ουσιαστικά τα strings είναι σα να λέμε μια λίστα τιμών που αντιστοιχούν σε UNICODE χαρακτήρες ας πούμε.
Αυτό που δε καταλάβαινα, ήταν γιατί το 'Ω' είναι > του 'ΑΑΑΑ' ακριβώς επειδή η συμπεριφορά δε συνδράμει με σύγκριση ακεραίων δεκαδικού ή hex, που όμως συμπτωματικά ισχύει σε ίσο length strings.
Οπότε στην ουσία είναι 'ΑΑΑΑ' < 'Ω____' κι ΕΙΝΑΙ feature, δεν είναι bug! ( _ για ισοδύναμο null φαντάζομαι )

Εγώ το λάθος που έκανα ήταν πως νόμιζα πως τα strings συγκρίνονταν από τα δεξιά προς τα αριστερά.
Νόμιζα πως είναι 'AAAA' vs 'null null null Ω' ενώ λειτουργεί ακριβώς αντίθετα απ' όσα κατάλαβα.

Άρα αν έχω 'ΑΑΑΑ' vs 'ΑΩ' θα πάει

Α        Α             Α        Α

=       <

Α       Ω             τα υπόλοιπα δε μας νοιάζουν


Οπότε νομίζω το να το παραλληλίσω ως δεκαδικό στη Τάξη για να διορθώσω την ανακρίβεια, θα είναι καλή ιδέα!

Θέλω να πω, ο Άλκης πολύ όμορφα το έθεσε:

Α= 0.99532199999
Β= 0.999

Β > Α απλούστατα και τέλος κουβέντας, απλά έχουμε το κλασικό 24αδικό σετ από χαρακτήρες κι όχι δεκαδικά ψηφία.

Ένα μεγάλο ευχαριστώ σε όλους σας ανεξαιρέτως.

petrosp13 ναι, είναι εύκολο να μπερδευτεί κανείς. Κατάλαβα πως δουλεύει όμως.

ΔΗΜΗΤΡΗΣ Χ

#21
Γιώργο, πολύ απλά όπως σε μια εγκυκλοπαίδεια με την αλφαβητικη σειρα.
Πχ
α
αα
αβ...
...
β
με α<β κλπ
(χωρις να γινεται διαχωρισμος πεζων κεφαλαίων, αλλωστε το 2004 που ειχε ζητηθει ταξινομηση με αλφαβητικη σειρα είχε δοθει : "Θεωρείστε ότι .... τα ονόµατα των µαθητών είναι γραµµένα µε µικρά γράµµατα" ΓΙΑΤΙ ΠΟΛΥ ΑΠΛΑ ΔΕΝ ΜΠΟΡΟΥΜΕ ΝΑ ΑΣΧΟΛΗΘΟΥΜΕ ΜΕ ΚΑΤΙ ΔΙΑΦΟΡΕΤΙΚΟ ΒΑΣΕΙ ΤΟΥ ΒΙΒΛΙΟΥ, ΟΠΩΣ ΑΥΤΟ  ΤΑ ΕΞΗΓΕΙ ΣΤΗΝ ΠΡΩΤΗ ΣΕΛΙΔΑ ΤΟΥ  8ου ΚΕΦΑΛΑΙΟΥ. ΩΣΤΟΣΟ ΜΠΟΡΕΙ ΚΑΠΟΙΟΣ ΜΕ ΜΙΑ ΔΙΑΦΟΡΕΤΙΚΗ ΕΡΜΗΝΕΙΑ ΣΑΝ ΚΑΙ ΑΥΤΗ ΠΟΥ ΑΝΕΦΕΡΕΣ ΝΑ ΜΠΕΡΔΕΥΤΕΙ. ΔΕΝ ΥΠΑΡΧΕΙ ΛΟΓΟΣ ΟΜΩΣ ΝΑ ΤΟ ΨΑΞΟΥΜΕ ΠΕΡΑΙΤΕΡΩ ΑΦΟΥ ΕΤΣΙ ΑΝΑΦΕΡΕΙ.

ΓΙΑ ΝΑ ΤΟ ΠΑΩ ΛΙΓΟ ΠΙΟ ΠΕΡΑ ΑΠΟ ΤΟ 'ΚΑΛΟΣ'>'ΚΑΚΟΣ' ,ΑΝ ΘΕΣ ΠΧ ΝΑ ΕΛΕΓΞΕΙΣ ΑΝ ΕΝΑ ΟΝΟΜΑ ΞΕΚΙΝΑΕΙ ΑΠΟ ΄Β', ΘΑ ΓΡΑΨΕΙς :

ΑΝ ΟΝ>='Β' ΚΑΙ ΟΝ<'Γ',

ΔΗΛΑΔΗ ΑΦΟΥ ΞΕΚΙΝΑΕΙ ΑΠΟ Β ΕΙΝΑΙ >= ΑΠΟ ΤΟ ΓΡΑΜΜΑ 'Β' ΣΚΕΤΟ ΚΑΙ ΜΙΚΡΟΤΕΡΟ ΑΠΟ ΤΟ 'Γ' ΠΟΥ ΕΙΝΑ ΤΟ ΠΡΩΤΟ ΟΣΩΝ ΞΕΚΙΝΟΥΝ ΑΠΟ Γ, ΟΠΩΣ ΔΗΛΑΔΗ ΤΑ ΔΙΑΦΟΡΑ ΣΤΟΙΧΕΙΑ ΣΕ ΜΙΑ ΕΓΚΥΚΛΟΠΑΙΔΕΙΑ.

Καρκαμάνης Γεώργιος

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