NeV Δημοσ. 11 Σεπτεμβρίου 2017 Δημοσ. 11 Σεπτεμβρίου 2017 Καλησπερα,Θα ηθελα καποιος να με βοηθησει με τις απαντησεις, και αν γινεται, να μου εξηγησει πως προκυπτουν.* https://prnt.sc/gjphqy * http://prntscr.com/gjpiat Ευχαριστω,
albNik Δημοσ. 11 Σεπτεμβρίου 2017 Δημοσ. 11 Σεπτεμβρίου 2017 θέμα 2 rand() είναι μεταξυ [0, RAND_MAX] rand()/RAND_MAX είναι μεταξυ [0, 1] 10*rand()/RAND_MAX είναι μεταξυ [0, 10] x=10*rand()/RAND_MAX-5 είναι μεταξυ [-5, 5] 1
NeV Δημοσ. 11 Σεπτεμβρίου 2017 Μέλος Δημοσ. 11 Σεπτεμβρίου 2017 Σε ποια σχολή είσαι φίλε? Σερρες, Μηχανικων Π.
newnick Δημοσ. 11 Σεπτεμβρίου 2017 Δημοσ. 11 Σεπτεμβρίου 2017 (επεξεργασμένο) Λοιπόν για το ένα αφού βάζει p1=&a και p2=&b ουσιαστικά έχει δύο pointer p1,p2 που "δείχνουν" στις a και b αντίστοιχα. Δηλαδή είτε πεις a είτε *p1 είναι το ίδιο Η συνάρτηση είναι πονηρή. Παίρνει δύο παραμέτρους βάζει σαν τιμή στην μία το άθροισμα των τιμών τις αλλά επιστρέφει ξανά το άθροισμα τους (στην return). Επομένως έστω ότι η f έχει σαν παραμέτρους x,y στην ουσία επιστρέφει x+2y τέλος η main καλεί την f με δύο παραμέτρους το b (αφού b και *p2 είναι το ίδιο) και το αποτέλεσμα το αποθηκεύει στο b επομένως f(20,20) και b = 60 αρα το πρώτο print 10,60 ομοίως την δευτερη φορά καλεί την f με δύο φορές το a και το αποθηκεύει στο a Αρα το δεύτερο print 30,60 αυτά αν δεν κάνω λάθος !! ΚΑΝΩ ΛΑΘΟΣ ΣΩΣΤΗ Η ΛΥΣΗ ΤΟΥ ΑΣΠΡΟΓΑΤΟΥ !!! Επεξ/σία 12 Σεπτεμβρίου 2017 από newnick
White_Cat Δημοσ. 12 Σεπτεμβρίου 2017 Δημοσ. 12 Σεπτεμβρίου 2017 Καλημέρα !Θ' ασχοληθώ με την πρώτη άσκηση γιατί δεν έχω πάρα πολύ χρόνο. Όλ' αυτά τα γράφω σ' ένα μικρό διάλειμμα απ' τη δουλειά.Κατ' αρχήν πρέπει να μάθεις τους συμβολισμούς της C. Όταν λέμε int p1, αυτό σε απλά Ελληνικά πάει να πει ότι η μεταβλητή p1 κρατάει μέσα της έναν ακέραιο. Άμα όμως λέμε int *p1, αυτό πάει να πει ότι η μεταβλητή p1 κρατάει μέσα της μια διεύθυνση μνήμης στην οποία έχει αποθηκευτεί ο ακέραιος.Όταν δηλαδή λέμε int *ταδε, τότε το "τάδε" δεν είναι η ίδια η ακέραια τιμή, αλλά μια διεύθυνση μέσα στη RAM, όπου αποθηκεύτηκε αυτή η τιμή.Επίσης έστω ότι έχει γίνει στην αρχή του προγράμματος η δήλωση int a=10, b=20. Ως συνέπεια αυτής της δήλωσης, έχουμε ότι οι a,b είναι ακέραιοι (προσοχή, δεν είναι δείκτες) και έχουν ως αρχικές τιμές το 10 και το 20 αντιστοίχως.Επιπλέον αν έχουμε δηλώσει μια ακέραια μεταβλητή (έστω int a) ό συμβολισμός &a πάει να πει ότι δεν αναφερόμαστε στην ίδια την τιμή του a, αλλά στη διεύθυνση μνήμης στην οποία αποθηκεύτηκε το a.Άρα λοιπόν οι γραμμές p1=&a και p2=&b σημαίνουν ότι οι μεταβλητές p1,p2 είναι δείκτες οι οποίοι αρχικοποιούνται ώστε να δείχνουν στις θέσεις μνήμης όπου αποθηκεύονται οι τιμές των a,b αντιστοίχως.Κατόπιν καλείται η συνάρτηση myfun η οποία απ' ό,τι βλέπω, είναι γραμμένη έτσι ώστε να μοιάζει με γόρδιο δεσμό.Στην πρώτη κλήση της myfun οι παράμετροι είναι ο δείκτης p2 και ο δείκτης στο b. Επειδή παραπάνω έχουμε ορίσει ότι p2=&b, όταν καλείται για πρώτη φορά η myfun είναι σαν να δέχεται ως παραμέτρους τον σωσία του b (δείκτης p2) καθώς κι ένα δείκτη στο b. Δηλαδή δύο φορές τη διεύθυνση μνήμης η οποία κρατάει την τιμή του b.Πάμε να δούμε τώρα τι κάνει η myfun. Αυξάνει την τιμή της μεταβλητής στην οποία δείχνει ο πρώτος δείκτης, προσθέτοντάς της την τιμή της μεταβλητής όπου δείχνει ο δεύτερος. Έπειτα επιστρέφει μια τιμή που ισούται με το άθροισμα των τιμών των μεταβλητών στις οποίες δείχνουν τα δυο της ορίσματα.Άρα λοιπόν επειδή ουσιαστικά έχει δεχτεί ως ορίσματα το b και τον εαυτό του, κάνοντας αυτές τις πράξεις είναι σαν να διπλασιάζει το b δυο φορές. Δηλαδή το b διπλασιάζεται μία φορά με την πρώτη εντολή της myfun και μετά ξαναδιπλασιάζεται μέσω της εντολής return.Έτσι λοιπόν κατ' αρχήν το πρόγραμμα θα τυπώσει σε μία γραμμή τους αριθμούς 10 (χωρίς μεταβολή η αρχική τιμή του άλφα) καθώς και 80 (το τετραπλάσιο της αρχικής τιμής του βήτα).Στη δεύτερη κλήση της myfun οι παράμετροι είναι πάλι ο a κι ο σωσίας του a, δηλαδή ο δείκτης p1. H συνάρτηση προσθέτει τον a στο σωσία του (άρα το διπλασιάζει) και μετά εξισώνει το b με το άθροισμα των τιμών που τηρούνται στις θέσεις p1 και p2. Το άθροισμα *p1+*p2 ισούται με 20+20=40.Άρα οι αριθμοί που θα τυπωθούν τελικά είναι οι εξής :Στην πρώτη γραμμή το 10 και το 80 κι από κάτω το 20 και το 40.Ελπίζω να βοήθησα λίγο,Δυστυχώς δεν έχω χρόνο ν' ασχοληθώ με την άλλη άσκηση γιατί τώρα είμαι στη δουλειά.Μ' ένα εγκάρδιο νιαούρισμα,Ο Άσπρος Γάτος Υ.Γ : Είμαι σίγουρος ότι τα αποτελέσματα είναι σωστά γιατί το προγραμματάκι το έτρεξα. Να 'μαι και πάλι ! Πήγα ν' ασχοληθώ και με τις άλλες ασκήσεις, αλλά εδώ που τα λέμε δεν είναι καν καλά σκαναρισμένες. Δηλαδή ας πούμε για τη 2η είναι προφανές ότι δεν έχει σκαναριστεί ούτε καν ολόκληρος ο κώδικας. Για να διευκολυνόμαστε κι εμείς λιγο περισσότερο, είναι σκόπιμο να πληκτρολογείς ολόκληρο τον κώδικα της κάθε άσκησης, παρά να τον σκανάρεις. Ο Άσπρος Γάτος 6
newnick Δημοσ. 12 Σεπτεμβρίου 2017 Δημοσ. 12 Σεπτεμβρίου 2017 Έχει δίκιο ο ασπρόγατος!!! στην συνάρτηση αφού περνάει μέσω αναφοράς την b δύο φορές (με p2 και & τότε όταν κάνει *p1 = *p1 + *p2 τότε στην ουσία αλλάζει το b (από 20 σε 40) επομένως στην return που στέλνει *p1 + *p1 πάλι στέλνει δύο φορές το άθροισμα του (καινούργιου άρα επιστρέφει 80 επομένως πρώτη φορά 10,80 δεύτερη φορά 20,40
White_Cat Δημοσ. 19 Σεπτεμβρίου 2017 Δημοσ. 19 Σεπτεμβρίου 2017 Καλημέρα σε όλους ! Σας ευχαριστώ για την ανταπόκριση και για τα likes... Κοίτα να δεις που αν και είμαι ένας συνηθισμένος άσπρος γάτος μπορώ να γράφω και κάποια ενδιαφέροντα μηνύματα... Πού να ήμουν κι άνθρωπος!!! Να είστε όλοι καλά! 2
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα