Jump to content



Βοηθεια με ασκηση


painkiller44

Recommended Posts

Να γράψετε ένα πρόγραμμα το οποίο

Θα ζητάει από το χρήστη να δώσει από το

πληκτρολόγιο το πλήθος των αριθμών που θέλει να

εισάγει,

Θα αποθηκεύει τους αριθμούς σε έναν πίνακα,

Θα υπολογίζει τον μέσο όρο τους,

Θα εμφανίζει στην οθόνη το περιεχόμενο του πίνακα

και τον μέσο όρο.

πως θα μπορουσα να το υλοποιήσω αυτο σε C ?έχει να κάνει με malloc η απλα θα δώσει ο χρηστης εναν αριθμο και θα παει στο πληθος του πινακα ;

Link to comment
Share on other sites

ναι αλλα αυτο σε δευτερη μοιρα κατι που μπορω να υλοποιησω αυτο που δεν μπορω να καταλαβω ειναι το πως θα γινει δυναμικα ολο αυτο δηλαδη δεν θα ξερω εκ των προτερων οτι ο πινακας πχ ειναι 10 θεσεων αλλα αυτο θα το οριζει ο χρηστης

Link to comment
Share on other sites

πως θα μπορουσα να το υλοποιήσω αυτο σε C ?έχει να κάνει με malloc η απλα θα δώσει ο χρηστης εναν αριθμο και θα παει στο πληθος του πινακα ;

Το πλήθος των αριθμών που θα δώσει ο χρήστης δεν ειναι σταθερό. Θέλεις malloc, ή μπακαλόκ να δηλώσεις δηλαδή τον πίκανα σου με 1000 στοιχεία εξ αρχής...

Link to comment
Share on other sites

ναι ομως το δευτερο που αναφερεις το μπακαλοκ προφανως μπακαλιστικος τροπος δεσμευει εξ αρχης 1000 θεσεις μνημης αν ο χρηστης θελει 1001 ;τοτε δεν βγαινει αυτο που θελω .την malloc δεν ξερω να την λειτουργω καλα .διαβασα το αρθρο ,δεν το καταλαβα πληρως .ομως :/

Link to comment
Share on other sites

#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

#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

Βρήκες τι κάνει,παίρνει ένα αριθμό από τον χρήστη (μεταβλητή stoixeia),φτιάχνει ένα πίνακα ακεραίων (δεσμεύοντας την μνήμη που απαιτείται) με τόσες θέσεις όσες έβαλε ο χρήστης (μεταβλητή pinakas) και μετά τον γεμίζει με τις τιμές απο 0 μέχρι stoixeia - 1 με το πρώτο for και τέλος σου δείχνει όλα τα στοιχεία που περιέχει με το δεύτερο for.

To λάθος δεν είναι συντακτικό το πρόγραμμα κάνει compile και εκτελείται κανονικά.

Hint:Διάβασε καλύτερα τι κάνει η malloc ακριβώς :)

το (int *) τι ακριβώς κάνει ;ψιλοχάος με τους δείκτες .εχετε καμια πηγη ; :o:o:o

Δοκίμασε να εκτελέσεις το πρόγραμμα 2 φορές.

Μια φορά με την παρακάτω εντολή

pinakas = (int *)malloc(stoixeia*sizeof(int));

Και μια φορά με την παρακάτω γραμμή αντι την πάνω

pinakas = malloc(stoixeia*sizeof(int));

Link to comment
Share on other sites

η malloc μας επιτρεπει να ζητησουμε απο τον χωρο της μνημης που υπαρχει διαθεσιμος .τωρα τι θες να πεις δεν καταλαβαινω :/

Ακριβώς άρα δεν πρέπει κάθε φορά αυτό τον χώρο στην μνήμη να τον απελευθερώνουμε?Αυτό ακρίβως λείπει από το πρόγραμμα.Δεσμεύει χώρο με την malloc αλλά δεν τον απελευθερώνει ποτέ με την συνάρτηση free κάτι που πρέπει να γίνεται πάντα.Μπορεί το προγραμματάκι να είναι απλό αρα η έλλειψη της free να μην έχει σοβαρές επιπτώσεις αλλά δοκίμασε να το τρέξεις έτσι:Μετέφερε τον κώδικα από την main σε μια συνάρτηση και κάλεσε αυτή την νέα συνάρτηση με ένα for πχ 50 φορές και δες πόση μνήμη θα καταλάβει το πρόγραμμα στον task manager των windows.Μετά πρόσθεσε στην νέα συνάρτηση στο τέλος μετά το δεύτερο for την εντολή free(pinakas) και εκτέλεσε το πάλι 50 φορές.

Περισσότερες πληροφορίες στα παρακάτω

malloc - C++ Reference

calloc - C++ Reference

realloc - C++ Reference

free - C++ Reference

ΚΑΝΟΝΑΣ:Xρήση των malloc,calloc,realloc ΠΡΕΠΕΙ ΠΑΝΤΑ να συνοδεύεται και από την free.

Όσο για το (int *) πριν την malloc είναι "υποχρεωτική" μετατροπή (explicit cast) μιας και η μεταβλητή πίνακας ορίστηκε σαν int * (δείκτης σε ακέραιο) και η malloc επιστρέφει void * (δείκτη σε void)

Link to comment
Share on other sites

Κάτι ακόμα για την 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

Archived

This topic is now archived and is closed to further replies.

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

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.