• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[C#] Warum funktioniert das so und nicht anders?

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
Ich mache gerade eine Übung aus einem Buch. Von der Sache her habe ich das Schleifenprinzip ja schon kapiert, aber bei der praktischen Anwendung bin ich auf ein Problem gestoßen und ich kapiere nicht, warum Lösung 1 (aus dem Buch) funktioniert und Lösung 2 (meine Lösung) nicht.

Lösung 1:
[src=csharp]
private void cmdAnzeigen_Click(object sender, EventArgs e)
{
double d = Convert.ToDouble(txtEingabe.Text);
lblAnzeigen.Text = "";

while(d >= 0.001)
{
d = d / 2;
lblAnzeigen.Text += d + "\n";
}
}[/src]

Lösung 2:
[src=csharp] private void cmdAnzeigen_Click(object sender, EventArgs e)
{
double d = Convert.ToDouble(txtEingabe.Text), summe = 0;
lblAnzeigen.Text = "";

while(summe >= 0.001)
{
summe = d / 2;
lblAnzeigen.Text += summe + "\n";
}
}[/src]

Irritierend finde ich auch, dass ich bei der summe bei der Deklarierung erstmal einen Wert zuweisen muss und ein einfaches double = summe nicht ausreicht. Unterm Strich müsste das aber egal sein, weil 0 ist immernoch größer als 0.001 und wenn die Schleife das erste mal durchlaufen wird, wird die Variable summe ohnehin überschrieben.

Kann mir jemand helfen?
 
Zuletzt bearbeitet:

KcDaRookie

Temporär Suspendiert :D

Registriert
14 Juli 2013
Beiträge
402
Seit wann ist 0 größer als 0,001?
Und du musst Summe mit irgendwas belegen weil du mit 0,001 vergleichst, ohne Wert kann dort nichts verglichen werden.
 

Larius

OutOfOrder

Registriert
12 Juli 2013
Beiträge
5.792
Probier mal statt double den Datentyp Long aus. Vermutlich rennst du nämlich in die Ungenauigkeit von Double hinein ;)

Nicht genau gelesen, am Problem vorbei geredet
 
Zuletzt bearbeitet:

electric.larry

\''; DROP TABLE user; --
Teammitglied

Registriert
13 Dez. 2014
Beiträge
4.549
Ort
Raum 43
du hast recht, 0.001 ist groesser als 0.000. aber dein code sagt ja:

variable summe ist 0.
waehrend summe (also 0.000) groesser oder gleich wie 0.001 ist, mach irgendetwas.
das "irgendetwas" wird dann nicht gemacht, weil 0.000 ja eben kleiner und nicht größer oder gleich 0.001 ist.

damit dein code das gleiche macht wie das original muesstest du summe so deklarieren:

[src=csharp]double d = Convert.ToDouble(txtEingabe.Text); //d hat den eingegebenen wert
double summe = d; //summe hat jetzt auch den eingegebenen wert[/src]

du hingegen machst:

[src=csharp]double summe = 0; //summe ist 0, nicht die eingabe des benutzers[/src]

siehst du den unterschied? waehrend die while schleife im original, den urspruenglichen eingegebenen wert mit 0.001 vergleicht, schaust du dir an ob 0 gleich mit 0.001 ist.

Irritierend finde ich auch, dass ich bei der summe bei der Deklarierung erstmal einen Wert zuweisen muss und ein einfaches double = summe nicht ausreicht

das musst du auch nicht unbedingt tun. du wuerdest die variable "summe" zB so mit 0 korrekt deklarieren:

[src=csharp]double summe;[/src]

ich finde es aber trotzdem sauberer, wenn man den grundwert einer variable selbst definiert, auch wenn es nur eine 0 ist, die vom constructor ohnehin zugewiesen werden wuerde. wenn man zB in C/C++ einen pointer deklariert ohne ihm einen definierten wert mit zu geben, zeigt der irgendwo ins speicher-nirvana. ("dangling pointers" zu debuggen macht natuelrich besonders viel spass.)

um deinen code lesbarer zu machen, wuerd ich persoenlich die variable "summe" auf einer eigenen zeile deklarieren. es ist zwar voellig korrekt wie du es gemacht hast, wenn man aber im team programmiert ist lesbarkeit wichtig. wenn leute schnell einen code ueberfliegen um zu verstehen was eine funktion macht, wird eine zweite deklaration in einer so lange textzeile leicht uebersehen.
 
Zuletzt bearbeitet:

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #7
Danke für die ausführliche Erklärung auch auch gleich die Lösung, wie ich es richtig gemacht hätte.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
btw. so aus der Makroperspektive ist es gut, wenn du solche Fehler möglichst selber findest soweit es deine Frustrationstoleranz zulässt.
Fehlerfindkompetenz ist eines der wichtiges Dinge beim Proggen :D, wenn man solche Logikfehler routinemässig finden kann ist das äusserst hilfreich.
 

Beezle

Mit-Glied

Registriert
15 Juli 2013
Beiträge
472
Das Problem hatte aber mit der Programmiererei an sich nix zu tun. Da fehlte wohl eher das grundlegende mathematische Verständnis. Aber das scheint ja jetzt geklärt zu sein. :)
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Am mathematischen Verständnis lag es nicht. Das "0 < 0,01" gilt war klar. Es ging mehr um den Programmfluss, den zu sehen Bedarf natürlich auch Übung. Den kann man zwar oft auch mit Debugger nachvollziehen, aber der sagt einem auch nur begrenzt wie der entsteht.
Ich erwähne das extra, weil das imHo Themen sind über die relativ selten gesprochen wird und meines Erachtens nach interessant ist für User die gerade erste Programmiererfahrung sammeln.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #12
Naja gut, das mit 0 und 0,xx war schon ein Denkfehler meinerseits. Kann passieren denke ich.
Wens aber interessiert: Meine Mathe-Abschlussprüfung (Realschule) habe ich mit 5,4 hingelegt und im Abschlusszeugnis steht zwar eine 4, die Kommanote ist aber 4,4 wie mir der Lehrer damals gesagt hat.

Das erklärt dann vielleicht auch, warum ich die Grundaufgaben in der Programmierung noch relativ einfach hinbekomme, aber fast jedes mal, wenn es es etwas komplexer wird auf die Fresse falle und alle Erklärungsversuche unverstanden bleiben. Aber ich geb nicht auf :D
 

Timon3

Team ModMii

Registriert
17 Juli 2013
Beiträge
499
Ich bin recht spät, aber noch ein Detail (falls es schon genannt wurde, hab ich es wohl überlesen): die untere Schleife kann in einer Endlosschleife enden.

[src=csharp] private void cmdAnzeigen_Click(object sender, EventArgs e)
{
double d = Convert.ToDouble(txtEingabe.Text), summe = 0;
lblAnzeigen.Text = "";

while(summe >= 0.001)
{
summe = d / 2;
lblAnzeigen.Text += summe + "\n";
}
}[/src]

Das Problem ist, dass du niemals d setzt. Wenn summe jetzt anfangs größer/gleich 0.001 ist und d größer/gleich 0.002, wird die Schleife niemals abbrechen, da d konstant bleibt und daher summe auch. Um die Funktionalität vom oberen Beispiel nachzubilden, müsstest du schreiben d = summe = d / 2.
 
Oben