[Powered by Google Translate] [Εβδομάδα 4]
[David J. Malan] [Πανεπιστήμιο του Χάρβαρντ]
[Αυτό είναι CS50.] [CS50.TV]
>> Εντάξει, αυτό είναι CS50, και αυτή είναι η αρχή της εβδομάδας 4,
και αυτό είναι μία από τις πιθανές βραδύτερα αλγόριθμοι ταξινόμησης.
Ποιο από τα δύο ήταν το ότι μόλις παρακολουθήσαμε εκεί;
Αυτό ήταν το bubble sort, για μεγάλες O (n ^ 2) + άθροισμα,
και πράγματι δεν είμαστε οι μόνοι σε αυτόν τον κόσμο να φαίνεται να γνωρίζουν
Τι είδους είναι φούσκα ή χρόνο λειτουργίας του.
Πράγματι, αυτό ήταν μια συνέντευξη με τον Eric Schmidt της Google
και πρώην γερουσιαστής Μπαράκ Ομπάμα μόλις πριν από λίγα χρόνια.
>> Τώρα, γερουσιαστής, είστε εδώ στη Google,
και μου αρέσει να σκέφτομαι την προεδρία ως μια συνέντευξη για δουλειά.
Τώρα, είναι δύσκολο να πάρει μια δουλειά ως πρόεδρος, και περνάτε τα ρίγη τώρα.
Είναι επίσης δύσκολο να βρουν μια θέση εργασίας στο Google.
Έχουμε ερωτήσεις, και θα ζητήσει από τους υποψήφιους ερωτήσεις μας,
και αυτό είναι από Larry Schwimmer.
Εσείς νομίζετε ότι αστειεύομαι; Είναι ακριβώς εδώ.
Ποιος είναι ο πιο αποτελεσματικός τρόπος για να ταξινομήσετε ένα εκατομμύριο 32-bit ακέραιοι;
[Γέλια]
Καλά-
Λυπάμαι. >> Όχι, όχι, όχι, όχι.
Νομίζω ότι το είδος φούσκα θα είναι ο λάθος τρόπος για να προχωρήσουμε.
>> Έλα, ο οποίος του είπε αυτό;
Την περασμένη εβδομάδα ανάκληση πήραμε ένα διάλειμμα από τον κώδικα, τουλάχιστον για μια ημέρα,
και ξεκίνησε την εστίαση σε ορισμένες υψηλότερο επίπεδο ιδεών και επίλυση προβλημάτων γενικότερα
στο πλαίσιο της αναζήτηση και την ταξινόμηση,
και παρουσιάσαμε κάτι που δεν ράπισμα αυτό το όνομα για την περασμένη εβδομάδα,
αλλά ασυμπτωτική σημειογραφία, ο Big O, το Big Omega,
και μερικές φορές το μεγάλο συμβολισμό Θήτα, και αυτά ήταν απλά τρόπους
περιγραφής του χρόνου λειτουργίας των αλγορίθμων,
πόσο χρόνο χρειάζεται για έναν αλγόριθμο για να τρέξει.
>> Και ίσως θυμάστε ότι σας μίλησε για το χρόνο λειτουργίας όσον αφορά το μέγεθος
της εισόδου, το οποίο ονομάζουμε γενικά n, ανεξάρτητα από το πρόβλημα μπορεί να είναι,
όπου n είναι ο αριθμός των ατόμων στο δωμάτιο,
ο αριθμός των σελίδων σε ένα τηλεφωνικό κατάλογο, και αρχίσαμε να γράφουμε τα πράγματα
όπως O (n ^ 2) ή O (n) ή O (n log n),
και ακόμη και όταν τα μαθηματικά δεν εργάζονται αρκετά έξω τόσο τέλεια
και ήταν n ² - n / 2 ή κάτι τέτοιο
θα αντί απλώς να ρίξει μακριά μερικά από τα χαμηλότερα όρους ώστε,
και το κίνητρο είναι ότι θέλουμε πραγματικά ένα
είδος αντικειμενικό τρόπο αξιολόγησης
η απόδοση των προγραμμάτων ή η απόδοση των αλγορίθμων
ότι στο τέλος της ημέρας δεν έχει τίποτα να κάνει, για παράδειγμα,
με την ταχύτητα του υπολογιστή σας σήμερα.
>> Για παράδειγμα, εάν έχετε εφαρμόσει bubble sort,
ή να εφαρμόσετε ταξινόμηση με συγχώνευση ή την επιλογή του είδους στον υπολογιστή του σήμερα,
ένα 2 GHz υπολογιστή, και να το τρέξει,
και αυτό παίρνει κάποιο αριθμό δευτερολέπτων, το επόμενο έτος, υπάρχει ένα 3 GHz
ή 4 ​​GHz υπολογιστή, και στη συνέχεια μπορεί να ισχυρίζονται ότι "Πω πω, μου αλγόριθμος
τώρα είναι δύο φορές πιο γρήγορα », όταν στην πραγματικότητα αυτό δεν είναι προφανώς η περίπτωση.
Είναι ακριβώς το υλικό έχει πάρει πιο γρήγορα, αλλά ο υπολογιστής σας
δεν έχει, και έτσι θέλουμε πραγματικά να ρίξει μακριά τα πράγματα όπως
πολλαπλάσια του 2 ή πολλαπλάσια του 3 όταν πρόκειται για την περιγραφή
πόσο γρήγορα ή πόσο αργή είναι ένας αλγόριθμος και πραγματικά επικεντρώνεται μόνο
για ν ή κάποιο παράγοντα αυτού,
κάποια δύναμη αυτού όπως στην περίπτωση των ειδών από την προηγούμενη εβδομάδα.
Και υπενθυμίζουν ότι με τη βοήθεια του είδους συγχώνευση
ήμασταν σε θέση να το κάνουν πολύ καλύτερα από ό, τι είδος φούσκα και το είδος επιλογής
και ακόμη είδος εισαγωγής.
>> Πήραμε κάτω στο n log n, και πάλι,
Υπενθυμίζω ότι log n γενικά αναφέρεται σε κάτι που μεγαλώνει
πιο αργά και στη συνέχεια n, έτσι ώστε n log n μέχρι στιγμής ήταν καλή
επειδή ήταν λιγότερο από ² n.
Αλλά για να επιτευχθεί n log n με το είδος συγχώνευσης
ποια ήταν η βασική φύτρο του μια ιδέα που είχαμε για τη μόχλευση
ότι πρέπει επίσης μόχλευση πίσω στην εβδομάδα 0;
Πώς θα αντιμετωπίσουμε το πρόβλημα ταξινόμησης έξυπνα με το είδος συγχώνευσης;
Ποια ήταν η βασική γνώση, ίσως;
Οποιοσδήποτε καθόλου.
Εντάξει, ας κάνουμε ένα βήμα πίσω.
Περιγράψτε το είδος συγχώνευσης με δικά σας λόγια.
Πώς λειτουργεί;
Εντάξει, θα αρμενίζει πίσω στο 0 εβδομάδα.
Εντάξει, ναι.
[Δεν ακούγεται-φοιτητής]
Εντάξει, καλά, έτσι ώστε να διαιρεθεί η σειρά των αριθμών σε 2 κομμάτια.
Εμείς ταξινομημένο καθένα από αυτά τα κομμάτια, και στη συνέχεια θα τους συγχωνεύονται,
και έχουμε δει αυτή την ιδέα πριν από τη λήψη ένα πρόβλημα που είναι αυτό το μεγάλο
και τον τεμαχισμό επάνω σε ένα πρόβλημα που είναι αυτό το μεγάλο ή το μεγάλο.
>> Θυμηθείτε το παράδειγμα του τηλεφωνικού καταλόγου.
Θυμηθείτε την αυτο-καταμέτρηση αλγόριθμο από εβδομάδες πριν,
έτσι συγχώνευση είδος συνοψίστηκε από αυτό το ψευδοκώδικα εδώ.
Όταν σας δίνεται n στοιχεία, το πρώτο ήταν λογική ελέγχου.
Εάν n <2 τότε δεν κάνουμε τίποτα καθόλου
διότι αν n <2 τότε το η είναι προφανώς 0 ή 1,
και έτσι αν είναι είτε 0 ή 1 δεν υπάρχει τίποτα για να ταξινομήσετε.
Τελειώσατε.
Η λίστα σας είναι ήδη ταξινομημένο επιπόλαια.
Αλλά κατά τα άλλα, αν έχετε 2 ή περισσότερα στοιχεία να προχωρήσει και να τους χωρίζουν
σε 2 ίσα μέρη, αριστερά και δεξιά.
Ταξινόμηση καθένα από αυτά τα μισά, και στη συνέχεια να συγχωνεύσει τα μισά ταξινομημένο.
Αλλά το πρόβλημα εδώ είναι ότι με την πρώτη ματιά αυτό αισθάνεται σαν να είμαστε στοίχημα.
Αυτό είναι ένα κυκλικό ορισμό ότι αν σας έχω ζητήσει να ταξινομήσετε τα n στοιχεία
και μου λες "Εντάξει, εντάξει, θα ταξινομήσετε τα στοιχεία n / 2 και τα n / 2"
τότε η επόμενη ερώτησή μου θα είναι "Καλά, πώς μπορείτε να ταξινομήσετε το n / 2 στοιχεία;"
>> Όμως, λόγω της δομής του εν λόγω προγράμματος,
επειδή υπάρχει αυτή η βασική περίπτωση, να το πω έτσι,
αυτή η ειδική περίπτωση που λέει ότι εάν n είναι <κάποια σταθερή αξία όπως είναι το 2 επιστροφή αμέσως.
Μην απαντάτε με την ίδια εγκύκλιο απάντηση.
Αυτή η διαδικασία, η κυκλικότητα τελικά θα τελειώσει.
Αν σας ζητώ "Ταξινόμηση αυτά τα n στοιχεία," και λέτε, "Καλά, αυτά τα ταξινομήσετε n / 2"
τότε λέτε, "Καλά, αυτοί είδος n / 4, n / 8, n/16,"
τελικά θα χωρίζουν από ένα αρκετά μεγάλο αριθμό
ότι θα έχετε μόλις 1 στοιχείο αριστερά, σε ποιο σημείο μπορείτε να πείτε,
«Εδώ, εδώ είναι ένα ταξινομημένο μόνο στοιχείο."
Στη συνέχεια, η λάμψη αυτού του αλγορίθμου μέχρι εδώ είναι να προέρχεται από το γεγονός
ότι από τη στιγμή που έχετε όλα αυτά τα ξεχωριστά ταξινομημένο καταλόγους,
όλα από τα οποία έχουν μέγεθος 1, η οποία φαίνεται να είναι άχρηστη,
τη στιγμή που θα ξεκινήσει τη συγχώνευσή τους και τη συγχώνευσή τους
θα δημιουργηθεί τελικά ως Rob έκανε στο βίντεο ένα τέλος ταξινομημένη λίστα.
>> Αλλά αυτή η ιδέα επεκτείνεται πολύ πέρα ​​από τη διαλογή.
Υπάρχει αυτή η ιδέα ενσωματωμένα σε αυτό το πρόγραμμα που είναι γνωστό ως αναδρομή,
η ιδέα σύμφωνα με την οποία είστε ένα πρόγραμμα,
και να λύσει κάποιο πρόβλημα αποκαλείς τον εαυτό σου,
ή έχουν τεθεί στο πλαίσιο των γλωσσών προγραμματισμού που είναι μια λειτουργία,
και για να λύσει ένα πρόβλημα, που η λειτουργία αποκαλείς τον εαυτό σου
ξανά και ξανά και ξανά, αλλά η λειτουργία
δεν μπορεί να θέσει τον εαυτό σας απείρως πολλές φορές.
Τελικά θα πρέπει να ανακάμπτουν, να το πω έτσι,
και να έχουν κάποια hard-coded κατάσταση βάσης που λέει
σε αυτό το σημείο να σταματήσει καλώντας τον εαυτό σας, έτσι ώστε η όλη διαδικασία
Τέλος, στην πραγματικότητα δεν σταματά.
Τι σημαίνει αυτό πραγματικά σημαίνει, να recurse;
>> Ας δούμε, αν μπορούμε να κάνουμε ένα απλό, ασήμαντο παράδειγμα, ας πούμε,
3 άτομα μαζί μου εδώ στη σκηνή, αν κάποιος είναι άνετα.
1, έλα επάνω, 2 και 3.
Αν σας 3 θέλουν να έρθουν εδώ.
Αν θέλετε να σταθεί δίπλα μου εδώ σε μια γραμμή, ας υποθέσουμε ότι το πρόβλημα στο χέρι
είναι πολύ επιπόλαια να μετρήσει τον αριθμό των ανθρώπων που είναι εδώ.
Αλλά ειλικρινά, είμαι κουρασμένος από όλα αυτά τα παραδείγματα καταμέτρηση.
Αυτό πρόκειται να πάρει κάποιο χρόνο, 1, 2, και τελεία, τελεία, τελεία.
Είναι πρόκειται να πάρει για πάντα.
Θα προτιμούσα μόνο κλωτσιά αυτό το πρόβλημα εντελώς με τη βοήθεια του-ό, τι είναι το όνομά σας;
Sara. >> Sara, εντάξει.
Kelly. >> Kelly και;
>> Willy. >> Willy, Sara, Kelly, και Willy.
Αυτή τη στιγμή έχω την ερώτηση από κάποιον
πόσοι άνθρωποι βρίσκονται επάνω σε αυτό το στάδιο, και δεν έχω καμία ιδέα.
Αυτό είναι ένα πραγματικά μακρύ κατάλογο, και έτσι αντί να πάω να κάνω αυτό το τέχνασμα.
Πάω να ζητήσει από το πρόσωπο δίπλα μου για να κάνω το μεγαλύτερο μέρος του έργου,
και μόλις αυτή γίνεται κάνει μεγαλύτερο μέρος του έργου
Πάω να κάνω το ελάχιστο ποσό της εργασίας είναι δυνατόν και απλά προσθέστε 1
απάντηση σε ό, τι της είναι, τόσο εδώ πηγαίνουμε.
Έχω κληθεί πόσοι άνθρωποι είναι πάνω στη σκηνή.
Πόσοι άνθρωποι είναι πάνω στη σκηνή στα αριστερά σας;
Το αριστερό μου; >> Εντάξει, αλλά δεν εξαπατά.
Αυτό είναι καλό, αυτό είναι σωστό, αλλά αν θέλουμε να συνεχίσουμε αυτή τη λογική
Ας υποθέσουμε ότι έχετε ομοίως θέλετε να punt αυτό το πρόβλημα στα αριστερά σας,
Έτσι, αντί να απαντήσει άμεσα να προχωρήσει και μόλις περάσει το buck.
Ω, πόσοι άνθρωποι είναι στα αριστερά μου;
Πόσοι άνθρωποι είναι προς τα αριστερά;
1.
[Γέλια]
Εντάξει, έτσι 0, έτσι και τώρα τι έχει κάνει Willy
το έχετε επιστρέψει απάντησή σας αυτή την κατεύθυνση λέγοντας 0.
Τώρα, τι πρέπει να κάνετε; >> 1.
Εντάξει, έτσι είστε το 1, έτσι ώστε να λένε, "Εντάξει, Πάω να προσθέσετε 1
όποια και αν είναι να μετράνε Willy ήταν, «έτσι ώστε 1 + 0.
Τώρα είστε 1, έτσι η απάντησή σας προς τα δεξιά είναι τώρα-
1. >> Και η δική μου θα είναι 2.
Καλό, έτσι ώστε να παίρνετε την προηγούμενη απάντηση του 1,
προσθέτοντας το ελάχιστο ποσό της εργασίας που θέλετε να κάνετε, η οποία είναι +1.
Τώρα έχετε 2, και το χέρι σας στη συνέχεια, με την οποία αξία;
3, θέλω να πω,, συγνώμη 2.
Καλή.
>> Λοιπόν, είχαμε 0 προς τα αριστερά.
Στη συνέχεια, είχαμε 1, και στη συνέχεια προσθέτουμε 2,
και τώρα είστε παράδοση με τον αριθμό 2,
και γι 'αυτό λέω, εντάξει, +1, 3.
Υπάρχει πράγματι 3 άτομα στέκεται δίπλα μου σε αυτό το στάδιο,
έτσι θα μπορούσαμε να είχαμε κάνει προφανώς αυτό είναι πολύ γραμμικά,
πάρα πολύ στην προφανή τρόπο, αλλά αυτό που κάναμε πραγματικά κάνει;
Πήραμε ένα πρόβλημα του μεγέθους 3 αρχικά.
Εμείς έσπασε έπειτα κάτω σε ένα πρόβλημα του μεγέθους 2,
τότε ένα πρόβλημα του μεγέθους 1, και έπειτα τελικά η περίπτωση βάσεως
Ήταν πραγματικά, OH, δεν υπάρχει κανείς εκεί,
σε ποιο σημείο Willy επέστρεψε αποτελεσματικά μια μόνιμη απάντηση μια-δυο φορές,
και η δεύτερη Στη συνέχεια διαβιβάσθηκε επάνω, διοχετεύεται επάνω, διοχετεύεται επάνω,
και στη συνέχεια με προσθήκη σε αυτό ένα επιπλέον 1
έχουμε εφαρμόσει αυτή τη βασική ιδέα της αναδρομής.
>> Τώρα, σε αυτή την περίπτωση δεν λύσει πραγματικά το πρόβλημα
οποιαδήποτε πιο αποτελεσματικά τότε έχουμε δει μέχρι στιγμής.
Αλλά σκεφτείτε για τους αλγόριθμους που έχουμε κάνει στη σκηνή μέχρι στιγμής.
Είχαμε 8 κομμάτια χαρτιού στο μαυροπίνακα,
στο βίντεο, όταν ο Sean έψαχνε για τον αριθμό 7, και τι έκανε πραγματικά κάνει;
Καλά, αυτός δεν κάνει οποιοδήποτε είδος του διαίρει και βασίλευε.
Δεν κάνει οποιοδήποτε είδος αναδρομής.
Μάλλον το έκανε ακριβώς αυτό το γραμμικό αλγόριθμο.
Αλλά όταν εισήγαγε την ιδέα των αριθμών ταξινομημένο ζουν στη σκηνή την περασμένη εβδομάδα
τότε είχαμε αυτό το ένστικτο να πάει στη μέση,
σε ποιο σημείο είχαμε μια μικρότερη λίστα μέγεθος 4 ή άλλη λίστα μεγέθους 4,
και στη συνέχεια, είχαμε ακριβώς το ίδιο πρόβλημα, γι 'αυτό επαναλαμβάνεται, επαναλαμβάνεται, επαναλαμβάνεται.
Με άλλα λόγια, έχουμε recursed.
Σας ευχαριστώ πολύ για 3 εθελοντές μας εδώ για την επίδειξη αναδρομή μαζί μας.
>> Ας δούμε αν δεν μπορούμε να κάνουμε αυτό τώρα λίγο πιο συγκεκριμένα,
επίλυση ενός προβλήματος που και πάλι θα μπορούσαμε να κάνουμε πολύ εύκολα,
αλλά θα το χρησιμοποιήσουν ως εφαλτήριο για την υλοποίηση αυτής της βασικής ιδέας.
Αν θέλω να υπολογίσει το άθροισμα του ένα μάτσο αριθμούς,
Για παράδειγμα, αν έχετε περάσει στον αριθμό 3,
Θέλω να σας δώσουμε την αξία του σίγμα 3,
οπότε το άθροισμα των 3 + 2 + 1 + 0.
Θέλω να πάρω πίσω την απάντηση 6,
έτσι θα εφαρμόσει αυτό το σίγμα λειτουργία, αυτή η λειτουργία άθροισης
ότι, και πάλι, παίρνει στην είσοδο, και στη συνέχεια επιστρέφει το άθροισμα
από τον αριθμό αυτό σε όλη τη διαδρομή μέχρι το 0.
Θα μπορούσαμε να το κάνουμε αυτό πολύ απλά, έτσι δεν είναι;
Θα μπορούσαμε να το κάνουμε αυτό με κάποιο είδος του looping δομή,
οπότε επιτρέψτε μου να προχωρήσει και να πάρει αυτό που ξεκίνησε.
>> Συμπεριλάβετε stdio.h.
Επιτρέψτε μου να μπει στο κυρίως να συνεργαστεί με εδώ.
Ας σώσει αυτό ως sigma.c.
Στη συνέχεια, Πάω να πάει εδώ, και θα πάω να κηρύξει int n,
και Πάω να κάνετε τα εξής, ενώ ο χρήστης δεν συνεργάζεται.
Αν ο χρήστης δεν έχει δώσει εμένα ένα θετικό αριθμό
επιτρέψτε μου να πάμε μπροστά και να προτρέψει τους για GetInt n =,
και επιτρέψτε μου να τους δώσουμε κάποιες οδηγίες για το τι να κάνουν,
έτσι printf ("θετικός ακέραιος παρακαλώ").
Απλά κάτι σχετικά απλό σαν αυτό, έτσι ώστε από τη στιγμή που χτύπησε γραμμή 14
έχουμε τώρα ένα θετικό ακέραιο πιθανώς σε n.
>> Τώρα, ας κάνει κάτι με αυτό.
Επιτρέψτε μου να προχωρήσει και να υπολογίζουν το άθροισμα, έτσι int sum = σίγμα (n).
Sigma είναι απλώς άθροισμα, έτσι γράφω αυτό ακριβώς τον εκτροφέα τρόπο.
Θα αποκαλούν απλώς σίγμα εκεί.
Αυτό είναι το ποσό, και τώρα θα πάω να εκτυπώσετε το αποτέλεσμα,
printf ("Το άθροισμα είναι% d \ n", άθροισμα).
Και τότε θα επιστρέψει 0 για το καλό μέτρο.
Έχουμε κάνει τα πάντα ότι το πρόγραμμα αυτό απαιτεί εκτός από το ενδιαφέρον μέρος,
που είναι να εφαρμόσουν στην πράξη τη λειτουργία σίγμα.
>> Επιτρέψτε μου να πάω εδώ κάτω προς τα κάτω, και επιτρέψτε μου να δηλώσω λειτουργία σίγμα.
Είναι πήρε να λάβει μια μεταβλητή που είναι του τύπου integer,
και τι είδους δεδομένα δεν θέλω να επιστρέψει κατά πάσα πιθανότητα από το σίγμα;
Int, γιατί θέλω να ταιριάζει με τις προσδοκίες μου στη γραμμή 15.
Εδώ επιτρέψτε μου να προχωρήσει και να εφαρμόσει αυτό
σε ένα αρκετά απλό τρόπο.
>> Ας πάμε μπροστά και να πω int sum = 0,
και τώρα είμαι πρόκειται να πάει έχουν λίγο για βρόχο εδώ
που πρόκειται να πω κάτι τέτοιο,
for (int i = 0? I <= αριθμός? i + +) άθροισμα + = i.
Και τότε Πάω να επιστρέψει ποσό.
Ι θα μπορούσε να έχει υλοποιηθεί αυτό σε οποιοδήποτε αριθμό τρόπων.
Θα μπορούσα να έχω χρησιμοποιήσει ένα βρόχο while.
Θα μπορούσα να παραληφθεί με τη χρήση της μεταβλητής ποσό αν ήθελα πραγματικά να,
αλλά εν ολίγοις, έχουμε μόνο μια λειτουργία που αν δεν το έκανα βλάκας δηλώνει άθροισμα είναι 0.
Τότε επαναλαμβάνεται από 0 για επάνω διαμέσου του αριθμού,
και σε κάθε επανάληψη προσθέτει ότι η τρέχουσα αξία σε ποσό και στη συνέχεια επιστρέφει ποσό.
>> Τώρα, υπάρχει μια μικρή βελτιστοποίηση εδώ.
Αυτό είναι πιθανώς μια χαμένη βήμα, αλλά ας είναι. Αυτό είναι μια χαρά για τώρα.
Είμαστε τουλάχιστον να είναι διεξοδική και πηγαίνοντας 0 σε όλη τη διαδρομή προς τα πάνω.
Δεν είναι πολύ δύσκολο και αρκετά απλή,
αλλά αποδεικνύεται ότι με τη λειτουργία σίγμα έχουμε την ίδια ευκαιρία
όπως κάναμε εδώ πάνω στη σκηνή.
Στη σκηνή που μόλις υπολογίζονται πόσοι άνθρωποι ήταν δίπλα μου,
αλλά αν θέλουμε να μετρήσει τον αριθμό 3 + 2 + 1
στο κάτω στο 0 θα μπορούσαμε ομοίως punt σε λειτουργία
ότι θα είμαι αντί περιγράφουν ως αναδρομική.
Εδώ ας κάνουμε μια γρήγορη λογική ελέγξετε και να βεβαιωθείτε ότι δεν το έκανα βλάκας.
>> Ξέρω ότι υπάρχει τουλάχιστον ένα πράγμα σε αυτό το πρόγραμμα που είχα κάνει λάθος.
Όταν πατήσω το enter θα πάω να πάρετε οποιοδήποτε είδος του φωνάζεις;
Τι είμαι πρόκειται να φώναξε σε περίπου;
Ναι, ξέχασα το πρωτότυπο, έτσι είμαι χρησιμοποιώντας μια λειτουργία που ονομάζεται σίγμα στη γραμμή 15,
αλλά είναι που δεν έχουν δηλωθεί μέχρι τη γραμμή 22, γι 'αυτό καλύτερα προληπτικά ανεβαίνουν εδώ
και να κηρύξει ένα πρωτότυπο, και θα πω int σίγμα (int number), και αυτό είναι αυτό.
Είναι εφαρμοστεί στο κάτω μέρος.
>> Ή ένας άλλος τρόπος που θα μπορούσε να λύσει αυτό,
Θα μπορούσα να μετακινήσετε τη λειτουργία εκεί, η οποία δεν είναι κακή,
αλλά τουλάχιστον όταν τα προγράμματα αρχίζουν να σας πάρει μακριά, ειλικρινά,
Νομίζω ότι υπάρχει κάποια αξία σε βασικές έχοντας πάντα στην κορυφή
έτσι ώστε να του αναγνώστη μπορεί να ανοίξει το αρχείο και στη συνέχεια να δούμε αμέσως
τι κάνει το πρόγραμμα χωρίς να χρειάζεται να ψάξετε μέσα από αυτό
ψάχνει για το εν λόγω κύρια λειτουργία.
Ας πάμε κάτω στο παράθυρο του τερματικού μου εδώ, δοκιμάστε να κάνετε σίγμα σίγμα κάνουν,
και εγώ μαντάρα εδώ.
Σιωπηρή δήλωση του GetInt λειτουργία σημαίνει έχω ξεχάσει να κάνει ό, τι άλλο;
[Δεν ακούγεται-φοιτητής]
Καλό, οπότε προφανώς ένα κοινό λάθος, οπότε ας βάλουμε αυτό εδώ,
cs50.h, και τώρα ας πάμε πίσω στο παράθυρο του τερματικού μου.
>> Θα καθαρίσετε την οθόνη, και εγώ θα κάνω επανάληψη σίγμα.
Φαίνεται να έχουν συνταχθεί. Επιτρέψτε μου να τρέχουν τώρα σίγμα.
Θα πληκτρολογήσετε τον αριθμό 3, και είχα πάρει 6, έτσι δεν είναι ένα αυστηρό έλεγχο,
αλλά τουλάχιστον φαίνεται να λειτουργεί με την πρώτη ματιά, αλλά τώρα ας το διαρρήξουν,
και ας αξιοποιούν πραγματικά την ιδέα της αναδρομής, και πάλι,
σε ένα πολύ απλό πλαίσιο, έτσι ώστε σε λίγες εβδομάδες »
όταν θα αρχίσετε την εξερεύνηση fancier δομές δεδομένων από πίνακες
έχουμε ένα άλλο εργαλείο για την εργαλειοθήκη με την οποία να
χειρίζονται αυτές τις δομές δεδομένων, όπως θα δούμε.
Αυτή είναι η επαναληπτική προσέγγιση, ο βρόχος προσέγγιση.
>> Επιτρέψτε μου τώρα, αντί να το κάνετε αυτό.
Επιτρέψτε μου να πω ότι αντί για το άθροισμα του αριθμού
κάτω στο 0 είναι πραγματικά το ίδιο πράγμα
Αριθμός + σίγμα (αριθμός - 1).
Με άλλα λόγια, όπως ακριβώς και για το στάδιο Ι κλότσησε σε κάθε ένα από τους ανθρώπους δίπλα μου,
και αυτοί με τη σειρά στοίχημα διατηρούνται μέχρι τελικά έφθασε στο απόγειό της στο Willy,
που έπρεπε να επιστρέψει ένα σκληρό κωδικοποιημένο απάντηση όπως 0.
Εδώ τώρα είμαστε στο ίδιο στοίχημα σίγμα
την ίδια λειτουργία όπως αρχικά λεγόταν, αλλά η βασική εικόνα εδώ
είναι ότι δεν είμαστε καλώντας σίγμα τον ίδιο τρόπο.
Δεν είμαστε περνώντας n.
Είμαστε σαφώς περνά σε αριθμό - 1,
έτσι, ένα ελαφρώς μικρότερο πρόβλημα, λίγο μικρότερο πρόβλημα.
>> Δυστυχώς, αυτό δεν είναι αρκετά μια λύση ακόμη και πριν καθορίσει
τι θα μπορούσε να είναι το άλμα από το προφανές σε κάποιους από εσάς
επιτρέψτε μου να προχωρήσει και να κάνει επανάληψη.
Φαίνεται ότι για την κατάρτιση εντάξει.
Επιτρέψτε μου να επαναπροσδιορίζονται με σίγμα 6.
Ωχ, επιτρέψτε μου να επαναπροσδιορίζονται με 6 σίγμα.
Έχουμε ξαναδεί αυτό, έστω και κατά λάθος την τελευταία φορά, καθώς και.
Γιατί να πάρω αυτό το αινιγματικό σφάλμα κατάτμησης; Ναι.
[Δεν ακούγεται-φοιτητής]
Δεν υπάρχει καμία περίπτωση βάση, και πιο συγκεκριμένα, τι πιθανώς συνέβη;
Αυτό είναι ένα σύμπτωμα του τι συμπεριφορά;
Πείτε λίγο πιο δυνατά.
[Δεν ακούγεται-φοιτητής]
Είναι ένας άπειρος βρόχος αποτελεσματικά, και το πρόβλημα με άπειρη βρόχους
όταν σε αυτές συμμετέχουν αναδρομή σε αυτή την περίπτωση, η ίδια η λειτουργία κλήσης,
τι συμβαίνει κάθε φορά που θα καλέσετε μια συνάρτηση;
Λοιπόν, νομίζω πίσω για το πώς θα το που τη μνήμη σε έναν υπολογιστή.
Είπαμε ότι υπάρχει αυτό το κομμάτι της μνήμης που ονομάζεται στοίβα που είναι στο κάτω μέρος,
και κάθε φορά που θα καλέσει μια λειτουργία λίγο περισσότερη μνήμη παίρνει θέσει
σε αυτό το λεγόμενο στοίβα που περιέχει τις τοπικές μεταβλητές ή παραμέτρους που η λειτουργία του,
οπότε αν σίγμα σίγμα κλήσεις κλήσεις σίγμα σίγμα κλήσεις
καλεί σίγμα όπου κάνει αυτό τελειώνει η ιστορία;
>> Λοιπόν, τελικά υπερβάσεις το συνολικό ποσό
της μνήμης που έχετε διαθέσιμα στον υπολογιστή σας.
Μπορείτε υπέρβαση του τμήματος ότι είστε υποτίθεται για να μείνετε μέσα,
και μπορείτε να πάρετε αυτό το σφάλμα κατάτμησης, πυρήνα που αποτελούν αντικείμενο ντάμπινγκ,
και τι σημαίνει πυρήνα που αποτελούν αντικείμενο ντάμπινγκ είναι ότι έχω τώρα ένα αρχείο με το όνομα του πυρήνα
το οποίο είναι ένα αρχείο που περιέχει μηδενικά και μονάδες
ότι στην πραγματικότητα στο μέλλον θα είναι χρήσιμα διαγνωστικά.
Αν δεν είναι προφανές για να σας όπου σας είναι bug
μπορείτε να το κάνετε πραγματικά ένα κομμάτι της εγκληματολογική ανάλυση, να το πω έτσι,
σε αυτό το αρχείο ένδειξης σφαλμάτων πυρήνα, η οποία, και πάλι, είναι απλώς ένα σωρό μηδενικά και μονάδες
που αποτελεί ουσιαστικά την κατάσταση του προγράμματος στη μνήμη σας
η στιγμή που συνέτριψε με αυτόν τον τρόπο.
>> Η λύση εδώ είναι ότι δεν μπορούμε απλώς να επιστρέψουν στα τυφλά σίγμα,
+ ο αριθμός σίγμα από ένα ελαφρώς μικρότερο πρόβλημα.
Πρέπει να έχουν κάποιο είδος της υπόθεσης βάση εδώ,
και τι θα πρέπει η βασική περίπτωση πιθανώς να είναι;
[Δεν ακούγεται-φοιτητής]
Εντάξει, εφ 'όσον ο αριθμός είναι θετικός πρέπει να επιστρέψουμε στην πραγματικότητα αυτό,
ή με άλλα λόγια, αν ο αριθμός είναι, ας πούμε, <= στο 0
ξέρετε τι, θα πάω μπροστά και να επιστρέψει 0,
σαν Willy έκανε και αλλιώς, είμαι πρόκειται να πάει μπροστά
και να επιστρέψει αυτό, έτσι δεν είναι ότι πολύ μικρότερη
από την επαναληπτική εκδοχή ότι χτυπημένη μέχρι την πρώτη χρήση ενός βρόχου for,
αλλά παρατηρώ ότι υπάρχει αυτό το είδος της κομψότητας σε αυτό.
Αντί να επιστρέψει κάποια αριθμός και εκτελεί όλα αυτά τα μαθηματικά
και προσθέτοντας τα πράγματα με τις τοπικές μεταβλητές
είστε αντί να λέει "Εντάξει, αν αυτό είναι ένα εξαιρετικά εύκολο πρόβλημα,
όπως ο αριθμός είναι <0, επιτρέψτε μου να επιστρέψει αμέσως 0. "
>> Εμείς δεν πρόκειται να ενοχλεί την υποστήριξη των αρνητικών αριθμών,
έτσι θα πάω στο σκληρό κώδικα την τιμή 0.
Αλλά κατά τα άλλα, για την υλοποίηση αυτής της ιδέας του αθροίζοντας
όλοι από αυτούς τους αριθμούς μαζί μπορείτε να πάρετε πραγματικά μια μικρή μπουκιά
έξω από το πρόβλημα, όπως ακριβώς κάναμε εδώ στη σκηνή,
punt τότε το υπόλοιπο του προβλήματος για το επόμενο πρόσωπο,
αλλά σε αυτή την περίπτωση το επόμενο πρόσωπο είναι τον εαυτό σας.
Είναι μια λειτουργία το ίδιο όνομα.
Μόλις περάσει το ένα όλο και μικρότερα και μικρότερα πρόβλημα κάθε φορά,
και ακόμα κι αν δεν έχουμε αρκετά πράγματα επισημοποιηθεί στον κώδικα εδώ
αυτό είναι ακριβώς ό, τι συνέβαινε στην εβδομάδα 0 με τον τηλεφωνικό κατάλογο.
Αυτό είναι ακριβώς ό, τι συνέβαινε σε προηγούμενες εβδομάδες με τον Sean
και με διαδηλώσεις μας από την αναζήτηση για τους αριθμούς.
Είναι ένα πρόβλημα, λαμβάνοντας και τη διαίρεση ξανά και ξανά.
>> Με άλλα λόγια, υπάρχει τώρα ένας τρόπος της μετάφρασης
αυτό το πραγματικό κόσμο κατασκεύασμα, αυτό το υψηλότερο επίπεδο κατασκεύασμα
του διαίρει και βασίλευε και να κάνει κάτι ξανά και ξανά
στον κώδικα, έτσι αυτό είναι κάτι που θα δούμε και πάλι την πάροδο του χρόνου.
Τώρα, ως ένα μέρος, αν είστε νέοι στην αναδρομή θα πρέπει τουλάχιστον να καταλάβουν τώρα
γιατί αυτό είναι αστείο.
Πάω να πάει στο google.com,
και Πάω να ψάξει για μερικές συμβουλές και κόλπα για αναδρομή, εισάγετε.
Πείτε το πρόσωπο δίπλα σε σας αν δεν γελούσαν μόλις τώρα.
Μήπως εννοείτε αναδρομή;
Μήπως εννοείτε-αχ, εκεί πάμε.
Εντάξει, τώρα που είναι το υπόλοιπο του καθενός.
Ένα μικρό αυγό του Πάσχα ενσωματωμένο κάπου εκεί στο Google.
Ως μέρος, έναν από τους συνδέσμους που βάζουμε στην ιστοσελίδα του μαθήματος
για σήμερα είναι ακριβώς αυτό το πλέγμα των διαφόρων αλγορίθμων ταξινόμησης,
μερικές από τις οποίες εξετάσαμε την περασμένη εβδομάδα, αλλά τι είναι ωραίο για αυτό το οπτικοποίηση
όπως την προσπάθειά σας να τυλίξουν το μυαλό σας γύρω από διάφορα πράγματα που σχετίζονται με αλγόριθμους
ξέρετε ότι μπορείτε πολύ εύκολα να αρχίσει τώρα με διαφορετικούς τύπους των εισροών.
Οι είσοδοι όλοι αντιστραφεί, οι είσοδοι κυρίως ταξινόμηση, οι είσοδοι τυχαία και ούτω καθεξής.
Όπως μπορείτε να προσπαθήσετε, πάλι, διακρίνει αυτά τα πράγματα στο μυαλό σας
συνειδητοποιούν ότι αυτή η διεύθυνση URL στην ιστοσελίδα του μαθήματος στη σελίδα Διαλέξεις
μπορεί να σας βοηθήσει λόγο σε μερικά από αυτά.
>> Σήμερα επιτέλους να λυθεί αυτό το πρόβλημα, ενώ από πίσω,
το οποίο ήταν ότι αυτή η λειτουργία ανταλλαγής απλά δεν λειτουργεί,
και ποιο ήταν το θεμελιώδες πρόβλημα με αυτή τη λειτουργία ανταλλαγής,
ο στόχος της οποίας ήταν, και πάλι, να ανταλλάξουν μια τιμή εδώ και εδώ
έτσι ώστε αυτό που συμβαίνει;
Αυτό στην πραγματικότητα δεν λειτουργεί. Γιατί;
Ναι.
[Δεν ακούγεται-φοιτητής]
Ακριβώς, η εξήγηση για αυτό το bugginess
απλά επειδή ήταν όταν καλέσετε συναρτήσεις σε C
και οι λειτουργίες λαμβάνουν επιχειρήματα, σαν και β εδώ,
περνάτε σε ό, τι αντίγραφα αξία που παρέχετε στη λειτουργία που εξασφαλίζει.
Μπορείτε δεν παρέχουν οι ίδιοι τις αρχικές τιμές,
έτσι είδαμε αυτό στο πλαίσιο της buggyc,
buggy3.c, που φαινόταν λίγο κάτι σαν αυτό.
>> Υπενθυμίζουμε ότι είχαμε x και y αρχικοποιείται στο 1 και 2, αντιστοίχως.
Στη συνέχεια εκτυπώνεται από ό, τι ήταν.
Στη συνέχεια ισχυρίστηκε ότι ήμουν εναλλαγή τους καλώντας ανταλλαγής των x, y.
Αλλά το πρόβλημα ήταν ότι η εναλλαγή εργασίας,
αλλά μόνον στο πεδίο της ίδιας της συμφωνίας ανταλλαγής λειτουργούν.
Από τη στιγμή που θα χτυπήσει γραμμή 40 Τα αντάλλαξαν αξίες
πετάχτηκαν μακριά, και έτσι τίποτα
στην αρχική κύρια λειτουργία ήταν στην πραγματικότητα άλλαξε καθόλου,
έτσι αν νομίζετε τότε ως προς τι αυτό μοιάζει με την άποψη της μνήμης μας
εάν αυτή η αριστερή πλευρά της πλακέτας παριστά-
και εγώ θα κάνω το καλύτερό μου για να το δουν όλοι αυτό-αν αυτό αριστερή πλευρά του πλοίου
αντιπροσωπεύει, ας πούμε, μνήμη RAM σας, και η στοίβα πρόκειται να αυξηθεί σε πάνω αυτόν τον τρόπο,
και καλούμε μια συνάρτηση σαν κύριος, και έχει 2 κύριες τοπικές μεταβλητές, x και y,
ας περιγράψει αυτούς ως x εδώ, και ας περιγράψει αυτά ως y εδώ,
και ας βάλουμε τις τιμές 1 και 2, έτσι αυτό είναι εδώ κυρίως,
και όταν η κύρια καλεί η λειτουργία ανταλλαγής το λειτουργικό σύστημα
Η λειτουργία δίνει τη δική ανταλλαγής λωρίδα της μνήμης στη στοίβα,
δικό του πλαίσιο για τη στοίβα, να το πω έτσι.
Διαθέτει επίσης 32 bits για αυτά τα χαρακτηριστικά της.
Συμβαίνει να καλέσετε τους a και b, αλλά αυτό είναι εντελώς αυθαίρετη.
Θα μπορούσε να τους κάλεσε ό, τι θέλει, αλλά τι συμβαίνει όταν η κύρια
κλήσεις swap είναι ότι παίρνει αυτό το 1, δίνει ένα αντίγραφο, δίνει ένα αντίγραφο.
>> Υπάρχει 1 άλλες τοπικές μεταβλητές σε swap, όμως, που ονομάζεται τι; Tmp >>.
Tmp, οπότε επιτρέψτε μου να δώσω στον εαυτό μου ένα άλλο 32 bit εδώ,
και ό, τι έκανα σε αυτή τη λειτουργία;
Είπα int tmp παίρνει, έτσι, ένα έχει 1, έτσι το έκανα αυτό, όταν την τελευταία μας έπαιξε με αυτό το παράδειγμα.
Τότε ένας παίρνει b, οπότε το b είναι 2, έτσι τώρα αυτό γίνεται 2,
και τώρα παίρνει β θερμοκρασία, έτσι temp είναι 1,
έτσι και τώρα γίνεται αυτό b.
Αυτό είναι μεγάλη. Δούλεψε.
Στη συνέχεια, όμως, το συντομότερο τις αποδόσεις λειτουργία
μνήμη της ανταλλαγής εξαφανίζεται αποτελεσματικά, έτσι ώστε να μπορούν να επαναχρησιμοποιηθούν
από κάποια άλλη λειτουργία στο μέλλον, και κυρίως είναι προφανώς εντελώς αμετάβλητη.
Χρειαζόμαστε έναν τρόπο ριζικά την επίλυση αυτού του προβλήματος,
και σήμερα θα έχουμε τελικά έναν τρόπο για να γίνει αυτό σύμφωνα με την οποία
μπορούμε να εισάγουμε κάτι που ονομάζεται ένα δείκτη.
Αποδεικνύεται ότι μπορούμε να λύσουμε αυτό το πρόβλημα
όχι με πέρασμα στα αντίγραφα των χ και γ
αλλά με το πέρασμα σε ό, τι, νομίζετε ότι, με τη λειτουργία ανταλλαγής;
Ναι, τι γίνεται με τη διεύθυνση;
Δεν έχουμε πραγματικά μίλησε για τις διευθύνσεις σε πολλές λεπτομέρειες,
αλλά αν αυτό το μαυροπίνακα αντιπροσωπεύει τη μνήμη του υπολογιστή μου
θα μπορούσαμε βεβαίως να ξεκινήσετε την αρίθμηση των bytes στη μνήμη RAM μου
και λένε ότι αυτό είναι # 1 byte, αυτό είναι byte # 2, # 3 byte,
# 4 byte, byte ... # 2 δισεκατομμύρια αν έχω 2 gigabytes μνήμης RAM,
έτσι θα μπορούσαμε σίγουρα να καταλήξει σε κάποιο αυθαίρετο σύστημα αρίθμησης
για όλα τα επιμέρους bytes στη μνήμη του υπολογιστή μου.
>> Τι θα συμβεί αν αντί όταν καλώ ανταλλαγής
αντί πέρασμα σε αντίτυπα των x και y
γιατί δεν μπορώ να κάνω αντί να περάσει στην διεύθυνση του x εδώ,
η διεύθυνση του y εδώ, κατ 'ουσίαν, η ταχυδρομική διεύθυνση
των x και y, διότι τότε ανταλλάξουν, αν έχει ενημερωθεί
της διεύθυνσης στη μνήμη της χ και γ,
ανταλλάξουν στη συνέχεια, αν έχουμε εκπαιδευτεί να τον λίγο,
θα μπορούσε ενδεχομένως να οδηγήσει σε αυτή τη διεύθυνση, να το πω έτσι,
x, και να αλλάξετε τον αριθμό εκεί, στη συνέχεια, οδηγεί στη διεύθυνση του y,
αλλάξετε τον αριθμό εκεί, ακόμα και αν δεν πάρει πραγματικά αντίγραφα αυτών των αξιών ίδιος,
έτσι ακόμα κι αν μιλούσαμε γι 'αυτό ως κύρια μνήμη του
και τη μνήμη αυτού ως ανταλλαγή για το ισχυρό και το επικίνδυνο τμήμα του C
είναι ότι κάθε λειτουργία μπορεί να αγγίξει τη μνήμη οπουδήποτε στον υπολογιστή,
και αυτό είναι ισχυρό σε αυτό που μπορείτε να κάνετε πολύ φανταχτερά πράγματα με τα προγράμματα ηλεκτρονικών υπολογιστών σε C.
Αυτό είναι επικίνδυνο γιατί μπορεί επίσης να βίδα μέχρι και πολύ εύκολα.
Στην πραγματικότητα, ένας από τους πιο κοινούς τρόπους για προγράμματα αυτές τις μέρες να αξιοποιηθούν
εξακολουθεί να είναι ένας προγραμματιστής για να μην συνειδητοποιούν
ότι αυτός ή αυτή έχει μια επιτρέποντας δεδομένων
για να γραφτεί σε μια θέση στη μνήμη, που δεν προορίζεται.
>> Για παράδειγμα, αυτός ή αυτή δηλώνει μία συστοιχία μεγέθους 10
αλλά στη συνέχεια τυχαία προσπαθεί να βάλει 11 bytes σε εκείνο συστοιχία μνήμης,
και να αρχίσετε αγγίζει τα μέρη της μνήμης που δεν είναι πλέον σε ισχύ.
Ακριβώς για αυτό συμφραζόμενα, κάποιοι από εσάς μπορεί να γνωρίζουν ότι
λογισμικό σας ζητά συχνά για σειριακούς αριθμούς ή τα κλειδιά εγγραφής,
Photoshop και το Word και προγράμματα όπως αυτό.
Υπάρχουν ρωγμές, όπως κάποιοι από εσάς γνωρίζετε, σε απευθείας σύνδεση, όπου μπορείτε να εκτελέσετε ένα μικρό πρόγραμμα,
και ιδού, πλέον αίτηση για τον ίδιο αύξοντα αριθμό.
Πώς είναι ότι λειτουργεί;
Σε πολλές περιπτώσεις, αυτά τα πράγματα είναι απλά διαπίστωση στους υπολογιστές
τμήματα κειμένου σε πραγματικό μηδενικά και μονάδες του υπολογιστή
όπου είναι η λειτουργία, όπου ο αριθμός σειράς έχει ζητηθεί,
και μπορείτε να αντικαταστήσετε αυτό το χώρο, ή κατά την εκτέλεση του προγράμματος
μπορείτε να υπολογίσετε όπου το κλειδί είναι πραγματικά αποθηκεύονται
με κάτι που ονομάζεται ένα πρόγραμμα εντοπισμού σφαλμάτων, και μπορείτε να σπάσει το λογισμικό με αυτόν τον τρόπο.
Αυτό δεν πρόκειται να πει ότι αυτός είναι ο στόχος μας για το επόμενο ζεύγος των ημερών,
αλλά έχει πολύ πραγματικό κόσμο διακλαδώσεις.
Αυτό συμβαίνει να αφορούν κλοπή του λογισμικού,
αλλά υπάρχει επίσης συμβιβασμός ολόκληρων μηχανημάτων.
>> Στην πραγματικότητα, όταν οι ιστοσελίδες αξιοποιηθούν αυτές τις μέρες
και σε κίνδυνο και τα δεδομένα που διέρρευσαν και οι κωδικοί πρόσβασης κλαπεί
αυτό πολύ συχνά σχετίζεται με κακή διαχείριση της μνήμης του,
ή, στην περίπτωση των βάσεων δεδομένων, αδυναμία να προβλέψει
αντιδικία εισόδου, έτσι ώστε περισσότερα για τις επόμενες εβδομάδες,
αλλά προς το παρόν μόνο μια προεπισκόπηση του το είδος της βλάβης που μπορείτε να κάνετε
δεν είναι αρκετά από την κατανόηση πώς λειτουργούν τα πράγματα κάτω από το καπό.
Πάμε για την κατανόηση γιατί αυτό είναι σπασμένο
με ένα εργαλείο που θα γίνεται όλο και πιο χρήσιμος
τα προγράμματα μας πάρει πιο περίπλοκη.
Μέχρι στιγμής, όταν είχατε ένα bug στο πρόγραμμα σας
πώς έχετε πάει για debugging αυτό;
Τι έχουν τις τεχνικές σας ήταν μέχρι τώρα, αν διδάσκεται από TF σας
ή απλά αυτοδίδακτος;
[Φοιτητικό] Printf.
Printf, έτσι printf έχει πιθανώς φίλο σας ότι αν θέλετε να δείτε
τι συμβαίνει στο εσωτερικό του προγράμματός σας
μόλις τεθεί printf εδώ, εδώ printf, printf εδώ.
Στη συνέχεια, μπορείτε να τρέξει, και θα έχετε ένα σωρό πράγματα στην οθόνη
που μπορείτε να χρησιμοποιήσετε στη συνέχεια για να συμπεράνουμε τι πραγματικά συμβαίνει λάθος στο πρόγραμμά σας.
>> Printf τείνει να είναι ένα πολύ ισχυρό πράγμα,
αλλά είναι μια πολύ χειροκίνητη διαδικασία.
Θα πρέπει να βάλετε ένα printf εδώ, μια printf εδώ,
και αν το βάλετε μέσα από ένα βρόχο μπορείτε να πάρετε 100 γραμμές
της παραγωγής που θα πρέπει στη συνέχεια να κοσκινίσει μέσω.
Δεν είναι ένα πολύ φιλικό προς το χρήστη και διαδραστικό μηχανισμός για τον εντοπισμό σφαλμάτων προγραμμάτων,
αλλά ευτυχώς υπάρχει εναλλακτικές λύσεις.
Υπάρχει ένα πρόγραμμα, για παράδειγμα, που ονομάζεται GDB, η GNU Debugger,
το οποίο είναι ένα μικρό απόκρυφες το πώς μπορείτε να το χρησιμοποιήσετε.
Είναι λίγο περίπλοκο, αλλά ειλικρινά,
αυτό είναι ένα από εκείνα τα πράγματα που αν βάλεις σε αυτή την εβδομάδα και την επόμενη
η επιπλέον ώρα για να καταλάβουμε κάτι σαν GDB
θα σας εξοικονομήσει κατά πάσα πιθανότητα δεκάδες ώρες σε μακροπρόθεσμη βάση,
έτσι με αυτό, επιτρέψτε μου να σας δώσω ένα teaser για το πώς λειτουργεί αυτό το πράγμα.
>> Είμαι στο παράθυρο του τερματικού μου.
Επιτρέψτε μου να προχωρήσει και να καταρτίζουν το πρόγραμμα αυτό, buggy3.
Είναι ήδη μέχρι σήμερα.
Επιτρέψτε μου να τρέξει, ακριβώς όπως κάναμε μια πίσω, ενώ, και πράγματι, έχει σπάσει.
Αλλά γιατί συμβαίνει αυτό; Ίσως μαντάρα τη λειτουργία ανταλλαγής.
Ίσως είναι a και b. Δεν είμαι κινείται γύρω τους αρκετά σωστά.
Επιτρέψτε μου να προχωρήσει και να το κάνουμε αυτό.
Αντί απλά να τρέξει buggy3 επιτρέψτε μου να τρέξει αντί αυτού GDB πρόγραμμα,
και θα πάω να το πω για να τρέξει buggy3,
και Πάω να περιλαμβάνουν επιχείρημα γραμμή εντολών,-TUI,
και θα βάλουμε αυτό στο μέλλον προβλήματα στο spec να υπενθυμίσει.
Και τώρα αυτό το μαύρο και άσπρο διεπαφή έσκασε επάνω ότι, και πάλι,
είναι λίγο συντριπτική κατά την πρώτη, γιατί υπάρχει όλη αυτή η
πληροφορίες εγγύησης εδώ κάτω, αλλά τουλάχιστον υπάρχει κάτι γνωστό.
Στην κορυφή του παραθύρου είναι πραγματικό κώδικα μου,
και αν μετακινηθείτε προς τα επάνω εδώ επιτρέψτε μου να μετακινηθείτε στην κορυφή του αρχείου μου,
και πράγματι, δεν υπάρχει buggy3.c και ειδοποίηση στο κάτω μέρος αυτού του παραθύρου
Έχω αυτό το GDB εντολών.
>> Αυτό δεν είναι το ίδιο με το κανονικό John Harvard μου προτροπή.
Αυτή είναι μια ερώτηση που πρόκειται να μου επιτρέψετε να ελέγχει GDB.
GDB είναι ένα πρόγραμμα εντοπισμού σφαλμάτων.
Ένα πρόγραμμα εντοπισμού σφαλμάτων είναι ένα πρόγραμμα που σας επιτρέπει να περπατήσετε
εκτέλεση της γραμμής με το πρόγραμμά σας ανά γραμμή,
κατά τον τρόπο να κάνει ό, τι θέλετε με το πρόγραμμα,
ακόμη και καλώντας λειτουργίες, ή ψάχνει, το πιο σημαντικό,
σε τιμές διαφόρων μεταβλητών.
Ας πάμε μπροστά και να το κάνουμε αυτό.
Πάω να πάει μπροστά και να πληκτρολογήσετε το τρέξιμο σε άμεση GDB, η
έτσι παρατηρήσετε στο κάτω αριστερό μέρος της οθόνης που έχω πληκτρολογήσει τρέξει,
και έχω πατήστε enter, και τι έκανε ότι κάνει;
Είναι κυριολεκτικά έτρεξε το πρόγραμμά μου, αλλά δεν είχα πραγματικά να δείτε πολύ συνεχιστεί εδώ
επειδή δεν έχω πει στην πραγματικότητα το πρόγραμμα εντοπισμού σφαλμάτων
για παύση σε μια συγκεκριμένη χρονική στιγμή.
Απλά πληκτρολογώντας τρέχει τρέχει το πρόγραμμα.
Δεν βλέπω τίποτα στην πραγματικότητα. Δεν μπορώ να το χειραγωγήσουν.
>> Αντ 'αυτού επιτρέψτε μου να το κάνετε αυτό.
Σε αυτό το GDB άμεση επιτρέψτε μου να πληκτρολογήσετε αντί διάλειμμα, εισάγετε.
Αυτό δεν είναι αυτό που ήθελα να πληκτρολογήσετε.
Ας αντί να πληκτρολογήσετε κύρια διάλειμμα.
Με άλλα λόγια, θέλω να ρυθμίσετε κάτι που ονομάζεται ένα σημείο διακοπής,
η οποία εύστοχα ονομάστηκε, επειδή θα σπάσει ή παύση
εκτέλεση του προγράμματός σας σε αυτή τη συγκεκριμένη θέση.
Κύρια είναι το όνομα της συνάρτησης μου.
Σημειώστε ότι GDB είναι αρκετά έξυπνος.
Το κατάλαβα ότι ο κύριος συμβαίνει να ξεκινήσει περίπου σε γραμμή 18
buggy3.c του, και στη συνέχεια να παρατηρήσετε εδώ στο πάνω αριστερά
β + είναι ακριβώς δίπλα στην γραμμή 18.
Αυτό είναι μου θυμίζει ότι έχω θέσει ένα breakpoint στη γραμμή 18.
Αυτή τη φορά όταν πληκτρολογώ τρέξιμο, Πάω να τρέχει το πρόγραμμα μου
μέχρι να χτυπήσει αυτό το σημείο διακοπής,
έτσι ώστε το πρόγραμμα θα σταματήσει για μένα στη γραμμή 18.
Πάμε λοιπόν, να τρέξει.
Τίποτα δεν φαίνεται να έχει συμβεί, αλλά ειδοποίηση στο κάτω αριστερά
έναρξη του προγράμματος, buggy3, breakpoint 1 στην κύρια γραμμή στο buggy3.c 18.
Τι μπορώ να κάνω τώρα;
>> Παρατηρήστε μπορώ να αρχίσετε να πληκτρολογείτε τα πράγματα όπως εκτύπωση,
δεν printf, εκτύπωση x, και τώρα αυτό είναι παράξενο.
Η $ 1 είναι απλά μια περιέργεια, όπως θα δούμε
κάθε φορά που εκτυπώνετε κάτι μπορείτε να πάρετε μια νέα τιμή $.
Αυτό είναι έτσι ώστε να μπορείτε να ανατρέχετε σε προηγούμενες τιμές μόνο σε περίπτωση,
αλλά για τώρα τι εκτύπωσης μου λέει είναι ότι η τιμή του x σε αυτό το σημείο στην ιστορία
είναι προφανώς 134514032.
Τι; Πού πήγαν ακόμη ότι προέρχονται από;
[Δεν ακούγεται-φοιτητής]
Πράγματι, αυτό είναι αυτό που θα αποκαλούμε αξία σκουπίδια, και εμείς δεν έχουμε μιλήσει ακόμα γι 'αυτό,
αλλά ο λόγος που αρχικοποιήσετε μεταβλητές
είναι προφανώς έτσι ώστε να έχουν κάποια αξία που θέλετε να έχουν.
Όμως, τα αλιεύματα υπενθυμίσει ότι μπορείτε να δηλώσετε τις μεταβλητές
όπως έκανα πριν από λίγο σε σίγμα παράδειγμα μου
χωρίς στην πραγματικότητα δίνοντάς τους αξία.
Θυμηθείτε τι έκανα εδώ στο σίγμα.
Δήλωσα n, αλλά τι αξία δεν μπορώ να δώσω;
Καμία, γιατί ήξερα ότι μέσα στις επόμενες λίγες γραμμές
GetInt θα αναλάβει τη φροντίδα του προβλήματος της αξιοποίησης μέσα από n.
>> Αλλά σε αυτό το σημείο στην ιστορία της γραμμής 11
και 12 της γραμμής και της γραμμής 13 και της γραμμής 14
όλη αυτών αρκετές σειρές ποια είναι η τιμή του η;
Στο C απλά δεν ξέρω.
Είναι γενικά κάποια αξία σκουπίδια, μερικές εντελώς τυχαίο αριθμό
που έχει απομείνει ουσιαστικά από κάποια προηγούμενη λειτουργία
έχει τρέξει, έτσι ώστε το πρόγραμμα σας τρέχει
Υπενθυμίζω ότι η λειτουργία παίρνει τη λειτουργία, τη λειτουργία, τη λειτουργία.
Όλα αυτά τα πλαίσια να πάρει θέσει στη μνήμη, και στη συνέχεια αυτές τις λειτουργίες απόδοσης,
και ακριβώς όπως πρότεινα με τη γόμα μνήμη τους είναι τελικά επαναχρησιμοποιείται.
Λοιπόν, αυτό ακριβώς συμβαίνει, έτσι ώστε αυτή τη μεταβλητή x σε αυτό το πρόγραμμα
φαίνεται να έχει κάποια αξία που περιέχονται σκουπίδια σαν 134514032
από κάποια προηγούμενη λειτουργία, δεν είναι αυτό που έγραψα.
Θα μπορούσε να είναι κάτι που έρχεται αποτελεσματικά με το λειτουργικό σύστημα,
κάποια λειτουργία κάτω από την κουκούλα.
>> Εντάξει, αυτό είναι εντάξει, αλλά ας τώρα να προχωρήσετε στην επόμενη γραμμή.
Αν πληκτρολογήσετε «επόμενο» στην GDB προτροπή μου και πατήσω το enter,
παρατηρήσετε ότι η ανάδειξη κινείται προς τα κάτω στη γραμμή 19,
αλλά η λογική συνέπεια είναι ότι η γραμμή 18
έχει πλέον τελειώσει την εκτέλεση, οπότε αν εγώ πάλι πληκτρολογήσετε "print x"
Θα πρέπει τώρα να δείτε 1, και μάλιστα, να κάνω.
Και πάλι, η $ ουσία είναι ένας τρόπος GDB σας υπενθυμίζουμε
ποια είναι η ιστορία των εκτυπώσεων είναι ότι έχετε κάνει.
Τώρα, επιτρέψτε μου να προχωρήσει και να εκτυπώσετε y, και πράγματι, y είναι κάποια τρελή αξία, καθώς,
αλλά δεν είναι μεγάλη υπόθεση, γιατί στην γραμμή 19 είμαστε έτοιμοι να αναθέσει
η τιμή 2, οπότε επιτρέψτε μου να πληκτρολογήσετε "επόμενο" και πάλι.
Και τώρα είμαστε στη γραμμή printf.
Επιτρέψτε μου να κάνω x εκτύπωσης.
Επιτρέψτε μου να κάνω y εκτύπωσης. Ειλικρινά, παίρνω λίγο κουρασμένος από την εκτύπωση αυτή.
Επιτρέψτε μου να πληκτρολογήσετε αντί "οθόνη x" και "y οθόνη,"
και τώρα κάθε φορά που πληκτρολογείτε μια εντολή στο μέλλον
Θα γίνει υπενθύμιση του τι είναι x και y, τι είναι x και y, τι είναι x και y.
>> Δεν μπορώ επίσης, ως ένα μέρος, πληκτρολογήστε "ντόπιους πληροφορίες."
Info είναι μια ειδική εντολή.
Οι ντόπιοι σημαίνει ότι μου δείχνει τις τοπικές μεταβλητές.
Ακριβώς σε περίπτωση που ξεχάσω ή αυτό είναι ένα τρελό, πολύπλοκη λειτουργία
ότι εγώ ή κάποιος άλλος έγραψε ντόπιους πληροφορίες θα σας πω
ποιες είναι όλες οι τοπικές μεταβλητές μέσα σε αυτό το τοπικό λειτουργία
που μπορεί να ενδιαφέρονται για το αν θέλετε να σακί γύρω.
Τώρα, printf είναι έτοιμος να εκτελέσει, οπότε επιτρέψτε μου να προχωρήσει και απλά πληκτρολογήστε "επόμενο".
Επειδή είμαστε σε αυτό το περιβάλλον δεν είμαστε βλέπουμε την πραγματικότητα
εκτελέσει εδώ κάτω, αλλά παρατηρήσετε είναι να πάρει λίγο παραμορφωμένα εδώ.
Αλλά παρατηρήσετε ότι είναι επιτακτικό την οθόνη υπάρχει,
έτσι δεν είναι ένα τέλειο πρόγραμμα εδώ, αλλά αυτό είναι εντάξει, γιατί μπορεί πάντα να σακί γύρω από
χρησιμοποιώντας εκτύπωση αν θέλω.
>> Επιτρέψτε μου να πληκτρολογήσετε στη συνέχεια και πάλι, και τώρα εδώ είναι το ενδιαφέρον κομμάτι.
Σε αυτό το σημείο στην ιστορία γ είναι 2, και το χ είναι 1,
όπως προτείνεται εδώ, και πάλι,
ο λόγος για αυτό είναι αυτόματα εμφανίζει τώρα είναι επειδή χρησιμοποίησα την εντολή
οθόνη x και y οθόνη, έτσι ώστε η στιγμή που πληκτρολογείτε επόμενη
στη θεωρία Χ και Υ πρέπει να ανταλλάσσονται.
Τώρα, γνωρίζουμε ήδη ότι δεν πρόκειται να είναι η περίπτωση,
αλλά θα δούμε σε μια στιγμή πώς μπορούμε να περάσουμε να καταλάβω γιατί αυτό είναι αλήθεια.
Στη συνέχεια, και δυστυχώς, εξακολουθεί να είναι y 2 και x εξακολουθεί να είναι 1, και μπορώ να επιβεβαιώσω τόσο πολύ.
Εκτύπωση x, y εκτύπωσης.
Πράγματι, δεν υπάρχει εναλλαγή έχει πράγματι συμβεί, γι 'αυτό ας ξεκινήσουμε αυτό πάνω.
Είναι σαφές ότι το swap σπάσει.
Ας πληκτρολογήστε αντί "τρέχει" και πάλι.
Επιτρέψτε μου να πω ναι, θέλω να τεθεί πάλι σε λειτουργία από την αρχή, αρχίζει.
>> Τώρα είμαι πίσω επάνω στη γραμμή 18.
Τώρα παρατηρήσετε x και y είναι οι τιμές και πάλι σκουπίδια.
Στη συνέχεια, δίπλα, δίπλα, δίπλα.
Αν έχω βαρεθεί μπορώ επίσης να πληκτρολογήσετε μόνο ν για την επόμενη.
Μπορείτε να συντομεύσει τη συντομότερη δυνατή ακολουθία χαρακτήρων.
Swap είναι πλέον σπάσει.
Ας βουτιά στην, έτσι αντί να πληκτρολογήσετε επόμενο,
τώρα πάω να πληκτρολογήσετε το βήμα, έτσι ώστε Είμαι αναβάθμιση μέσα από αυτή τη λειτουργία
έτσι ώστε να μπορώ να περπατήσω μέσα από αυτό, έτσι χτύπησα βήμα και στη συνέχεια εισάγετε.
Παρατηρήστε ότι οι τονίζοντας άλματα κάτω κάτω στο πρόγραμμα μου με τη γραμμή 36.
Τώρα ποιες είναι οι τοπικές μεταβλητές;
Πληροφορίες για τους ντόπιους.
Τίποτα ακριβώς ακόμα, γιατί εμείς δεν έχουμε φτάσει σε αυτή τη γραμμή,
οπότε ας προχωρήσουμε και να πούμε "επόμενο".
Τώρα φαίνεται να έχουμε tmp, tmp εκτύπωσης.
Σκουπίδια αξία, έτσι δεν είναι; Νομίζω πως ναι.
Πώς εκτυπώσετε για ένα, εκτύπωσης β, 1 και 2;
Σε μια στιγμή, το συντομότερο τύπου Ι επόμενη φορά
tmp πρόκειται να αναλάβει την τιμή 1, ελπίζουμε,
tmp, επειδή πρόκειται να λαμβάνει την τιμή του a.
>> Τώρα, ας μην εκτυπωθεί, β εκτύπωσης,
εκτύπωση αλλά τώρα tmp, και είναι πράγματι 1.
Επιτρέψτε μου να κάνω στη συνέχεια. Επιτρέψτε μου να κάνω στη συνέχεια.
Έχω τελειώσει τη λειτουργία ανταλλαγής.
Είμαι ακόμα μέσα από αυτό στην γραμμή 40, οπότε επιτρέψτε μου να εκτυπώσετε ένα,
β εκτύπωσης, και δεν με νοιάζει τι είναι tmp.
Μοιάζει swap είναι σωστό, όταν πρόκειται για εναλλαγή a και b.
Αλλά αν εγώ τώρα πληκτρολογήστε επόμενη, εγώ άλμα πίσω στη γραμμή 25,
και φυσικά, αν εγώ πληκτρολογήστε x και y εκτύπωση
είναι ακόμα αμετάβλητη, γι 'αυτό δεν έχουν καθορίσει το πρόβλημα.
Αλλά διαγνωστικά τώρα ίσως με αυτό το πρόγραμμα GDB
έχουμε πάρει τουλάχιστον ένα βήμα πιο κοντά στην κατανόηση
τι πηγαίνει στραβά, χωρίς να χρειάζεται να σκουπίδια μας κώδικα με την τοποθέτηση ενός printf εδώ,
printf εδώ, εδώ printf και στη συνέχεια να τρέχει ξανά και ξανά
προσπαθώ να καταλάβω τι συμβαίνει λάθος.
>> Πάω να πάει μπροστά και να βγείτε από αυτό το εντελώς με σταματήσουν.
Είναι πρόκειται να πει τότε, "Κλείστε ούτως ή άλλως;" Ναι.
Τώρα είμαι πίσω σε κανονική προτροπή μου, και είμαι γίνει με GDB.
Ως μέρος, δεν χρειάζεται να χρησιμοποιήσετε αυτό-tui σημαία.
Στην πραγματικότητα, εάν μπορείτε να παραλείψετε να πάρετε ουσιαστικά το κάτω μισό της οθόνης.
Αν στη συνέχεια πληκτρολογήστε διάλειμμα κύρια και στη συνέχεια να εκτελέσετε
Μπορώ να τρέξω ακόμη το πρόγραμμά μου, αλλά τι θα κάνει είναι περισσότερο κειμενικά
Απλά δείξτε μου την τρέχουσα μία γραμμή κάθε φορά.
Η TUI-, κειμένου διεπαφή χρήστη,
απλά σας δείχνει περισσότερο από το πρόγραμμα με τη μία, η οποία είναι ίσως λίγο πιο εύκολο εννοιολογικά.
Αλλά πράγματι, μπορώ να το κάνω ακριβώς δίπλα, δίπλα, δίπλα,
και πάω να δω μια γραμμή κάθε φορά, και αν πραγματικά θέλετε να δείτε τι συμβαίνει
Μπορώ να πληκτρολογήσετε λίστα και δείτε ένα σωρό από γειτονικές γραμμές.
>> Υπάρχει ένα βίντεο που έχουμε ζητήσει να παρακολουθήσετε πρόβλημα για σύνολα 3
στην οποία Nate καλύπτει μερικά από τα περιπλοκές της GDB,
και αυτό είναι ένα από εκείνα τα πράγματα, ειλικρινά, όπου κάποιες μη-τετριμμένη ποσοστό από εσάς
Ποτέ δεν θα αγγίξει GDB, και ότι θα είναι ένα κακό πράγμα
γιατί κυριολεκτικά θα καταλήξετε ξοδεύουν περισσότερο χρόνο αργότερα αυτό το εξάμηνο
κυνηγώντας τα έντομα τότε θα αν βάλετε στη μισή ώρα / ώρα
αυτή την εβδομάδα και την επόμενη μάθησης για να πάρει άνετα με το GDB.
Printf ήταν ο φίλος σας.
GDB θα πρέπει τώρα να είναι ο φίλος σας.
>> Οποιεσδήποτε ερωτήσεις σχετικά με GDB;
Και εδώ είναι μια γρήγορη λίστα με μερικές από τις πιο ισχυρές και χρήσιμες εντολές.
Ναι. >> Μπορείτε να εκτυπώσετε μια σειρά;
Μπορείτε να εκτυπώσετε ένα string; Απολύτως.
Δεν πρέπει να είναι μόνο ακέραιοι.
Αν μια μεταβλητή s είναι μια συμβολοσειρά απλά πληκτρολογήστε s εκτύπωσης.
Θα σας δείξει τι είναι μεταβλητή συμβολοσειράς.
[Δεν ακούγεται-φοιτητής]
Αυτό θα σας δώσει τη διεύθυνση και την ίδια σειρά.
Θα σας δείξω και τα δύο.
Και κάτι τελευταίο, μόνο και μόνο επειδή αυτά είναι καλό να γνωρίζουμε πάρα πολύ.
Backtrace και το πλαίσιο, επιτρέψτε μου να βουτήξει σε αυτό το τελευταίο ένα χρόνο,
ίδιο ακριβώς πρόγραμμα με το GDB.
Επιτρέψτε μου να πάμε μπροστά και να τρέξει την κειμενική έκδοση διεπαφή χρήστη,
σπάσει κύρια.
Επιτρέψτε μου να πάμε μπροστά και να τρέξει ξανά. Εδώ είμαι.
Τώρα, επιτρέψτε μου να πάει δίπλα, δίπλα, δίπλα, δίπλα, δίπλα, το βήμα, εισάγετε.
>> Και τώρα ας υποθέσουμε ότι είμαι τώρα σε ανταλλαγή σκόπιμα, αλλά είμαι σαν "Damn, ποια ήταν η αξία του Χ;"
Δεν μπορώ να κάνω πια x.
Δεν μπορώ να κάνω y επειδή δεν είστε σε πεδίο.
Δεν είναι στο πλαίσιο, αλλά δεν υπάρχει πρόβλημα.
Μπορώ να πληκτρολογήσετε backtrace.
Αυτό μου δείχνει όλες τις λειτουργίες που έχουν εκτελεστεί μέχρι αυτό το χρονικό σημείο.
Παρατηρήστε ότι η μία στο κάτω μέρος, κυρίως, των γραμμών με κύρια
είναι στο κάτω μέρος της εικόνας μας εδώ.
Το γεγονός ότι το swap είναι παραπάνω γραμμές με ανταλλαγή να είναι πάνω στη μνήμη εδώ,
και αν θέλω να γυρίσω στην κύρια προσωρινά μπορώ να πω "κορνίζα".
Τι νούμερο; Κύρια πλαίσιο είναι # 1.
Πάω να πάει μπροστά και να πει "πλαισίου 1."
>> Τώρα είμαι πίσω στην κύρια, και μπορώ να τυπώνει το x, και μπορώ να εκτυπώσετε y,
αλλά δεν μπορώ να εκτυπώσετε ένα ή b.
Αλλά δεν μπορώ να πω αν, "Εντάξει, περιμένετε ένα λεπτό. Πού ήταν η ανταλλαγή;"
Επιτρέψτε μου να πάμε μπροστά και να πει "0 πλαισίου."
Τώρα είμαι πίσω όπου θέλω να είμαι, και ως ένα μέρος,
υπάρχει άλλη εντολές πάρα πολύ, όπως και αν είστε πραγματικά βαρεθεί να πάρει επόμενη πληκτρολόγηση, δίπλα, δίπλα, δίπλα,
μπορείτε να πείτε γενικά πράγματα όπως «επόμενα 10», και ότι θα ενισχύσει μέσα από τις επόμενες 10 γραμμές.
Μπορείτε επίσης να γράψετε "Συνέχεια" όταν πραγματικά να βαρεθεί με την ενίσχυση μέσα από αυτό.
Συνεχίστε να τρέξετε το πρόγραμμά σας χωρίς διακοπή μέχρι να χτυπήσει ένα άλλο σημείο διακοπής,
είτε σε έναν βρόχο ή να μειώσετε τα κάτω στο πρόγραμμά σας.
>> Σε αυτή την περίπτωση έχουμε συνέχισε μέχρι το τέλος, και το πρόγραμμα διεγείρεται κανονικά.
Αυτό είναι ένα φανταχτερό τρόπο, κάτω διαδικασία.
Μόλις βγήκε από το πρόγραμμά σας κανονικά.
Περισσότερα για αυτό το βίντεο και τον εντοπισμό σφαλμάτων σε συνεδρίες για να έρθει.
Αυτό ήταν ένα πολύ.
Ας ρίξουμε 5-λεπτά διάλειμμα μας εδώ, και θα επιστρέψουμε με structs και αρχεία.
>> Αν έχετε βουτήξει σε PSET αυτής της εβδομάδας ήδη
θα ξέρετε ότι χρησιμοποιούμε στον κώδικα της διανομής,
το πηγαίο κώδικα που παρέχουμε σε σας ως σημείο εκκίνησης, κάποιες νέες τεχνικές.
Συγκεκριμένα, εισήγαγε αυτή τη νέα λέξη-κλειδί που ονομάζεται struct, για τη δομή,
ώστε να μπορέσουμε να δημιουργήσετε προσαρμοσμένες μεταβλητές του είδους.
Επίσης, εισαγάγαμε την έννοια του αρχείου I / O, το αρχείο εισόδου και εξόδου,
και αυτό είναι έτσι ώστε να μπορεί να σώσει την κατάσταση
του διοικητικού συμβουλίου Scramble σας σε ένα αρχείο στο δίσκο
έτσι ώστε οι υπότροφοι διδασκαλίας και μπορώ να καταλάβω
τι συμβαίνει στο εσωτερικό του προγράμματός σας, χωρίς να χρειάζεται να παίξει το χέρι
δεκάδες παιχνίδια αγωνίζομαι.
Μπορούμε να το κάνουμε αυτό πιο automatedly.
>> Αυτή η ιδέα ενός struct λύνει ένα αρκετά συναρπαστικό πρόβλημα.
Ας υποθέσουμε ότι θέλουμε να εφαρμόσουμε κάποιο πρόγραμμα
που κρατά κατά κάποιο τρόπο κομμάτι των πληροφοριών σχετικά με τους φοιτητές,
και οι μαθητές θα μπορούσαν να έχουν, για παράδειγμα, ένα αναγνωριστικό, ένα όνομα
και ένα σπίτι σε ένα μέρος όπως το Harvard, ώστε αυτοί να είναι 3 κομμάτια των πληροφοριών
θέλουμε να κρατήσουμε περίπου, οπότε επιτρέψτε μου να προχωρήσει και να αρχίσετε να γράφετε ένα μικρό πρόγραμμα εδώ,
περιλαμβάνουν stdio.h.
Επιτρέψτε μου να κάνω περιλαμβάνουν cs50.h.
Και στη συνέχεια, ξεκινήστε κύρια λειτουργία μου.
Δεν θα ασχοληθείτε με οποιαδήποτε επιχειρήματα της γραμμής εντολών,
και εδώ θέλω να έχω έναν μαθητή, έτσι Πάω να πω
ένας μαθητής έχει ένα όνομα, έτσι Πάω να πω "όνομα χορδών."
Στη συνέχεια, θα πάω να πω ένα φοιτητής έχει επίσης ένα αναγνωριστικό, έτσι int id,
και ένας μαθητής έχει ένα σπίτι, έτσι είμαι επίσης πρόκειται να πει "σπίτι σειρά."
Τότε θα παραγγείλετε αυτά τα λίγο πιο καθαρά σαν αυτό.
Εντάξει, τώρα έχω 3 μεταβλητές με τις οποίες να αντιπροσωπεύουν ένα μαθητή, έτσι "ένα φοιτητή."
>> Και τώρα θέλω να συμπληρώσετε αυτές τις τιμές, οπότε επιτρέψτε μου να προχωρήσει και να πω κάτι σαν
"Id = 123."
Όνομα πρόκειται να πάρει ο David.
Ας πούμε ότι το σπίτι πρόκειται να πάρει Mather,
και στη συνέχεια να πάω να κάνω κάτι αυθαίρετα σαν printf ("% s,
των οποίων η ταυτότητα είναι% d, ζει σε% s.
Και τώρα τι θέλω να συνδέσετε εδώ, το ένα μετά το άλλο;
Όνομα, id, σπίτι? Return 0.
Εντάξει, αν έκανα θάλασσα κάπου εδώ
Νομίζω ότι έχουμε ένα πολύ καλό πρόγραμμα που αποθηκεύει ένας μαθητής.
Φυσικά, αυτό δεν είναι όλα αυτά ενδιαφέρον. Τι γίνεται αν θέλω να έχω 2 μαθητές;
Αυτό δεν είναι μεγάλη υπόθεση. Μπορώ να υποστηρίξει 2 άτομα.
Επιτρέψτε μου να πάμε μπροστά και να αναδείξει αυτό και κατεβαίνουν εδώ,
και μπορώ να πω "id = 456" για κάποιον σαν τον Rob που ζει σε Kirkland.
>> Εντάξει, περιμένετε, αλλά δεν μπορώ να τα λέμε το ίδιο πράγμα,
και φαίνεται σαν να είμαι πρόκειται να πρέπει να αντιγράψετε αυτό,
οπότε επιτρέψτε μου να πω ότι αυτές θα είναι οι μεταβλητές του Δαβίδ,
και επιτρέψτε μου να πάρετε κάποια από αυτά τα αντίγραφα για τον Rob.
Θα καλέσετε αυτά τα Rob, αλλά αυτό δεν πρόκειται να λειτουργήσει τώρα
επειδή έχω-περιμένετε, ας μου αλλάξει σε id1, NAME1 και House1.
Rob θα είναι 2, 2.
Έχω να το αλλάξετε αυτό εδώ, εδώ, εδώ, εδώ, εδώ, εδώ.
Περιμένετε, τι γίνεται με τον Tommy; Ας κάνουμε αυτό και πάλι.
Προφανώς, αν εξακολουθούν να πιστεύουν αυτό είναι ένας καλός τρόπος για να γίνει αυτό, δεν είναι,
έτσι αντιγραφή / επικόλληση κακό.
Αλλά έχουμε λύσει αυτό πριν από μία εβδομάδα.
>> Ποια ήταν η λύση μας όταν θέλαμε να έχουμε πολλαπλές εμφανίσεις του ίδιου τύπου δεδομένων;
[Φοιτητές] Μια σειρά.
Μια σειρά, οπότε επιτρέψτε μου να προσπαθήσω να καθαρίσει αυτό επάνω.
Επιτρέψτε μου να κάνω λίγο χώρο για τον εαυτό μου στην κορυφή, και επιτρέψτε μου να κάνω αυτό αντί για εδώ.
Θα καλέσετε αυτούς τους ανθρώπους, και αντί να πάω να πω "int ταυτότητες,"
και Πάω να υποστηρίξει 3 μας για τώρα.
Πάω να πω "ονόματα εγχόρδων,« και εγώ θα υποστηρίξει 3 από εμάς,
και στη συνέχεια, θα πάω να πω "σπίτια εγχόρδων," και είμαι πρόκειται να υποστηρίξει 3 από εμάς.
Τώρα, εδώ, αντί του David να πάρει τις δικές του τοπικές μεταβλητές
μπορούμε να απαλλαγούμε από αυτά.
Αυτό αισθάνεται καλά ότι είμαστε καθαρισμό αυτό επάνω.
Μπορώ να πω στη συνέχεια, ο David θα είναι [0] και τα ονόματα [0]
και τα σπίτια [0].
Και στη συνέχεια, Rob μπορούμε ομοίως να αποθηκεύσετε σε αυτό.
Ας το θέσουμε εδώ κάτω, έτσι πρόκειται να είναι αυθαίρετα ids [1].
Είναι πρόκειται να είναι τα ονόματα [1],
και, στη συνέχεια, τέλος, σπίτια [1].
>> Ακόμα λίγο κουραστική, και τώρα πρέπει να το καταλάβουν αυτό,
έτσι ας πούμε "τα ονόματα [0], id [0], σπίτια [0],
και ας πληθυντικό και αυτό.
Ταυτότητες, ταυτότητες, ταυτότητες.
Και πάλι, το κάνω, οπότε και πάλι, είμαι ήδη καταφεύγουν σε αντιγραφή / επικόλληση και πάλι,
έτσι οι πιθανότητες είναι ότι υπάρχει άλλη λύση εδώ.
Μπορώ να καθαρίσει πιθανότατα αυτό περαιτέρω με έναν βρόχο ή κάτι τέτοιο,
έτσι με λίγα λόγια, είναι λίγο καλύτερα, αλλά εξακολουθεί να αισθάνεται σαν
Είμαι καταφεύγουν σε αντιγραφή / επικόλληση, αλλά ακόμη και αυτό, ισχυρίζονται,
δεν είναι πραγματικά ουσιαστικά η σωστή λύση, διότι
τι θα γίνει αν κάποια στιγμή αποφασίσουμε ξέρετε τι;
Θα πρέπει πραγματικά να έχουν την αποθήκευση των διευθύνσεων ηλεκτρονικού ταχυδρομείου για τον David και Rob
και όλοι οι άλλοι σε αυτό το πρόγραμμα.
Θα πρέπει επίσης να αποθηκεύσει αριθμούς τηλεφώνου.
Θα πρέπει επίσης να αποθηκεύσει αριθμούς επικοινωνίας έκτακτης ανάγκης.
Έχουμε όλα αυτά τα κομμάτια των δεδομένων που θέλετε να αποθηκεύσετε,
έτσι πώς μπορείτε να κάνετε για αυτό;
>> Μπορείτε να δηλώσετε μια άλλη σειρά στην κορυφή, και στη συνέχεια μπορείτε να προσθέσετε οι ίδιοι
μια διεύθυνση ηλεκτρονικού ταχυδρομείου [0], τη διεύθυνση ηλεκτρονικού ταχυδρομείου [1]
για τον David και Rob και ούτω καθεξής.
Αλλά υπάρχει πραγματικά μόνο μια υπόθεση στην οποία βασίζεται αυτό το σχέδιο
ότι είμαι χρησιμοποιώντας το σύστημα τιμή να σας γνωρίζουμε ότι
[I] σε κάθε μία από τις αρκετές συστοιχίες
ακριβώς έτσι συμβαίνει να αναφέρονται στο ίδιο πρόσωπο,
έτσι [0] σε ταυτότητες είναι ο αριθμός 123,
και Πάω να υποθέσουμε ότι τα ονόματα [0]
είναι το όνομα του ίδιου του ατόμου και τα σπίτια [0]
είναι το σπίτι του ίδιου του ατόμου και ούτω καθ 'εξής για όλες τις διάφορες σειρές που έχω δημιουργήσει.
Αλλά παρατηρώ ότι δεν υπάρχει θεμελιώδης σύνδεση
μεταξύ των 3 κομμάτια των πληροφοριών, id, όνομα και σπίτι,
ακόμη και αν η οικονομική οντότητα προσπαθούμε να μοντέλο σε αυτό το πρόγραμμα δεν είναι συστοιχίες.
Οι πίνακες είναι ακριβώς αυτή η προγραμματική τρόπος για να γίνει αυτό.
Αυτό που πραγματικά θέλουμε να μοντελοποιήσουμε στο πρόγραμμά μας είναι ένα πρόσωπο
όπως ο David, ένα πρόσωπο όπως ο Rob μέσα από τα οποία
ή εγκλεισμού είναι ένα όνομα και ταυτότητα και ένα σπίτι.
>> Μπορούμε να εκφράσουμε με κάποιο τρόπο αυτή την ιδέα του εγκλεισμού
σύμφωνα με την οποία ένα άτομο έχει μια ταυτότητα, ένα όνομα και ένα σπίτι
και να μην καταφεύγουν σε πραγματικά αυτό το hack το οποίο απλά
εμπιστοσύνη ότι κάτι βραχίονα
αναφέρεται στην ίδια ανθρώπινη οντότητα σε κάθε μία από αυτές τις ανόμοιες συστοιχίες;
Μπορούμε να το κάνουμε αυτό πραγματικότητα.
Επιτρέψτε μου να πάω πάνω από την κύρια για τώρα, και επιτρέψτε μου να δημιουργήσετε τα δικά μου δεδομένα τύπου
πραγματικά για πρώτη φορά.
Χρησιμοποιήσαμε αυτή την τεχνική σε Scramble,
αλλά εδώ είμαι πρόκειται να πάει μπροστά και να δημιουργήσετε έναν τύπο δεδομένων,
και ξέρετε τι, θα πάω να το ονομάσουμε φοιτητής ή πρόσωπο,
και είμαι πρόκειται να χρησιμοποιήσετε typedef για τον καθορισμό έναν τύπο.
Πάω να πω ότι αυτό είναι μια δομή,
και στη συνέχεια, αυτή η δομή θα είναι φοιτητής του τύπου, εμείς θα πούμε,
ακόμα κι αν είναι λίγο ημερομηνία τώρα για μένα.
Θα πούμε "int id".
Θα πω "όνομα χορδών."
Στη συνέχεια, εμείς θα πούμε "σπίτι σειρά,"
έτσι τώρα μέχρι το τέλος του αυτές τις λίγες γραμμές κώδικα
Έχω διδάξει μόλις κλαγγή ότι υπάρχει
ένας τύπος δεδομένων εκτός ints, εκτός από χορδές, εκτός διπλασιάζεται, εκτός από πλωτήρες.
>> Από αυτή τη στιγμή σε χρονική γραμμή 11, υπάρχει τώρα ένας νέος τύπος δεδομένων που ονομάζεται φοιτητές,
και τώρα μπορώ να δηλώσετε μια μεταβλητή φοιτητής οπουδήποτε θέλω,
οπότε επιτρέψτε μου να μετακινηθείτε προς τα κάτω εδώ στους ανθρώπους.
Τώρα μπορώ να απαλλαγούμε από αυτό, και μπορώ να πάω πίσω στον David εδώ,
και για τον David μπορώ πραγματικά να πω ότι ο David,
μπορούμε να ονομάσουμε τη μεταβλητή κυριολεκτικά τον εαυτό μου,
πρόκειται να είναι του τύπου των φοιτητών.
Αυτό μπορεί να φαίνεται λίγο παράξενο, αλλά αυτό δεν είναι όλα αυτά διαφορετικά
από τη δήλωση κάτι σαν int ή ένα string ή ένα πλωτήρα.
Είναι ακριβώς έτσι συμβαίνει να λέγεται φοιτητής τώρα,
και αν θέλω να βάλω κάτι μέσα από αυτή τη δομή
Τώρα πρέπει να χρησιμοποιήσετε ένα νέο κομμάτι της σύνταξης, αλλά είναι αρκετά απλή,
david.id = 123, david.name = "David" στο κεφάλαιο Δ,
και david.house = "Mather,"
και τώρα μπορώ να απαλλαγούμε από αυτά τα πράγματα εδώ.
Ανακοίνωση έχουμε επανασχεδιασμένο τώρα το πρόγραμμά μας σε πραγματικά ένα πολύ καλύτερο τρόπο
στο ότι τώρα το πρόγραμμά μας αντικατοπτρίζει τον πραγματικό κόσμο.
>> Υπάρχει ένα πραγματικό κόσμο αντίληψη ενός ατόμου ή ενός φοιτητή.
Εδώ έχουμε τώρα μια έκδοση C από ένα άτομο ή πιο συγκεκριμένα ένα φοιτητή.
Μέσα από αυτό το άτομο είναι αυτοί οι σχετικές χαρακτηριστικά,
ID, το όνομα και το σπίτι, έτσι Rob γίνεται ουσιαστικά το ίδιο πράγμα εδώ κάτω,
έτσι φοιτητής ληστεύουν, και τώρα rob.id = 456,
rob.name = "Rob".
Το γεγονός ότι η μεταβλητή ονομάζεται Rob είναι το είδος της νόημα.
Θα μπορούσε να ονομάζεται το x ή το y ή z.
Εμείς απλά ονόμασε Rob να είναι συνεπής σημασιολογικά,
αλλά πραγματικά το όνομα είναι μέσα από αυτό το ίδιο το πεδίο,
έτσι τώρα έχω αυτό.
Αυτό σημαίνει επίσης δεν αισθάνονται τον καλύτερο σχεδιασμό σε ότι έχω σκληρά κωδικοποιούνται David.
Έχω σκληρό κωδικοποιούνται Rob.
Και έχω ακόμα να καταφύγουν σε κάποιο αντιγραφή και επικόλληση κάθε φορά που θέλω νέες μεταβλητές.
Επιπλέον, θα πρέπει να δώσει προφανώς κάθε μία από αυτές τις μεταβλητές ένα όνομα,
παρόλο που θα ήθελα πολύ μάλλον περιγράψει αυτές τις μεταβλητές
πιο γενικά ως φοιτητές.
>> Τώρα μπορούμε να συγχωνεύσει τις ιδέες που έχουν εργαστεί καλά για εμάς
και αντί να λένε, "Ξέρεις κάτι, να μου δώσει μια μεταβλητή που ονομάζεται φοιτητές,
και ας έχουν το μέγεθος του είναι 3, "έτσι τώρα μπορώ να βελτιώσετε αυτό περαιτέρω,
να απαλλαγούμε από το χέρι δήλωσε ο David,
και μπορώ να πω κάτι, αντί σαν φοιτητές [0] εδώ.
Μπορώ να πω τότε οι μαθητές [0] εδώ,
φοιτητές [0] εδώ, και ούτω καθεξής, και μπορώ να πάω γύρω
και καθαρίστε ότι για τον Rob.
Θα μπορούσα επίσης να πάτε τώρα για προσθέτοντας ίσως ένα βρόχο
και χρησιμοποιώντας GetString και GetInt για να πάρει πραγματικά αυτές τις τιμές από το χρήστη.
Θα μπορούσα να συνεχίσω για προσθέτοντας μια σταθερά, διότι αυτό είναι γενικά κακή πρακτική
στο σκληρό κωδικός κάποιο αυθαίρετο αριθμό σαν 3 εδώ
και στη συνέχεια απλά να θυμάστε ότι θα πρέπει να τεθεί όχι περισσότερο από 3 φοιτητές σε αυτό.
Θα ήταν μάλλον καλύτερο να χρησιμοποιήσετε # define στην κορυφή του αρχείου μου
και παράγοντας που έξω, έτσι πράγματι, επιτρέψτε μου να προχωρήσει και να γενικεύσει αυτό.
>> Επιτρέψτε μου να ανοίξει ένα παράδειγμα που είναι μεταξύ του σήμερα
παραδείγματα εκ των προτέρων, structs1.
Αυτό είναι ένα πιο ολοκληρωμένο πρόγραμμα που χρησιμοποιεί το # define εδώ
και λέει ότι θα πάμε να έχουν 3 μαθητές από προεπιλογή.
Εδώ είμαι κήρυξη αξίζει κατηγορία των φοιτητών,
έτσι μια τάξη από τους μαθητές, και τώρα είμαι χρησιμοποιώντας ένα βρόχο
απλά για να γίνει ο κώδικας είναι λίγο πιο κομψά, συμπληρώσετε την κατηγορία
με την είσοδο του χρήστη, έτσι επαναλάβει από i = 0 έως φοιτητές, που είναι 3.
Και τότε θα ζητήσει από το χρήστη σε αυτή την έκδοση
τι ταυτότητας του μαθητή, και θα το πάρει με GetInt.
Ποιο είναι το όνομα του μαθητή, και στη συνέχεια να πάρω με GetString.
Τι είναι το σπίτι του μαθητή; Κατάλαβα με GetString.
Και στη συνέχεια, στο κάτω μέρος εδώ απλά αποφάσισε να αλλάξει
πώς είμαι εκτύπωση από αυτά και να χρησιμοποιήσετε πραγματικά ένα βρόχο,
και ποιος είμαι εγώ εκτύπωση;
Σύμφωνα με το σχόλιο Είμαι εκτύπωση σε οποιονδήποτε Mather,
και ότι είναι τόσο Rob και ο Tommy και ούτω καθεξής-στην πραγματικότητα του Tommy σε Mather.
Tommy και ο David θα εκτυπωθεί σε αυτή την περίπτωση, αλλά πώς αυτό λειτουργεί;
Δεν έχουμε δει αυτή τη λειτουργία πριν, αλλά να λάβει μια εικασία για το τι κάνει αυτό.
Συγκρίνει χορδές.
>> Είναι ένα μικρό μη-προφανές πώς συγκρίνει συμβολοσειρές, διότι αποδεικνύεται
αν επιστρέφει 0 αυτό σημαίνει ότι οι χορδές είναι ίσες.
Αν επιστρέφει -1 αυτό σημαίνει ότι το ένα έρχεται αλφαβητικά πριν από την άλλη,
και αν επιστρέφει +1 που σημαίνει ότι την άλλη λέξη προέρχεται αλφαβητικά
πριν από την άλλη, και μπορείτε να δείτε σε απευθείας σύνδεση ή στη σελίδα man
για να δείτε ποια ακριβώς τρόπο που είναι, αλλά όλα αυτά τώρα κάνει είναι να λέει
αν η [i]. το σπίτι είναι ίσο με "Mather"
στη συνέχεια, να προχωρήσει και να εκτυπώσετε έτσι και έτσι είναι σε Mather.
Αλλά εδώ είναι κάτι που δεν έχουμε ξαναδεί, και θα επανέλθουμε σε αυτό.
Δεν θυμάμαι ποτέ να χρειάζεται να το κάνετε αυτό σε οποιοδήποτε από τα προγράμματα μου.
Δωρεάν προφανώς αναφέρεται στην μνήμη, ελευθερώνοντας μνήμη,
αλλά τι μνήμη είμαι προφανώς απελευθέρωση σε αυτό το βρόχο στο κάτω μέρος αυτού του προγράμματος;
Φαίνεται σαν να είμαι ελευθερώνοντας το όνομα ενός ατόμου
και το σπίτι ενός ατόμου, αλλά γιατί συμβαίνει αυτό;
>> Βγάζει όλα αυτές τις εβδομάδες που έχετε χρησιμοποιήσει GetString
έχουμε το είδος της εισαγωγής έχει ένα bug σε κάθε ένα από τα προγράμματα σας.
GetString από το σχεδιασμό διαθέτει μνήμη ώστε να μπορεί να επιστρέψει σε εσάς μια σειρά,
όπως ο David, ή Rob, και στη συνέχεια μπορείτε να κάνετε ό, τι θέλετε
με την σειρά στο πρόγραμμά σας, γιατί έχουμε διατηρούνται για τη μνήμη σας.
Το πρόβλημα είναι όλο αυτό το διάστημα κάθε φορά που καλείτε GetString
εμείς, οι συγγραφείς του GetString, έχουν ζητήσει το λειτουργικό σύστημα
για να μας δώσει ένα κομμάτι της μνήμης RAM για αυτό το string.
Δώστε μας ένα κομμάτι της μνήμης RAM για αυτήν την επόμενη σειρά.
Δώστε μας κάποια περισσότερη μνήμη RAM για αυτήν την επόμενη σειρά.
Τι, ο προγραμματιστής, ποτέ δεν έχουν κάνει
μας δίνει ότι η μνήμη πίσω,
έτσι για αυτές τις αρκετές εβδομάδες όλα τα προγράμματα που έχετε γράψει
είχε αυτό που ονομάζεται ένα άλμα μνήμη σύμφωνα με την οποία θα συνεχίσετε να χρησιμοποιείτε
όλο και περισσότερη μνήμη κάθε φορά που καλείτε GetString, και ότι είναι μια χαρά.
Εμείς κάνουμε σκόπιμα ότι τις πρώτες εβδομάδες, επειδή δεν είναι τόσο ενδιαφέρουσα
να χρειάζεται να ανησυχείτε για το πού η σειρά έρχεται από.
Το μόνο που θέλουμε είναι η λέξη Rob να επανέλθει όταν ο χρήστης πληκτρολογεί μέσα
>> Αλλά κινείται προς τα εμπρός πρέπει τώρα να αρχίσουν να πάρει πιο εξελιγμένα γι 'αυτό.
Κάθε φορά που διαθέτουν μνήμη μας καλύτερο χέρι τελικά πίσω.
Διαφορετικά, στον πραγματικό κόσμο στο Mac ή το PC σας μπορεί να έχετε περιστασιακά έμπειρους
συμπτώματα όταν ο υπολογιστής σας είναι τελμάτωση τελικά
ή η ηλίθια κλώση μπάλα καταλαμβάνει μόλις τον υπολογιστή του
όλη την προσοχή και δεν μπορείτε να κάνετε πράγματα.
Που μπορεί να εξηγηθεί από οποιοδήποτε αριθμό των σφαλμάτων, αλλά μεταξύ των πιθανών σφαλμάτων
Τα πράγματα που ονομάζεται διαρροές μνήμης σύμφωνα με την οποία κάποιος ο οποίος έγραψε εκείνο το κομμάτι του λογισμικού
που χρησιμοποιείτε δεν θυμάται την ελεύθερη μνήμη
ότι αυτός ή αυτή ζήτησε από το λειτουργικό σύστημα για,
δεν χρησιμοποιούν GetString, γιατί αυτό είναι ένα πράγμα CS50, αλλά χρησιμοποιώντας παρόμοιες λειτουργίες
που ζητούν το λειτουργικό σύστημα για τη μνήμη.
Αν εσείς ή να βίδα μέχρι και να μην επιστρέψει ποτέ στην πραγματικότητα ότι η μνήμη
ένα σύμπτωμα που μπορεί να είναι ότι ένα πρόγραμμα επιβραδύνει και επιβραδύνει και επιβραδύνει
εκτός αν θυμηθείτε να καλέσετε δωρεάν.
>> Θα επανέλθουμε στο πότε και γιατί θα καλέσετε δωρεάν,
αλλά ας προχωρήσουμε μόνο για το καλό μέτρο και προσπαθήστε να εκτελέσετε το συγκεκριμένο πρόγραμμα.
Αυτό ονομάζεται structs1, εισάγετε.
Επιτρέψτε μου να πάμε μπροστά και να τρέξει structs1, 123, David Mather,
456, Rob Kirkland, 789,
Tommy Mather, και βλέπουμε το Δαβίδ σε Mather, του Tommy σε Mather.
Αυτό είναι μόνο ένα μικρό έλεγχο λογική ότι το πρόγραμμα λειτουργεί.
Τώρα, δυστυχώς, αυτό το πρόγραμμα είναι λίγο απογοητευτικό το γεγονός ότι
Έκανα όλη αυτή η εργασία, θα πληκτρολογήσει σε 9 διαφορετικές σειρές, πατήστε enter,
είπαν οι οποίοι ήταν σε Mather, αλλά προφανώς ήξερα ποιος ήταν ήδη σε Mather γιατί το πληκτρολογήσατε.
Θα ήταν τουλάχιστον ωραίο αν αυτό το πρόγραμμα είναι περισσότερο σαν μια βάση δεδομένων
και να θυμάται ό, τι πραγματικά έχω πληκτρολογήσει στο
έτσι ποτέ δεν έχω και πάλι πρέπει να εισάγετε τα αρχεία των φοιτητών.
Ίσως είναι σαν ένα registrarial σύστημα.
>> Μπορούμε να το κάνουμε αυτό χρησιμοποιώντας την τεχνική αυτή είναι γνωστή ως αρχείο I / O, το αρχείο εισόδου και εξόδου,
ένα πολύ γενικό τρόπο του λέγοντας κάθε φορά που θέλετε να διαβάσετε τα αρχεία ή εγγραφή αρχείων
μπορείτε να το κάνετε αυτό με ένα συγκεκριμένο σύνολο λειτουργιών.
Επιτρέψτε μου να πάμε μπροστά και να ανοίξετε αυτό το structs2.c παράδειγμα,
η οποία είναι σχεδόν όμοια, αλλά ας δούμε τι κάνει τώρα.
Στην κορυφή του αρχείου δηλώνω μια τάξη μαθητών.
I συμπληρώσετε στη συνέχεια την τάξη με την είσοδο του χρήστη,
έτσι ώστε αυτές οι γραμμές κώδικα ακριβώς όπως πριν.
Στη συνέχεια, αν μετακινηθείτε προς τα κάτω εδώ μπορώ να εκτυπώσω όλοι όσοι είναι σε Mather αυθαίρετα όπως πριν,
αλλά αυτό είναι ένα ενδιαφέρον νέο χαρακτηριστικό.
Αυτές οι γραμμές του κώδικα είναι νέα, και εισάγουν κάτι εδώ,
ΑΡΧΕΙΟ, όλα τα καλύμματα, και έχει * το ως εδώ καλά.
Επιτρέψτε μου να περάσω αυτό εδώ, μια * εδώ επίσης.
>> Αυτή η λειτουργία δεν έχουμε ξαναδεί, fopen,
αλλά αυτό σημαίνει ότι το αρχείο ανοιχτό, οπότε ας ξαφρίσει μέσω αυτών,
και αυτό είναι κάτι που θα έρθει πίσω στο μέλλον psets,
αλλά αυτή η γραμμή εδώ ανοίγει ουσιαστικά ένα αρχείο με το όνομα της βάσης δεδομένων,
και ανοίγει ειδικά, σε τέτοιο τρόπο ώστε να μπορεί να κάνει ό, τι σε αυτό;
[Δεν ακούγεται-φοιτητής]
Σωστά, έτσι "w" μόνο σημαίνει ότι είναι λέει το λειτουργικό σύστημα
ανοίξετε το αρχείο με τέτοιο τρόπο ώστε να μπορώ να γράψω για αυτό.
Δεν θέλω να το διαβάσετε. Δεν θέλω απλά να το δει κανείς.
Θέλω να το αλλάξετε και να προσθέσετε τα πράγματα ενδεχομένως να είναι,
και το αρχείο θα πρέπει να ονομάζεται βάση δεδομένων.
Αυτό θα μπορούσε να ονομαστεί τίποτα.
Αυτό θα μπορούσε να είναι database.txt. Αυτό θα μπορούσε να είναι. Db.
Αυτό θα μπορούσε να είναι μια λέξη όπως foo, αλλά αυθαίρετα επέλεξε να ονομάσει το αρχείο βάσης δεδομένων.
Αυτό είναι ένα μικρό έλεγχο λογική ότι θα έρθει πίσω σε με μεγάλη λεπτομέρεια την πάροδο του χρόνου,
αν fp, για το δείκτη αρχείο, δεν ισούται NULL αυτό σημαίνει ότι όλα είναι καλά.
>> Μεγάλη ιστορία σύντομη, λειτουργίες όπως η fopen μερικές φορές αποτυγχάνουν.
Ίσως το αρχείο δεν υπάρχει. Ίσως είστε έξω από χώρο στο σκληρό δίσκο.
Ίσως δεν έχετε άδεια σε αυτόν το φάκελο,
οπότε αν fopen επιστρέφει null κάτι κακό συνέβη.
Αντίθετα, αν δεν fopen επιστρέφει null όλα είναι καλά
και μπορώ να αρχίσετε να γράφετε σε αυτό το αρχείο.
Εδώ είναι ένα νέο τέχνασμα.
Αυτό είναι ένα βρόχο for που είναι πάνω από κάθε επανάληψη των μαθητών μου,
και αυτό φαίνεται τόσο παρόμοιο με ό, τι έχουμε κάνει στο παρελθόν,
αλλά αυτή η λειτουργία είναι ξάδελφος της printf ονομάζεται fprintf για αυτό το αρχείο printf,
και παρατηρήσετε ότι είναι διαφορετικό σε μόνο 2 τρόπους.
Ένα, ξεκινά με f αντί του p,
αλλά στη συνέχεια, το πρώτο επιχείρημα του είναι προφανώς τι;
[Φοιτητές] αρχείου. >> Είναι ένα αρχείο.
Αυτό το πράγμα που ονομάζεται fp, η οποία τελικά θα δώσουμε έμφαση, εκτός ό, τι ένας δείκτης αρχείου,
αλλά για τώρα fp αντιπροσωπεύει απλά το αρχείο που έχω ανοίξει,
έτσι fprintf εδώ λέει εκτύπωση ταυτότητα του χρήστη στο αρχείο, όχι στην οθόνη.
Εκτυπώστε το όνομα του χρήστη στο αρχείο, όχι στην οθόνη,
το σπίτι στο αρχείο, όχι στην οθόνη, και στη συνέχεια, εδώ κάτω, προφανώς,
κλείστε το αρχείο και, στη συνέχεια κάτω εδώ δωρεάν η μνήμη.
>> Η μόνη διαφορά μεταξύ αυτής της έκδοσης 2 και έκδοση 1
είναι η εισαγωγή της fopen και αυτό το αρχείο με *
και αυτή η έννοια της fprintf, οπότε ας δούμε τι είναι το τελικό αποτέλεσμα.
Επιτρέψτε μου να πάω σε παράθυρο τερματικού μου.
Επιτρέψτε μου να τρέξει structs2, εισάγετε.
Μοιάζει όλα είναι καλά. Ας επανάληψη structs2.
123, David Mather, 456, Rob Kirkland,
789, Tommy Mather, εισάγετε.
Μοιάζει σαν να συμπεριφερθεί το ίδιο, αλλά αν το κάνω τώρα ls
παρατηρήσετε τι αρχείο είναι εδώ μεταξύ όλων κωδικό μου, βάση δεδομένων,
οπότε ας ανοίξουν ότι, gedit της βάσης δεδομένων, και το βλέμμα σε αυτό.
Δεν είναι η πιο σέξι μορφές αρχείων.
Είναι πραγματικά ένα κομμάτι της γραμμής δεδομένων ανά γραμμή ανά γραμμή,
αλλά όσοι από εσάς χρησιμοποιείτε το Excel ή αρχεία CSV, τιμές διαχωρισμένες με κόμμα,
Θα μπορούσα βεβαίως να χρησιμοποιηθεί αντί για fprintf ίσως κάνουμε κάτι σαν αυτό
έτσι ώστε θα μπορούσε να δημιουργήσει πραγματικά το ισοδύναμο ενός αρχείου Excel
διαχωρίζοντας τα πράγματα με κόμματα, όχι μόνο νέες γραμμές.
>> Σε αυτή την περίπτωση, αν είχα χρησιμοποιήσει αντί κόμματα αντί των νέων γραμμών
Θα μπορούσα να ανοίξει κυριολεκτικά αυτό το αρχείο βάσης δεδομένων στο Excel αν αντί έκανε να μοιάζει με αυτό.
Με λίγα λόγια, τώρα που έχουμε τη δύναμη να γράψει σε αρχεία
μπορούμε να αρχίσουμε τώρα δεδομένα εξακολουθούν να υφίστανται, κρατώντας το δίσκο γύρω από την
έτσι ώστε να μπορεί να κρατήσει τις πληροφορίες γύρω ξανά και ξανά.
Προσέξτε μερικά άλλα πράγματα που είναι τώρα λίγο πιο εξοικειωμένοι.
Στην κορυφή αυτού του αρχείου C έχουμε μια typedef
γιατί θέλαμε να δημιουργήσουμε έναν τύπο δεδομένων που αντιπροσωπεύει μια λέξη,
έτσι ώστε αυτός ο τύπος ονομάζεται λέξη, και στο εσωτερικό της δομής αυτής
είναι λίγο πιό φανταχτερό τώρα.
Γιατί είναι μια λέξη που αποτελείται από μια σειρά φαινομενικά;
Τι είναι μια λέξη μόνο διαισθητικά;
>> Είναι μια σειρά από χαρακτήρες.
Είναι μια σειρά από χαρακτήρες πλάτη με πλάτη με πλάτη.
ΕΠΙΣΤΟΛΕΣ σε όλα τα καλύμματα συμβαίνει να είναι αυθαίρετα λένε ότι το μέγιστο μήκος
από κάθε λέξη στο λεξικό που χρησιμοποιείτε για Scramble.
Γιατί έχω μια +1;
Ο χαρακτήρας null.
Θυμηθείτε όταν κάναμε το παράδειγμα Bananagrams χρειαζόμασταν μια ειδική τιμή
στο τέλος της λέξης, προκειμένου να παρακολουθεί
από όπου οι λέξεις πραγματικά τελείωσε, καθώς και τις προδιαγραφές του προβλήματος, λέει ο
εδώ είμαστε συνδέει με μια συγκεκριμένη λέξη μια boolean τιμή,
μια σημαία, να το πω έτσι, αληθής ή ψευδής.
Έχετε βρει και εσείς αυτή τη λέξη ήδη, επειδή συνειδητοποιούμε
χρειαζόμαστε πραγματικά έναν τρόπο να θυμόμαστε όχι μόνο ό, τι είναι μια λέξη στο Scramble
αλλά αν έχετε ή όχι, ο άνθρωπος, έχουν βρεθεί
έτσι ώστε αν το κάνετε βρείτε τη λέξη "το" δεν μπορείτε να πληκτρολογήσετε μόνο το, εισάγετε, το, πληκτρολογήστε το, πληκτρολογήστε
και να πάρει 3 πόντους, 3 βαθμούς, 3 βαθμούς, 3 βαθμούς.
Θέλουμε να είμαστε σε θέση να αποκλείσετε αυτή τη λέξη με τον καθορισμό ενός bool
να ισχύει εάν έχετε βρεί ήδη, και έτσι γι 'αυτό
ενθυλακωμένο το σε αυτή τη δομή.
>> Τώρα, εδώ κάτω στην Scramble υπάρχει αυτή η άλλη struct που ονομάζεται λεξικό.
Απουσιάζει εδώ είναι η λέξη typedef, διότι σε αυτή την περίπτωση
έπρεπε να ενσωματώσει την ιδέα ενός λεξικού,
και ένα λεξικό περιέχει ένα σωρό λέξεις,
όπως υπονοείται από την παρούσα διάταξη, και πόσες από αυτές τις λέξεις είναι εκεί;
Λοιπόν, ό, τι αυτή η μεταβλητή ονομάζεται μέγεθος λέει.
Αλλά χρειαζόμαστε μόνο ένα λεξικό.
Δεν χρειαζόμαστε έναν τύπο δεδομένων που ονομάζεται λεξικό.
Πρέπει μόνο ένα από αυτά, έτσι ώστε να βγάζει σε C
ότι αν δεν πούμε typedef, λέτε ακριβώς struct, στη συνέχεια, μέσα στα άγκιστρα
βάζετε μεταβλητές σας, τότε βάζετε το όνομα.
Αυτό δηλώνει μια μεταβλητή που ονομάζεται λεξικό
που μοιάζει με αυτό.
Αντίθετα, οι γραμμές αυτές δημιουργούν ένα επαναχρησιμοποιήσιμο δομή δεδομένων που ονομάζεται λέξη
ότι μπορείτε να δημιουργήσετε πολλαπλά αντίγραφα του, όπως ακριβώς δημιουργήσαμε
πολλαπλά αντίγραφα των φοιτητών.
>> Τι σημαίνει αυτό τελικά θα μας επιτρέψει να κάνουμε;
Επιτρέψτε μου να πάω πίσω στο, ας πούμε, ένα απλό παράδειγμα από απλούστερες εποχές,
και επιτρέψτε μου να ανοίξει, ας πούμε, compare1.c.
Το πρόβλημα εδώ είναι στο χέρι πραγματικά φλούδα πίσω
το στρώμα της σειράς και αρχίσετε να παίρνετε από αυτές τις ρόδες
γιατί αποδεικνύεται ότι μια σειρά όλο αυτό το διάστημα
είναι όπως υποσχεθήκαμε στο εβδομάδα 1 πραγματικά ακριβώς ένα ψευδώνυμο,
συνώνυμο από τη βιβλιοθήκη CS50 για κάτι που μοιάζει λίγο πιο αινιγματικά,
char *, και έχουμε δει αυτό το αστέρι πριν.
Το είδαμε στο πλαίσιο των αρχείων.
>> Ας δούμε τώρα γιατί έχουμε κρύβει την πληροφορία αυτή για αρκετό καιρό τώρα.
Εδώ είναι ένα αρχείο που ονομάζεται compare1.c,
και ζητά προφανώς το χρήστη για 2 χορδές, s και t,
και στη συνέχεια να προσπαθεί να συγκρίνει αυτές τις χορδές για την ισότητα στη γραμμή 26,
και αν είναι ίση λέει, "Πληκτρολογήσατε το ίδιο πράγμα,"
και αν δεν είναι ίσες λέει, "Πληκτρολογήσατε διαφορετικά πράγματα."
Επιτρέψτε μου να πάμε μπροστά και να τρέξει αυτό το πρόγραμμα.
Επιτρέψτε μου να μπω σε κατάλογο πηγή μου, κάνει μια compare1. Θα καταρτίζονται εντάξει.
Επιτρέψτε μου να τρέξει compare1.
Θα μεγέθυνση, εισάγετε.
Πείτε κάτι. ΓΕΙΑ ΣΟΥ.
Θα πω κάτι και πάλι. ΓΕΙΑ ΣΟΥ.
Εγώ σίγουρα δεν πληκτρολογήσετε διαφορετικά πράγματα.
>> Επιτρέψτε μου να προσπαθήσω ξανά αυτό το μήνυμα. Bye Bye.
Σίγουρα δεν είναι διαφορετική, έτσι ώστε ό, τι συμβαίνει εδώ;
Λοιπόν, αυτό που πραγματικά σε σύγκριση με τη γραμμή 26;
[Δεν ακούγεται-φοιτητής]
Ναι, έτσι ώστε να αποδεικνύεται ότι ένα string, τον τύπο δεδομένων, είναι το είδος του ένα λευκό ψέμα.
Μια συμβολοσειρά είναι μια char *, αλλά αυτό είναι ένα char *;
Μια char *, όπως λένε, είναι ένας δείκτης,
και ένας δείκτης είναι ουσιαστικά μια διεύθυνση,
μια θέση στη μνήμη άθροισμα, και αν τύχει να έχετε πληκτρολογήσει σε μια λέξη όπως το HELLO,
θυμάμαι από το παρελθόν συζητήσεις του χορδές
αυτό είναι σαν τη λέξη HELLO.
Να θυμάστε ότι μια λέξη όπως ΓΕΙΑ μπορεί να αναπαρασταθεί
ως μια σειρά από χαρακτήρες, όπως αυτό
και στη συνέχεια με ένα ειδικό χαρακτήρα στο τέλος ονομάζεται μηδενική χαρακτήρα,
όπως το \ σημαίνει.
Τι είναι στην πραγματικότητα μια σειρά;
Σημειώστε ότι αυτό είναι πολλαπλά κομμάτια της μνήμης,
και στην πραγματικότητα, το τέλος της είναι γνωστό μόνο όταν κοιτάζετε μέσα από το σύνολο εγχόρδων
ψάχνει για το ιδιαίτερο χαρακτήρα null.
Αλλά αν αυτό είναι ένα κομμάτι της μνήμης από τη μνήμη του υπολογιστή μου,
ας αυθαίρετα λένε ότι αυτή η συμβολοσειρά μόλις πήρε τυχερός,
και πήρε θέση στην αρχή της μνήμης RAM του υπολογιστή μου.
Αυτό είναι byte 0, 1, 2, 3, 4, 5, 6 ...
>> Όταν λέω κάτι σαν GetString και να κάνω string s = GetString
τι πραγματικά να επιστρέψει;
Για αυτές τις τελευταίες εβδομάδες, αυτό που πραγματικά που αποθηκεύονται σε s
δεν είναι αυτή η σειρά per se, αλλά σε αυτή την περίπτωση τι είναι να αποθηκεύονται
το ψηφίο 0, επειδή ό, τι κάνει στην πραγματικότητα GetString
είναι ότι δεν επιστρέφει φυσικά ένα string.
Αυτό δεν έχει ακόμη κάνει πραγματικά εννοιολογική έννοια του όρου.
Αυτό που κάνει την επιστροφή είναι ένας αριθμός.
Ο αριθμός αυτός είναι η διεύθυνση του ΓΕΙΑ στη μνήμη,
string s και στη συνέχεια, αν φλούδα πίσω αυτό το στρώμα, string δεν υπάρχει στην πραγματικότητα.
Είναι μόνο μια απλοποίηση στη βιβλιοθήκη CS50.
>> Αυτό είναι πραγματικά κάτι που ονομάζεται char *.
Char έχει νόημα γιατί αυτό είναι μια λέξη, όπως ΓΕΙΑ ΣΟΥ;
Λοιπόν, είναι μια σειρά από χαρακτήρες, μια σειρά από χαρακτήρες.
Char * σημαίνει τη διεύθυνση ενός χαρακτήρα,
έτσι τι σημαίνει να επιστρέψει ένα string;
Ένα όμορφο, απλό τρόπο να επιστρέψει ένα string
είναι αντί να προσπαθήσουμε να καταλάβουμε πώς θα επιστρέψει σε 5 ή 6 διαφορετικά bytes
επιτρέψτε μου να επανέλθω στη διεύθυνση των οποίων byte;
Το πρώτο.
Με άλλα λόγια, επιτρέψτε μου να σας δώσω τη διεύθυνση ενός χαρακτήρα στη μνήμη.
Αυτό είναι ό, τι char * αντιπροσωπεύει, η διεύθυνση ενός ενιαίου χαρακτήρα στη μνήμη.
Καλέστε ότι η μεταβλητή s.
Κατάστημα σε s ότι η συγκεκριμένη διεύθυνση, την οποία αυθαίρετα είπε είναι 0,
μόνο για να κρατήσει τα πράγματα απλά, αλλά στην πραγματικότητα είναι γενικά ένα μεγαλύτερο αριθμό.
>> Περιμένετε ένα λεπτό.
Αν είστε μόνο που μου δίνετε τη διεύθυνση του πρώτου χαρακτήρα, πώς μπορώ να ξέρω ποια είναι η διεύθυνση είναι
του δεύτερου χαρακτήρα, η τρίτη, η τέταρτη και η πέμπτη;
[Δεν ακούγεται-φοιτητής]
Το μόνο που ξέρουν πού το τέλος του string είναι με τον τρόπο του αυτό το πρακτικό τέχνασμα,
έτσι όταν χρησιμοποιείτε κάτι σαν printf, τι printf παίρνει κυριολεκτικά ως επιχείρημα,
Υπενθυμίζω ότι χρησιμοποιούμε κράτησης θέσης αυτής% s, και στη συνέχεια να περάσει στο
η μεταβλητή που είναι μια σειρά αποθήκευση.
Τι είστε πραγματικά περνώντας είναι η διεύθυνση του πρώτου χαρακτήρα της στοιχειοσειράς.
Printf χρησιμοποιεί στη συνέχεια ένα βρόχο for ή ένα βρόχο, ενώ κατά την παραλαβή του διεύθυνση,
για παράδειγμα, 0, οπότε επιτρέψτε μου να κάνω αυτό τώρα,
printf ("% s \ n", s)?
Όταν καλώ printf ("% s \ n", s)? Τι είμαι πραγματικά με την παροχή printf
είναι η διεύθυνση του πρώτου χαρακτήρα σε s, το οποίο σε αυτή την περίπτωση είναι αυθαίρετη Η.
>> Πώς printf ξέρω τι ακριβώς να εμφανιστεί στην οθόνη;
Το πρόσωπο που εφαρμόζονται εφαρμογή printf ένα βρόχο while ή ένα βρόχο για
που λέει ότι αυτός ο χαρακτήρας ισούται με τον ειδικό χαρακτήρα null;
Αν όχι, να το εκτυπώσετε. Τι λέτε για αυτό;
Αν δεν το τυπώσετε, να το εκτυπώσετε, να το τυπώσετε, να το τυπώσετε.
Ω, αυτό είναι ιδιαίτερο. Σταματήστε την εκτύπωση και επιστρέφει στο χρήστη.
Και αυτό είναι κυριολεκτικά όλα αυτά που συμβαίνουν κάτω από την κουκούλα,
και αυτό είναι ένα πολύ να χωνέψει την πρώτη ημέρα μιας τάξης,
αλλά για τώρα είναι πραγματικά το δομικό στοιχείο των πάντων κατανόηση
που είναι ήδη σε εξέλιξη στο εσωτερικό της μνήμης του υπολογιστή μας,
και τελικά θα πειράζω αυτό πέρα ​​με λίγη βοήθεια
από έναν από τους φίλους μας στο Πανεπιστήμιο του Στάνφορντ.
>> Ο καθηγητής Νικ Parlante στο Πανεπιστήμιο του Στάνφορντ έχει κάνει αυτή την υπέροχη σειρά βίντεο
από όλα τα είδη των διαφορετικών γλωσσών που εισήγαγε
αυτό το μικρό Binky Claymation χαρακτήρα.
Η φωνή που είστε έτοιμος να ακούσει μέσα σε λίγα δευτερόλεπτα προεπισκόπηση ματιά
είναι ότι από ένα καθηγητής του Στάνφορντ, και παίρνετε
μόνο 5 ή 6 δευτερόλεπτα το δικαίωμα αυτό τώρα,
αλλά αυτό είναι το σημείωμα στο οποίο θα ολοκληρώσει σήμερα
και να αρχίσει την Τετάρτη.
Σας δίνω Fun Pointer με Binky, η προεπισκόπηση.
[♪ ♪ Μουσική] [Καθηγητής Parlante] Γεια σου, Binky.
Ξυπνήστε. Ήρθε η ώρα για διασκέδαση δείκτη.
[Binky] Τι είναι αυτό; Μάθετε σχετικά με δείκτες;
Ω, γλύκισμα!
>> Θα σας δούμε την Τετάρτη.
[CS50.TV]