ich verzweifle



  • Dann ist die Schleife ( for(..;..;..) ) an dieser Stelle der falsche Ansatz.
    Vermutlich kommst Du an diese Stelle, indem Du im genannten Auswahlmenü so etwas wie "Erzeuge neue Kiste" gewählt hast? Dann müsstest Einlesen() aufrufen und das Ergebnis an die nächste freie Stelle deines Kistenarrays speichern.

    Weißt Du, wie viele Positionen in kleineKiste[] schon belegt sind?
    Wofür benutzt Einlesen() denn den Index?



  • OK, jetzt wissen wir mehr oder weniger genau was du machen sollst.
    Was ist jetzt das konkrete Problem?

    So wie du es momentan schilderst klingt es nach "ich kann einfach nicht programmieren/hab überhaupt keinen Plan". Damit läuft die Frage auch "macht das bitte für mich" bzw. "erteilt mir bitte Privatunterricht" hinaus.
    Wird vermutlich keiner machen.

    Beispiele für Fragen auf die du vermutlich eher eine Antwort bekommst wären...
    "Wie kann ich eine Eingabe vom User einlesen?"
    "Wie kann ich unterschiedlichen Code ausführen, je nachdem was eingegeben wurde?"
    etc.

    Und was du noch klären solltest: ob die eingegebenen Daten einen Neustart des Programms "überleben" müssen.



  • Also der Punkt ist das ich seid 15.01.2015 angefangen habe neben meinen Beruf ein Fernstudium als Programmierer zu machen. Also kann ich nicht perfekt sein, wir haben alle mal angefangen. Die ersten 3 Einsendeaufgaben.
    liefen mir problemlos von der hand. Nun sitze ich seid 4 Tagen an der 4. Aufgabe habe das lernheft unzählige Male von vorn bis hinten gewälzt nur erschließt sich mir nicht Wie diese Daten in dem Array gespeichert werden ohne das ich gleich alle eingeben muss.
    zum beispiel nehme ich jetzt mal das Schubladen beispiel.
    die Schublade reicht für insgesamt 50 paar socken.
    momentan habe ich aber nur 5 zum reinlegen......

    ich will keine Lösung für meine Arbeit es war nur eine frage was ich falsch mache oder wo mein denk Fehler ist.



  • Schon wieder die Lagerverwaltungsaufgabe - gab es schon öfters hier im Forum: https://www.google.com/cse?cx=partner-pub-9649035689579187:9487280755&q=C%23 Lagerverwaltung&oq=C%23 Lagerverwaltung&gs_l=partner.3...4125.8251.0.8988.0.0.0.0.0.0.0.0..0.0.gsnos%2Cn%3D13...0.4080j1445120j20..1ac.1.25.partner..0.0.0.#gsc.tab=0&gsc.q=C%23 Lagerverwaltung&gsc.page=1

    Aber wenigstens scheint du ja jetzt C# programmieren zu dürfen und nicht mehr C++/CLI!

    So wie luker und hustbaer schon geschrieben haben, wirst du ein Menü erstellen müssen, wo der Anwender dann gefragt wird, was er machen möchte ("Neue Kiste anlegen", "Alle Kisten anzeigen", "Kiste lschen", "Beenden", ...).
    Und jede der Menüauswahlpunkte kannst du dann als eigen Methode umsetzen.
    Bei einem staischen Array brauchst du noch zusätzlich einen Zähler der angibt, wieviele Kisten du bereits eingegeben hast (eine andere Alternative wäre auf null-Referenzen zu überprüfen, aber das ist ersteinmal ein bißchen schwieriger).



  • Am sinnvollsten erscheint es mir, wenn du mal in Prosa die einzelnen Schritte aufschreibst die von dem Programm durchgeführt werden müssen, also zum Beispiel:

    - Zeige Menü mit Optionen durchnummeriert von 1-6, dabei bedeutet 1: Neue Kiste anlegen, 2: etc.

    - Wenn der User eine 1 eingibt, dann ...

    Wenn du diese Schritte hast (du kannst sie auch gerne hier posten), dann ist es vielleicht für dich verständlicher was du eigentlich genau machen willst. Wenn du die Schritte einigermaßen geschickt aufschreibst, dann musst du sie letztendlich nur noch in die Programmiersprache übersetzen. So musst du aber nicht den Programmablauf + die Übersetzung in einem durchführen, sondern kannst erstmal aufschreiben was eigentlich passieren soll und dich dann mit dem wirklichen Programmieren beschäftigen.



  • so ich habe mir mal gedanken gemacht und angefangen mit schreiben.

    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;
    public int Auswahl;

    internal static void RemoveAt(int ID)
    {
    throw new NotImplementedException();
    }
    }

    static Kiste Einlesen(int kistenNummer)
    {
    Kiste aKiste;
    int Volumen;

    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.Volumen = aKiste.Hoehe * aKiste.Breite * aKiste.Laenge;
    Console.WriteLine(" Das Volumen von Kiste {0} ist: {1}", index + 1, Volumen(aKiste[index]));
    Console.WriteLine();
    aKiste.Nummer = 1;
    return aKiste;
    }

    static void Main(string[] args)
    {
    int Auswahl;

    Kiste[] kleineKiste = new Kiste[50];
    for( int index = 0; index < 50; index ++)

    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) zum Beenden der Lagerverwaltung");
    Console.Write("Bitte wählen Sie:\t");
    Auswahl = Convert.ToInt32(Console.ReadLine());

    switch(Auswahl)
    {
    case 1:
    kleineKiste[index] = Einlesen(index + 1);

    break;

    case 2:
    // kleineKiste[index] = Loeschen(index + 1);
    break;

    case 3:
    // und auch hier..
    break;

    case 4:
    // und auch hier..
    break;

    case 5:

    break;

    case 6:

    break;

    default:
    Console.WriteLine("\n!!!Sie haben eine falsch Auswahl getroffen!!!\n\n");
    break;

    }
    }

    public static int ID { get; set; }
    }
    }

    er bringt mir die fehler meldung:

    Fehler 1 Der Name 'index' ist im aktuellen Kontext nicht vorhanden.

    wie muss ich das verstehen mus ich index auch deklarieren'?



  • Der gepostete Code ist weitgehend Murks! 😞
    U.a. hast du eine for-Schleife ohne Codeblock!

    Du solltest dich mit den drei Schleifen for, while und do while gründlich vertraut machen.

    Hier die drei Ansätze;

    bool weiter = true;
    for(...;...;...)
    {
       weiter = Einlesen();
       if(!weiter) break;
    }
    
    bool weiter = true;
    while(weiter)
    {
       weiter = Einlesen();
    }
    
    bool weiter;
    do
    { 
       weiter = Einlesen();
    }while(weiter);
    

    Um die Funktion bool Einlesen() und das Speichern der Eingaben kümmerst du dich bitte selbst.



  • So ich nochmal ich habe versucht mich an das Lernheft zu halten aber iwie funzt das nicht so.....

    was mache ich falsch kann mir wer ein (TIPP) geben?

    😕 😕
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Einsendeaufgabe._4
    {
    class Program
    {
    const int MaxKisten = 50;
    //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 Kiste Einlesen (int kistenNummer)
    {
    Kiste aKiste;
    for (int index = 0; index < MaxKisten; index++)
    {
    if (kistenNummer == 0)
    {
    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;

    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 <= 50 && 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 - 50 ein.");
    Nummer = Convert.ToInt32(Console.ReadLine()) - 1;

    if (Nummer <= 50 && 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 <= 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 alle Kisten anzeigen
    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-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 < MaxKisten; index++)
    {
    aKiste[index].kistenNummer = index + 1;
    aKiste[index].Aktiv = 0;
    }

    //Auswahlmenü Schleife
    while (aktiv != 6)
    {
    Console.WriteLine(" Willkommen zur Lagerverwaltung, was möchten Sie tun");
    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 = (aKiste);
    break;
    case 2:
    Alle = (aKiste);
    break;
    case 3:
    Anzeigen =(aKiste);
    break;
    case 4:
    Loeschen = (aKiste);
    break;
    case 5:
    Aendern =(aKiste);
    break;
    case 6:
    break;
    default:
    Console.WriteLine("Falsche Eingabe");
    }
    }
    }

    }
    }



  • Organisatorisches: Bitte Code in entsprechende Tags einschließen:
    [ code ]var variable = MethodCall(parameter);[ /code ] (aber ohne die Leerzeichen in den Klammern)
    dann wird er lesbarer angezeigt.

    var variable = MethodCall(parameter);
    

    Dafür gibt es auch unter dem Editorfenster den Button "Code".

    Fachliches:
    Das Menü sieht doch schonmal ganz gut aus. Weiter also mit den einzelnen Methoden.

    switch (aktiv) 
    { 
        case 1:
            int index = FindeNächstenIndex();
            if( index < 0 )
            {
                // Nix mehr frei
            }
            else
            {
                aKiste[index] = Einlesen();
            }
            break;
    

    Vergiss den index-Parameter für Einlesen(). Diese Methode "macht" eine neue Kiste. Sie tut alles, was dazu notwendig ist. Und sie macht nichts, was nicht diesem Zweck dient. Folglich muss sie mit return(aKiste); enden. Und ändere den Variablennamen, damit Du ihn nicht mit dem Kisten-Array aKiste verwechselst.
    Ob die Methode überhaupt aufgerufen wird und was mit der neuen Kiste geschehen soll, entscheidet eine andere Methode.
    Den nächsten freien Index kannst Du finden, indem Du aKiste abklapperst, bis Du eine findest, die nicht aktiv ist. Findest Du nichts, gibtst Du -1 zurück und wertest das als "Nichts mehr frei".



  • sry ....
    nu steh ich voll auf dem schlauch



  • Und was genau ist jetzt unkarer als zuvor?
    Das Stückchen Code, das ich gepostet habe?
    Die Bemerkungen über die Methode Einlesen()?
    Die Bemerkungen über die beiden Variablen aKiste?
    Die Bemerkungen über verschiedene Methoden mit verschiedenen Aufgaben?
    Die Einführung von FindeNächstenIndex()?



  • also ich check das nicht mit dem code er zeigt mir jetzt die auswahl an aber wenn ich eins eingebe stürtzt es ab...

    switch (aktiv)
                    {
                        case 1:
                            int index = kistenNummer();
                            if( index < 0 )
                              {
                                  Console.WriteLine(" Leider kein Freier Platz mehr Frei");
    
                              }
                            else
                             {
                               aKiste[index] = Einlesen();
                              } 
                            break;
    

    außerdem legte mir das visual noch diese typen an?

    private static Kiste Einlesen()
            {
                throw new NotImplementedException();
            }
    
            private static int kistenNummer()
            {
                throw new NotImplementedException();
            }
    


  • Das ist doch sehr nett vom Visual Studio, die Methoden schonmal anzulegen. Dass sie beim Aufruf "abstürzen" liegt daran, dass Visual Studio eben nicht ahnen kann, was diese Methoden machen sollen. Daher enthalten sie nur

    throw new NotImplementedException();
    

    Diese Ausnahme zeigt dem Entwickler, dass er hier etwas noch nicht implementiert hat. Du musst diese Zeile mit dem eigentlichen Code der Methode ersetzen.

    Für Einlesen() ist das einfach, da Du den Code schon in der Methode Einlesen(int) hast. Spare dir Arbeit, indem Du die automatisch erstellte Methode löschst und die Signatur Deiner vorhandenen Methode anpasst (einfach den int-Parameter löschen).

    Deine neue Methode KistenNummer() muss, wie schon eher angedeutet, über alle Elemente des Kisten-Arrays iterieren und die erste finden, die nicht aktiv ist. Deren Index soll sie zurückgeben.

    Ach und Microsoft Style Guide besagt, dass Methodennamen groß geschrieben werden. Klein beginnen lokale Variable.



  • so ich bins leider nochmal 😃
    ich habe den code jetzt soweit das er funktioniert....

    außer das er mir beim list all kisten nur anzeigt keine kiste mehr frei??

    wer könnte mir da einen tipp geben bitte????

    Hatt sich erledigt.


  • Mod

    jonnywhite7 schrieb:

    außer das er mir beim list all kisten nur anzeigt keine kiste mehr frei??

    Bitte mal als verständlichen Satz formulieren. Oder besser noch: Mehrere, vollständige, verständliche Sätze mit einer genauen Problembeschreibung. Was tust du? Was erwartest du? Was passiert? Eine unnötig große Anzahl von Fragezeichen am Ende ist dabei kein Ersatz für Großbuchstaben, Kommata oder sonstige Satzzeichen.

    ~Man könnte an dieser Stelle noch irgendwas Fieses sagen bezüglich der Korrelation zwischen schlampiger Rechtschreibung, schlampiger Denkweise und schlampiger Programmierung, aber ich bin mal nicht so.~

    edit: Oh, wow! Das ist ja bloß der Code eines anderen Nutzers aus einem alten Thread dreist kopiert und ein paar Namen geändert, damit es nicht auffällt. Wenn du meinst, mit solchen Methoden durchzukommen, dann brauchst du auch sicher keine weitere Hilfe.



  • Bitte was? Code kopiert.... das mann sich Hilfe holt bzw andere cods anschaut ist verboten aja. Ganz ehrlich sowas ist dreist zu behaupten aber ich gehe davon aus das "Du" von Geburt an vollkommen Perfekt warst. Die Aufgabenstellung ist bei allen gleich mit gleicher Zielsetzung.nir die einen mit 100 Kisten andere mit 50 Kisten also folglich wird sich auch der code ähneln bzw gleich aussehen.
    Aber du hast recht ich bin dummen dreist und du perfekt.



  • Nu flipp mal nicht gleich aus, nur weil Dir jemand sagt, dass er Deine Vorgehensweise nicht gutheißt. Was Du davon mitnehmen solltest ist, dass Du Menschen, die Dir beim Einstieg in die Materie helfen, leicht verärgerst, indem Du den mühsamen Lernprozess abbrichst und stattdessen Code einer gelösten ähnlichen Aufgabe kopierst. Der Lerneffekt dabei ist nahe Null und der Aufwand der Helfenden in den Sand gesetzt.

    Zurück zum Thema.
    Hast Du schon einmal den Debugger benutzt?
    Setze einen Breakpoint auf das, was in Deinem letzten Post Zeile 117 ist. Starte das Programm und lass Dir alle Kisten anzeigen. Beim Durchsteppen der einzelnen Programmschritte (F10, F11, Strg+F11) wirst Du nach sehr kurzer Zeit auf einen Vergleich treffen, den Du Dir nochmal genauer anschauen solltest.

    Nochmal zur Form.
    SeppJ hat vollkommen Recht mit seiner Kritik an Deiner Version der deutschen Rechtschreibung.



  • Ich Entschuldige mich dafür, aber sowas ärgert mich sehr wenn jemand sowas behauptet was nicht stimmt!
    Ich bin Änfanger und grad mal in der 4.Woche und Lerne dies neben mein Eigentlichem Beruf. Und bin auch nicht mehr der Jüngste.

    Thema Rechtschreibung:

    In den Lernhaften wird es immer wieder so Dargestellt in den Methoden
    zb: Loeschen und nicht Löschen oder allgemein umlaute auszuschreiben.

    Thema Programmierstill:

    "Anfänger kein Profi".

    Danke Dir Luker ich werde dies mal versuchen.

    Zitat: "Ich wollte niemand beleidigen"



  • Nochmal Danke Dir luker.
    Das Programm läuft jetzt.

    Hab in der "if" schleife nur den wert MaxKisten gegen 1 ausgetauscht,
    habe zudem noch die "else" schleife weggelassen damit es übersichtlicher wird.
    Habe auch die Rechtschreibung geändert.

    vielen Dank nochmal 👍

    // Methode zum Anzeigen von Allen Kisten.
            static void Alle(Kiste[] aKiste)
            {
                for (int index = 0; index < MaxKisten; index++)
                {
                    if (aKiste[index].Aktiv == 1)
                    {
                        Console.WriteLine("KistenID: {0}, Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", aKiste[index].KistenID, aKiste[index].Höhe, aKiste[index].Breite, aKiste[index].Länge, aKiste[index].Volumen);
                        Console.WriteLine();
                    }
    
                }
            }
    


  • So ein Erfolg tut gut, gell?

    Tipp zum Vermeiden genau dieses Fehlers: Aktiv sollte vom Typ bool sein, der lässt sich gar nicht ohne Compilerwarnung mit einer Zahl vergleichen. Da if() sowieso ein bool erwartet, ändert sich die Abfrage dann zu

    if ( aKiste[index].Aktiv )
    {
        TuWas();
    }
    

    Und es ist leichter ersichtlich, was diese Eigenschaft eigentlich bedeutet.


Anmelden zum Antworten