1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
10
10
ZUGRIFFE
207
207
EMPFEHLEN
-
23.09.11 16:19 #1
- Registriert seit
- Jul 2011
- Beiträge
- 63
Hi Leute!
Ich hab ein Problem bei einem Programm. Ich möchte, die Häufigkeit eines Strings in einer Textdatei feststellen.
Hab selber nur die Idee, dass ich die Strings miteinander vergleiche, aber weiter weiß ich leider nicht.
Ich hoffe auf schnelle Antworten.
MfG,
MrCodeMaster
-
Hallo,
Folgendes sollte ungefähr das tun was du willst. Du musst halt vorher den Dateiinhalt in den string strDatei laden:
Code cpp:1 2 3 4 5 6 7 8 9
char* strDatei; char* strPattern = "asdf"; int found = 0; for (int i = 0; i < strlen(strFile); i++) { if (strncmp(strFile+i, strPattern, strlen(strPattern)) == 0) found++; }
-
23.09.11 18:09 #3
- Registriert seit
- Jul 2011
- Beiträge
- 63
Danke für die schnelle Antwort!
Das ist aber so wie ich da sehe ein vorgegebener String, und ich möchte dass aber mit einen nicht vorgegeben String machen.
Ich möchte Lottozahlen für ein halbes Jahr eingeben und dann die Häfigkeit der Zahlen überprüfen.
-
Hallo,
Meinst du bei strPattern? Du kannst da alles reinschreiben was du willst. z.B.: halt auch eine Zahl. Du musst sie nur vorher in einen String konvertieren.
-
23.09.11 18:38 #5
- Registriert seit
- Jul 2011
- Beiträge
- 63
Ja das ist mir schon klar aber ich will ja dann die Lottozahlen nicht auf eine Zahlenreihenfolge beschränken sonder alle miteinbeziehen.
Hier ein Beispiel:
534126
654782
875390
125678
827568
827568
534126
Das soll er auf Häfigkeit überprüfen und mir dann sagen: 534126 ist 2 mal vorgekommen und 827568 ist 2 mal vorgekommen.
-
OK. Jetzt hab ichs verstanden.
Dann ließ dir alle Zahlen ein, konvertier sie in ints und speicher sie in einen vector. Dann mach folgendes
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
std::vector<int> numbers; while (numbers.size() > 0) { int currentNumber = numbers[0]; int counter = 0; for (int i = 1; i < numbers.size(); i++) { if (currentNumber == numbers[i]) { counter++; numbers.erase(numbers.begin() + i); i--; } } number.erase(numbers.begin()); std::cout << currentNumber << " kommt " << counter << " mal vor" << std::endl; }
-
23.09.11 18:46 #7
- Registriert seit
- Jul 2011
- Beiträge
- 63
Danke sehr!
Hoff ma mal das ich somit auch was im Lotto gewinne :-D
-
Statistisch eher unwahrscheinlich
-
23.09.11 18:49 #9
- Registriert seit
- Jul 2011
- Beiträge
- 63
-
So ist das allerdings äußerst ineffizient. Die Abbruchbedingung der Schleife muss jedes mal den kompletten String durchlaufen, um dessen Länge festzustellen. Da sich die Stringlänge in der Schleife aber nicht ändert, kann man die Länge genauso gut auch vorberechnen. Selbiges gilt für das strlen in der Schleife. Und schlussendlich gibt es zum Auffinden eines Strings in einem anderen bereits die Funktion strstr.
Auch wieder nicht sonderlich effizient. erase auf einem std::vector ist extrem langsam, da im schlimmsten Fall sämtliche Elemente kopiert werden müssen. Besser entweder eine std::map<int, int> (oder eine std::unordered_map<int, int>) zum Speichern der Häufigkeiten verwenden oder den std::vector vorher sortieren und einmal durchlaufen. Beispielcode:
Mit std::map<int, int>:
Anmerkung: diese Methode könnte man auch ohne vorheriges Zwischenspeichern in den std::vector verwenden.Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14
std::vector<int> numbers; std::map<int, int> counts; for (std::vector<int>::const_iterator it = numbers.begin(); it != numbers.end(); ++it) { ++counts[*it]; } for (std::map<int, int>::const_iterator it = counts.begin(); it != counts.end(); ++it) { std::cout << it->first << " kommt " << it->second << " mal vor" << std::endl; }
Mit sortieren:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
std::vector<int> numbers; std::sort(numbers.begin(), numbers.end()); int currentNumber = numbers.front(); int count = 1; for (std::vector<int>::const_iterator it = numbers.begin() + 1; it != numbers.end(); ++it) { if (*it == currentNumber) { ++count; } else { std::cout << currentNumber << " kommt " << count << " mal vor" << std::endl; currentNumber = *it; count = 1; } } std::cout << currentNumber << " kommt " << count << " mal vor" << std::endl;
Grüße,
Matthias„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
24.09.11 11:04 #11
- Registriert seit
- Jul 2011
- Beiträge
- 63
Wie kann ich jetzt den Inhalt den ich eingelesen habe in einen Vector kopieren****?
Hier mein Code:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <vector> #include <list> #include <cstring> #include <cctype> #include <fstream> #include <typeinfo> #include <cstdlib> #include <string> using namespace std; int main() { char eingabe_1[5000]; char d_öffnen[50]; int o_länge; string d_offen; vector<int> numbers; int currentNumber = numbers.front(); int count = 1; TEST: cout << "Bitte Namen der Datei die eingelesen werden soll eingeben: "; cin >> d_öffnen; ifstream FileTest(d_öffnen); // Überprüfen ob Datei vorhanden ist. if(!FileTest) { cout << "Datei nicht gefunden" << endl; goto TEST; } //Wenn Datei vorhanden wird sie geöffnet. o_länge = strlen(d_öffnen); d_offen = d_öffnen; d_offen.resize(o_länge); string text1; ifstream file; file.open(d_offen, ios::in); while(!file.eof()) // Datei auslesen. { getline(file,text1); strcpy(eingabe_1, text1.c_str()); } for (vector<int>::const_iterator it = numbers.begin() + 1; it != numbers.end(); ++it) { if (*it == currentNumber) { ++count; } else { cout << currentNumber << " kommt " << count << " mal vor" << endl; currentNumber = *it; count = 1; } } cout << currentNumber << " kommt " << count << " mal vor" << endl; system("PAUSE"); return 0; }
Ähnliche Themen
-
Ende eines YouTube Videos per JavaScript feststellen
Von chpa im Forum Javascript & AjaxAntworten: 5Letzter Beitrag: 01.04.11, 10:30 -
Ende eines externen Films feststellen.
Von Snakebite im Forum Flash PlattformAntworten: 8Letzter Beitrag: 11.11.07, 22:08 -
Häufigkeit eines Feldes errechnen
Von ahykes im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 06.03.07, 15:14 -
Grösse eines Bildes im Internet feststellen
Von MondGsicht im Forum JavaAntworten: 1Letzter Beitrag: 13.05.05, 12:07 -
Verschlüsseln eines Strings(XOR)
Von mowl im Forum C/C++Antworten: 15Letzter Beitrag: 25.04.04, 13:13





Zitieren

Login






