Bedingung aufstellen
-
FreakY<3Cpp schrieb:
Was soll daran falsch sein?
Alles. Die ganze Bedingung ist falsch. Damit die Schleife abbricht, muß der while Ausdruck 0 ergeben. Die richtige Bedingung hat Diener gleich zu Anfang geschrieben. Im Zweifellsfall kann man sich schnell eine kleine Tabelle machen:
a b !a&&!b 1 1 0 1 0 0 0 1 0 0 0 1
Das Ergebnis entspricht Dieners Formulierung: Der Ausdruck wird Null (Abbruch der Schleife), wenn a==1 oder b==1 oder a==1 && b==1 ist.
-
Big Brother schrieb:
Im Zweifellsfall kann man sich schnell eine kleine Tabelle machen:
naja, a soll eigentlich 4 sein. im zweifelsfall hilft de morgan: ¬ (p ∨ q) → ¬ p ∧ ¬ q, d.h. aus ¬ (a = 4 ∨ b = 1) wird (weils wegen 'while' umgedreht werden muss) a ≠ 4 ∧ b ≠ 1 wurde aber schon erwähnt hier.
btw, tolles forum, kann ja unicode.
-
;fricky schrieb:
naja, a soll eigentlich 4 sein.
Stimmt. Wenn a oder b zwischendurch auch noch andere Werte annehmen können, kann es peinlich werden und die Bedingung tuts auch bei anderen Werten ungleich Null. Sicher ist also nur die Bedingung while(a!=4&&b!), die hier schon öfter gepostet wurde.
Die Tabelle für die Bedingung sieht dann so aus:a b a!=4&&b!=1 4 1 0 4 0 0 0 1 0 0 0 1
Ein Tabellchen immer gutti ist, hilft auch fürs Verständnis der De Morgan'schen Gesetze.
-
Big Brother schrieb:
Die Tabelle für die Bedingung sieht dann so aus:
a b a!=4&&b!=1 4 1 0 4 0 0 0 1 0 0 0 1
Ein Tabellchen immer gutti ist, hilft auch fürs Verständnis der De Morgan'schen Gesetze.
machstu so:
a b schleife verlassen while() --------------------------------------- 4 1 ja 0 4 X ja 0 X 1 ja 0 X X nein 1
ach egal, die for(;;)- oder goto-version gefällt mir immer besser *fg*
-
Ahaa, du meinst so:
do { // ..irgendwas }while(schleife verlassen != ja);
verstehe
Die Formulierung für 'schleife verlassen' hast du vergessen. :p
-
Big Brother schrieb:
Ahaa, du meinst so:
do { // ..irgendwas }while(schleife verlassen != ja);
verstehe
Die Formulierung für 'schleife verlassen' hast du vergessen.ja, es bleibt halt alles doof mit do{...}while(). und jetzt stell dir mal vor, es gibt 3 oder mehr variablen die logisch verknüpft werden sollen. dann gibts ja kaum noch 'nen ausweg aus der for(endlos)-konstruktion.
-
l'abra d'or schrieb:
FreakY<3Cpp schrieb:
Was soll daran falsch sein? Der OP meinte, die Schleife soll abgebrochen werden, wenn a = 4 oder b = 1 ist.
Es soll rausspringen wenn a==4 oder b==1 bzw in beiden Fällen.
Das Problem ist dass
a != 4 or b != 1
wahr ist, wenn a!=4 bzw b!=1. Auch wenn b==1 bzw. a==4! Aber das ist ja nicht die Bedingung. Es soll ja eben abgebrochen werden wenn a==4 oder b==1 ist.
Gut dann mach deine while-Schleife mit while(a == 4 or b == 1)... Dann wird sie solange ausgeführt wie a = 4 und b = 1 ist... Durch a != 4 oder b != 1 wird es abgebrochen, da a = 4 oder b = 1 ist...
-
FreakY<3Cpp schrieb:
Durch a != 4 oder b != 1 wird es abgebrochen, da a = 4 oder b = 1 ist...
eben nicht, dann wird nur abgebrochen wenn a=4 UND b=1 ist, nicht aber, wenn nur eins davon zutrifft. der komplette ausdruck muss verdreht werden, einfach aus 'gleich' 'ungleich' machen reicht nicht. lies doch den thread nochmal.
-
;fricky schrieb:
FreakY<3Cpp schrieb:
Und das hier wieder eine endlose Diskussion entsteht, war zu erwarten, weil sich jeder für den Klügeren hält
das schimpft sich 'erfahrungsaustausch'. man bekommt mit, wie andere darüber denken. ich kann daran nix negatives sehen.
das sehe ich genauso denn von den De Morgan'schen Gesetzen hab ich noch nie was gehört und mal wieder was dazu gelernt, danke ;fricky für diesen post
lg lolo
-
axo bevor ichs vergess bitte quält mich nicht mit or and usw. in euerem code, auch wenns euere entwicklungs umgebungen highlighten können und anscheinend auch das forum. Wenn ich sowas hätte lesen wollen hätt ich mir ne andere sprache gesucht.
-
noobLolo schrieb:
...von den De Morgan'schen Gesetzen hab ich noch nie was gehört und mal wieder was dazu gelernt, danke ;fricky für diesen post
bedank dich lieber bei micro-ngbd, der hat auch 'nen link dazu gepostet.
-
noobLolo schrieb:
das sehe ich genauso denn von den De Morgan'schen Gesetzen hab ich noch nie was gehört und mal wieder was dazu gelernt
Da ist ja nicht mehr dran als der Name, den Rest hast du sicher schon vorher gewusst. Wenn sowohl eines als auch ein anderes wahr sind, dann heisst das, dass weder das eine noch das andere falsch ist.
^^Und was sagt Wikipedia? Das war schon im Mittelalter bekannt!;fricky schrieb:
btw, tolles forum, kann ja unicode.
-
Btw: warum sagen eigentlich so viele Leute "Theorem" zu den beiden Sätzen? Die sind doch leicht beweisbar, oder?
http://www.google.com/search?q=de+morgan+theorem
-
Theorem bedeutet ja auch dass es (einfach) beweisbar ist.
-
Genmutant schrieb:
Theorem bedeutet ja auch dass es (einfach) beweisbar ist.
Das erklärt's freilich. Griechisch müsste man können.
-
µngbd schrieb:
... den Rest hast du sicher schon vorher gewusst
treffender wäre wahrscheinlich, das es schon öfter in meinem trial and error code vorgekommen ist ^^
;fricky schrieb:
bedank dich lieber bei micro-ngbd, der hat auch 'nen link dazu gepostet.
das würd ich gern hiermit noch nachholen, danke µngbd für den post und link
lg lolo
-
;fricky ich kenn dich und weiß eig. das du Ahnung hast, aber erklär mir mal warum
int main() { int a = 4; do { printf("Ehm"); }while(a != 4); }
abgebrochen wird?
Entweder hab ich einen kleinen Übersichtsfehler, den ich eig. sonst nicht mache, aber mein Code sollte eig. richtig sein. Anscheinend übersehe ich ein kleines Merkmal, da aber a = 4 entspricht, wird die do-while nur einmal ausgeführt.
-
FreakY<3Cpp schrieb:
;fricky ich kenn dich und weiß eig. das du Ahnung hast...
danke für die blumen, aber betrachte meine postings bitte künftig kritischer, denn ich schreibe meist schneller als ich denke. sorry, ist aber so.
FreakY<3Cpp schrieb:
Entweder hab ich einen kleinen Übersichtsfehler...
ja, hast du. du benutzt nur eine variable. die negation von a==4 ist a!=4, das stimmt. aber bei zwei variablen mit einer or-verknüpfung, also wenn du (a==4 || b==1) negieren willst, dann kannst du es entweder als: !(a==4 || b==1) schreiben, oder, wenn du die klammern auflöst als: a!=4 && b!=1 (aus dem 'or' wird dann ein 'and'). ebenso mit drei variablen wird aus !(a==4 || b==1 || c==19) das: a!=4 && b!=1 && c!=19 usw. analog dazu wird aus !(a==4 && b==1) das: a!=4 || b =1 (also ein 'and' im ursprüglichen ausdruck wird zum 'or', wenn der ganze ausdruck negiert und die klammern beseitigt werden). wenn's nicht verständlich ist, probier's einfach mal aus:
int main(void) { int a, b; for (a=0; a<10; a++) for (b=0; b<10; b++) printf ( "%d %d\n", a == 4 || b == 1, // a=4 oder b=1 ? a != 4 && b != 1 // das gegenteil davon ); }