migf1 Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 Δεν αναφέρει πουθενά λέξεις όπως deserve, entitled, κλπ, οπότε δεν μιλάει καθόλου για δικαιώματα. Αν τα υπονοεί δεν μπορώ να το γνωρίζω.
Star_Light Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 Δεν αναφέρει πουθενά λέξεις όπως deserve, entitled, κλπ, οπότε δεν μιλάει καθόλου για δικαιώματα. Αν τα υπονοεί δεν μπορώ να το γνωρίζω. ε αρα κανεις δεν μπορει να το γνωριζει αυτο!!! Και αν οντως υπηρχε θεμα θα εβαζε μια απαγορευση...Δεν ξερω τωρα τι να κανω να στειλω ενα mail ή οχι? Εσυ τι λες
migf1 Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 Δεν νομίζω πως θα βοηθήσει σε κάτι να του στείλεις email, μιας και φαίνεται να είναι ξεκάθαρο από αυτά που γράφει. ΥΓ. Γιατί δεν διοχετεύεις την ενέργειά σου στο να τις λύσεις μόνος σου; Πόσταρε κι εδώ όταν δυσκολεύεσαι κάπου, ή και σε άλλα φόρουμ.
Star_Light Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 Οχι ρε συ δεν εχω προβλημα με κάποια άλυτη άσκηση.... αλλωστε το γραφει οτι δεν προκειται να κατσει να σε βοηθησει αν δεν εισαι μαθητης του!!!! Καθηγητης πανεπιστημιου ειναι στην Αμερικη χαχα σιγα μην κατσει να λυσει τις δικες μου ασκησεις !!!!! Απλα θα ηθελα να του δειξω ενα σημειο το οποιο δεν λαμβανει υποψιν σε μια ασκηση που παραθετει λυμενη καταλαβες? Αυτο πιστευεις θα εχει νοημα? Βεβαια θα μου πεις ισως οι λυσεις ειναι προχειρες και ενδεικτικες δεν αποτελουν δηλαδη επαγγελματικα προγραμματα ωστε να ειναι 100% συνεπης στην προβλεψη λαθων απο καποια εισοδο. P.S Θα το ανεβασω και εδω βασικα
migf1 Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 ... P.S Θα το ανεβασω και εδω βασικα Είναι καλή ιδέα, για να σιγουρέψεις (σιγουρέψουμε) πως όντως πρόκειται περί σφάλματος. Και μετά του στέλνεις Δες επίσης μήπως έχει Errata το βιβλίο του, και διορθώνει το συγκεκριμένο σφάλμα.
imitheos Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 ο migf1 με καταλαβε, αρα ειναι immutable Ναι για να γράψεις πρέπει να χρησιμοποιήσεις πίνακα όπως έδειξε ο migf1. Τα string literals είναι κανονικοί δείκτες δηλαδή σε όλες τις περιπτώσεις που έχεις ένα string literal, δεσμεύεται κανονικά μνήμη για αυτό και εσύ λαμβάνεις ένα δείκτη στο πρώτο χαρακτήρα. Το πρόβλημα που δεν μπορείς να τα πειράξεις είναι ότι η μνήμη η οποία δεσμεύεται επιλέγεται να βρίσκεται σε περιοχή που δεν μπορείς να γράψεις. Δεν είναι δηλαδή "immutable" αυτά καθεαυτά τα literals απλά ο compiler/linker επιλέγει να τα κάνει έτσι. Παλαιότερα σε DOS δεν γινόταν αυτό και μπορούσες κανονικά να πειράξεις. Και ο GCC ακόμη επέτρεπε μέχρι μία έκδοση να μπορείς να γράψεις σε αυτά αν χρησιμοποιούσες μια ειδική για αυτό παράμετρο. Επειδή όμως αυτό είναι κακή πρακτική και οδηγεί σε προβλήματα αφαιρέθηκε η παράμετρος και πλέον ο κάθε compiler που σέβεται τον εαυτό του δεν επιτρέπει να πειράξεις literals. > char *c = "Hello"; Όταν λοιπόν έχεις την παραπάνω έκφραση, τότε η μεταβλητή c παίρνει ως τιμή την διεύθυνση μνήμης η οποία έχει δεσμευτεί για το literal και έτσι δεν μπορείς να το πειράξεις. Ο τρόπος με τον πίνακα που έδειξε ο migf1 δουλεύει λίγο διαφορετικά. > char c[50] = "Hello"; char d[] = "Hello"; Στις παραπάνω δηλώσεις, και πάλι το literal είναι δείκτης σε μια περιοχή μνήμης. Το γεγονός όμως ότι χρησιμοποιήσαμε αγκύλες λέει στον compiler ότι πάνε στη διεύθυνση του literal και αντέγραψε όλα τα περιεχόμενα στην διεύθυνση της μεταβλητής c. Έτσι είναι ισοδύναμο με το να δηλώναμε απλά "char c[50]" και από κάτω να τρέχαμε μια εντολή αντιγραφής όπως str*cpy, memcpy. Αυτό που έγραψε ο migf1 και έχω παραπάνω ως μεταβλητή d είναι το ίδιο απλά ορίζει πίνακα με μέγεθος όσο ακριβώς χρειάζεται για το literal και είναι συντακτική ευκολία για να μην μετράμε εμείς χαρακτήρες. Στο παραπάνω παράδειγμα δηλαδή, και οι δύο πίνακες περιέχουν αρχικά τη λέξη Hello και μπορούμε να πειράξουμε όποιο χαρακτήρα θέλουμε. Στην c μπορούμε να γράψουμε μέχρι 50 χαρακτήρες ενώ στη d μέχρι 5+1.
Star_Light Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 Είναι καλή ιδέα, για να σιγουρέψεις (σιγουρέψουμε) πως όντως πρόκειται περί σφάλματος. Και μετά του στέλνεις Δες επίσης μήπως έχει Errata το βιβλίο του, και διορθώνει το συγκεκριμένο σφάλμα. Nαι φυσικα και έχει. http://knking.com/books/c2/errata.html και κοιτα τι βρηκε ο αλλος ο αετος ρε φιλε... το αετισιο ματι το ιδιο εδω δες... Page 50. In Programming Project 4, "xxx.xxx.xxx" should be "xxx.xxx.xxxx". (Found by Seth Koehler.) χαχαχα ελεος!!!!! Τελοςπαντων ας τελειωσει ο ημιθεος με τον αλλον και θα τα δουμε μετα...
migf1 Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 Ποστάρισέ το ρε συ να υπάρχει διαθέσιμο. Μπορεί να μην απαντήσουμε αμέσως, αλλά θα απαντήσουμε
Star_Light Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 Λοιπον επανήλθα. Kοιταξε να δεις δεν εστειλα τελικα email επειδη στο Errata ο King δεν ασχολειται με τις ασκησεις παρολαυτα νομιζω πως η υλοποιηση του ειναι λαθος . Στην Σελ. 255 σου ζηταει να γράψεις μια συνάρτηση > void find_two_largest(int a[], int n , int *largest , int *second_largest ) η οποια θα αποθηκευει τον 1ο και τον 2ο μεγαλυτερο αριθμο απο μια δοσμενη ακολουθια.... Η λυση που δινει ειναι αυτη > void find_two_largest(int a[], int n, int *largest, int *second_largest) { int i; if (a[0] > a[1]) { *largest = a[0]; *second_largest = a[1]; } else { *largest = a[1]; *second_largest = a[0]; } for (i = 2; i < n; i++) if (a[i] > *largest) { *second_largest = *largest; *largest = a[i]; } else if (a[i] > *second_largest) *second_largest = a[i]; } Αν δωσεις πχ εισοδο 3 στοιχεια τα 4 5 5 > #include<stdio.h> #include<stdlib.h> void find_two_largest(int [] , int , int * , int * ); int main(void) { int n , i ; puts(" How many elements? "); scanf("%d" , &n); if( n < 0 || n == 0) { puts(" Error > Invalid number of elements... "); exit(EXIT_FAILURE); } int a[n]; printf(" Give elements : "); for(i=0; i<n; i++) scanf("%d" , &a[i]); find_two_largest( a , n , &a[0] , &a[1] ); return 0; } ------------------------------------------------------------------------------ void find_two_largest(int a[], int n, int *largest, int *s_largest) { int i ; if( a[0] > a[1]) { *largest = a[0]; *s_largest = a[1]; } else { *largest = a[1]; *s_largest = a[0]; } for (i = 2; i<n; i++) { if( a[i] == a[i-1]) continue; if (a[i] > *largest) { *s_largest = *largest; *largest = a[i]; } else if (a[i] > *s_largest) *s_largest = a[i]; } printf(" The first biggest element is : %d The second biggest element is : %d " , *largest , *s_largest); return; } -------------------------------------------------------------------------- θα σου πει οτι και ο 1ος και ο 2ος μεγαλυτερος ειναι ο αριθμος 5. Δεν νομιζω να εχω κανει καποιο λαθος στην κληση της συναρτησης απλα αρχικοποιω τους 2 δεικτες με τις διευθυνσεις του 1ου και του 2ου στοιχειου αντιστοιχα. Πηγα να κατσω να το δω αλλα επρεπε να φυγω για καφε και το αφησα για τωρα αν δεν με παρει ο υπνος σε λιγο.... Eιχα φτιαξει εναν δικο μου κωδικα για αυτο με το μειονεκτημα οτι χρησιμοποιουσε 2 loops αντι για 1 οπως κανει ο King και δουλευε ενταξει. Αλλα πρεπει να τον εσβησα κατα λαθος .... δεν θυμαμαι να τον ειχα τεσταρει βεβαια για διπλες εμφανισεις αριθμων μεσα στην ακολουθια. Θα το φτιάξω παντως δεν ειναι δυσκολο.....
imitheos Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 νομιζω πως η υλοποιηση του ειναι λαθος Όχι Αν δωσεις πχ εισοδο 3 στοιχεια τα 4 5 5 > int main(void) { int a[n]; find_two_largest( a , n , &a[0] , &a[1] ); return 0; } ------------------------------------------------------------------------------ void find_two_largest(int a[], int n, int *largest, int *s_largest) { int i ; if( a[0] > a[1]) { } else { *largest = a[1]; *s_largest = a[0]; } printf(" The first biggest element is : %d The second biggest element is : %d " , *largest , *s_largest); return; } -------------------------------------------------------------------------- θα σου πει οτι και ο 1ος και ο 2ος μεγαλυτερος ειναι ο αριθμος 5. Δεν νομιζω να εχω κανει καποιο λαθος στην κληση της συναρτησης απλα αρχικοποιω τους 2 δεικτες με τις διευθυνσεις του 1ου και του 2ου στοιχειου αντιστοιχα. Πηγα να κατσω να το δω αλλα επρεπε να φυγω για καφε και το αφησα για τωρα αν δεν με παρει ο υπνος σε λιγο.... Και όμως έχεις κάνει Στο if της συνάρτησης το 1ο στοιχείο που είναι 4 δεν είναι μεγαλύτερο του 5 οπότε καλείται το κομμάτι του else και τρέχει *largest = a[1] και *s_largest = a[0]. Επειδή όμως την καλείς με παραμέτρους τα ίδια τα στοιχεία έχουμε a[0] = a[1] και a[1] = a[0] δηλαδή το 1ο στοιχείο παίρνει και αυτό την τιμή 5. Στο τέλος τυπώνεις τα δύο πρώτα στοιχεία του πίνακα τα οποία έχουν και τα δύο τιμή 5. Εννοείται πως έπρεπε να χρησιμοποιήσεις δύο μεταβλητές που θα κρατάνε τις εκάστοτε τιμές του μεγαλύτερου και δεύτερου αριθμού.
Star_Light Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 Nαι ρε συ.... αλλα αυτος την εχει γραψει ετσι την συναρτηση :-S εγω πηρα απλα την υλοποιηση του και την καλω απο την main. να δες -> http://knking.com/bo...nswers/c11.html Η πρωτη μου δουλεια ηταν να κανω αυτο που μου δειχνεις..... αλλα γενικα εχει και θεματα αν δωσεις 2 στοιχεια και το ενα ειναι το 2 και το αλλο το 4..... anyway
imitheos Δημοσ. 7 Οκτωβρίου 2012 Δημοσ. 7 Οκτωβρίου 2012 Nαι ρε συ.... αλλα αυτος την εχει γραψει ετσι την συναρτηση :-S να δες -> http://knking.com/books/c2/answers/c11.html Η πρωτη μου δουλεια ηταν να κανω αυτο που μου δειχνεις..... αλλα γενικα εχει και θεματα αν δωσεις 2 στοιχεια και το ενα ειναι το 2 και το αλλο το 4..... anyway Αν περάσεις NULL για πίνακα a δεν θα έχει θέμα ? Το for της συνάρτησης ελέγχει το i-οστό στοιχείο με αρχή i = 2 οπότε προϋποθέτει ότι θα δώσεις πίνακα με τουλάχιστον 3 στοιχεία αλλιώς θα προσπελάσει μνήμη έξω από τον πίνακα. Επίσης προϋποθέτει ότι τα {,s_}largest θα είναι μεταβλητές έξω από τον πίνακα μια και θα γράψει εκεί. Δεν είναι λάθος δηλαδή η συνάρτηση απλά δεν είναι πλήρης. Όντας λύση άσκησης θεωρεί δεδομένα κάποια πράγματα και σου δίνει μόνο τον απαραίτητο κώδικα για να καταλάβεις τη λειτουργία χωρίς να πραγματοποιεί όλους τους απαραίτητους ελέγχους.
Star_Light Δημοσ. 7 Οκτωβρίου 2012 Δημοσ. 7 Οκτωβρίου 2012 (επεξεργασμένο) Nαι με NULL δινει segmentation fault και στους δεικτες. Λοιπον..... σε input 2 , 4 Ο *largest = α[1] , επειδη ο largest δειχνει στο a[0] o *largest = a[1] αλλαζει το a[0] σε 4. O *largest ειναι ενα alias για το a[0] . To προηγουμενο ειναι ισοδυναμο με α[0] = a[1]. Και επειδη και ο *s_largest ειναι ενα alias για το a[1] τοτε το statement *s_largest = a[0] θα δώσει το 4 στο a[1] επειδη ειναι ισοδυναμο με a[1] = a[0] . Οποτε για να αποφυγω αυτη την "κακοτοπια" θα παιξω καπως ετσι : > #include<stdio.h> #include<stdlib.h> void find_two_largest(int [] , int , int * , int * ); int main(void) { int n , i , biggest , s_biggest ; puts(" How many elements? "); scanf("%d" , &n); if( n < 0 || n == 0) { puts(" Error > Invalid number of elements... "); exit(EXIT_FAILURE); } int a[n]; printf(" Give elements : "); for(i=0; i<n; i++) scanf("%d" , &a[i]); find_two_largest( a , n , &biggest , &s_biggest ); printf(" The first biggest element is : %d The second biggest element is : %d" , biggest , s_biggest); return 0; } void find_two_largest(int a[], int n, int *largest, int *s_largest) { int i ; *largest = *s_largest = a[0]; if( a[0] > a[1]) { *largest = a[0]; *s_largest = a[1]; } else { *largest = a[1]; *s_largest = a[0]; } for (i = 2; i<n; i++) { if (a[i] > *largest) { *s_largest = *largest; *largest = a[i]; } else if (a[i] > *s_largest) *s_largest = a[i]; } return; } Και παλι εχει θεμα με εισοδο 5 5 4 αλλα θα το δω αυριο... το 2 4 διορθωθηκε παντως. Επεξ/σία 7 Οκτωβρίου 2012 από Star_Light
Directx Δημοσ. 7 Οκτωβρίου 2012 Δημοσ. 7 Οκτωβρίου 2012 Ενδιαφέρον ζήτημα, εγώ δοκίμασα μια recursive επίλυση. Στην πρώτη φάση η ρουτίνα βρήσκει τον πρώτο μεγαλύτερο αριθμό, στην δεύτερη φάση βρίσκει τον δεύτερο μεγαλύτερο αριθμό που είναι είναι ανώτερος των τιμών του πίνακα a[] και δεν ισούται με το ήδη ευρεθέν largest. Σε περίπτωση που ο πίνακας έχει μόνο ένα στοιχείο τότε επιστρέφει κοινό (s)_largest. > /* Find_two_largest array numbers, xdir. */ #include <stdio.h> #include <stdlib.h> #define N 10 void find_two_largest(int [] , int , int * , int * ); int main(void) { int a[N] = { 16, 15, 0, 11, 9, 1, 1, 5, 10, 5 }, i, biggest, s_biggest; /* Scan array.. */ find_two_largest( a , N , &biggest , &s_biggest ); /* Results .. */ printf("\n The first biggest element is : %d\n The second biggest element is : %d\n\n" , biggest , s_biggest); /* End.. */ puts("Press Enter to exit.."); getchar(); return 0; } void find_two_largest(int a[], int n, int *largest, int *s_largest) { int i; /* array index */ /* Scan for second largest switch (by default off) */ static unsigned char cSLargest = 0; /* When not in "scan for second largest" mode, set *(s)_largest to top of array */ if(!cSLargest) *largest = *s_largest = a[0]; /* When cSLargest := 0 scan for *largest, else for *s_largest */ for(i = 0; i < n; i++) if(!cSLargest) { if(*largest < a[i]) *largest = a[i]; } else { /* Break (s)_largest parity trap (*s_largest == *largest) * Assign s_largest when less than current array value and while * different from current array. */ if(*s_largest == *largest || (*s_largest < a[i] && *largest != a[i])) *s_largest = a[i]; } /* Special case when a[] is a single-element (n == 1), stop here. */ if(n == 1) { *s_largest = *largest; return; } /* When in "scan for second largest" mode, quit. */ if(cSLargest) { cSLargest = 0; return; } /* Enter in "scan for second largest" mode.. */ cSLargest = 1; /* Recurse.. */ find_two_largest(a, n, largest, s_largest); } ΈΞΟΔΟΣ: > The first biggest element is : 16 The second biggest element is : 15 Press Enter to exit.. Σήμ: Πιστεύω ότι μπορεί να γραφτεί πολύ πιο αποδοτικά. Τον κώδικα τον δοκίμασα σε C++ Builder, μπορεί να υπάρχουν bugs ή άλλες αβλεψίες.
Timonkaipumpa Δημοσ. 7 Οκτωβρίου 2012 Δημοσ. 7 Οκτωβρίου 2012 Χωρίς recursion και μόνο με 4 (στο σύνολο) συγκρίσεις, όταν το πλήθος των στοιχείων είναι πάνω από 2. > void scan_for_largest(int theArr[], int theSize, int* larg1, int* larg2) { if ( theArr == (int*) NULL ) { *larg1 = *larg2 = 0; return; } if ( theSize <= 2) { if ( theSize == 1) { *larg1 = theArr[0]; *larg2 = 0; } else { *larg1 = (theArr[0] > theArr[1]?theArr[0]:theArr[1]); *larg2 = (*larg1 == theArr[0]?theArr[1]:theArr[0]); } } else { *larg1 = (theArr[0] > theArr[1]?theArr[0]:theArr[1]); *larg2 = (*larg1 == theArr[0]?theArr[1]:theArr[0]); register unsigned char indx = 2; for (; indx < theSize; indx++) { if (theArr[indx] <= *larg2) { continue; } if (theArr[indx] > *larg1) { *larg2 = *larg1; *larg1 = theArr[indx]; } else { *larg2 = theArr[indx]; } } } }
Προτεινόμενες αναρτήσεις