guitarist2 Δημοσ. 15 Μαΐου 2018 Δημοσ. 15 Μαΐου 2018 Η υλοποίηση του πίνακα στον κώδικά μου τυπώνει το παρακάτω και δεν καταλαβαίνω γιατί. Insert L(different letters in word):4 Insert M(different digits in word):4 Insert d(size of word):4 Insert N(size of array):4 0020 AA31 array[0]: AA31 2300 CD11 array[1]: CD11 2010 CA21 array[2]: CA21 0332 AD43 array[3]: AD43 final array[0]: AA31CD11CA21AD43 final array[1]: CD11CA21AD43 final array[2]: CA21AD43 final array[3]: AD43 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int i; int i1; char randomChar(int L1){ if(L1==0){ return('A'); } i = rand()%(L1); printf("%d",i); if(i==0){ return('A'); }else if(i==1){ return('B'); }else if(i==2){ return('C'); }else if(i==3){ return('D'); }else if(i==4){ return('E'); }else if(i==5){ return('F'); }else if(i==6){ return('G'); }else if(i==7){ return('H'); }else{ return('I'); } } int randomNum(int M1){ if(M1==0){ return('1'); } i1 = rand()%(M1); printf("%d",i1); if(i1==0){ return('1'); }else if(i1==1){ return('2'); }else if(i1==2){ return('3'); }else if(i1==3){ return('4'); }else if(i1==4){ return('5'); }else if(i1==5){ return('6'); }else if(i1==6){ return('7'); }else if(i1==7){ return('8'); }else{ return('9'); } } int main(){ time_t t; srand((unsigned) time(&t)); int L,M,d,N; printf("Insert L(different letters in word):"); scanf("%d",&L); while(L>9 || L<0){ printf("Invalid input, try again:"); scanf("%d",&L); } printf("Insert M(different digits in word):"); scanf("%d",&M); while(M>9 || M<1){ printf("Invalid input, try again:"); scanf("%d",&M); } printf("Insert d(size of word):"); scanf("%d",&d); while((d%2)!=0){ printf("Invalid input, try again:"); scanf("%d",&d); } printf("Insert N(size of array):"); scanf("%d",&N); while(N<=0){ printf("Invalid input, try again:"); scanf("%d",&N); } char array[N][d]; char word[d]; char temp[1]; for(int b=0; b<N; b++){ word[0]='\0'; for(int a=0; a<(d/2); a++){ temp[0] = randomChar(L); strcat(word,temp); } for(int e=0; e<(d/2); e++){ temp[0] = randomNum(M); strcat(word,temp); } printf("\n%s\n",word); for(int z=0; z<=d; z++){ array[b][z]=word[z]; //printf("\n%s\n",array[b]); } printf("array[%d]: %s\n",b,array[b]); } for(int x=0; x<N; x++){ printf("final array[%x]: %s\n",x,array[x]); } return 0; }
guitarist2 Δημοσ. 15 Μαΐου 2018 Μέλος Δημοσ. 15 Μαΐου 2018 32 λεπτά πριν, kaliakman είπε Τι περίμενες να σου βγάλει; κάθε θέση του πίνακα θα έπρεπε να έχει 1 συμβολοσειρά. Σωστό: array[0]: AA31 array[1]: CD11 array[2]: CA21 array[3]: AD43 Λάθος: final array[0]: AA31CD11CA21AD43 final array[1]: CD11CA21AD43 final array[2]: CA21AD43 final array[3]: AD43
kaliakman Δημοσ. 15 Μαΐου 2018 Δημοσ. 15 Μαΐου 2018 Άλλαξε το loop με το z να είναι <d και όχι <= d . Αν σου διορθώσει το πρόβλημα γράψε ώστε να εξηγήσω κιόλας!
guitarist2 Δημοσ. 15 Μαΐου 2018 Μέλος Δημοσ. 15 Μαΐου 2018 1 ώρα πριν, kaliakman είπε Άλλαξε το loop με το z να είναι <d και όχι <= d . Αν σου διορθώσει το πρόβλημα γράψε ώστε να εξηγήσω κιόλας! Το δοκίμασα ήδη και βγάζει κάτι παράξενα πράγματα (παρακάτω φαίνονται ως @ και και πχ το array[1]: DD43Y έχει ένα τυχαίο Υ στο τέλος ), με <= τουλάχιστον δεν τυπώνει τίποτα παράξενο : Insert L(different letters in word):4 Insert M(different digits in word):4 Insert d(size of word):4 Insert N(size of array):4 3222 DC33 array[0]: DC33 3332 DD43 array[1]: DD43Y @ 3021 DA32 array[2]: DA32 1320 BD31 array[3]: BD31 final array[0]: DC33DD43DA32BD31 final array[1]: DD43DA32BD31 final array[2]: DA32BD31 final array[3]: BD31
Fortistis Δημοσ. 16 Μαΐου 2018 Δημοσ. 16 Μαΐου 2018 Εάν εξαιρέσουμε όλα τα άλλα που φαίνονται στον κώδικα, για να φτιάξεις αυτό που θες θα πρέπει το word[0] να μην είναι το '\0'. Επίσης, θα θέσεις το d σε d+1, θα βάλεις τα (d-1)/2 όπως θέλεις και μετά θα κάνεις το d στοιχείο σε '\0'. Τέλος, αντί για το temp και την strcat, γέμισε απευθείας το word. Δηλαδή: word[a] = randomChar(L) Και word[e] = randomNum(M) Το a θα είναι στο [0, (d-1)/2 ) και το e στο [(d-1)/2, d-1 ).
guitarist2 Δημοσ. 16 Μαΐου 2018 Μέλος Δημοσ. 16 Μαΐου 2018 (επεξεργασμένο) Ενώ για κάποιες τιμές δουλεύει,για 8(πχ) μου τυπώνει πάλι παράξενα: Insert L(different letters in word):8 Insert M(different digits in word):8 Insert d(size of word):8 Insert N(size of array):8 array[0]: CDFD5327$ array[1]: FADE2417$ array[2]: HBEE7178$ array[3]: EHDH1313$ array[4]: FGGC1816$ array[5]: HDBA7277$ array[6]: CDCA4281$ array[7]: ADHB6144$ array[0]: CDFD5327$FADE2417$HBEE7178$EHDH1313$FGGC1816$HDBA7277$CDCA4281$ADHB6144$ array[1]: FADE2417$HBEE7178$EHDH1313$FGGC1816$HDBA7277$CDCA4281$ADHB6144$ array[2]: HBEE7178$EHDH1313$FGGC1816$HDBA7277$CDCA4281$ADHB6144$ array[3]: EHDH1313$FGGC1816$HDBA7277$CDCA4281$ADHB6144$ array[4]: FGGC1816$HDBA7277$CDCA4281$ADHB6144$ array[5]: HDBA7277$CDCA4281$ADHB6144$ array[6]: CDCA4281$ADHB6144$ array[7]: ADHB6144$ 6 ώρες πριν, Fortistis είπε Εάν εξαιρέσουμε όλα τα άλλα που φαίνονται στον κώδικα, για να φτιάξεις αυτό που θες θα πρέπει το word[0] να μην είναι το '\0'. Επίσης, θα θέσεις το d σε d+1, θα βάλεις τα (d-1)/2 όπως θέλεις και μετά θα κάνεις το d στοιχείο σε '\0'. Τέλος, αντί για το temp και την strcat, γέμισε απευθείας το word. Δηλαδή: word[a] = randomChar(L) Και word[e] = randomNum(M) Το a θα είναι στο [0, (d-1)/2 ) και το e στο [(d-1)/2, d-1 ). Και ο ανανεωμένος κώδικας: d = d+1; char array[N][d]; char word[d]; for(int b=0; b<N; b++){ for(int a=0; a<((d-1)/2); a++){ word[a] = randomChar(L); } for(int e=((d-1)/2); e<(d-1); e++){ word[e] = randomNum(M); } word[d]='\0'; //printf("\n%s\n",word); for(int z=0; z<=d; z++){ array[b][z]=word[z]; } printf("array[%d]: %s\n",b,array[b]); } for(int x=0; x<N; x++){ printf("array[%d]: %s\n",x,array[x]); } Επεξ/σία 16 Μαΐου 2018 από guitarist2
kaliakman Δημοσ. 16 Μαΐου 2018 Δημοσ. 16 Μαΐου 2018 Λοιπόν το πρόβλημα σου είναι ότι δεν έχεις καταλάβει πως δουλεύουν τα string (η καλύτερη πίνακες από χαρακτήρες) στην c. Όταν φτιάχνεις ένα string : char arr[n]; Μπορείς να βάλει χαρακτήρες μέχρι και το n-1 γιατί στην c ΠΡΈΠΕΙ να τελειώνει ένα string με το χαρακτήρα '\0'. Με αυτό τον τρόπο ξέρει η γλώσσα πότε όντως τελειώνει ένα string. Επίσης οι δισδιαστατοι πίνακες στην c βρίσκονται σε συνεχόμενες θέσεις μνήμης ανά γραμμή άρα τα string που έχεις είναι αποθηκευμενα δίπλα δίπλα. Το αποτέλεσμα που παίρνεις όταν εκτυπωνεισ final array είναι ένας συνδυασμός των δύο που ανέφερα. Δεν τερματίζεις σωστά τα string με αποτέλεσμα να σου εκτυπωνει τα πάντα μέχρι να τελειώσει το array.
guitarist2 Δημοσ. 16 Μαΐου 2018 Μέλος Δημοσ. 16 Μαΐου 2018 11 λεπτά πριν, kaliakman είπε Λοιπόν το πρόβλημα σου είναι ότι δεν έχεις καταλάβει πως δουλεύουν τα string (η καλύτερη πίνακες από χαρακτήρες) στην c. Όταν φτιάχνεις ένα string : char arr[n]; Μπορείς να βάλει χαρακτήρες μέχρι και το n-1 γιατί στην c ΠΡΈΠΕΙ να τελειώνει ένα string με το χαρακτήρα '\0'. Με αυτό τον τρόπο ξέρει η γλώσσα πότε όντως τελειώνει ένα string. Επίσης οι δισδιαστατοι πίνακες στην c βρίσκονται σε συνεχόμενες θέσεις μνήμης ανά γραμμή άρα τα string που έχεις είναι αποθηκευμενα δίπλα δίπλα. Το αποτέλεσμα που παίρνεις όταν εκτυπωνεισ final array είναι ένας συνδυασμός των δύο που ανέφερα. Δεν τερματίζεις σωστά τα string με αποτέλεσμα να σου εκτυπωνει τα πάντα μέχρι να τελειώσει το array. Με αυτή την εντολή νομίζω λύνεται το πρώτο που ανέφερες: word[d]='\0'; Ακόμα, τις περισσότερες φορές δουλεύει ,πέρα από κάποιες περιπτώσεις.
kaliakman Δημοσ. 16 Μαΐου 2018 Δημοσ. 16 Μαΐου 2018 1 λεπτό πριν, guitarist2 είπε Με αυτή την εντολή νομίζω λύνεται το πρώτο που ανέφερες: word[d]='\0'; Ακόμα, τις περισσότερες φορές δουλεύει ,πέρα από κάποιες περιπτώσεις. Ναι άμα είσαι τυχερός και το array (που έχει σκουπίδια από την μνήμη) έχει κάτι που να φαίνεται σωστό έχεις αυτές τις "σωστές" φορές.
guitarist2 Δημοσ. 16 Μαΐου 2018 Μέλος Δημοσ. 16 Μαΐου 2018 33 λεπτά πριν, kaliakman είπε Ναι άμα είσαι τυχερός και το array (που έχει σκουπίδια από την μνήμη) έχει κάτι που να φαίνεται σωστό έχεις αυτές τις "σωστές" φορές. Εντάξει, βρήκα τη λύση, ευχαριστώ.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα