![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#11 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.107
|
![]() Kann mir jemand erklären wieso dieser Code nix ausgibt?:
Code:
#include <iostream.h> void sort(char[]); int main() { const int i=100; char string[i]; cin>>string[i]; sort(string); return 0; } void sort (char string[]) { long i,start,len= strlen(string); int nochmal; char swap_char; if(len<2) return; for(start=0,nochmal=0;nochmal;start++) { for(i=start+1;i<len;i++) { if(string[start]>string[i]) { nochmal= 1; swap_char= string[start]; string[start]= string[i]; string[i]= swap_char; cout<<string[i]; } } } } ![]() |
![]() |
![]() |
![]() |
#12 | |
Hero
![]() |
![]() Zitat:
Guter Hinweis zum Heap.
____________________________________
Bibel |
|
![]() |
![]() |
![]() |
#13 | |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() Zitat:
Der Kopf der for schleife besteht immer aus Code:
for ( Vorbereitung[,Vorbereitung[,...]]; Bedingung oder Zuweisung/Funktionsaufruf als Bedingung[,Bedingung oder Zuweisung/Funktionsaufruf als Bedingung[,...]]; Increment/Dekrement bzw. zweckentfremdet Funktions/Prozeduraufruf(e) mit oder ohne logische Verknüpfungen[,Increment/Dekrement bzw. zweckentfremdet Funktions/Prozeduraufruf(e) mit oder ohne logische Verknüpfungen[,...]] ) also kurz: for ( Vorbereitung ; Bedingung ; Increment/Decrement ) Dann zieht die Bedingung der äussersten for Schleife ... ---> somit wird diese - also die äusserste for Schleife - nocheinmal durchlaufen. Ein Fehler ist auch im Code: Nach for(start=0,nochmal=0;nochmal;start++) { müsste es nochmal= 0; heißen. Sonst wird eine Endlosschleife produziert, falls auch nur ein Zeichen umsortiert worden ist (beim ersten Durchlaufen der gesamten Zeichenkette). cin>>string[i]; ist außerdem falsch ! Du musst die ganze Zeichenkette einlesen und nicht nur ein Char Zeichen an der Indexstelle i des Char Arrays string[]. |
|
![]() |
![]() |
![]() |
#14 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() Das bzw. die Vorbereitungsstatements werden NUR EINMAL (nämlich am Anfang) der for Schleife ausgeführt, die Bedingung wird IMMER VOR DER AUSFÜHRUNG des Schleifenkörpers abgefragt, die Inkrement(bzw. Increment) usw. Statements werden IMMER NACH DER AUSFÜHRUNG des Schleifenkörpers durchgeführt. Ein vorzeitiger Abbruch der Schleife erfolgt mit break; bzw. in der Praxis mit if(irgendeine_abbruch_bedingung_erfuellt) break;
|
![]() |
![]() |
![]() |
#15 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() Noch zu Deiner Frage:
if(len<2) return; ohne Rückgabewert wird kein Rückgabewert zurückgegeben ![]() D.h. return; /* ohne return 0; oder return 1; oder return ret_variable; */ ist keine Rückgabe eines Wertes. Es ist lediglich so, daß die PROZEDUR - oder void Funktion "sort" - (void bedeutet "kein Wert" bzw. "undefiniert" bzw. "nichts vorhanden") VORZEITIG verlassen wird. Es passiert nichts anderes, als daß die Rücksprungadresse (vom Stack) geladen wird und zur aufrufenden Funktion zurückverzweigt wird. Jedoch wird KEIN Rückgabewert bereitgestellt - es handelt sich eben um eine void Funktion (semantisch = bedeutungsmäßig eine Prozedur). |
![]() |
![]() |
![]() |
#16 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.107
|
![]() Vielen Dank für deine Beiträge.
Ich bekomm aber immer noch nichts raus..., bin halt zu unfähig ![]() Also es weden ganze Zeichenketten eingelesen, hast du es so gemeint? Code:
#include <iostream.h> void sort(char[]); int main() { char eingabe[100]; cin>>eingabe; sort(eingabe); return 0; } void sort (char string[]) { long int i,start,len= strlen(string); int nochmal; char swap_char; if(len<2) return; for(start=0,nochmal=0;nochmal;start++) { for(i=start+1;i<len;i++) { if(string[start]>string[i]) { nochmal= 0; swap_char= string[start]; string[start]= string[i]; string[i]= swap_char; cout << string[i]; } } } } ![]() |
![]() |
![]() |
![]() |
#17 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() Code:
#include <iostream> #include <stdlib.h> using namespace std; void sort(char[]); int main(int argc, char *argv[]) { char eingabe[100]; cin>>eingabe; sort(eingabe); cout << eingabe << endl; system("PAUSE"); return 0; } void sort (char string[]) { long int i,start,len= strlen(string); int nochmal; char swap_char; if(len<2) return; for(start=0,nochmal=1;nochmal;start++) { nochmal= 0; for(i=start+1;i<len;i++) { if(string[start]>string[i]) { nochmal= 1; swap_char= string[start]; string[start]= string[i]; string[i]= swap_char; } } } } nochmal muss am Anfang mit 1 initialisiert werden, hast recht und war mein Fehler. Im if Block jedenfalls auf 1 setzen und am Anfang des Schleifenblocks auf 0. 0 steht für die Annahme, daß alles bereits sortiert ist. |
![]() |
![]() |
![]() |
#18 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.107
|
![]() Vielen Dank für deine Hilfe.
Auf den Zeiger wär ich aber nicht gekommen, weil wir stoffmäßig noch nicht so weit sind. hmm, funktioniert zwar unter Windows aber mit dem g++ Kompiler gehts nicht...eigenartig. |
![]() |
![]() |
![]() |
#19 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() Poste die Fehlermeldung des g++ Compilers. Ich weiß nicht, was es da hat. Du musst mich aufklären.
Außerdem ist der einzige Zeiger in meinem Beispiel ein Feld (Array) aus mehreren char * Zeigern namens argv. |
![]() |
![]() |
![]() |
#20 |
bitte Mailadresse prüfen!
Registriert seit: 03.04.2001
Beiträge: 2.387
|
![]() Die Schnittstelle der Forward Deklaration stimmt mit der der Implementierung nicht überein:
Code:
void sort(char[]) void sort (char string[]) |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|