Autor Beitrag
CodeKiddy
Hält's aus hier
Beiträge: 9

WIN 10
C#
BeitragVerfasst: Do 03.08.17 18:16 
Halli, hallo! :)

Ich, ein absoluter Programmierneuling, der gerade erst seine ersten zittrigen, kläglichen Schritte in der Sprache C# macht, brauche einmal eure Hilfe.
Die Hausaufgabe von meinem Programmierkurs bei der ILS lautet, dass ich mit den erlernten Mitteln eine Lagerverwaltung erstellen soll. Nichts Großes, nur ein klitzekleines Programm in der Eingabeaufforderung.
Nun habe ich auch fleißig in die Tasten gehauen. Viele Probleme konnte ich alleine lösen und es werden auch noch weitere Fehler in meinem Code sein, aber mir geht es hier primär darum, dass meine do-while-Schleife sich schlichtweg weigert, sich zu wiederholen. Eine Ausführung erfolgt und dann bleibt sie bei der eingebauten switch-Verzweigung hängen. Am besten ihr schaut euch den Code einfach mal an.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
/* ##################################################
 * Einsendeaufgabe 4
 * ################################################## */


using System;

namespace lagerverwaltung
{
    class Program
    {
        //Speichern der Daten
        struct Kiste
        {
            public string iNummer;
            public string jahr;
            public string monat;
            public int breite;
            public int laenge;
            public int hoehe;
            public int volumen;
        }

        //Methoden zum Eingeben, Löschen, Ändern, Anzeigen und Auflisten der Kisten
        static Kiste Eingeben(int kistennummer)
        {
            Kiste aKiste;

            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());
            Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", kistennummer);
            aKiste.hoehe = Convert.ToInt32(Console.ReadLine());

            aKiste.volumen = aKiste.breite * aKiste.laenge * aKiste.hoehe;

            Console.WriteLine("\nGeben Sie an, wann die Kiste ins Lager aufgenommen wurde.");
            Console.Write("Jahr (Format XXXX): ");
            aKiste.jahr = Console.ReadLine();
            Console.Write("Monat(Format XX): ");
            aKiste.monat = Console.ReadLine();

            aKiste.iNummer = aKiste.jahr + "-" + aKiste.monat + "-" + kistennummer;

            return aKiste;
        }

        static Kiste Loeschen(Kiste[] lager, int index)
        {
            lager[index].iNummer = "";
            lager[index].jahr = "";
            lager[index].monat = "";
            lager[index].breite = 0;
            lager[index].laenge = 0;
            lager[index].hoehe = 0;
            lager[index].volumen = 0;

            return lager[index];
        }

        static Kiste Aendern(Kiste[] lager, int index)
        {
            int auswahl = 0;
            bool auswahlFunktion = false;

            Console.WriteLine("Die Daten der Kiste {0} lauten: ", lager[index].iNummer);
            Console.WriteLine("Breite:\t\t\t" + lager[index].breite);
            Console.WriteLine("Länge:\t\t\t" + lager[index].laenge);
            Console.WriteLine("Höhe:\t\t\t" + lager[index].hoehe);
            Console.WriteLine("Volumen:\t\t" + lager[index].volumen);
            Console.WriteLine("\n\n");

            Console.WriteLine("Welchen Datensatz möchten Sie ändern?");
            Console.WriteLine("Mögliche veränderbare Datensätze: Breite (1), Länge (2), Höhe (3), Volumen (4)");
            Console.Write("Auswahl: ");

            while (auswahlFunktion == false)
            {
                try
                {
                    auswahl = Convert.ToInt32(Console.ReadLine());

                    if (auswahl > 6 || auswahl < 1)
                    {
                        Console.WriteLine("Ihre Eingabe entspricht nicht der Auswahl von 1 bis 5.");
                        Console.WriteLine("Geben Sie eine zulässige Auswahl ein.\n");
                        Console.Write("Auswahl: ");
                    }
                    else
                    {
                        auswahlFunktion = true;
                    }
                }
                catch (FormatException)
                {
                    Console.WriteLine("Ihre Eingabe war nicht gültig. Bitte wiederholen.\n");
                    Console.Write("Auswahl: ");
                }
            }

            switch (auswahl)
            {
                case 1:
                    Console.Write("Neue Breite: ");
                    lager[index].breite = Convert.ToInt32(Console.ReadLine());
                    break;
                case 2:
                    Console.Write("Neue Länge: ");
                    lager[index].laenge = Convert.ToInt32(Console.ReadLine());
                    break;
                case 3:
                    Console.Write("Neue Höhe: ");
                    lager[index].hoehe = Convert.ToInt32(Console.ReadLine());
                    break;
                case 4:
                    Console.Write("Neues Volumen: ");
                    lager[index].volumen = Convert.ToInt32(Console.ReadLine());
                    break;
            }

            return lager[index];
        }

        static void Anzeigen(Kiste[] lager, int index)
        {
            Console.WriteLine("Identifikationsnummer:\t" + lager[index].iNummer);
            Console.WriteLine("Breite:\t\t\t" + lager[index].breite);
            Console.WriteLine("Länge:\t\t\t" + lager[index].laenge);
            Console.WriteLine("Höhe:\t\t\t" + lager[index].hoehe);
            Console.WriteLine("Volumen:\t\t" + lager[index].volumen);

            Console.WriteLine("\n\n");
        }

        static void Auflisten(Kiste[] lager)
        {
            for(int index = 0; index < 75; index++)
            {
                if (lager[index].iNummer == "")
                    continue;
                else
                {
                    Console.WriteLine("Identifikationsnummer:\t" + lager[index].iNummer);
                    Console.WriteLine("Breite:\t\t\t" + lager[index].breite);
                    Console.WriteLine("Länge:\t\t\t" + lager[index].laenge);
                    Console.WriteLine("Höhe:\t\t\t" + lager[index].hoehe);
                    Console.WriteLine("Volumen:\t\t" + lager[index].volumen);

                    Console.WriteLine("\n\n");
                }
            }
        }

        static void Main(string[] args)
        {
            //Gestaltung Eingabeaufforderung
            Console.Title = "Lagerverwaltung";
            Console.BackgroundColor = ConsoleColor.Black;
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Clear();


            //Vereinbarung der Variablen
            Kiste[] lager = new Kiste[75];
            int eingabe = 0;
            int index = 0;
            string eingabe2;
            bool auswahlFunktion = false;
            bool abbruch = false;
            bool flagVariable = true;

            do
            {
                //Programmstart
                Console.WriteLine("Willkommen bei der Lagerverwaltung.");
                Console.WriteLine("\n\n");
                Console.WriteLine("Folgende Funktionen stehen Ihnen zur Verfügung:\n");
                Console.WriteLine("-> Eingeben\t\t\t(1)");
                Console.WriteLine("-> Löschen\t\t\t(2)");
                Console.WriteLine("-> Ändern\t\t\t(3)");
                Console.WriteLine("-> Anzeigen\t\t\t(4)");
                Console.WriteLine("-> Auflisten\t\t\t(5)");
                Console.WriteLine("-> Abbruch des Programms\t(6)\n\n");


                //Auswahl der Methode
                Console.WriteLine("Welche Funktion möchten Sie nutzen?");
                Console.WriteLine("Geben Sie die entsprechende Nummer der Funktion ein.");
                Console.Write("Auswahl: ");

                while (auswahlFunktion == false)
                {
                    try
                    {
                        eingabe = Convert.ToInt32(Console.ReadLine());

                        if (eingabe > 6 || eingabe < 1)
                        {
                            Console.WriteLine("Ihre Eingabe entspricht nicht der Auswahl von 1 bis 5.");
                            Console.WriteLine("Geben Sie eine zulässige Auswahl ein.\n");
                            Console.Write("Auswahl: ");
                        }
                        else
                        {
                            auswahlFunktion = true;
                        }
                    }
                    catch (FormatException)
                    {
                        Console.WriteLine("Ihre Eingabe war nicht gültig. Bitte wiederholen.\n");
                        Console.Write("Auswahl: ");
                    }
                }

                Console.ForegroundColor = ConsoleColor.Magenta;
                Console.Clear();

                switch (eingabe)
                {
                    case 1:
                        Console.WriteLine("Sie haben sich für die Option \"Eingeben\" entschieden.");
                        Console.WriteLine("Geben Sie alle neu eingetroffenen Kisten in das System ein.\n");

                        while ((index < 75) && (flagVariable == true))
                        {
                            lager[index] = Eingeben(index + 1);

                            Console.WriteLine();
                            Console.WriteLine("Eine weitere Kiste eingeben?");
                            Console.WriteLine("(\"J\" = Ja, \"N\" = Nein)");
                            Console.Write("Eingabe: ");
                            eingabe2 = Console.ReadLine();
                            eingabe2 = eingabe2.ToUpper();

                            if (eingabe2 == "N")
                                flagVariable = false;
                            else
                            {
                                Console.WriteLine("\n\n");
                                index++;
                            }
                        }

                        Console.WriteLine("Sie werden zur Hauptseite weitergeleitet...");
                        Console.WriteLine("Mit Enter bestätigen.");
                        Console.ReadKey();
                        break;
                    case 2:
                        Console.WriteLine("Sie haben sich für die Option \"Löschen\" entschieden.");
                        Console.WriteLine("Welche Kiste hat das Lager verlassen und soll aus der Lagerverwaltung gelöscht werden?");
                        Console.WriteLine("Geben Sie die Identifikationsnummer der Kiste in der Form XXXX-XX-XX ein.\n");
                        Console.Write("Identifikationsnummer: ");
                        eingabe2 = Console.ReadLine();

                        index = Array.IndexOf(lager, eingabe2);

                        lager[index] = Loeschen(lager, index);

                        Console.WriteLine("Die Kiste wurde erfolgreich aus der Lagerverwaltung gelöscht.\n");
                        Console.WriteLine("Sie werden zur Hauptseite weitergeleitet...");
                        Console.WriteLine("Mit Enter bestätigen.");
                        Console.ReadKey();
                        break;
                    case 3:
                        Console.WriteLine("Sie haben sich für die Option \"Ändern\" entschieden.");
                        Console.WriteLine("Welche Daten möchten Sie überarbeiten?");
                        Console.WriteLine("Geben Sie die Identifikationsnummer der Kiste in der Form XXXX-XX-XX ein.\n");
                        Console.Write("Identifikationsnummer: ");
                        eingabe2 = Console.ReadLine();

                        index = Array.IndexOf(lager, eingabe2);

                        lager[index] = Aendern(lager, index);

                        Console.WriteLine("Die Daten der Kiste {0} wurden erfolgreich geändert.", eingabe2);
                        Console.WriteLine("Sie werden zur Hauptseite weitergeleitet...");
                        Console.WriteLine("Mit Enter bestätigen.");
                        break;
                    case 4:
                        Console.WriteLine("Sie haben sich für die Option \"Anzeigen\" entschieden.");
                        Console.WriteLine("Welche Daten möchten Sie sich anzeigen lassen?");
                        Console.WriteLine("Geben Sie die Identifikationsnummer der Kiste in der Form XXXX-XX-XX ein.\n");
                        Console.Write("Identifikationsnummer: ");
                        eingabe2 = Console.ReadLine();

                        index = Array.IndexOf(lager, eingabe2);

                        Anzeigen(lager, index);

                        Console.ReadKey();
                        Console.WriteLine("Sie werden zur Hauptseite weitergeleitet...");
                        Console.WriteLine("Mit Enter bestätigen.");
                        Console.ReadKey();
                        break;
                    case 5:
                        Console.WriteLine("Sie haben sich für die Option \"Auflisten\" entschieden.");
                        Console.WriteLine("Die folgende Liste zeigt alle im Lager befindlichen Kisten an.\n\n");

                        Auflisten(lager);

                        Console.ReadKey();
                        Console.WriteLine("Sie werden zur Hauptseite weitergeleitet...");
                        Console.WriteLine("Mit Enter bestätigen.");
                        Console.ReadKey();
                        break;
                    case 6:
                        abbruch = true;
                        break;
                }
                Console.Clear();
            } while (abbruch == false);


            //Beenden des Programmes
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("Danke für die Nutzung dieses Programmes.\n");
            Console.WriteLine("Ich hoffe, Ihnen hat das Programm zugesagt und Sie werden es weiterempfehlen.");
            Console.WriteLine("Ann-Kathrin Heidmann");

        }
    }
}



Bitte werft nicht mit Fachbegriffen nach mir, mit denen ich nicht umgehen kann. Es wäre schön, wenn ihr mir helfen könntet, das Problem zu verstehen und entsprechend zu lösen.
Ich wäre euch dafür sehr dankbar. :)


Liebe Grüße,
Kathi


PS.: Ignoriert bitte die anderen Fehler einfach, die ihr findet. Ich konnte den Großteil ja noch nicht ausprobieren, da die do-while-Schleife das verhindert. Aber ihr könnt mich darauf aufmerksam machen, wenn es euch zu sehr in den Fingern kribbelt. Nur nicht lösen. :P

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.08.17 18:42 
Problematisch sieht für mich die Verwendung deiner Variablen aus. Die initialisierst du vor der do..while Schleife beim nächsten Schleifendurchlauf haben die also nicht die initialen Werte sondern die die du beim ersten Schleifendurchlauf reingeschrieben hast. Fühlt sich falsch an. Überlege mal ob das setzen der Werte die jetzt vor der do while stattfinden nicht besser in der Schleife stattfinden sollten. Z.B. die auswahlFunktion Variablen. Die wird innerhalb der der while Schleife einmal auf true gesetzt aber nie wieder auf false. Wie sollte die inner while Schleife mit der Bedingung auf auswahlFunktion jemals wieder ausgeführt werden?

Weißt du wie man debuggt? Wenn du dein Programm mal schrittweise ausführst und dir währenddessen die Inhalte der Variablen ansiehst wird dir vermutlich sehr schnell auffallen wo du dich bei deinen Erwartungen vertan hast ;)

Zitat:
Eine Ausführung erfolgt und dann bleibt sie bei der eingebauten switch-Verzweigung hängen


Kannst du näher erläutern was du mit hängenbleiben meinst?
CodeKiddy Threadstarter
Hält's aus hier
Beiträge: 9

WIN 10
C#
BeitragVerfasst: Do 03.08.17 18:59 
Dass mit den Variablen habe ich auch schon überlegt, und versucht, sie nach der switch-Verzweigung wieder auf ihren Standard-Wert zurückzusetzen. Hat bloß absolut nichts gebracht.
Denn da kommt wieder das Problem mit der switch-Verzweigung ins Spiel. Das "Hängenbleiben" sieht folgendermaßen aus: Wenn ich zum Beispiel bei case 1 die Eingabe beende und quasi damit case 1 erfolgreich abschließe, wird die Schleife nicht bei Programmstart wiederholt, sondern springt sofort in die Verzweigung zurück. Damit beginnt case 1 von vorne. Wenn ich dir Variablen auf Standardwerte zurücksetze, kommt nur Mist - nämlich gar nichts mehr, bis auf zwei blinkende Cursor. Erfolgreich aufgehängt.
Ich kann einfach nicht nachvollziehen, warum. Habe auch andere Schleifenarten ausprobiert, doch selbes Ergebnis.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.08.17 19:13 
Zitat:
Dass mit den Variablen habe ich auch schon überlegt, und versucht, sie nach der switch-Verzweigung wieder auf ihren Standard-Wert zurückzusetzen.


Warum danach? Wenn es die Standardwerte eines Schleifendurchlaufs darstellen dann setzte die doch immer am Anfang auf die nötigen Standards. Etwas nachher mitten im Code geradezuziehen ist problematisch. Inbesondere wenn man noch dabei ist mehr oder weniger alles ständig über den Haufen zu werfen ;) Die Wahrscheinlichkeit das du dir nachher Codepfade eingebaut hast die an dem Code der das geradeziehen soll gar nicht langführen ist hoch.

Ich würde einfach mal folgende VAriablen in den do ..while ziehen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
do
{
    index = 0;
    auswahlFunktion = false;
    flagVariable = true;



Zitat:
Ich kann einfach nicht nachvollziehen, warum.


Darum habe ich das mit dem debuggen erwähnt. Starte einfach dein Program mal in dem du F10 in Visual Studio klickst. Und dann mit F10 schrittweise weitersteppst.
Du kannst jetzt dein Programm Zeilenweise durchgehen und wenn du währenddessen das Locals (hier müsste mal jemand aushelfen und sagen wie das auf deutsch heißt) Fenster anzeigst sieht du dort jeweils den aktuellen Inhalt deiner Variablen bei jedem Schritt.
CodeKiddy Threadstarter
Hält's aus hier
Beiträge: 9

WIN 10
C#
BeitragVerfasst: Do 03.08.17 19:22 
In Ordnung. Dann werde ich das mal so ausprobieren.
Danke für deine schnelle Hilfe. :)
CodeKiddy Threadstarter
Hält's aus hier
Beiträge: 9

WIN 10
C#
BeitragVerfasst: Do 03.08.17 19:59 
Vielen herzlichen Dank!!
Indem ich die Variablen im Anfangsbereich der Schleife zurückgesetzt habe, funktioniert die Schleife nun endlich einwandfrei. Diesen Trick werde ich mir auf jeden Fall merken.
Und damit ist meine Frage beantwortet. :)

Damit setze ich dieses Thema auf "Frage beantwortet". ;)

Liebe Grüße,
Kathi