Autor Beitrag
Norhug
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 14.04.10 15:46 
Hallo, :wave:

komme beim folgenden Problem einfach nicht weiter:


1) Es ist eine Consolenanwendung, die eine Struktur mit drei int-Mitglieder und eine flagvariable(bool)beinhaltet.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
struct Kiste
        {
            public int Breite;
            public int Hoehe;
            public int Laenge;
            public bool flag;
        }


2) Die Daten werden über einen in der Main-Methode erstellten Array eingelesen.
ausblenden C#-Quelltext
1:
Kiste[] kleineKiste = new Kiste[100];					



3) Es muss ein Hauptmenü in einer eigenen Methode erstellt werden.
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:
static void Hauptmenu(Kiste[] kleineKiste)
        {
            char auswahl;
            
            Console.WriteLine("----- HAUPTMENÜ -----");
            Console.WriteLine();
            Console.WriteLine("A. Eine neue Kiste erstellen");
            Console.WriteLine("B. Eine Kiste löschen");
            Console.WriteLine("C. Eine Kiste ändern");
            Console.WriteLine("D. Eine Kiste anzeigen");
            Console.WriteLine("E. Alle Kiste auflisten");
            Console.WriteLine();
            Console.Write("Wählen Sie ein Menü aus: ");

            auswahl = Convert.ToChar(Console.ReadLine());

            switch (auswahl)
            {
                case 'A':
                case 'a':

                    Console.Clear();

                    for (int index = 1; index < kleineKiste.Length; index++)
                    {
                        Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", index);
                        kleineKiste[index].Breite = Convert.ToInt32(Console.ReadLine());

                        Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", index);
                        kleineKiste[index].Hoehe = Convert.ToInt32(Console.ReadLine());

                        Console.Write("Geben Sie bitte die Länge der {0}. Kiste ein: ", index);
                        kleineKiste[index].Laenge = Convert.ToInt32(Console.ReadLine());
                    }

                    Hauptmenu(kleineKiste);
                    break;




4) Wenn erster Menüpunkt ausgewählt wird: Soll man aufgefordert werden die int-Mitglieder der Struktur mit Werten zu füllen unter Nummer: 1 aber nur einmal, dann soll man zurück zum Hauptmenü kehren. Bei erneuter Auswahl soll die Nummer automatisch auf 2 stehen und so weiter bis 100.

Beispiel:

Hauptmenü:

a. eingeben
b. ändern
c. löschen
d. anzeigen
e. alle 100 auflisten

Punkt "a" wurde ausgewählt!

Breite der 1. Kiste eingeben:
Höhe der 1. Kiste eingeben:
Länge der 1. Kiste eingeben:

Man kommt in das Hauptmenü zurück!

erneut "a" ausgewählt!

Breite der 2. Kiste eingeben:
usw.


Meine Fragen:

- Wie erstelle ich eine Schleife die mein Problem löst? (die Nummerierung kann auch gerne in einer eigenen Methode sein - ist sogar noch besser!)
- Was gibt es noch an dem Quellcode zu bemängeln, speziell was das Einlesen angeht?

Danke im Voraus.


Zuletzt bearbeitet von Norhug am Mi 14.04.10 16:46, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 14.04.10 16:28 
Hallo und :welcome:

Bevor ich mich mit dem Code und deinen Fragen befasse, bitte ich um eine vernünftige Formatierung: Nicht als Zitat, sondern als Code mit [ cs]Code-Inhalt[/cs] (ohne das Leerzeichen bei cs). Bitte auch auf Einrückungen achten und vor dem Absenden die Vorschau benutzen.

Das kannst du auch nachträglich über den Schere-Button erledigen. Danke!

Jürgen
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 14.04.10 18:32 
Danke, so ist es besser.

user profile iconNorhug hat folgendes geschrieben Zum zitierten Posting springen:
4) Wenn erster Menüpunkt ausgewählt wird: Soll man aufgefordert werden die int-Mitglieder der Struktur mit Werten zu füllen unter Nummer: 1 aber nur einmal, dann soll man zurück zum Hauptmenü kehren. Bei erneuter Auswahl soll die Nummer automatisch auf 2 stehen und so weiter bis 100.

Ganz verstehe ich den Ablauf nicht. Klar ist aber: Du brauchst eine Variable für das Formular, die den letzten bearbeiteten Index registriert. Den verwendest du als Start- und/oder Ende-Bedingung der Schleife oder auch für einen einzelnen Durchgang.

user profile iconNorhug hat folgendes geschrieben Zum zitierten Posting springen:
Punkt "a" wurde ausgewählt!...Man kommt in das Hauptmenü zurück!

Du solltest die Abfrage (das Hauptmenü) und die Ausführung in verschiedene Methoden auslagern. In Main gibt es eine einfache Schleife:
ausblenden Quelltext
1:
2:
3:
4:
mache
  nächste Abfrage
  switch
bis Ende gewünscht

Das entspricht schließlich genau deiner Anforderung.

user profile iconNorhug hat folgendes geschrieben Zum zitierten Posting springen:
- Was gibt es noch an dem Quellcode zu bemängeln, speziell was das Einlesen angeht?

Eigentlich ist grundsätzlich eine Klasse besser als eine Struktur, aber in deiner Situation mag eine Struktur noch angehen.

Bist du sicher, dass es immer genau 100 Elemente sind (oder eine andere feste Anzahl)? Dann ist Array in Ordnung. Bei flexiblen Listen solltest du unbedingt auf List<Kiste> umsteigen.

Die Convert-Methoden sind meistens ungünstig. In deinem Fall gilt:
* Mit Console.ReadKey kannst du genau eine Taste, also auch ein Zeichen abfragen. (Na gut, Convert.ToChar liefert das erste Zeichen eines Strings und ist also fast genausogut.)
* Convert.ToInt32(Console.ReadLine()) ist zu ersetzen durch:
ausblenden C#-Quelltext
1:
2:
int value;
ifint.TryParse( Console.ReadLine(), out value ) {...}

Denn was passiert, wenn als Wert ein leerer String oder "Hallo" oder eine Dezimalzahl eingegeben wird...

Darüber hinaus fällt mir aber nichts auf.

Gruß Jürgen
Norhug Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 17.04.10 08:19 
Danke

Könnten Sie mir vielleicht ein Beispiel geben wie ich es mit der for-schleife löse, so das ich den letzten index in einer Variablen merken kann?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 17.04.10 09:42 
Hallo,

user profile iconNorhug hat folgendes geschrieben Zum zitierten Posting springen:
wie ich es mit der for-schleife löse, so das ich den letzten index in einer Variablen merken kann?

"for-Schleife" und "so dass" widerspricht sich etwas. Umgekehrt wird ein Schuh daraus: Du musst dir den letzten Index merken; und der soll für die for-Schleife verwendet werden. Ich dachte es mir etwa so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
// irgendwo beim Programmstart
int lastIndex = -1;   // d.h. es wurde noch nichts bearbeitet

// beim Aufruf der Schleife:
for(int x1 = lastIndex + 1; x1 < 100; x1++) { ... }


user profile iconNorhug hat folgendes geschrieben Zum zitierten Posting springen:
Könnten Sie mir vielleicht ein Beispiel geben

In Foren ist das Duzen üblich; daran habe auch ich mich in der Generation 60+ gewöhnt.

Gruß Jürgen