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.