spezielle Schleife (gelöst)
-
Heyho, ich bräuchte einen Rat, wie ich am besten folgende Schleife schreibe:
Ich habe 2 Int-Arrays die variabel groß sind. Im Ersten werden eine lange Liste an Zahlen gespeichert. Im Zweiten sind Zahlen, die auf den Ersten addiert werden sollen, jedoch immer nacheinander.
Beispiel:
Array 1: [1,1,1,1,1,1,1,1,1,1,1,1]
Array 2: [3,2,5,7]Ergebnis:
Array 1: [4,3,6,8,4,3,6,8,4,3,6,8]Wie stell ich es an, dass in Array1 jeder 1.,5.,9. Wert mit dem 1. von Array2 addiert wird, jedes 2.,6.,10. ... mit dem 2. Zeichen aus Array2 etc.?
-
Ein Ansatz wäre es, mit Modulo zu arbeiten:
for(int i=1;i<len1;++i) arr1[i]+=arr2[i%len2];
-
Modulo oPerator
int array1[] = { 1,1,1,1,1,1,1,1,1,1,1,1 }; int array2[] = { 3,2,5,7 }; for (int i=0; i<sizeof(array1)/sizeof(array1[0]); ++i) array1[i] += array2[i % (sizeof(array2)/sizeof(array2[0]);
-
Vielen Dank schonmal für die schnellen Antworten
Compilieren klappt, aber am Ergebnis hat sich bisher nichts verändertint inputlaenge = Input.GetLength(); int keylaenge = Key.GetLength(); int *ascii = new int[inputlaenge]; int *key = new int[keylaenge]; for (int i = 0; i < inputlaenge; i++){ // Umwandlung Text in Int-array ascii[i] = (int)Input[i];} for (int i = 0; i < keylaenge; i++){ // Umwandlung Key in Int-array key[i] = (int)Key[i];} for (int i=0; i<inputlaenge/ascii[0]; ++i){ ascii[i] += key[i] % keylaenge/key[0];} Output = Input; //Länge des Outputstrings setzen for (int i = 0; i < inputlaenge; i++){ Output.SetAt(i,(char)ascii[i]);} delete ascii;
-
Vergleich doch mal unsere Antworten mit dem, was du in Zeile 11 und 12 geschrieben hast - wenn du den Unterschied findest, hast du gewonnen.
(Bonustip: Du mußt den Index für das Schlüssel-Array umrechnen)
PS: Wozu benötigst du überhaupt den Zwischenschritt über das int-Array? Man kann mit char's genausogut rechnen.
-
Beim 2. Teil fehlten ein paar Klammern, da ich diese falsch gesetzt hatte, lief es nicht
Habs jetzt mit beidem hinbekommen, allerdings funktioniert es nicht wie es soll.
for (int i=1; i<inputlaenge; ++i){ ascii[i] += key[i % keylaenge];}
hier funktioniert es erst ab dem 2. Zeichen. i=0 funktioniert nicht und wenn "key" leer bleibt stürzt das Programm ab.
for (int i=0; i<sizeof(ascii)/sizeof(ascii[0]); ++i){ ascii[i] += key[i % (sizeof(key)/sizeof(key[0]))];}
hier funktioniert die Umwandlung nur für das 1. Zeichen (auch wenn nichts in "key" steht wird es gewandelt). Abstürzen tut es, sofern nichts in "ascii" steht (nicht so schlimm)
Beim 2. Teil fehlten ein paar Klammern, da ich diese falsch gesetzt hatte, lief es nicht
-
Zhora schrieb:
Beim 2. Teil fehlten ein paar Klammern, da ich diese falsch gesetzt hatte, lief es nicht
Habs jetzt mit beidem hinbekommen, allerdings funktioniert es nicht wie es soll.
for (int i=1; i<inputlaenge; ++i){ ascii[i] += key[i % keylaenge];}
hier funktioniert es erst ab dem 2. Zeichen. i=0 funktioniert nicht und wenn "key" leer bleibt stürzt das Programm ab.
Dann wirf mal einen dezenten Blick auf den Startwert der Schleife. (das Problem mit dem leeren Schlüssel solltest du besser vor der Verschlüsselung abfangen)
for (int i=0; i<sizeof(ascii)/sizeof(ascii[0]); ++i){ ascii[i] += key[i % (sizeof(key)/sizeof(key[0]))];}
hier funktioniert die Umwandlung nur für das 1. Zeichen (auch wenn nichts in "key" steht wird es gewandelt). Abstürzen tut es, sofern nichts in "ascii" steht (nicht so schlimm)
Diese Konstruktion mit sizeof funktioniert nur für Arrays auf dem Stack, nicht für dynamisch angelegten Speicher.
-
Das hatte ich gesehen und geändert. Dann stand aber in der Fehlermeldung, dass nicht durch 0 geteilt werden kann. Das bezog sich (wie ich jetzt gemerkt habe) auf den leeren key und nicht auf die Startposition.
Klappt jetzt alles, Vielen Dank für die gute und schnelle Hilfe!
Edit: hier nochmal der Quellcode, hilft vielleicht dem ein oder anderen
if (Key != "") { for (int i=0; i<inputlaenge; ++i){ ascii[i] += key[i % keylaenge];} }