Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Η υλοποίηση του πίνακα στον κώδικά μου τυπώνει το παρακάτω και δεν καταλαβαίνω γιατί.

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

 

Δημοσ.
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

Δημοσ.

Άλλαξε το loop με το z να είναι <d και όχι <= d . Αν σου διορθώσει το πρόβλημα γράψε ώστε να εξηγήσω κιόλας!

Δημοσ.
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
 

Δημοσ.

Εάν εξαιρέσουμε όλα τα άλλα που φαίνονται στον κώδικα, για να φτιάξεις αυτό που θες θα πρέπει το 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 ). 

Δημοσ. (επεξεργασμένο)

Ενώ για κάποιες τιμές δουλεύει,για 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]);
	}

 

Επεξ/σία από guitarist2
Δημοσ.

Λοιπόν το πρόβλημα σου είναι ότι δεν έχεις καταλάβει πως δουλεύουν τα string (η καλύτερη πίνακες από χαρακτήρες) στην c. 

Όταν φτιάχνεις ένα string :

char arr[n];

Μπορείς να βάλει χαρακτήρες μέχρι και το n-1 γιατί στην c ΠΡΈΠΕΙ να τελειώνει ένα string με το χαρακτήρα '\0'. Με αυτό τον τρόπο ξέρει η γλώσσα πότε όντως τελειώνει ένα string.

Επίσης οι δισδιαστατοι πίνακες στην c βρίσκονται σε συνεχόμενες θέσεις μνήμης ανά γραμμή άρα τα string που έχεις είναι αποθηκευμενα δίπλα δίπλα. 

Το αποτέλεσμα που παίρνεις όταν εκτυπωνεισ final array είναι ένας συνδυασμός των δύο που ανέφερα. 

Δεν τερματίζεις σωστά τα string με αποτέλεσμα να σου εκτυπωνει τα πάντα μέχρι να τελειώσει το array. 

Δημοσ.
11 λεπτά πριν, kaliakman είπε

Λοιπόν το πρόβλημα σου είναι ότι δεν έχεις καταλάβει πως δουλεύουν τα string (η καλύτερη πίνακες από χαρακτήρες) στην c. 

Όταν φτιάχνεις ένα string :

char arr[n];

Μπορείς να βάλει χαρακτήρες μέχρι και το n-1 γιατί στην c ΠΡΈΠΕΙ να τελειώνει ένα string με το χαρακτήρα '\0'. Με αυτό τον τρόπο ξέρει η γλώσσα πότε όντως τελειώνει ένα string.

Επίσης οι δισδιαστατοι πίνακες στην c βρίσκονται σε συνεχόμενες θέσεις μνήμης ανά γραμμή άρα τα string που έχεις είναι αποθηκευμενα δίπλα δίπλα. 

Το αποτέλεσμα που παίρνεις όταν εκτυπωνεισ final array είναι ένας συνδυασμός των δύο που ανέφερα. 

Δεν τερματίζεις σωστά τα string με αποτέλεσμα να σου εκτυπωνει τα πάντα μέχρι να τελειώσει το array. 


 

Με αυτή την εντολή νομίζω λύνεται το πρώτο που ανέφερες: word[d]='\0';

Ακόμα, τις περισσότερες φορές δουλεύει ,πέρα από κάποιες περιπτώσεις.

Δημοσ.
1 λεπτό πριν, guitarist2 είπε


 

Με αυτή την εντολή νομίζω λύνεται το πρώτο που ανέφερες: word[d]='\0';

Ακόμα, τις περισσότερες φορές δουλεύει ,πέρα από κάποιες περιπτώσεις.

Ναι άμα είσαι τυχερός και το array (που έχει σκουπίδια από την μνήμη) έχει κάτι που να φαίνεται σωστό έχεις αυτές τις "σωστές" φορές. 

Δημοσ.
33 λεπτά πριν, kaliakman είπε

Ναι άμα είσαι τυχερός και το array (που έχει σκουπίδια από την μνήμη) έχει κάτι που να φαίνεται σωστό έχεις αυτές τις "σωστές" φορές. 

Εντάξει, βρήκα τη λύση, ευχαριστώ.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...