Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

11

23.09.2004, 10:10

Hi,

also das Thema Vokabeltrainer hält mich momentan richtig fest ;D

Hab den obrigen etwas erweitert:
- Mehrdeutigkeit von Übersetzungen sind nun implementiert sowie schöner gestaltet ;)
- Klasse angeschaft für Vokabeln die in die Datenbank gestopft werden.
uvm. :)

Groß/Kleinschreibung wird in den nächsten 60 min auch drin sein ;D

Wenn Du willst kann ich den code auch posten, ansonsten lass ich es :) (Ist relativ groß geworden ;))

- Patrick

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

12

23.09.2004, 10:40

tzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz, ncihts zu tun oda wa?^^

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

13

23.09.2004, 10:43

Schulfrei ist was feines ;D

Nur der Nachteil dabei ist, dass mir immer sehr schnell langweilig wird wenn ich frei habe :crying:

- Patrick :)

14

23.09.2004, 13:45

Find ich geil. Vielen Dank, die Funktion für Groß und Kleinschreibung werd ich mir auch mal gleich ansehen. Du hast es gut, Schulfrei...., Ich hatte heute wieder schön 7 Std. und nachher auch noch gut 3 Std Sport (allerdings nicht von der Schule aus ;) )
Meinetwegen kannst du den Quelltext gerne hier reinstellen! ich denke, da kann ich mir noch einiges Abgucken ;)
Ich bin grad dabei eine Funktion zu schreiben, dass der die Vokabeln aus einer Datei (z.B. *txt) liest, damit man nicht immer das gesammte Programm ändern muss, um neue Vokabeln einzufügen.
Morgen schreiben wir einen Vokabeltest in Latein, mal gucken wie der wird ;)

dann nochmals vielen Dank,

Mfg Serubabbel

//edit: Ach ja, noch eine Frage: Warum hast du bei den cout und cin Funktionen eigentlich immer std:: vor geschrieben? Hat das irgendwas besonderes zu bedeuten?
"Es ist Zeit, dass die Menschheit ins Sonnensystem vordringt"
George W. Bush

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

15

23.09.2004, 14:03

Hi,

ok hier der code:

C-/C++-Quelltext

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
// ///////////////////////////////////////////////////////////////////////////

// Datei:        helper.h

// ///////////////////////////////////////////////////////////////////////////

// Autor:        Patrick Ullmann

// Erstellt:     23.09.2004

// Änderungen:   23.09.2004 (Patrick)  Datei erstellt

// ///////////////////////////////////////////////////////////////////////////

// Beschreibung: Diverse kleine Hilferlein *g*


#ifndef __helper_h___23_09_2004___1076196505551201163650965128323046192943529_
#define __helper_h___23_09_2004___1076196505551201163650965128323046192943529_

// I N C L U D E S ///////////////////////////////////////////////////////////

#include <string>
#include <locale>
#include <algorithm>

// S T R U K T U R E N ///////////////////////////////////////////////////////

    // Der folgende Code wurde von Benjamin Kaufmann übernommen!!

    // http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=stricmp

namespace helper
{
    class LocCharEq_t
    {
    public:
        LocCharEq_t (const std::locale& location = std::locale::classic()) : 
        m_location (location),
        m_type (std::use_facet<std::ctype<char> > (m_location)) {};

        inline bool operator () (char left, char right) const
        { return (m_type.tolower(left) == m_type.tolower(right)); }

    private:
        const std::locale& m_location;
        const std::ctype<char>& m_type;
    };
        
    class LocNoCaseEqual_t
    {
    public:
        LocNoCaseEqual_t (const std::locale& location = std::locale::classic()):
        m_location (location) {};
        
        inline bool operator () (const std::string& left, const std::string& right) const
        {
            if (left.length() != right.length())
                return (false);

            return  std::equal (left.begin(),
                                left.end(), right.begin(),
                                LocCharEq_t(m_location));
        }

    private:
        const std::locale& m_location;
    };

} // Namespace


// F U N K T I O N E N ///////////////////////////////////////////////////////

namespace helper
{
        // Vergleiche 2 Strings auf case-insensitiv Ebene

    inline bool equal_string (const std::string& left, 
                            const std::string& right, 
                            const std::locale& location)
    { 
        return LocNoCaseEqual_t(location)(left, right); 
    }
} // Namespace


#endif


C-/C++-Quelltext

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// ///////////////////////////////////////////////////////////////////////////

// Datei:        dictionary.h

// ///////////////////////////////////////////////////////////////////////////

// Autor:        Patrick Ullmann

// Erstellt:     23.09.2004

// Änderungen:   23.09.2004 (Patrick)  Datei erstellt

// ///////////////////////////////////////////////////////////////////////////

// Beschreibung: Ein Wörterbuch halt :)


#ifndef __dictionary_h___23_09_2004___107619650555120116365096513046192943529_
#define __dictionary_h___23_09_2004___107619650555120116365096513046192943529_

// I N C L U D E S ///////////////////////////////////////////////////////////

#include <iostream>
#include <sstream>
#include <vector>
#include "helper.h"

// S T R U K T U R E N ///////////////////////////////////////////////////////

namespace dictionary
{
    class vocabulary
    {
    public:
            // Con- und Destructor

        vocabulary  (void) {};
        ~vocabulary (void) {};
        
            // Löscht alle Inhalte

        inline void clear (void)
        { 
            m_normal.clear ();
            m_translations.clear ();
        }

            // Setzt das Wort welches abgefragt wird

        inline void setNormal (const std::string &normal)
        { m_normal = normal; }

            // Gibt das Abfragungswort wieder 

        inline std::string getNormal (void) const
        { return (m_normal); }

            // Fügt ein Übersetzungswort hinzu

        inline void addTranslation (const std::string &translation)
        { 
                // Bevor das Wort rein kommt, erst testen ob es das

                // Wort schon gibt.

            if (!checkTranslation (translation))
                m_translations.push_back (translation); 
        }

            // Testet ob die Übersetzung schon vorhanden ist.

        inline bool checkTranslation (const std::string &translation) const
        {
                // Durchlaufe alle Übersetzungsmöglichkeiten

            for (unsigned int i=0; i<m_translations.size(); ++i)
            {
                    // Übersetzungsmöglichkeiten gefunden? Wenn ja, Raus hier!

                if (helper::equal_string (translation, m_translations[i], std::locale("german")))
                    return (true);
            }

                // Übersetzungsmöglichkeiten wurde nicht gefunden

            return (false);
        }

            // Gibt alle Übersetzungsmöglichkeiten schön Formatiert

            // in einem String zurück

        inline std::string getTranslations (void) const
        {
                // Der Stream für die Rückgabe

            std::stringstream result("");

                // Alle Übersetzungsmöglichkeiten durchlaufen

            for (unsigned int i=0; i<m_translations.size(); ++i)
            {
                    // Reinstopfen

                result << m_translations[i].c_str();
                    // Das letzte bekommt kein ', '!

                if (i < m_translations.size()-1)
                    result << ", ";
            }

                // Und ab damit!

            return result.str();
        }

    private:
            // Abzufragen des Wort

        std::string m_normal;
            // Übersetzungen des Wortes

        std::vector<std::string> m_translations;
    };

    class database
    {
    public:
            // Con- und Destructor

        database    (void) {};
        ~database   (void) {};

            // Ein Vokabelobjekt einfügen

        inline void add (const vocabulary &_vocabulary)
        { m_vocabulary.push_back (_vocabulary); }

            // Leert die "Datenbank"

        inline void clear (void)
        { m_vocabulary.clear (); }

            // Größe dieser "Datenbank" wiedergeben

        inline int getSize (void) const
        { return (m_vocabulary.size()); }

            // Testet den User 

        inline bool test_user (void) const
        {
                // Zufallsvokabel suchen

            int id = rand()%m_vocabulary.size();

                // Abfragen

            std::cout << "Was bedeutet '" << m_vocabulary[id].getNormal().c_str() 
                      << "' uebersetzt?" << std::endl;

                // Eingabe nehmen

            char buffer[128] = "";
            std::cin.getline (buffer, 128);

                // Ist die Eingabe richtig?

            if (m_vocabulary[id].checkTranslation(buffer))
            {
                    std::cout << "Richtig!" << std::endl;
                    return (true);
            }

                // Eingabe war Falsch!

            std::cout << "Falsch!!" << std::endl;

                // Übersetzungsmöglichkeiten ausgeben

            std::cout << "Die richtigen Uebersetzungen von '"
                      <<  m_vocabulary[id].getNormal().c_str()
                      << "' sind '"
                      << m_vocabulary[id].getTranslations().c_str()
                      << "'." << std::endl;

            return (false);
        }
    
    private:
            // Die Vokabeln

        std::vector<vocabulary>            m_vocabulary;
    };
} // Namespace


#endif


und die main:

C-/C++-Quelltext

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
// ///////////////////////////////////////////////////////////////////////////

// Datei:        main.cpp

// ///////////////////////////////////////////////////////////////////////////

// Autor:        Patrick Ullmann

// Erstellt:     24.09.2004

// Änderungen:   24.09.2004 (Patrick)  Datei erstellt

// ///////////////////////////////////////////////////////////////////////////

// Beschreibung: Die Hauptdatei


// I N C L U D E S ///////////////////////////////////////////////////////////

#include <ctime>        // Für time(NULL);

#include "helper.h"
#include "dictionary.h"

// F U N K T I O N E N ///////////////////////////////////////////////////////

int main (void)
{
        // Random initialisieren

    ::srand(time(NULL));

        // Datenbank anlegen und Temp-Vokabelobjekt

    dictionary::database db;
    dictionary::vocabulary voc;

        // Vokabel für 'Neu' anlegen

    voc.setNormal ("neu");
    voc.addTranslation ("modernus");
    voc.addTranslation ("novellus");
    voc.addTranslation ("novus");
    voc.addTranslation ("nuperus");
    voc.addTranslation ("nova");
    voc.addTranslation ("novum");
    voc.addTranslation ("recens");
    voc.addTranslation ("recentis");

        // Vokabel reinstopfen

    db.add (voc);

        // Temp-Vokabelobjekt leeren.

    voc.clear ();

        // Vokabel für 'Ich' anlegen

    voc.setNormal ("ich");
    voc.addTranslation ("ego");

        // Vokabel reinstopfen

    db.add (voc);

        // Temp-Vokabelobjekt leeren.

    voc.clear ();

        // Vokabel für 'lachen' anlegen

    voc.setNormal ("lachen");
    voc.addTranslation ("rideo");
    voc.addTranslation ("risio");
    voc.addTranslation ("ridere");
    voc.addTranslation ("risus");

        // Vokabel reinstopfen

    db.add (voc);

        // Benutzer abfragen 10x abfragen

    for (int i=0; i<10; ++i)
        db.test_user ();

        // Gegen das direkte Schließen der Console

    std::cin.get();

    return 0;
}


Ja es hat einen Sinn das ich std:: immer davor schreibe, ich hab oft mit using-direktiven schlechte Erfahrungen gemacht da es auch in diversen libs von mir auch klassen wie cout gibt und co oder vector, welche was total anderes machen!

Nebenbei: Sieht stylischer aus ;D;D;D

Achja zu Deiner Vorgehensweise:
Lass die Dateien erstmal links liegen! Bastle jetzt erstmal intern alles weiter z.B. Menü und umgebung und dann erst Dateien! Sonst fixierst Du Dich zu extrem auf die Kleinigkeiten und die Funktionalität des Programms muss dann drunter leiden! (Aus Erfahrung kann ich davon ein Lied singen ;))

- Patrick, der hoft das der Code gut genug ist :)

16

23.09.2004, 14:18

Zitat

- Patrick, der hoft das der Code gut genug ist

Ja, ich denke schon ;)



Zitat

Achja zu Deiner Vorgehensweise:
Lass die Dateien erstmal links liegen! Bastle jetzt erstmal intern alles weiter z.B. Menü und umgebung und dann erst Dateien! Sonst fixierst Du Dich zu extrem auf die Kleinigkeiten und die Funktionalität des Programms muss dann drunter leiden! (Aus Erfahrung kann ich davon ein Lied singen )


Ok, werd ich machen. Allerdings schreib ich mir jetzt noch schnell die Funktion (eine ganz simple) zum laden der Lektionen, die im Vokabeltest morgen drankommen. Dann kann ich die (auch wenn ohne Groß-Kleinschreibung und anderen extras) erst einmal üben kann!

Vielen Dank nochmal,
Mfg Serubabbel
"Es ist Zeit, dass die Menschheit ins Sonnensystem vordringt"
George W. Bush

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

17

23.09.2004, 14:34

wie schon gesagt, in meinem geposteten Code ist Groß/Kleinschreibung schon implementiert :) Du musst jetzt nur noch ein gutes Menü machen und dann die Sache mit den Files :)

18

26.09.2004, 11:47

Ich hab da noch einaml eine kleine Frage zu deinem Quelltext: Was ist/Wofür steht das "namespace"? Ich hab schon in MSDN nachgeguckt, konnte damit aber nichts anfangen...

Wäre echt nett,
Mfg Serubabbel
"Es ist Zeit, dass die Menschheit ins Sonnensystem vordringt"
George W. Bush

unsigned int

Alter Hase

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

19

26.09.2004, 13:59

ISt hier auch schon öfters gefragt worden:

Namespaces sind "Namensräume". Das ist so ähnlich wie mit einem Nachnamen.
Du kannst zum Beispiel den Variablennamen "iZaehler" (nur ein Beispiel) mehrfach verwenden, ohne dass auf die anderen Zähler zugegriffen wird:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace Namespace1
{
int iZaehler;
}

namespace Namespace2
{
int iZaehler
}

// nun kann man auf die einzelnen mit dem Scope-Operator (::) zugreifen

Namespace1::iZaehler = 2;
Namespace1::iZaehler = 4;
//Außerdem kann man dann auch noch einen globalen Zähler machen, 

//auf den man dann mit 

//::iZaehler

// zugreifen kann


Ach ja, die Standart-Header haben alles im Namespace "std", weshalb man vor ein Programm using namespace std; schreiben kann, wodurch man sich den Zugriff über std:: sparen kann.

Aber guck dir mal die FAQ in diesem Forum an; zumindest könnte da was sein ;) oder benutz die Suche...
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

20

26.09.2004, 15:31

Hi,

Namespaces kann man als "Nachnamen" vergleichen für C++:
Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int x = 33;  // Globaler Namespace kann so aufgerufen werden ::x = 22;


namespace Nox // "Nachname" "Nox"

{
   int x = 55; // Variable kann nur so aufgerufen werden Nox::x = 33; oder mit einer using-direktive

}

namespace Patrick // "Nachname" "Patrick"

{
   int x = 77; // Variable kann nur so aufgerufen werden Patrick::x = 33; oder mit einer using-direktive

}

// Benutzung:

::x = 9999; // Globaler Namespace, also Kein Nachname

Nox::x = 333; // Variable aus dem Namespace Nox

usw.


Namespaces sind extrem praktisch! man kann z.B. für eine WrapperAPI folgendes machen, einen Namespace Linux, Windows usw.

Oder bestes Beispiel bei mir momentan:
Engine hat den namen "Loki" und benutzt einen vector intern für 4 Dimensionen, benutzt wird er so:
loki::vector
das selbe mit matrizen:
loki::matrix
oder quaternions:
loki::quaternion

usw.

Also Praktisch und sollte man nicht in die ecke drücken ;)

- Patrick

Werbeanzeige