Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

for (i=0; i<50; i++) {

if (P>0)

thetikoi=P;

}

 

Εχω ενα προβλημα..Οταν τρεχω το προγραμμα σε περιπτωση που το P ειναι αρνητικο μου βαζει σκουπιδια στον πινακα thetiokoi....Πως γινεται να το διωρθωσω?

 

Ο πινακας P εχει τιμες και ειναι 50 θεσεων και οι δυο..

Δημοσ.

Περίπου γίνεται αυτό που λέει ο albNik (όχι ακριβώς γιατί αν οι πίνακες είναι από class type δεν περιέχουν βέβαια σκουπίδια).

 

Η πολύ σημαντική ερώτηση όμως που παραμένει αναπάντητη είναι: εσύ τι περίμενες να γίνεται; (και σε δεύτερη φάση: γιατί το περίμενες αυτό?)

Δημοσ.

γινεται με καποιον τροπο να αφησω κανε μερικα κελια ενος πινακα?

 

*κενα

 

Ναι. Άν εξαρχης αρχικοποιήσεις ολα τα στοιχεια του πίνακα σου με 0 και

στην συνέχεια γεμίσεις επιλεκτικά μονο κάποια.

Δημοσ.

γινεται με καποιον τροπο να αφησω κανε μερικα κελια ενος πινακα?

 

Φυσικά και δεν γίνεται. Είναι σα να λες "γίνεται μια μεταβλητή να μην έχει τιμή;"

 

Κατ' αναλογία με την αρκετά πετυχημένη παρομοίωση "η μεταβλητή είναι σαν ένα ποτήρι" -- το ποτήρι δεν μπορεί ποτέ να είναι "τελείως άδειο". Μπορεί να μην ξέρεις τι έχει μέσα, ή να μη σ' ενδιαφέρει, ή μπορεί να έχει μέσα αέρα, αλλά πάντα κάτι θα υπάρχει.

 

Αν θέλεις να προσποιηθείς ότι μια μεταβλητή δεν έχει τιμή, τότε δύο είναι οι λύσεις:

  1. Χρειάζεσαι μια άλλη μεταβλητή (1 bit αρκεί) στην οποία θα σημειώνεις αν η πρώτη έχει τιμή (με την έννοια που το αντιλαμβάνεσαι εσύ) ή όχι, ή
  2. Αν υπάρχει κάποια τιμή την οποία δεν πρόκειται να χρησιμοποιήσεις ποτέ "στ' αλήθεια", τότε μπορείς να τη χρησιμοποιήσεις για να συμβολίσεις την "απουσία τιμής" (όπως το μηδέν που συζητάμε)

Δημοσ.

Εάν είναι 50 θέσεων και έχει σημασία και το 0 αλλά και όλοι οι αριθμοί, τότε μπορείς αντί για 1 x 50 πίνακα να έχεις 2 x 50 και στην 2η γραμμή να κρατάς μία ένδειξη εάν είναι γεμάτο το κελί ή όχι.

 

Οπότε, αρχικοποιείς κανονικά τον 2 x 50 πίνακα σε τιμή '0' και στις 2 γραμμές και χρησιμοποιείς για την εκχώρηση τιμών μόνο την 1τη γραμμή.

 

Όποτε βάλεις τιμή στην 1τη γραμμή βάζεις απλά ένα '1' στο αντίστοιχο κελί στην 2η.

 

Έτσι, εάν ένα "κελί" έχει '0' στην 2η γραμμή είναι "άδειο".

Δημοσ.

Με την ευκαιρία να αναφερθώ και πάλι στις "ερωτήσεις που δεν διατυπώθηκαν".

 

Έστω ότι αυτό που ρωτάς γίνεται. Ο πίνακας int i[10] έχει υποθετικά το πρώτο κελί "κενό". Τι θα έπρεπε τότε να γίνει όταν γράψεις

 

>int x = i[0] + 1;

Δημοσ.

Ακόμα καλύτερα, θα μπορούσες να έχεις έναν πίνακα 1 x 50 με τύπο int*. Δηλαδή,

 

>
int* a[50];

 

Όπου, εάν έχεις βάλει τιμή τότε το κελί δείχνει στην τιμή αυτή αλλιώς είναι NULL. Σε μνήμη το ίδιο θα σου πιάσει (με μία γρήγορη σκέψη, edit, με μία 2η νομίζω θα πιάσει λιγότερο).

Δημοσ.

Ακόμα καλύτερα, θα μπορούσες να έχεις έναν πίνακα 1 x 50 με τύπο int*. Δηλαδή,

 

Ας μη μπερδεύουμε το τι θέλουμε να καταφέρουμε με το μηχανισμό που χρησιμοποιούμε για να το καταφέρουμε. Αν ο πίνακας θέλεις στη ζωή να έχει μέσα ints, το να τον κάνεις να έχει int* γι' αυτό και μόνο το λόγο είναι κακή ιδέα. Σκέψου μόνο πόσο περιπλέκεται η διαχείριση μνήμης και timon. :lol:

 

Γενικά στη C++ πίνακας από bare pointers = asking for trouble. Πρέπει να έχεις συγκεκριμένο και ικανό λόγο για να κάνεις κάτι τέτοιο, και σχεδόν πάντα δεν υπάρχει τέτοιος λόγος (βέβαια το πώς και γιατί αυτού του ισχυρισμού ξεφεύγει πολύ από το επίπεδο της παρούσας ερώτησης).

Δημοσ.

:D

 

Μαζί σου... αλλά απλά για 50 ints δεν νομίζω να έχει πρόβλημα... συν ότι έχει έναν άμεσο τρόπο να ελέγξει εάν είναι γεμάτο ή όχι.

 

Μία function θα φτιάξει για να εισάγει και μία για να σβήνει κελιά και είναι ready!

Δημοσ.

Στην συντριπτική πλειοψηφια των περιπτώσεων υπάρχει πάντα μια τιμή που δεν την χρειάζεσαι, όπως είναι η 0 στο δικό σου παράδειγμα.

 

Στην αρκετά σπάνια περίπτωση που χρειάζεσαι όλες τις τιμές ενός int, είναι πολύ συχνά θεμιτό να "θυσιάσεις" μια από αυτές (συνήθως μια εκ των INT_MAX, INT_MIN που ορίζονται στο climits) χρησιμοποιώντας την ως "κενό" και να το αναφέρεις στην τεκμηρίωση του προγράμματός σου.

 

Κατόπιν κάνεις ότι σου είπε ο Starlight.

Δημοσ.

Καταλαβαίνω αλλά μου φαίνεται ότι έτσι μαθαίνει ο άλλος να κάνει λάθος πράγματα οπότε I wouldn't be caught dead να προτείνω κάτι τέτοιο. Θα προτιμούσα χίλιες φορές τη λύση με δεύτερο "παράλληλο" πίνακα στην προκειμένη.

 

Κατά τα άλλα εδώ χρειάζεται ένας πίνακας από std::pair<bool, int>. C++ διάολε. Έχει βαρεθεί η ψυχή μου να βλέπω "C με cout".

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...