wakas Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Καλημέρα!! Έχω μια απορία για τις συναρτήσεις στην C και δε βρήκα κάτι σχετικό ώστε να με βοηθήσει. Θα ήθελα με μία συνάρτηση να επιστρέφω 2 τιμές στο κυρίως πρόγραμμα μου και να τις αποθηκεύω μέσα σ' ένα πίνακα. Πιο συγκεκριμένα είναι οι ρίζες μιας δευτεροβάθμιας εξίσωσης. Αν είναι μία πραγματική ρίζα θέλω να την αποθηκεύω στη θέση i του πίνακα. Αν είναι 2 πραγματικές ρίζες θέλω να τις αποθηκεύω στις θέσεις i και i+1 αντίστοιχα. Κι έτσι να γεμίζει ο πίνακας. Ευχαριστώ προκαταβολικά για τις απαντήσεις σας! Είναι λίγο δυσνόητο αλλά...ελπίζω να το καταλάβετε! Ευχαριστώ!!
V.I.Smirnov Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Tι σχετικό δεν βρήκες δηλαδή ; - τον τύπο για τις ρίζες του τριωνύμου ; - πώς ορίζεις πίνακες ; - πώς επιστρέφεις τιμές από συνάρτηση ; Μόνον σαφής δεν είσαι. Δεν λες τι και πώς θέλεις να το κάνει το πρόγραμμα : - οι συντελεστές του τριωνύμου θα εισάγονται ή θα διαβάζονται από πίνακα ; - θα είναι μιγαδικοί ή μόνον πραγματικοί ; - με τις μιγαδικές ρίζες τι θα γίνεται ; - πώς θα έχεις την αντιστοιχία ανάμεσα στον πίνακα με τις ρίζες των τριωνύμων και τα ίδια τα τριώνυμα ; Εξάλλου οι ρίζες του τριωνύμου είναι πάντα δύο : δύο μιγαδικές ή δύο πραγματικές. Απλώς σε κάποιες περιπτώσεις η ρίζα είναι διπλή. Αν στην περίπτωση αυτή αποθηκεύεις μόνον τη ρίζα πώς θα ξέρεις ότι έχει πολλαπλότητα 2 ; Πρώτα πρέπει να σκεφτείς τι ακριβώς θέλεις να κάνεις και μετά να ξεκινήσεις να γράφεις... -
virxen75 Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 για επιστροφή 2 τιμών από συνάρτηση μπορείς να κάνεις κάτι τέτοιο > #include <stdio.h> struct rizes{ float a; float b; }; struct rizes ypologise(int,int,int); int main(){ struct rizes riza; riza=ypologise(2,3,4); printf("\n riza a=%f , riza b=%f",riza.a,riza.; getchar(); return 0; } struct rizes ypologise(int a,int b,int c){ struct rizes riza; riza.a=9; riza.b=12; return riza; }
wakas Δημοσ. 10 Νοεμβρίου 2010 Μέλος Δημοσ. 10 Νοεμβρίου 2010 Οι ρίζες δεν είναι πάντα 2, μπορεί να είναι και μία. Το πρόβλημα μου δεν είναι η υλοποίηση. Κολλάω στο πώς θα μπορέσω να πάρω έναν πίνακα με μηδενικά στοιχεία και να τον γεμίσω με τις ρίζες που βρίσκω. Αν γίνεται θα ήθελα να μου δώσετε ένα παράδειγμα(το πιο απλό) που παίρνουμε έναν πίνακα από το κύριο πρόγραμμα και τον γεμίζουμε μέσα στη συνάρτηση. Συγγνώμη για την διατύπωση μου!! Ευχαριστώ!!!
V.I.Smirnov Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Οι ρίζες δεν είναι πάντα 2, μπορεί να είναι και μία. Λάθος κάνεις ! Θεμελιώδες θεώρημα της 'Αλγεβρας : κάθε πολυώνυμο N βαθμού στο C έχει ακριβώς Ν ρίζες. Το ξέρουν κι οι γάτες. Η δευτεροβάθμια εξίσωση έχει 2 ρίζες, πραγματικές ή όχι. Αν η διακρίνουσά της είναι 0 έχει πάλι δύο πραγματικές ρίζες που απλώς είναι ίσες (πολλαπλότητα 2). -
Dr.Fuzzy Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Οι ρίζες δεν είναι πάντα 2, μπορεί να είναι και μία.Το πρόβλημα μου δεν είναι η υλοποίηση. Κολλάω στο πώς θα μπορέσω να πάρω έναν πίνακα με μηδενικά στοιχεία και να τον γεμίσω με τις ρίζες που βρίσκω. Αν γίνεται θα ήθελα να μου δώσετε ένα παράδειγμα(το πιο απλό) που παίρνουμε έναν πίνακα από το κύριο πρόγραμμα και τον γεμίζουμε μέσα στη συνάρτηση. Συγγνώμη για την διατύπωση μου!! Ευχαριστώ!!! Οι ρίζες είναι πάντα δυο! Αν Δ>0 έχεις δυο άνισες μεταξύ τους πραγματικές ρίζες. Αν Δ=0 έχεις μία διπλή πραγματική ρίζα (δύο ρίζες ίσες μεταξύ τους δηλαδή). Αν Δ<0 έχεις δύο μιγαδικές ρίζες.
wakas Δημοσ. 10 Νοεμβρίου 2010 Μέλος Δημοσ. 10 Νοεμβρίου 2010 ναι το γνωρίζω αλλά είναι ίδιες οπότε δεν το λαμβάνουμε υπόψη μας!
V.I.Smirnov Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Η δευτεροβάθμια εξίσωση έχει 2 ρίζες, πραγματικές ή όχι. Αν η διακρίνουσά της είναι 0 έχει πάλι δύο πραγματικές ρίζες που απλώς είναι ίσες (πολλαπλότητα 2). Στην περίπτωση αυτή πώς θα ξέρεις ότι η ρίζα είναι διπλή και ότι η επόμενη θέση του πίνακα περιέχει ρίζα άλλου τριωνύμου ; Eίναι καλύτερο να κρατάς όλες τις ρίζες, ακόμα κι' αν είναι διπλές. Έτσι πάντα δύο στοιχεία του πίνακα θα αντιστοιχούν σε ένα τριώνυμο. Και εξάλλου, αν δεν έχει πραγματικές ρίζες πώς θα το δείξεις (τι θα βάλεις στις αντίστοιχες θέσεις του πίνακα); -
wakas Δημοσ. 10 Νοεμβρίου 2010 Μέλος Δημοσ. 10 Νοεμβρίου 2010 Ωραία το θέμα μου όμως είναι το πώς θα βάζω τις ρίζες στον πίνακα ριζών!!
V.I.Smirnov Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Δύο είναι οι τρόποι. 1) Ο πίνακας των ριζών θα είναι επίσης όρισμα της συνάρτησης που κάνει τον υπολογισμό των ριζών. Η συνάρτηση που υπολογίζει τις ρίζες τις θέτει ταυτόχρονα και στον πίνακα. Στην περίπτωση αυτή πρέπει να είναι επίσης όρισμα ο δείκτης με την αύξουσα σειρά του τριωνύμου που λύνεται ώστε οι τρέχουσες ρίζες να τεθούν μετά τις προηγούμενες. 2) Στο κύριο πρόγραμμα καλείς την ρουτίνα που υπολογίζει τις ρίζες (ή τις βρίσκεις εκεί). Μόλις οι ρίζες έχουν υπολογιστεί και είναι γνωστές στο κύριο πρόγραμμα, τίθενται στις τρέχουσες θέσεις του πίνακα. Προφανώς και στις δυο περιπτώσεις θα γίνεται κάποια σάρωση για να επαναλαμβάνεται η διαδικασία για το επιθυμητό πλήθος τριωνύμων. Aυτό που έδωσε ο Virxen είναι η μισή (και παραπάνω) λύση. Πού είναι η δυσκολία ; Στο πώς θα δώσεις τον πίνακα ως όρισμα ; -
lion2486 Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Θα μπορούσες πολύ απλά να περάσεις στις παραμέτρους δύο δείκτες σε μεταβλητές που θα αποθηκεύσεις τις ρίζες... π.χ.: > int euresi_rizwn(int a, int b, int c, int *r1, int *r2){ .... if(d>0){ r1 = malloc(sizeof(int)); r2 = malloc(sizeof(int)); *r1 = riza1; *r2 = riza2; } return 0; } Άλλος τρόπος που σκέφτομαι είναι να έχεις ένα πίνακα με τις ρίζες σου, και τέλος να επιστρέψεις το όνομα του πίνακα ως δείκτη στο πρώτο στοιχείο του. Μία άλλη αλλά όχι προτεινόμενη λύση, είναι η χρήση global μεταβλητών.
wakas Δημοσ. 10 Νοεμβρίου 2010 Μέλος Δημοσ. 10 Νοεμβρίου 2010 Δύο είναι οι τρόποι.1) Ο πίνακας των ριζών θα είναι επίσης όρισμα της συνάρτησης που κάνει τον υπολογισμό των ριζών. Η συνάρτηση που υπολογίζει τις ρίζες τις θέτει ταυτόχρονα και στον πίνακα. Στην περίπτωση αυτή πρέπει να είναι επίσης όρισμα ο δείκτης με την αύξουσα σειρά του τριωνύμου που λύνεται ώστε οι τρέχουσες ρίζες να τεθούν μετά τις προηγούμενες. 2) Στο κύριο πρόγραμμα καλείς την ρουτίνα που υπολογίζει τις ρίζες (ή τις βρίσκεις εκεί). Μόλις οι ρίζες έχουν υπολογιστεί και είναι γνωστές στο κύριο πρόγραμμα, τίθενται στις τρέχουσες θέσεις του πίνακα. Προφανώς και στις δυο περιπτώσεις θα γίνεται κάποια σάρωση για να επαναλαμβάνεται η διαδικασία για το επιθυμητό πλήθος τριωνύμων. Aυτό που έδωσε ο Virxen είναι η μισή (και παραπάνω) λύση. Πού είναι η δυσκολία ; Στο πώς θα δώσεις τον πίνακα ως όρισμα ; - >Δηλαδή κάπως έτσι upol_rizwn(a,b,c,pin_rizwn,i); Και η συνάρτηση είναι float upol_rizwn(int a, int b, int c,float pin_rizwn[],int i) { int d,tupriz,riza1_2,riza1,riza2; d = (b*-(4*a*c); if (d>0){ tupriz=2; riza1=(-b+sqrt(d))/(2*a); riza2=(-b-sqrt(d))/(2*a); pin_rizwn[i]=riza1; pin_rizwn[i++]= riza2 ; i = i +2; } else if (d==0) { tupriz=1; riza1_2=-b/(2*a); pin_rizwn[i]=riza1_2; i++; } return; } ΥΠΑΡΧΕΙ ΛΑΘΟΣ??
V.I.Smirnov Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Aς...πούμε έτσι. Δεν ξέρω αν υπάρχουν συντακτικά λάθη - η φιλοσοφία όμως αυτή είναι. Υπάρχει κάποιο θέμα με το i. Αν το i αναφέρεται στο τρέχον τριώνυμο που υπολογίζεις τις ρίζες του, προφανώς το i θα είναι όσα τα τριώνυμα. Το πρόβλημα έγκειται στο ότι π.χ. για το δεύτερο τριώνυμο το i θα δοθεί στην συνάρτηση ypol_rizvn με τιμή 1 (θεωρώντας ότι η εκκίνηση είναι το 0). Aλλά οι ρίζες του θα πρέπει να τοποθετηθούν στις θέσεις 2,3 του πίνακα pin_rizwn. Δεν θα τεθούν στις σωστές θέσεις. Κράτα σε έναν τοπικό δείκτη (στατική μεταβλητή) την τρέχουσα θέση του πίνακα για να μην έχεις πρόβλημα... -
wakas Δημοσ. 10 Νοεμβρίου 2010 Μέλος Δημοσ. 10 Νοεμβρίου 2010 Ναι έτσι όμως το έκανα και δε μπορεί να γεμίσει τον πίνακα με τα νέα στοιχεία. Τα στοιχεία παραμένουν μηδενικά όπως τα είχα βάλει στην αρχή του προγράμματος.
V.I.Smirnov Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Κάπου στην χρήση του i είναι το πρόβλημα. Έχε κατά νου ότι η τιμή του i πρέπει να μεταβάλλεται στο κύριο πρόγραμμα διότι στην ρουτίνα περνά με τιμή (by value) και ως εκ τούτου η τιμή του ΔΕΝ μπορεί να αλλάξει εκεί. Χρησιμοποίησε μια στατική μεταβλητή στην ρουτίνα για να κρατάς την τρέχουσα θέση πίνακα. Αλλιώς, πρέπει να επιστρέφεις στο κύριο πρόγραμμα το πλήθος των ριζών (2,1,καμία) και να το χρησιμοποιείς για να αυξάνεις εκεί έναν δείκτη k που θα δείχνει την τρέχουσα θέση του πίνακα. Ο δείκτης αυτός k θα είναι ανεξάρτητος από εκείνον που σαρώνει τα πολυώνυμα και θα πρέπει να τον περνάς στην ρουτίνα αντί του i. Ή δείκτη αυτόν, k, μπορείς να του αυξάνεις την τιμή στην ρουτίνα αλλά να τον περνάς by reference ώστε η τιμή του εκεί να μπορεί να αλλάζει. Σκέψου το και θα το δεις μόνος σου... -
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.