Array kopieren und zwar stück für stück



  • Hi, kann mir hier einer sagen wie ich ein array stück für stück kopiere?

    ich will ein text in einer matrix schreiben (programmiere erst seit kurzem):

    for(i=1;i<=prim1;i++)
            {
              for(j=1;j<=prim2;j++)
              {
    
                 matrix[i*j]=text[l];
                 l++;
                 }
            }
    

    matrix[] und text[] sind vom typ char
    i,j,l vom typ int

    mein dev cpp meckert nicht aber wenn ich matrix[] ausgebe steht da nix drinn

    Danke im vorraus
    lg ruwn



  • sicher das text[] größer als prim1 * prim2 ist? Sonst schreibst du übern sSpeicher hinaus.



  • was heißt, es "steht nichts" drin? zumindest die daten, die vorher drin waren? wenn dann trotzdem gar nichts ausgegeben wird ist es wohl ein fehler in deiner ausgabefunktion 😉

    ansonsten wirkt das eher so, als ob prim1 und prim2 kleiner als jeweils 1 sind.

    btw. ist es beabsichtigt, dass nicht alle felder von matrix gefüllt werden?



  • erstmal danke fürs schnelle antworten

    prim1 und prim2 sind aufjedenfall kleiner als length(text[]) (sehe gerade das hier l und (eins) gleich aussehen ...) deswegen hab i den code jetzt auf L geändert

    Das programm soll einen text so verschlüsseln:

    Bsp:

    aktiennichtverkaufen

    aktienn
    ichtver
    kaufenx

    dann soll es spaltenweise ausgegeben werden:
    aikkcathuitfevennrx

    dabei sollen spalten- und reihenanzahl primzahlen sein (und zwar die erste zusammengesetzte zahl(aus 2 primzahlen) die größer/gleich der textlänge ist
    falls nötig soll mit x aufgefüllt werden. Im Beispiel 3 reihen und 7 spalten.
    ein zweidimensionales dynamisches array fällt für mich hier wohl aus, da meine programmierkenntnisse dafür nicht ausreichen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <iostream.h>
    //#include <malloc.h>
    
    int faktorisieren1(int maxnummer, int primzahlen[]);
    int faktorisieren2(int maxnummer, int primzahlen[], int faktor1);
    int prim_suchen (int primzahlen[], int maxnummer);
    int auffuellen(int maxnummer, int faktor1, int faktor2, char text[], int primzahlen[]);
    char code(int prim1, int prim2, char text[], char matrix[]);
    
    int main ()
    {
    
        char text[1000], matrix[1000];
        int maxnummer, primzahlen[1000];
        int faktor1, faktor2,prim1,prim2;
    
        //Eingabe
        printf("Bitte geben sie den zu kodierenden Text ein max 1000 Zeichen \n");
        scanf("%s",&text);
    
        maxnummer=(strlen(text));
    
        // funktionen
        prim_suchen(primzahlen, maxnummer);
        faktor1=faktorisieren1(maxnummer, primzahlen);
        faktor2=faktorisieren2(maxnummer, primzahlen, faktor1);
        auffuellen(maxnummer,faktor1,faktor2, text, primzahlen);
        prim1=primzahlen[faktor1];
        prim2=primzahlen[faktor2];
        code(prim1, prim2, text, matrix);
        printf("Anagrammcode:  %s \n\n",matrix);
    
        //primzahlen[faktor1]
        //printf("text: %s ",text);
    
        system("pause");
    
    }
    
    int prim_suchen (int primzahlen[], int maxnummer)
    {
        int i, j, anzahl;
        int zahlen[1001];
    
        if (maxnummer > 1000) maxnummer=1000;
        anzahl =-1;
        zahlen[0]=0;
        zahlen[1]=0;
        for (i=2; i<=maxnummer; i++)  zahlen[i]=1;
    
        for (i=2; i<=maxnummer; i++)
        {
            if (zahlen[i]!=0)
               {
                             anzahl=anzahl+1;
                             primzahlen[anzahl]=i;
                             for (j=i; j<=1000; j=j+i) zahlen[j]=0;
               }
        }
        return anzahl;
    }
    
    // Erste Primzahl finden
    int faktorisieren1(int maxnummer, int primzahlen[])
    {
       int j=0,hilf;
       hilf = sqrt(maxnummer);
       while (primzahlen[j]<=hilf)  j++;
    
       j=j-1;
       return j;
    }
    // Zweite Primzahl finden
    
    int faktorisieren2(int maxnummer, int primzahlen[], int faktor1)
    {
       int j;
       j=faktor1;
    
       while (primzahlen[faktor1]*primzahlen[j]<maxnummer)  j++;
       return j;
    }
    
        char text[10000], matrix[10000];
        int maxnummer, primzahlen[1000];
        int faktor1, faktor2,prim1,prim2;
    
    int auffuellen(int maxnummer, int faktor1, int faktor2, char text[], int primzahlen[])
    {
        if (maxnummer < (primzahlen[faktor1]*primzahlen[faktor2]))
        {
           while (maxnummer<(primzahlen[faktor1]*primzahlen[faktor2]))
           {
           text[maxnummer]='x';
           maxnummer++;
           }
           text[maxnummer+1]='\0';
        }
    
    }
    
           // text in die matrix schreiben und vertauscht wieder nach text[]
    
    char code(int prim1, int prim2, char text[], char matrix[])
       {
    
            int i,j,L,k;
            L=1;
    
            matrix[0]=2;
            for(i=1;i<=prim1;i++)
            {
              for(j=1;j<=prim2;j++)
              {
                 k=j*i;
                 matrix[k]=text[L];
                 L++;
                 }
            }
    
            return 0;
         }
    


  • k=j*i ist falsch. das überspringt (wie oben schon gesagt) alle möglichen indizes.

    die funktion müsstest du so implementieren:

    void code(int prim1, int prim2, char text[], char matrix[])
    {
       int L = 0;
       for(int i = 0; i < prim2; i++)
       {
          for(int j = 0; j < prim1; j++)
          {
             int k = (j*prim2) + i;
             matrix[L++] = text[k];
          }
       }
    }
    

    ps. für die lesbarkeit habe ich sie ein bisschen umformatiert. variablen solltest du immer so spät wie möglich definieren, am besten also so lokal wie möglich.

    die auffüll-funktion lässt sich mit standard-c++ übrigens auch so definieren:

    int auffuellen(int maxnummer, int prim1, int prim2, char text[])
    {
       fill_n (text + strlen(text), max(faktor1*faktor2 - maxnummer, 0), 'x');
    }
    

    die funktionen faktorisierenX sollten imo die primzahlen zurückgeben und nicht deren indizes.

    die header musst du ändern:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    using namespace std;
    

    von printf/scanf solltest du auf cout und cin (the C++ way) umsteigen. (wozu sonst auch den header <iostream> inkludieren?)

    wenn du bei den char-arrays von beginn an alle elemente auf 0 setzt, ersparst du dir das lästige einfügen von '\0'. das geht so:

    char text[1000] = {};
    

    (oder gleich auf C++-strings umsteigen)

    hm bei mir funktioniert dein programm mit der neuen kodier-funktion jetzt.



  • hui *sprachlosigkeit*
    danke schön 🙂

    das mit dem prim2 *j ist einleuchtend 😉

    manchmal ging mir das printf... so auf die nerven das ich auf cout umgestiegen bin ( aber leider hab ich keine ahnung wie man nen return macht ( also zeilenvorschub))

    Was heisst "using namespace std;"? ach das krieg ich schon raus ...

    Nochmals danke 😉



  • ruwn schrieb:

    hui *sprachlosigkeit*
    danke schön 🙂

    du bemühst dich ja auch 😉

    manchmal ging mir das printf... so auf die nerven das ich auf cout umgestiegen bin ( aber leider hab ich keine ahnung wie man nen return macht ( also zeilenvorschub))

    ein newline? so wie mit printf eigentlich auch:

    cout << "Text\nZweite Zeile\n\nAbsatz";
    

    also mit '\n'.
    falls du eine neue zeile nach der ausgabe einer zahl (oder etwas anderem) brauchst:

    int zahl = 42;
    cout << "Text " << zahl << '\n';
    

    und wenn du eventuell noch die standardausgabe flushen willst (also sichergehen, dass alles, was du an cout geschickt hast, auch ausgegeben wird), verwendest du endl:

    cout << "Viel, viel Text..." << endl;
    

    ist gleichbedeutend mit << '\n' << flush . eigentlich braucht man flush/endl aber nur selten.

    Was heisst "using namespace std;"? ach das krieg ich schon raus ...

    gut 😉
    hier: http://de.wikipedia.org/wiki/Namespace


Anmelden zum Antworten