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];
    

  • Mod

    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ändert 😕

    int 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];}
        }
    

Anmelden zum Antworten