ich verzweifle



  • Hallo;

    Ich wollte mal fragen was ich falsch mache oder ich nicht check:

    Und zwar möchte ich ein array anlegen das mir etwas speichert bis max. 50

    soweit ist mir alles gelungen.

    aber nun ist es so das wenn ich anfange ein prudukt einzugeben dan will es gleich alle 50 eingeben.......

    static void Main(string[] args)
    {
    Kiste[] kleineKiste = new Kiste[50];
    for (int index = 0; index < 50; index++)
    kleineKiste[index] = Einlesen(index + 1);

    wer kann mir da einen Tipp geben.

    Bitte schlagt mich nicht ich lerne noch



  • Du hast aber schon die for Schleife beim abkopieren gesehen oder??



  • Ja die steht so im Heft drin nur das sie da mit [3] aber da muss ich auch alle 3 gleich eingeben das ist aber nicht Sinn der Aufgabe weist du was ich meine.



  • naja, wie willst du "es" denn darüber informieren dass du keine weiteren daten eingeben willst?



  • Genau das ist ja mein Problem oder mein Denkfehler.... Array Größe ist mit 50 angewiesen, aber wie weiter das ich die Positionen immer nur einzeln eingeben kann find da nix im Lernzeit oder ich bin zu doof dafür.

    Selbst wenn ich den Index auf 3 stell kann ich alle 3 gleich eingeben und die MMethode Main gibt mir die 3 wieder aber speichert sie nicht 😞



  • Du musst dich etwas genauer ausdrücken. Ich bin nicht sicher was du jetzt willst. Ich hab aber auch keine Lust nen Haufen Fragen zu stellen um es dir aus der Nase zu ziehen. Und noch weniger Lust zu raten.

    Wenn du Hilfe möchtest, musst du erstmal genau beschreiben was du erreichen willst. So dass es andere Leute, die deine Aufgabenstellung ja nicht kennen können, auch verstehen können.



  • Okay,
    Meine Aufgabenstellung heißt erstelle eine Lagerverwaltung.
    Die 50 Kisten speichern kann mit einem Auswahlmenü:
    Neue Kiste anlegen samt breite, hoehe und laenge, Kistendaten verändern, einzelne Kisten loeschen, und anzeigen aller angelegten Kisten.

    mein Problem ist das ich Kisten anlegen kann aber ich muss gleich alle 50 eingeben und ich möchte aber immer nur eine eingeben und dann wieder zum Auswahlmenü zurückkehren um entweder eine neue Kiste anzulegen oder zu loeschen etc...

    Weißt du jetzt wie ich das meine?



  • 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.


Anmelden zum Antworten