Autor Beitrag
Ritzeratze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: Sa 04.01.14 02:03 
Moin,
frohes neues Jahr nochmal an alle.

Ich versuche mich gerade an einer Aufgabe, die cslaie hier schon einmal gepostet hat.

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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Fernseherklasse
{
    class Fernseher
    {

        // Felddefinition
        public bool an = false;
        public int programm;
        public int lautstaerke;
        // Methoden 
         

        public void poweron()
        {
            an = true;
            programm = 1;
            lautstaerke = 10;
            Console.Clear();
            Console.WriteLine("test");
        }

        
        public void setsound()
        {

        }

        public void setprogramm()
        {

        }

        public void poweroff()
        {

        }


        public void ausgeben()
        {

        }
   
  
    class Programm
    {
        static void Design()
        {
            

            Console.BackgroundColor = ConsoleColor.DarkBlue;
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Title = "Fernsehbedienung ";
            Console.Clear();
            Console.SetCursorPosition(201);
            Console.WriteLine("F E R S E H B E D I E N U N G\n\n");
        }
        
        // Hauptprogramm
        static void Main(string[] args)
        {
            string antwort;                                         // Variable für Case 
            string[] erlaubteZeichen = { "E""P""L""A" };      // Array für die Buchtaben der div. Eingaberoutinen
            int auswahlende = 1;                                    // Schleife für Programmende 

            Fernseher TV = new Fernseher();

            do 
            {
            Design();
            Console.SetCursorPosition(24);
            Console.WriteLine("Bitte wählen Sie die gewünschte Funktion aus!\n\n\n ");

            Console.SetCursorPosition(26);
            Console.WriteLine("Fernseher einschalten:   (E/e)");

            Console.SetCursorPosition(28);
            Console.WriteLine("Programmwahl:            (P/p)");

            Console.SetCursorPosition(210);
            Console.WriteLine("Lautstärke:              (L/l)");

            Console.SetCursorPosition(212);
            Console.WriteLine("Fernseher ausschalten:   (A/a)");

            Console.SetCursorPosition(214);
            Console.Write("Ihre Eingabe lautet: ");

            antwort = Console.ReadLine().ToUpper();

            // Wenn etwas anderes als die erlaubten Zeichen eingegegeben werden.
            if (!erlaubteZeichen.Contains(antwort))
            {
                Console.SetCursorPosition(214);
                Console.WriteLine("Fehler: Ungültige Eingabe! Bitte wählen Sie eine der obigen Funktionen!");
                Console.ReadKey();
                Console.WriteLine("Bitte Taste drücken.");
            }

            switch (antwort)
            {
                case "E":
                    TV.poweron();
                    break;

                case "P":
                     TV.setprogramm();
                    break;

                case "L":
                     TV.setsound();
                    break;

                case "A":
                    TV.poweroff();
                    break;

                default:
                    Console.WriteLine("Sie haben keine gültige Funktion ausgewählt !");
                    break;
            }

           } while (!erlaubteZeichen.Contains(antwort) | (auswahlende != 0));
        }
       }
     }
   }


Wenn ich den Fernseher anschalten möchte ("E") dann passiert eigentlich nichts. Ich bin mir neicht ganz sicher obe ich die Methode richtig aufrufe.
Kann mir da jemand helfen ?
Danke
Ritze

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 04.01.14 03:29 
Etwas verwirrend geschrieben und die if-Überprüfung, die schaut, ob das Zeichen erlaubt ist, sowie auch das Array dafür brauchst du gar nicht.

Ich hab das früher immer so gemacht, dass ich vor der while-Schleife eine Variable vom Typ bool anlege, die sagt, ob die Schleife weiter laufen soll oder eben nicht.
Soll die Schleife unterbrochen werden, also die Eingabeaufforderung beendet, dann wird diese Variable halt auf false gesetzt.
Und das geht auch recht einfach im switch-Block. Beim Default gibst du eine Fehlermeldung aus. Bei den cases setzt du die Variable auf false - zumindest wenn du das so willst.

Denk auch mal über das single responsibility principle nach.
Das ist ein Programmier-Muster, das vor gibt, wie du arbeiten solltest um Probleme zu vermeiden. In deinem Fall ist der Gedanke wichtig, dass jede Methode nur exakt eine Aufgabe haben darf, nicht mehr, nicht weniger. Wenn du dir die Main-Methode so anschaust, wirst du fest stellen, da ist viel zu viel drin. Klar, da liegt das ganze Programm drin, aber einiges kann man in Methoden aus lagern und hat gleich alles viel übersichtlicher. Ich würde z.B. eine Methode schreiben, die für das Darstellen des Menüs da ist. Dann hast du da nur noch stehen WriteMenu() und weißt gleich, was da passiert, bloß auf eine Zeile zusammen geschrumpft.
Das sag ich jetzt auch nicht nur, weil es übersichtlicher ist, sondern auch bei der Fehlersuche hilft. Wenn du irgendeinen logischen Fehler hast, kannst du häufig schon ahnen, wo der liegen könnte, oder wenn eine Methode nur eine Aufgabe hat, ist es viel leichter, zu schauen, ob sie die Aufgabe auch korrekt erledigt.



Zu deinem Problem:

Schau dir mal an, was passiert, nachdem der Fernseher gestartet wurde ;)
Ich geb dir einen Tipp: Da passiert sehr wohl was.
Und noch Einen: Der Computer ist ein verdammt schneller Dummkopf ^^

Du kannst es auch mit dem Debugger raus finden.
Wenn du irgendwo einen Haltepunkt setzt und das Programm dort hält, kannst du mit F10 und F11 Schritt für Schritt weiter laufen.
Ich glaube F11 geht auch in die Methoden rein und du kannst dann in der Methode weiter gehen, während F10 jede Methode, die du siehst, einfach nur ausführst und gleich zum nächsten Schritt über geht.
Da kann es aber sein, dass ich die beiden Tasten gerade vertausche, probiere einfach aus, der Debugger vom Visual Studio ist eine extreme Hilfe bei so Fehlern ^^
Ritzeratze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: Sa 04.01.14 18:41 
HI Palladin,

Danke für die konstruktive Kritik.
Werde mich mal daran setzen und von vorne anfangen.

ggf werde ich Euch noch einmal belästigen.

Gruss Ritze
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 04.01.14 19:41 
Mir hilft es im übrigen immer, wenn ich mir die Methode anschaue und dann überlege, was sie genau tut.
Wenn ich die Tätigkeit dann nicht in einem Satz mit einem Verb zusammen fassen kann, hab ich wahrscheinlich zu viele Tätigkeiten drin. Das Wörtchen 'und' ist dann auch immer so eines, bei dem ich dann nochmal genau darüber nach denke, was die Methode eigentlich tut.



Hast du deinen "Fehler" eigentlich gefunden?



PS:

Diese Seite habe ich gerade gefunden:
Prinzipien der Softwaretechnik
Scheint auf den ersten Blick eine schöne Zusammenfassung der wichtigsten solcher Prinzipien zu sein.
Ritzeratze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: Sa 04.01.14 21:24 
Hi Palladin,

Nein gefunden habe ich in noch nicht. Aber es ist ja auch kein Meister vom Himmel gefallen.

ich versuche mich halt gerade mit selbst definierten Klassen. Irgendwie fehlt mir noch das Zündlein an der Lunte.

Ich könnte mir die Aufgabe von cslaie zwar abschreiben, bringt aber nix. Will das ja selber auf die Reihe bekommen.

Gruss

Ritze
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 04.01.14 22:11 
Du weißt, was der Debugger von Visual Studio ist und wie man einen Haltepunkt setzt?
Nutze das doch einfach mal, setze einen Haltepunkt genau dort hin, wo die Eingabe abgefragt wird. Dann kannst du Zeile für Zeile im Code und in der Konsole beobachten, was dein Programm tut.
Du kannst schauen wie die Eingabe aus sieht, was mit ihr passiert, wie das Programm darauf reagiert und was danach geschieht. Du kannst auch gleichzeitig das Fernseher-Objekt beobachten und wie sich sein Zustand verändert.
Oder du setzt einen Haltepunkt in die Methode, die eigentlich aufgerufen werden soll und schaust, ob das Programm dort landet oder nicht. Wenn nicht, dann ist davor ein Fehler, wenn doch, ist der Fehler danach.

So schwer ist das gar nicht, der Debugger ist nach deinem eigenen Gehirn das beste Hilfsmittel, was du kriegen kannst. ;)


Und nein, nicht abschreiben ^^
Deshalb sage ich dir auch nicht die Ursache, weshalb du keine Reaktion siehst, sondern nur, wie du sie finden kannst.



Zitat:
ich versuche mich halt gerade mit selbst definierten Klassen. Irgendwie fehlt mir noch das Zündlein an der Lunte.


Such erst mal den Fehler, dann schauen wir, warum der Funke nicht über springt ^^
Ritzeratze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: Mo 06.01.14 11:12 
Hallo Palladin,

soweit habe ich das verstanden. Aufgabe funktioniert. Sicherlich kann man das optimieren, aber das Ziel ist erreicht.
Danke nochmals für die Informationen.

Gruss Ritze