Προς το περιεχόμενο

Qt και συχνότητα εμφάνισης γράμματος σε ελληνική συμβολοσειρά


karabouzouk...

Προτεινόμενες αναρτήσεις

Δημοσ.

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

 

Με λατινικούς μιας και όλοι είναι ASCII χαρακτήρες ήταν εύκολο καθώς ο καθένας είχε έναν αριθμό και με τη βοήθεια αυτού αύξανα τη συχνότητα του γράμματος στην κατάλληλη θέση ενός πίνακα από ακέραιους.

 

Αυτό που ψάχνω είναι μια έξυπνη λύση για να το κάνω αυτό και με τους ελληνικούς..

 

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

Αλλά έχοντας δει αυτό:

>freqtbl[test_letters[i] - 'A']++;

τα άλλα μου φαίνονται μπακαλίστικα.. Είναι..??

 

Ευχαριστώ!

Δημοσ.

Με ενα map θα εισαι μια χαρα.

πχ

>int _tmain(int argc, _TCHAR* argv[])
{
wstring str = L"έλα και συ και συ και συ";
map<wchar_t,unsigned int> table;// char - count
for_each(str.begin(),str.end(),[&table](wchar_t &c)
{
	table[c]++;
});

	return 0;
}

και θα εχεις το παρακατω

post-103086-129063140434_thumb.jpg

Δημοσ.
H count της QString δεν σου κάνει ;

 

-

 

Όταν λες με την count πως ακριβώς εννοείς..? Να τσεκάρω ας πούμε το 'α' στη συμβοοσειρά μου πόσες φορές εμφανίζεται και να το κρατάω κάπου.. αλλά αυτό για όλα τα γράμματα ξεχωριστά έτσι δεν είναι..? Αν εννοείς έτσι δε νομίζω ότι θα γλητώσω τον κόπο που θα έκανα και με τη δική μου μέθοδο που περιέγραψα..

 

@Eugenios1 θα το δοκιμάσω μόλις μπορέσω! Αν μπορείς εξήγησε μου λίγο τι είναι αυτό το L μπροστά από τη συμβολοσειρά και χοντρά χοντρά τι ακριβώς γίνεται στην for_each.

 

 

Ευχαριστώ πάντως και τους δύο

Δημοσ.

Ο τίτλος του thread υποδηλώνει ότι θέλεις να κάνεις κάτι που σχετίζεται με την Qt.

Γι' αυτό ανάφερα την συναρτηση της Qt.

 

Πέραν αυτού, η κλάση QString είναι πολύ ισχυρή και χειρίζεται αδιακρίτως τόσο ASCII όσο και Unicode.

Kαι όλες οι συναρτήσεις της Qt που επεξεργάζονται συμβολοσειρές, δέχονται stings της κλάσης QString.

Αυτό σημαίνει ότι αν θελήσεις να χρησιμοποιήσεις κάποια παρεμφερή εντολή της Qt για κάτι άλλο, είναι

καλύτερο να δουλεύεις με συμβολοσειρές QString που αποτελεί το εξ ορισμού όρισμα για τις εντολές της Qt.

 

Η δική σου μέθοδος είναι ιδιοκατασκευή.

H count είναι μια έτοιμη εντολή, απλή και διαισθητική και μπορεί να βελτιώσει την αναγνωσιμότητα και την συντομία του προγράμματος.

Π.χ. ο κώδικας μπορεί να είναι πολύ πιο ευανάγνωστος και προφανής με την count παρά αυτό που δίνει ο Evgenios.

 

-

Δημοσ.

Το L δηλωνει οτι το string ειναι unicode.

Το for_each ειναι αυτο που γραφει, μπορει να το αντικαταστησεις με μια for ή while. Τεσπα, η ουσια ειναι το map<key,data> (υπαρχει κατι αντιστοιχο και στο qt). Η λειτουργια του ειναι απλη, εκτος απο το κλασικο index εχεις και το key ως index (που ειναι μοναδικο), οταν καλεις τους operators [] με καποιο κλειδη που δεν υπαρχει (πχ map[1]) τοτε το map φτιαχνει ενα entry και αυτοματος καλειται ο constructor του data.

edit: QMap

@V.I.Smirnov Το point μου ειναι το map, που υπαρχει σε ολα τα αξιοπρεπες frameworks

Δημοσ.

Τελικά χρησιμοποίησα την συνάρτηση του Qt την QMap στην οποία περνάω τα γράμματα της γραμματοσειράς που με ενδιαφέρει σαν κλειδί αν δεν έχουν εισαχθεί ακόμα, και αν υπάρχει αυξάνω ένα int που αντιπροσωπεύει τη συχνότητα..

Έτσι δεν εξαρτάμαι ούτε από το γράμμα ούτε από τη γλώσσα ούτε από το πλήθος των γραμμάτων.

 

>QMap <QChar, int> freqTable;

   /* Read the first string, incrementing the corresponding histogram entry */
   for (int i=0; i < ui->lineEdit->text().length(); i++) {
       freqTable[ui->lineEdit->text()[i]]++;
   }

Αρχειοθετημένο

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

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