eindeutig Prüfen ob Zahl in String

  • @ The Scout
    Warum sollte ich denn auf GOTO verzichten? Gibt es dafür triftige Gründe, außer der Gefahr einer Endlosschleife? Die kann auch anders zustande kommen.


    GOTO ist mit Abstand einer der wichtigsten Befehle jeder Programmiersprache. Darüber hinaus ist GOTO auch einer der Befehle, die eine Programmiersprache erst zu einer machen. Alles was keine Sprungmarken unterstützt, ist also keine Programmiersprache. Folglich war PHP bis 2009 nur eine Skriptsprache und KEINE Programmiersprache.


    Es gibt viele Dinge die man ohne GOTO gar nicht machen kann. Man kann zwar zugegeben viele Zeilen Quelltext mit "IF ... ELSE" isolieren, aber dadurch wird jedes Programm extrem langsam, weil der Interpreter erst die Bereiche der Klammern analysieren muss.


    "DO", "WHILE" und "UNTIL" können zwar auch einen Programmteil immer wieder ablaufen lassen, wenn es diese Befehle auch in PHP geben sollte, aber GOTO ist bei größeren Anwendungen teilweise unverzichtbar.


    Auszug aus der Fachliteratur zu "GOTO" (Zitat):
    "In der Praxis hat sich jedoch gezeigt, dass der Verzicht auf GOTO zwar möglich ist, jedoch in einigen Fällen zu sehr aufwändigen Konstrukten führt. So hält der US-amerikanische Informatiker Professor Donald E. Knuth, GOTO für die optimale Lösung einiger üblicher Programmierprobleme. Besonders in zeitkritischen Programmteilen, ist ein GOTO deutlich effizienter als am Ende von mehreren geschachtelten Schleifen, jeweils eine Abbruchprüfung durchzuführen."


    Ich persönlich freue mich übrigens schon auf die Einführung von Unterprogrammen mit "GOSUB ... RETURN" in PHP, falls die mal kommen sollte... Das läuft nämlich erheblich schneller ab als Funktionen.


    Eben mit "Visual Basic" (Excel) getestet:
    Eine Variable wird eine Milliarde Mal mit ihrem eigenen Wert überschrieben. Gezählt wird mit einer FOR-NEXT-Schleife. Der Aufruf mit der Variable wurde zuerst über GOSUB mit einer Sprungmarke durchgeführt und anschließend mit einer Funktion.
    GOSUB: 27 Sekunden
    FUNKTION: 56 Sekunden
    Das Ergebnis ist eindeutig: Die Funktion braucht deutlich länger als GOSUB. Das sollte eigentlich auf jede Programmiersprache zutreffen. Ich kann mein Experiment ja gerne mal mit PHP wiederholen. Zweimal GOTO anstelle einer Funktion.



    Nachtrag von 21:37 Uhr:
    Es bleibt dabei: Funktionen sind auch in PHP langsamer. Sogar noch ERHEBLICH langsamer! Ich habe den Test mit 4 Millionen Durchläufen gefahren, weil mein Server für ein PHP nur eine Ablaufzeit von maximal 30 Sekunden zulässt. Die FOR-Schleife musste ich durch IF-GOTO ersetzen.
    Ergebnis:
    2 x GOTO anstelle "GOSUB ... RETURN": 1 Sekunde
    FUNKTION: 26 Sekunden

  • Deswegen zB: http://stackoverflow.com/quest…es-goto-fail-security-bug
    Falls Du keine Zeit hast zu lesen - hier kurz:


    im code hatte jemand ein goto fail; doppelt gemoppelt UND auch noch keine Klammern genutzt (was viele wohl für "cool" halten).


    Aus einem simplen

    Code
    if(bedingung)
    goto fail;
    # sonst das hier ...


    wurde dann ein fataler Fehler

    Code
    if(bedingung)
    goto fail;
    goto fail;
    # sonst das hier ...


    Heißt: wir kamen so oder so zu fail:


    btw: mal ganz ehrlich: code von apple und dann keine klammern -.- raff ich net, wie man so schreiben kann, wenns doch bei denen wirklich um was geht.

  • @ cottton
    Gut, jeder programmiert halt anders. :) Ich bleibe bei GOTO und werde auch auf Funktionen verzichten, weil sie alles ausbremsen.

  • Und jetzt komme ich 8)


    Nein: gotoist nicht das Wichtigste an einer Programmiersprache, (achtung Sarkasmus:) das Wichtigste an einer Programmiersprache ist der Interpreter.
    Nein: Sprungmarken sind nicht das was eine Programmiersprache von einem Skript unterscheiden, es gibt Sprungmarken sogar sowohl in Programmiersprachen als auch in Skriptsprachen. eine Sprungmarke ist nichts anderes als eine Adresse innerhalb eines Codes, daher sind theoretisch selbst JavaScript Funktionen Sprungmarken.


    Der Unterschied zwischen Programmiersprachen und Skriptsprachen liegt einzig und allein am Umgang des Computers mit dem Code: Eine Programmiersprache hat immer einen Interpreter und wird in Maschinencode übersetzt und dann berechnet, Skriptsprachen werden in der Form verarbeitet wie auch ein Mensch sie simpel lesen kann. It's a simple 00101101 vs. function tuWas()


    Es gibt nichts das man ohne goto nicht lösen könnte, insbesondere wenn man sich dem OOP zuwendet, im Objektorientierten PHP hat goto nichts verloren und die Objektorientierung ist eine von PHP's größten Stärken: Sie ist optional und trotzdem sehr ausgereift.


    Eine do-Schleife ist mir aus keiner Programmier-, Skript- oder deklarativen Sprache bekannt. While, do-while, for, foreach, etc. sind Schleifen und diese sind alleine aus Semantik zu verwenden, goto als Schleife anzuwenden ist umständlich, schlecht lesbar und fühlt sich sogar falsch an:

    PHP
    $i = 1;
    counting:
    $i++;
    $i = $i;
    if($i <= 1000000000) goto counting;


    Es ist nicht einmal möglich diesen Code sinnvoll einzurücken, das erschwert Lesbarkeit und somit die Übersicht.

    PHP
    for($i = 1; $i <= 1000000000; $i++){
      $i = $i;
    }


    Hier erkenne ich eine wunderbare Einrückungsmöglichkeit und der Code ist deutlich übersichtlicher. Das mag auf den ersten Blick Ansichtssache sein aber wenn in riesigen Projekten 3 verschachtelte for-Schleifen mit goto ersetzt werden sollen merkt man was für eine ungünstige Idee das ist.


    Donald E. Knuth hat meiner Recherche nach nie mit Webandwendungen gearbeitet, er ist in diesem Fall ein nicht ernst zu nehmendes Beispiel bezüglich unseres Forums.


    Und jetzt kommt meine Zahlenwelt, auch ich habe eine Variable sich selbst überschreiben lassen, ebenso 1.000.000.000 mal:

    Zitat von XAMPP

    goto:34.0729 s
    for: 39.0762 s
    while: 44.6496 s
    do-while: 32.2408 s <- wir haben einen Sieger


    Die letzten 3 Nullen waren meiner Meinung nach sinnfrei, sie verschieben lediglich das Komma und erhöhen die Ladezeit deutlich, das Komma-Problem lässt sich durch mehr Nachkommastellen einfach beheben, das Zeit-Problem ist die Kaffepause wie sie jeder Programmierer kennt :rolleyes:


    Ich möchte hier anmerken das eine Funktion nicht dazu gedacht ist um Arbeitsschritte bis zu einem gewünschten Punkt zu wiederholen, dafür haben wir die semantisch korrekten Schleifen, daher erklärt sich auch warum Funktionen ewig brauchen und einen Stack Overflow erzeugen, ein Fahrrad fährt schließlich auch nicht rückwärts, schlechtes Beispiel.
    Außerdem kann man schlecht Visual Basic und PHP Vergleichen, Visual Basic hat genügend Ressourcen, die Systemressourcen von PHP sind stark beschränkt, dies lässt sich in der php.ini regulieren jedoch auch nur bedingt.


    Letztendlich bleibt es eben Ansichtssache ob man auf goto zurückgreifen möchte, in meinen Augen ist es "unreines" programmieren da der Codefluss unterbrochen wird, das ist einfach ein Anlass für Fehler im Programm, mir fällt spontan auch absolut keine Situation ein in der ich tatsächlich sagen würde: "Hier macht goto Sinn" (und ich habe schon an vielen Projekten gesessen, auch größeren).


    Ich habe noch einen Test angestellt, eine simple Funktion um eine Verbindung zu einer Datenbank herzustellen; Die Funktion war sogar minimal schneller als goto, deine Aussage das Funktionen das Programm ausbremsen ist also nicht korrekt.


    Im offiziellen Artikel zu goto von php.net eingebunden:
    [Blockierte Grafik: http://www.php.net/manual/de/i…037f3016001-xkcd-goto.png]
    Bild von xkcd

  • Im Bereich der Web-Anwendungen wird es zugegeben bestimmt genug Möglichkeiten geben auf GOTO zu verzichten. Wenn ein PHP nur kurz rechnen soll, um Daten anzuzeigen, dann wird man darauf auch verzichten können. Falls ich bei der Erstellung meiner Internetseite mal ein PHP erstellen muss, das ohne GOTO definitiv nicht realisierbar ist, dann kann ich mich ja wieder zu diesem Thema melden...
    Außerhalb der Web-Anwendungen geht es ohne Sprungmarken und entsprechender Befehle aber definitiv nicht.

  • Wenn man ohne Sprungmarken a la goto nicht herum kommt muss schon einiges passieren. Wie gesagt auch ein Funktionsaufruf ist eine Sprungmarke, von daher stimme ich dir zu: Ohne geht es nicht. Sprungmarken wie goto sind (zumindest in den großen Sprachen wie z.B. C++ oder auch Java) nicht so wichtig wie du es darstellst. Nicht umsonst gilt solche Programmierung bei vielen Programmierern als unordentlich.


    Es gibt wie gesagt auch große PHP Programme, die Technik hinter diesem Forum zum Beispiel, auch dort ist goto niemals wirklich notwendig.

  • Also große Computerspiele wie die der führenden Konsolen, gehen ohne Sprungmarken definitiv nicht. ;)


    STOP!!!! Ab jetzt komme ich vom Thema ab! Nur dann weiterlesen, wenn man sich für Sortierverfahren interessiert!


    Ich habe es mal geschafft "Quicksort" in einen Basiccode zu übersetzen, der auf jedem System läuft. Mit Anpassung an das jeweilige System natürlich. Ohne GOTO und Sprungmarken wäre das aber definitiv nicht möglich gewesen.
    "Quicksort" arbeitet nämlich mit "Rekursionen". Der Algorithmus teilt den Datenbereich beim sortieren in Teilbereiche auf und erzeugt von sich selbst Klone, die diese kleineren Bereiche sortieren und sich anschließend selbst wieder löschen. Klone können dabei von sich selbst ebenfalls Klone erstellen und die dann ebenfalls und so weiter... In 50% aller Fälle kommt es sogar dazu, dass die maximale Anzahl aller gleichzeitig aktiven "Quicksort"-Algorithmen, mit der Anzahl der Datensätze identisch ist. Wenn man also 10.000 zu sortierende Daten hat, dann läuft das Programm "Quicksort" auch 10.000 Mal gleichzeitig parallel. Da geht jeder Computer in die Knie...
    Das Problem mit den "Rekursionen" habe ich mit einer Datenbank innerhalb von "Quicksort" gelöst. Wenn "Quicksort" sich klont, dann werden alle aktuellen Variablen von "Quicksort" am Ende eines Arrays gespeichert. Erstellt der Klon dann einen weiteren Klon, speichert er seine Variablen zuvor ebenfalls am Ende des Arrays. Ist ein Klon fertig, dann werden seine Variablen mit denen des letzten Eintrags im Array überschrieben. Dadurch kann der vorherige Klon genau da weitermachen, wo er sich klonen musste. Das geht dann so lange weiter, bis das Array leer ist. Der Vorteil: Es läuft nur EIN MAL "Quicksort" und die Klone werden alle nur von diesem einen "Quicksort" durch das Array simuliert.
    Es gibt übrigens nur einen Algorithmus zum sortieren, der noch schneller als "Quicksort" ist und das ist "Shellsort". Etwas Schnelleres hat noch keiner programmiert.
    "HOPASA-Sort" (1986) und "HOPASA-Sort 2" (1988 ) sind von mir. (HOld Position And Shove Away) Von der Geschwindigkeit her liegt mein Algorithmus etwa im Mittelfeld aller bekannter Sortierverfahren. Meinen Algorithmus habe ich aber bis jetzt noch nicht veröffentlicht. Leider zu langsam für die Praxis...

  • Also große Computerspiele wie die der führenden Konsolen, gehen ohne Sprungmarken definitiv nicht. ;)


    Das stimmt unbesehen. ABER deren Sprungmarken sind wiederum FUNKTIONEN, keine goto!!!


    Goto ist ineffizienter als Schleifen und zeugt von einem schlampigen Programmierstil. Details wurden von meinen Vorpostern ausführlich genannt, und du wirst in sämtlichen einschlägigen Programmierforen (außer Java :P) keine zweistellige Anzahl an Leuten finden, die goto verwenden und gut finden. Aus guten, bereits genannten Gründen.


    Aber wie schon gesagt, jeder hat einen eigenen Programmierstil, nur 90% halten den goto Stil für schlampig und faul ;)

  • So, jetzt misch ich hier auch mal ein. Also erstens: goto ist ein absolutes no-go. Ich weiß ja nicht in welchem Jahrhundert du das gelernt hast, aber heutzutage benutzt man es definitiv nicht mehr. Ich glaube mein Prof an der Uni würde mich postwendend exmatrikulieren, wenn ich auch nur auf die Idee kommen würde goto zu verwenden. Man macht es einfach nicht. Wenn du der Meinung bist, dass es besser ist als Funktionen, solltest du dir eventuell von Menschen die mehr Erfahrung in PHP haben als du sagen lassen, dass man es nicht verwendet. Es mag ja sein dass man es vor 40 Jahren in anderen Programmiersprachen noch verwendet hat, weil es da noch nichts anderes gab, aber heutzutage kenne ich keine einzige relevante mehr, in denen goto über Funktionen steht, erst recht nicht PHP. Das ist einfach bad practice. Wenn du so programmieren willst, bitte schön, aber hier im Forum wird dir immer jemand sagen, dass es so nicht gemacht wird, wenn du uns einen Code zeigst. Tendenziell werden dir auch weniger Leute antworten, weil niemand Lust hat sich durch solche Codes zu wühlen.


    So, nunmal zum Quicksort.


    Zitat

    In 50% aller Fälle kommt es sogar dazu, dass die maximale Anzahl aller gleichzeitig aktiven "Quicksort"-Algorithmen, mit der Anzahl der Datensätze identisch ist.

    Erstens sind es nicht 50% - dieser Fall tritt genau in 2 von n Fällen auf (n = Anzahl der Elemente). Zweitens: Das mag ja stimmen, allerdings trifft dies nur auf den reinen Quicksort zu, der in der Praxis nicht verwendet wird. Entscheidend beim Quicksort ist die Suche des sogenannten Pivot-Elements (das, bei dem geteilt wird). Je weiter dieses Element in der Mitte der zu sortierenden Werte liegt, desto schneller ist Quicksort. Unterstützt man Quicksort also mit einem zusätzlichen Algorithmus, der die Wahrscheinlichkeit erhöht, dass Elemente in der Mitte des Wertebereichs gewählt werden, so wird die Wahrscheinlichkeit des von dir beschriebenen Falles wesentlich geringer. Die Zeitkomplexität von Quicksort im durchschnittlichen Fall beträgt O(n*log(n)), diesen Wert kann der von dir genannte Shellsort noch nicht mal theoretisch erreichen. Wird nun die Wahrscheinlichkeit des von dir genannten worst case beim Quicksort mit einer Zeitkomplexität von O(n^2) also gesenkt und zusätzliche für kleinere Teilfelder ein anderer, für wenige Datensätze optimierter Algorithmus verwendet (z.B. Insertion Sort), gibt es keinen mir bekannten Algorithmus der schneller und praktikabel einzusetzen ist.


    Zitat

    Wenn man also 10.000 zu sortierende Daten hat, dann läuft das Programm "Quicksort" auch 10.000 Mal gleichzeitig parallel. Da geht jeder Computer in die Knie...

    Falsch - für 10000 parallele Aufrufe bräuchte man 10000 Prozessorkerne. Logischerweise gehen das "Hauptprogramm" und alle Sub-Teile davon in den IDLE-Modus, sobald sie die Teilung und die Sortierung der Teile angestoßen haben. Erst nach der Sortierung von diesen (und allen rekursiv darunter liegenden), wird es wieder "aufgeweckt" und setzt seine Arbeit fort. So arbeiten übrigens alle Programme auf modernen Prozessoren.. Oder friert dein PC komplett ein bis die Antwort von deinem Drucker kommt wenn du einen Druckauftrag anstößt. Auf die verschiedenen Scheduling-Methoden gehen wir hier jetzt mal nicht näher ein.


    Zitat

    werden alle aktuellen Variablen von "Quicksort" am Ende eines Arrays gespeichert.

    Die von dir genannte "Verbesserung" ist in der Praxis komplett unpraktikabel, da er durch das zusätzliche Array zum externen Algorithmus wird und damit praktisch nicht mehr einsatzfähig ist (siehe Mergesort - dieser hat auch im worst case eine Zeitkomplexität von O(n log(n)), ist aber extern und hat deshalb praktisch 0 Bedeutung).



    Ich würde dich bitten, in Zukunft davon abzusehen, deine "Meinung" als universelle Wahrheit hier im Forum zu verkaufen. Es ist in Ordnung wenn du von einem Thema keine Ahnung hast oder dich in aktuelle Praktiken nochmal einlesen müsstest weil du nicht mehr auf dem aktuellen Stand bist, aber BITTE verkaufe deine Meinung hier nicht als die einzig wahre und bitte achte BESONDERS darauf, wenn du eine Lösung postest zu überprüfen, dass diese auch noch dem aktuellen Stand der Technik entspricht. Wir haben hier viele Anfänger, und denen bringen wir definitiv nicht mehr das bei, was 1986 aktuell war. Wenn du das noch so machen möchtest ist das deine Sache, aber bitte sehe in Zukunft davon ab, solche Dinge hier im Forum zu posten. Danke.

  • Ich hab gerade mal probiert ein Funktionsaufruf ohne functions nachzubilden.
    Also anstatt:
    $ergebnis = function_name($para,$para2);
    ein goto basierter Aufbau, wobei die Vorteile einer function beibehalten werden sollten ("return ergenis in var x" und para mitgeben ect).
    Ergebnis: vergisses.
    Mal von der para-Prüfung usw abgesehen, ... es ist einfach total unübersichtlich.


    Ich kenne goto von C=64 Zeiten (BASIC) und hab es in den ersten Monaten in PHP auch genutzt.
    Du bekommst aber nur linearen(falsches Wort glaub ich) Code damit hin.
    Wiederverwendbarkeit geht flöten, oder ist umständlich, da Du immer hinterher sein musst, ob zB var $a nicht irgentwo vergessen wurde wieder auf null zu setzen.


    Ich kenn jetzt kein C, C++, oder JAVA. Aber ich kann mir nicht vorstellen, dass es dort keine functions gibt.
    Ich könnte gar nicht mehr ohne, und schon gar nicht ohne Klassen, die ja nun wirklich sehr vieles einfacher/wiederverwendbarer machen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!