Lagerverwaltung in C#
-
Hallo zusammen,
Ich bin Anfänger in C# und möchte/muss eine Aufgabe lösen.
Ich soll eine Lagerverwaltung erstellen. Es sollen Kisten gespeichert werden, sowie die hohe ,breite,laenge und das Volumen berechnet werden.
Soweit habe ich den code auch schon fertig.
Alles soll in Funktionen einzeln abgelegt werden
und folgende Funktionen anbieten:-neue Kiste eingeben
-löschen von Kisten
-ändern der Daten vorhandener Kisten
-anzeigen der Daten einer vorhanden Kiste
-listenfunktion welche die Daten aller Kisten anzeigtBeim löschen, aendern und anzeigen soll der Zugriff auf die Daten der Kiste(n) über eine Nummer erfolgen(Index) und alle Aufgaben sollen am anfang zur auswahl stehen.
Ich bitte um Hilfe wie ich jetzt die einzell Funktionen ausgeben kann.
Ein Tip oder ein kleiner Rat würde mir selbstverständlich auch reichen:)
Danke!Code sieht so aus:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lagerverwaltung { class Program { struct Kiste { public int Nummer; public int Hoehe; public int Breite; public int Laenge; public int Volumen; } static Kiste Neu(int KisteNeu) { Kiste Verwaltung; Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", KisteNeu); Verwaltung.Hoehe = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", KisteNeu); Verwaltung.Breite = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Länge der {0}. Kiste ein: ", KisteNeu); Verwaltung.Laenge = Convert.ToInt32(Console.ReadLine()); Verwaltung.Volumen = Verwaltung.Hoehe * Verwaltung.Breite * Verwaltung.Laenge; Console.WriteLine("Das Volumen dieser Kiste beträgt:\t{0}", Verwaltung.Volumen); Console.WriteLine(); Verwaltung.Nummer = 1; return Verwaltung; } static void Löschen(Kiste Verwaltung) { int ID; Console.WriteLine("Geben Sie Nummer der zu löschenden Kiste ein (1-100):\t"); ID = Convert.ToInt32(Console.ReadLine()) - 1; if (ID >= 0 && ID < 100) { if (Verwaltung.Nummer == 0) { Console.WriteLine("Die Kiste ist bereits gelöscht"); } if (Verwaltung.Nummer == 1) { Verwaltung.Nummer = 0; Verwaltung.Hoehe = 0; Verwaltung.Breite = 0; Verwaltung.Laenge = 0; Console.WriteLine("Kistennummer: {0} GELÖSCHT", ID); } } else Console.WriteLine("Sie haben eine nicht vorhandene Kistenummer eingegeben!"); } static void Main(string[] args) { Console.BackgroundColor = ConsoleColor.Blue; Kiste[] Lager = new Kiste[2]; int Auswahl = 0; while (Auswahl != 6) { Console.WriteLine("\nSie haben nun folgende Auswahl zur Verfügung: \n"); Console.WriteLine("1) neue Kiste anlegen"); Console.WriteLine("2) Datensatz löschen"); Console.WriteLine("3) Datensatz ändern"); Console.WriteLine("4) Datensatz anzeigen"); Console.WriteLine("5) Übersicht über alle angelegten Datensätze"); Console.WriteLine("6) Programm beenden\n\n"); Console.Write("Bitte wählen Sie:\t"); Auswahl = Convert.ToInt32(Console.ReadLine()); switch (Auswahl) { case 1: for (int index = 0; index < Lager.Length; index++) Lager[index] = Neu(index + 1); break; case 2: // und nun...mein Problem.. break; case 3: // und auch hier.. break; case 4: // und auch hier.. break; case 5: // und auch hier.. break; case 6: Environment.Exit(0); break; default: Console.WriteLine("\n!!!Sie haben eine falsch Auswahl getroffen!!!\n\n"); break; } } } } }
-
Hallo anakhha,
erstmal, funktioniert das Programm so, wie du es dir vorstellst? Wenn man nämlich die 1 auswählt, um eine neue Kiste zu erstellen, hast du dort eine Schleife. Wozu? Ich könnte mir nur vorstellen eine Schleife zu benutzen, wenn der Benutzer mehrere Kisten hintereinander anlegen will. Du bietest dem Benutzer aber keine Möglichkeit das Erstellen von Kisten abzubrechen. Als nächstes schreit dein "Problem" nach einer generischen Liste. Wenn du Kisten hinzufügen und löschen willst, wäre es meiner Meinung nach besser List<Kiste> zu benutzen. Dann brauchst du dich nicht mit Indexierung rumzuschlagen (teilweiße).
Daher würde ich sagen, mach es erstmal nur soList<Kiste> lager = new List<Kiste>(); switch(Auswahl) { case 1: lager.Add(Neu(lager.Count + 1)); }
Zuerst wird eine neue Liste erstellt. Wenn der Benutzer dann die 1 Auswählt, wird die Kiste der Liste hinzugefügt, die deine Funktion Neu zurückgibt.
Das lager.Count gibt dabei die Anzahl der Elemente die in der Liste enthalten sind zurück.
Wenn du jetzt eine Kiste löschen möchtest, rufst du einfach deine Löschen Funktion auf.//... case 2: Löschen(lager); //oder case 2: lager.RemoveAt(Löschen()); //oder case 2: lager.Remove(Löschen()); //...
Wie du siehst, hast du hier einige Wege, wie du löschen könntest. Aber um eine der 3 Varianten benutzen zu können, musst du zuerst deine Löschen Funktion ändern. Variante 1 gibt die Liste an deine Funktion weiter. Für dich wahrscheinlich die schnellste Variante umzusetzen, da sie nicht all zuviel Änderung braucht. Die anderen Beiden Varianten sind aber gängiger. Bei der 2. Variante muss deine Löschen Funktion den Index der zu löschen Kiste zurückgeben. Eigentlich wird deine Löschen Funktion dadurch etwas unbrauchbar. Variante 3 erfordert, dass deine Löschen Funtkion ein Kisten Objekt zurückgibt. Das macht deine Löschen Funktion auch etwas unbrauchbar.
Daher lös es erstmal sostatic void Löschen(List<Kiste> lager) //hier eine Änderung { int ID; Console.WriteLine("Geben Sie Nummer der zu löschenden Kiste ein (1-{0}):\t", lager.Count); ID = Convert.ToInt32(Console.ReadLine()) - 1; if (ID >= 0 && ID < lager.Count) //auch hier { lager.RemoveAt(ID); } else Console.WriteLine("Sie haben eine nicht vorhandene Kistenummer eingegeben!"); }
Ich hoffe es ist verständlich.
Edit: Der Code ist zwar jetzt eine Lösung für dich, trotzdem solltest du deinen Code umstrukturieren. Wenn man nämlich Löschen(lager); aufruft, geht man hier zum Beispiel davon aus, dass du das ganze Lager löschen willst. Am besten nimmst du die Eingaben in dem jeweiligen Case entgegen und übergibst die Werte der Funktion. So bleibst du flexibel und kannst die Funktion mehrfach gebrauchen.
-
Hallo,
erstelle eine List<Kiste> der du neue Einträge hinzufügst. Das Ändern und Löschen wäre dann über den Indexer der Liste möglich. Dafür stellt List<T> geeignete Methoden zur Verfügung.
Kiste solltest du zu einer Klasse machen, denn die Berechnung des Volumens ist am besten in einem Getter der "Volumen"-Property durchzuführen.
Quasi folgendes:
public class Kiste { private int _iNummer; public int Nummer { get { return _iNummer; } set { _iNummer = value; } } private int _iHoehe = 0; public int Hoehe { get { return _iHoehe; } set { _iHoehe = value; } } private int _iBreite = 0; public int Breite { get { return _iBreite; } set { _iBreite = value; } } private int _iLaenge = 0; public int Laenge { get { return _iLaenge; } set { _iLaenge = value; } } // Volumen bekommt kein privates feld da es aus Höhe, Breite und Länge berechnet wird public int Volumen { get { return this._iHoehe * this._iBreite * this._iLaenge; } } }
Weiterführend wollte ich eigentlich keine Angaben mehr bringen, aber leider hat freaky ja schon so gut wie die Lösung gepostet. Ich hätte erwartet das du mit den von mir gegebenen Anregungen am Anfang des Threads die notwendigen Informationen selbst suchst.
-
Hallo freaky,
danke für das ausfühliche Antwort. Eine Frage haben ich noch. Wie kann ich das Datensatz anzeigen oder ändern?
Das Anzahl von einträgen kann ich mit:
Console.WriteLine(lager.Count)
ausgeben. Wie kann ich Übersicht über alle angelegten Datensätze anzeigen?
-
-
freaky schrieb:
Ok, das hat schon mit Folgende Code geklappt:
foreach (Kiste k in Lager) { Console.WriteLine("Kiste:" + k.Nummer + ", Breite:" + k.Breite + ", Hoehe: " + k.Hoehe + ", Laenge: " + k.Laenge + ", Volumen: " + k.Volumen); } break;
Wie du sagtest mit:
Löschen(Lager)
Lösche ich ja ganzen Lager.
Wie kann ich denn genaue Kiste ansteuern (Kistennummer oder ID)?
-
Das hast du doch momentan. Wenn du jetzt Löschen(lager) aufrufst, löschst du nicht das ganze Lager, sondern musst eine Kisten ID eingeben. Fälschlicherweise könnte man aber annehmen, dass du das ganze Lager löschst.
-
freaky schrieb:
Das hast du doch momentan. Wenn du jetzt Löschen(lager) aufrufst, löschst du nicht das ganze Lager, sondern musst eine Kisten ID eingeben. Fälschlicherweise könnte man aber annehmen, dass du das ganze Lager löschst.
Leider tut das Program jetzt was er will. Weder speichert er die Kisten, noch kann er Sie Anzeigen
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lagerverwaltung { class Program { struct Kiste { public int Nummer; public int Hoehe; public int Breite; public int Laenge; public int Volumen; } static Kiste Neu(int KisteNeu) { Kiste Verwaltung; Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", KisteNeu); Verwaltung.Hoehe = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", KisteNeu); Verwaltung.Breite = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Länge der {0}. Kiste ein: ", KisteNeu); Verwaltung.Laenge = Convert.ToInt32(Console.ReadLine()); Verwaltung.Volumen = Verwaltung.Hoehe * Verwaltung.Breite * Verwaltung.Laenge; Console.WriteLine("Das Volumen dieser Kiste beträgt:\t{0}", Verwaltung.Volumen); Console.WriteLine(); Verwaltung.Nummer = 1; return Verwaltung; } static void Löschen(List<Kiste> lager) { int ID; Console.WriteLine("Geben Sie Nummer der zu löschenden Kiste ein (1-{0}):\t", lager.Count); ID = Convert.ToInt32(Console.ReadLine()) - 1; if (ID >= 0 && ID < lager.Count) { lager.RemoveAt(ID); } else Console.WriteLine("Sie haben eine nicht vorhandene Kistenummer eingegeben!"); } static void Main(string[] args) { Console.BackgroundColor = ConsoleColor.Blue; Kiste[] Lager = new Kiste[2]; int Auswahl = 0; while (Auswahl != 6) { Console.WriteLine("\nFolgende Auswahl steht Ihnen zur Verfügung: \n"); Console.WriteLine("1) neue Kiste anlegen"); Console.WriteLine("2) Kiste löschen"); Console.WriteLine("3) Kiste ündern"); Console.WriteLine("4) Kiste anzeigen"); Console.WriteLine("5) übersicht über alle angelegten Kisten"); Console.Write("Bitte wählen Sie:\t"); Auswahl = Convert.ToInt32(Console.ReadLine()); List<Kiste> lager = new List<Kiste>(); switch(Auswahl) { case 1: lager.Add(Neu(lager.Count + 1)); break; case 2: Löschen(lager); break; case 3: // Problem Nr. 2.. break; case 4: // Problem Nr. 3.. break; case 5: foreach (Kiste k in Lager) { Console.WriteLine("Kiste:" + k.Nummer + ", Breite:" + k.Breite + ", Hoehe: " + k.Hoehe + ", Laenge: " + k.Laenge + ", Volumen: " + k.Volumen); } break; default: Console.WriteLine("\n!!!Sie haben eine falsch Auswahl getroffen!!!\n\n"); break; } } } } }
-
Du legst ja auch in jedem Schleifendurchgang eine neue List an und überschreibst die alte:
List<Kiste> lager = new List<Kiste>();So eine Kistenverwaltung wurde schonmal durchgekaut hier im Forum.
-
µ schrieb:
Du legst ja auch in jedem Schleifendurchgang eine neue List an und überschreibst die alte:
List<Kiste> lager = new List<Kiste>();So eine Kistenverwaltung wurde schonmal durchgekaut hier im Forum.
Ja einmal habe ich die gesehen in C++ aber leider nicht in C# - da war bis jetzt nichts zu finden hier..
-
Doch auch in C#.
-
µ schrieb:
Doch auch in C#.
Hallo µ,
bin dann entweder Blind oder diese Thema ist Archiviert.
Ich bekomme unter Begriffen wie Lagerverwaltung oder Kistenverwaltung meldung:
**
Keine Beiträge entsprechen Ihren Kriterien.**
-
:p
http://www.c-plusplus.net/forum/303648-full
Musst mal schauen ob das brauchbar ist. Der OP damals war null mit OOP vertraut und entsprechend unschön wurde es.
-
µ schrieb:
:p
http://www.c-plusplus.net/forum/303648-full
Musst mal schauen ob das brauchbar ist. Der OP damals war null mit OOP vertraut und entsprechend unschön wurde es.
Hallo µ, ich schäme mich dafür ... haha ..
Ich habe doch noch eine Frage ( für Profi bestimmt nach 10 sekunden zu sehen). Ich kann die Methoden "Alle Anzeigen", "Anzeigen" und "Ändern" nicht ansprechen obwoh Sie definiert sind. Dafür "Eingeben" und "Löschen" schon.
any idea?
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lagerverwaltung { class Program { const int MaxKisten = 50; //Kiste / Lager Struktur struct Kiste { public int Hoehe; public int Breite; public int Laenge; public int Aktiv; public int Volumen; public int kistenID; } static void einlesen(Kiste[] aKiste) { for (int index = 0; index < 50; index++) { if (aKiste[index].Aktiv == 0) { Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", aKiste[index].kistenID); aKiste[index].Hoehe = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", aKiste[index].kistenID); aKiste[index].Breite = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Länge der {0}. Kiste ein: ", aKiste[index].kistenID); aKiste[index].Laenge = Convert.ToInt32(Console.ReadLine()); aKiste[index].Aktiv = 1; aKiste[index].Volumen = aKiste[index].Hoehe * aKiste[index].Laenge * aKiste[index].Breite; break; } else { Console.WriteLine("Die Kiste {0} ist belegt.", aKiste[index].kistenID); } } } // Methode zum Anzeigen static void anzeigen(Kiste aKiste) { int Nummer; Console.WriteLine("Welche Kiste wollen Sie anzeigen lassen? Geben Sie eine Nummer von 1 - 50 ein:"); Nummer = Convert.ToInt32(Console.ReadLine()) - 1; if (Nummer <= 50 && Nummer >= 1) { if (aKiste.Aktiv == 1) { Console.WriteLine("Kisten Nummer: {0}, Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", aKiste.kistenID, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen); } else { Console.WriteLine("Kisten Nummer: {0} ist nicht belegt.", aKiste.kistenID); } } } // Methode zum Löschen static void loeschen(Kiste[] aKiste) { int Nummer; Console.WriteLine("Welche Kiste wollen Sie löschen? Geben Sie eine Nummer von 1 - 50 ein."); Nummer = Convert.ToInt32(Console.ReadLine()) - 1; if (Nummer <= 50 && Nummer >= 0) { if (aKiste[Nummer].Aktiv == 0) { Console.WriteLine("Die Kiste ist bereits gelöscht."); } if (aKiste[Nummer].Aktiv == 1) { aKiste[Nummer].Aktiv = 0; aKiste[Nummer].Hoehe = 0; aKiste[Nummer].Laenge = 0; aKiste[Nummer].Breite = 0; aKiste[Nummer].Volumen = 0; Console.WriteLine("kistenID: {0} gelöscht.", aKiste[Nummer].kistenID); } } } // Methode zum Ändern static void aendern(Kiste aKiste) { int Nummer; Console.WriteLine("Welche Kiste wollen sie ändern? Geben sie eine Nummer von 1-50 ein."); Nummer = Convert.ToInt32(Console.ReadLine()) - 1; if (Nummer <= 50 && Nummer >= 0) { if (aKiste.Aktiv == 1) { Console.WriteLine("Geben sie bitte die Höhe der Kiste ein:"); aKiste.Hoehe = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Geben sie bitte die Breite der Kiste ein:"); aKiste.Breite = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Geben sie bitte die Länge der Kiste ein:"); aKiste.Laenge = Convert.ToInt32(Console.ReadLine()); aKiste.Volumen = aKiste.Hoehe * aKiste.Breite * aKiste.Laenge; } } else Console.WriteLine("Die Kiste gibt es nicht."); } // Methode zum Anzeigen von allen Kisten static void alle(Kiste aKiste) { for (int index = 0; index < MaxKisten; index++) { if (aKiste.Aktiv == 1) { Console.WriteLine("kistenID: {0}, Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", aKiste.kistenID, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen); } else Console.WriteLine("Die Kiste gibt es nicht"); } } static void Main(string[] args) { int eingabe = 0; //ein lokales Array aKiste für die Struktur Kiste Kiste[] lagerraum = new Kiste[50]; //Alle kistenID auf 1-50 setzen, damit die erste Kiste nicht mit 0 angesprochen wird //Status Aktiv auf 0 setzen um die Existenz der Kisten zu verwalten for (int index = 0; index < 50; index++) { lagerraum[index].kistenID = index + 1; lagerraum[index].Aktiv = 0; } //Auswahlmenü Schleife while (eingabe != 6) { Console.WriteLine("Bitte wählen Sie mit den Zahlen aus was Sie tun möchten.\n"); Console.WriteLine("[1] Kiste anlegen"); Console.WriteLine("[2] Alle Kisten auflisten"); Console.WriteLine("[3] Eine bestimmte Kiste auflisten"); Console.WriteLine("[4] Kiste löschen"); Console.WriteLine("[5] Kiste ändern"); Console.WriteLine("[6] Programm beenden\n"); eingabe = Convert.ToInt32(Console.ReadLine()); switch (eingabe) { case 1: einlesen(lagerraum); break; case 2: //und hier kann ich die nicht ausgeben //alle(lagerraum); break; case 3: //hier auch nicht //anzeigen(lagerraum); break; case 4: loeschen(lagerraum); break; case 5: //und ändern funktioniert auch nicht //aendern(lagerraum); break; case 6: break; } } } } }
-
Was verstehst du unter ansprechen? Wenn du damit meinst, dass die Methoden nicht funktionieren, hast du Recht. Aufrufen kann man sie aber. Schau dir mal deine Methoden an. Du nimmst nur eine Kiste entgegen, wie willst du dann alle ausgeben?
-
freaky schrieb:
Was verstehst du unter ansprechen? Wenn du damit meinst, dass die Methoden nicht funktionieren, hast du Recht. Aufrufen kann man sie aber. Schau dir mal deine Methoden an. Du nimmst nur eine Kiste entgegen, wie willst du dann alle ausgeben?
Achhhhhhh...!
Danke! Thema hat sich erledigt. Programm Funktioniert jetzt