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:
    @Heinerich

    um 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++;
    

Anmelden zum Antworten