| ASP, PERL, CGI, C und alles andere Wolle ma net so sein. Obwohl Perl, ASP, C und TCL zu den minderwertigen Internet-Skriptsprachen zählen, dürfen ab sofort hierzu auch Fragen gestellt werden. ;) |
 |

01-05-2010, 18:25
|
|
Jessy_87
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 9
|
|
Sortieren von Zeichenketten (Array)
Hallo ihr lieben,
ich versuche schon seit Stunden mein kleines Script fertig zu bekommen, aber scheitere am richtigen Einsatz der for-schleife
die Zeichenketten sind in a[i] gespeichert ( i steht für die anzahl der zk, kleine zählvariable). die zeichenketten sollen lexikografisch sortiert werden.
der pseudocode sieht bisher folgerndermaßen aus:
PHP-Code:
for(j=0; j <= i-1; j++) { strcmp(a[erstes element], a[nächstes element]); }
aber wie spreche ich in der schleife immer das erste element und das folgende des arrays an, vergleiche die beiden und tausche gegebenfalls?
also bei
j=0 --> a[0] und a[1];
j=1 --> a[1] und a[2];
hier mal nen kleines beispiel, was rauskommen sollte:
Eingabe: --> wird zu:
Code:
aab aaa
aaa aab
adc adc
czw czw
würde mich über ne kleine hilfestellung sehr freuen
edit: mir fällt grad ein, das folgende variante laufen sollte:
for(j=0; j <= i-1; j++) {
strcmp(a[0+j], a[1+j]);
}
Geändert von Jessy_87 (01-05-2010 um 18:29 Uhr)
|

01-05-2010, 18:27
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
|

01-05-2010, 18:34
|
|
Jessy_87
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 9
|
|
das problem ist dabei, dass ich nicht in php schreibe, sondern in C, sich aber die grundlegende Syntax nicht unterscheidet...
|

01-05-2010, 18:48
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von Jessy_87
das problem ist dabei, dass ich nicht in php schreibe, sondern in C
|
Dann bist du hier im Forum wohl ein wenig falsch.
|

01-05-2010, 18:51
|
|
Jessy_87
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 9
|
|
naja im c-forum ist recht wenig los und wie schon gesagt, die syntax ist letztlich die gleiche
also wie würde es ohne die sort()-fkt gehen?
|

01-05-2010, 18:54
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von Jessy_87
naja im c-forum ist recht wenig los und wie schon gesagt, die syntax ist letztlich die gleiche
also wie würde es ohne die sort()-fkt gehen? 
|
Du kannst dir ja den Source-Code von sort() anschauen. PHP ist auch nur in C programmiert.
|

01-05-2010, 19:03
|
|
Jessy_87
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 9
|
|
ehm....
rein theoretisch müsste der folgende code mit einer hilfsvariablen doch richtig sein, oder?
Code:
for (j=0; j<=i-1; j++) {
if (strcmp(a[0+j], a[1+j]) == 1) { // zweites element ist größer als erstes
char tmp = a[0+j];
a[0+j] = a[1+j];
a[1+j] = tmp;
}
}
|

01-05-2010, 19:30
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.307
|
|
Also wenn es hier um C geht, ist das definitiv das falsche Forum. Daher * verschieb *
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

01-05-2010, 20:06
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 679
|
|
C selbst hat keine eingebaute Sortierfunktion. Aber die Standard-Library hat eine. Der übergibst du einen Zeiger auf deine Vergleichsfunktion. Insofern ist die Vorgehensweise tatsächlich so ähnlich (aber nicht gleich) wie in PHP.
Mit einer For-Schleife bekommst du jedenfalls in beiden nichts sortiert. Mit zwei verschachtelten schon. Dieses Verfahren nennt sich Bubblesort.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

01-05-2010, 20:24
|
|
Jessy_87
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 9
|
|
habe es mittlerweile raus...
und ja ich hab zwei verschaltelte for-schleifen
|

01-05-2010, 21:15
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 679
|
|
Zitat:
Zitat von Jessy_87
habe es mittlerweile raus...
und ja ich hab zwei verschaltelte for-schleifen 
|
Quellcode oder nie passiert.
Mit nur einer for-Schleife kann man ein C-Array nicht sortieren. Und strcmp() eignet sich nicht zur lexikographischen Sortierung -- es vergleicht "ASCII-betisch".
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

01-05-2010, 21:36
|
|
Jessy_87
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 9
|
|
ok, das versteh ich nicht so recht
bei mir funktioniert es einwandfrei...
PHP-Code:
void sortieren(){ for (k=0; k < i-1; k++) { for (j=0; j<i-1; j++) { if (strcmp(a[j], a[j+1]) == 1) { char *tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } }
davon abgesehen, dass bubble-sort echt nen blöder algorithmus ist (laufzeit)...
Geändert von Jessy_87 (01-05-2010 um 21:39 Uhr)
|

02-05-2010, 18:30
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 679
|
|
Zitat:
Zitat von Jessy_87
...
bei mir funktioniert es einwandfrei...
|
Erlaubst du mir, dies zu bezweifeln?
Zitat:
PHP-Code:
void sortieren(){
for (k=0; k < i-1; k++) {
for (j=0; j<i-1; j++) {
if (strcmp(a[j], a[j+1]) == 1) {
char *tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}
|
Meine C-Kenntnisse sind nicht sehr gut, aber irgendwas sagt mir, dass das Aus-dem-Hut-Zaubern bspw. der Variablen a einen ordentlich konfigurierten Compiler dazu veranlassen dürfte, mindestens eine Warnung auszuspucken. Das Gleiche gilt für "k < i - 1" ohne vorherige Deklaration und Initialisierung von i. Und strcmp() liefert bei Ungleichheit durchaus auch andere Werte als nur 1.
Da ich keine Lust auf Warnungen und Fehlermeldungen eines C-Compilers hatte, hab ich das mal in PHP nachgebaut:
PHP-Code:
function sortieren($a) {
for ($k = 0; $k < $i - 1; $k++) {
for ($j = 0; $j < $i - 1; $j++) {
if (strcmp($a[$j], $a[j+1]) === 1) {
$tmp = $a[$j];
$a[$j] = $a[$j + 1];
$a[j + 1] = $tmp;
}
}
}
return $a;
}
// dein Ausgangsarray
$a = preg_split('/\s+/', '
aab aaa
aaa aab
adc adc
czw czw
', -1, PREG_SPLIT_NO_EMPTY);
// die Funktion aufrufen
$x = sortieren($a);
//
var_dump($x);
Bei Ausführung dieses Scripts wird ein nicht initialisiertes $i bemäkelt.
Außerdem ist das Ergebnis-Array in der gleichen Reihenfolge sortiert, wie das Ausgangs-Array ...
Einwandfreies Funktionieren stelle ich mir etwas anders vor ...
Zitat:
|
davon abgesehen, dass bubble-sort echt nen blöder algorithmus ist (laufzeit)...
|
Seine Laufzeit dürfte der deines Ansatzes gleich kommen -- zwei verschachtelte For-Schleifen über ein Array von Zeichenketten ...
Warum benutzt du nicht, wie von mir vorgeschlagen, die in der Standard-Lib eingebaute Sortierfunktion?
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

02-05-2010, 18:53
|
|
Jessy_87
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 9
|
|
alle benötigten variablen wurden vor der main()-fkt deklariert und initialisiert...
dein quellcode in php ist doch genau der gleiche wie auch meiner
nur die qsort-fkt sollte ich mir mal anschauen...
|

02-05-2010, 22:56
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 679
|
|
Zitat:
Zitat von Jessy_87
alle benötigten variablen wurden vor der main()-fkt deklariert und initialisiert...
|
Globale Variablen ...?
*wegrenn*
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|