tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
478
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Krikus Krikus ist offline Mitglied Silber
    Registriert seit
    Jan 2009
    Beiträge
    64
    Hi,

    ich habe 2 Klassen.
    Klasse 1 "hash"
    Klasse 2 "woerter"

    Nun würde ich gerne den struct aus Klasse "hash" durch durch die Klasse "worter" ersetzen.

    Ich würde es so machen:


    Code cpp:
    1
    2
    3
    4
    
     
    private:
    //struct löschen
    woerter a[79];

    Allerdings weiß ich nun nicht genau wie ich die Methode dh_insert abändern muss.

    Code cpp:
    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
    
    class hash
    {
    private:
            struct Element 
                {string key; //deutsche Wort
                 string info; //englische Wort
                };
     
            Element a[79]; 
     
    public:
     
        hash()
        {
              datei_auslesen();
        }
     
        //########################################################
     
        ~hash()
        {
            zurueck_schreiben();
        }
        //########################################################
     
        int hash(string key)       //Erste Hasfunktion
        {int h = 0; // Hashcode
         int i, l = key.length();
         for (i = 0; i < l; i++) h = (int(key.at(i)) + h*127) % M;
         return h;
        }
        //########################################################
        int hash2(string key)       //Zweite Hasfunktion (=Schrittweitenfunktion)
            {int w = 0; // Schrittweite
             int i, l = key.length();
             for (i = 0; i < l; i++) w = (int(key.at(i)) + w*127) % (M - 1);
             return w;
            }
     
        //########################################################
     
        int dh_insert(string key, string info) //fuegt deutsch-engl. Wortpaar in Hastabelle ein
            {
            Element x;
            x.key = key;
            x.info = info;
             
            int i = hash(x.key);
             int c = hash2(x.key);
             int last = (i + (M - 1)*c)%M;
             while (a[i].key.length() != 0  && a[i].key != x.key && i != last) i = (i+c)%M;
             if (a[i].key.length() == 0) // Satz einfuegen
                 {a[i].key = x.key;
                  a[i].info = x.info;
                  return 0;             //Satz erfolgreich eingefuegt
                 }
             if (a[i].key == x.key)
                  return 1;             //Satz existiert schon
             else return 2;             //Tabelle voll; kein Einfuegen moeglich
            }
     
    ...........
    };

    Code cpp:
    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
    
    class woerter 
    {
        private:
            string key;
            string info; 
     
        public:
     
    woerter(string einkey = "", string eininfo = "") 
                 : key(einkey),info(eininfo) {}
     
        //########################################################
        void set_key(string const& eingabe_name)
        {
            key=eingabe_name;
        }
     
        //########################################################
     
        void set_x_info(string const& eingabe_info)
        {
            info=eingabe_info;
        }
     
        //########################################################
     
        string const& get_key() const
        {
            return key;
        }
     
        //########################################################
     
        string const& get_info() const
        {
            return info;
        }
                
    };

    Wäre über ein paar tipps dankbar.
    Geändert von Krikus (29.05.09 um 16:54 Uhr)
     

  2. #2
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    ja wo liegt das Problem? Wie möchtest du es machen. Ich würde an deiner Stelle eine std Liste benutzen, dann hast du das ganz auch dynamisch als kleiner neben Effekt.

    Code cpp:
    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
    
    #include <list>
     
    typedef std::list<woerter*> woerter_list;
     
     
     
    class hash
    {
    private:
         woerter_list  mylist;
     
    public:
     
     
        int dh_insert(string key, string info) //fuegt deutsch-engl. Wortpaar in Hastabelle ein
            {
                woerter* x = new woerter();
                x->get_key = key;
                x->get_info = info;
     
                mylist.push_back(x);  // fügt den Zeiger am Ende der Liste ein
                     
            }
     
     //..........
    };

    deine dh_insert Funktion ist irgendwie sehr komisch habe ich mir nicht wirklich angeschaut was willst du denn da überprüfen?
    Ach und wenn du schon Klassen benutz wieso erstellst du kein geiegneten Kunstruktoren z.B. bei der Klasse woerter
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  3. #3
    Krikus Krikus ist offline Mitglied Silber
    Registriert seit
    Jan 2009
    Beiträge
    64
    Ich habe bereits obige Problem mit einer Liste gelöst.
    Ich soll aber nun diese Liste durch Doppel-Hashing ersetzen.
    Das ist ja der Witz bei der Sache.

    Der Konstrucktor hinzugfügt.

    Hab mal ein bisschen probiert.

    Bekomme alldings beim testen eine Zugriffsverletztung. (in der dh_insert Methode kommentiert)

    Hier einmal der geänderte Teil:

    Code cpp:
    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
    
    class hash_klasse
    {
    private:
            struct Element 
                {string key; //deutsche Wort
                 string info; //englische Wort
                };
            int M;
     
            woerter a[79]; 
     
    public:
     
        hash_klasse()
        {
            dh_init();
            M=79;
            
        }
     
        //########################################################
     
        ~hash_klasse()
        {
            zurueck_schreiben();
        }
        //########################################################
     
        int dh_insert(string key, string info) //fuegt deutsch-engl. Wortpaar in Hastabelle ein
            {
            Element x;
            x.key = key;
            x.info = info;
             
            int i = hash(x.key);
             int c = hash2(x.key);
             int last = (i + (M - 1)*c)%M;
             while (a[i].get_key().length() != 0  && a[i].get_key() != x.key && i != last) i = (i+c)%M; //ZUGRIFFSVERLETZUNG
             if (a[i].get_key().length() == 0) // Satz einfuegen
             {
                     //a[i].key = x.key;
                     //a[i].info = x.info;
                    a[i].set_key(x.key);
                    a[i].set_x_info(x.info);
                  return 0;             //Satz erfolgreich eingefuegt
                 }
             if (a[i].get_key() == x.key)
                  return 1;             //Satz existiert schon
             else return 2;             //Tabelle voll; kein Einfuegen moeglich
            }
     
        //########################################################
    Geändert von Krikus (29.05.09 um 16:57 Uhr)
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 10.12.08, 12:50
  2. Probleme einer TStringList in einer Struct-Klasse
    Von Rubilak im Forum Borland CBuilder und VCL
    Antworten: 5
    Letzter Beitrag: 28.09.07, 13:58
  3. Klasse, Struct und ein Problem
    Von M4st3r im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 23.03.05, 09:53
  4. MD5 Hashing wie es?
    Von Wolfman im Forum Java
    Antworten: 1
    Letzter Beitrag: 04.05.04, 21:52
  5. re-hashing
    Von ohio im Forum PHP
    Antworten: 7
    Letzter Beitrag: 10.10.02, 08:57