C# Ampel Programmierung

ok, geben wir folgendes vor: bei Klick auf den Button soll in die nächste Ampelphase gewechselt werden
Wo gibts denn sowas? Klingt nach nem ziemlichen Verkehrschaos...
Danke für die Hilfe, ich darf aber wie gsagt nur If&else benutzen, bei timern, true ect. sind wir nochgarnicht...
Du kannst mit IF einen Timer bauen....

Code:
HALLO
k = k + 1
if k = 1000 
goto TSCHUESS
else
goto HALLO
endif
TSCHUESS

@Gonzo: Wer programmiert denn für Windows? ^^
 
stef, wenn in ner Vorlesung/Unterrichtsstunde mit Hochsprachen gearbeitet wird, ist es lebensgefährlich "gotos" vorzuschlagen :D
 
Warum das? "gotos" rocken total!
Sie haben ja noch keine Do-While-Schleife, da lässt sich das nicht anders lösen.
 
Wo gibts denn sowas? Klingt nach nem ziemlichen Verkehrschaos...
wie schon erwähnt würde ich Ampeln über Timer oder Sensoren schalten ... aber in seiner Aufgabenstellung wird scheinbar ein Button verlangt, also muss ich dem ja irgendeinen Sinn geben
Danke für die Hilfe, ich darf aber wie gsagt nur If&else benutzen, bei timern, true ect. sind wir nochgarnicht...
Hier nochmal der Code:

C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Ample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void cmdStart_Click(object sender, EventArgs e)
        {
            if (pnlRot.BackColor == Color.Gray)
            {
                this.pnlRot.BackColor = Color.Red;
            }


            else if (pnlRot.BackColor == Color.Red)
            {
                this.pnlGelb.BackColor = Color.Yellow;
                    
            }

       
        }
    }
}

Ich will erst alle Farben haben.
Also Klick1 Rot geht an
Klick 2 Gelb geht an, Rot bleibt.
Klick 3 Grün geht an, Rot u. Gelb bleibt.

Das will ich erstmal haben, dannach will ich erst Rot nachdem Gelb aufleutet, wieder grau machen.

Dannach mache ich noch ein Reset-Knopf.

Aber zuerst alle Farben haben.

Habs schon versucht, aber ich bekomme einfach das letzte Panel nicht zum leuchten. =/
ich denke, du musst auf jeden Fall mit gekoppelten Bedingungen arbeiten, also "and"

weil: die Abfrage, ob das Feld für rot gerade grau ist, zeigt ja noch nicht, ob gerade gelb oder grün an ist. Wahrscheinlich entsteht da auch der Fehler beim letzten Panel, da sich dann möglicherweise eine Abfrage überschneidet oder so

wenn du meine Logik von oben so umbaust, dass du die Check-Felder weg lässt und einfach nur die aktuellen Farben abfragst, müsstest du ohne True und False auskommen.

ich versuche es mal:
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Ample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void cmdStart_Click(object sender, EventArgs e)
        {
            if (pnlRot.BackColor == Color.Gray) and (pnlGruen.BackColor == Color.Gray)
            {
                this.pnlRot.BackColor = Color.Red;
                this.pnlGelb.BackColor = Color.Gray;
            }


            else if (pnlRot.BackColor == Color.Red) and (pnlGelb.BackColor == Color.Gray)
            {
                this.pnlRot.BackColor = Color.Red;
                this.pnlGelb.BackColor = Color.Yellow;
                    
            }


            else if (pnlRot.BackColor == Color.Red) and (pnlGelb.BackColor == Color.Yellow)
            {
                this.pnlRot.BackColor = Color.Gray;
                this.pnlGelb.BackColor = Color.Gray;
                this.pnlGruen.BackColor = Color.Gruen;
                    
            }


            else if (pnlGelb.BackColor == Color.Gray) and (pnlGruen.BackColor == Color.Green)
            {
                this.pnlGelb.BackColor = Color.Yellow;
                this.pnlGruen.BackColor = Color.Gray;
                    
            }
       
        }
    }
}
ich kann leider kein C, daher weiß ich nicht, ob ich die Zuweisungen so richtig gemacht habe, aber von der Logik her sollte es so stimmen

nochmal zur Erklärung:

Abfrage 1: fragt ab, ob Rot und Grün aus sind -> nur Gelb ist an -> Schaltung auf Rot
Abfrage 2: fragt ab, ob Rot an und Gelb aus ist -> Gelb wird dazu geschaltet
Abfrage 3: fragt ab, ob Rot und Gelb an sind -> beide werden aus- und Grün wird angeschaltet
Abfrage 4: fragt ab, ob Gelb aus und Grün an ist -> Gelb schaltet an, Grün aus

der Vereinfachung halber würde ich das ganze beginnen, indem ich die Ampel auf Rot setze, bevor die Abfrage beginnt. So wie ich es gemacht habe, müsste es aber das selbe bewirken
 
Du kannst mit IF einen Timer bauen....

Code:
HALLO
k = k + 1
if k = 1000 
goto TSCHUESS
else
goto HALLO
endif
TSCHUESS

Ein ziemlicher busy-Timer. Man hätte zumindest noch ein paar schöne Interpolationsfehler abschätzen lassen können, wenn man schon die CPU auf 100% Auslastung bringen will.

Abfrage 1: fragt ab, ob Rot und Grün aus sind -> nur Gelb ist an -> Schaltung auf Rot
Abfrage 2: fragt ab, ob Rot an und Gelb aus ist -> Gelb wird dazu geschaltet
Abfrage 3: fragt ab, ob Rot und Gelb an sind -> beide werden aus- und Grün wird angeschaltet
Abfrage 4: fragt ab, ob Gelb aus und Grün an ist -> Gelb schaltet an, Grün aus

Ich wäre ja für eine FLAG, denn ich mag das MVC-Pattern.
D.h. man sollte den Status der Ampel in einer anderen Variablen abstrahieren und sich nicht danach richten, welche Farben auf dem Panel angezeigt werden (wobei dies natürlich korrelieren sollte).
Somit spart man sich Arbeit bei späteren Änderungen der Farben und/oder neuen Phasen.
Ein negativer Aspekt ist jedoch, dass man damit dem SE-Institut einen gefallen tut :/
 
Ich wäre ja für eine FLAG, denn ich mag das MVC-Pattern.
D.h. man sollte den Status der Ampel in einer anderen Variablen abstrahieren und sich nicht danach richten, welche Farben auf dem Panel angezeigt werden (wobei dies natürlich korrelieren sollte).
das hatte ich doch mit meinen Check-Variablen und True/False-Abfragen versucht, aber er hat ja geschrieben, dass sie das nicht dürfen

oder meinst du das so, dass man jedem Ampelstatus beispielsweise eine Nummer zuweist, also

Nur Rot = 1
Rot und Gelb = 2
Nur Gelb = 3
Nur Grün = 4

und den dann entsprechend auf einen Variable schreibt, abfragt und neu zuweist ?
 
Jungs zokker hat das Fach seit 2 Wochen ich glaub nich das er überhaupt schon bool kennt :D
BTW: Unsere Ampeln ham wirklich keine Rotgelbphase^^
 
Dann bist du wohl nicht in Deutschland:

Rot-Gelb: Zwischen Rot und Grün: Achtung, gleich wird die Erlaubnis zur Fahrt gegeben (zum Beispiel in Deutschland, Großbritannien, Österreich, Ungarn, Schweiz, Polen, Norwegen, Russland, Schweden, Saudi-Arabien)
http://de.wikipedia.org/wiki/Ampel
 
Naja ich war aufn Weg ins Bierzelt da hatte ich das Vergnügen (noch im nüchternen Zustand-) ner Ampel zuschauen zu dürfen^^
Aber hey jetzt kann ich wenigstens sagen wir ham die geilsten Ampeln von Deutschland :D
 
oder meinst du das so, dass man jedem Ampelstatus beispielsweise eine Nummer zuweist, also

Nur Rot = 1
Rot und Gelb = 2
Nur Gelb = 3
Nur Grün = 4

und den dann entsprechend auf einen Variable schreibt, abfragt und neu zuweist ?

Genau, ich würde eine Variable anlegen und dieser Nummern (von 0 beginnend) zuweisen, wobei jede Zahl einen Zustand darstellt.
Man könnte dies dann noch durch Switch und Konstanten verschönern, aber das ist wohl noch nicht bekannt.

Wenn man übrigens pedantisch sein will, dann wissen wir auch gar nicht, ob er AND verwenden darf, da nicht geklärt ist, welche Operatoren bekannt sind.

Habs schon versucht, aber ich bekomme einfach das letzte Panel nicht zum leuchten. =/
Ich denke es wäre sehr gut, wenn du uns zeigst, was du für das letzte Panel programmiert hast, denn wenn du

C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Ample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void cmdStart_Click(object sender, EventArgs e)
        {
            if (pnlRot.BackColor == Color.Gray)
            {
                this.pnlRot.BackColor = Color.Red;
            }

            else if (pnlRot.BackColor == Color.Red)
            {
                this.pnlGelb.BackColor = Color.Yellow;
                    
            }

            else if (pnlGelb.BackColor == Color.Yellow)
            {
                this.pnlGreen.BackColor = Color.Green;
                    
            }
        }
    }
}

geschrieben hast, dann erreicht er niemals

C#:
            else if (pnlGelb.BackColor == Color.Yellow)
            {
                this.pnlGreen.BackColor = Color.Green;
                    
            }

da er ständig bei

C#:
            else if (pnlRot.BackColor == Color.Red)
            {
                this.pnlGelb.BackColor = Color.Yellow;
                    
            }
abbrich, denn die rote Lampe leuchtet ja weiterhin.


Nur mit IF kann es jedoch ohne einen weiteren Wert gar nicht lösbar sein, dann wenn du bei Gelb bist, woher willst du dann wissen, ob es nun von Gelb -> Grün, oder von Gelb -> Rot geht?
 
Code:
if (pnlRot.BackColor == Color.Gray) and (pnlGruen.BackColor == Color.Gray)
Bin mir da jetzt nicht 100% sicher, in C(#) gibt es doch kein 'and' sondern '&&' oder ?
Ausserdem muss der ganze Ausdruck nach dem 'if' noch eingeklammert werden weil nach if() sonst Schluss wäre mit dem if.
Code:
if ((pnlRot.BackColor == Color.Gray) && (pnlGruen.BackColor == Color.Gray))
Mal abgesehen davon würde ich das wahrscheinlich nicht mit if/else bzw. else if lösen, sondern einfach nur Klicks mitzählen und dann
dementsprechend die Ampel schalten, aber das wäre ja sozusagen Thema verfehlt ;).
 
Last edited:
Code:
if (pnlRot.BackColor == Color.Gray) and (pnlGruen.BackColor == Color.Gray)
Bin mir da jetzt nicht 100% sicher, in C(#) gibt es doch kein 'and' sondern '&&' oder ?

Ja, sofern man es nicht um AND erweitert gibt es zunächst nur &&
 
Dass man sich nahezu alles deklarieren kann ist schon klar ;)
Aber wozu 'and' deklarieren wenn es doch schon '&&' gibt ?
 
Ich finde, dass man AND besser erkennen kann, daher definiere ich es meist über den Präprozessor (in C).
 
Ansichtssache ;)
Finde es nur unnötig, falls sich mal jemand anderes den Code ansieht stolpert er erst mal darüber.
AND, wat soll dat denn ? :p
Kann aber auch sein, dass ich so auf C ( das einzig wahre :D ) fixiert bin, dass mir AND ( Basic ? ) einfach zuwider ist.
 
Code:
if (pnlRot.BackColor == Color.Gray) and (pnlGruen.BackColor == Color.Gray)
Bin mir da jetzt nicht 100% sicher, in C(#) gibt es doch kein 'and' sondern '&&' oder ?
Ausserdem muss der ganze Ausdruck nach dem 'if' noch eingeklammert werden weil nach if() sonst Schluss wäre mit dem if.
Code:
if ((pnlRot.BackColor == Color.Gray) && (pnlGruen.BackColor == Color.Gray))
jo danke für's Korrigieren, ich kann wie gesagt leider kein C und kenne demzufolge die Schüsselwörter/Befehle da nicht :)
Nur mit IF kann es jedoch ohne einen weiteren Wert gar nicht lösbar sein, dann wenn du bei Gelb bist, woher willst du dann wissen, ob es nun von Gelb -> Grün, oder von Gelb -> Rot geht?
der Meinung bin auch auch, dass es nur mit if/then nicht lösbar ist - entweder man nutzt eben "and", oder eine Status-Variable
 
der Meinung bin auch auch, dass es nur mit if/then nicht lösbar ist - entweder man nutzt eben "and", oder eine Status-Variable

Ich sehe auch nicht, dass man es durch hinzunahme von AND lösen könnte.
Etwas wie AND kann man ja durch sehr viele Verschachtelte IFs bekommen.

Das Problem ist, dass es 2 verschiedene Zustände für Gelb geben muss (Grundlagen digitaler Systeme, theo. Informatik etc. anyone?), jedoch kann man diesen nicht erzeugen, da man nur die Eingangssignale hat und man sich den Zustand nicht merken kann.

Bildlich gesprochen:

1. Fall:
Rot aus
Gelb an
Grün aus

schalte Grün an.

2. Fall:
Rot aus
Gelb an
Grün aus

schalte Rot an.

Wie soll denn das Programm entscheiden, ob nun der 1. oder der 2. Fall eingetreten ist? Würfeln, Münze werfen?
Wäre eine ziemlich lustige Ampel

Rot -> Gelb -> Rot -> Gelb -> Rot *MUAHAHAHA*

Ansichtssache ;)
Finde es nur unnötig, falls sich mal jemand anderes den Code ansieht stolpert er erst mal darüber.
AND, wat soll dat denn ? :p
Kann aber auch sein, dass ich so auf C ( das einzig wahre :D ) fixiert bin, dass mir AND ( Basic ? ) einfach zuwider ist.

Meine ersten längeren Programmierstunden habe ich mit PHP verbracht und dort ist sowohl && als auch AND verfügbar, wobei ich irgendwann AND favorisiert habe.
 
Deswegen gibts doch auch rot-gelb bevor grün kommt und nicht nur rot...
 
Back
Top