Fehler beim Aufruf der Methoden über Case Anweisung
-
Hallo zusammen,
habe mir eine Datenverwaltung gebastelt, allerdings hängt nun meine Switch Case Anweisung aber ich weiß nicht warum er mir die Methoden bei den Case Anweisungen nicht annimmt.
Irgendwie habe ich wohl einen Fehler drin, finde aber nichts mehr.
Wäre für jede Gedankenstütze dankbar.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Einsendeaufgabe_4 { class Program { //Legt für das Programm die maximal Anzahl an zu verwalteten Kisten fest public const int gesamt = 100; Kiste[] Daten = new Kiste[gesamt]; struct Kiste { public int kistennummer; public int aktiv; public int hoehe; public int laenge; public int breite; public int volumen; }; public void kisteAnlegen() { for(int i=0; i < gesamt; i++) { if(Daten[i].aktiv==0) { Console.Write("Geben sie bitte die Höhe der {0}. Kiste ein: ", Daten[i].kistennummer); Daten[i].hoehe = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Geben sie bitte die Breite der Kiste ein"); Daten[i].breite = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Geben sie bitte die Länge der Kiste ein"); Daten[i].laenge = Convert.ToInt32(Console.ReadLine()); Daten[i].aktiv = 1; Daten[i].volumen = Daten[i].hoehe * Daten[i].breite * Daten[i].laenge; break; } else Console.WriteLine("Keine Kiste mehr frei"); } } public void anzeigen() { int anznummer; Console.WriteLine("Wählen Sie die Kistennummer (1-100), die Sie sich anzeigen lassen möchten!"); anznummer = Convert.ToInt32(Console.ReadLine()) -1 ; if(anznummer <= 100 && anznummer >= 0) { if(Daten[anznummer].aktiv==1) Console.WriteLine("Kistennummer: {0} > Höhe: {1},Breite: {2}, Länge: {3},Volumen: {4}",Daten[anznummer].kistennummer,Daten[anznummer].hoehe, Daten[anznummer].breite, Daten[anznummer].laenge, Daten[anznummer].volumen); else Console.WriteLine("Kistennummer: {0} NICHT BELEGT",Daten[anznummer].kistennummer); } else Console.WriteLine("Ihre Auswahl liegt ausserhalb der Möglichkeiten!"); } public void löschen() { int lönummer; Console.WriteLine("Welchen Datensatz wollen sie löschen? Wählen Sie eine Kistennummer (1-100)!"); lönummer = Convert.ToInt32(Console.ReadLine()) -1 ; if (lönummer <= 100 && lönummer >= 0) { if (Daten[lönummer].aktiv == 0) { Console.WriteLine("Der Datensatz ist nicht vorhanden bzw. wurde bereits gelöscht!"); if (Daten[lönummer].aktiv == 1) { Daten[lönummer].aktiv = 0; Daten[lönummer].hoehe = 0; Daten[lönummer].breite = 0; Daten[lönummer].laenge = 0; Daten[lönummer].volumen = 0; Console.WriteLine("Kistennummer: {0} GELÖSCHT", Daten[lönummer].kistennummer); } } else Console.WriteLine("Ihre Auswahl liegt ausserhalb der Möglichkeiten!"); } } public void ändern() { int ännummer; Console.WriteLine("Welchen Datensatz wollen sie ändern? Wählen Sie eine Kistennummer aus (1-100)!"); ännummer = Convert.ToInt32(Console.ReadLine()) -1 ; if(ännummer <= 100 && ännummer >= 0) { if(Daten[ännummer].aktiv==1) { Console.WriteLine("Geben sie bitte die Höhe der Kiste ein"); Daten[ännummer].hoehe = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Geben sie bitte die Breite der Kiste ein"); Daten[ännummer].breite = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Geben sie bitte die Länge der Kiste ein"); Daten[ännummer].laenge = Convert.ToInt32(Console.ReadLine()); Daten[ännummer].volumen = Daten[ännummer].hoehe * Daten[ännummer].breite * Daten[ännummer].laenge; } else Console.WriteLine("Der ausgewählte Datensatz existiert nicht!"); } else Console.WriteLine("Ihre Auswahl liegt ausserhalb der Möglichkeiten!"); } public void listAll() { for(int i=0; i < gesamt; i++) { if(Daten[i].aktiv == 1) Console.WriteLine("Kistennummer: {0} > Höhe: {1},Breite: {2}, Länge: {3},Volumen: {4}",Daten[i].kistennummer,Daten[i].hoehe, Daten[i].breite, Daten[i].laenge, Daten[i].volumen); else Console.WriteLine("Kistennummer: {0} NICHT BELEGT",Daten[i].kistennummer); } } static void Main(string[] args) { int auswahl = 0; //Auswahlmenü Schleife while(auswahl != 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"); auswahl = Convert.ToInt32(Console.ReadLine()); switch (auswahl) { case 1: kisteAnlegen(); break; case 2: listAll(); break; case 3: anzeigen(); break; case 4: löschen(); break; case 5: ändern(); break; case 6: break; default: Console.WriteLine("Ihre Auswahl ist nicht im Menü beinhaltet!"); } } } } }
Vielen dank
-
Vielleicht kommt da noch was dazu ... aber
1. Keine Haushaufgaben,
2. Eigeniniziative
3. Fehlermeldungen angeben / beschtreiben.
4. EinzugZu deinem Programm:
- Verwende Integer.TryParse damit bei falcsher Eingabe keine Fehlermeldung kommt.
- Kiste[i] kannst mit
Kiste[i] = default(Kiste)
löschen - Da hätte ich eher Listen genommen
- Ich hätte eine extra Methode geschrieben, welche einen gültigen Index abfragt.
kistennummer
sollte bei der Ausgabe noch um eins erhöht werden. Damit Beim bei der Eingabe von Kiste "1" (intern 0) auch wieder eine "1" ausgegeben wird.kistennummer
weglassen! Diese Information ist redundant.struct
hätte ich jetzt mitgetter
undsetter
geschrieben.- Darfst du schon Parameter verwenden? Das wäre manchmal sinnvoll bei der übergabe von Indizes (anzeigen, löschen, etc.).
- Konstanten werden besonders hervorgehoben: Entweder
Gesamt
oderGESAMT
aber nicht kleingeschrieben. - Funktionen werden in CamelCase geschrieben.
- Bei
listAll
hätte ich nur die belegten Felder angegebn. - Bei einer Sprache bleiben (BITTE NIMM ENGLISCH) nicht ein gemische aus Deutsch
ändern
oderlistAll
. - Zwar erlaubt, aber bitte keine Umlaute in Methoden-, Klassen- oder Variablennamen : z.B.:
ändern
- Eingabevalidierung bei
kisteAnlegen
: Die Diemsionen der Kiste können nicht kleiner als 0 sein! - Zeile 71 muss < anstatt <= sein. Bei Eingabe 0 wird
lönummer
< 0 und der Arrayzugriff schlägt fehl. - KOMMENTARE!
-
Vielen Dank für deine Ausführungen, leider bin ich jetzt noch keinen Schritt weiter. Mir ist schon klar das ihr keine Hausaufgaben für mich macht, aber das sollt ihr ja nicht. Weiß ja nur nicht warum ich in den Case Anweisungen nicht schreiben kann
case 1:
ändern();
break;
case 2:Denn ich verstehe nicht was ich nun in die Klammer des Methodenaufrufes bei Case 1 schreiben muss. Werte muss ich ja keine übergeben an die Methode ändern.
Alles andere kommt noch im feinschliff, aber solange es nicht funktioniert, muss ich auch keine Feinheiten machen.
Daher bitte nochmals Informationen was dort fehlt und wie ich es möglicherweise beheben kann.
Danke
-
Hallo,
bitte poste beim nächsten Mal die Fehlermeldung die der Compiler ausgibt. Auf den ersten Blick sieht es so aus, als ob du versuchst eine nicht statische Methode aus Main (einer statischen Methode) aufzurufen - das funktioniert nicht.
Lösung 1: Du lagerst deine Methoden in eine passende Klasse aus und erstellst davon eine Instanz auf der du die Methoden aufrufst.
Lösung 2: Du legst ein neues Objekt von Main an und rufst die Methoden darauf auf
Lösung 3: Du machst die Methoden, die du aufrufst, static.
-
Rhombicosidodecahedron schrieb:
- Konstanten werden besonders hervorgehoben: Entweder
Gesamt
oderGESAMT
aber nicht kleingeschrieben. - Funktionen werden in CamelCase geschrieben.
- Bei einer Sprache bleiben (BITTE NIMM ENGLISCH) nicht ein gemische aus Deutsch
ändern
oderlistAll
. - KOMMENTARE!
Einige deiner Hinweise finde ich okay, andere würde ich etwas abschwächen wollen:
- Halte dich an einen Codestil, idealerweise (da verbreitet) aber nicht zwingend beispielsweise den von Microsoft (wie z.B. diesen hier).
- Kommentiere an den Stellen, wo man den Code nicht sofort versteht (Wenn du deinen eigenen Code ein halbes Jahr lang nicht mehr gesehen hast, ist das in etwa so, als hättest du den Code noch nie zuvor gesehen - In der Regel liest man Code auch wesentlich häufiger, als das man ihn schreibt). Übertreibe es aber genauso wenig, das andere Extrem ist ebenso schlecht lesbar.
- Auch wenn hier viele immer schreiben das man Englisch nutzen sollte: Wichtiger ist das du einigermaßen konsistent bleibst. Sogar in der Praxis gibt es einige Firmen die gute Gründe haben weitgehend in Deutsch (aber ohne Sonderzeichen in Bezeichnern) zu schreiben*.
* Wenn man in einem großen Konzern arbeitet der weltweit operiert und vielleicht sogar in mehreren Ländern Entwicklungsabteilungen hat, ist eine Weltsprache wie Englisch definitiv die erste Wahl.
Im Gegensatz dazu gibt es aber Firmen, die gar nicht die Kapazitäten für einen weltweiten Vertrieb hätten, und die sehr stark mit einer Fachsprache arbeiten die vor Ort im Einsatz ist. Hier würde ein Zwang auf Englisch die Einarbeitung und Verständigung zwischen den Mitarbeitern unnötig erschweren und ggf. sogar gänzlich unsinnig sein (Unsere Firma operiert z.B. nur im deutschsprachigen Raum, und selbst wenn irgendwann doch einmal eine Internationalisierung geplant wäre, so hat diese eher geringe Priorität, und würde sich rein auf die Oberfläche beziehen).
Das führt zwar durchaus an einigen Stellen zu "Denglischen" Code, aber dennoch wird jeder der hier neu anfängt so wenigstens über Handbuch, Anwendung und Code einen schnellen Einstieg finden. Englisch als Fachsprache wäre hier nur unnötiger Overhead der sich negativ auf die Entwicklungszeit auswirken würde.
Ja, schön zu lesen ist dies nicht unbedingt. Aber verständlich.
- Konstanten werden besonders hervorgehoben: Entweder
-
Hi zusammen,
ich danke euch für die Unterstützung, es lag tatsächlich daran das ich aus der Main Methode meine, als public definierten Methoden, aufrufen wollte.
Habe diese Methoden nun in eine neu angelegte Klasse verschoben und schon geht es.Jetzt werde ich mich noch ein wenig an die Schönheit und Kommentierung der diversen Passagen machen.
Vielen Dank