fortführende Buchtabenreihe mit PHP
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abc
anzahl
aufruf
beitrag
break
buchstabe
count
funktion
flle
informatik
lehrer
los
lsung
mglichkeit
prinzip
rekursion
result
schleifen
schlsselwert
scout
-
Jo hi leute. Vll kann mir von euch jkemand helfen. hab nur noch bis morgen abend zeit... Hab jetzt 5 Tage vor google gehangen!
Ich soll eine function, classe oder script (was effektiver ist) schreiben, die macht, das php buchstaben wie zahlen hochrechnet z.b.
a, b, c ... x, y, z, aa, ab, ac, ay, az, ba, ... zy, zz, aaa usw. UND das man die anfangsbuchstaben selbst bestimmt (so das man z.b. mit abc anfängt so das danach abd kommt)
Ich hoffe ich hab das verständlich erklärt, durch Google und oc bin ich nciht schlauer geworden...
Fragt mich nicht was mein lehrer damit bezwecken will...
bei fragen meldet euch
!HERZLICHES DANKESCHÖN IM VORRAUS!
P.S. Hilfe in Foren ist erlaubt, ich muss das nur mit Quellthread den Lehrer melden...
Beitrag geaendert: 14.5.2007 22:52:14 von mergener -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Eine Funktion sollte genügen.
Zuerst berechnest du die Zahl in das richtige Format vor, a hat den Wert 1 bis z mit 26.
Die Umrechnung geht ganz einfach, wie man sie auch beim Binär, Hexadezimalsystem und so braucht. Google mal danach...
Beispiel
Zahl: 2214
2214 : 26 = 85 Rest 4
85 : 26 = 3 Rest 7
3 : 26 = 0 Rest 3
Jetzt einfach die Reste von unten nach oben lesen. 2214 entspricht also 3.7.4
Das solltest du jetzt umsetzten können, am besten speicherst du das dann in einem Array.
Dann füllst du in ein weiteres Array alle Buchstaben, a-z.
Dann fügst du einen String zusammen, wobei du für jede Zahl im ersten Array den Buchstaben per Index einfügst (-1 nicht vergessen).
Wenn du einen startwert setzten willst, musst du diesen erst mal in eine normale Zahl verwandeln. Zuerst liest du für jeden Buchstaben die Position im array aus.
abc = 0.1.2 -> +1 -> 1.2.3
dann rechnest du in einer Schlaufe von hinten nach vorne
x * (26^n) x die zahl, hier 3,2,1 und n immer um eins erhöhen, also 0,1,2,3,4 ...
die einzelnen Zahlen fügst du jetzt zusammen, abc entspricht 731
jetzt nur noch diese Zahl zum ersten parameter hinzufügen und fertig
Beitrag geaendert: 15.5.2007 8:37:54 von nigolaz -
Fragt mich nicht was mein lehrer damit bezwecken will...
Wie ich die Informatik-Lehrkörper so kenne, denke ich mal er will auf das hier hinaus:
http://de.wikipedia.org/wiki/Rekursion#Programmierbeispiel
Der Artikel ist seeeehr theoretisch, vielleicht kannst du ja mit den Beispielen was anfangen.
Im Prinzip gehts drum, dass eine Funktion in einer Schleife eine Reihe abarbeitet und sich (dank Rekursion) selbst aufrufen kann, um innerhalb der Reihe eine weitere Reihe abzuarbeiten -- und das immer so weiter. -
Frage mal im IRC-Channel #php.de nach. Dort hatte jemand ein sehr einfaches und sehr kurzes Script für diese Aufgabe.
Habe es leider nicht mehr. :/ -
Na wenn er nur das Script will, könnt ich das kurz proggen. Aber ich denke mal er möchte das auch verstehen oder?
Grüßle -
Fragt mich nicht was mein lehrer damit bezwecken will...
Wie ich die Informatik-Lehrkörper so kenne, denke ich mal er will auf das hier hinaus:
http://de.wikipedia.org/wiki/Rekursion#Programmierbeispiel
Der Artikel ist seeeehr theoretisch, vielleicht kannst du ja mit den Beispielen was anfangen.
Im Prinzip gehts drum, dass eine Funktion in einer Schleife eine Reihe abarbeitet und sich (dank Rekursion) selbst aufrufen kann, um innerhalb der Reihe eine weitere Reihe abzuarbeiten -- und das immer so weiter.
Ist wahrscheinlich ganz einfach, aber ich sehe den rekursiven Weg einfach nicht ... -
Lehrer is krank, somit hab ich ne woche mehr zeit^^
Naja @scout: wenn du das machen würdets mit guten kommentarne würd ich dich heiraten!
@alopex ich muss nigolaz recht geben., also ich sehe das nicht da drinnen
@lucas selbst mIrc stürzt bei mir ab. Hab halt n scheiss PC :(
@nigolaz hab dein post nicht kapiert. naja ich schau mir den am frietag an. is ja jetzt auch spät...
@alle danke für eure hilfe. werde die bis do abend/freitag nicht posten können da ich arbeiten muss. Dr RingDing is bei uns auf ner Tour und ich mach bandbetreuung und vll das frühstück für die^^ *bonz*
Beitrag geaendert: 15.5.2007 23:24:55 von mergener -
Habe das ganze heute morgen (während dem Untericht) umgesetzt. Leider war das einzig programmierbare mein Taschenrechner.
Ungestestet, die umsetztung in php:
<?php /* $wert ist die Zahl, $zeichen die anzahl buchstaben du wirst wahrscheinlich 26 verwenden, aber man kann damit auch binäre, hexadezimale oder nach fantasie eigene werte verwenden */ function umwandeln($wert, $zeichen) { $string = ""; /*Google mal dach hexadezimal oder binär, dann erkennst du, wofür ich den modal-wert brauche */ while($wert>0) { $ziffer_wert = $x%$y; $ziffer_zeichen = wert2zeichen($ziffer_wert); $string = $ziffer_zeichen . $z; $wert = $wert - $ziffer_wert; $wert = $wert / $zeichen; } } ?>
<?php //das könnte man auch in die obere funktion einschliessen, ist übersichtlicher function wert2zeichen($wert) { $array = array('a','b','c','d','e','f','g' ... ) ; /*Dieses array kann man jetzt mit allen nötigen zeichen füllen, bei dir a-z, aber versuch mal 0-10, zum testen, ob es funktioniert, oder 1-f für hexadetimal ... vielleicht sollte man das hier auch mit einem zeichensatz lösen aber das ist einfacher */ return $array[$wert-1]; // ich liebe den index, auf meinem tr habe ich 30 if-abfagen untereinander } ?>
<?php for($i = 1, $i<10, $i++) echo umwandeln ($i, 26); ?>
EDIT: Oben wird nicht alles angezeigt...
EDIT2: kA wieso, aber musste es in 3 abschnitten schrieben, weil der untere teil abgeschnittern wurde...
EDIT3: Die Syntax-Hervorhebung spiel verrückt ...
Beitrag geaendert: 16.5.2007 15:57:28 von nigolaz -
ok auf vielfachen Wunsch hab ich da mal eine Lösung zusammengezimmert...
Hoffe ihr versteht es, was ich gemacht habe - ansonsten einfach fragen.
Testmöglichkeit: http://scout.lima-city.de/loesungen/buchstabenreihe.php
Grüßle
<?php $chars = array('a','b','c','d','e'); $anz = 0; echo "<html><body>"; echo "<form action='".$_SERVER['PHP_SELF']."' method='post'>"; echo "Start: <input type='text' name='start' value='".$_POST['start']."'><br>"; echo "Stop: <input type='text' name='stop' value='".$_POST['stop']."'><br>"; echo "<input type='submit' name='los' value='los gehts...'>"; echo "</form>"; if (isset($_POST['los'])) { echo "Ergebnisreihe:<br>"; } function buch($num_arr, $max_arr, $anz){ global $chars; global $anz; if (array_equal($num_arr, $max_arr)) { // Abbruch wenn Ziel erreicht return; } else { echo digit_arr2char($num_arr)."<br>"; $anz++; $num_rev = array_reverse($num_arr); foreach($num_rev as $k => $v) { if ($v==count($chars)-1) { if (count($num_rev)==$k+1) { // letztes Zeichen -> setze auf a $num_rev[$k] = 0; array_unshift($num_rev, 0); break; } else { $num_rev[$k] = 0; } } else { $num_rev[$k] = $num_rev[$k] + 1; break; } } $num_arr = array_reverse($num_rev); buch($num_arr, $max_arr, $anz); } } function array_equal($arr1, $arr2){ foreach($arr1 as $k => $v) { if ($v<>$arr2[$k]) { return false; } } return true; } function char2digit_arr($zeichen){ global $chars; $ret = array(); // Testpattern ob nur Zeichen von a-z if (!eregi("^([a-z]+)$", $zeichen)) return array(); // Zeichen in Array Wandeln $ret = str_split($zeichen); foreach($ret as $k => $v) { // bestimme den Key in $chars vom Wert $v $chars_key = array_search($v, $chars); // speichere den Schlüsselwert in $ret anstatt das Zeichen $ret[$k] = $chars_key; } return $ret; } function digit_arr2char($dig_arr){ global $chars; $ret = ""; if (!is_array($dig_arr)) return ""; foreach($dig_arr as $k => $v) { $dig_arr[$k] = $chars[$v]; } $ret = implode("",$dig_arr); return $ret; } if (isset($_POST['los'])) { $arr_start = char2digit_arr($_POST['start']); $arr_stop = char2digit_arr($_POST['stop']); if ((count($arr_start)>0) and (count($arr_stop)>0)) { buch($arr_start,$arr_stop,$anz); } } echo $_POST['stop']."<br>"; echo "-----------------------<br>"; echo "Anzahl: ".$anz; echo "</body></html>"; ?>
Beitrag geaendert: 17.5.2007 1:14:19 von scout -
Ok anbei nochmal ein Script, dass keine Recursion macht.
PHP scheint irgendwie eine maximale Tiefe von Recursionen zu haben und bricht dann ab und zu ab. Hier also ohne Recursion.
<?php $chars = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); $anz = 0; if (!empty($_POST['start'])) $start = $_POST['start']; else $start = ""; if (!empty($_POST['stop'])) $stop = $_POST['stop']; else $stop = ""; echo "<html><body>"; echo "<form action='".$_SERVER['PHP_SELF']."' method='post'>"; echo "Start: <input type='text' name='start' value='".$start."'><br>"; echo "Stop: <input type='text' name='stop' value='".$stop."'><br>"; echo "<input type='submit' name='los' value='los gehts...'>"; echo "</form>"; if (isset($_POST['los'])) { echo "Ergebnisreihe:<br>"; } function buch($num_arr, $max_arr, $anz){ global $chars; global $anz; if (array_equal($num_arr, $max_arr)) { // Abbruch wenn Ziel erreicht return; } else { echo digit_arr2char($num_arr)."<br>"; $anz++; $num_rev = array_reverse($num_arr); foreach($num_rev as $k => $v) { if ($v==count($chars)-1) { if (count($num_rev)==$k+1) { // letztes Zeichen -> setze auf a $num_rev[$k] = 0; array_unshift($num_rev, 0); break; } else { $num_rev[$k] = 0; } } else { $num_rev[$k] = $num_rev[$k] + 1; break; } } $num_arr = array_reverse($num_rev); return array($num_arr, $max_arr, $anz); // buch($num_arr, $max_arr, $anz); } } function array_equal($arr1, $arr2){ if (count($arr1)<>count($arr2)) { return false; } foreach($arr1 as $k => $v) { if ($v<>$arr2[$k]) { return false; } } return true; } function char2digit_arr($zeichen){ global $chars; $ret = array(); // Testpattern ob nur Zeichen von a-z if (!eregi("^([a-z]+)$", $zeichen)) return array(); // Zeichen in Array Wandeln $ret = str_split($zeichen); foreach($ret as $k => $v) { // bestimme den Key in $chars vom Wert $v $chars_key = array_search($v, $chars); // speichere den Schlüsselwert in $ret anstatt das Zeichen $ret[$k] = $chars_key; } return $ret; } function digit_arr2char($dig_arr){ global $chars; $ret = ""; if (!is_array($dig_arr)) return ""; foreach($dig_arr as $k => $v) { $dig_arr[$k] = $chars[$v]; } $ret = implode("",$dig_arr); return $ret; } if (isset($_POST['los'])) { $arr_start = char2digit_arr($start); $arr_stop = char2digit_arr($stop); if (count($arr_start)>count($arr_stop)) { echo "Start darf nicht größer als Stop sein!"; echo "</body></html>"; exit; } if ((count($arr_start)>0) and (count($arr_stop)>0)) { $result = array($arr_start,$arr_stop,$anz); while (!array_equal($result[0], $result[1])) { $result = buch($result[0],$result[1],$result[2]); } } } echo $stop."<br>"; echo "-----------------------<br>"; echo "Anzahl: ".$anz; echo "</body></html>"; ?>
Grüßle -
Bei deinem Link klappt das nicht.
Und wieso denn so kompliziert? Geht ja wirklich viel einfacher... -
Hmm ich weiß jetzt zwar nicht, warum der bei dir nicht geht, bei mir gehts jedenfalls. Ok man sollte natürlich Kleinbuchstaben verwenden und der Stopwert > Startwert sein.
Zum Bsp.:
Start: aa
Stop: abcd
@nigolaz:
Ich weiß dass es bestimmt einfacher geht, aber bevor ich mir krampfhaft überlege wie es am Effektivsten geht, habe ich halt die schnellste Methode gewählt. Sorry aber hab das Ding in gerade mal 20 min zusammengestrickt und das gegen Mitternacht
Aber jetzt hast du mich neugierig gemacht...nun warte ich mal auf deine Lösung
Grüßle
Beitrag geaendert: 17.5.2007 15:24:40 von scout -
Sry, deine Lösung funktioniert ganz gut. Ich war nur zu blöd.
Sieh mal weiter oben, da ist meine Lösung. ;) Viel zeig genommen hab ich mir auch nicht.
Auf meine TR funtioniert das ganze zumindest recht gut, die PHP version hab ich nicht getestet.
Allerdings habe ich den Fokus eher auf das Umwandeln in andere Zahlensysteme gelegt, so dass man das ganze auf für binär oder hexadezimale zahlen verwenden kann, indem man einfach einen anderen Zahlenbereich wählt.
Während dem Schreiben ist mir gerade eine andere Möglichkeit in den Sinn gekommen, poste sie ev später noch...
-
Ihr Freaks, ich komm grad von der schaff heim nach knapp 24 arbeiten und les das hier... Ich Danke euch!
Beim überfliegen hab ich zwar nichts kapiert, naja hab ja auch nur 4 Stunden gepennt, aber scouts lösung ist genau die, die gefragt war. jetzt muss ich nur noch das alles kapieren!
@nigolaz: Wat hast du den für ein Taschenrechner???
@scout: Danke, ist ja auch ein wenig Kommentiert, ich denke wenn ich mich dahinterklemme kapier ichs. Wobei ich immernoch nicht kapiert habe, was Recursion ist. Ich kenn nur Rekrusiv, und das ist etwas anderes!
Aber ist das Programm rein PHP5?
Hab das mal getestet:
http://cherrybomb-concerts.de/modules/index.php
der findet die eine function nicht! -
mergener schrieb:
Aber ist das Programm rein PHP5?
...
der findet die eine function nicht!
die Funktion str_split() funktioniert sogar NUR unter PHP5 ! ( siehe http://de3.php.net/manual/de/function.str-split.php )
Hast du bei der Domain evtl ein PHP4 oder so laufen? ...mal bitte mit
<? phpinfo(); ?>
austesten.
Sorry, habe mich bei "Recursion" vertan. Im Deutschen wird das Rekursion geschrieben und ist mit Rekursiv gleich zu setzen lt. Wikipedia.
Rekursion ist jedenfalls der Aufruf der Funktion in sich selbst.
Zum Bsp. zählen über Rekursion gelöst:
<? function rekursion($value, $max) { if ($value>$max) return; echo $value."<br>"; $value = $value +1; rekursion($value, $max); } rekursion(0, 20); ?>
Grüßle
Beitrag geaendert: 17.5.2007 22:31:06 von scout -
TI-89 Titanum
Ist ziemlich beschränke Sprache, hab jetzt wenigstens eine bessere Möglichkeit gefunden, als 30 if-Abfragen untereinander: ein string und dann von beiden seiten alle buchstaben ausser dem mit der bestimmten nummer wegschneiden, also 1 für a ...
gibt übrigens noch eine bessere möglichkeit, als das array mit "a", "b" zu füllen. man kann ja auf $string[index] zugreifen.
EDIT:
Gibt es die Möglichkeit $string[index] in PHP überhaupt? Hab ein Durcheinander von ein paar Sprachen...
Gab mein Script oben noch getestet, macht aber probleme. Muss noch einiges ändern, versuche aber auch noch eine andere Möglichkeit, mal sehen, ob das was wird...
Beitrag geaendert: 17.5.2007 23:24:19 von nigolaz -
man kann auch ganz einfach die zeichen zählen und dann das letzte Zeichen mittels ord() in ein ASCII Zeichen umwandeln.. Dann dieses mit 1 addieren und mit chr() wieder zum zeichen machen und das letzte zeichen austauschen.
Dann noch eine kleine schleife basteln welche wenn das letzte Zeichen vor der Umwandlung ein z ist (zB: aksz) ein zeichen zurück springt und dies um eins erhöht.. oder halt ein a hinten dran setzt.. je nach wunsch..
Code poste ich hier nicht zu.. sollt ja auch was lernen.. könnt ihr euch selbst basteln -
function acount($start) { $start = strtolower($start); for( $i=1, $l=strlen($start) ; $i<=$l; $i++ ) { $c = ord($start[ $l-$i ]); if($c == 122) { $start[ $l-$i ] = 'a'; if( !($l-$i) ) { $start[ $l ] = 'a'; } } else { $start[ $l-$i ] = chr($c+1); break; } } return $start; }
und dann einfach aufrufen mit z.b:
$start="zzd"; for( $i = 0; $i <100; $i++ ) { $start = acount($start); echo $start.'<br>'; }
der hässlcihe smilie erscheint übrigens einfahc bei ")"
Beitrag geaendert: 25.5.2007 9:59:12 von coderinside -
Tja was soll ich sagen... schicke Lösung - gefällt mir. Nur leider haben es mir die Arrays halt angetan.
codeinside deine Lösung ist auch ca. 8 Sekunden schneller auf 1 Mio. Sprünge
Grüßle -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage