tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Matthias Reitinger
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
207
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    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
     

  2. #2
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    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++;
    }
     

  3. #3
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    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.
     

  4. #4
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    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.
     

  5. #5
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    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.
     

  6. #6
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    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;
    }
     

  7. #7
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Danke sehr!

    Hoff ma mal das ich somit auch was im Lotto gewinne :-D
     

  8. #8
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Statistisch eher unwahrscheinlich
     

  9. #9
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Zitat Zitat von Steiner_B Beitrag anzeigen
    Statistisch eher unwahrscheinlich

    Ich wieß aber probieren kostet ja nichts.
     

  10. #10
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    Zitat Zitat von Steiner_B Beitrag anzeigen
    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++;
    }
    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.

    Zitat Zitat von Steiner_B Beitrag anzeigen
    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;
    }
    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>:
    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;
    }
    Anmerkung: diese Methode könnte man auch ohne vorheriges Zwischenspeichern in den std::vector verwenden.

    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
    MrCodeMaster bedankt sich. 
    „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

  11. #11
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    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

  1. Ende eines YouTube Videos per JavaScript feststellen
    Von chpa im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 01.04.11, 10:30
  2. Ende eines externen Films feststellen.
    Von Snakebite im Forum Flash Plattform
    Antworten: 8
    Letzter Beitrag: 11.11.07, 22:08
  3. Häufigkeit eines Feldes errechnen
    Von ahykes im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 06.03.07, 15:14
  4. Grösse eines Bildes im Internet feststellen
    Von MondGsicht im Forum Java
    Antworten: 1
    Letzter Beitrag: 13.05.05, 12:07
  5. Verschlüsseln eines Strings(XOR)
    Von mowl im Forum C/C++
    Antworten: 15
    Letzter Beitrag: 25.04.04, 13:13