Autor Beitrag
OldCat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Di 21.12.21 17:39 
Liebe Gemeinschaft,

erneut wende ich mich an euch.

In folgender Übungsaufgabe des Buches C# Programmieren: für Einsteiger: Der leichte Weg zum C#-Experten! (Visual Studio 2019), Michael Bonacina findet sich zum Thema "Methoden im Programm verwenden" folgende Aufgabestellung:

1.) Schreiben Sie das Programm aus Übungsaufgabe 2 in Kapitel 8 =>
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:
namespace Bonacina_8_2
{
    class Bike
    {
        public string Type;
        public string Color;
        public int FrameSize;
        public int ImpellerSize;
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            Bike myBike = new Bike();

            //myBike.Type = "Mountain Bike";
            //myBike.Color = "Black & Red";
            //myBike.FrameSize = 28;
            //myBike.ImpellerSize = 56;

            System.Console.Write("Please type in your type of the bike: ");
            myBike.Type = System.Console.ReadLine();
            System.Console.Write("Please type in your color of the bike: ");
            myBike.Color = System.Console.ReadLine();
            System.Console.Write("Please type in your frame size of the bike: ");
            myBike.FrameSize = int.Parse(System.Console.ReadLine());
            System.Console.Write("Please type in your impeller size of the bike: ");
            myBike.ImpellerSize = int.Parse(System.Console.ReadLine());

            System.Console.WriteLine($"The type of the bike is: {myBike.Type}");
            System.Console.WriteLine($"The color of the bike is: {myBike.Color}");
            System.Console.WriteLine($"The frame size of the bike is: {myBike.FrameSize}");
            System.Console.WriteLine($"The impeller size of the bike is: {myBike.ImpellerSize}");

            System.Console.WriteLine(System.Console.ReadKey());
        }
    }
}
so um, dass es eine Methode verwendet, um die Attribute des Objekts auszugeben.
2.) Erstellen Sie nun auch Methoden, um die Nutzereingaben im Objekt zu speichern.
3.) Objekte lassen sich auch in Listen einfügen. Dazu ist es notwendig, anstatt eines Variablentps den Namen der entsprechenden Klasse bei der Erstellung der Liste anzugeben. Damit ist es möglich, beliebig viele Objekte aufzunehmen.
4.) Dazu soll eine Schleife entstehen, die den Anwender nach dem Durchlauf fragt, ob er fortfahren will. Die neuen Objekte für die Fahrräder müssen im Add-Befehl mit dem Schlüsselbegriff new erzeugt werden.


Bis dahin alles kein Problem, aber jetzt kam es:
5.)Die Attribute sollen mit den bereits vorhanden Methoden eingefügt werden. Dazu ist es notwendig, den Index des aktuellen Listenelements zu kennen. Zu diesem Zweck ist es sinnvoll, einen Zähler einzufügen.
6.) Die Ausgabe der Werte soll mit einer foreach Schleife erfolgen ...


Zwar weiß ich aus den Übungen mit Schleifen, was ein Zähler ist, doch hier (in einer do_while Schleife einer Liste) verknotete sich mein Gehirn. Mir wurde nicht klar, wie und wo ich den Zähler in den Code integrieren soll. Nach einem Tag des Versagens, schaute ich in die Lösung und sah einen Code, auf den ich im Leben nicht gekommen wäre, da vorher noch nie gesehen:

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:
namespace BonacinaÜbungKap9_3
{
    class Bike
    {
        public string Type;
        public string Color;
        public int ImpellerSize;
        public int FrameSize;

        public void DisplayBikeObj()
        {
            System.Console.WriteLine(Type);
            System.Console.WriteLine(Color);
            System.Console.WriteLine(ImpellerSize);
            System.Console.WriteLine(FrameSize);
        }

        public void setType(string typeBike)
        {
            this.Type = typeBike;
        }

        public void setColor(string bikeColor)
        {
            this.Color = bikeColor;
        }

        public void setImpellerSize(int customImpellerSize)
        {
            this.ImpellerSize = customImpellerSize;
        }

        public void setFrameSize(int customFrameSize)
        {
            this.FrameSize = customFrameSize;
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            // Bike yourBike = new Bike();
            System.Collections.Generic.List<Bike> bikes = new System.Collections.Generic.List<Bike>();
            char repeat;
            int counter = 0;

            do
            {
                bikes.Add(new Bike());

                System.Console.Write("Please type in your desired type: ");
                bikes[counter].setType(System.Console.ReadLine());

                System.Console.Write("Please type in your desired color: ");
                bikes[counter].setColor(System.Console.ReadLine());

                System.Console.Write("Please type in your desired impeller size: ");
                bikes[counter].setImpellerSize(int.Parse(System.Console.ReadLine()));

                System.Console.Write("Please type in your desired frame size: ");
                bikes[counter].setFrameSize(int.Parse(System.Console.ReadLine()));
                counter++;

                System.Console.WriteLine("Do you wanna add one more? (y/n)");
                repeat = char.Parse(System.Console.ReadLine());

            } while (repeat == 'y');

            foreach (Bike customBikes in bikes)
            {
                customBikes.DisplayBikeObj();
            }

            System.Console.ReadKey();
        }
    }
}


ausblenden C#-Quelltext
1:
bikes[counter].setType(System.Console.ReadLine());					

Den Zähler fand ich als ?Array? wieder? Wie kann das sein? Oder ist das kein Array? Denn nirgends wird ein Array vorher definiert. Wenn es ein Array sein soll, wieso wird das Array vorher nirgends ins Leben gerufen? Und wenn es kein Array ist, was zum Henker ist das? Das Buch geht in keiner Sekunde auf diese "Struktur" ein.

Eine weitere Frage, die sich mir im Zusammenhang stellte ist: Wenn ich diese arrayartige Struktur weg lasse, kann ich die Methoden nicht mehr über den Operator für den Memberzugriff aufrufen. Auch das ist für mich ein ungelöstes Rätsel.
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: Di 21.12.21 19:01 
Zitat:
Nach einem Tag des Versagens, schaute ich in die Lösung und sah einen Code, auf den ich im Leben nicht gekommen wäre, da vorher noch nie gesehen:

Die Verwendung von counter ist da auch so schwer nachzuvollziehen weil man das so eher nicht programmieren würde. Die meisten hier hätten sicherlich einfach in der Schleife eine neue Bike Instanz erzeugt an diesem die von der Console eingelesenen Daten gesetzt und dann damit bikes.Add aufgerufen. Der counter ist unnötig bzw. nicht mal hilfreich. Vermutlich wieder so ein Beispielcode Problem wo man die Verwendung eines Indexers zeigen wollte (das mit den []) aber das Beispiel ist halt schlecht weil es ohne besser ginge ;)

Zitat:
Den Zähler fand ich als ?Array? wieder? Wie kann das sein? Oder ist das kein Array?


;) Es ist einfach ein indexierter Zugriff mit dem Indexer Operator []. Arrays haben den aber andere Klassen wie Listen/Mengen etc. können den auch implementieren. Wie was warum würde jetzt vermutlich wieder zu weit abseits führen und den Blick versperren. Aber die List<T>, eine generische Liste, hat den halt auch um etwas ähnliches zu tun. Einfach gezielt auf ein Element in der Liste zugreifen zu können über etwas das näherungsweise einer Position entspricht. Möglicherweise hilft es dir diese List<T> Klasse so vorzustellen das da ein Array irgendwie drinsteckt. Aber da man sich bei Array die Größe vorher überlegen muss und das meist nicht geht und das vergrößern/verkleinern des Arrays "aufwendiger" Code ist hat man das halt schonmal gemacht in eine Klasse gepackt die dieses Handling einfacher macht und diese Klasse List<T> genannt.

Für diesen Beitrag haben gedankt: OldCat
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Di 21.12.21 19:29 
Ralf Jansen hat folgendes geschrieben:
;) Es ist einfach ein indexierter Zugriff mit dem Indexer Operator []


Ein indexer Operator also ... hatte das Buch einfach nicht vorgestellt, diesen Operator. Ich danke Dir! Werde mich mal über diesen Operator schlau machen.

Moderiert von user profile iconTh69: Zitat korrigiert.
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Di 21.12.21 23:43 
Da ich aus dem Pairprogramming weiß, das du einen Schwung Hintergrundinfos verdauen kannst:

Das mit den eckigen Klammern stammt tatsächlich von den Arrays ;)

So kann man mit
ausblenden C#-Quelltext
1:
MyArray[4] = 0;					


ja problemlos auf das fünfte Element zugreifen. Als man die Listen einführte, hatte sich das Zugreifen auf einzelne Elemente per [] fest etabliert. Also ermöglichte man über den Indexer-Operator eben genau diesen gewohnten Weg, auf die einzelnen Elemente zuzugreifen.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.

Für diesen Beitrag haben gedankt: OldCat