break; EDIT: umkehr operation
-
Schon mal drüber nachgedacht, eine kleine Testanwendung nur mit deinem spezifischen Problem zu erstellen? Das sollte helfen, schneller eine Antwort zu finden

Achja, die Antwort: Das break beendet nur die aktuelle Schleife. Um weitere Strukturen zu beenden müsstest du:
(1) goto verwenden oder
(2) eine boolsche Variable verwenden, die als zusätzliche Abbruchbedingung aller Schleifen dient, oder
(3) eine Funktion erstellen und return benutzen.nurf schrieb:
++x ist schneller als x++
Manchmal.
-
gut danke ich glaub, dass mit dem break; ist geklärt.
Ich weiß, dass "goto" "böse" ist, weil es den Code unlesbar macht.
aber niemand verwendet goto und wenn ich nachsehen will wie man die markierung für goto zum "hinspringen" erstellt wird nat nicht erwähnt.
wie heißt die func dafür. manchmal kann goto ja auch hilfreich sein.
-
ne, man verwendet da kein goto - du hasts zwar leider noch immer net geschafft, quellcode einzurücken, aber naja...
1. wieso hast du so viele verschachtelte schleifen und musst dann auf einmal ganz raus?
2. wenn dus in ne fkt auslagern kannst, gehts einfach:
return;3. _niemals_ bei sowas goto aufrufen - hat nix mit lesbarkeit zu tun sondern viel eher damit, dass deine variablen dann ggf nich vom stack genommen werden...
also evtl sagst du uns einfach ma, was du machen möchtest - und dann findet sich mit sicherheit jmd, der dir sagt, dass du das dann gar nich wissen brauchst, was du gerade wissen möchtest
4. wenn das alles nix nützt und du es trotzdem machen musst, dann brauchst du noch ne zusätzliche variable, die du in jedem schleifenkopf mit untersuchen musst...
bb
-
oh man jetzt müste ich weit ausholen, aber ich versuch es mal kurz...
der Code hier ist warscheinlich überverkomplifiziert (o.0 das wort gibts nicht^^).
es geht immer noch (
) um die umkeroperation eines verschlüsselungsprogrammes.
hier der schlecht eingerückte Code: (wenn ich es so einrücke wie mir es Dev C++ "vorschlägt" wird es viel zu breit und unübersichtlich)string alphabet = "abcdefghijklmnopqrstuvwxyz"; int i = 0,f = 0,g = 0,size = text.size(),place[500]; for(;i<=size;) //jeder Buchstabe einzeln { i = i + 1; // syn cout<<"current letter: "<<part[i]<<"\n"; // syn cin.get(); f=0; //für buchstabe auf anfang setzen g=0; //für buchstabe auf anfang setzen for(;f<=26;) //alphabet durchgehen von a1 bis z26 { f = f + 1; cout<<alphabet.substr(f-1,1)<<" "; Sleep(50); if(part[i]=="") {break; break;} if (part[i]==alphabet.substr(f-1,1)) { //if "buchstabe 1 == alphabetstelle f"... //also if buchstabe == stelle 1 (a) dann. cout<<"found alphabet.substr()\n"; cin.get(); for(;g<=26;g++) { //suche die "stelle" im schlüssel cout<<g<<" "; if(inhaltconv[g]==f) {//if key[] == alphstelle cout<<"zugeteilt\n"; cin.get(); place[i] = f; //merken break; // HALT ! } } } } } cin.get();wenn ich mir den Code nur ansehe krieg ich kopfschmerzen, ich wollte aber nicht 26*26*26 if clauseln, was noch schlimmer wäre.
noch ein paar infos:part[x]=x. stelle im wort.
key[] gibt es eig nicht nur für mich zum durchsteigen
sleep(); ist eine syntax überprüfung von mir um nicht enter drücken zu müssen. ~(weil der debugger scheiße ist)~
if(part=="") ähm war ein versuch den absturz zu verhindern, hat aber nicht geklappt. ich dacht das würde gehen, weil er nach dem letzt buchstaben immer noch weiter machte.
// syn ---- das ist ein quote zum ausschneiden von test funktionen (auch debug)hier ist das ganze prog: http://ul.to/3u915o (falls es hilft)
-------------------------------------------------------------------------------
schon wieder, kann mir nicht einfach mal sagen wie die sprungmarke für goto erstellt wird, kann man ja immer mal gebrauchen

-
oO
Ich hab jetzt keine Lust DEN Code zu zerlegen um zu schauen was der machen soll.
Ein Umkehrfunktion zur Verschlüsselung, ok, welche Art von Verschlüsselung ist es?Auf jeden Fall ist da sehr viel schlechter Stil dabei. Warum nimmst du for und nicht while Schleifen? Wenn dir DevCpp nicht gut einrückt dann stell das automatische Einrücken ab!
Warum steht da ein Sleep im Code?
Sieht für mich aus als ob es da noch an vielen Grundlagen mangelt...
-
das war mir klar, dass da keiner lust zu hat. sleep() hat nur debug funktion. also lese schlüssel ein:
Inhalt schlüssel: 12 (=klartext a --> wird zu buchstabe an der stelle 12 im alphabet) 5 (=klartext b --> wird zu buchstabe an der stelle 5 im alphabet) 24 (=klartext c --> wird zu buchstabe an der stelle 24 im alphabet) 18 (=klartext d --> wird zu buchstabe an der stelle 18 im alphabet) 3 ...lese schlüssel ein!
lasse benutzer verschlüsselten text eingeben. (zu entschlüsselnden text)
so wie mache ich das rückgängig ? ich hab es wie oben versucht, aber das geit nicht ganz, er will nicht bei wortende aufhören, er will dann mit einem leeren string weiter machen das ist nat käse und er stürzt ab.
kann man das mit nem vector irgwie machen ?
-
Skalli schrieb:
Auf jeden Fall ist da sehr viel schlechter Stil dabei. Warum nimmst du for und nicht while Schleifen? Wenn dir DevCpp nicht gut einrückt dann stell das automatische Einrücken ab!
Tim06TR scheint eine gewisse Lernresistenz aufzuweisen. Allein unskilled und ich haben ihn schon mindestens drei Male auf die Einrückungen aufmerksam gemacht, offensichtlich ohne Wirkung.
Und nein,
gotokann man im Allgemeinen nicht brauchen, besonders nicht als Anfänger.
-
Damit ich heut wenigsten mal einwas sinnvolles gemacht habe, helf ich Tim mal. Ist zwar das letzte mal, wenn er weiterhin resistent ggnüber guten Ratschlägen ist, aber naja - ich geb dir Hoffnung noch nich auf ^^
1. Welchen Typ hat "part"? wofür ist part genau da? ist es der zu entschlüsselnde String?
2. wofür brauchst du place? warum 500 stellen? wieso willste dir das zeugs überhaupt merken?
3. Was ist inhaltconv?Boar überhaupt... Nimm dir nen C++-Buch, mal dir auf, was du machen möchtest, implementier es und vor allem: Scheu dich nicht, bestimmte Funktionalitäten auch mal in andere Fkt auszulagern...
Es kann doch nciht sein, dass du hier 3 ineinander geschachtelte for-schleifen brauchst...! Außerdem noch ca. 20tausend Variablen hast usw...Nachtrag: Naja - ich hatte gehofft, dass hinter dem Quellcode irgend ein (durchdachtes) System steckt - dummerweise hab ich mich getäuscht und ihn deshalb um sonst bissl lesbarer gemacht - er is zwar hier sinnlos, aber wollt ma zeigen, wie er aussehen würde/könnte und dir zeigen, wie das mit dem for geht - und was der irre Vorteil an der Schleife ggnüber anderen ist...

#include <iostream> #include <string> #include <cstdlib> using std::size_t; int main() { string alphabet = "abcdefghijklmnopqrstuvwxyz"; const size_t alph_length = alphabet.length(); size_t place[500]; for(std::string::size_type i(0), e(text.size()); i != e; ++i) //jeder Buchstabe einzeln { cout << "current letter: " << part[i] << std::endl; for(size_t j(0); j != alph_length; ++j) //alphabet durchgehen von a1 bis z26 { cout << alphabet[j] << " "; if(part[i].empty()) break; if (part[i] == alphabet[j]) { //if "buchstabe 1 == alphabetstelle f"... //also if buchstabe == stelle 1 (a) dann. cout << "found alphabet.substr()" << std::endl; for(size_t k(0); k != alph_length; ++k) { //suche die "stelle" im schlüssel cout << k << " "; if (inhaltconv[k]==j) { //if key[] == alphstelle cout << "zugeteilt" << std::endl; place[i] = k; //merken break; // HALT ! } } } } } cin.get(); }Kleiner Denkanstoß gefällig?
du hast eine Funktion:std::string decrypt(const std::string& encrypted) { std::string R; //dein return-wert R.reserve (encrypted.length()); //nicht erforderlich, aber ich wollts der vollständigkeit halber ma mit hinschreiben for(std::string::size_type i(0), e(encrypted.length()); i != e; ++i) { R.push_back ( decrypt_char(encrypted[i]) ); } return R; }Jetzt brauchst du nur noch eine andere Fkt:
char decrypt_char(char encrypted) { //wirst du ja selbst hinbekommen?! }Falls du schon klassen kennst: baust du ne klasse drum rum, in der du davor noch die daten festlegst (welcher buchstabe entspricht welchem - oder wie au immer ^^)
Wenn nicht, dann wirst du entweder nen paar globale Variablen nehmen müssen oder den Fkt jedesmal alle nötigen Infos mitgeben müssen...Dann lies ma fleißig alles durch - frag, falls du Fragen hast - und versuch es mal so umzusetzen - das nächste Mal, wenn du deinen Quellcode hier postest (um zu zeigen, was nicht geht bzw wie du es gemacht hast oder was auch immer),
nimmst du dir mal die Zeit und rückst ihn richtig ein - allerdings sollte das schon längst gemacht sein - sonst sieht ja keine Sau durch...
Das mit dem Einrücken ist auch ganz einfach - wie das geht, beschreib ich hier aber nich - solltest du ja langsam gesehen haben...Noch nen Wort zu DevC++: Nimm die MSVC Express-Edition - der rückt dir auch automatisch richtig ein - wenn du anders einrücken möchtest, kannst du es da auch komplett abschalten oder einstellen, dass er sich merken soll, wie du einrückst oder was weiß ich nich...
Auf jeden Fall solltest du von DevC++ weg!Naja - hoffentlich bringt meine Arbeit (dir) was ^^
bb : >
-
@Tim06TR:
- break bricht genau aus einem for/while/do-while/case raus. (EDIT: ich meine natürlich switch, nicht case)
- 2x break hintereinander bringt nix, da das erste break ja schon "wegspringt", das 2. wird also nichtmehr ausgeführt. Der Compiler wird dir beim 2. break u.U. eine "unreachable code" Warnung geben.
- Sprungmarken für goto erstellt man mit "identifier:", also einfach:
void foo() { for (...) { for (...) { ... if (...) goto my_label; } } my_label: ... }
-
void foo() { for (...) { Tbar bar; for (...) { ... if (...) goto my_label; } } //hier wird automatisch bar->~Tbar() aufgerufen my_label: //wurde bar und alle anderen Variablen jetzt erfolgreich wieder freigegeben? ... }Die gleiche Frage stellt sich natürlich auch für die Laufvariablen der for-Schleifen - aber wenn mir jmd sagt, dass man sicher sein kann, dass alles wieder richtig freigegeben wird (und das nicht erst am ende der fkt), dann kann ich mir das selbst denken ^^
allerdings geht das alles auch ohne das hässliche goto...
void foo() { for (...) { for (...) { ... if (...) { do_something(); return; } } } do_something(); }bb
-
ich habe das prog jetzt fertig und es funzt. (hatte jetzt keine Lust die Einrückung zu ändern vergebt mir !
)
der Prozess sieht nun so aus:cout<<"Der entschluesselte Text ist:\n"; cout<<"\n-----------------------------------------------------------\n"; for(;i<size;) //jeder Buchstabe einzeln { i = i + 1; f=0; //für buchstabe auf anfang setzen g=0; //für buchstabe auf anfang setzen for(;f<=26;) //alphabet durchgehen von a1 bis z26 { f = f + 1; if (part[i]==alphabet.substr(f-1,1)) { for(;g<=26;g++) { if(inhaltconv[g]==f) { place[i] = g; //merken cout<<alphabet.substr(place[i]-1,1); break; // HALT ! } } } } } cout<<"\n-----------------------------------------------------------\n"; cin.get(); cin.get(); return 0;allerdings stürzt er am ende ab bei "return 0;" und auch bei "return EXIT_SUCCESS", und auch wenn ich da nichts hinschreibe ab. Das ist mir zwar relativ egal, aber ich wüsste gern warum.
Ich habs auch ohne die vereinfachte\kürzere Version geschafft.
PS: kann sein das der script etwas verschoben ist, weil ich die Kommentare gelöscht hab. und danke für die vielen Versuche mir zu helfen. (hört sich jetzt etwas komisch an...)
-
@unskilled:
Mit goto einen oder mehrere Scopes zu verlassen ist unproblematisch, d.h.: ja, es funktioniert dort alles so wie es sollte, und alle Objekte werden so zerstört wie man es erwarten würde.
In deinem Beispiel wird also "bar" korrekt zerstört. Genauso wie wenn man break verwenden würde.Man sollte nur niemals Scopes mit goto betreten.
Ich sag immer: solange man mit goto immer nur "nach unten" und "nach links" springt, ist alles OK.
-
hustbaer schrieb:
...
ty - wieder was dazugelernt ^^
ist zwar fragwürdig, ob ich es jemals brauchen werde, aber schaden tuts ja nich : Dbb
PS: Trotzdem sind hier goto`s fehl am Platz
aber das weist du ja selbst - und Tim lernt mit Sicherheit auch irgendwann mal, wenigsten zu lesen
dann merkt er mit ein wenig Glück so gar, wie das mit dem f = f + 1 und den Schleifen da sinnvoller geht ^^
-
@unskilled:
Ich hab nix gegen gotos. Ich brauch die nur nicht wirklich (kann mich nicht erinnern wann ich das letzte mal goto geschrieben habe - ist sicher schon lange her). Was aber nicht heisst, dass ich irgendwas aufwendigeres stricken würde, bloss um ein goto zu umgehen.
-
Tim06TR schrieb:
hatte jetzt keine Lust die Einrückung zu ändern vergebt mir !

Hast du möglicherweise im Entferntesten in Erwägung gezogen, dass dir die Einrückung vielleicht einmal selbst helfen könnte?
hustbaer schrieb:
Man sollte nur niemals Scopes mit goto betreten.
Ist das allgemein der Fall oder nur bei der Deklaration von Variablen? Soweit ich weiss, bekam ich - als ich als Anfänger ab und zu
gotonutzte - Compilerfehler aufgrund übersprungener Deklarationen... Wo liegt denn genau die Problematik? Nicht, dass es jetzt einen Riesen-Einfluss auf meine Projekte hätte, aber grundsätzlich würde mich das schon noch interessieren.
-
@Nexus: das ist bloss ne "Faustregel". Was nicht heisst dass es in bestimmten Fällen nicht ohne Probleme möglich wäre.
-
Hat jmd Links zu dem Thema?
Würde mich auch mal interessieren ^^bb
-
Okay, danke, hustbaer. Naja, das wäre höchstwahrscheinlich auch theoretischer Natur geblieben.

Für
gotofällt mir eigentlich nur der Anwendungsfall "Sprung aus tief verschachtelten Schleifen" ein. Aber auch da sollte die Problematik meistens mit Funktionen undreturnzu beheben sein...
-
unskilled schrieb:
Hat jmd Links zu dem Thema?
Würde mich auch mal interessieren ^^Mich eben auch.

Wenn ich mal etwas Zeit habe, will ich mir auch
longjmpundsetjmpgenauer anschauen. Aus reiner Neugier, um zu sehen, was so möglich ist. Sprünge quer durch das Programm können schon interessant sein...
-
Nexus schrieb:
unskilled schrieb:
Hat jmd Links zu dem Thema?
Würde mich auch mal interessieren ^^Mich eben auch.

Wenn ich mal etwas Zeit habe, will ich mir auch
longjmpundsetjmpgenauer anschauen. Aus reiner Neugier, um zu sehen, was so möglich ist. Sprünge quer durch das Programm können schon interessant sein...
Sie haben auf jeden Fall ihre Vorteile wenn man seinen Platz in der Firma sichern will...

("Nein, wir können Herrn XXX nicht gehen lassen. Niemand versteht DEN Code!") ^^
Abgesehen von Assembler bin ich bisher ohne goto (bzw. jmp) zurecht gekommen