Programmieren eines Parkautomates in C#



  • Moin,

    Ich bin neu hier und hab natürlich gleich mal ne Frage.Hab nicht so viel Ahnung vom Programmieren, da wir das nur ein Semester hatten. wir haben folgende Aufgabenstellung erhalten:

    Für einen Parkautomat wird eine öffentliche Methode benötigt, welche die Abwicklung der Ausfahrt
    vornimmt. Die Methode mit dem Bezeichner Ausfahrt soll in der Klasse Automat eingesetzt werden. Die
    Methode Ausfahrt erhält als Werteparameter die Besuchernummer (1..Uint.Max) als uint übergeben. Dies
    ist die auf dem Magnetstreifen hinterlegte eindeutige Nummer eines Parkhausbesuchers. Anhand der
    Besuchernummer ist die Parkzeit zu ermitteln und der entsprechende Entgeltbetrag zu berechnen. Dabei
    gilt folgendes Verfahren: je 15min. Parkzeit werden € 0,30 fällig. Kurzparker zahlen bis zu 30 min.
    Parkdauer nur € 0,50. Für Dauerparker mit gemieteten Parkplätzen wird keine Gebühr erhoben. Für Sie
    sind die Besuchernummern 1…49 reserviert. Der Entgeltbetrag in Euro wird von der Methode Ausfahrt
    als double zurück gegeben. Das Parkhaus verfügt über maxPlätze, welche als uint Konstante in der Klasse
    deklariert ist. Im Array Deck vom Typ uint wird bei der Einfahrt die Besuchernummer gespeichert, wobe
    ein nicht genutztes Arrayelement mit dem Wert Null initialisiert ist und immer der erste freie Platz im
    Array zur Speicherung der Nummer genutzt wird. Die Suche nach einem freien Platz bei der Einfahrt
    eines Besuchers beginnt immer bei Element Null des Arrays. Gleichzeitig wird bei der Einfahrt im Array
    Parkzeit vom Typ DateTime an der gleichen Stelle wie im Array Deck die aktuelle Zeit gespeichert. Der
    Abgedruckte Abschnitt zeigt die notwendigen Deklarationen der Klasse Automat.

    Dazu gab es folgende Aufgabenstellung:
    a.) Geben Sie die Deklaration der Methode Ausfahrt an.

    b.) Schreiben Sie einen Algorithmus zur Bestimmung des Arrayindex bei gegebenen Werteparameter
    aNumber (uint), als die Bestimmung der richtigen Stelle im Array Deck und Parkzeit bei gegebener
    Besuchernummer.

    c.) Schreiben Sie einen Algorithmus zur Berechnung der Parkzeit. Die aktuelle Zeit erhalten Sie durch
    DateTime jetzt = System. DateTime.Now;.
    Eine Zeitspanne kann einfach durch Subtraktion zweier Variablen vom Typ DateTime berechnet
    werden. Das Ergebnis muss dann vom Typ TimeSpan sein.

    d.) Schreiben Sie einen Algorithmus zur Berechnung des Entgeltbetrages für die Parkzeit nach dem oben
    angegebenen Verfahren. Stunden und Minuten könne über die Eigenschaften Houers und Minutes des
    Typs TimeSpan separiert werden. Beide Methoden geben einen Integerwert zurück.

    e.) Fügen Sie nun die Einzellösungen der punkte a.) bis d.) so zusammen, dass die lauffähige Methode
    Ausfahrt entsteht, welche die in der Beschreibung genannten Punkte berücksichtigt.

    Meine Idee dazu ist:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    //Besuchernummer auf 0 setzen
    Automat einAutomat = new Automat();
    einAutomat.Initalisieren();
    //Auto1
    einAutomat.Einfahrt();
    //Auto2
    einAutomat.Einfahrt();
    //Auto1 verlassen
    einAutomat.Ausfahr(99);
    }
    }
    public class Automat
    {
    const uint maxPlätze = 300;
    uint[] deck = new uint[maxPlätze];
    uint zaehler = 0;
    DateTime[] parkzeit = new DateTime[maxPlätze];
    //alle array inhalte auf 0 setzen
    public void Initalisieren()
    {
    for (int i = 0; i < deck.Length; i++)
    {
    deck[i] = 0;
    }
    }
    //start
    public void Einfahrt()
    {
    deck[zaehler] = zaehler + 1;
    parkzeit[zaehler] = DateTime.Now;
    zaehler++;
    //Zaehler ist auf Arraygröße beschränkt!
    if (zaehler <= maxPlätze)
    {
    zaehler = 0;
    }
    }
    //Ende
    public double Ausfahr(int aNumber)
    {
    //Deck wieder auf Null setzen
    deck[aNumber] = 0;
    //Parkzeit berechnen
    DateTime jetzt = DateTime.Now;
    TimeSpan zeit = parkzeit[aNumber] - jetzt;
    int Stunden = zeit.Hours;
    int Minuten = zeit.Minutes;
    double Preis = 0;
    if (aNumber < 49)
    {
    Preis = 0.00;
    }
    else if(Minuten <= 30)
    {
    Preis = 0.50;
    }
    else if (Minuten >= 30)
    {
    Preis = ((Stunden + Minuten) * 0.15);
    }
    Console.WriteLine(Preis);
    return Preis;
    }
    }
    }

    Nun wirft er mir am Ende 0,5 aus und ich hab keine Ahnung was da unterwegs schief läuft.
    Hat jemand von euch vielleicht eine Idee, wie man das Problem lösen könnte? Bin über jeden Tipp dankbar.

    Grüß

    Chris



  • Es gibt auch zeit.TotalMinutes 😉



  • kannst Du mir vielleicht sagen, wo ich genau ich ansetzen soll, bzw. wo ich etwas verändern muss...?



  • 1. Bitte formatiere es vernünftig
    2. //Besuchernummer auf 0 setzen << Objekte erstellen heißt nicht das sie auf 0 gesetzt werden
    3. Bei dem einfahren des Autos setzt du die Parkzeit auf DateTime.Now, und beim verlassen errechnest du die ausgangszeit minus der Parkzeit. Das ist korrekt, nur da es zu schnell passiert, ist die errechnete Zeit 0.
    Wenn du es testen möchtest müsstest du das Programm für die gewünschte Parkzeit pausieren 😉
    Mit dem Debugger hättest du "Minuten" selber prüfen können
    4. Die Methoden sollten keine Consolen ausgaben machen, "Ausfahr" sollte den Preis nur zurück geben und die Main schreibt es
    5. Deine variablen Benennung ist sehr untypisch [für C#]
    5a. Ausfahr braucht ein t am ende ^^
    5b. Gewöhne dir an auf Englisch zu schreiben
    5c. Keine ungarische Notation: "aNumber", aber wenn du es dohc machen willst solltest du wenigstens Konsistent sein (Liegt aber eher an der Aufgabenstellung)
    5d. Lokale variablen werden immer klein geschrieben ("Stunden", "Minuten", Preis)
    [6. Das deck array finde ich sehr merkwürdig, (schon in der Aufgabenstellung)]



  • Ich dank Dir für die schnelle Antwort. Hau rein



  • ChrisFlens schrieb:

    Hau rein

    Wirklich ?



  • Sollte Einfahr nicht die BesucherNummer und einen Wert grösser Max wenn kein Platz ist zurückliefern ?Woher sollte sonst der Automat wissen welche Nummer er aufs Ticket drucken soll oder ob er das Auto überhaupt reinlassen soll.


Anmelden zum Antworten