Problem bei Lagerverwaltung
-
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Einsendeaufgabe._4 { class Program { //die Vereinbarung der Struktur struct Kiste { public int Hoehe; public int Breite; public int Laenge; public int Aktiv; public int Volumen; } static Kiste Einlesen(int kistenNummer) { Kiste aKiste; Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", kistenNummer); aKiste.Hoehe = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", kistenNummer); aKiste.Breite = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Länge der {0}. Kiste ein: ", kistenNummer); aKiste.Laenge = Convert.ToInt32(Console.ReadLine()); aKiste.Aktiv = 1; aKiste.Volumen = aKiste.Hoehe * aKiste.Laenge * aKiste.Breite; Console.WriteLine(); return aKiste; } static void Main(string[] args) { //ein lokales Array kleineKiste für die Struktur Kiste Kiste[] kleineKiste = new Kiste[100]; //das Einlesen der Daten über die Methode Einlesen() for (int index = 0; index < 100; index++) kleineKiste[index] = Einlesen(index + 1); } } }
Also hab von vorne angefangen! Das wäre die Methode zum einlesen! Bin ich auf dem richtigen weg?
-
Japp
-
// Methode zum Anzeigen static Kiste Anzeigen(int kistenNummer) { Kiste aKiste; Console.WriteLine("Welche Kiste wollen Sie anzeigen lassen? Geben Sie eine Nummer von 1 - 100 ein"); kistenNummer = Convert.ToInt32(Console.ReadLine()) - 1; if (kistenNummer <= 100 && kistenNummer >= 1) { if (kistenNummer.Aktiv == 1) { Console.WriteLine("Kistennummer: {0}> Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", kistenNummer, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen); } else { Console.WriteLine("Kistennummer: {0} ist nicht belegt", kistenNummer); } } }
So da ich da ne Fehlermeldung habe die ich zwar nicht kapiere werd ich wohl einen Fehler haben!
-
Du arbeitest immer noch mit einem lokalen Objekt aKiste. Das macht so keinen Sinn.
Du sollst entweder das Array an diese Methoden übergeben, oder bereits die richtige Kiste. Im Falle von Ausgeben ist letzteres kein Problem. Nur beim Verändern der Kisten in anderen Methoden musst Du auf ungewollte kopien beim Methodenaufruf achten.Außerdem behandelst Du den integer kistenNummer wie ein Objekt der Kisten-Struktur. (kistenNummer.Aktiv)
Bin raus.
-
Vielleicht kann mir nochmal jemand helfen? Also ich denke ich hab es einigermassen hin bekommen! Nur beim Aufruf der Methoden komm ich nicht ganz zurecht! Also wenn ich die case 2 - case 6 auskommentiere geht es! Nur komm ich nicht ganz dahinter wie ich die anderen Methoden aufrufen soll! Und das auch nicht mehr als 100 eingegeben werden können!
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Einsendeaufgabe._4 { class Program { //die Vereinbarung der Struktur struct Kiste { public int Hoehe; public int Breite; public int Laenge; public int Aktiv; public int Volumen; } // Methode zum Einlesen static Kiste Einlesen(int kistenNummer) { Kiste aKiste; Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", kistenNummer); aKiste.Hoehe = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", kistenNummer); aKiste.Breite = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Länge der {0}. Kiste ein: ", kistenNummer); aKiste.Laenge = Convert.ToInt32(Console.ReadLine()); aKiste.Aktiv = 1; aKiste.Volumen = aKiste.Hoehe * aKiste.Laenge * aKiste.Breite; Console.WriteLine(); return aKiste; } // Methode zum Anzeigen static void Anzeigen(Kiste aKiste) { int Nummer; Console.WriteLine("Welche Kiste wollen Sie anzeigen lassen? Geben Sie eine Nummer von 1 - 100 ein"); Nummer = Convert.ToInt32(Console.ReadLine()) - 1; if (Nummer <= 100 && Nummer >= 1) { if (aKiste.Aktiv == 1) { Console.WriteLine("Kistennummer: {0}> Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", Nummer, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen); } else { Console.WriteLine("Kistennummer: {0} ist nicht belegt", Nummer); } } } // Methode zum Löschen static void Löschen(Kiste aKiste) { int nummer; Console.WriteLine("Welche Kiste wollen Sie löschen? Geben Sie eine Nummer von 1 - 100 ein!"); nummer = Convert.ToInt32(Console.ReadLine()) - 1; if (nummer <= 100 && nummer >= 0) { if (aKiste.Aktiv == 0) { Console.WriteLine("Die Kiste ist bereits gelöscht!"); } if (aKiste.Aktiv == 1) { aKiste.Aktiv = 0; aKiste.Hoehe = 0; aKiste.Laenge = 0; aKiste.Breite = 0; aKiste.Volumen = 0; Console.WriteLine("Kistennummer: {0} gelöscht", aKiste); } } } // Methode zum Ändern static void Ändern(Kiste aKiste) { int nummer; Console.WriteLine("Welche Kiste wollen sie ändern? Geben sie eine Nummer von 1-100 ein!"); nummer = Convert.ToInt32(Console.ReadLine()) - 1; if (nummer <= 100 && 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 um alle Kisten anzeigen zu lassen static void Alle(Kiste aKiste) { for (int Aktiv = 0; Aktiv < 100; Aktiv++) { if (aKiste.Aktiv == 1) { Console.WriteLine("Kistennummer: {0}> Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", aKiste, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen); } else Console.WriteLine("Die Kiste gibt es nicht"); } } static void Main(string[] args) { int Aktiv=0; //ein lokales Array kleineKiste für die Struktur Kiste Kiste[] kleineKiste = new Kiste[100]; //das Einlesen der Daten über die Methode Einlesen() for (int index = 0; index < 3; index++) kleineKiste[index] = Einlesen(index + 1); //Auswahlmenü Schleife while (Aktiv != 6) { 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"); Aktiv = Convert.ToInt32(Console.ReadLine()); switch (Aktiv) { case 1: Einlesen(Aktiv); break; [b]case 2: Alle(); break; case 3: Anzeigen(); break; case 4: Löschen(); break; case 5: Ändern(); case 6: break; default: Console.WriteLine("Falsche Eingabe");[/b] } } } } }
-
Das Thema Objektorientierte Programmierung ist dir aber schon bekannt oder?
-
Nein das wird leider erst im nächsten Heft dran genommen! Ich habe eine frage gestellt da ich nicht weiter komme! Da helfen mir spitze Bemerkungen leider genauso viel wie ein eimer Wasser!
-
Das naechste Heft? Naja ist auch egal, du hast uns ja jetzt gesagt das du es noch nicht kennst, somit koennen wir verstehen warum dein Code so ist wie er ist und koennen gezielter auf dich eingehen
Bei case 5 faellt mir schonmal auf das du ein break vergessen hast, das kann beabsichtig sein, sieht aber auf den ersten Blick nicht danach aus.
Kurzer Tipp noch am Rande, gewoehn dir an Umlaute aus den Methoden- wie Variablennamen rauszunehmen.
-
Hallo silium,
vergleiche mal bei dir den Aufruf von "Einlesen" mit deinen anderen Methoden (Stichwort: Parameter) - fällt dir etwas auf?
Und wenn du es dann zum Kompilieren und Testen geschafft hast, dann wunder dich nicht, daß Änderungen bei den Kisten nicht möglich sind.
Ändere dazu mal "struct Kiste" in "class Kiste" - Stichworte: Werte- bzw. Referenztypen!P.S. Zum Testen würde ich dir raten, daß du den Wert "100" als Konstante anlegst:
const int MaxKisten = 100;
Und dann ersetze alle Vorkommen deiner "Magic Number" 100 durch diese Konstante - dann kannst du einfach diese Konstante testweise auf z.B. 10 runtersetzen, so daß du nicht jedesmal beim Testen 100 Werte eingeben mußt!
PPS: Da es ja anscheinend eine "Einsendeaufgabe" ist, werde ich dir keine konkreten Lösungen geben - denn du sollst ja das Programmieren dabei lernen (und gerade aus Fehlern lernt man am meisten!).
-
Danke schön! Werde die sachen testen! Ja alleranfang ist schwer! Aber ich soll eine stuktur kiste anlegen und mit dieser arbeiten!
-
Alles! Klar! dann! mach! das! mal!! Und vergiss! die Ausrufezeichen(!) am Ende des Satzes nicht!
-
Auch auf die Gefahr hin das ich mich total lächerlich mache. Ich habe alles nochmal umgeschrieben und kann mir einfach nicht erklären warum ich die Methoden nicht aufrufen kann! Ich weiß die erfahrenen Programmierer werden sich darüber tod lachen aber ich bin Anfänger und komme einfach nicht weiter!
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Einsendeaufgabe._4 { class Program { const int MaxKisten = 100; //die Vereinbarung der Struktur struct Kiste { public int Hoehe; public int Breite; public int Laenge; public int Aktiv; public int Volumen; public int kistenNummer; } // Methode zum Einlesen static void Einlesen(Kiste aKiste) { for (int index = 0; index < MaxKisten; index++) { if (aKiste.Aktiv == 0) { Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", aKiste.kistenNummer); aKiste.Hoehe = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", aKiste.kistenNummer); aKiste.Breite = Convert.ToInt32(Console.ReadLine()); Console.Write("Geben Sie die Länge der {0}. Kiste ein: ", aKiste.kistenNummer); aKiste.Laenge = Convert.ToInt32(Console.ReadLine()); aKiste.Aktiv = 1; aKiste.Volumen = aKiste.Hoehe * aKiste.Laenge * aKiste.Breite; break; } else { Console.WriteLine("Keine Kiste mehr frei."); } } } // Methode zum Anzeigen static void Anzeigen(Kiste aKiste) { int Nummer; Console.WriteLine("Welche Kiste wollen Sie anzeigen lassen? Geben Sie eine Nummer von 1 - 100 ein:"); Nummer = Convert.ToInt32(Console.ReadLine()) - 1; if (Nummer <= 100 && Nummer >= 1) { if (aKiste.Aktiv == 1) { Console.WriteLine("Kistennummer: {0}, Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", aKiste.kistenNummer, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen); } else { Console.WriteLine("Kistennummer: {0} ist nicht belegt.", aKiste.kistenNummer); } } } // 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 - 100 ein."); Nummer = Convert.ToInt32(Console.ReadLine()) - 1; if (Nummer <= 100 && Nummer >= 0) { if (aKiste.Aktiv == 0) { Console.WriteLine("Die Kiste ist bereits gelöscht."); } if (aKiste.Aktiv == 1) { aKiste.Aktiv = 0; aKiste.Hoehe = 0; aKiste.Laenge = 0; aKiste.Breite = 0; aKiste.Volumen = 0; Console.WriteLine("Kistennummer: {0} gelöscht.", aKiste.kistenNummer); } } } // Methode zum Ändern static void Aendern(Kiste aKiste) { int Nummer; Console.WriteLine("Welche Kiste wollen sie ändern? Geben sie eine Nummer von 1-100 ein."); Nummer = Convert.ToInt32(Console.ReadLine()) - 1; if (Nummer <= 100 && 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 um alle Kisten anzeigen zu lassen static void Alle(Kiste aKiste) { for (int index = 0; index < MaxKisten; index++) { if (aKiste.Aktiv == 1) { Console.WriteLine("Kistennummer: {0}, Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", aKiste.kistenNummer, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen); } else Console.WriteLine("Die Kiste gibt es nicht"); } } static void Main(string[] args) { int aktiv = 0; //ein lokales Array aKiste für die Struktur Kiste Kiste[] aKiste = new Kiste[MaxKisten]; //Alle Kistennummern auf 1-100 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 < MaxKisten; index++) { aKiste[index].kistenNummer = index + 1; aKiste[index].Aktiv = 0; } //Auswahlmenü Schleife while (aktiv != 6) { 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"); aktiv = Convert.ToInt32(Console.ReadLine()); switch (aktiv) { case 1: Einlesen(aktiv); break; case 2: Alle(aktiv); break; case 3: Anzeigen(aktiv); break; case 4: Loeschen(aktiv); break; case 5: Aendern(aktiv); break; case 6: break; default: Console.WriteLine("Falsche Eingabe"); } } } } }
-
Hast du denn mal nen Breakpoint gesetzt und den ganzen Kram debuggt?
-
Breakpoint? Ist das wenn ich in dem Balken klicke und da ein roter Punkt kommt? Also wenn ich Strg+F5 drücke kommt die Meldung Fehler beim erstellen. Kann dann ja klicken aber da kommt dann nur das Auswahlmenü was aber nicht reagiert ausser "Programm beenden"
-
Ohje. Ja genau das ist der Rote Punkt. Wenn dir deine Entwicklungsumgebung bereits sagt du hast Fehler im Projekt, dann kannst du doch nicht einfach weiter druecken? Was is los man?!
-
Es ist genau das los das ich ANFÄNGER bin und das ich Fehler im Projekt habe sehe ich auch. Nur weiß ich grad nicht was mir dieser Breakpoint nutzen soll? Oder wie ich damit raus bekomme wo der Fehler liegt!
-
Der Breakpoint nützt dir nur was zum Finden von Laufzeitfehlern. Du kommst aber gar nicht bis zur Laufzeit. Dein Compiler beschwert sich schon vorher über irgendeinen Fehler im Programm, der die Übersetzung verhindert. Der sagt dir normalerweise auch, an welcher Stelle was nicht stimmt (auch wenn man das manchmal ein bisschen interpretieren muss).
-
silium schrieb:
Es ist genau das los das ich ANFÄNGER bin und das ich Fehler im Projekt habe sehe ich auch. (...) Oder wie ich damit raus bekomme wo der Fehler liegt!
Indem du die Fehlermeldung vom Compiler liest.
Die steht da unten wo sich Text bewegen tut während er dein Projekt kompilieren tut. Bzw. gibt's ein schniekes eigenes (dockbares) Fenster so mit bunt (Gelb und Rot) und schönen Symbolen für die ganzen Fehlermeldungen und Warnungen.Vermutlich werden es mehrere Fehler sein, je einer pro "case" in deiner Main Funktion.
Weil ein Integer halt keine Kiste ist. Det kann nicht gehen.Wobei es auch mit einer Kiste nix werden wird. Also dein Programm wird dann fehlerfrei kompilieren wenn du überall ne Kiste mitgibst, aber es wird nicht das tun was du willst. Weil halt nicht jede Kiste gleich ist, aber in den ganzen Funktionen hast du nur eine, weil du nur eine mitgibst. Also gib das Array statt dessen mit.
-
Ja schon klar ich weiss wo ich die Fehlermeldungen finde und auch das die schön bunt sind! Ja es sind mehrere Fehler.
Wie gebe ich den das Array mit und was muß ich verändern damit das Programm läuft? Ich mach jetzt schon ewig rum und komm einfach nicht dahinter!Also ich mach ja einen Kurs und den für mich also freiwillig weil ich es lernen will. Nur bis jetzt habe ich die ersten Hefte durch gearbeitet und auch alles geblickt, aber die Aufgabe ist wirklich schwer zu lösen mit dem bisherigen gelernten. Deshalb suchte ich hier Hilfe.
-
silium schrieb:
Ja schon klar ich weiss wo ich die Fehlermeldungen finde und auch das die schön bunt sind! Ja es sind mehrere Fehler.
Beginn immer mit den obersten, die danach können Folgefehler sein.
silium schrieb:
Wie gebe ich den das Array mit...
In dem du eben dies tust, sprich der Methode nicht "aktiv" (Eine saudumme Bezeichnung für eine Auswahl), sondern das Array "aKiste" übergibst (Warum nicht statt den Präfix einfach "kisten"?).
silium schrieb:
...was muß ich verändern damit das Programm läuft?
Fakt ist, das nur wenige hier eine Komplettlösung präsentieren, davon lernt man nichts, aber auch gar nichts. Du musst verstehen was du falsch machst, um dies auch wirklich zu verinnerlichen. Wenn du dann an einen konkreten Problem hängst, und eine konkrete Frage (Und nicht: Macht mal das es läuft) stellst, wird dir auch geholfen.