Array
-
Also, nochmals der gesamte angepasste Code:
using namespace System; value struct kiste { Int32 hoehe; Int32 breite; Int32 laenge; double volumen() { double volWert; volWert=hoehe * breite * laenge; return volWert; } virtual String ^ToString() override { return String::Format("h: {0}, b: {1}, l: {2}; V = {3}", hoehe, breite, laenge, volumen()); } }; // die Funktion zum einelesen der Kisten kiste einlesen() { // Eine globale STrukturvariable kiste aKiste; Console::Write("\nGeben Sie die Höhe der Kiste ein:"); aKiste.hoehe=Convert::ToInt32(Console::ReadLine()); Console::Write("\nGeben sie die Breite der Kiste ein:"); aKiste.breite=Convert::ToInt32(Console::ReadLine()); Console::Write("\nGeben Sie die Länge der Kiste ein:"); aKiste.laenge=Convert::ToInt32(Console::ReadLine()); return aKiste; } // Löschen einer Kiste void loeschen(System::Collections::Generic::List<kiste> %kisten) { Console::WriteLine("Eingeben der Kisten Nummer zum loeschen:"); kisten.RemoveAt(int::Parse(Console::ReadLine())); } int main(array<System::String ^> ^args) { Console::WriteLine(" Auswahl der Funktionen"); Console::WriteLine(" a Eingabe der Daten für die Kisten"); Console::WriteLine(" b Loeschen einer Kiste"); Console::WriteLine(" d Alle Kisten anzeigen"); // Die Auswahl der einzelnen Funktionen System::Collections::Generic::List<kiste> kisten; bool bEnd = false; while(bEnd == false) { Console::WriteLine(); Console::Write(" wählen Sie aus = "); Char funktionAuswahl = Convert::ToChar(Console::ReadLine()); switch (funktionAuswahl) { case 'a': kisten.Add(einlesen()); break; case 'b': loeschen(kisten); break; case 'd': for each(kiste k in kisten) Console::WriteLine(k); break; case 'q': bEnd = true; break; default: Console::WriteLine(" Sie haben ein falsche Zeichen eingegeben"); break; } } }
-
Jochen Kalmbach schrieb:
Also, nochmals der gesamte angepasste Code:
using namespace System; value struct kiste { Int32 hoehe; Int32 breite; Int32 laenge; double volumen() { double volWert; volWert=hoehe * breite * laenge; return volWert; } virtual String ^ToString() override { return String::Format("h: {0}, b: {1}, l: {2}; V = {3}", hoehe, breite, laenge, volumen()); } }; // die Funktion zum einelesen der Kisten kiste einlesen() { // Eine globale STrukturvariable kiste aKiste; Console::Write("\nGeben Sie die Höhe der Kiste ein:"); aKiste.hoehe=Convert::ToInt32(Console::ReadLine()); Console::Write("\nGeben sie die Breite der Kiste ein:"); aKiste.breite=Convert::ToInt32(Console::ReadLine()); Console::Write("\nGeben Sie die Länge der Kiste ein:"); aKiste.laenge=Convert::ToInt32(Console::ReadLine()); return aKiste; } // Löschen einer Kiste void loeschen(System::Collections::Generic::List<kiste> %kisten) { Console::WriteLine("Eingeben der Kisten Nummer zum loeschen:"); kisten.RemoveAt(int::Parse(Console::ReadLine())); } int main(array<System::String ^> ^args) { Console::WriteLine(" Auswahl der Funktionen"); Console::WriteLine(" a Eingabe der Daten für die Kisten"); Console::WriteLine(" b Loeschen einer Kiste"); Console::WriteLine(" d Alle Kisten anzeigen"); // Die Auswahl der einzelnen Funktionen System::Collections::Generic::List<kiste> kisten; bool bEnd = false; while(bEnd == false) { Console::WriteLine(); Console::Write(" wählen Sie aus = "); Char funktionAuswahl = Convert::ToChar(Console::ReadLine()); switch (funktionAuswahl) { case 'a': kisten.Add(einlesen()); break; case 'b': loeschen(kisten); break; case 'd': for each(kiste k in kisten) Console::WriteLine(k); break; case 'q': bEnd = true; break; default: Console::WriteLine(" Sie haben ein falsche Zeichen eingegeben"); break; } } }
Hallo
Ich finde es super toll das du dir soviel Mühe gemacht hast, aber da ist soviel drin was ich noch garnicht hatte, wenn ich das abschicke weis er sofort das das nicht von mir ist.
Schau dir bitte noch einmal das an[code] kiste kleineKiste[3]; Int32 meineLoeschen; for (Int32 schleife=0; schleife <3; schleife++) Console::WriteLine(" Index Auswahl {0} = ",meineLoeschen); }
[/code]
Fehlermeldung .\Kiste.cpp(82) : warning C4101: 'kleineKiste': Unreferenzierte lokale Variable
wie referenziere ich das?
-
Du sollst die Kiste nicht als Array anlegen sondern als List<kiste>...
oder dann als "managed array":
array<kiste>[3]
-
Ich poste mal frei "meine" Variante:
#include "stdafx.h" using namespace System; struct kiste { Int32 kistenNummer; Int32 hoehe; Int32 breite; Int32 laenge; Int32 volumen; }; // die Funktion zum einelesen der Kisten void einlesen(kiste kleineKiste[]) { //Das überlasse ich dir! ;) } // Löschen einer Kiste void loeschen(kiste kleineKiste[]) { //Vereinbarung einer Variable Int32 eingabe, datensatz; Boolean gefunden = false; //Einlesen der "wunsch" nummer Console::Write("Geben Sie die Nummer der Kiste ein: "); eingabe = Convert::ToInt32(Console::ReadLine()); //Durchlauf aller kistennummer und suche ob vorhanden for(Int32 i = 0; i < 100; ++i){ if(eingabe == kleineKiste[i].kistenNummer) { datensatz = i; gefunden = true; break; } } //Wenn ja Datensatz auf 0 setzen/löschen sonst meldung if(gefunden == true){ kleineKiste[datensatz].kistenNummer = 0; Console::WriteLine("Kiste erfolgreich gelöscht!"); } else Console::WriteLine("Dieses Kiste gibt es nicht!"); } void anzeigen(kiste kleineKiste[]) { Console::WriteLine("Nr.\tBreite\tHöhe\tLänge\tVolumen"); for(Int32 i = 0; i < 4; ++i){ if(kleineKiste[i].kistenNummer != 0) Console::WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", kleineKiste[i].kistenNummer, kleineKiste[i].breite, kleineKiste[i].hoehe, kleineKiste[i].laenge, kleineKiste[i].volumen); } } int main(array<System::String ^> ^args) { //Vereinbarung einer Strukturvariable mit 100 Elementen kiste kleineKiste[100]; //Vereinbarung einer Char Variable Char funktionAuswahl; Console::WriteLine(" Auswahl der Funktionen"); Console::WriteLine(" a Eingabe der Daten für die Kisten"); Console::WriteLine(" b Loeschen einer Kiste"); Console::WriteLine(" d Alle Kisten anzeigen"); Console::WriteLine(" q Programmende"); //Alle Elemente auf "NULL" bringen! for(Int32 i = 0; i < 4; ++i){ kleineKiste[i].kistenNummer = 0; kleineKiste[i].hoehe = 0; kleineKiste[i].laenge = 0; kleineKiste[i].breite = 0; kleineKiste[i].volumen = 0; } //Das ist nur zur Demonstration kleineKiste[1].kistenNummer = 88; kleineKiste[1].hoehe = 23; kleineKiste[1].breite = 22; kleineKiste[1].laenge = 88; kleineKiste[1].volumen = kleineKiste[1].laenge * kleineKiste[1].breite * kleineKiste[1].hoehe; kleineKiste[2].kistenNummer = 33; kleineKiste[2].hoehe = 33; kleineKiste[2].breite = 88; kleineKiste[2].laenge = 77; kleineKiste[2].volumen = kleineKiste[2].laenge * kleineKiste[2].breite * kleineKiste[2].hoehe; // Die Auswahl der einzelnen Funktionen Console::WriteLine(); do { Console::Write(" wählen Sie aus = "); funktionAuswahl = Convert::ToChar(Console::ReadLine()); switch (funktionAuswahl){ case 'a': //einfuegen(kleineKiste); break; case 'b': loeschen(kleineKiste); break; case 'd': anzeigen(kleineKiste); break; case 'q': Console::WriteLine("Programmende!"); break; default: Console::WriteLine(" Sie haben ein falsche Zeichen eingegeben"); break; } }while(funktionAuswahl != 'q'); return 0; }
Ich will nur sagen das ich gerne Kritik annehme und gerne auch höre wie ich den Quelltext bzw. meinen Stil verändere/Optimiere aber bitte nicht übertreiben
@Heinerich: Ich habe die Funktion "loeschen*" und "anzeigen" nach meinem Verständnis der Aufgabe mal ganz einfach (ohne sicherheitsabfragen etc.) Programmiert. Die Restlichen Funktionen solltest du -falls du hier alles verstehst- auch ähnlich oder sogar besser hinbekommen.
Ich habe einige Zeilen zusätlich in die main()-Funktion eingefügt um einpaar Daten schon mal in dem Lager zu haben die kannst/musst du natürlich Löschen.
Die Ausgabe und das auf "null"-bringen habe ich absichtlich nicht auf alle "Datensätze" angewandt. (Du sollst ja auch noch etwas zu tun haben ;))
Viel Erfolg
Gruß
Rudolf G* Für alle die, die Aufgabenstellung nicht kennen, eine Kiste löscht man in dem man die Kistennummer auf 0 setzt. Das heißt das die anderen Daten (Höhe/Breite/Länge) bleiben dürfen aber bei nächster "neuer" Kiste werden die Daten überschrieben!
-
Heinerich schrieb:
Hallo
Ich finde es super toll das du dir soviel Mühe gemacht hast, aber da ist soviel drin was ich noch garnicht hatte, wenn ich das abschicke weis er sofort das das nicht von mir ist.
Schau dir bitte noch einmal das an[code] kiste kleineKiste[3]; Int32 meineLoeschen; for (Int32 schleife=0; schleife <3; schleife++) Console::WriteLine(" Index Auswahl {0} = ",meineLoeschen); }
[/code]
Fehlermeldung .\Kiste.cpp(82) : warning C4101: 'kleineKiste': Unreferenzierte lokale Variable
wie referenziere ich das?weiss jetzt nicht aus dem stehgreif ob die meldung damit zu tun hat, aber dir fehlen da die geschweiften klammern an der for-schleife..
ich habe die aufgabe damals auch gehabt und ganz ehrlich lange dran gesessen,
aber im grunde steht alles was man braucht im heft..
ich hab mir das teil zig mal durchgelesen und die aufgabe dann auch bald gelöst gehabt
-
nylon schrieb:
weiss jetzt nicht aus dem stehgreif ob die meldung damit zu tun hat, aber dir fehlen da die geschweiften klammern an der for-schleife..
Nein, das hat nichts damit zu tun. Da die Forschleife nur eine Anweisung hat und da braucht man keine geschweifte Klammern, die werden nur bei mehreren Anweisung für die for/if gebraucht.
-
Rudi G schrieb:
Nein, das hat nichts damit zu tun. Da die Forschleife nur eine Anweisung hat und da braucht man keine geschweifte Klammern, die werden nur bei mehreren Anweisung für die for/if gebraucht.
ah ja.. lang ists her.
habe mir angewöhnt auch bei einzelnen anweisungen die klammern zu setzen.. der übersicht halber.
macht der gewohnheit ;>edit:
@Heinerichum trotzdem noch die fehlermeldung zu erläutern, die felder von kleineKiste werden ja mit keinen werten initialisert.
kiste kleineKiste[3] = {1,2,3};
wäre zb korrekt.
-
nylon schrieb:
die felder von kleineKiste werden ja mit keinen werten initialisert.
Das ist solange kein Problem, solange man nicht auf den Speicher (die Elemente) nicht zugreift. Aber sobald man auf die Elemente Zugreif und dann "zufälliges" drin ist kann/wird das Programm abstürzen.
Um das zu verhindert durchläuft die schleife alle Datensätze & Elemente und initialisiert sie mit 0!
//Alle Elemente initialieren! for(Int32 i = 0; i < 4; ++i){ kleineKiste[i].kistenNummer = 0; kleineKiste[i].hoehe = 0; kleineKiste[i].laenge = 0; kleineKiste[i].breite = 0; kleineKiste[i].volumen = 0; }
nylon schrieb:
kiste kleineKiste[3] = {1,2,3};
wäre zb korrekt.
Das kann ich nicht so stehen lassen. Bei einem Int32 kleineKiste[3] (oder anderen Datentypen) währe es sicherlich richtig aber dass geht -meines Wissens- nicht! Das ist nämlich eine Strukturvariable das mehrere Datentypen & Variablen beinhaltet.
Und welchem Element werden die Werte dann zugeordnet? Dem Element "kistenNummer" in der Struktur?
-
hoppla ja, mein fehler.. zu sehr auf die fehlermeldung geschaut..
was rudi geposted hat ist korrekt und beschreibt das was ich dachte.sorry
-
Ich habe eine ähnliche Aufgabe, möchte jedoch, dass die Kistennummer automatisch vergeben wird. Das klappt allerdings nur im CASE Teil. Wie bekomme ich das als Funktion hin?
case 1: k[i].kistenNummer=i; Console::Write("Länge des Artikels : "); k[i].laenge=Convert::ToInt32(Console::ReadLine()); Console::Write("Höhe des Artikels : "); k[i].hoehe=Convert::ToInt32(Console::ReadLine()); Console::Write("Breite des Artikels : "); k[i].breite=Convert::ToInt32(Console::ReadLine()); Console::WriteLine(); Console::WriteLine("Art.nr. lautet {0}",i); Console::WriteLine("Volumen = {0}",k[i].breite*k[i].hoehe*k[i].laenge); Console::WriteLine(); i++;