Anfängerfragen zu einem Projekt mit Klassen



  • Hallo,

    hier mal ein paar Ansätze:
    1. ich fände std::string hier um einiges geeigneter ...
    2. was ist das mit dem 'lang'?, lies doch einfach bis zum Ende der Datei
    3. um die Wörter zu zählen könnte man ne std::map nehmen

    Gruß Simon



  • hi varginator,

    ich würde doch lieber so fortfahren

    Ctext_analyse::datei_suchen(void)
    { 
    
    }
    

    und ein/mehrere Schleifen bauen. // so einfach wie möglich erstmal

    ich seh hier noch nich ganz durch -> std::map

    gruß
    Venti



  • ventilatores schrieb:

    ...so einfach wie möglich erstmal...

    Dann solltest du dennoch mindestens std::string betrachten (Die C++ Stringklasse).

    std::vector und std::map sind sehr häufig eingesetzte Containerklassen (std::vector kannst du dir als Array vorstellen, das bei Bedarf die Größe verlängert, std::map wiederum kann man als Lexikon betrachten: Ein Container mit Schlüssel/Wertepaaren). In der Regel ist nur der Ersteinstieg etwas komplizierter, sie erleichtern aber vieles.

    cu André



  • naja, ich habe ehrlich gesagt Angst das ich alles wieder vermurkse und nichts mehr geht.
    Ich habe erstmal so angefangen und gehe dann systematisch vor...

    aber das mit den container Klassen hört sich ganz interessant an.

    void Ctext_analyse::datei_suchen(void)
    { 
    	int i;
    	for(i=0; i<lang; i++);
    	{
    		cout << text[i] << endl;
    	}
    // erst jetzt kann ich nach den Buchstaben suchen
    
    }
    


  • Hier z.B. lernst du, wie Dateien mittels C++ Zeilenweise ausgelesen werden:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39469.html

    Dann musst die einzelnen Worte anhand von Trennzeichen ( punkt, komma, leerzeichen ) herausfiltern. Dabei kann dir std::string aus der STL weiterhelfen.

    Am besten du beginnst erstmal mit dem sauberen Einlesen der Datei in einen std::vector und dann schaust du dir die vielfältigen Möglichkeiten der std::string an ( http://www.cplusplus.com/reference/string/string/ ) und überlegst dir ein Konzept, wie du am besten die Worte filterst.

    Und wenn du was hast, können wir uns das angucken und dir im Zweifelsfall helfen 🙂

    Edit: Tippfehler korrigiert 😃



  • ja das ist gut, weil ich komme bei meiner Zählervariable grad nicht weiter.
    Er gibt mir zwar alle r aus aber er soll sie anders darstellen

    void Ctext_analyse::datei_suchen(void)
    { 
    	int i;
    	for(i=0; i<lang; i++)// erst jetzt kann ich nach den Buchstaben suchen
    	{
    		if('r'==text[i])
    		cout << text[i] << endl;
    	}
    
    }
    


  • Wie solln sie den anders dargestellt werden?

    ... bei der for-Schleife musst du nicht schon vorher definieren

    for(int i = 0; ...
    

    Gruß Simon



  • @venti

    Vorhin wolltest du noch Wörter zählen oder suchen.
    Jetzt suchst du nach einzelnen Buchstaben...

    Was genau willst du jetzt eigentlich? 🙂



  • ... Wenn du natürlich nur die Buchstaben zählen willst, dann reicht auch ein std::vector<int> oder ein std::map<char, int> ...

    Gruß Simon



  • ja, ich muss doch mal alles probieren und nur so kann ich lernen und ey bekomm ich hier nich mal ein Lob, ich hab mir alles allein zusamm geknistert!

    void Ctext_analyse::datei_suchen(void)
    { 
    	int i; 
    	int z=0; 
    	for(i=0; i<lang; i++)
    	{
    		if('r'==text[i]) // text[i] an der Stelle i wird auf gleichheit mit r geprüft, wenn dann true wird
    			{
    			z=z+1;		
    			}
    	}
    	cout << "Anzahl: "<<z/*text[i]*/ << endl;  
    }
    

    **
    Nocmal zum Programm!**

    ich will ein Wort suchen das mit r beginnt und er soll mir alle Wörter mit r beginnend ausgeben, so wie google

    ja und ich komm bei der Schleife nicht weiter, jemand ne Idee 😃

    gruß
    Venti



  • ventilatores schrieb:

    und ey bekomm ich hier nich mal ein Lob, ich hab mir alles allein zusamm geknistert!

    Braver venti, das hast du gut gemacht! :p
    (Weshalb erwartest du für etwas Code schreiben ein Lob?)

    ventilatores schrieb:

    ich will ein Wort suchen das mit r beginnt und er soll mir alle Wörter mit r beginnend ausgeben, so wie google

    Dann schau doch, ob vor dem 'r' jeweils ein Whitespace steht (Leerzeichen/Zeilenende/Tabulator), falls ja, beginnt dort ein Wort...



  • Du könntest ja schaun ob

    Nexus schrieb:

    ... vor dem 'r' jeweils ein Whitespace steht (Leerzeichen/Zeilenende/Tabulator), falls ja, beginnt dort ein Wort...

    ... und ob danach noch mindestens ein Zeichen kommt ...

    Falls du aber abprüfen willst, ob auch nur buchstaben nach dem 'r' kommen musst du schon mehr prüfen, oder per RegEx (Regular Expression) ...

    Gruß Simon



  • morjens,

    ich probiere das Wort "Wert" in meine Text zu suchen und die Anzahl der gefundenen Wörter (Wert) anzuzeigen, wo ist hier mein Denkfehler?

    void Ctext_analyse::datei_suchen(void)
    { 
    	int i; 
    	int wert;
    	int z=0; 
    	cout << "Welches Wort suchen Sie?" << endl;
    	cin >> wert;
    	for(i=0; i<lang; i++)
    	{
    		if('wert'==text[i]) 
    			{
    			z=z+1;		
    			}
    			cout << "*";
    	}
    	cout << "Anzahl: "<<z<< wert << endl; 
    
    }
    

    gruß
    Vetila....tores



  • Jetz suchst du ein eingegebenes Wort zu suchen, was willst du denn nun? ...

    void Ctext_analyse::datei_suchen(void)
    {
        int i;
        int wert;
        int z=0;
        cout << "Welches Wort suchen Sie?" << endl;
        cin >> wert;
        for(i=0; i<lang; i++)
        {
            if('wert'==text[i]) // Wieso liest du dann erst ein Wort ein?
                {               // Außerdem verlgeichst du einen string mit einem buchstaben ...
                z=z+1;       
                }
                cout << "*";
        }
        cout << "Anzahl: "<<z<< wert << endl;
    }
    

    Du musst erstmal klar ausdrücken was du überhaupt machen willst und nicht wie du es machen willst ...

    ... wenn es ums Wörterzählen geht, dann ist z.B. eine std::map<std::string, int> möglich ....

    Gruß Simon



  • Hast du denn inzwischen mal versucht die Datei Zeilenweise einzulesen und einzelne Wörte herauszufiltern? Genug Tipps hast du ja eigentlich bekommen 🙂



  • relax, relax, ja ich muss char benutzen...

    nachdem ich ja gestern es geschafft hatte die Anzahl von r zu ermitteln und auf der Konsole auszugeben wollte ich heute alles ein wenig schicker gestalten.
    Also ich probiere etwas rum, da muss man schon etwas flexibel mit mir sein.
    Ist ja klar das man als Anfänger erstmal hin und her macht...

    void Ctext_analyse::datei_suchen(void)
    { 
    	int i; 
    	int z=0; 
    	for(i=0; i<lang; i++)
    	{
    		if('r'==text[i]) 
    			{
    			z=z+1;		
    			}
    	}
    	cout << "Anzahl: "<<z<< endl; 
    	}
    

    Also aktuell will ich ein Wort suchen das auf der Konsole augegeben wird und mir die Anzahl angezeigt wird.

    Ich wollte alles in einer Schleife packen, ist das o.k.? oder besser mehrere Schleifen, hm.....hab da ne Denkblockade grade

    gruß
    Venta



  • Hier mal n paar Denkansätze:

    - überlege dir, wie du die Wörter brauchst
    -> musst du beim Speichern beachten
    - mit was willst du das eingelesene Vergleichen/oder Zählen
    -> geeigneten Container finden, der die Anzahl pro Wort speichert
    - sieh' dir nochmal alle geposteten Sachen an und überlege ob die Ratschläge dir helfen können

    Du darfst gerne Fragen stellen, aber bitte so, dass es jeder versteht und du am besten schon ein bisschen Code von deinen Ansätzen zeigst ...

    ... es ist nicht schlimm, wenn du dein Programm erweitern willst, aber du bist mit deimen Code immer noch so weit wie zu Anfang (wartest du etwa auf eine Musterlösung?) ...



  • void Ctext_analyse::datei_suchen(void)
    
    { 
    	FILE *fp;
       int i;
       char text[255];
       char suchwort[2][20]={"wert","so"};
       int AnzahlSuchwoerter=2;
       char* ptr;
    
       fp = fopen ("collection.txt","rt");
       if (fp==NULL)
       {
          printf("Fehlen von diso_b_text.ini\r\n");
       }
       else
       {
          i=0;
          while ( feof( fp ) != EOF )
          {
    
             fgets(text,255, fp);
    
             for(int i =0;i<AnzahlSuchwoerter;i++)
             {
                ptr = strstr (text,suchwort[i]);
    
                if ( ptr != NULL )
                {
                   printf("%s ",suchwort[i]);
                   //printf("%s\r\n",text);
    
                }
             }
          }
       }
    
    }
    


  • wie bekomme ich es jetzt Ordentlich ausgegeben, also die Anzahl von ... beträgt ...



  • Hallo ventilatores, ich hab mal zum Spass dir eine Klasse geschrieben die Dir die Wörter aus deiner Datei auflistet, zählt und sortiert, so wie du es im letzten Post gerne gehabt hättest. Viel Spass 🙂

    Dauer 3Std 45min.

    Datei wc.hpp

    #ifndef WC_HPP_INCLUDED
    #define WC_HPP_INCLUDED
    
    #include <string>
    #include <fstream>
    #include <vector>
    #include <map>
    
    struct Wort
    {
        std::string Name;
        int         Anzahl;
    };
    
    class CWortCount
    {
        private:
          std::vector<Wort> m_Worte;                     // enthält die Worte : Anzahl für die Ausgabe
          std::ifstream* m_pfs;                          // zeiger auf file handle
          void ZaehleWorte(std::ifstream* fs);           // zerlegt die Datei in Worte
    
          void WortZurMap(std::string& strWort,
                    std::map<std::string, int>& mapWorte);  // fügt neue Worte ein, erhöht den Zähler
    
          void KopiereMapZuVektor(std::vector<Wort>& vecWorte,
                    std::map<std::string,int>& mapWorte);// kopiert die Worte in einen vektor für den
                                                         // besseren Zugriff
        public:
          void SortCount(bool asc = true);               // sortieren nach Anzahl
          void SortWord(bool asc = true);                // lexikalisch sortieren
          bool OeffneDatei(std::string& Datei);          // Oeffnet die Datei zu lesen
          Wort& operator[](const long idx);               // liefert alle Wörter und deren Anzahl
          long WortAnzahl() { return m_Worte.size(); }   // Anzahl der gefunden Woerter
    };
    
    #endif // WC_HPP_INCLUDED
    

    Datei: wc.cpp

    #include "wc.hpp"
    
    #include <iostream>
    #include <map>
    
    using namespace std;
    
    bool CWortCount::OeffneDatei(string& Datei)
    {
        m_pfs = new ifstream(Datei.c_str());
    
        if (!m_pfs->is_open())
        {
          delete m_pfs;
          return false;
        }
    
        ZaehleWorte(m_pfs);
    
        // aufräumen brauchen wir nicht mehr
        // close wird automaisch aufgerufen
        delete m_pfs;
        return true;
    }
    
    void CWortCount::ZaehleWorte(ifstream* fs)
    {
        // Zerlegen des input streams in worte
        char c;
        string wort;
        map<string, int> mapWorte;  // enthält die gefundenen (Worte:Anzahl)
    
        while (fs->get(c))
        {
            switch (c)
            {
                case ',': case '.': case ' ': case '\n': case ';':
                // worttrenner gefunden
                  if (wort.length() > 0)
                  {
                    WortZurMap(wort, mapWorte);
                    wort.clear();
                  }
                break;
                default:
                  wort.push_back(c); // addiere Zeichen zum Wort;
                break;
            }
        }
    
        if (!fs->eof()) cout << "DBGM: Filestream nicht leer !!" << endl;
    
        KopiereMapZuVektor(m_Worte, mapWorte);
    }
    
    void CWortCount::WortZurMap(string& strWort,
                                map<string, int>& mapWorte)
    {
    
        pair<map<string,int>::iterator,bool> cmp;
    
        // versuche das wort einzufügen
        cmp = mapWorte.insert (pair<string,int>(strWort,1) );
    
        // wort ist schon vorhanden erhöhe den Zähler;
        if (cmp.second == false)
             (*cmp.first).second++;
    }
    
    Wort& CWortCount::operator[](const long idx)
    {
        return m_Worte.at(idx);
    }
    
    void CWortCount::KopiereMapZuVektor(vector<Wort>&    vecWorte,
                            map<string,int>& mapWorte )
    {
        map<string,int>::iterator it;
        for (it = mapWorte.begin(); it != mapWorte.end(); it++)
        {
            Wort w = { (*it).first, (*it).second };
            vecWorte.push_back(w); // erzeugt eine Kopie und wird owner
        }
    }
    
    void CWortCount::SortCount(bool asc)
    {
        // ganz billige sortierung!
        for(size_t i = 0; i < m_Worte.size()-1; i++)
        {
            for(size_t j = i+1 ; j < m_Worte.size(); j++)
              if ((m_Worte.at(i).Anzahl > m_Worte.at(j).Anzahl) == asc)
              {
                Wort temp = m_Worte.at(j);
                m_Worte.at(j) = m_Worte.at(i);
                m_Worte.at(i) = temp;
                 // kleinstes element speichern
              }
        }
    }
    
    void CWortCount::SortWord(bool asc)
    {
        // ganz billige sortierung!
        for(size_t i = 0; i < m_Worte.size()-1; i++)
        {
            for(size_t j = i+1 ; j < m_Worte.size(); j++)
              if ((m_Worte.at(i).Name > m_Worte.at(j).Name) == asc)
              {
                Wort temp = m_Worte.at(j);
                m_Worte.at(j) = m_Worte.at(i);
                m_Worte.at(i) = temp;
                 // kleinstes element speichern
              }
        }
    }
    

    Datei: main.cpp

    #include <iostream>
    #include "wc.hpp"
    
    using namespace std;
    
    int main()
    {
        string datei = "meine.dat";
        CWortCount wc;
    
        // Ich hatte keine Lust den operator! zu überladen um zu prüfen
        // ob der Vorgang erfolgreich war, daher ist die Initialsierung
        // im Konstruktor noch nicht möglich
        if (!wc.OeffneDatei(datei))
         cout << "Kann die Datei nicht oeffnen : " << datei << endl;
    
        wc.SortWord();
        cout << "Alle gefunden Wörter in: " << datei << endl;
        for(int i = 0; i < wc.WortAnzahl(); i++)
          cout << "Anzahl von : " << wc[i].Name
               << " beträgt : " << wc[i].Anzahl
               << endl;
        return 0;
    }
    

    Eine mögliche Ausgabe könnte so aussehen:

    Alle gefunden Wörter in: meine.dat
    Anzahl von : Aenean beträgt : 5
    Anzahl von : Aliquam beträgt : 3
    Anzahl von : Curabitur beträgt : 5
    Anzahl von : Curae beträgt : 2
    Anzahl von : Donec beträgt : 5
    Anzahl von : Duis beträgt : 3
    Anzahl von : Etiam beträgt : 3
    Anzahl von : Fusce beträgt : 6
    Anzahl von : In beträgt : 1
    Anzahl von : Integer beträgt : 5
    Anzahl von : Lorem beträgt : 1
    Anzahl von : Maecenas beträgt : 4
    Anzahl von : Mauris beträgt : 1
    Anzahl von : Morbi beträgt : 2
    Anzahl von : Nulla beträgt : 4
    Anzahl von : Nullam beträgt : 2
    Anzahl von : Nunc beträgt : 3
    Anzahl von : Pellentesque beträgt : 3
    Anzahl von : Phasellus beträgt : 3
    Anzahl von : Praesent beträgt : 1
    Anzahl von : Proin beträgt : 2
    Anzahl von : Quisque beträgt : 4
    Anzahl von : Sed beträgt : 5
    Anzahl von : Suspendisse beträgt : 5
    Anzahl von : Ut beträgt : 3
    Anzahl von : Vestibulum beträgt : 3
    Anzahl von : Vivamus beträgt : 3
    

    Grüssle DC!


Anmelden zum Antworten