DoukiMan Δημοσ. 4 Ιουνίου 2013 Μέλος Δημοσ. 4 Ιουνίου 2013 Δεν μπορεις να βρεις το μήκος του πίνακα μεσα απο την συναρτησηΑ. Γιαυτο συνήθως οι συναρτήσεις που δέχονται πίνακες έχουν και μια παραμετρο για το μήκος. Μια λύση στου πίνακες char[] είναι ο τελευταίος χαρακτηρας του να ειναι το '\0' σαν σημάδι τέλους. Σε int[] μπορεις να βάλεις το -1στο τέλος εαν δεν πρόκειται να έχει κάποιο κανονικό του στοιχείο τιμή -1 ποτέ. αν υποθεσω οτι ειναι του στυλ A[5]={1,2,3,4,5}
albNik Δημοσ. 4 Ιουνίου 2013 Δημοσ. 4 Ιουνίου 2013 Οχι δίοτι ο πίνακας γινεται pointer κατα το πέρασμα στη συναρτηση. Μετα το sizeof(A) θα σου φέρει ποσα bytes einai o pointer 4 για 32-βιτ και 8 για 64-βιτ.
bird Δημοσ. 4 Ιουνίου 2013 Δημοσ. 4 Ιουνίου 2013 αν υποθεσω οτι ειναι του στυλ A[5]={1,2,3,4,5}[/size] Αν υποθέσεις το παραπάνω, η συνάρτησή σου θα παίρνει σαν όρισμα έναν δείκτη σε ακέραιο(Α) κι έναν ακέραιο(5) και θα την καλείς αντίστοιχα από την main. Το αν επιστρέφει κάτι η όχι εξαρτάται από τη συνάρτηση... void ή int* function(int* A, int N) { // κώδικας } int main(){ ... int A[5]={1,2,3,4,5}; ... function(A,5); ... } edit: Για να είμαστε ακριβείς, φυσικά και γίνεται να μη γνωρίζεις τον συνολικό αριθμό των στοιχείων και να φτιάξεις τον πίνακα μέσα στη συνάρτηση, όμως δε νομίζω ότι αυτό είναι ζητούμενο της συγκεκριμένης άσκησης...
DoukiMan Δημοσ. 6 Ιουνίου 2013 Μέλος Δημοσ. 6 Ιουνίου 2013 λοιπον παιδια δινουμε εμεις το μεγεθος του πινακα στην main. μετα καλουμε την συναστηση isodos στην οποια διαβαζουμε τα στοιχεια του πινακα.οι τιμες ειναι ακεραιες και τυχαιες αλλα πρεπει να παιρνει και αρνητικες τυχαιες ακεραιες τιμες. και μετα καλουμε την συναρτηση emfanisi οπου εμφανιζει τα στοιχεια του πινακα στην main στην συνεχεια καλουμε αλλη συναρτηση οπου βρισκει και επιστρεφει το πληθος των θετικων και το πληθος των αρνητικων στην main μετα,καλουμε αλλη συναρτηση οπου βρικει τα τετραγωνα των αριθμων του πρωτου πινακα και τελος με την ιδια συναρτηση emfanisi εμφανιζουμε τον 1ο πινακα υψωμενο στο τετραγωνο
bird Δημοσ. 6 Ιουνίου 2013 Δημοσ. 6 Ιουνίου 2013 void eisodod(){ } void emfanisi(){ } void plihos(){ } void tetragwno(){ } int main() { // Ορισμός μεταβλητών (θα ορίσεις και δύο δείκτες για τους πίνακες) // Ζητάς από το χρήστη το μέγεθος του πίνακα // Δεσμεύεις τον πίνακα που χρειάζεσαι eisodos(πίνακας, μεγεθος); emfanisi(πίνακας, μέγεθος); plithos(πίνακας, μέγεθος, &πλήθος_θετικών, &πλήθος_αρνητικών); // εκτυπώνεις τα πλήθη tetragwno(πίνακας, μέγεθος); emfanisi(πίνακας, μέγεθος); // Αποδεσμεύεις τη μνήμη που είχες δεσμεύσει } Δοκίμασε να υλοποιήσεις τον παραπάνω ψευτοκώδικα μαζί με τις συναρτήσεις αφού διαβάσεις πρώτα για δείκτες, δέσμευση μνήμης και ότι απορία έχεις εδώ είμαστε... Αν δεν έχετε δει ακόμα πως να δεμεύετε δυναμικά μνήμη (malloc/calloc) τότε όρισε αρχικά τους πίνακες με ένα σχετικά μεγάλο μέγεθος που πιστεύεις θα σε καλύπτει...
DoukiMan Δημοσ. 6 Ιουνίου 2013 Μέλος Δημοσ. 6 Ιουνίου 2013 void eisodod(){ } void emfanisi(){ } void plihos(){ } void tetragwno(){ } int main() { // Ορισμός μεταβλητών (θα ορίσεις και δύο δείκτες για τους πίνακες) // Ζητάς από το χρήστη το μέγεθος του πίνακα // Δεσμεύεις τον πίνακα που χρειάζεσαι eisodos(πίνακας, μεγεθος); emfanisi(πίνακας, μέγεθος); plithos(πίνακας, μέγεθος, &πλήθος_θετικών, &πλήθος_αρνητικών); // εκτυπώνεις τα πλήθη tetragwno(πίνακας, μέγεθος); emfanisi(πίνακας, μέγεθος); // Αποδεσμεύεις τη μνήμη που είχες δεσμεύσει } Δοκίμασε να υλοποιήσεις τον παραπάνω ψευτοκώδικα μαζί με τις συναρτήσεις αφού διαβάσεις πρώτα για δείκτες, δέσμευση μνήμης και ότι απορία έχεις εδώ είμαστε... Αν δεν έχετε δει ακόμα πως να δεμεύετε δυναμικά μνήμη (malloc/calloc) τότε όρισε αρχικά τους πίνακες με ένα σχετικά μεγάλο μέγεθος που πιστεύεις θα σε καλύπτει... τα στοιχεια του πινακα τοποθετουνται τυχαια srand.ξερεις πως μπορω να το φτιαζω ετσι ωστε να μπορει να βαζει και τυχαιους αρνητικους αριθμους?
imitheos Δημοσ. 6 Ιουνίου 2013 Δημοσ. 6 Ιουνίου 2013 τα στοιχεια του πινακα τοποθετουνται τυχαια srand.ξερεις πως μπορω να το φτιαζω ετσι ωστε να μπορει να βαζει και τυχαιους αρνητικους αριθμους? Δεν γίνεται όλα μασημένα. Σκέψου και λίγο. Αν έχεις αριθμούς στο εύρος πχ 0 - 10 δεν μπορείς να τους φέρεις στο εύρος -5 - 5 ?
bird Δημοσ. 6 Ιουνίου 2013 Δημοσ. 6 Ιουνίου 2013 Εξαρτάται σε ποιο έυρος θέλεις να είναι οι αριθμοί. Η rand() (όχι η srand) δίνει αριθμούς στο διάστημα [0,RAND_MAX] Όποτε όπως με πρόλαβε κι ο imitheos, σκέψου πως θα το κάνεις να σου δίνει και αρνητικούς...
DoukiMan Δημοσ. 6 Ιουνίου 2013 Μέλος Δημοσ. 6 Ιουνίου 2013 Δεν γίνεται όλα μασημένα. Σκέψου και λίγο. Αν έχεις αριθμούς στο εύρος πχ 0 - 10 δεν μπορείς να τους φέρεις στο εύρος -5 - 5 ? εκανα μια σκεψη οι ακεραιοι περνουν τιμες απο -32.768 ως 32.767 αν γραψω rand()%65536-32768 %(high-low)+(low+1) δεν θα βγαινει σωστο?
bird Δημοσ. 6 Ιουνίου 2013 Δημοσ. 6 Ιουνίου 2013 εκανα μια σκεψη οι ακεραιοι περνουν τιμες απο -32.768 ως 32.767 αν γραψω rand()%65536-32768 %(high-low)+(low+1) δεν θα βγαινει σωστο? Το modulo (%) δίνει πάντα θετικό αποτέλεσμα οπότε πρώτα πρέπει να φέρεις τον τυχαίο αριθμό στο διάστημα που θέλεις (το θετικό) και μετά να αφαιρέσεις... Όπως και να έχει όμως, καλό είναι να τα δοκιμάζεις αυτά στον κώδικα να δεις αν σου δουλεύουν... Περισσότερα θα μάθεις έτσι από το να παίρνεις έτοιμη την απάντηση...
DoukiMan Δημοσ. 6 Ιουνίου 2013 Μέλος Δημοσ. 6 Ιουνίου 2013 #include <stdio.h> #include <stdlib.h> void pinisodos(int A[],int n); void pinemfa(int A[]); int main(int argc, char *argv[]) { int n,A[n]; printf("Dwse to plithos twn stoixeiwn tou pinaka"); scanf("%d",n); pinisodos(A,n); pinemfa(A[i]); system("PAUSE"); return 0; } void pinisodos(A[n],n); int i; srand(time(0)); for (i=0;i<n;i++) { A[i]=(rand()%101)-(rand()%101) //ipothetoume oti theloume arithmous apo to 100 ws to -100.to rand()%101 vriskei arithmous metaxi 0...100.ara vazontas dio rand() tha paragontai kai thetikoi kai arnhtikoi arithmoi return A[i]; } void pinemfa(int A[i],int n); for (i=0;i<n;i++) { printf("%d",A[i]); } παιδια το εφτασα μεχρι εδω αλλα κανω λαθη στις συναρτησεις(δεν τις εχω πολυκαταλαβει)
bird Δημοσ. 6 Ιουνίου 2013 Δημοσ. 6 Ιουνίου 2013 Δοκίμασε να κάνεις compile και να καταλάβεις τα λάθη που σου λέει ο compiler. Έχεις και πιο βασικά λάθη εκτός από τις συναρτήσεις... - Δες τον ορισμό του πίνακα (πόση μνήμη θα δεσμεύσει έτσι που τον όριζεις). - Διαβάζεις σωστά το n με την scanf; - Δες την δήλωση και τον ορισμό των συναρτήσεων. Έχουν τα ίδια ορίσματα; - Μία void συνάρτηση δεν επιστρέφει κάποια τιμή, οπότε γιατί έχεις return; - Ο κώδικας κάθε συνάρτησης πρέπει να είναι μέσα σε { } κ.τ.λ. ...
imitheos Δημοσ. 6 Ιουνίου 2013 Δημοσ. 6 Ιουνίου 2013 Από ποιο βιβλίο διαβάζεις ? Όπως με πολύ ωραίο τρόπο σου επισήμανε ο bird έχεις θεμελιώδη λάθη τα οποία δεν συνάδουν με κάποιον στο επίπεδο των πινάκων και των συναρτήσεων αλλά θα περιμέναμε να κάνει κάποιος που βρίσκεται στο 1ο-2ο κεφάλαιο του βιβλίου. Το αναφέρω σαν διαπίστωση χωρίς να θέλω να σου την πω ή να σε αποπάρω.
Star_Light Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 Δοκίμασε να κάνεις compile και να καταλάβεις τα λάθη που σου λέει ο compiler. Έχεις και πιο βασικά λάθη εκτός από τις συναρτήσεις... - Δες τον ορισμό του πίνακα (πόση μνήμη θα δεσμεύσει έτσι που τον όριζεις). - Διαβάζεις σωστά το n με την scanf; - Δες την δήλωση και τον ορισμό των συναρτήσεων. Έχουν τα ίδια ορίσματα; - Μία void συνάρτηση δεν επιστρέφει κάποια τιμή, οπότε γιατί έχεις return; - Ο κώδικας κάθε συνάρτησης πρέπει να είναι μέσα σε { } κ.τ.λ. ... Το return δεν ειναι απαραιτητα λαθος σε μια τυπου void συναρτηση απλα ειναι προαιρετικο. Η συναρτηση εννοειται πως θα ολοκληρωσει την δουλεια της και θα επιστρεψει και χωρις αυτο αλλα εγω σε καποιους κωδικες το εβαζα δεν ξερω κατα ποσο ειναι ασχημο η παραπλανητικο.... DoukiMan Η scanf διαβάζει έναν αριθμο που της δινεις εσυ στο παράδειγμα σου και θα τον βάλει στην θέση μνήμης που δειχνει το δευτερο ορισμα της.... αυτο που ειναι μετα το κομμα. Τα ορισματα σε μια συναρτηση χωρίζονται με κόμματα. Ο τελεστής & δινει την διεύθυνση μιας μεταβλητής.... οποτε θές &n και οχι σκέτο n στην scanf. Οπως πολυ σωστα σου επισημαινει ο bird ο κωδικας μιας συνάρτησης μπαινει μέσα σε { ... } διοτι καθε συνάρτηση έχει ενα εκτελέσιμο μέρος που ονομάζεται σώμα. Αυτο ακριβως το σώμα μπαινει αναμεσα σε αγκύλες και υλοποιει αυτο για το οποιο έχει δημιουργηθει η συναρτηση... το ερωτηματικο μπαινει μοναχα οταν δηλώνουμε την συνάρτηση στην αρχη του αρχειου μας και οχι την στιγμη του ορισμού της εσυ το βαζεις κατα την στιγμή του ορισμου της. Ένας πινακας περνάει μέσα στην συνάρτηση σαν ένας δείκτης στο πρώτο στοιχειο του επομένως για τον ορισμο μονάχα οι κατασκευές (αυτη την λεξη την ειδα στο βιβλιο του K&R και μ αρεσε ) void ( int a[] ) και void (int *a) ειναι ισοδυναμες. Προσαρμοσε το και στις κεφαλιδες των δικων σου συναρτήσεων (κεφαλιδες ειναι οι πρωτες γραμμες στους ορισμους των συναρτήσεων).
bird Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 Το return δεν ειναι απαραιτητα λαθος σε μια τυπου void συναρτηση απλα ειναι προαιρετικο. Η συναρτηση εννοειται πως θα ολοκληρωσει την δουλεια της και θα επιστρεψει και χωρις αυτο αλλα εγω σε καποιους κωδικες το εβαζα δεν ξερω κατα ποσο ειναι ασχημο η παραπλανητικο.... Το σκέτο return σε μια void συνάρτηση, φυσικά και δεν είναι λάθος, και προσώπικά το χρησιμοποιώ πάντα. Το να επιστρέφεις όμως int απο μία void συνάρτηση,είναι λάθοςκαι θα σε σταματήσεις και ο compiler... 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα