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 intmein 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
kaufenxdann soll es spaltenweise ausgegeben werden:
aikkcathuitfevennrxdabei 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