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

πινακες στη C


voulaji

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

Δημοσ.

Γιατί στην πιο κάτω ερώτηση, η σωστή απάντηση είναι η Β και όχι η Α;

 

Έστω ότι ο b[] είναι ένας πίνακας 100 ακεραίων, με όλες τις τιμές του αρχικά ίσες με το 0, και ότι ο a[] είναι ένας πίνακας Ν ακεραίων, καθένας από τους οποίους ανήκει στο διάστημα [0, 99]. Ποιο είναι το αποτέλεσμα της εκτέλεσης του ακόλουθου βρόγχου;

for (j = 0; j < N; j++)

b[a[j]]++;

 

Α. Θέτει την τιμή του b[0] ίση με 0, την τιμή του b[1] ίση με 1, την τιμή του b[2] ίση με 2, κλπ.

Β. Θέτει την τιμή του b[0] ίση με το πλήθος των 0 στον a[],την τιμή του b[1] ίση με το πλήθος των 1 στον a[], την τιμή του b[2] ίση με το πλήθος των 2 στον a[], κλπ.

Δημοσ.

Έστω ότι ισχύει η Α. Έστω επίσης τυχαία τιμή για το N, ίση με 1000 π.χ. Τότε, ο βρόχος θα εκτελεστεί 1000 φορές.

 

Όμως ο τελεστής ++ αυξάνει κατά 1 κάθε φορά την τιμή του τελεστέου και όλα τα στοιχεία του b ξεκινούν από 0, άρα για να ισχύει η Α ο βρόχος θα πρέπει να εκτελεστεί 0 + 1 + 2 + ... + 99 = 4950 φορές. Δηλαδή πρέπει N = 4950 => ΑΤΟΠΟ.

Δημοσ.

1) Η απάντηση δηλαδή δεν έχει να κάνει με το b[a[j]]++; και πώς αυτό αυξάνεται;

2) Γιατί προκύπτει το πλήθος από αυτή τη διαδικασία και όχι οι τιμές;

Δημοσ.
1) Η απάντηση δηλαδή δεν έχει να κάνει με το b[a[j]]++; και πώς αυτό αυξάνεται;

 

Έχεις δίκιο, φυσικά και έχει. Απλά επέλεξα έναν εναλλακτικό τρόπο (εις άτοπον απαγωγή) για να σου δείξω ότι η σωστή απάντηση δε μπορεί να είναι η Α, χωρίς να κοιτάω την τιμή ποιων ακριβώς στοιχείων του b αυξάνει η εντολή του βρόχου.

 

 

2) Γιατί προκύπτει το πλήθος από αυτή τη διαδικασία και όχι οι τιμές;

 

Και πάμε στο ζουμί. Δεν ξέρω πόσο εύκολο είναι να το εξηγήσω εδώ, είναι κάτι που θα έπρεπε να φαίνεται και να το πιάνεις με την πρώτη. Ίσως αν κάνεις ένα παραδειγματάκι στο χαρτί (με μικρότερο εύρος αριθμών εννοείται), να το καταλάβεις πιο εύκολα. Επιστρέφω με ένα μικρό παράδειγμα σε λίγο...

Δημοσ.

Ας αλλάξουμε λίγο τα δεδομένα, για χάρη του παραδείγματος που θα φέρω. Ο πίνακας b έχει 5 θέσεις, ο a 100 θέσεις και τα στοιχεία του a κυμαίνονται σε τιμή από 0 εώς 4.

 

post-4351-12906296829_thumb.jpg

 

Εκτελούμε N = 100 φορές τον βρόχο, δηλαδή την εντολή b[a[j]]++; Τί θα συμβεί;

 

Αποτιμάται αρχικά η έκφραση a[j], δηλαδή a[0]. Τί τιμή έχει το a[0]; 4. Άρα, πρόκειται να προσπελαστεί το στοιχείο b[4] του πίνακα b και να αυξηθεί κατά 1. Στη συνέχεια, το j παίρνει τιμή 1 και η έκφραση a[j] αποτιμάται σε a[1]. Το a[1] έχει τιμή 1, άρα η έκφραση b[a[j]] αποτιμάται σε b[1]. Άρα, αυξάνουμε την τιμή του b[1] κατά 1 κ.ο.κ.

 

 

Αυτό δε σημαίνει πρακτικά: «βρήκαμε ένα 4άρι στον a, άρα ας πάμε να αυξήσουμε κατά ένα την τιμή του 4ου στοιχείου του b. Μετά βρήκαμε έναν άσσο στον a, άρα πάμε να αυξήσουμε κατά ένα την τιμή του b[1] κ.ο.κ.» ; Το ίδιο συμβαίνει για όλα τα στοιχεία του πίνακα a, άρα τελικά στον b υπάρχει σε κάθε κελί i το πλήθος των occurencies (εμφανίσεων) του i στον πίνακα a...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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