break; EDIT: umkehr operation
-
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
-
Skalli schrieb:
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
Naja, dazu reicht es meist aber auch, einfach sehr "modernes" C++ zu schreiben. Wenn jede 2. Zeile Template-Magic ist die nurmehr ein untoter Level 80 Template-Mage versteht...
Ist IMO die etwas weniger "schmutzige" Variante.