Häufigkeit Zeichen aus Datei/String
-
SeppJ schrieb:
duh schrieb:
Sowas lässt sich viel leichter inlinen.
Nein.
out schrieb:
Will
max_element
nicht einen Functor?Nein, max_element will irgendetwas aufrufbares. Irgendetwas, so dass der Code
comp(a,b)
etwas sinnvolles ergibt.Wie würde es denn ohne Functor gehen?
template <typename T> bool most_occurrence(const T& lhs, const T& rhs) { return lhs.second < rhs.second; } // Error: Funktions-template "bool most_occurrence(const T &,const T &)" kann nicht als Funktionsargument verwendet werden. const pair<char,unsigned> most = *max_element( occurrences.begin(), occurrences.end(), most_occurrence );
-
...
-
@out: Mit deinem template würde das auch gehen, du musst es aber natürlich noch instanzieren.
-
Danke swordfish so klappts auch wunderbar! Jetzt noch der Rest und die häufigkeitsanalyse für den caeser code ist fertig.
-
Ich erinnere noch kurz an cooky451s Vorschlag:
cooky451 schrieb:
Bei 8 bit kannste auch nen unsigned arr[256] = {} nehmen.
#include <algorithm> #include <iostream> int main(){ int histogram[256]={0}; histogram['y']=2; histogram['q']=1; histogram['e']=47; histogram['u']=19; const char ch = std::max_element(histogram, histogram+256) - histogram; if(31<ch && ch<256) std::cout << '\'' << ch << "\'\n"; }
Für die Puristen...
-
von mir noch der Hinweis: char zuerst auf unsigned char casten und dann weiterarbeiten
wenn mann z.B. char auf unsigned int castet, schiebt der Compiler noch einen unerwünschten cast dazwischen: char -> int -> unsigned int
(für Zeichen > 127)
-
Noch eine Frage...
Kennt jemand das Zeichen " „ ", wenn ich es caste wird mir es als -124 dargestellt. In der ASCII Tabelle finde ich es irgendwie nicht, aber c++ stellt es dar wenn man eine -124 als char ausgibt.
Danke
-
Das ist auch nicht ASCII, sondern Windows-1252 (Zeichen 132, weil -124 = 132 (mod 256)). Es handelt sich dabei um eine spezielle Kodierung, die von der Windows-Konsole verwendet wird, wenn man sie nicht anders zwingt. Und eigentlich auch so ziemlich nur da.
-
also wenn ich " „ " bzw. -124 auf unsigned char caste bekomme ich 132 bzw. 0x84 und das ist der untere Anführungsstrich bei „”
-
Das ist eben ein nicht-ASCII Zeichen. -124 ist als unsigned 8-Bit Wert 132. Das Zeichen 132 im Windows-1252 ist "„". Hieraus folgere ich, dass du vermutlich eine Windowskonsole zur Ausgabe benutzt, die diesen Wert eben als dieses Zeichen ausgibt.
Für dein ganzes Programm sind chars nur Zahlen. Die ganze Darstellung als irgendwelche Zeichen findet ganz woanders statt. Dein Programm bekommt bloß einen Strom von Zahlen rein (die Standardeingabe) und gibt 2 Ströme von Zahlen (Standardausgabe, Standardfehlerausgabe, evtl. noch Standardlogausgabe) raus. Wie diese Zahlen dargestellt werden, ist Sache der Programmumgebung.
(Es ist natürlich nicht ganz willkürlich: Wenn du dein Programm für eine bestimmte Umgebung übersetzt, dann muss der Übersetzer (der Compiler) sicherstellen, dass die Zeichen die du in deinem Quelltext benutzt auch zu dieser Umgebung passen. Wenn du bloß einen Zahlenwert (hier -124) im Quelltext benutzt, kann dieser natürlich nicht übersetzt werden, sondern wird einfach übernommen. Würdest du stattdessen den Universal-character-name für das Zeichen "„" benutzen, würde das Programm auch in nicht-Windowskonsolen auf gleiche Weise funktionieren (sofern die Umgebung das Zeichen darstellen kann).)
-
also gibt es „ nicht in ASCII..
Dann ist die mir vorliegende Aufgabenstellung ja leider nicht ganz richtig, da war nämlich nur vom ASCII Zeichensatz die rede...
-
Aber laut dieser Seite http://www.asciizeichen.de/tabelle.html#tabelle1 ist es dann doch ein ASCII Zeichen, in anderen Tabellen wiederum ist es ein "ä".
-
Seis drumm.. Ich bedanke mich bei allen die mich so tatkräftig unterstüzt haben.
Programm läuft jetzt und entschlüsselt meine Texte wie eine eins.lg & bis bald
Jayy
-
Andi++ schrieb:
Aber laut dieser Seite http://www.asciizeichen.de/tabelle.html#tabelle1 ist es dann doch ein ASCII Zeichen, in anderen Tabellen wiederum ist es ein "ä".
Dein Link schrieb:
Erweiteter ASCII-Zeichensatz
-
Hallo bins noch mal
Also das Programm lief wie gesagt in einer cpp Datei wunderbar...
Habe es jetzt als Klasse umgeschriebn (copy & paste) und es funktioniert nicht mehr. Mit dem Fehlermeldung finde ich das Problem nicht.
Fehlermeldung:
error: no matching function for call to ‘max_element(std::map<char, int>::iterator, std::map<char, int>::iterator, <unresolved overloaded function type>)’
char ch = max_element(mymap.begin(), mymap.end(), cmp)->first;
bool Decryption::cmp(test::value_type const & a, test::value_type const & b) { return a.second < b.second; }
/* * File: Decryption.h * Author: Julian * * Created on 10. Januar 2013, 12:15 */ #ifndef DECRYPTION_H #define DECRYPTION_H #include <cstdlib> #include <iostream> #include <fstream> #include <stdexcept> #include <map> #include <algorithm> using namespace std; typedef std::map< char, int > test; class Decryption { public: Decryption(); Decryption(const Decryption& orig); virtual ~Decryption(); void increment(int &i); bool cmp(test::value_type const & a, test::value_type const & b); bool decrypt(); private: }; #endif /* DECRYPTION_H */
Vielen Dank!
-
cmp() ist an eine Klasse gebunden, nämlich an Decrypter.
Ohne eine Instanz kann es nicht verwendet werden.
Entweder du nutzt std::bind:std::bind(this, cmp) // oder so, habe das bisher selten verwendet
oder du machst das static (wozu ich sowieso raten würde, weil es keine Instanz benötigt.
lg
NathanPS: Das typedef kannst du auch in die Klasse packen.
PPS: Kein using namespace in Header!