Jump to content



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


painkiller44

Recommended Posts

Δημοσιεύτηκε

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

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

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

εισάγει,

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

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

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

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

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

Eκτός από το πλήθος θα πρέπει να ζητάει και τους ίδιους τους αριθμούς φαντάζομαι...

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

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

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

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

#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]);
}

}

Για δοκίμασε αυτό.Δεν έχει σχόλια οπότε πρέπει να βρεις εσύ τι κάνει.Επίσης κάπου έχω ένα λάθος που πρέπει επίσης να βρεις

#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

Βρήκες τι κάνει,παίρνει ένα αριθμό από τον χρήστη (μεταβλητή 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));

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

η 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)

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

Archived

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

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

Important Information

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