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

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

Δημοσ.

Οπότε μάλλον εννοεί αυτό που έγραψα πριν.

 

 

Στον κώδικα που έσωσες μπορεί να γίνει αν αλλάξεις την τιμή του n πριν την περάσεις ως όρισμα στην συνάρτηση table().

 

Α manually εννοεις πριν το compile. Και γιατι να γινει αυτο? :P

 

τελοςπαντων. οκ . Απλα το θεωρω τοσο απλο που δεν το σκεφτηκα καν εξαρχης.

 

Γιατι εγω σκεφτομουν κατι παρομοιο σε στυλ οριζεις εξαρχης ενα σταθερο μήκος

 

και αν ο χρήστης δώσει παραπάνω δεν έχει 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 να εκτυπώνεται? πχ το σημειο στίξης στην αντιστροφη της προτασης γιατι προσεξε να δεις δεν μπορω να τον μεταφερω απο την μια συναρτηση στην αλλη επειδη ειναι απλη μεταβλητη και η τιμη της δεν ειναι "ορατη" σε αλλη συναρτηση . :/

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

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

Δημοσ.

...

p.s ΣΤην άσκηση εδω -> http://www.insomnia....c/page__st__250

 

αν θυμάσαι πως θα μπορούσα να βάλω και το c να εκτυπώνεται? πχ το σημειο στίξης στην αντιστροφη της προτασης γιατι προσεξε να δεις δεν μπορω να τον μεταφερω απο την μια συναρτηση στην αλλη επειδη ειναι απλη μεταβλητη και η τιμη της δεν ειναι "ορατη" σε αλλη συναρτηση . :/

Δεν κατάλαβα τίποτα :lol:

Δημοσ.

Δεν κατάλαβα τίποτα :lol:

 

Λεω αν το υλοποιησουμε ετσι με συναρτησεις

το c χάνεται. Το c ειναι η ξεχωριστη μεταβλητη που αποθηκευει

το σημειο στιξης στην προταση ωστε μετα να την αντιστρεψουμε ως προς τις λέξεις.

 

Αυτος ο χαρακτηρας απο την εκφωνηση ελεγε να αποθηκευθει σε ξεχωριστη μεταβλητη.

Το θυμήθηκες ?

Δημοσ.

Οπότε εννοείς αυτό το 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

ωστε να εκτυπώνει και αυτο μολις τελειώσει την αντιστροφη των λέξεων?

Δημοσ.

Υπάρχει τρόπος να περάσω το c στην phrase_rev

ωστε να εκτυπώνει και αυτο μολις τελειώσει την αντιστροφη των λέξεων?

 

Υπάρχουν διάφοροι τρόποι. Π.χ. κράτα το σε μια καθολική μεταβλητή, ή σε μια τοπική της main() που θα στο επιστρέφει η phrase_fill() και θα το περνάς στην phrase_rev() ή διατήρησέ το ως τελευταίο char του string input[] που διαβάζεις στην phrase_fill() και κατόπιν επεξεργάσου το όπως θέλεις μέσα στην phrase_rev().

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

Καλησπέρα σε ολους ειμαι εξοδουχος!!!!

 

ενω καταλαβαίνω τον κώδικα που θα παραθέσω υπάρχει μια συνάρτηση και συγκεκριμενα η 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 :(

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

Λοιπον καλα που δεν μου απαντήσατε γιατι το βρήκα μονος μου και εκανα και ολοκληρη την quicksort συναρτηση trace μαζι με ολες τις αναδρομικες της κλήσεις. Δεν ξερω ποσοι απο σάς θα ήθελαν να γράψω εδω μεσα αυτη την ανάλυση... :P

 

>

//----------------------------------------------

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;

}

//------------------------------------------------

 

Ειναι ο προσαρμοσμενος κωδικας που χρησιμοποιησα για να βλέπω αν τα κάνω καλά. :P

 

Εν παση περιπτωση εκεινο στο οποιο ειχα σκαλωσει ειχε να κανει με το return statement

απο το σαιτ της IBM βρηκα μετα οτι οταν το return statement επιστρεφει τον έλεγχο στον καλούντα αυτης της συνάρτησης , σε αυτον

που την κάλεσε δηλαδη και η συνεχεια ειναι ακριβως απο εκει και μετα. Απλα με την αναδρομικοτητα χάνεται λιγο η μπαλα και εκατσα λιγο να το ξεμπλέξω. Ισως αυτος ειναι ο λογος που το βιβλιο λεει πως ειναι πιο αποδοτικο να βγαλεις το αναδρομικο μεσα απο τον κωδικα υλοποιησης της ταξινομησης. Λεει μεν οτι ειναι πιο κατανοησιμο αλλα προφανως εννοει την λειτουργια και οχι την σειρα με την οποια γινονται οι κλησεις στην αναδρομη γιατι αυτο ειναι λιγο μπλεξιμο.

 

Αν θελει κανεις να το ποσταρω να μου το πει. Μη το βαλω τσαμπα και δεν το διαβασει κανεις δεν εχει νοημα. Παντως ειναι καλο επειδη καταλαβαινεις ακομη καλυτερα τις κλησεις των συναρτησεων και τις διαφορες παραμετρων συναρτησης και μεταβλητων μεσα σε αυτην.

Δημοσ.

Σε γενικές γραμμές οι αναδρομικές υλοποιήσεις είναι μνημοβόρες. Χρησιμοποιούνται κατά κόρον σε προχωρημένες δομές (δέντρα, γράφους, κλπ) αλλά σε resource-critical projects προτιμούνται οι μη-αναδρομικές υλοποιήσεις τους.

 

 

Προσωπικά έχω ένα θέμα με τις αναδρομές... τις μισώ! :lol:

 

Δημοσ.

Σε γενικές γραμμές οι αναδρομικές υλοποιήσεις είναι μνημοβόρες. Χρησιμοποιούνται κατά κόρον σε προχωρημένες δομές (δέντρα, γράφους, κλπ) αλλά σε resource-critical projects προτιμούνται οι μη-αναδρομικές υλοποιήσεις τους.

 

 

Προσωπικά έχω ένα θέμα με τις αναδρομές... τις μισώ! :lol:

 

 

Καλα και εμενα δεν με τρέλαναν :P

 

migf1 να σε ρωτήσω κατι?

 

Αν εγω έχω ας πουμε μια συναρτηση μέσα στην main() και την καλέσω απο κάποιο σημείο της.

Το σημείο αυτο μπαίνει στην στοίβα ωστε μολις η συνάρτηση τελειώσει να ξέρει που θα επιστρέψει?

Αυτο το σημείο ας πούμε πως ταυτοποιείται μέσα στην στοίβα κλήσεων? Σαν διευθυνση?

 

ASSembly-στικα ειναι αυτα που ρωτάω? :P

Δημοσ.

Καλα και εμενα δεν με τρέλαναν :P

 

migf1 να σε ρωτήσω κατι?

 

Αν εγω έχω ας πουμε μια συναρτηση μέσα στην main() και την καλέσω απο κάποιο σημείο της.

Το σημείο αυτο μπαίνει στην στοίβα ωστε μολις η συνάρτηση τελειώσει να ξέρει που θα επιστρέψει?

Αυτο το σημείο ας πούμε πως ταυτοποιείται μέσα στην στοίβα κλήσεων? Σαν διευθυνση?

 

ASSembly-στικα ειναι αυτα που ρωτάω? :P

 

Μπαίνει στο CALL STACK του προγράμματος, για περισσότερα δες εδώ.

Δημοσ.

 

Αν εγω έχω ας πουμε μια συναρτηση μέσα στην main() και την καλέσω απο κάποιο σημείο της.

Το σημείο αυτο μπαίνει στην στοίβα ωστε μολις η συνάρτηση τελειώσει να ξέρει που θα επιστρέψει?

Αυτο το σημείο ας πούμε πως ταυτοποιείται μέσα στην στοίβα κλήσεων? Σαν διευθυνση?

 

 

Ναι, περιπου αυτο συμβαινει. Για καθε προγραμμα υπαρχει ο program counter καταχωρητης ( $pc ) που δειχνει ποια ειναι η επομενη προς εκτελεση εντολη . Προτου ο $pc αλλαξει στην διευθυνση που βρισκεται η συναρτηση σου, αποθηκευεται η επομενη εντολη ( $pc + 4 αν καθε εντολη ειναι 4 bytes ) στην στοιβα και για να επιστρεψει η συναρτηση , παιρνει την διευθυνση μνημης του προγραμματος που λεει η στοιβα και την βαζει στον $pc . Ετσι το προγραμμα συνεχιζει απο το σημειο που εγινε η κληση της συναρτησης

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...