Star_Light Δημοσ. 27 Μαΐου 2012 Δημοσ. 27 Μαΐου 2012 Οπότε μάλλον εννοεί αυτό που έγραψα πριν. Στον κώδικα που έσωσες μπορεί να γίνει αν αλλάξεις την τιμή του n πριν την περάσεις ως όρισμα στην συνάρτηση table(). Α manually εννοεις πριν το compile. Και γιατι να γινει αυτο? τελοςπαντων. οκ . Απλα το θεωρω τοσο απλο που δεν το σκεφτηκα καν εξαρχης. Γιατι εγω σκεφτομουν κατι παρομοιο σε στυλ οριζεις εξαρχης ενα σταθερο μήκος και αν ο χρήστης δώσει παραπάνω δεν έχει error checking η συνάρτηση αρα θα εχουμε προβλημα. Kαι επειδη δεν μπορουσα να σκεφτω πως θα γινει αυτο στην περιπτωση με VLA για αυτο. p.s ΣΤην άσκηση εδω -> http://www.insomnia.gr/topic/437533-%CE%B5%CF%81%CF%89%CF%84%CE%AE%CF%83%CE%B5%CE%B9%CF%82-%CE%B3%CE%B9%CE%B1-c/page__st__250 αν θυμάσαι πως θα μπορούσα να βάλω και το c να εκτυπώνεται? πχ το σημειο στίξης στην αντιστροφη της προτασης γιατι προσεξε να δεις δεν μπορω να τον μεταφερω απο την μια συναρτηση στην αλλη επειδη ειναι απλη μεταβλητη και η τιμη της δεν ειναι "ορατη" σε αλλη συναρτηση . :/
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 ... p.s ΣΤην άσκηση εδω -> http://www.insomnia....c/page__st__250 αν θυμάσαι πως θα μπορούσα να βάλω και το c να εκτυπώνεται? πχ το σημειο στίξης στην αντιστροφη της προτασης γιατι προσεξε να δεις δεν μπορω να τον μεταφερω απο την μια συναρτηση στην αλλη επειδη ειναι απλη μεταβλητη και η τιμη της δεν ειναι "ορατη" σε αλλη συναρτηση . :/ Δεν κατάλαβα τίποτα
Star_Light Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Δεν κατάλαβα τίποτα Λεω αν το υλοποιησουμε ετσι με συναρτησεις το c χάνεται. Το c ειναι η ξεχωριστη μεταβλητη που αποθηκευει το σημειο στιξης στην προταση ωστε μετα να την αντιστρεψουμε ως προς τις λέξεις. Αυτος ο χαρακτηρας απο την εκφωνηση ελεγε να αποθηκευθει σε ξεχωριστη μεταβλητη. Το θυμήθηκες ?
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Το θυμήθηκες ? Όχι, γιατί μάλλον δίνεις λάθος λινκ (δεν δείχνει σε κάποια άσκηση)..
Star_Light Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Όχι, γιατί μάλλον δίνεις λάθος λινκ (δεν δείχνει σε κάποια άσκηση).. Προτελευταιο ποστ μου. http://www.insomnia.gr/topic/437533-%CE%B5%CF%81%CF%89%CF%84%CE%AE%CF%83%CE%B5%CE%B9%CF%82-%CE%B3%CE%B9%CE%B1-c/page__st__250
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Προτελευταιο ποστ μου. http://www.insomnia....c/page__st__250 Οπότε εννοείς αυτό το link: http://www.insomnia.gr/topic/437533-%ce%b5%cf%81%cf%89%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82-%ce%b3%ce%b9%ce%b1-c/page__view__findpost__p__4726673 Καλά μέχρι εδώ. Ποιο είναι το πρόβλημα για το οποίο ζητάς βοήθεια;
Star_Light Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Οπότε εννοείς αυτό το link: http://www.insomnia.gr/topic/437533-%ce%b5%cf%81%cf%89%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82-%ce%b3%ce%b9%ce%b1-c/page__view__findpost__p__4726673 Καλά μέχρι εδώ. Ποιο είναι το πρόβλημα για το οποίο ζητάς βοήθεια; Υπάρχει τρόπος να περάσω το c που αρχικοποιείται απο την phrase_fill στην phrase_rev ωστε να εκτυπώνει και αυτο μολις τελειώσει την αντιστροφη των λέξεων?
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Υπάρχει τρόπος να περάσω το c στην phrase_rev ωστε να εκτυπώνει και αυτο μολις τελειώσει την αντιστροφη των λέξεων? Υπάρχουν διάφοροι τρόποι. Π.χ. κράτα το σε μια καθολική μεταβλητή, ή σε μια τοπική της main() που θα στο επιστρέφει η phrase_fill() και θα το περνάς στην phrase_rev() ή διατήρησέ το ως τελευταίο char του string input[] που διαβάζεις στην phrase_fill() και κατόπιν επεξεργάσου το όπως θέλεις μέσα στην phrase_rev().
Star_Light Δημοσ. 4 Ιουνίου 2012 Δημοσ. 4 Ιουνίου 2012 (επεξεργασμένο) Καλησπέρα σε ολους ειμαι εξοδουχος!!!! ενω καταλαβαίνω τον κώδικα που θα παραθέσω υπάρχει μια συνάρτηση και συγκεκριμενα η quicksort που με εχει προβληματισει λιγο. > //--------------------------------------------- #include <stdio.h> #define N 8 void quicksort(int a[] , int low , int high); int split(int a[] , int low , int high); int main( void ) { int a[N] , i; printf(" Enter %d numbers to be sorted: " , N); for(i=0; i<N; i++) scanf("%d" , &a[i]); quicksort(a , 0 , N-1); printf(" In sorted order: "); for(i=0; i<N; i++) printf("%3d" , a[i]); printf("\n"); return 0; } //-------------------------------------------- void quicksort(int a[] , int low , int high) { int middle; if(low >= high) return; printf("%d , %d" , low , high); middle=split( a , low , high); printf("\nAfter split "); quicksort(a , low , middle-1); printf("\nAfter quicksort 1 "); quicksort(a , middle+1 , high); printf("\nAfter quicksort 2 "); } //-------------------------------------------- int split( int a[] , int low , int high) { int part_element = a[low]; for(; { while(low < high && part_element <= a[high]) high--; if(low >= high) break; a[low++]=a[high]; while(low < high && a[low] <= part_element) low++; if(low >= high) break; a[high--]=a[low]; } a[high]=part_element; return high; } //------------------------------------------- Προσπαθησα να παρακολουθήσω την ροη του κωδικα βαζοντας καποιες printf μεσα και κανοντας τον trace αλλα εχω κολλησει σε καποια σημεια. Η συναρτηση split ξερω πως δουλευει. Το #define το ορισα σε 8 επειδη δουλευω αυτο εδω το παραδειγμα http://www.youtube.com/watch?v=Z5nSXTnD1I4 Καταρχην με τον συγκεκριμενο θα ειχα τελειωσει απο χθες αλλα με προβληματισε το ποτε κάνει return η quicksort δηλαδη γιατι βάζουμε αυτο εδω -> > if ( low >=high ) στην αρχη της quicksort μεσα στη συναρτηση. Λογικα αυτο γινεται για να σταματησει καποια στιγμη η συναρτηση τη δουλεια της και να μην έχουμε ατερμονα βροχο. Επισης και το if( low >= high ) μεσα στην split δεν μπορω να καταλαβω που αν δωσει TRUE θα γινει break αλλα εχω την εντυπωση πως θα το καταλαβω αν καταφερω να δω πως γινεται η ροη των συναρτησεων και της αναδρομης μεσα στην quicksort. Δοκιμασα με τις printf αλλα δεν εβγαλα ακρη πιο συγκεκριμενα : Αρχικα η λιστα αταξινομητη οπως δειχνει και το βιντεο ειναι αυτη -> 4 8 1 6 3 7 2 5 καλειται η quicksort απο την main με quicksort(a,0,7) θα εκτυπωσει 0 , 7 (οπως του εχω βαλει ο ιδιος) μετα καλει την split με split(a , 0 , 7) στο τελος οταν η split θα εχει τελειωσει θα ειναι 2 3 1 4 6 7 8. Εκτυπωνεται μετα το after split και καλει quicksort(a,0,2) εκτυπωνει 0,2 κτλπ και αρα καλει την split(a,0,2) αρα παιρνει το 2 3 1 κανει δουλεια επιστρεφει το middle ( θέση δεικτη high = 1 ) εκτυπωνει after split και καλει την quicksort (a , 0 , 0 ) και αφου 0 = 0 ρε παιδια οταν ξαναμπει η συναρτηση δεν επιστρεφει? (return) εμενα το output μου βγαζει οτι συνεχιζει και εκτυπωνει το after quicksort 1 . ΤΙ συμβαινει??????? p.s Τις τιμες low , high που βαζω να εκτυπωνει καθε φορα ειναι για καλυτερη διευκολυνση και για να ειμαι σιγουρος οτι καταλαβαινω και κανω σωστα το tracing στο χαρτι. Plz help Επεξ/σία 4 Ιουνίου 2012 από Star_Light
Star_Light Δημοσ. 4 Ιουνίου 2012 Δημοσ. 4 Ιουνίου 2012 Λοιπον καλα που δεν μου απαντήσατε γιατι το βρήκα μονος μου και εκανα και ολοκληρη την quicksort συναρτηση trace μαζι με ολες τις αναδρομικες της κλήσεις. Δεν ξερω ποσοι απο σάς θα ήθελαν να γράψω εδω μεσα αυτη την ανάλυση... > //---------------------------------------------- void quicksort(int a[] , int low , int high) { int middle; if(low >= high) return; printf(" Call of split (%d , %d)\n" , low , high); middle=split( a , low , high); printf(" Call of quicksort (%d , %d) \n " , low , middle-1 ); quicksort(a , low , middle-1); printf(" Call of quicksort (%d , %d) \n " , middle+1 , high); quicksort(a , middle+1 , high); return; } //------------------------------------------------ Ειναι ο προσαρμοσμενος κωδικας που χρησιμοποιησα για να βλέπω αν τα κάνω καλά. Εν παση περιπτωση εκεινο στο οποιο ειχα σκαλωσει ειχε να κανει με το return statement απο το σαιτ της IBM βρηκα μετα οτι οταν το return statement επιστρεφει τον έλεγχο στον καλούντα αυτης της συνάρτησης , σε αυτον που την κάλεσε δηλαδη και η συνεχεια ειναι ακριβως απο εκει και μετα. Απλα με την αναδρομικοτητα χάνεται λιγο η μπαλα και εκατσα λιγο να το ξεμπλέξω. Ισως αυτος ειναι ο λογος που το βιβλιο λεει πως ειναι πιο αποδοτικο να βγαλεις το αναδρομικο μεσα απο τον κωδικα υλοποιησης της ταξινομησης. Λεει μεν οτι ειναι πιο κατανοησιμο αλλα προφανως εννοει την λειτουργια και οχι την σειρα με την οποια γινονται οι κλησεις στην αναδρομη γιατι αυτο ειναι λιγο μπλεξιμο. Αν θελει κανεις να το ποσταρω να μου το πει. Μη το βαλω τσαμπα και δεν το διαβασει κανεις δεν εχει νοημα. Παντως ειναι καλο επειδη καταλαβαινεις ακομη καλυτερα τις κλησεις των συναρτησεων και τις διαφορες παραμετρων συναρτησης και μεταβλητων μεσα σε αυτην.
migf1 Δημοσ. 4 Ιουνίου 2012 Δημοσ. 4 Ιουνίου 2012 Σε γενικές γραμμές οι αναδρομικές υλοποιήσεις είναι μνημοβόρες. Χρησιμοποιούνται κατά κόρον σε προχωρημένες δομές (δέντρα, γράφους, κλπ) αλλά σε resource-critical projects προτιμούνται οι μη-αναδρομικές υλοποιήσεις τους. Προσωπικά έχω ένα θέμα με τις αναδρομές... τις μισώ!
Star_Light Δημοσ. 4 Ιουνίου 2012 Δημοσ. 4 Ιουνίου 2012 Σε γενικές γραμμές οι αναδρομικές υλοποιήσεις είναι μνημοβόρες. Χρησιμοποιούνται κατά κόρον σε προχωρημένες δομές (δέντρα, γράφους, κλπ) αλλά σε resource-critical projects προτιμούνται οι μη-αναδρομικές υλοποιήσεις τους. Προσωπικά έχω ένα θέμα με τις αναδρομές... τις μισώ! Καλα και εμενα δεν με τρέλαναν migf1 να σε ρωτήσω κατι? Αν εγω έχω ας πουμε μια συναρτηση μέσα στην main() και την καλέσω απο κάποιο σημείο της. Το σημείο αυτο μπαίνει στην στοίβα ωστε μολις η συνάρτηση τελειώσει να ξέρει που θα επιστρέψει? Αυτο το σημείο ας πούμε πως ταυτοποιείται μέσα στην στοίβα κλήσεων? Σαν διευθυνση? ASSembly-στικα ειναι αυτα που ρωτάω?
migf1 Δημοσ. 4 Ιουνίου 2012 Δημοσ. 4 Ιουνίου 2012 Δες π.χ. εδώ: http://en.wikipedia.org/wiki/Call_stack
Directx Δημοσ. 4 Ιουνίου 2012 Δημοσ. 4 Ιουνίου 2012 Καλα και εμενα δεν με τρέλαναν migf1 να σε ρωτήσω κατι? Αν εγω έχω ας πουμε μια συναρτηση μέσα στην main() και την καλέσω απο κάποιο σημείο της. Το σημείο αυτο μπαίνει στην στοίβα ωστε μολις η συνάρτηση τελειώσει να ξέρει που θα επιστρέψει? Αυτο το σημείο ας πούμε πως ταυτοποιείται μέσα στην στοίβα κλήσεων? Σαν διευθυνση? ASSembly-στικα ειναι αυτα που ρωτάω? Μπαίνει στο CALL STACK του προγράμματος, για περισσότερα δες εδώ.
ChRis6 Δημοσ. 4 Ιουνίου 2012 Δημοσ. 4 Ιουνίου 2012 Αν εγω έχω ας πουμε μια συναρτηση μέσα στην main() και την καλέσω απο κάποιο σημείο της. Το σημείο αυτο μπαίνει στην στοίβα ωστε μολις η συνάρτηση τελειώσει να ξέρει που θα επιστρέψει? Αυτο το σημείο ας πούμε πως ταυτοποιείται μέσα στην στοίβα κλήσεων? Σαν διευθυνση? Ναι, περιπου αυτο συμβαινει. Για καθε προγραμμα υπαρχει ο program counter καταχωρητης ( $pc ) που δειχνει ποια ειναι η επομενη προς εκτελεση εντολη . Προτου ο $pc αλλαξει στην διευθυνση που βρισκεται η συναρτηση σου, αποθηκευεται η επομενη εντολη ( $pc + 4 αν καθε εντολη ειναι 4 bytes ) στην στοιβα και για να επιστρεψει η συναρτηση , παιρνει την διευθυνση μνημης του προγραμματος που λεει η στοιβα και την βαζει στον $pc . Ετσι το προγραμμα συνεχιζει απο το σημειο που εγινε η κληση της συναρτησης
Προτεινόμενες αναρτήσεις