painkiller44 Δημοσιεύτηκε Ιανουάριος 14, 2013 #1 Κοινοποίηση Δημοσιεύτηκε Ιανουάριος 14, 2013 Να γράψετε ένα πρόγραμμα το οποίο Θα ζητάει από το χρήστη να δώσει από το πληκτρολόγιο το πλήθος των αριθμών που θέλει να εισάγει, Θα αποθηκεύει τους αριθμούς σε έναν πίνακα, Θα υπολογίζει τον μέσο όρο τους, Θα εμφανίζει στην οθόνη το περιεχόμενο του πίνακα και τον μέσο όρο.πως θα μπορουσα να το υλοποιήσω αυτο σε C ?έχει να κάνει με malloc η απλα θα δώσει ο χρηστης εναν αριθμο και θα παει στο πληθος του πινακα ; Link to comment Share on other sites More sharing options...
dpolal Ιανουάριος 14, 2013 #2 Κοινοποίηση Ιανουάριος 14, 2013 Eκτός από το πλήθος θα πρέπει να ζητάει και τους ίδιους τους αριθμούς φαντάζομαι... Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 14, 2013 Author #3 Κοινοποίηση Ιανουάριος 14, 2013 ναι αλλα αυτο σε δευτερη μοιρα κατι που μπορω να υλοποιησω αυτο που δεν μπορω να καταλαβω ειναι το πως θα γινει δυναμικα ολο αυτο δηλαδη δεν θα ξερω εκ των προτερων οτι ο πινακας πχ ειναι 10 θεσεων αλλα αυτο θα το οριζει ο χρηστης Link to comment Share on other sites More sharing options...
n_dimos Ιανουάριος 14, 2013 #4 Κοινοποίηση Ιανουάριος 14, 2013 Νομίζω σε αυτό εδώ το thread βρίσκεται η καθοδήγηση που χρειάζεσαι. Link to comment Share on other sites More sharing options...
oxide Ιανουάριος 15, 2013 #5 Κοινοποίηση Ιανουάριος 15, 2013 πως θα μπορουσα να το υλοποιήσω αυτο σε C ?έχει να κάνει με malloc η απλα θα δώσει ο χρηστης εναν αριθμο και θα παει στο πληθος του πινακα ;Το πλήθος των αριθμών που θα δώσει ο χρήστης δεν ειναι σταθερό. Θέλεις malloc, ή μπακαλόκ να δηλώσεις δηλαδή τον πίκανα σου με 1000 στοιχεία εξ αρχής... Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 15, 2013 Author #6 Κοινοποίηση Ιανουάριος 15, 2013 ναι ομως το δευτερο που αναφερεις το μπακαλοκ προφανως μπακαλιστικος τροπος δεσμευει εξ αρχης 1000 θεσεις μνημης αν ο χρηστης θελει 1001 ;τοτε δεν βγαινει αυτο που θελω .την malloc δεν ξερω να την λειτουργω καλα .διαβασα το αρθρο ,δεν το καταλαβα πληρως .ομως :/ Link to comment Share on other sites More sharing options...
nucleus Ιανουάριος 15, 2013 #7 Κοινοποίηση Ιανουάριος 15, 2013 #include <stdlib.h>#include <stdio.h>int main(){ int stoixeia; printf("Input a number:"); scanf("%i",&stoixeia); printf("Eisodos xrhsth:%i\n",stoixeia); int *pinakas; pinakas = (int *)malloc(stoixeia*sizeof(int)); int i,j; for(i=0;i<stoixeia;i++) { pinakas[i] = i; } for(j=0;j<stoixeia;j++) { printf("%i\n",pinakas[j]); }}Για δοκίμασε αυτό.Δεν έχει σχόλια οπότε πρέπει να βρεις εσύ τι κάνει.Επίσης κάπου έχω ένα λάθος που πρέπει επίσης να βρεις Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 15, 2013 Author #8 Κοινοποίηση Ιανουάριος 15, 2013 #include <stdlib.h>#include <stdio.h>int main(){ int stoixeia; printf("Input a number:"); scanf("%i",&stoixeia); printf("Eisodos xrhsth:%i\n",stoixeia); int *pinakas; pinakas = (int *)malloc(stoixeia*sizeof(int)); int i,j; for(i=0;i<stoixeia;i++) { pinakas[i] = i; } for(j=0;j<stoixeia;j++) { printf("%i\n",pinakas[j]); }}Για δοκίμασε αυτό.Δεν έχει σχόλια οπότε πρέπει να βρεις εσύ τι κάνει.Επίσης κάπου έχω ένα λάθος που πρέπει επίσης να βρειςαυτο που αντιλαμβανομαι ειναι οτι βαζεις τον χρηστη να εισαγει εναν αριθμο φτιαχνεις εναν πινακα με τοσα στοιχεια οσα ο αριθμος που εβαλε ο χρηστης .το λαθος μηπως ειναι το %i Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 15, 2013 Author #9 Κοινοποίηση Ιανουάριος 15, 2013 το (int *) τι ακριβώς κάνει ;ψιλοχάος με τους δείκτες .εχετε καμια πηγη ; :o:o Link to comment Share on other sites More sharing options...
nucleus Ιανουάριος 15, 2013 #10 Κοινοποίηση Ιανουάριος 15, 2013 Βρήκες τι κάνει,παίρνει ένα αριθμό από τον χρήστη (μεταβλητή stoixeia),φτιάχνει ένα πίνακα ακεραίων (δεσμεύοντας την μνήμη που απαιτείται) με τόσες θέσεις όσες έβαλε ο χρήστης (μεταβλητή pinakas) και μετά τον γεμίζει με τις τιμές απο 0 μέχρι stoixeia - 1 με το πρώτο for και τέλος σου δείχνει όλα τα στοιχεία που περιέχει με το δεύτερο for. To λάθος δεν είναι συντακτικό το πρόγραμμα κάνει compile και εκτελείται κανονικά. Hint:Διάβασε καλύτερα τι κάνει η malloc ακριβώς το (int *) τι ακριβώς κάνει ;ψιλοχάος με τους δείκτες .εχετε καμια πηγη ; :o:o Δοκίμασε να εκτελέσεις το πρόγραμμα 2 φορές. Μια φορά με την παρακάτω εντολή pinakas = (int *)malloc(stoixeia*sizeof(int)); Και μια φορά με την παρακάτω γραμμή αντι την πάνω pinakas = malloc(stoixeia*sizeof(int)); Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 15, 2013 Author #11 Κοινοποίηση Ιανουάριος 15, 2013 η malloc μας επιτρεπει να ζητησουμε απο τον χωρο της μνημης που υπαρχει διαθεσιμος .τωρα τι θες να πεις δεν καταλαβαινω :/ Link to comment Share on other sites More sharing options...
nucleus Ιανουάριος 15, 2013 #12 Κοινοποίηση Ιανουάριος 15, 2013 η malloc μας επιτρεπει να ζητησουμε απο τον χωρο της μνημης που υπαρχει διαθεσιμος .τωρα τι θες να πεις δεν καταλαβαινω :/Ακριβώς άρα δεν πρέπει κάθε φορά αυτό τον χώρο στην μνήμη να τον απελευθερώνουμε?Αυτό ακρίβως λείπει από το πρόγραμμα.Δεσμεύει χώρο με την malloc αλλά δεν τον απελευθερώνει ποτέ με την συνάρτηση free κάτι που πρέπει να γίνεται πάντα.Μπορεί το προγραμματάκι να είναι απλό αρα η έλλειψη της free να μην έχει σοβαρές επιπτώσεις αλλά δοκίμασε να το τρέξεις έτσι:Μετέφερε τον κώδικα από την main σε μια συνάρτηση και κάλεσε αυτή την νέα συνάρτηση με ένα for πχ 50 φορές και δες πόση μνήμη θα καταλάβει το πρόγραμμα στον task manager των windows.Μετά πρόσθεσε στην νέα συνάρτηση στο τέλος μετά το δεύτερο for την εντολή free(pinakas) και εκτέλεσε το πάλι 50 φορές.Περισσότερες πληροφορίες στα παρακάτωmalloc - C++ Referencecalloc - C++ Referencerealloc - C++ Referencefree - C++ ReferenceΚΑΝΟΝΑΣ:Xρήση των malloc,calloc,realloc ΠΡΕΠΕΙ ΠΑΝΤΑ να συνοδεύεται και από την free.Όσο για το (int *) πριν την malloc είναι "υποχρεωτική" μετατροπή (explicit cast) μιας και η μεταβλητή πίνακας ορίστηκε σαν int * (δείκτης σε ακέραιο) και η malloc επιστρέφει void * (δείκτη σε void) Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 15, 2013 Author #13 Κοινοποίηση Ιανουάριος 15, 2013 Ευχαριστω πολυ παιδια . Link to comment Share on other sites More sharing options...
Inglor Ιανουάριος 21, 2013 #14 Κοινοποίηση Ιανουάριος 21, 2013 Κάτι ακόμα για την malloc (memory allocation): Σύμφωνα με το API η malloc επριστρέφει θέση μνήμης αφού κάνει τη δέσμευση της μνήμης. Η επιστροφή αυτή είναι τύπου void *, δηλαδή unknown type pointer.int *pinakas;pinakas = (int *)malloc(stoixeia*sizeof(int));Ο παραπάνω κώδικας δηλώνει μία μεταβλητή pinakas δείκτης σε integer. Όταν επιστρέφει η malloc πρέπει να την κάνουμε cast σε τέτοιο τύπο για να μπορούμε να την καταχωρήσουμε στην μεταβήτή pinakas.Άρα με την παραπάνω εντολή:stoixeia*sizeof(int) : είναι το μήκος του πίνακα σε bytes που θα δεσμέυσει(int *) : η μετατροπή που κάνουμε από void *(unknown type pointer) σε int *(δείκτη σε integet).Ελπίζω να μην σε μπέρδεψα περισσότερο. :nada: Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.