c++ Zyklus mit rekursiven funktionen (Programm stürzt ab)
-
Hallo,
Ich bin noch Anfänger in C++ und habe eine Hausaufgabe. In dieser muss ich einen Zyklus feststellen (abcabca = zyklus ; abcabcd = kein zyklus) und die Länge dieses Zyklus ausgeben. In dem Fall 3.
Nun hab ich mit viel Hilfe ein Programm geschrieben, welches allerdings immer abstürzt. Ich habe aber keine Ahnung warum und würde deswegen um Hilfe bitten.Ich arbeite mit DevC++ auf Windows 7
Mein Quellcode:
#include <iostream> using namespace std; int f (char*a , int zlen) { char*zyklus = new char [zlen]; for (int i=0 ; i < zlen; i=i+1) zyklus [i]=a[i]; for (int j=0 ; a [j]!= '\0' ; j=j+1) { if (a[j] != zyklus[j%zlen]) zlen=f(a,zlen++); } return zlen; } int main () { int start=1; while (start!=0) { char* a; cout << "Zeichenkette eingeben: "; cin >> (a=new char); int zlen= f(a, 1); if (zlen==sizeof(a-1)) cout<< "nicht zyklisch"; else cout << "zykluslaenge beträgt: " << zlen << endl; cout << "0 um Programm zu beenden!" <<endl; cin >> start; if(start==0) { return 0; } } }Vielen Dank,
Lg Harry
-
cin >> (a=new char);das ist unsinn aber ich bin zu müde das nun zu erklären. kannst du alles in jedem anfängerbuch nachlesen.
darfst du std::string verwenden? dann mach das.
-
Mein Trolldetektor läuft hier Amok, ich hab Mühe mir vorzustellen, dass das Posting ernstgemeint sein könnte. Die Fehler in dem Programm sehen fast aus wie absichtlich eingebaut.
Nun hab ich mit viel Hilfe ein Programm geschrieben
Ich würde vorschlagen, es nochmal ohne solche tolle "Hilfe" zu versuchen. Von vorne. Und dabei den ganzen Mist, den du nicht verstehst und den niemand verstehen kann, weglassen (siehe z.B. Vorposting, wer kommt auf sowas???)
-
...
-
Canchuck schrieb:
…
Viel zu viele Fehler. Lies ein gutes Buch über C++. Deine bisherigen Quellen (nur der Lehrer?) taugen anscheinend nix.
#include <iostream> #include <string> using namespace std; bool isCyclic(string str,size_t len) { for(size_t i=0; i<str.length(); ++i) if(str[i]!=str[i%len]) return false; return true; } int getCycleLength(string str) { for(size_t len=1; len!=str.length(); ++len) if(isCyclic(str,len)) return len; return 0; } int main() { cout << "Zeichenkette eingeben: "; string str; cin>>str; size_t zlen=getCycleLength(str); if(zlen==0) cout<< "nicht zyklisch"; else cout<<"zykluslaenge beträgt: "<<zlen<<'\n'; }
-
erstmals vielen dank für die schnellen antworten

Und ein Tutor hat mir bei dem Programm geholfen, also dachte ich nicht das es so schlecht ist.@sadfgsdgwer: Ich hab das mit dem std::string schon oft gelesen, hab das aber noch nie in der vorlesung gehört und weis nicht was das genau bedeutet.
@Bashar: das ist ernst gemeint, und ich tu mir schwer damit, deswegn auch die Frage ins Forum. Ich werds nochmals Probiern, danke. Und ich verstehe das Programm, sofern der Tutor mir das richtig erklärt hat, das was ich nicht verstehe ist warum es nicht funktioniert.
@Swordfish: ok, das wusst ich gar nicht. alles was ich gehört habe zu "i++" war das die variable +1 gerechnet wird, werds gleich umschreiben und sehn was raus kommt
@volkard: ja meine quellen sind nur der Professor und hier und da mal ein Tutor. "#include <string>" hatten wir auch noch nicht. Ich werds nachlesen und mir Deinen Code ganz genau ansehen vielleicht komm ich dadurch auf meine Fehler, danke

-
Canchuck schrieb:
@volkard: ja meine quellen sind nur der Professor und hier und da mal ein Tutor.
Ach. Muttu schnell ändern.
Canchuck schrieb:
und mir Deinen Code ganz genau ansehen vielleicht komm ich dadurch auf meine Fehler, danke

Keine Chance!
Anscheinend kommt die Aufgabe aus
http://www.amazon.de/Algorithmen-Und-Problemlösungen-German-Edition/dp/3834801267
und das würde beweisen, daß der Prof nicht proggern kann (wie üblich). Das würde bedeuten, daß Du in dem Buch die Lösungen finden würdest und höchst wahrscheinlich recht gut passende Anregungen, was Du für die Klausur vorbereiten solltest.
Oh, ich fürchte, das Buch wird wegen der formalisierten Umständlichkeit vielen Profs gut gefallen und uns jahrelang hier belästigen.
Als Lernbuch würde ich an Deiner Stelle mal den Breymann lesen, recht umfassend, angemessenes Niveau, und im Endeffekt viel weniger Arbeit, als das tagelange rumstümpern, und macht auch noch viel mehr Spaß, wenn man was vernünftiges lernt.
Danach kannste so ein Witz-Programm in 5 Minuten reinklimpern und eine 1 kriegste auch.
-
@volkard: Vielen Dank, das kauf ich mir gleich.
mir gefällt das Programmieren. Und wenn ich mit diesem buch mehr lern als durch die vo ist alles gut
Dankeschön
-
Die Aufgabe im Buch ist leicht anders, da werden nur volle Wiederholungen gewertet, also abcabc hat 3, abcabca hat keine. Vielleicht wurde die Aufgabe leicht verändert, damit man erkennt, wenn jemand die Lösung aus dem Buch abschreibt?
#include <iostream> #include <cstring> using namespace std; bool isCyclic(char* str,size_t slen,size_t zlen) { for(size_t i=0; i<slen; ++i) if(str[i]!=str[i%zlen]) return false; return true; } int getCycleLength(char* str,size_t slen) { for(size_t zlen=1; zlen!=slen; ++zlen) if(slen%zlen==0)//neu bei anderer aufgabe if(isCyclic(str,slen,zlen)) return zlen; return 0; } int main() { cout << "Zeichenkette eingeben: "; char str[100]; cin>>str; size_t zlen=getCycleLength(str,strlen(str)); if(zlen==0) cout<< "nicht zyklisch"; else cout<<"zykluslaenge beträgt: "<<zlen<<'\n'; }
-
size_t ist nach durch deine platform definiert?
x32 ... size_t = 4 bytes
x64 ... size_t = 8 bytes
-
ja wahrscheinlich.
vielen dank, Du hast mir echt sehr geholfen.
bin grad dabei mir ein tutorial zu strings anzusehen, dan werd ich die codes auch besser nachvollziehen können