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

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

Δημοσ.

Η ταξινόμηση δεν χρειάζεται ειναι περιττή για την ασκηση! Απλα επειδη τον ειδα σε κάποια φαση οτι ειχε ανησυχιες και για την ταξινομηση για αυτο. Και εγω αρχικα νομισα αυτο που καταλαβε και ο ημιθεος.

 

Φιλε μου φτιάξε αρχικα ενα εμφωλιασμένο loop το οποίο θα διατρέχει τα στοιχεια του πινακα σου κατοπιν βάλε μια if που θα ελέγχει αν δυο στοιχεια ειναι ιδια, ο ελεγχος αυτος θα γινεται στο εσωτερικο loop Απο τη στιγμη που δυο στοιχεια ειναι ιδια τοτε η στηλη αυτη δεν έχει διαφορετικά νουμερα ή ισοδυναμα αν δεν βρεθει κανενα ιδιο τοτε έχει διαφορετικά νουμερα.

 

Αν βρεις ένα στοιχειο διαφορετικο δεν χρειάζεται συμφωνα με την λογική της άσκησης να συνεχισεις οποτε μπορεις να παιξεις με μια μεταβλητη τύπου boolean σαν φρουρο σε κάποια προγραμματα μπορει να το δεις και σαν sentinel στην ονομασια της αν αυτη η μεταβλητη γινει true μετα απο την ευρεση δυο ιδιων στοιχειων θα εκτυπώνεις τον αριθμο της στήλης και θα κάνεις break απο τον εσωτερικό βροχο.Στον εξωτερικο βροχο ξαναθέσε την τιμή του φρουρου σε false.

 

Αρχικά φανταζομαι δεν σε απασχολουν θέματα πολυπλοκοτητας/αποδοτικοτητας του αλγοριθμου που χρησιμοποιειται απλα να δεις οτι δουλευει και μετά αν ενδιαφέρεσαι μπορεις να σκεφτεις και μια πιο βέλτιση λυση.

  • Like 1
  • Απαντ. 32
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Aν θέλεις να είναι τελείως δυναμικός ο κώδικας τότε καλύτερα να χρησιμοποιήσεις τη malloc για να ορίσεις το matrix και το array που αποθηκεύεις το αποτέλεσμα του ελέγχου.

 

Ο κώδικας παρακάτω παίρνει βελτιώσεις καθώς ο βρόγχος ελέγχου δεν τερματίζει μόλις βρεθεί διπλή εγγραφή και αφήνω σαν άσκηση να εξετάσεις αν τα στοιχεία του πίνακα ανακτώνται με τη σωστή σειρά από τη μνήμη (βλ. Link.png Site: Localityof reference

#include <stdio.h>
#include <stdlib.h>

int main() {
	int n,m,i,j,k;
	printf("Enter matrix dimensions: ");
	scanf("%d",&n);
	scanf("%d",&m);
	int **mat = (int **)malloc(n * sizeof(int*));
	for(i = 0; i < n; i++) mat[i] = (int *)malloc(n * sizeof(int));
	int* found_same = (int *)malloc(m * sizeof(int));

	// array elements
	for(i=0; i<n; ++i) {
		printf("Enter elements of row %d: ",i);
		for (j=0; j<m; j++) {
			scanf("%d",&mat[i][j]);
		}
	}

	// solve
	for(i=0; i<m; ++i) {
		found_same[i] = 0;
		for (j=0; j<n-1; j++) {
			for(k=j+1; k<n; k++) {
				if (mat[j][i] == mat[k][i]) found_same[i] = 1;
			}
		}
	}

	for(i=0; i<n; ++i) {
		for (j=0; j<m; j++) {
			if (!found_same[j])
				printf("%3d",mat[i][j]);
		}
		printf("\n");
	}
	return 0;
}

  • Like 3
Δημοσ.

 

Aν θέλεις να είναι τελείως δυναμικός ο κώδικας τότε καλύτερα να χρησιμοποιήσεις τη malloc για να ορίσεις το matrix και το array που αποθηκεύεις το αποτέλεσμα του ελέγχου.

 

Ο κώδικας παρακάτω παίρνει βελτιώσεις καθώς ο βρόγχος ελέγχου δεν τερματίζει μόλις βρεθεί διπλή εγγραφή και αφήνω σαν άσκηση να εξετάσεις αν τα στοιχεία του πίνακα ανακτώνται με τη σωστή σειρά από τη μνήμη (βλ. Link.png Site: Localityof reference

#include <stdio.h>
#include <stdlib.h>

int main() {
	int n,m,i,j,k;
	printf("Enter matrix dimensions: ");
	scanf("%d",&n);
	scanf("%d",&m);
	int **mat = (int **)malloc(n * sizeof(int*));
	for(i = 0; i < n; i++) mat[i] = (int *)malloc(n * sizeof(int));
	int* found_same = (int *)malloc(m * sizeof(int));

	// array elements
	for(i=0; i<n; ++i) {
		printf("Enter elements of row %d: ",i);
		for (j=0; j<m; j++) {
			scanf("%d",&mat[i][j]);
		}
	}

	// solve
	for(i=0; i<m; ++i) {
		found_same[i] = 0;
		for (j=0; j<n-1; j++) {
			for(k=j+1; k<n; k++) {
				if (mat[j][i] == mat[k][i]) found_same[i] = 1;
			}
		}
	}

	for(i=0; i<n; ++i) {
		for (j=0; j<m; j++) {
			if (!found_same[j])
				printf("%3d",mat[i][j]);
		}
		printf("\n");
	}
	return 0;
}

ευχαριστω φιλε μου για την απαντηση αλλα η ασκηση αυτη ηταν να λυθει μονο με στατικους πινακες ,οχι με δεικτες κ δυναμικη διαχειριση μνημης

Δημοσ.

ευχαριστω φιλε μου για την απαντηση αλλα η ασκηση αυτη ηταν να λυθει μονο με στατικους πινακες ,οχι με δεικτες κ δυναμικη διαχειριση μνημης

 

Νομίζω ότι το να το μετατρέψεις σε στατική διαχείριση είναι παιχνιδάκι. Απλώς βάλε ένα μεγάλο άνω όριο στους πίνακές σου, βγάζοντας τα malloc, και μην αφήνεις κατά το input να το ξεπερνάει. Περισσότερο το έγραψα για δεις το τριπλό loop της solve που κάνει τις συγκρίσεις.

  • Like 1
Δημοσ.

Πιο κατω ειναι κώδικας αλλα για γραμμες που έχουν ιδια στοιχεια.

#include <stdio.h>
#define ROWS 4
#define COLS 5
     
int main(void) {
     
int arr2D[ROWS][COLS]= { {0,2,3,4,5} , {7,7,7,7,7} , {0,1,2,3,3} , {0,1,2,3,4} };
int i,j;
     
for(i=0; i<ROWS; i++){
    for(j=0; j<COLS-1; j++){
        if(arr2D[i][j] == arr2D[i][j+1]){
             printf("\nRow %d has same values , %d" , i , arr2D[i][j] );
             break;
        }
    }
}
return 0;
}
Δημοσ.

 

Πιο κατω ειναι κώδικας αλλα για γραμμες που έχουν ιδια στοιχεια.

#include <stdio.h>
#define ROWS 4
#define COLS 5
     
int main(void) {
     
int arr2D[ROWS][COLS]= { {0,2,3,4,5} , {7,7,7,7,7} , {0,1,2,3,3} , {0,1,2,3,4} };
int i,j;
     
for(i=0; i<ROWS; i++){
    for(j=0; j<COLS-1; j++){
        if(arr2D[i][j] == arr2D[i][j+1]){
             printf("\nRow %d has same values , %d" , i , arr2D[i][j] );
             break;
        }
    }
}
return 0;
}

ευχαριστω θα τον δοκιμασω το κωδικα

Δημοσ.

 

Πιο κατω ειναι κώδικας αλλα για γραμμες που έχουν ιδια στοιχεια.

#include <stdio.h>
#define ROWS 4
#define COLS 5
     
int main(void) {
     
int arr2D[ROWS][COLS]= { {0,2,3,4,5} , {7,7,7,7,7} , {0,1,2,3,3} , {0,1,2,3,4} };
int i,j;
     
for(i=0; i<ROWS; i++){
    for(j=0; j<COLS-1; j++){
        if(arr2D[i][j] == arr2D[i][j+1]){
             printf("\nRow %d has same values , %d" , i , arr2D[i][j] );
             break;
        }
    }
}
return 0;
}

 

Αυτός ο κώδικας ελέγχει μόνο αν δυο συνεχόμενα εινα ιδια. 

  • Like 2
Δημοσ.

Αυτός ο κώδικας ελέγχει μόνο αν δυο συνεχόμενα εινα ιδια. 

σωστα προφανως μπερδευτηκε ο φιλος

κανονικα η συνθηκη if επρεπε να ειχε if(arr[j]  == arr[i+1][j])

 

δε το προσεξα γιατι δεν ασχοληθηκα,εχω κολησει με αλλη ασκηση με πινακες κ την ειχα για ευκολη

αυτοι οι πινακες αααααααχ

Δημοσ.

σωστα προφανως μπερδευτηκε ο φιλος

κανονικα η συνθηκη if επρεπε να ειχε if(arr[j]  == arr[i+1][j])

Δεν εννοώ οριζόντια ή κάθετα. Το καθε στοιχείο πρέπει να συγκριθεί με όλα τα άλλα της στήλης όχι μονο με το αποκάτω του. 

Δημοσ.

Δεν εννοώ οριζόντια ή κάθετα. Το καθε στοιχείο πρέπει να συγκριθεί με όλα τα άλλα της στήλης όχι μονο με το αποκάτω του. 

ναι το ξερω απλως το παιδι πηγε να συγκρινη τα δυο στοιχεια της στηλης κ συγκρινει τα δυο στοιχεια γραμμης

να ρωτησω κατι οταν δηλωνεις ενα πινακα  με τα στοιχεια που εχει μεσα πρεπει να ειναι σε σειρα?

ετσι? int arr2D[ROWS][COLS]= { {0,2,3,4,5} , {7,7,7,7,7} , {0,1,2,3,3} , {0,1,2,3,4} };

αν δηλωθει ετσι    


int b[size][size] = {{1,1,1,1},
                     {1,1,1,1},
		     {1,1,1,1},
		     {1,1,1,1}}; 

ειναι λαθος?

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

εχω κολησει σε μια ασκησει δεν μπορω να καταλαβω τι κανω λαθος,δεν ξερω αν επρεπε να ανοιξω αλλο θεμα αλλα επειδη ειναι ασκηση πανω στους πινακες την καταθετω εδω

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Να γραφει ενα προγραμμα το οποιο θα ζητα απο το χρηστη να εισαγει ενα ενα τα στοιχεια(ακεραιοι αριθμοι) ενος τετραγωνικου πινακα 4Χ4 a[4][4].Στη συνεχεια , το προγραμμα θα πρεπει να υπολογιζει σε καθε γραμμη ποσα στοιχεια ειναι θετικοι,αρνητικοι αριθμοι ή μηδεν.

 

α)Αν οι θετικοι ειναι η πλειοψηφια σε καθε γραμμη,τοτε το αντιστοιχο στοιχειο της δευτερευουσας διαγωνιου ενος επισης τετραγωνικου πινακα b[4][4] θα πρεπει να παιρνει τιμη 100.

β)Αν οι αρνητικοι η πλειοψηφια σε καθε γραμμη,τοτε το αντιστοιχο στοιχειο της δευτερευουσας διαγωνιου ενος επισης τετραγωνικου πινακα b[4][4] θα πρεπει να παιρνει τιμη -100.

γ)Αν δεν υπαρχει πλειοψηφια θετικων ή αρνητικων αριθμων,τοτε το αντιστοιχο στοιχειο της δευτερευουσας διαγωνιου ενος επισης τετραγωνικου πινακα b[4][4] θα πρεπει να παιρνει τιμη 0.

 

Τα υπολοιπα στοιχεια του πινακα b (δηλαδη ολα εκτος απο τη δευτερευσα διαγωνιο) θα πρεπει να ισουνται με 1.

 

π.χ.   ####### PINAKAS A #######

                        1   -4    0   -2
                        3    0   11   12
                       -7    0   13   -1
                        5   -5   15   -8
 
         ####### PINAKAS B #######
                        1    1    1 -100  
                        1    1  100 1
                        1 -100  1   1
                        0    1    1   1
 
η προσπαθεια που εκανα
 
#include <stdio.h>

#define size 4

int main()
{
	int i, j, pos, neg, zero;
	
	int a[size][size];
	
	int b[size][size] = {{1,1,1,1}, 
			     {1,1,1,1}, 
			     {1,1,1,1},
			     {1,1,1,1}};
	for(i = 0; i < size;i++)
	{
		for(j = 0; j < size; j++)
		{
			printf("Enter number:");
			scanf("%d", &a[i][j]);
		}
	}			     
	for(i = 0; i < size; i++)
	{
		pos = neg = zero = 0;
		for(j = 0; j < size; j++)
		{
			if(a[i][j] > 0)
				pos++;
			else if(a[i][j] < 0)
				neg++;
			else
				zero++;

			if(i+j == size-1)
			{
				if(pos > neg)
					b[i][size-1] = 100;
				else if(pos < neg)
					b[i][size-1] = -100;
				else
					b[i][size-j-1] = 0;
			}

		}
	}
	printf("\n####### PINAKAS A #######\n");
	for(i = 0; i < size; i++)
	{
		for(j = 0; j < size; j++)
		{
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}
	printf("\n####### PINAKAS B #######\n");
	for(i = 0; i < size; i++)
	{
		for(j = 0; j < size; j++)
		{
			printf("%5d", b[i][j]);
		}
		printf("\n");
	}
	return 0;
}
         ####### PINAKAS Α #######
                        1   -4    0   -2
                        3    0   11   12
                       -7    0   13   -1
                        5   -5   15   -8
 
         ####### PINAKAS B #######
                        1    1    1-100  
                        1    1    1 100
                        1    1    1-100
                        1    1    1 100

τι κανω λαθος?

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

 

	int pos[size][size], neg, zero;
	
	for(i = 0; i < size; i++)
	{
		pos = neg = zero = 0;
		for(j = 0; j < size; j++)
		{
			if(a[i][j] > 0)
				pos++;
			else if(a[i][j] < 0)
				neg++;
			else
				zero++;
		}
	}
	for(i = 0; i < size; i++)
	{
				if(pos[i][j] > neg[i][j])
					b[i][size-j-1] = 100;
				else if(pos[i][j] < neg[i][j])
					b[i][size-j-1] = -100;
				else
					b[i][size-j-1] = 0;
	}
τι κανω λαθος?

 

Καταρχάς δύσκολο να σου έβγαλε έξοδο ο συγκεκριμένος κώδικας γιατί δεν κάνει compile. Ορίζεις τον pos σαν πίνακα ενώ το neg και το zero σαν απλούς ακεραίους. Μετά αυξάνεις τις μεταβλητές σαν να είναι ακέραιοι και μετά έχεις neg[j] σαν να είναι πίνακες.

 

Πρέπει να αποφασίσεις πώς θέλεις να δουλέψεις. Ή θα ορίσεις τα πάντα σαν πίνακες και θα αλλάξεις τον κώδικα ώστε να δουλεύεις παντού με πίνακες ή θα ορίσεις τα πάντα σαν ακεραίους και θα δουλεύεις με τα pos++, κτλ που έχεις.

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

Καταρχάς δύσκολο να σου έβγαλε έξοδο ο συγκεκριμένος κώδικας γιατί δεν κάνει compile. Ορίζεις τον pos σαν πίνακα ενώ το neg και το zero σαν απλούς ακεραίους. Μετά αυξάνεις τις μεταβλητές σαν να είναι ακέραιοι και μετά έχεις neg[j] σαν να είναι πίνακες.

 

Πρέπει να αποφασίσεις πώς θέλεις να δουλέψεις. Ή θα ορίσεις τα πάντα σαν πίνακες και θα αλλάξεις τον κώδικα ώστε να δουλεύεις παντού με πίνακες ή θα ορίσεις τα πάντα σαν ακεραίους και θα δουλεύεις με τα pos++, κτλ που έχεις.

συγνωμη αλλα τωρα τον αλλαζω συνεχεια το κωδικα ,δοκιμαζω διαφορα πραγματα ,θα κανω compile κ θα γραψω τι μου βγαζει 1 λεπτο

Βαζοντας τις ιδιες τιμες με το παραδειγμα 

 

Enter number:1
Enter number:-4
Enter number:0
Enter number:-2
Enter number:3
Enter number:0
Enter number:11
Enter number:12
Enter number:-7
Enter number:0
Enter number:13
Enter number:-1
Enter number:5
Enter number:-5
Enter number:15
Enter number:-8
 
Τωρα με τις τελευταιες αλλαγες που εκανα μου εμφανιζει αυτο
 
####### PINAKAS A #######
              1   -4    0   -2
              3    0   11   12
             -7    0   13   -1
              5   -5   15   -8
 
####### PINAKAS B #######
             1    1    1 -100
             1    1    1  100
             1    1    1 -100
             1    1    1  100
 
Επεξ/σία από orestis1996
Δημοσ.

Σχεδον την εχω λυση , δεν μπορω να καταλαβω γιατι στη τελευται γραμμη δεν μου βγαζει 0

#include <stdio.h>

#define size 4

int main()
{
	int i, j, pos, neg, zero;
	
	int a[size][size];
	
	int b[size][size] = {{1,1,1,1}, 
			     {1,1,1,1}, 
			     {1,1,1,1},
			     {1,1,1,1}};
	for(i = 0; i < size;i++)      //Εισαγωγη στοιχειων στο πινακα a
	{
		for(j = 0; j < size; j++)
		{
			printf("Enter number:");
			scanf("%d", &a[i][j]);
		}
	}			     
	for(i = 0; i < size; i++)
	{	 /*Αρχικοποιηση μετρητων για να υπολογισθει το 							   πληθος θετικων,αρνητικων,μηδενικων τιμων για καθε γραμμη*/
		pos = neg = zero = 0; 
		for(j = 0; j < size; j++)       
		{
			if(a[i][j] > 0)
				pos++;
			else if(a[i][j] < 0)
				neg++;
			else if(a[i][j] == 0)
				zero++;

			if(i+j == size-1)    //Δευτερεύουσα διαγωνιος
			{
				if(pos > neg)
					b[i][j] = 100;
				else if(pos < neg)
					b[i][j] = -100;
				else if(pos == neg)
					b[i][j] = 0;
			}

		}
	}
	printf("\n####### PINAKAS A #######\n");
	for(i = 0; i < size; i++)
	{
		for(j = 0; j < size; j++)
		{
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}
	printf("\n####### PINAKAS B #######\n");
	for(i = 0; i < size; i++)
	{
		for(j = 0; j < size; j++)
		{
			printf("%5d", b[i][j]);
		}
		printf("\n");
	}
	return 0;
}

εμφανιζει αυτο 

 

####### PINAKAS A #######
              1   -4    0   -2
              3    0   11   12
             -7    0   13   -1
              5   -5   15   -8
 
####### PINAKAS B #######
              1    1    1 -100
              1    1  100    1
              1 -100    1    1
            100    1    1    1

 

Δημοσ.

Μην προσπαθείς απλά να μεταφράσεις τη 1η σκέψη σου στο συντακτικό της γλώσσας αλλά δώσε έμφαση στο πώς να σκεφτείς σωστά και να βρεις ένα ωραίο αλγόριθμο.

 

Έχεις τον παρακάτω κώδικα:

Σχεδον την εχω λυση , δεν μπορω να καταλαβω γιατι στη τελευται γραμμη δεν μου βγαζει 0

	for(i = 0; i < size; i++)
	{	 /*Αρχικοποιηση μετρητων για να υπολογισθει το 							   πληθος θετικων,αρνητικων,μηδενικων τιμων για καθε γραμμη*/
		pos = neg = zero = 0; 
		for(j = 0; j < size; j++)       
		{
			if(a[i][j] > 0)
				pos++;
			else if(a[i][j] < 0)
				neg++;
			else if(a[i][j] == 0)
				zero++;

			έλεγχος

		}
	}

 

Όπου έλεγχος είναι το παρακάτω:

 

			if(i+j == size-1)    //Δευτερεύουσα διαγωνιος
			{
				if(pos > neg)
					b[i][j] = 100;
				else if(pos < neg)
					b[i][j] = -100;
				else if(pos == neg)
					b[i][j] = 0;
			}

 

Το πρόβλημα δεν είναι ότι δεν βγάζει σωστά το 0 αλλά ότι δεν βγάζει σωστά κανένα αποτέλεσμα απλά έτυχε να βγάλει αυτά που θέλεις στις υπόλοιπες. Έχεις βάλει τον έλεγχο i+j == size - 1 οπότε στην πρώτη γραμμή (i == 0) θα τρέξει όταν το j γίνει 3 δηλαδή όταν προσπελάσει το τελευταίο στοιχείο της γραμμής οπότε ως εδώ είμαστε καλά.

 

Από εκεί και πέρα όμως τι θα κάνει ? Στην δεύτερη γραμμή έχεις i == 1 οπότε το σώμα του if θα τρέξει μετά την προσπέλαση του 3ου στοιχείου της γραμμής. Το 4ο στοιχείο της γραμμής θα είναι σαν να μην υπήρξε ποτέ. Το αποτέλεσμα τυγχάνει να βγει σωστό επειδή ελέγχει τα "3 0 11" δηλαδή ίδια περίπτωση με το να λάμβανε υπόψιν και το 12.

 

Στην επόμενη γραμμή ελέγχει μόνο τα "-7 0" οπότε σου βγάζει κατά τύχη πάλι το σωστό αποτέλεσμα.

 

Γιατί επέλεξες αυτή την συνθήκη i+j == size -1 όταν δεν βγάζει κανένα νόημα. Και σωστή όμως να ήταν ακόμη, δεν υπάρχει κανένας λόγος να μπλέξεις με τα i και j. Ανεξάρτητα από το πόσες γραμμές και στήλες έχει ο πίνακας σου, εσύ θέλεις ο έλεγχος να γίνει στο τέλος κάθε γραμμής οπότε γιατί να μπει ο έλεγχος μέσα στο for(j) βρόχο και να μην μπει μετά από αυτόν ώστε να τρέξει σωστά χωρίς να χρειάζεσαι καν το if ?

 

	for(i = 0; i < size; i++)
	{
		....
		for(j = 0; j < size; j++)       
		{

			...
		}
		if(pos > neg)
			b[i][size-1-i] = 100;
		else if(pos < neg)
			b[i][size-1-i] = -100;
		else if(pos == neg)
			b[i][size-1-i] = 0;
	}
Ούτε if με i και j ούτε τίποτα. Γιατί να μπλέξεις με το j όταν θέλεις την διαγώνιο οπότε μπορείς να την υπολογίσεις κατευθείαν έχοντας μόνο το i. Εφόσον μιλάμε για την i γραμμή το στοιχείο είναι το .

 

Αν θέλεις μπορείς ακόμη και αυτά τα if να εξαλείψεις χρησιμοποιώντας ένα εξυπνακίστικο κόλπο:

	for(i = 0; i < size; i++)
	{
		...
		for(j = 0; j < size; j++)       
		{
			...
		}
		b[i][size-1-i] = (pos > neg) * 100 - (neg > pos) * 100;
	}
Αν οι θετικοί είναι περισσότεροι τότε θα έχεις 1*100-0*100 οπότε 100. Αν οι αρνητικοί είναι περισσότεροι τότε θα έχεις 0*100-1*100 οπότε -100.

 

Γενικά προσπάθησε να μπεις σε ένα σωστό τρόπο σκέψης και να "σχεδιάζεις" αν όχι τον βέλτιστο, ένα καλό αλγόριθμο. Μετά το να τον μετατρέψεις στο συντακτικό της C είναι πολύ εύκολο.

  • Like 2

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

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

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

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

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

Σύνδεση

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

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