Problem beim Durchlauf eines Arrays



  • Hallo zusammen,

    ich habe folgendes Problem:
    Ein Array speichert fünf Zahlen q[5]. Die Zahlen sollen im Bereich von 0 bis 61 liegen. Jetzt muss ich ein zweites Array zum Testen anlegen test[5] = {0}. Bei dem zweiten Array fange ich nun bei 00000 an und überprüfe ob der Wert dem von q[] entspricht. Falls nicht durchlaufe ich das Array komplett! bis ich den gesuchten Wert habe. Ein Beispiel nur mit 3 Zahlen: 0,0,1 ; 0,0,2 ; ... 0,0,61 ; 0,1,0 ... bis maximal 61,61,61.
    Dazu brauche ich eine aüssere Schleife in etwa so for(int i = 0; i < 5; i++)
    und eine innere Schleife die von 0 bis 61 läuft.
    Was mir nicht so ganz klar ist, ist wie ich das mit den Überträgen machen soll. 😕

    Wäre super wenn mir jemand einen kleinen Tipp geben könnte. 🙂

    Viele Grüße
    Guido



  • Das hört sich verdächtig danach an, daß du eine Rekursion benötigst:

    bool testlauf(int pos=0);
    {
      if(pos==5)return istgleich(q,test);
    
      for(int i=0;i<=61;++i)
      {
        test[pos]=i;
        if(teslauf(pos+1)) return true;
      }
      return false;
    }
    

    Du kannst natürlich auch fünf inneinander veschachtelte Schleifen von 0 bis 61 laufen lassen, wenn dir das lieber ist.



  • Stimmt, sowas in der Art suche ich.
    Allerdings ist mir Dein Code noch nicht so ganz klar....
    Wäre super wenn Du noch ein,zwei Zeilen dazu schreiben könntest.
    Das mit den fünf Schleifen hab ich mir auch schon überlegt, war mir aber
    zu Fehleranfällig.

    Viele Grüße
    Guido



  • bool testlauf(int pos=0);// pos = aktueller Index (0..5, Start bei 0)
    {
      //Abbruchbedingung: pos=5 -> Array-Ende erreicht -> Vergleich
      if(pos==5)return istgleich(q,test);
    
      //Zählung von 0 bis 61
      for(int i=0;i<=61;++i)
      {
        //Setze aktuellen Wert auf i (Schleifenvariable)
        test[pos]=i;
        //Zähle nächste Position durch (Rückgabe true -> Ziel gefunden -> Ende)
        if(testlauf(pos+1)) return true;
      }
      //alles durchgezählt -> Wert nicht gefunden
      return false;
    }
    

    Reicht das als Erklärung? Wenn icht, stell etwas detailliertere Fragen 🙂

    PS: Aufgerufen wird das Ganze mit

    int q[5]=...;
    int test[5];
    testlauf();
    


  • GS schrieb:

    ich habe folgendes Problem:
    Ein Array speichert fünf Zahlen q[5]. Die Zahlen sollen im Bereich von 0 bis 61 liegen. Jetzt muss ich ein zweites Array zum Testen anlegen test[5] = {0}. Bei dem zweiten Array fange ich nun bei 00000 an und überprüfe ob der Wert dem von q[] entspricht. Falls nicht durchlaufe ich das Array komplett!

    Darf ich mal fragen, was der genaue Sinn dabei ist? Den gesuchten Wert hast du doch bereits in q?



  • @CStoll
    Vielen Dank, hast mir sehr geholfen. 🙂

    @groovemaster
    so macht das natürlich keinen Sinn.
    Das ganze soll einen simplen Versuch zum knacken eines
    Codes simulieren. q[5] ist eigentlich nicht bekannt und dient nur zum Testen ob der Code gefunden wird. Der Zahlenbereich von 0 bis 61 stellt dabei die Groß- und Kleinbuchstaben sowie die Ziffern von 0 bis 9 dar. Später soll noch die Zeit
    für die max. Anzahl der Durchläufe ermittelt werden und dann auf einen zehnstelligen Code hochgerechnet werden. Ist ne Übung an der FH.

    Viele Grüße
    Guido



  • GS schrieb:

    Später soll noch die Zeit
    für die max. Anzahl der Durchläufe ermittelt werden und dann auf einen zehnstelligen Code hochgerechnet werden.

    Dann würde ich dir aber eher eine iterative lösung empfehlen, die ist nicht selten schneller als eine Rekursion.

    bool compare(const int* q, const int* test)
    {
        for (size_t i = 0; i != 5; ++i)
        {
            if (q[i] != test[i])
                return false;
        }
        return true;
    }
    
    bool foo(const int* q)
    {
        int test[5] = {};
        for (size_t i = 0; i != 5; ++i)
        {
            for (int value = 0; value != 62; ++value)
            {
                if (compare(q, test))
                    return true;
                ++test[i];
            }
        }
        return false;
    }
    

Anmelden zum Antworten