Programmieraufgabe panel



  • Hallo,

    int[] array = new int[5] { 30, 15, 20, 25, 10 } // Summe 100%;
    

    Das Array ist 5 Elemente groß und die Zahlen bedeuten Prozent.

    Es geht jetzt darum die Fläche eines panel nach den gegeben Prozentzahlen aufzuteilen. Man definiert sich also 5 Farben und wenn Farbe 1 gelb ist dann füllt sie genau 30 Prozent aus. Wenn Farbe 2 grün ist dann füllt sie genau 15 Prozent aus. Wenn Farbe 3 blau ist füllt sie genau 20 Prozent aus. Und so weiter.

    Das array oben ist nur ein Beispiel. Das Programm soll für jedes beliebige array funktionieren . Ganz schön schwer oder.



  • blurry333 schrieb:

    Ganz schön schwer oder.

    Oeehhmmmm....



  • das war hammerschwer

    void panel1_Paint(object sender, PaintEventArgs e)
    {
    	int[] l = new int[5] { 30, 15, 20, 25, 10 };
    	Color[] col = new Color[] { Color.Red, Color.Yellow, Color.Green, Color.Blue, Color.Brown };
    
    	for (int i = 1; i < l.Length; ++i)
    		l[i] += l[i - 1];
    
    	for (int i = l.Length - 1; i >= 0; --i)
    		using (var brush = new SolidBrush(col[i]))
    			e.Graphics.FillRectangle(brush, 0, 0, l[i], panel1.Height);
    }
    


  • Typo:

    e.Graphics.FillRectangle(brush, 0, 0, l[i]*panel1.Width/100, panel1.Height);
    


  • Jo. Auf die Lösung bin ich gerade eben auch gestossen. Ist natürlich die billigste. Besonders schön schaut das nicht aus. Aber Aufgabe erfüllt 🙂

    Ich kenn einen der hat das mit Rekursion und sowas gelöst. Echt übel. Der ist da 3 Tage drangehockt.



  • Heftig, wie sogar bei so einfachem, kurzen Code, der Variablenname 'l' dafür sorgt, dass der Code schwer zu lesen ist.



  • blurry333 schrieb:

    Ich kenn einen der hat das mit Rekursion und sowas gelöst. Echt übel. Der ist da 3 Tage drangehockt.

    was für ein schwachsinn



  • using (var brush = new SolidBrush(col[i]))
    

    Was soll das using da ?



  • Kannste das sowas echt nicht mal googeln?



  • for (int i = l.Length - 1; i >= 0; --i)
            using (var brush = new SolidBrush(col[i]))
                e.Graphics.FillRectangle(brush, 0, 0, l[i], panel1.Height);
    
    // Warum nicht einfach so
        for (int i = l.Length - 1; i >= 0; --i)
        {     var brush = new SolidBrush(col[i]);
                e.Graphics.FillRectangle(brush, 0, 0, l[i], panel1.Height);
        }
    


  • Kannste das sowas echt nicht mal googeln?



  • using als Anweisung definiert einen Bereich in welchem das in der using Anweisung definierte Objekt seine Gültigkeit hat.
    Das in der using Anweisung deklarierte Objekt wird, nachdem der mit using definierte Gültigkeitsbereich verlasen wird, automatisch verworfen (Dispose etc.).



  • for (int i = l.Length - 1; i >= 0; --i)
        {     var brush = new SolidBrush(col[i]);
                e.Graphics.FillRectangle(brush, 0, 0, l[i], panel1.Height);
        }
    

    Würd mich jetzt mal intressieren. Wird

    var brush
    

    jedes mal neu angelegt oder erhält die Variable

    brush
    

    jedesmal eine neue Referenz auf einen SolidBrush ? Wenn die for Schleife zu Ende ist verliert

    brush
    

    seine Gülitigkeit wird aber noch nicht gelöscht da garbage collector nicht sofort aktiv, was mit dem using aber erzwungen werden soll ?



  • Der Grund ist ganz einfach, das nach dem Abarbeiten des usings der Brush disposed wird. - Ansonsten müsste man dies selbst noch durchführen.

    Machs halt mal ohne das using und rufe dispose ebenfalls nicht auf. Das ganze rufst du dann 100 mal auf und wirst schon sehen, warum das using da ist.



  • Irgendwann kommt doch der garbage collector :). Also wird das brush 100 mal neu erzeugt ? Das wundert mich eben weil es doch nur eine Variable namens brush geben darf ??



  • blurry333 schrieb:

    Irgendwann kommt doch der garbage collector :). Also wird das brush 100 mal neu erzeugt ? Das wundert mich eben weil es doch nur eine Variable namens brush geben darf ??

    Hahahaha und wieder ein passendes Gif dazu: Blurry - Held des Tages



  • Demnach wäre es besser, brush nicht bei jedem Schleifen-Durchgang zu deklarieren, sondern vorher...



  • Ja was jetzt ?

    (1) Wird es 100 mal erzeugt ?
    (2) Garbage Collector ?



  • phanzy schrieb:

    Demnach wäre es besser, brush nicht bei jedem Schleifen-Durchgang zu deklarieren, sondern vorher...

    rofl. bist du mit blurry verwandt?



  • blurry333 schrieb:

    Ja was jetzt ?

    (1) Wird es 100 mal erzeugt ?
    (2) Garbage Collector ?

    Wir schreiben das vierte Jahr von blurrys Bemühungen C# zu verstehen und sind über das Theme Scope und Lebenszeit von Objekten noch nicht hinaus. Viel Glück uns alle noch 20 Jahre durchzuhalten.


Anmelden zum Antworten