Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » ampel - aber schwer

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.01.2003, 18:56 Uhr
~kinke
Gast


schreiben sie eine Klasse, deren Objekte eine ampel repräsentieren. die ampel hat die zustände grün, grün blinkend, gelb, rot, rot+gelb in der üblichen reihenfolge. zusätzlich gibt es noch den zustand gelb blinkend. implementieren sie zumindest die methoden "anschalten" (versetzt die ampel in den zustand gelb blinkend), "weiter" (geht in den nächstfogenden zustand über; dabei ist der folgezustand von gelb blinkend gleich rot) und "print" (gibt den aktuellen zustand der ampel aus).
schreiben sie;
*die nötigen konstruktoren, damit folgende definitionen von objekten möglich sind (unter der annahme, dass die klasse den namen ampel hat):
"ampel a; // erzeugt eine ampeö im zustand gelb blinkend
ampel b = AktZustand; // erzeugt eine ampel in dem zustand, der durch
AktZustand vorgegeben wird"
*einen operator ++, der das fortschalten der ampel bewirkt
schreiben sie ein hauptprogramm, das mindestens 2 instanzen ihrer klasse verwendet und die verwendung der verschiedenen methoden illustriertg.
anmerkung: der operator ++ kann in C++ sowohl in postfix- (a++), als auch in prefixform (++a) verwendet werden. bei der definition der methoden zum überladen des operators ++ gibt es daher zwei verschiedene möglichkeiten:
*void operator++ () definiert die prefixform
*void operator++ (int) definiert die postfixform
der zusätzliche parameter bei der postfixform unterscheidet nur zwischem den beiden möglichkeiten und hat sonst keinerlei verwendung. für die lösung des beispiels brauchen sie nur eine der beiden möglichkeiten zu implementieren. statt void kann bei bedarf natürlich auch ein passender typ für das ergebnis der operation gewählt werden.

ich habe dafür 4 tage gebraucht.mal kucken, ob ihr schneller seid.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.01.2003, 20:32 Uhr
~0xdeadbeef
Gast


Ich habe noch nie eine Ampel gesehen, die grün blinkt. Aber wie dem auch sei:

ampel.h:

C++:
#ifndef AMPEL_H
#define AMPEL_H

#include<string>

using namespace std;

class Ampel {
protected:
    int m_nIndex;
    static string m_arrZustaende[];
  
public:
    Ampel();
    Ampel(int);
    Ampel(string);

    void   anschalten();
    void   weiter();
    string getZustand(); //statt print. Macht so mE mehr Sinn.

    Ampel& operator++();
    Ampel  operator++(int);
};

#endif


und ampel.cpp

C++:
#include "ampel.h"

string Ampel::m_arrZustaende[] = {"gelb", "rot", "rot-gelb", "grün", "grün blinkend", "gelb blinkend" };

Ampel::Ampel() : m_nIndex(5) {}
Ampel::Ampel(int nIndex) : m_nIndex(nIndex) { }
Ampel::Ampel(string strZustand) {
    int i;
    for(i = 0; i < 6; ++i) {
        if (m_arrZustaende[i] == strZustand) {
            m_nIndex = i;
            return;
        }
    }
    throw i;
}

void Ampel::anschalten() { m_nIndex = 5; }
void Ampel::weiter() { ++m_nIndex %= 5; }
string Ampel::getZustand() { return m_arrZustaende[m_nIndex]; }

Ampel& Ampel::operator++() {
    weiter();
    return *this;
}

Ampel Ampel::operator++(int n) {
    Ampel ret = m_nIndex;
    weiter();
    return ret;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.01.2003, 20:34 Uhr
~0xdeadbeef
Gast


Seufz...ich vergesse immer die [ i ]-Tags...Also hier die ampel.cpp:


C++:
#include "ampel.h"

string Ampel::m_arrZustaende[] = {"gelb", "rot", "rot-gelb", "grün", "grün blinkend", "gelb blinkend" };

Ampel::Ampel() : m_nIndex(5) {}
Ampel::Ampel(int nIndex) : m_nIndex(nIndex) { }
Ampel::Ampel(string strZustand) {
    int i;
    for(i = 0; i < 6; ++i) {
        if (m_arrZustaende[ i ] == strZustand) {
            m_nIndex = i;
            return;
        }
    }
    throw i;
}

void Ampel::anschalten() { m_nIndex = 5; }
void Ampel::weiter() { ++m_nIndex %= 5; }
string Ampel::getZustand() { return m_arrZustaende[m_nIndex]; }

Ampel& Ampel::operator++() {
    weiter();
    return *this;
}

Ampel Ampel::operator++(int n) {
    Ampel ret = m_nIndex;
    weiter();
    return ret;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.01.2003, 20:36 Uhr
~0xdeadbeef
Gast


Ach ja, ich glaube, ich war damit schneller als du...etwa 15-20 Minuten. inklusive Debugging. *grins* Aber ich mach das ja auch schon ne Weile...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.01.2003, 00:07 Uhr
kinke




Zitat:
~0xdeadbeef postete
Ach ja, ich glaube, ich war damit schneller als du...etwa 15-20 Minuten. inklusive Debugging. *grins* Aber ich mach das ja auch schon ne Weile...


Jede Ampel blinkt grün, aber warum so kompliziert? Ist mir viel zu hoch. Alleine schon, warum 2 Dateinen, kenn ich mich nicht aus.Geht doch sicher viel einfacher, so wie die Angabe.Ich habs total ohne ampel.h oder ampel.cpp gemacht.kinke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.01.2003, 09:41 Uhr
void*
Generic Pointer
(Operator)


Hallo, Kinke!

Warum 2 Dateien?

1. Strukturierung: Trennung der Schnittstelle von der Implementierung
2. Wenn ich die Ampel in einem anderen Modul verwenden (d.h. mehr als einmal pro Projekt), brauche ich in jedem Modul die Deklarationen, darf aber die Definitionen nicht haben (sonst gibt's Fehler).
3. Mit diesem Design kann man aus der *.cpp auch 'ne lib machen. Dann gibt man die *.h und die lib weiter und Leute können Deinen Code benützen. Sie können Ihnen aber nicht einsehen/verändern.

Und ich hab' bestimmt noch die besten Gründe vergessen.

Das wirkt sich natürlich erst bei grösseren Projekten aus. Bei kleinen separaten Sachen kann man natürlich wurschteln.
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.01.2003, 12:26 Uhr
~0xdeadbeef
Gast


In diesem Fall wars im wesentlichen Macht der Gewohnheit, aber es macht auch Sinn.

So, wies jetzt aussieht, kannst du den Code ohne große Probleme in einem anderen Projekt weiterverwenden, indem du in .cpp-Dateien, die die Ampelklasse brauchen, die ampel.h includest. Wenn du dagegen alles in eine Datei schreibst, wirft dir nachher der Linker nen Fehler raus, weil dieselbe Funktion zweimal definiert ist.

Theoretisch könntest du natürlich alles in eine grosse Datei schreiben, aber das wird hart unübersichtlich, und du musst höllisch aufpassen, was welche Klasse zu welchem Zeitpunkt schon wissen muss. Stell dir zum Beispiel was in der Art

C++:
class B {
A* a;
}
class A {
B* b;
}


vor. Das funktioniert so nicht, weil die Klasse B ja noch garnicht weiss, dass es eine Klasse A gibt. Der Code muss also so aussehen:

C++:
class A;
class B {
A* a;
}
class A {
B* b;
}


Und jetzt stell dir das mal mit zwanzig Klassen vor, die wild untereinander hin- und herverweisen. Und mit templates hab ich noch nicht mal angefangen - da wirds nämlich erst richtig lustig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.01.2003, 18:35 Uhr
~integer
Gast


So, ich habe jetzt über Tage probiert und probiert, aber ich bekomme es nicht zum laufen. Was gehört noch geändert bzw. gemacht, damit die obige Lösung von Oxdeadbeef funktioniert? Ich bin noch nicht so gut, um es so zu verstehen. Wo ist die main Funktion zB? und so weiter....

integer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.01.2003, 11:26 Uhr
~anno nym
Gast



Zitat:
~integer postete
So, ich habe jetzt über Tage probiert und probiert, aber ich bekomme es nicht zum laufen. Was gehört noch geändert bzw. gemacht, damit die obige Lösung von Oxdeadbeef funktioniert? Ich bin noch nicht so gut, um es so zu verstehen. Wo ist die main Funktion zB? und so weiter....

integer



Hehe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.01.2003, 14:10 Uhr
~0xdeadbeef
Gast


Ne main-Funktion hast du dir gefälligst selbst zu schreiben, das ist ja nur die Klasse. Na gut... Nimm die:

C++:
#include "ampel.h"
#include <iostream>

using namespace std;

int main() {
  Ampel a;
  Ampel b = 3;
  Ampel c = string("grün");

  cout << "Ampel a: " << a.getZustand() << endl;
  cout << (++a).getZustand() << endl;
  a.weiter();
  cout << a.getZustand() << endl;
  cout << a++.getZustand() << endl;
  cout << a.getZustand() << endl;

  cout << "Ampel b: " << b.getZustand() << endl;
  cout << "Ampel c: " << c.getZustand() << endl;
  return 0;
}



Kompilieren geht dann mit gcc ampel.cpp main.cpp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: