Plus- und Minuszahlen Umwandlung
juha
- perl
Hallo Zusammen
ich habe in $zeit eine Minuszahl (zum beispiel -45 oder -120), jetzt möchte ich diese Minuszahl in eine Pluszahl umwandeln. Wie ist das möglich? Es kann jedesmal eine andere Zahl sein, geht es mit substr? Wie muss ich das anwenden?
Grüsse Juha
Hallo
Hallo Zusammen
ich habe in $zeit eine Minuszahl (zum beispiel -45 oder -120), jetzt möchte ich diese Minuszahl in eine Pluszahl umwandeln. Wie ist das möglich? Es kann jedesmal eine andere Zahl sein, geht es mit substr? Wie muss ich das anwenden?
Wie Du schon selbst geschrieben hast, hast Du in $zeit eine MinusZAHL, warum möchtest Du das dann als String behandeln?
Also probier' doch mal die Funktion abs().
Grüsse Juha
Manfred
Hoi,
ich habe in $zeit eine Minuszahl (zum beispiel -45 oder -120),
jetzt möchte ich diese Minuszahl in eine Pluszahl umwandeln. Wie
ist das möglich? Es kann jedesmal eine andere Zahl sein, geht es
mit substr? Wie muss ich das anwenden?
[...]
Also probier' doch mal die Funktion abs().
Alternativ reicht auch ein * -1.
Gruesse,
CK
Hallööö
Danke für die Tipps, aber wie tut man abs() resp.. * -1 anwenden??
Grüsse
Juha
Hoi,
ich habe in $zeit eine Minuszahl (zum beispiel -45 oder -120),
jetzt möchte ich diese Minuszahl in eine Pluszahl umwandeln. Wie
ist das möglich? Es kann jedesmal eine andere Zahl sein, geht es
mit substr? Wie muss ich das anwenden?
[...]
Also probier' doch mal die Funktion abs().
Alternativ reicht auch ein * -1.
Gruesse,
CK
Hallööö
Danke für die Tipps, aber wie tut man abs() resp.. * -1 anwenden??
Grüsse
Juha
Hallo Juha,
ist die Frage ernst gemeint? Also bei einem solch kleinem Problem können doch gar nicht soviele Bäume dastehen, daß man den Wald nicht sieht.
Ich bin ja nu kein PERL-Experte, aber mit ein bisschen Kenntnis über Programmierung und wie die Syntax so im Allgemeinen aussieht, kann man doch sicher ableiten, daß es vielleicht ungefähr so funktionieren könnte:
$zahl = $zahl * (-1);
bzw.
$zahl = abs($zahl);
Nur wenn Du das Erste Mal mit Java/Javascript konfrontiert worden wärst, hätte ich verstanden, wenn Du gepostet hättest, daß das mit dem abs() nicht so funktioniert. Dort muß nämlich wegen der Objektorientierung noch das Mathe-Objekt "Math" davor. Dann sähe das ungefähr so aus (in Java gibts das mit dem $ vor ner Variablen nicht):
zahl = Math.abs(zahl);
Da Du aber möglicherweise ein Einsteiger bist, schreibe ich mal vorsichtshalber noch hin, daß es sich hierbei nicht um mathematische Gleichungen handelt. Das "Gleich" ist in der Programmierung eine Zuweisungsoperation, wobei der Teil rechts vom Gleichheitszeichen berechnet und andie Varible links vom Gleichheitszeichen übergeben wird.
In den meisten Programmiersprachen gibt es noch ein "vergleichendes Gleich" für Fallunterscheidungen:
if ($a == $b){
// mach dies
} else {
// mach das
}
An dieser Stelle sei erwähnt, daß es sogar ein Fehler wäre, das einfache Zuweisungs-"Gleich" (=) zu verwenden.
Gruß
Andreas Schigold
use Mosche;
In den meisten Programmiersprachen gibt es noch ein "vergleichendes Gleich" für Fallunterscheidungen:
if ($a == $b){
// mach dies
} else {
// mach das
}
An dieser Stelle sei erwähnt, daß es sogar ein Fehler wäre, das einfache Zuweisungs-"Gleich" (=) zu verwenden.
Ist es nicht. Es macht nur nicht das, was du willst. In diesem Kontext wird der Erfolgsfall der Zuweisung genommen.
Gebräuchlich ist dies zB bei:
while (my ($a, $b) = each %hash) {
...
}
und ist nichts anderes als eine Zuweisung.
if ($a = &blah('hhh')) {
# erfolgreich zugewiesen
} else {
# Zweisung nicht erfolgreich (Rückgabewert der Funktion 0
# oder undef
}
use Tschoe qw(Matti);
In einem Forum, wo ich in jedem dritten Posting was vom Validator.w3.org lese, kann ich das jetzt nicht verstehen. Es zeugt einfach von einer unsauberen Programmierweise und erschwert oft die Lesbarkeit von Programmen. Außerdem eröffnet sich damit eine massive Fehlerquelle:
Ich habe mir z.B. angewöhnt, das Schreiben einer Verzweigung oder "while"-Wiederholung gedanklich mit den Worten "wenn/solange ($a identisch gleich $b) dann ...."
Dadurch ist es mir gelungen, den Fehler - und meistens ist es ein Fehler, weil nicht so gewollt - mit dem einfachen Gleich abzustellen.
Schreibt man aber in viele Verzweigungsköpfe noch Zuweisungen hinein, erhöht das die Gefahr des Schußlichkeitsfehlers enorm.
also:
if ( wanted(sauberer Programmierstil) == true) {
// few errors
} else{
use Mosche;
In den meisten Programmiersprachen gibt es noch ein "vergleichendes Gleich" für Fallunterscheidungen:
if ($a == $b){
// mach dies
} else {
// mach das
}
An dieser Stelle sei erwähnt, daß es sogar ein Fehler wäre, das einfache Zuweisungs-"Gleich" (=) zu verwenden.
Ist es nicht. Es macht nur nicht das, was du willst. In diesem Kontext wird der Erfolgsfall der Zuweisung genommen.
Gebräuchlich ist dies zB bei:
while (my ($a, $b) = each %hash) {
...
}
und ist nichts anderes als eine Zuweisung.
if ($a = &blah('hhh')) {erfolgreich zugewiesen
} else {
Zweisung nicht erfolgreich (Rückgabewert der Funktion 0
oder undef
}
use Tschoe qw(Matti);
}
/* bitte nicht persönlich nehmen ;-) */
return ("Grüße@all");
Hallo,
Ich habe mir z.B. angewöhnt, das Schreiben einer Verzweigung oder "while"-Wiederholung gedanklich mit den Worten "wenn/solange ($a identisch gleich $b) dann ...."
kennst Du
while(<STDIN>){
...
}
oder
while(@werte = $sth->fetchrow_array){
...
}
oder
if(open(FILE,'wasauchimmer')
{
...
}
Diese, und andere, Konstrukte sind in Perl üblich.
Die gleichzeitige Verwendung von Zuweisungen für die Überprüfung ist eines der Erbstücke von C, welche IMHO einerseits der Übersichlichkeit förderlich ist, andererseits aber auch ab und zu Kopfzerbrechen verursachen kann.
Ich persönlich verwende solche Konstrukte in solchen Zusammenhängen, wie ich sie oben als Beispiel aufgeführt habe.
Ob das nun der 'Wahren Lehre' entspricht ist mir persönlich egal, Hauptsache der Code ist gut leserlich und wartbar. Und daß ich keine Verrenkungen unternehmen muß, um nur ja 'sauber' zu Programmieren.
Grüße
Klaus
Hallo Leute,
ich wollte nur noch mal daran erinnern, daß meine kleine Einführung nur gedacht war, um einem Einsteiger die Bedeutung des Gleichheitszeichens bewust zu machen, da ein Posting dieses Threads hier einen Einsteiger doch sehr stark vermuten ließ. Natürlich kann man all diese Konstrukte verwenden. Und natürlich kann man Befehle ineinander, übereinander untereinander und nebeneinander verschachteln, bis der Arzt kommt.
Aber Leute. Wenn Ihr das einem Einsteiger erklären wollt, dann wird der ganz schnell wieder zum Aussteiger. Ich habe selbst genügend Leuten die Programmierung nahebringen dürfen (war mein Wunsch). Und daher kenne ich einfach die Verwirrung der Leute beim einfachen Anblick der Zeile.
a = a + 1;
Das war einfach für die Leute 'ne mathematische Falschaussage. Als ich den Leuten erstmal erklärt hatte, daß sie ein Gleichheitszeichen als Zuweisungszeichen verstehen müssen. War den allen geholfen. Und als sie verstanden hatten, daß ein Vergleich mit einem Doppelgleich realisiert wird, dann war das logisch. Wollt ihr etwa den Leuten jetzt beibringen, daß das alles egal ist? Das wär für Einsteiger die Verwirrung pur. Fakt ist, so gehts erstmal und so ist es auch eindeutig. Das es auch anders geht ist ja schön, aber das sollen sie dann rauskriegen, wenn sie ein Gefühl für die Programmierung bekommen haben.
Ich bin sicher auch kein Engelsprogrammierer, und auch ich verschachtle gern mal Funktionen ineinander, aber das kann man doch keinem Einsteiger erklären, warum nu in ausgerechnet dem Fall jetzt doch ein Doppelgleich hinsoll und in dem anderen Fall eben nicht braucht.
Also, bitte auch ein bisschen Rücksicht auf Einsteiger, okay? Oder habt Ihr etwa immer von Anfang an alle Tricks draufgehabt? Ich nicht.
Greetings
Andreas
Hi Andreas,
a = a + 1;
Das war einfach für die Leute 'ne mathematische Falschaussage.
Als ich den Leuten erstmal erklärt hatte, daß sie ein Gleichheitszeichen
als Zuweisungszeichen verstehen müssen. War den allen geholfen.
tja, das kommt eben dabei heraus, wenn Programmiersprachen so definiert
werden, daß die Cracks möglichst wenig Anschläge auf der Tastatur brauchen.
In einer explizit auf Didaktik ausgelegten Sprache wie Pascal gibt es für
die Zuweisung einen Operator ":=" und für den Vergleich den Operator "=",
der eben auch in den einem Anwender üblichen sonstigen Quellen für Ver-
gleiche verwendet wird. In der Tat enthält ein typisches Quelltextprogramm
mehr Zuweisungen als Vergleiche, aber an dieser Stelle mit Gewalt eine
'schlechtere' Syntax zu nehmen, habe ich schon immer für falsch gehalten.
Wollt ihr etwa den Leuten jetzt beibringen, daß das alles egal ist?
Nein. Es ist nur nicht das eine falsch und das andere richtig - diese Deine
Aussage war in der Tat falsch.
Beides sind legale Statements in Perl - für zwei verschiedene Zwecke.
aber das kann man doch keinem Einsteiger erklären, warum nu in
ausgerechnet dem Fall jetzt doch ein Doppelgleich hinsoll und in
dem anderen Fall eben nicht braucht.
Doch. Genau das kann und _muß_ man auch dem Einsteiger erklären!
Denn alles andere ist falsch - und einem Einsteiger erst etwas Falsches
erklären und anschließen beichten zu müssen, daß man zwecks Vereinfachung
gelogen hat, ist noch viel schlimmer.
Also, bitte auch ein bisschen Rücksicht auf Einsteiger, okay?
Ich erkläre einem Anfänger lieber langsam die Wahrheit als schnell die
Unwahrheit.
Viele Grüße
Michael
(quiche eater)
Hi Michael,
In einer explizit auf Didaktik ausgelegten Sprache wie Pascal gibt es für
die Zuweisung einen Operator ":=" und für den Vergleich den Operator "=",
der eben auch in den einem Anwender üblichen sonstigen Quellen für Ver-
gleiche verwendet wird.
Ich hatte auch schon überlegt, ob ich Pascal noch mit reinbringe, wollte es dann aber lassen.
Denn alles andere ist falsch - und einem Einsteiger erst etwas Falsches
erklären und anschließen beichten zu müssen, daß man zwecks Vereinfachung
gelogen hat, ist noch viel schlimmer.
Okay, einwas war wohl unwahr, nämlich das es generell ein Fehler sei. Gut, dann möchte ich mich an dieser Stelle korrigieren. Aber ich denke, daß man nicht immer alle Facetten gleich anbringen muß, sondern immer nur dann , wenn sie gebraucht werden. Eins ist jedenfalls Fakt: Wenn man alle Fakten mit einmal vermittelt, versteht der andere nur Bahnhof. Das hatte der eine Dr. an der Uni drauf. Du hast ihm eine Frage gestellt und er hat Dir die halbe Statik erklärt. Die Aufgabe, um die es ging hat er Dir dreimal vorgerechnet, mal linksrum, mal rechtsrum und dann noch grafisch Zusammenhänge erklärt. Am Ende hat jeder nur noch Bahnhof verstanden.
Aber es wäre doch auch falsch, zu sagen, daß ich an dieser Stelle
if ($a==$b)
gedankenlos auch ein einfaches Gleich nehmen könnte, weil:
( $a == $b ) // ist false wenn $a==3 und $b==4
( $a == $b ) // ist true wenn $a==0 und $b==0
( $a = $b ) // ist true wenn $a==3 und $b==4
( $a = $b ) // ist false wenn $a==0 und $b==0
Und deshalb finde ich es richtiger, die Verwendung des einfachen Gleichheitszeichens beim _Vergleichen_ als falsch zu betiteln. Denn was ist denn das, wenn man das einfache Gleichheitszeichen verwendet? Eine Wertzuweisung! Und _kein_ Vergleich. Die Schreibweise
if ($a = $b)
impliziert doch einen ganz anderen Vergleich, nämlich:
if ( 0 != ($a = $b) )
Nur dann wäre es doch besser, dem Einsteiger diese ausführliche Schreibweise zu zeigen, um dann (in der gleichen Sitzung) die verkürzte Schreibweise zu zeigen. Bei anderen Sachen, wie z.B. "i++" fängt man doch auch nicht an und sagt "das ist jetzt ein Increment". Nein, man fängt doch erst beim "i=i+5" an, weil das häufig vorkommt, daß das Ergebnis in eine verwendete Variable zurückgeschrieben wird schreibt kann man es kürzer schreiben, also i+=5. Und für i+=1, weil man das nun noch häufiger braucht, gibts was noch kürzeres, nämlich "++i". Jetzt kann man den Begriff Increment erklären.
So, und wenn der arme Einsteiger jetzt noch aufnahmefähig ist, dann kann man noch die Unterschiede zwischen "++i" und "i++" erklären. Nur ich habs dann meistens gelassen, weil die Leute eben das erstmal verdauen mußten.
Ich fand es einfach nur unpassend, daß ich die einfachsten Zusammenhänge versucht hab, syntaktisch zu erklären, und nun kommen die Klugen aus der letzten Reihe und wissen alles besser, ohne die Zusammenhänge mit zu erklären.
Wenn den Thread jetzt ein Einsteiger liest, dann erfährt er nämlich folgendes:
von mir: aha, klare Trennung: "=" ist Zuweisung, "==" ist Vergleich
von Euch: aha, kann auch "=" für Vergleiche nehmen oder gar nichts geht auch, also ist es egal
und damit ist er aus meiner Sicht von Euch mehr in die Irre geführt worden, als durch mich.
Viele Grüße auch von mir
Andreas
PS: Ich weiß noch, wie ich mal als kleiner Stift sowas aufgeschnappt hatte, wie "5 - 7 rechnet man aus, indem man 7 - 5 rechnet und dann ein Minuszeichen davorsetzt, Ergebnis also: - 2". Nun wurde in der Grundschule so 'ne Aufgabe gestellt und ich nannte das richtige negative Ergebnis. Die Lehrerin sagt "falsch, Unsinn" oder so und freute sich über die "richtige" Antwort eines anderen Schülers: "nicht lösbar". Damals dachte ich für einen kurzen Moment "häää?" und hatte es wieder vergessen. Heute weiß ich's natürlich, warum sie abwiegeln mußte, weil sie nämlich froh war, daß die anderen Kinder erstmal mit den natürlichen Zahlen zurande kamen, und die negativen oder rationalen Zahlen kamen ja erst viel später. Oder wie war das bei Euch in der Schule?
Hi Andreas,
Und deshalb finde ich es richtiger, die Verwendung des einfachen
Gleichheitszeichens beim _Vergleichen_ als falsch zu betiteln.
Denn was ist denn das, wenn man das einfache Gleichheitszeichen
verwendet? Eine Wertzuweisung! Und _kein_ Vergleich.
Yep. Das ist nun aber schon eine seht viel exaktere Darstellung, und
sie ist nicht sehr viel komplexer als vorhin.
Das Preis/Leistungs-Verhältnis für die Korrektur gefällt mir.
Die Schreibweise
if ($a = $b)
impliziert doch einen ganz anderen Vergleich, nämlich:
if ( 0 != ($a = $b) )
Nur dann wäre es doch besser, dem Einsteiger diese ausführliche
Schreibweise zu zeigen, um dann (in der gleichen Sitzung) die
verkürzte Schreibweise zu zeigen.
Absolute Zustimmung. Ich bin auch der Meinung, daß man selbst einem
Anfänger nichts als "einfach" darstellen soll, was es nicht ist (bzw.
nur wird, wenn man die Hälfte der möglichen Fälle unter den Tisch kehrt).
Ich habe lieber einen Anfänger als Schüler, der Respekt vor der Materie
hat, aber die Wahrheit lernt (wenn auch langsam), als einen, der nach
der ersten Sitzung glaubt, alles zu wissen, und dann furchtbar auf die
Nase fällt, wenn er mit den ganzen Ausnahmen zu tun bekommt.
Genau das ist nämlich das Problem der "Vereinfacher" wie Frontpage:
Sie bauen ein Potemkinsches Dorf des Schein-Wissens auf.
Bei anderen Sachen, wie z.B. "i++" fängt man doch auch nicht an
und sagt "das ist jetzt ein Increment". Nein, man fängt doch erst
beim "i=i+5" an, weil das häufig vorkommt, daß das Ergebnis in
eine verwendete Variable zurückgeschrieben wird schreibt kann
man es kürzer schreiben, also i+=5.
Ich würde es anders erklären: "Es gibt Zuweisungen und Ausdrücke. Von
beidem gibt es diverse Formen. Wie beschäftigen uns zuerst mit deren
allgemeinen Eigenschaften (nämlich etwas zu speichern bzw. zu berechnen),
dann mit den häufgsten Beispielen, zuletzt mit der vollständigen Aufli-
stung aller Varianten."
Und für i+=1, weil man das nun noch häufiger braucht, gibts was noch
kürzeres, nämlich "++i". Jetzt kann man den Begriff Increment erklären.
Bei mir käme der noch später als bei Dir. Aber die Information, daß es
viele Möglichkeiten gibt, käme bei mir als allererstes.
Wenn den Thread jetzt ein Einsteiger liest, dann erfährt er nämlich
folgendes:
von mir: aha, klare Trennung: "=" ist Zuweisung, "==" ist Vergleich
von Euch: aha, kann auch "=" für Vergleiche nehmen oder gar nichts
geht auch, also ist es egal
Letzteres ist falsch und wurde auch von niemandem so behauptet.
Nun wurde in der Grundschule so 'ne Aufgabe gestellt und ich nannte
das richtige negative Ergebnis.
Wie lautete die exakte Aufgabenstellung?
Je nachdem, ob diese "im Universum der Natürlichen Zahlen" oder "im
Universum der Ganzen Zahlen" beinhaltete, ist Deine Lösung falsch bzw.
richtig.
vergessen. Heute weiß ich's natürlich, warum sie abwiegeln mußte,
weil sie nämlich froh war, daß die anderen Kinder erstmal mit den
natürlichen Zahlen zurande kamen, und die negativen oder rationalen
Zahlen kamen ja erst viel später.
Du suchst die Schuld bei der Lehrerin, weil _Du_ einen Teil der Aufgaben-
stellung ignoriert hast?
Viele Grüße
Michael
Genau das ist nämlich das Problem der "Vereinfacher" wie Frontpage:
Sie bauen ein Potemkinsches Dorf des Schein-Wissens auf.
Applaus
Wenn den Thread jetzt ein Einsteiger liest, dann erfährt er nämlich
folgendes:
von mir: aha, klare Trennung: "=" ist Zuweisung, "==" ist Vergleich
von Euch: aha, kann auch "=" für Vergleiche nehmen oder gar nichts
geht auch, also ist es egal
Letzteres ist falsch und wurde auch von niemandem so behauptet.
So kam es aber bei mir an. Natürlich steht nicht immer jede Behauptung wort-wörtlich beschrieben da.
Ich möchte mal ein Stück aus dem Posting http://forum.de.selfhtml.org/?m=28095&t=5001 nochmal hierhin schreiben:
(meine)
In den meisten Programmiersprachen gibt es noch ein "vergleichendes Gleich" für Fallunterscheidungen:
if ($a == $b){
// mach dies
} else {
// mach das
}
An dieser Stelle sei erwähnt, daß es sogar ein Fehler wäre, das einfache Zuweisungs-"Gleich" (=) zu verwenden.
(Deine)
Ist es nicht. Es macht nur nicht das, was du willst. ...
Frage: Wenn Dein Programm nicht das tut, was es soll, würdest Du es dann als fehlerfrei bezeichnen? Es macht ja was, nur was anderes. Also für mich ist das ein Fehler. Da hat zwar kein Compiler "syntax error" geschriehen und kein Interpreter hat "parse error" gerufen.
Aber wenn Du das elektronisch abgefragte Lenkrad Deines Autos (so in zehn Jahren) nach links drehst und das Auto fährt rechtsrum und wenn bei der nächsten exakten Geradeausstellung das Auto plötzlich das ursprünglich gewollte tut, nämlich linksrum fahren. Dann wirst Du aber mit entsprechender Wut den Autoverkäufer anrufen, er solle doch das kaputte Auto abholen, Du fährst damit bestimmt keinen Meter mehr.
So, also Fehler! Steht doch da oder? Es steht doch da: Für Fallunterscheidungen gibt es ein "vergleichendes Gleich" und es wär ein Fehler, dafür (für Fallunterscheidungen) das Zuweisungsgleich zuverwenden. Steht doch da. Oder etwa nicht?
Und Du sagtest ja selbst "Es macht nur nicht das, was du willst." Also ist es doch ein Fehler. Und nicht "Ist es nicht.".
Deine weiteren Erklärungen sind ja wieder richtig, habe sie mir extra nochmal durchgelesen.
Nun wurde in der Grundschule so 'ne Aufgabe gestellt und ich nannte
das richtige negative Ergebnis.
Wie lautete die exakte Aufgabenstellung?
Je nachdem, ob diese "im Universum der Natürlichen Zahlen" oder "im
Universum der Ganzen Zahlen" beinhaltete, ist Deine Lösung falsch bzw.
richtig.
Frag doch nicht solche komplizierten Sachen. Außerdem glaube ich nicht, daß die Lehrerin uns damals schon gesagt hat, was natürliche Zahlen sind und daß es auch andere gibt. Wir kannten eben nichts anderes, nur ich kleiner Klugscheißer wußte eben ein bisschen mehr. Und damit habe ich den "mir bekannten Zahlenbereich" zur Lösung dieser Aufgabe einfach erweitert. Ich weiß nicht mehr, ob der Begriff der Natürlichen Zahlen damals schon erklärt wurde. Wir haben eben immer nur "nicht lösbar" gesagt und nicht "... im Bereich der natürlichen Zahlen". Meine Güte, es war halt so.
vergessen. Heute weiß ich's natürlich, warum sie abwiegeln mußte,
weil sie nämlich froh war, daß die anderen Kinder erstmal mit den
natürlichen Zahlen zurande kamen, und die negativen oder rationalen
Zahlen kamen ja erst viel später.
Du suchst die Schuld bei der Lehrerin, weil _Du_ einen Teil der Aufgaben-
stellung ignoriert hast?
Ich suche doch keine Schuld! Sie hatte ihren Lehrplan und da stand eben "nicht lösbar". Nur ich kannte den Lehrplan nicht und ich weiß, warum man manchmal die ganze Wahrheit etwas hinausschieben muß und da suche ich doch keine Schuld! Ich habe auch damals keine Schuld gesucht. Ich sag ja, hab meine Antwort gekriegt, mal kurz verwirrt geschaut und da wars schon wieder vergessen.
Viele Grüße
Andreas
use Mosche;
Wenn den Thread jetzt ein Einsteiger liest, dann erfährt er nämlich
folgendes:
von mir: aha, klare Trennung: "=" ist Zuweisung, "==" ist Vergleich
von Euch: aha, kann auch "=" für Vergleiche nehmen oder gar nichts
geht auch, also ist es egal
Letzteres ist falsch und wurde auch von niemandem so behauptet.
So kam es aber bei mir an. Natürlich steht nicht immer jede Behauptung wort-wörtlich beschrieben da.
Ich möchte mal ein Stück aus dem Posting http://forum.de.selfhtml.org/?m=28095&t=5001 nochmal hierhin schreiben:
(meine)
In den meisten Programmiersprachen gibt es noch ein "vergleichendes Gleich" für Fallunterscheidungen:
if ($a == $b){
// mach dies
} else {
// mach das
}
An dieser Stelle sei erwähnt, daß es sogar ein Fehler wäre, das einfache Zuweisungs-"Gleich" (=) zu verwenden.
(Deine)
Ist es nicht. Es macht nur nicht das, was du willst. ...
Frage: Wenn Dein Programm nicht das tut, was es soll, würdest Du es dann als fehlerfrei bezeichnen? Es macht ja was, nur was anderes. Also für mich ist das ein Fehler. Da hat zwar kein Compiler "syntax error" geschriehen und kein Interpreter hat "parse error" gerufen.
Es ist aber trotzdem kein Fehler, weil es auch den Fall gibt, wo was "Zuweisungs-Gleich" gebraucht wird und nicht das "Vergleichs-Gleich".
Das Programm ist zwar fehlerhaft, es hat aber keine Fehler (hääähh?).
Wenn ich $a mit $b multipliziere und will eigentlich mit $c multiplizieren, dann ist das auch ein Fehler. Erklär doch eher das dem Anfänger.
use Tschoe qw(Matti);
Hi Matti
use Mosche;
Wenn den Thread jetzt ein Einsteiger liest, dann erfährt er nämlich
folgendes:
von mir: aha, klare Trennung: "=" ist Zuweisung, "==" ist Vergleich
von Euch: aha, kann auch "=" für Vergleiche nehmen oder gar nichts
geht auch, also ist es egal
Letzteres ist falsch und wurde auch von niemandem so behauptet.
So kam es aber bei mir an. Natürlich steht nicht immer jede Behauptung wort-wörtlich beschrieben da.
Ich möchte mal ein Stück aus dem Posting http://forum.de.selfhtml.org/?m=28095&t=5001 nochmal hierhin schreiben:
(meine)
In den meisten Programmiersprachen gibt es noch ein "vergleichendes Gleich" für Fallunterscheidungen:
if ($a == $b){
// mach dies
} else {
// mach das
}
An dieser Stelle sei erwähnt, daß es sogar ein Fehler wäre, das einfache Zuweisungs-"Gleich" (=) zu verwenden.
(Deine)
Ist es nicht. Es macht nur nicht das, was du willst. ...
Frage: Wenn Dein Programm nicht das tut, was es soll, würdest Du es dann als fehlerfrei bezeichnen? Es macht ja was, nur was anderes. Also für mich ist das ein Fehler. Da hat zwar kein Compiler "syntax error" geschriehen und kein Interpreter hat "parse error" gerufen.
Es ist aber trotzdem kein Fehler, weil es auch den Fall gibt, wo was "Zuweisungs-Gleich" gebraucht wird und nicht das "Vergleichs-Gleich".
Das Programm ist zwar fehlerhaft, es hat aber keine Fehler (hääähh?).
Wenn ich $a mit $b multipliziere und will eigentlich mit $c multiplizieren, dann ist das auch ein Fehler. Erklär doch eher das dem Anfänger.
Also ich habe jetzt den Eindruck, daß wir doch eigentlich einer Meinung sind. Oder nicht?
Es ist ein Fehler, nicht das zu tun, was man sollte, weil dann was anderes herauskommt. Und ich sag doch auch _nur_, daß es ein Fehler ist für einen Vergleich den Operator für die Zuweisung zu nehmen. Es war doch nie die Rede von falscher Syntax oder so.
Also ich hatte mir damals beim Schreiben nicht so intensive Gedanken gemacht, aber je mehr ich drüber nachdenke, um so weniger kann ich in meiner Formulierung keinen Fehler sehen. Jedenfalls kann ich nicht verstehen, warum ein Fehler zwangsweise ein Syntaxfehler sein muß.
Damit wären wir irgendwie bei der Klassifizierung, eine Grundlage für gutes objektorientiertes Softwaredesign (denk ich mal):
Es gibt Schußlichkeitsfehler, Denkfehler, Syntaxfehler, Rechenfehler, Materialfehler, Produktionsfehler, Konzeptfehler, Designfehler, Schönheitsfehler......... alles sind Fehler.
Genauso gibt es Schreibtische, Eßtische, Couchtische, Schultische ... alles Tische. Nur weil Du den ganzen Arbeitstag am Schreibtisch sitzt, muß doch Deine Frau nicht zwangsweise mit einem Tisch einen Schreibtisch meinen. Oder?
Ich denke, wir sollten diesen Thread langsam mal abschließen, sonst wird der noch größer, als der "Was war los in selfhtml". Dann tun die anderen uns bestimmt schlagen. Oder sie steigen nochmal mit ein *lol*
Gruß,
Andreas
PS: Falls mal ein bisschen Abwechslung gefragt ist: http://schigold.de/spiel/
Hi Andreas,
Und Du sagtest ja selbst "Es macht nur nicht das, was du willst."
Also ist es doch ein Fehler. Und nicht "Ist es nicht.".
Es macht nicht _nur_, was Du willst. Es macht _auch_, was Du willst,
aber eben _zusätzlich_ auch noch eine Wertzuweisung.
Je nachdem, ob das für Dich entscheidend ist (darüber machst Du, solange
Du Dich auf die Auswertung des Boole'schen Ausdrucks konzentrierst, keine
Aussage) kann das entweder richtig oder falsch sein.
Du suchst die Schuld bei der Lehrerin, weil _Du_ einen Teil der Aufgaben-
stellung ignoriert hast?
Ich suche doch keine Schuld! Sie hatte ihren Lehrplan und da stand
eben "nicht lösbar".
Wenn die Aufgabenstellung lautete "Subtraktion im Bereich der Natürlichen
Zahlen" (entweder als explizite Angabe dieser Teilaufgabe oder als implizi-
ter Kontext), dann stand es zu Recht da. Auch hier sind Deine Angaben un-
vollständig.
Viele Grüße
Michael
Moin!
In einem Forum, wo ich in jedem dritten Posting was vom Validator.w3.org lese, kann ich das jetzt nicht verstehen.
Das ist ja nun nicht gerade, was man einen treffenden Vergleich nennt. Der Validator ueberprueft, ob man sich an die Regeln von HTML gehalten hat. Wenn ich = in einer Bedingung verwende, habe ich mich sehr wohl an die Regeln von C/Perl/whatever gehalten.
Es zeugt einfach von einer unsauberen Programmierweise
Haeh?
und erschwert oft die Lesbarkeit von Programmen.
Fuer Anfaenger, ja.
Schreibt man aber in viele Verzweigungsköpfe noch Zuweisungen hinein, erhöht das die Gefahr des Schußlichkeitsfehlers enorm.
Aufpassen muss man schon, das stimmt.
An dieser Stelle sei erwähnt, daß es sogar ein Fehler wäre, das einfache Zuweisungs-"Gleich" (=) zu verwenden.
Ist es nicht.
Das kommt auf die Sprache an. In richtigen Programmiersprachen ist das ok, aber Spielzeugsprachen wie JavaScript melden da oft einen Fehler, weil diese eben gerade von Anfaengern gern benutzt werden.
So long
use Mosche;
also:
if ( wanted(sauberer Programmierstil) == true) {
// few errors
} else{
[ Quote von Mattis Posting ]
a) Bitte lese http://learn.to/quote.
b) Du hastselber einen Fehler gemacht:
if ( wanted(sauberer Programmierstil) == true) {
sollte wohl heissen:
if ( wanted('sauberer Programmierstil') eq 'true') {
oder
if ( wanted('sauberer Programmierstil')) {
oben kommt _immer_ wahr raus, weil 'hhh' == 'bbb' (weil 0 == 0).
use Tschoe qw(Matti);
Hi Matti,
in einem Punkt gebe ich Dir Recht, "sauberer Programmierstil" kann keine Variable sein und auch kein DEFINE oder sonst was, muß also ein String sein. Fein aufgepaßt, macht ein Bienchen *g*.
ABER: In jeder mir bekannten Programmiersprache gibt es die Schlüsselwörter true und false. Und die schreibt man da genauso hin, wie ein if, ein while oder ein return. Und wenn die Methode wanted(String) einen boolschen Wert zurückgibt, dann kann ich doch bestimmt auch in Perl so vergleichen können:
if (wanted('what ever you think is wanted') == true)
Oder gibts in PERL kein '=='?
oben kommt _immer_ wahr raus, weil 'hhh' == 'bbb' (weil 0 == 0).
In welcher Sprache ist das so? Ich kenne es nur andersrum:
('abc' == 'abc') ist false, weil die Zeiger der Texte auf verschiedene Adressen zeigen - is aber nur in C/C++ so schlimm. Deshalb gibt es dort einen speziellen Stringvergleich: (strcmp('abc','abc')==0)
In Scriptsprachen funktionieren aber im allgemeinen direkte Stringvergleiche, wie:
('abc'=='abc') ist true und
('bbb'=='hhh') ist false
Oder hast Du was falsch verstanden? Also wanted() ist eine "gedachte" Funktion, die prüft, ob der als Parameter angegebene Tatbestand gewollt/gesucht ist oder nicht. Dementsprechend gibt sie natürlich ein true oder false zurück, also etwa so (Javascript-like):
function wanted (sWanted) {
switch(sWanted) {
case 'sauberer Programmierstil': return true;
case 'Eis am Stiel: return true;
case 'schlechter Programmierstil': return false;
case 'Lottogewinn': return true;
default: return false;
}
}
Greetings
Andreas
Hallo,
ABER: In jeder mir bekannten Programmiersprache gibt es die Schlüsselwörter true und false.
Dann dürfte Dir Perl nicht bekannt sein, weil da gibts (noch) kein true oder false;-)
Und die schreibt man da genauso hin, wie ein if, ein while oder ein return. Und wenn die Methode wanted(String) einen boolschen Wert zurückgibt, dann kann ich doch bestimmt auch in Perl so vergleichen können:
if (wanted('what ever you think is wanted') == true)
eigentlich
if (wanted('what ever you think is wanted'))
wenn Du das logische True erwartest bzw.
unless (wanted('what ever you think is wanted'))
wenn Du das logische False erwartest.
Oder gibts in PERL kein '=='?
Sicherlich, aber nur wenn Du numerische Gleichheit prüfen willst.
Logishc True ist alles was nicht ein leerer String, der Wert 0 oder undefiniert ist.
oben kommt _immer_ wahr raus, weil 'hhh' == 'bbb' (weil 0 == 0).
In welcher Sprache ist das so?
In Perl, da == ja numerishc vergleicht und 'hhh' nach der Umwandlung in eine Zahl 0 ergibt, genauso wie 'aaa'. Anders verhält sich '123abc'. Wenn Du diesen String als Zahl interpretierst, dann funktioniert das zwar, aber nicht ohne Warnung, wenn deren Ausgabe aktibiert ist.
('abc' == 'abc') ist false, weil die Zeiger der Texte auf verschiedene Adressen zeigen - is aber nur in C/C++ so schlimm.
'abc' würde in C zu einem Compilerfehler führen, da Singlequotes für Charakterkonstanten verwendet wird, während Doublequotes für Stringkonstanten eingesetzt werden.
Allerdings ist das Ergebnis von ("abc" == "abc") in C undefiniert, da, bei entsprechenden Compileroptionen beide Stringkonstanten durchaus auch zusammengefaßt werden könnten.
Deshalb gibt es dort einen speziellen Stringvergleich: (strcmp('abc','abc')==0)
das erledigt in Perl normalerweise ('abc' eq 'abc').
Allerdings könntest Du auch hergehen, und die Operatoren überladen, was aber dann sicherlich zu einiger Verwirrung führen könnte.
In Scriptsprachen funktionieren aber im allgemeinen direkte Stringvergleiche, wie:
('abc'=='abc') ist true und
('bbb'=='hhh') ist false
Wie Du schon sagst, 'im Allgemeinen';-)
Grüße
Klaus
Moin!
ABER: In jeder mir bekannten Programmiersprache gibt es die Schlüsselwörter true und false.
Du kennst also weder C noch Perl?
if (wanted('what ever you think is wanted') == true)
Oder gibts in PERL kein '=='?
Das schon, aber das hier funktioniert nur, wenn Du vorher irgendwo
sub true() { 1 }
geschrieben hast, denn sonst wird Perl sich ueberlegen, ob es true als einen unquoted string oder eine nichtexistierende Subroutine ansieht.
oben kommt _immer_ wahr raus, weil 'hhh' == 'bbb' (weil 0 == 0).
In welcher Sprache ist das so?
Na in Perl. Reden wir nicht davon?
('abc' == 'abc') ist false, weil die Zeiger der Texte auf verschiedene Adressen zeigen - is aber nur in C/C++ so schlimm.
Nein, das ist true. Du vergleichst zwei Zahlen miteinander. Du meinst vielleicht ("abc" == "abc"). In dem Falle duerfte es vom Compiler abhaengig sein, ob er zwei Exemplare des Strings anlegt.
Deshalb gibt es dort einen speziellen Stringvergleich: (strcmp('abc','abc')==0)
Core dump!
In Scriptsprachen funktionieren aber im allgemeinen direkte Stringvergleiche, wie:
('abc'=='abc') ist true und
('bbb'=='hhh') ist false
Ja, aber nicht in Perl. Dort funktioniert dafuer
('abc' eq 'abc') ist 1
('bbb' eq 'hhh') ist ''
So long
use Mosche;
if (wanted('what ever you think is wanted') == true)
Oder gibts in PERL kein '=='?
Das schon, aber das hier funktioniert nur, wenn Du vorher irgendwo
sub true() { 1 }
geschrieben hast, denn sonst wird Perl sich ueberlegen, ob es true als einen unquoted string oder eine nichtexistierende Subroutine ansieht.
Dann müsste er aber mit '&true' oder 'true()' vergleichen.
Schon 'warnings' warnt sonst vor der Benutzung eines unquotes Strings. (entschuldige mein Denglisch 8-)).
use Tschoe qw(Matti);
Moin moin!
Das schon, aber das hier funktioniert nur, wenn Du vorher irgendwo
sub true() { 1 }
geschrieben hast, denn sonst wird Perl sich ueberlegen, ob es true als einen unquoted string oder eine nichtexistierende Subroutine ansieht.
Dann müsste er aber mit '&true' oder 'true()' vergleichen.
Schon 'warnings' warnt sonst vor der Benutzung eines unquotes Strings.
---------
T:\home\calocybe\projects\utils\xren\working\test2>perl -w
print true;
Unquoted string "true" may clash with future reserved word at - line 1.
^Z
Name "main::true" used only once: possible typo at - line 1.
Filehandle main::true never opened at - line 1.
---------
Sieht aus, wie wenn Du recht hast.
(entschuldige mein Denglisch 8-)).
Ich komm schon klar. ;-)
So long
Hoi,
ich habe in $zeit eine Minuszahl (zum beispiel -45 oder -120),
jetzt möchte ich diese Minuszahl in eine Pluszahl umwandeln. Wie
ist das möglich? Es kann jedesmal eine andere Zahl sein, geht es
mit substr? Wie muss ich das anwenden?
[...]
Also probier' doch mal die Funktion abs().
Alternativ reicht auch ein * -1.
Stimmt. abs() hat aber den Vorteil, daß die Zahl auch dann positiv bleibt, wenn sie vorher schon positiv war - sicher ist sicher.
Gruesse,
CK
Manfred