DDevil Δημοσ. 30 Οκτωβρίου 2015 Δημοσ. 30 Οκτωβρίου 2015 Η ταξινόμηση δεν χρειάζεται ειναι περιττή για την ασκηση! Απλα επειδη τον ειδα σε κάποια φαση οτι ειχε ανησυχιες και για την ταξινομηση για αυτο. Και εγω αρχικα νομισα αυτο που καταλαβε και ο ημιθεος. Φιλε μου φτιάξε αρχικα ενα εμφωλιασμένο loop το οποίο θα διατρέχει τα στοιχεια του πινακα σου κατοπιν βάλε μια if που θα ελέγχει αν δυο στοιχεια ειναι ιδια, ο ελεγχος αυτος θα γινεται στο εσωτερικο loop Απο τη στιγμη που δυο στοιχεια ειναι ιδια τοτε η στηλη αυτη δεν έχει διαφορετικά νουμερα ή ισοδυναμα αν δεν βρεθει κανενα ιδιο τοτε έχει διαφορετικά νουμερα. Αν βρεις ένα στοιχειο διαφορετικο δεν χρειάζεται συμφωνα με την λογική της άσκησης να συνεχισεις οποτε μπορεις να παιξεις με μια μεταβλητη τύπου boolean σαν φρουρο σε κάποια προγραμματα μπορει να το δεις και σαν sentinel στην ονομασια της αν αυτη η μεταβλητη γινει true μετα απο την ευρεση δυο ιδιων στοιχειων θα εκτυπώνεις τον αριθμο της στήλης και θα κάνεις break απο τον εσωτερικό βροχο.Στον εξωτερικο βροχο ξαναθέσε την τιμή του φρουρου σε false. Αρχικά φανταζομαι δεν σε απασχολουν θέματα πολυπλοκοτητας/αποδοτικοτητας του αλγοριθμου που χρησιμοποιειται απλα να δεις οτι δουλευει και μετά αν ενδιαφέρεσαι μπορεις να σκεφτεις και μια πιο βέλτιση λυση. 1
johnnieinlab Δημοσ. 30 Οκτωβρίου 2015 Δημοσ. 30 Οκτωβρίου 2015 Aν θέλεις να είναι τελείως δυναμικός ο κώδικας τότε καλύτερα να χρησιμοποιήσεις τη malloc για να ορίσεις το matrix και το array που αποθηκεύεις το αποτέλεσμα του ελέγχου. Ο κώδικας παρακάτω παίρνει βελτιώσεις καθώς ο βρόγχος ελέγχου δεν τερματίζει μόλις βρεθεί διπλή εγγραφή και αφήνω σαν άσκηση να εξετάσεις αν τα στοιχεία του πίνακα ανακτώνται με τη σωστή σειρά από τη μνήμη (βλ. 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; } 3
orestis1996 Δημοσ. 30 Οκτωβρίου 2015 Μέλος Δημοσ. 30 Οκτωβρίου 2015 Aν θέλεις να είναι τελείως δυναμικός ο κώδικας τότε καλύτερα να χρησιμοποιήσεις τη malloc για να ορίσεις το matrix και το array που αποθηκεύεις το αποτέλεσμα του ελέγχου. Ο κώδικας παρακάτω παίρνει βελτιώσεις καθώς ο βρόγχος ελέγχου δεν τερματίζει μόλις βρεθεί διπλή εγγραφή και αφήνω σαν άσκηση να εξετάσεις αν τα στοιχεία του πίνακα ανακτώνται με τη σωστή σειρά από τη μνήμη (βλ. 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; } ευχαριστω φιλε μου για την απαντηση αλλα η ασκηση αυτη ηταν να λυθει μονο με στατικους πινακες ,οχι με δεικτες κ δυναμικη διαχειριση μνημης
johnnieinlab Δημοσ. 30 Οκτωβρίου 2015 Δημοσ. 30 Οκτωβρίου 2015 ευχαριστω φιλε μου για την απαντηση αλλα η ασκηση αυτη ηταν να λυθει μονο με στατικους πινακες ,οχι με δεικτες κ δυναμικη διαχειριση μνημης Νομίζω ότι το να το μετατρέψεις σε στατική διαχείριση είναι παιχνιδάκι. Απλώς βάλε ένα μεγάλο άνω όριο στους πίνακές σου, βγάζοντας τα malloc, και μην αφήνεις κατά το input να το ξεπερνάει. Περισσότερο το έγραψα για δεις το τριπλό loop της solve που κάνει τις συγκρίσεις. 1
DDevil Δημοσ. 31 Οκτωβρίου 2015 Δημοσ. 31 Οκτωβρίου 2015 Πιο κατω ειναι κώδικας αλλα για γραμμες που έχουν ιδια στοιχεια. #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; }
orestis1996 Δημοσ. 31 Οκτωβρίου 2015 Μέλος Δημοσ. 31 Οκτωβρίου 2015 Πιο κατω ειναι κώδικας αλλα για γραμμες που έχουν ιδια στοιχεια. #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; } ευχαριστω θα τον δοκιμασω το κωδικα
albNik Δημοσ. 31 Οκτωβρίου 2015 Δημοσ. 31 Οκτωβρίου 2015 Πιο κατω ειναι κώδικας αλλα για γραμμες που έχουν ιδια στοιχεια. #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; } Αυτός ο κώδικας ελέγχει μόνο αν δυο συνεχόμενα εινα ιδια. 2
orestis1996 Δημοσ. 31 Οκτωβρίου 2015 Μέλος Δημοσ. 31 Οκτωβρίου 2015 Αυτός ο κώδικας ελέγχει μόνο αν δυο συνεχόμενα εινα ιδια. σωστα προφανως μπερδευτηκε ο φιλος κανονικα η συνθηκη if επρεπε να ειχε if(arr[j] == arr[i+1][j]) δε το προσεξα γιατι δεν ασχοληθηκα,εχω κολησει με αλλη ασκηση με πινακες κ την ειχα για ευκολη αυτοι οι πινακες αααααααχ
albNik Δημοσ. 31 Οκτωβρίου 2015 Δημοσ. 31 Οκτωβρίου 2015 σωστα προφανως μπερδευτηκε ο φιλος κανονικα η συνθηκη if επρεπε να ειχε if(arr[j] == arr[i+1][j]) Δεν εννοώ οριζόντια ή κάθετα. Το καθε στοιχείο πρέπει να συγκριθεί με όλα τα άλλα της στήλης όχι μονο με το αποκάτω του.
orestis1996 Δημοσ. 31 Οκτωβρίου 2015 Μέλος Δημοσ. 31 Οκτωβρίου 2015 Δεν εννοώ οριζόντια ή κάθετα. Το καθε στοιχείο πρέπει να συγκριθεί με όλα τα άλλα της στήλης όχι μονο με το αποκάτω του. ναι το ξερω απλως το παιδι πηγε να συγκρινη τα δυο στοιχεια της στηλης κ συγκρινει τα δυο στοιχεια γραμμης να ρωτησω κατι οταν δηλωνεις ενα πινακα με τα στοιχεια που εχει μεσα πρεπει να ειναι σε σειρα? ετσι? 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}}; ειναι λαθος?
orestis1996 Δημοσ. 31 Οκτωβρίου 2015 Μέλος Δημοσ. 31 Οκτωβρίου 2015 (επεξεργασμένο) εχω κολησει σε μια ασκησει δεν μπορω να καταλαβω τι κανω λαθος,δεν ξερω αν επρεπε να ανοιξω αλλο θεμα αλλα επειδη ειναι ασκηση πανω στους πινακες την καταθετω εδω ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Να γραφει ενα προγραμμα το οποιο θα ζητα απο το χρηστη να εισαγει ενα ενα τα στοιχεια(ακεραιοι αριθμοι) ενος τετραγωνικου πινακα 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 τι κανω λαθος? Επεξ/σία 31 Οκτωβρίου 2015 από orestis1996
imitheos Δημοσ. 31 Οκτωβρίου 2015 Δημοσ. 31 Οκτωβρίου 2015 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++, κτλ που έχεις.
orestis1996 Δημοσ. 31 Οκτωβρίου 2015 Μέλος Δημοσ. 31 Οκτωβρίου 2015 (επεξεργασμένο) Καταρχάς δύσκολο να σου έβγαλε έξοδο ο συγκεκριμένος κώδικας γιατί δεν κάνει 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 Επεξ/σία 31 Οκτωβρίου 2015 από orestis1996
orestis1996 Δημοσ. 31 Οκτωβρίου 2015 Μέλος Δημοσ. 31 Οκτωβρίου 2015 Σχεδον την εχω λυση , δεν μπορω να καταλαβω γιατι στη τελευται γραμμη δεν μου βγαζει 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
imitheos Δημοσ. 31 Οκτωβρίου 2015 Δημοσ. 31 Οκτωβρίου 2015 Μην προσπαθείς απλά να μεταφράσεις τη 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 είναι πολύ εύκολο. 2
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα