[Powered by Google Translate] [Εβδομάδα 2, Συνέχεια]
[David J. Malan, Πανεπιστήμιο Χάρβαρντ]
[Αυτό είναι CS50. - CS50.TV]
Εντάξει. Αυτό είναι CS50, και αυτό είναι το τέλος της εβδομάδας 2.
Αν περιμένετε να είναι πεινασμένοι γύρω από αυτή τη στιγμή αύριο,
Γνωρίζω ότι θα πάμε να συγκαλέσει ως μια μικρή ομάδα αύριο, Πέμπτη, 1:15 pm.
Υπάρχει αυτό το URL εδώ αν θέλετε να RSVP.
Ο χώρος είναι περιορισμένος, γι 'αυτό παρακαλώ συγχωρήστε εάν η φόρμα έχει συμπληρωθεί από τη στιγμή που θα συμπληρώσετε αυτό.
Μια άλλη διεύθυνση URL, όμως, που θα μπορούσε να έχει ενδιαφέρον είναι αυτό.
Σε μόλις ένα μήνα περίπου, το μάθημα πρόκειται να διατεθούν
όλα τα ευρύτερα μέσω EDX, μέσω της οποίας οι λαοί στο Διαδίκτυο θα είναι σε θέση να παρακολουθήσει μαζί,
συμμετέχουν στην πορεία αρκετά ενεργά, στην πραγματικότητα.
Θα πρέπει να χρησιμοποιούν την συσκευή CS50 και CS50 Συζήτηση
και τα περισσότερα από τα διάφορα εργαλεία λογισμικού που ήδη έχουν χρησιμοποιήσει αυτό το εξάμηνο.
Και μια από τις πρωτοβουλίες που θα θέλαμε να αναλάβει ως ένα πείραμα φέτος
είναι να δούμε πόσο περιεχόμενο μπορούμε να μεταφράσουμε
σε άλλες προφορικές και γραπτές γλώσσες.
Έτσι, αν θα μπορούσε να έχει συμφέρον να συμμετέχει σε αυτό το έργο
σύμφωνα με την οποία θα παρέχει αντίγραφα αγγλικά και υπότιτλους για διαλέξεις του μαθήματος
και σορτς και σεμινάρια και τμήματα και τα παρόμοια,
αν μιλάτε άπταιστα ή γράψε άπταιστα κάποια άλλη γλώσσα,
θα θέλαμε να σας συμμετάσχουν σε αυτό το πρόγραμμα το οποίο σας μεταφέρει σε ένα ή περισσότερα από τα βίντεο,
μετατροπή τους σε μια γλώσσα που γνωρίζουν αρκετά καλά.
>> Για να σας δώσω μια αίσθηση της διεπαφής, δεν υπάρχει αυτό το web-based user interface
ότι θα πρέπει να χρησιμοποιούν αυτό θα δημιουργήσει ουσιαστικά ένα UI σαν αυτό.
Αυτό με τη διδασκαλία κάποια Απόκριες πριν,
και για την δεξιά πλευρά εκεί σε μαύρο δίπλα σε αυτά τα χρονικά γραμματόσημα,
θα δείτε τα διάφορα πράγματα που βγήκε από το στόμα μου εκείνη την ημέρα,
και στη συνέχεια κάτω θα είστε σε θέση να μεταφράσουν σε κάποια άλλη γλώσσα
τι ακριβώς είναι η χαρτογράφηση μεταξύ, σε αυτή την περίπτωση, τα αγγλικά και, ας πούμε, ισπανικά.
Γι 'αυτό είναι πραγματικά ένα πολύ φιλικό προς το χρήστη εργαλείο.
Μπορείτε να rewind και fast-forward πολύ εύκολα με συντομεύσεις πληκτρολογίου.
Έτσι, αν θα θέλατε να λάβουν μέρος σε αυτό το πείραμα και να έχουν τα λόγια σας δει και να διαβάσετε
από δυνητικά χιλιάδες παιδιά εκεί έξω, παρακαλώ μην διστάσετε να συμμετάσχουν.
Μια λέξη για το γατάκι από τη Δευτέρα.
Μήπως έχουμε στείλει ένα μήνυμα υπερβολικά τρομακτικό, συνειδητοποιούν ότι, όπως προτείνουν ώρες γραφείου
και ως τμήματα υποδεικνύουν, ο σχεδιασμός του μαθήματος είναι πολύ
Οι μαθητές να συνεργάζονται και να μιλάμε και να εργαστούν με σύνολα πρόβλημα
και τα προβλήματα μαζί, και πραγματικά η γραμμή έρχεται ακριβώς κάτω,
πάλι, η εργασία σας θα πρέπει να υποβάλουν τελικά να είναι το δικό σας.
Και έτσι ειλικρινά, σε ώρες γραφείου είναι απόλυτα φυσιολογικό,
Είναι εντελώς να αναμένεται ακόμη, να συνομιλείτε με κάποιο φίλο δίπλα σας.
>> Αν αυτός ή αυτή αγωνίζεται με κάποιο θέμα και είστε όπως,
"Ω, καλά, επιτρέψτε μου να σας δώσω μια γεύση από κάποια γραμμή κώδικα που έγραψα,« ότι είναι εντάξει,
αυτό συμβαίνει, και αυτό είναι πολύ ευνοϊκό, νομίζω, με τη διαδικασία της μάθησης.
Όταν η γραμμή παίρνει διέσχισε είναι όταν η κεφαλή είναι είδος κλίση εδώ για πάρα πολλά δευτερόλεπτα
ή λεπτά για την πραγματικά να έχουν μόλις μια ευκαιρία για την απεμπλοκή φίλο σας,
και σίγουρα όταν τα πράγματα παίρνουν ανταλλάσσονται μέσω του ηλεκτρονικού ταχυδρομείου και Dropbox και τα παρόμοια,
και εκεί είναι η γραμμή.
Έτσι, με όλα τα μέσα να αισθάνονται άνετα και να ενθαρρύνονται να συνομιλήσετε με τους φίλους σας
και τους συμμαθητές για psets και περισσότερο και απλά να συνειδητοποιήσουμε ότι αυτό που τελικά υποβάλουν
πρέπει πραγματικά να είναι το προϊόν της δημιουργίας σας και όχι κάποιος άλλος.
Και έτσι ένας από τους συγκεκριμένους τομείς προβλημάτων για pset2,
η οποία θα βγει αργά το βράδυ αύριο, είναι να βουτήξει στον κόσμο της κρυπτογραφίας,
η οποία είναι η τέχνη της κρυπτογράφησης ή κρυπτογράφησης πληροφοριών,
και αυτό αφορά τελικά στον κόσμο της ασφάλειας.
Τώρα, η ασφάλεια για τους περισσότερους από εμάς έρχεται με τη μορφή του αρκετά κοσμικό μηχανισμών.
Όλοι μας έχουμε τα ονόματα χρήστη και κωδικούς πρόσβασης,
και όλοι μας έχουμε πολύ άσχημα ονόματα χρηστών και κωδικούς πρόσβασης, κατά πάσα πιθανότητα.
>> Εάν ο κωδικός πρόσβασής σας είναι το ίδιο για πολλούς δικτυακούς τόπους, αυτό είναι πιθανόν να μην είναι η καλύτερη ιδέα,
όπως θα συζητήσουμε προς το τέλος του εξαμήνου.
Εάν ο κωδικός πρόσβασής σας είναι γραμμένο σε μια κολλώδη σημείωση - δεν είναι αστείο - στην οθόνη σας,
αυτό είναι πάρα πολύ δεν είναι απαραίτητα το καλύτερο σχέδιο, αλλά αρκετά συνηθισμένο φαινόμενο.
Και αν δεν είστε με τη χρήση κρυπτογράφησης για την κρυπτογράφηση των κωδικών πρόσβασης,
είναι ιδιαίτερα ευάλωτα.
Έτσι, αν νομίζετε ότι είστε έξυπνοι είναι σούπερ, έχοντας μια κρυφή έγγραφο του Word
κάπου στο σκληρό σας δίσκο που έχει όλους τους κωδικούς πρόσβασής σας
αλλά είναι σε ένα φάκελο ότι κανείς δεν πρόκειται να δούμε σε, που επίσης δεν είναι μια πολύ ασφαλής μηχανισμός.
Και έτσι αυτό που θα εισαγάγει pset2 είναι αυτή η τέχνη της κρυπτογραφίας
κρυπτογράφησης και πληροφορίες, έτσι ώστε τα πράγματα όπως κωδικοί πρόσβασης είναι όλο και πιο ασφαλής.
Το πλαίσιο εδώ είναι ότι με ανασφαλής δεδομένα
έρχεται μια ευκαιρία για να κρυπτογραφήσει και να αγωνίζομαι.
Και έτσι αυτό, για παράδειγμα, είναι ένα παράδειγμα ενός κρυπτογραφημένου μηνύματος.
Αυτό λέει πραγματικά κάτι στα αγγλικά, αλλά δεν είναι εντελώς σαφές προφανής.
Και θα έρθει πλήρης κύκλος σήμερα να δώσουμε έμφαση, εκτός ό, τι αυτό το μυστικό μήνυμα εδώ είναι.
Αλλά στον πραγματικό κόσμο των υπολογιστών, τα πράγματα δεν μοιάζουν καν θα μπορούσαν να είναι Αγγλικές φράσεις.
Για παράδειγμα, αυτό είναι ό, τι μπορείτε να βρείτε σε ένα πρότυπο Linux ή Mac ή UNIX υπολογιστή
σε ένα αρχείο που ήταν μια φορά κι έναν καιρό που ονομάζεται το αρχείο κωδικού πρόσβασης.
>> Σήμερα έχει μετακινηθεί σε άλλες θέσεις.
Αλλά αν κοιτάξετε στο σωστό μέρος, σε ένα σύστημα, θα δείτε όχι μόνο το όνομα χρήστη σας
ή των άλλων ανθρώπων για το σύστημα, αλλά θα δείτε μια κρυπτογραφημένη εκδοχή του κωδικού τους.
Πράγματι, η κρύπτη λέξη υποδηλώνει ότι τα ακόλουθα πράγματα είναι κρυπτογραφημένη,
και αυτή η σειρά από φαινομενικά τυχαία γράμματα και αριθμούς και χαρακτήρες και ούτω καθεξής
μπορούν να αποκρυπτογραφηθούν μόνο με γενικά γνωρίζοντας κάποιο μυστικό -
μια μυστική λέξη, ένα μυστικό αριθμό -
και πράγματι έτσι, η τέχνη της κρυπτογραφίας τελικά βράζει κάτω από την εμπιστοσύνη κάποιου είδους
και γνωρίζοντας κάτι που κάποιος άλλος δεν το κάνει.
Γι 'αυτό και θα διερευνήσει αυτό το λίγο πιο αναλυτικά σήμερα και στο PSET να έρθει.
Και τώρα μια λέξη για επιτυχίας / αποτυχίας.
Ειδικά ως κάποιοι από εσάς έχουν καταδυθεί σε pset1, η συσκευή,
και ένα πολύ νέο κόσμο για τον εαυτό σας, να συνειδητοποιήσουν ότι απογοητεύσεις και σύγχυση
και μόλις τεχνικές δυσκολίες είναι αρκετά πρέπει να αναμένεται,
ειδικά με την πρώτη PSET, όπου υπάρχει μόνο τόσο πολύ νέα,
απλά να πάρει εξοικειωμένοι με ls και cd και όλα αυτά τα απόκρυφα εντολές
και ένα νέο περιβάλλον, και αυτό είναι ξεχωριστό από το ίδιο υλικό και τον προγραμματισμό ίδια.
Έτσι αντιλαμβάνονται επίσης ότι υπάρχουν σίγουρα ώρες γραφείου που υπάρχουν ως δομή υποστήριξης.
>> Τμήματα αρχίζουν την ερχόμενη Κυριακή.
Αλλά το πιο σημαντικό, εάν αισθάνεστε ότι αυτό ακριβώς δεν είναι ο κόσμος για σένα,
συνειδητοποιήσουμε ότι δεν πραγματικά να αναλάβει ακριβώς το χρόνο.
Και αν δεν ήταν για αυτήν την ευκαιρία χρόνια για μένα να λάβει ένα πέρασμα τάξη / αποτύχει,
Ειλικρινά, ποτέ δεν θα έχουν θέσει ακόμη και το πόδι στην τάξη.
Και μπορείτε να το αλλάξετε αυτό, μέχρι, δηλαδή, το πέμπτο Δευτέρα του μαθήματος,
οπότε αν είστε στην άκρη τώρα, συνειδητοποιούν ότι αντί για το κεφάλι σε κάποια άλλα νερά συνολικά,
σίγουρα δεν θεωρούν απλώς να αλλάζει επιτυχίας / αποτυχίας.
Και πάλι, δεν υπάρχει πραγματικά αυτός ο πολιτισμός εδώ στο Harvard της λήψης πράγματα επιτυχίας / αποτυχίας
δεδομένου ότι ο καθένας θέλει πραγματικά να επιτύχει ή να υπερβεί,
αλλά ειλικρινά, αυτό είναι ένας θαυμάσιος τρόπος για να δοκιμάσουν κάτι έξω
που μπορεί να μην είναι γνωστά σε σας, και θα καταλήξετε να κάνει, στις περισσότερες περιπτώσεις, πολύ ωραία,
ίσως πολύ προς έκπληξή σας.
Και πιο συγκεκριμένα, αυτό που νομίζω ότι επιτυχίας / αποτυχίας γενικά κάνει,
ειδικά όπως μπορεί να έχετε βιώσει με pset0,
αν βάλετε μέσα σε 10 ώρες, 15 ώρες, 25 ώρες σε κάποιο PSET
και είστε απλά χτυπάς το κεφάλι σου στον τοίχο και είναι να πάρει σούπερ αργά το βράδυ
αλλά έχετε πάρει το PSET 90% του τρόπο και δεν μπορείτε ακριβώς να καταλάβω ένα πράγμα,
επιτυχίας / αποτυχίας πραγματικά βγάζει την άκρη από μια κατηγορία του, όπως αυτό,
όπου μπορείτε να ταξινομήσετε του πω ευτυχώς, "Εντάξει, το ξέρω ότι δεν είναι τέλεια,
αλλά Δούλεψα κώλο μου μακριά σε αυτό, είμαι αρκετά χαρούμενος με αυτό που κατέληξε, "
και ότι θα ανταποκριθεί στις προσδοκίες για την επιτυχία / αποτυχία.
Έτσι, μπορώ να κρατήσει αυτό κατά νου. Εντάξει.
>> Έτσι, όσοι από εσάς έχουν αγωνιστεί για να χρησιμοποιήσετε το Πανεπιστήμιο του Χάρβαρντ Wi-Fi,
Γνωρίζω ότι υπάρχει μια CS50 SSID, μια σύνδεση Wi-Fi, επιπλέουν γύρω
ότι μπορεί να έχετε καλύτερη τύχη για.
Είναι λίγο ειρωνικό το γεγονός ότι ο κωδικός πρόσβασης για αυτό, αν θέλετε να δοκιμάσετε τη σύνδεση με αυτό
για καλύτερες ταχύτητες - και να μας ενημερώσετε αν δεν είναι καλύτερη - είναι 12345, σε όλη τη διαδρομή μέχρι 8
γιατί 8 είναι πιο ασφαλής από ό, τι 5.
Έτσι, αν χρειάζεστε τη σύνδεση Wi-Fi κωδικό πρόσβασης, συνδεθείτε ασύρματα CS50 εδώ, 12345678,
και μετά για CS50 Συζητήστε αν έχετε ακόμα διαλείπουσα προβλήματα συνδεσιμότητας,
και θα αφήσουμε τις εξουσίες που πρέπει να ξέρετε για αυτή τη θέση. Εντάξει.
Έτσι, μια γρήγορη teaser, ειδικά για εκείνους από εσάς που είστε fan αγόρια ή κορίτσια όλων των πραγμάτων της Apple.
Αυτό που ξέθαψε από λίγα χρόνια πίσω ήταν αυτό το αρχείο εδώ, iUnlock.c,
απλά για να κάνουν το είδος των πιο συγκεκριμένες και πιο περίπλοκη
μερικά από τα πιο βασικά προγράμματα C που έχουμε γράψει.
Έτσι άνοιξα αυτό το αρχείο, iUnlock.c. Είναι διαθέσιμο στη σελίδα Διαλέξεις για σήμερα.
Στην αριστερή πλευρά θα δείτε έναν μακρύ κατάλογο των λειτουργιών.
Έτσι, ο τύπος που έγραψε αυτό έγραψε πολλές λειτουργίες, περισσότερο από ό, τι ακριβώς κύριος.
Συνήθιζε ένα σωρό βιβλιοθήκες εδώ, και αν αρχίσουμε κύλιση,
ό, τι είναι στην πραγματικότητα αυτό είναι το πρώτο, πιστεύω, ρωγμή για το αρχικό iPhone.
>> Όταν θέλετε να κάνετε jailbreak το iPhone πρωτότυπο, το οποίο σημαίνει untether από την AT & T
και εγκατάσταση ειδικού λογισμικού πραγματικά σε αυτό και να κάνουμε τα πράγματα που η Apple δεν ήθελε τους ανθρώπους να κάνουν,
κάποιος πήρε το χρόνο για να καταλάβουμε ακριβώς πώς θα μπορούσαν να εκμεταλλευτούν αδυναμίες του λογισμικού,
λάθη, σφάλματα, στο λογισμικό της Apple, και έτσι γεννήθηκε iUnlock.c--
ότι αν το συνταχθεί στον υπολογιστή σας και να εγκατασταθεί σε ένα iPhone
που συνδέθηκε με τον υπολογιστή σας μέσω, για παράδειγμα, ένα καλώδιο USB,
αυτό θα σας δώσει τις διοικητικές ή προνόμια root στο iPhone σας
και σας επιτρέπουν να κάνετε λίγο πολύ ό, τι θέλετε.
Και έτσι έχει υπάρξει αυτό το συναρπαστικό παιχνίδι της γάτας και του ποντικιού
μεταξύ της Apple και τον υπόλοιπο κόσμο, ιδίως δεδομένου ότι, όπως πολλές εταιρείες,
προσπαθήστε να κλειδώσετε τα πράγματά τους κάτω έτσι ώστε να μπορείτε να το κάνετε μόνο με το τι σκοπεύουν.
Όμως, χάρη σε ανθρώπους σαν και αυτό την κατανόηση του χαμηλού επιπέδου λεπτομέρειες -
και σε αυτή την περίπτωση προγραμματισμού C - και πολλές από τις γνωστές δομές
ότι έχουμε αρχίσει να παίζει με, είστε σε θέση να αξιοποιούν πραγματικά το υλικό
κατά τρόπο που βλέπετε την τακτοποίηση και όχι κατ 'ανάγκη κάποια εταιρική οντότητα.
Έτσι, για παράδειγμα, δεν έχω καμία ιδέα για το τι όλα αυτά που κάνει,
GetVersion αλλά ακούγεται αρκετά απλή,
και μοιάζει με αυτό είναι μια λειτουργία που έγραψε αυτό το πρόσωπο.
Χρειάζεται κάποιο είδος του ακεραίου ως επιχείρημα, δεν επιστρέφει τίποτα,
αλλά φαίνεται να βρόχο με ένα for loop εδώ και μια κατάσταση, εάν, εάν η διακοπή κατάσταση,
και με κάποιο τρόπο σχετίζεται με αριθμούς έκδοσης αν μετακινηθείτε προς τα κάτω,
παρόλο που πολλές από αυτές τις λέξεις-κλειδιά θα είναι νέα.
Και υπάρχουν ένα σωρό λειτουργίες σε εδώ δεν έχουμε δει ποτέ και δεν θα μπορούσε να δει ποτέ
κατά τη διάρκεια του εξαμήνου.
>> Στο τέλος της ημέρας, ακολουθεί τους ίδιους κανόνες και τη λογική ότι έχουμε το παιχνίδι με μέχρι στιγμής.
Έτσι, αυτό είναι πολύ γέρος για να σπάσει το iPhone σας 3s ή 4s 5s ή σύντομα αυτές τις μέρες,
αλλά ξέρω ότι είναι όλοι πάρα πολύ που προέρχονται από αυτό τον κόσμο που έχουμε βουτούσαν.
Ας ρίξουμε μια ματιά σε ένα λίγο πιο απλό παράδειγμα:
αυτό, μόνο και μόνο για να ζεσταθεί με κάποια σύνταξη, αλλά και κάποιο άλλο είδος των δεδομένων
ότι έχουμε μιλήσει, αλλά δεν έχουν πραγματικά δει σε C.
Αυτό είναι ένα αρχείο που ονομάζεται positive1.c, και σύμφωνα με τις παρατηρήσεις στην κορυφή,
αυτό απαιτεί απλώς ότι ένας χρήστης παρέχει ένα θετικό αριθμό.
Γι 'αυτό είναι ένα παράδειγμα ένα do-while loop, το οποίο είναι ωραίο για το χρήστη διαδραστικά προγράμματα
όπου θα πρέπει να πείτε στον χρήστη να κάνει κάτι,
και αν δεν συνεργαστούν θα φωνάζω σε αυτούς ή να απορρίψει τη συμβολή τους.
Υπόθεση στο σημείο: εγώ είμαι πρόκειται να κάνει γραμμές 19 έως 24
εφ 'όσον ο χρήστης δεν έχει δώσει εμένα ένα θετικό αριθμό.
Αυτή η λεπτομέρεια εδώ στη γραμμή 18, γιατί δηλώνω n πάνω από όλο αυτό το looping κατασκευή
σε αντίθεση προς τα δεξιά δίπλα στην γραμμή 22 όπου πραγματικά ενδιαφέρονται για να πάρει n; Ναι.
[Φοιτητής] Πεδίο. >> Ναι, έτσι το ζήτημα του πεδίου εφαρμογής.
Και σε απλή γλώσσα, τι αναφέρεται στο πεδίο;
Ναι. >> [Ακούγεται ανταπόκριση των φοιτητών] >> Μπορείτε να μιλήσετε λίγο πιο δυνατά;
[Φοιτητής] Πού μπορείτε να έχετε πρόσβαση αυτή τη μεταβλητή. >> Perfect.
Πού μπορείτε να αποκτήσετε πρόσβαση σε μια συγκεκριμένη μεταβλητή.
Και γενικά, ο κανόνας μέχρι τώρα ήταν ότι το πεδίο εφαρμογής του κάποια μεταβλητή
ορίζεται από τις πιο πρόσφατες άγκιστρα που έχετε δει.
>> Και έτσι σε αυτή την περίπτωση, αν έκανα το λάθος να δηλώσει n στη γραμμή 22, η γραμμή θα μπορούσε να λειτουργήσει.
Θα ήθελα να πάρετε μια int, και θα ήθελα να το θέσω σε αυτή τη μεταβλητή n στην γραμμή 22,
αλλά ποια γραμμή του κώδικα θα έχουν τώρα καμία ιδέα για το τι μιλάω; >> [Φοιτητής] 25.
[Malan] 25, και βγάζει 24, όπως επίσης και επειδή στην περίπτωση αυτή δεν εμπίπτει στο πεδίο των άγκιστρα.
Έτσι, μόλις ένα μικρό κομμάτι από μια ενόχληση, αλλά πολύ εύκολα να λυθεί με απλά δηλώνοντας τη μεταβλητή
εκτός της συνάρτησης.
Θα δούμε αργότερα σήμερα μπορείτε να πάτε ένα βήμα παραπέρα
και θα μπορούσε ακόμη και να πάρετε λίγο τεμπέλης.
Και αυτό δεν πρέπει να συνιστάται σε γενικές γραμμές, αλλά θα μπορούσατε να πάρετε ακόμη και τεμπέλης
και να θέσει μια μεταβλητή σε παγκόσμιο επίπεδο, ούτως ειπείν, όχι μέσα από μια συνάρτηση, όχι μέσα από ένα βρόγχο,
αλλά στο ίδιο το αρχείο, εκτός από όλες τις λειτουργίες που έχετε γράψει, όπως έκανα εδώ στη γραμμή 15.
Αυτό είναι γενικά αποδοκιμαζόταν, αλλά συνειδητοποιούν αυτό είναι μια λύση μερικές φορές σε άλλα προβλήματα,
όπως θα δούμε τελικά.
Έτσι, για την ώρα θα το αφήσουμε έτσι, αλλά ας δούμε αν μπορούμε να ξαναγράψουμε αυτό
μόλις αρχίσει να εκφράζουν τους εαυτούς μας λίγο διαφορετικά.
Το πρόγραμμα αυτό, ακριβώς για να είναι σαφής, είναι positive1.
Επιτρέψτε μου να προχωρήσει εδώ και στο παράθυρο του τερματικού μου κάνει positive1, Enter.
Συλλέγει εντάξει. Πάω να τρέξει positive1, πατήστε Enter.
Απαιτώ να μου δώσετε ένα θετικό ακέραιο. Θα πω -1. Αυτό δεν λειτούργησε.
0, 99. Αυτό φαίνεται να λειτουργεί.
Ίσως δεν είναι η πιο αυστηρή δοκιμασία, αλλά τουλάχιστον είναι μια ωραία επιταγή λογική
ότι είμαστε στο σωστό δρόμο.
>> Έτσι, τώρα επιτρέψτε μου να προχωρήσει και να ανοίξει την έκδοση 2 του παρόντος άρθρου,
και ό, τι ήδη είναι διαφορετικό;
Υλοποιεί το ίδιο πράγμα, αλλά τι είναι το άλμα από το σαφώς διαφορετικό αυτή τη φορά;
Αυτό bool στο πράσινο. Είναι επισημαίνεται με πράσινο, αυτή η λέξη-κλειδί είναι γνωστό ως bool, η οποία είναι ένας τύπος δεδομένων.
Αυτό έρχεται δεν χτίστηκε σε σε όλες τις εκδόσεις του C.
Θα πρέπει να περιλαμβάνει μια συγκεκριμένη βιβλιοθήκη.
Στην περίπτωσή μας, θα περιλαμβάνεται το CS50 βιβλιοθήκη έτσι ώστε να έχουμε πρόσβαση σε bool.
Όμως, στη γραμμή 18, φαίνεται να έχουμε μια λογική τιμή εδώ ονομάζεται ευγνώμων.
Θα μπορούσα να έχω αυτό το κάτι λέγεται, αλλά εγώ αυτό που ονομάζεται ευγνώμων
ακριβώς το είδος του μεταφέρω κάποια σημασιολογική έννοια.
Έτσι, αρχικά στη γραμμή 18, είμαι ευγνώμων προφανώς δεν
επειδή η τιμή Boolean ευγνώμων ξεκινά να false στη γραμμή 18.
Και τότε φαίνεται τι έχω κάνει εδώ στις γραμμές 21 έως 23
το έχω ακριβώς το είδος της ξαναγραφεί λογική μου.
Έτσι, δεν έχει λειτουργικά διαφορετικά, αλλά στην γραμμή 22 τώρα μπορώ να ελέγξω αν το int ο χρήστης έχει δώσει
είναι μεγαλύτερη από 0, τότε μπορώ να αλλάξω απλώς την αξία των ευγνώμων για αλήθεια.
Και γιατί το κάνω αυτό; Επειδή στην γραμμή 25, προφανώς θα πάω για να ελέγξετε την κατάσταση.
Κάντε αυτό το βρόχο, ενώ ευγνώμων είναι ψευδής.
Γι 'αυτό πρότεινε ως εναλλακτική λύση για την έκδοση 1
γιατί είναι τουλάχιστον λίγο πιο έξυπνο ίσως, είναι λίγο πιο γειωμένη στην αγγλική γλώσσα.
Έτσι, κάνετε τα ακόλουθα, ενώ δεν είστε ευγνώμονες ή ενώ ευγνώμων είναι ψευδής.
Και αυτή τη φορά πάρα πολύ εγώ προφανώς δεν με νοιάζει να θυμόμαστε ό, τι ο χρήστης πληκτρολογήσει
ειδοποίηση επειδή δεν υπάρχει μεταβλητή n, έτσι στην πραγματικότητα, ένα μικρό λευκό ψέμα εκεί.
>> Λειτουργικά, το πρόγραμμα είναι λίγο διαφορετικό όταν φτάσουμε στο κάτω μέρος του
επειδή δεν είμαι θυμόμαστε τι είναι n.
Αλλά ήθελα να αποδείξει εδώ ότι ακόμα κι αν έχουμε δει GetInt
και GetString χρησιμοποιούνται στην δεξιά πλευρά του ένα ίσον μέχρι στιγμής
έτσι ώστε να θυμόμαστε την αξία, από τεχνική άποψη, αυτό δεν είναι απολύτως απαραίτητο.
Αν για οποιοδήποτε λόγο, απλά δεν με νοιάζει να σώσει την αξία,
απλά θέλετε να ελέγξετε την τιμή, παρατηρούμε ότι μπορούμε να γράψουμε απλά αυτό ως GetInt,
ανοιχτή παρένθεση, κοντά παρένθεση.
Η λειτουργία πρόκειται να επιστρέψει μια τιμή, όπως έχουμε πει.
Είναι πρόκειται να σας δώσει πίσω ένα int.
Και έτσι, αν σκεφτούμε διανοητικά να συμβεί αυτό,
όταν πληκτρολογείτε σε 99, GetInt επιστρέφει τον αριθμό 99,
εννοιολογικά και έτσι, είναι σαν τον κωδικό μου ήταν πραγματικά αυτό.
Έτσι, εάν 99 είναι πράγματι μεγαλύτερη από μηδέν, τότε ευγνώμων γίνει αληθής,
τότε συνειδητοποιεί γραμμή 25 ooh, τελειώσαμε επειδή είμαι ευγνώμων τώρα,
και στη γραμμή 26, θα πω απλά, "Ευχαριστώ για το θετικό ακέραιο!"
ό, τι συνέβη να είναι.
Τώρα ας κάνουμε μικρή συντακτική ζάχαρη εδώ, να το πω έτσι.
Ας δούμε αν μπορούμε να καθαρίσει αυτή τη γραμμή 25 με αυτό το τρίτο και τελευταίο παραλλαγή positive3.
>> Παρατηρήστε τη μόνη διαφορά τώρα είναι τι γραμμή κώδικα; >> [Φοιτητής] 25. >> [Malan] Ναι, 25.
Και δεν έχουμε δει πραγματικά αυτό το τέχνασμα ακριβώς ακόμα, αλλά εμείς δεν δείτε το θαυμαστικό τη Δευτέρα,
η οποία υποδηλώνει τι; >> [Φοιτητής] Δεν. Δεν >> ή άρνηση.
Πάρτε λοιπόν μια λογική τιμή και γυρίστε την αξία του.
True γίνεται ψευδής, ψεύτικος γίνεται πραγματικότητα.
Έτσι αυτό, θα ήθελα να προτείνω, είναι ακόμη λίγο πιο διαισθητικό ένας τρόπος γραφής του κώδικα
γιατί ακόμα προετοιμαστεί ευγνώμων σε ψευδείς, κάνω ακόμη τα ακόλουθα,
Έθεσα ευγνώμων για αλήθεια, όταν έρθει η ώρα,
αλλά τώρα μπορείτε πραγματικά να μεταφράσει ακριβώς αυτόν τον κώδικα προφορικά αριστερά προς τα δεξιά,
ενώ (ευγνώμων!)? επειδή κτύπημα ή θαυμαστικό υποδηλώνει την έννοια του όχι,
έτσι ενώ δεν είναι ευγνώμων.
Έτσι, και πάλι, δεν έχουμε εισάγει νέες έννοιες per se.
Μιλήσαμε για τα Boolean πίσω όταν παίξαμε με Scratch,
αλλά συνειδητοποιούν τώρα μπορούμε απλά να αρχίσετε να γράφετε κώδικα μας με πολλούς διαφορετικούς τρόπους.
Έτσι, ειδικά σε pset1 αν είστε το είδος του που αγωνίζονται να καταλάβω τον τρόπο να γράψει κάποιο πρόγραμμα,
οι πιθανότητες είναι είστε στην τύχη, διότι μπορεί να υπάρξει οποιοσδήποτε αριθμός των λύσεων
που μπορεί να συμβεί μετά.
Για παράδειγμα, αυτό είναι μόλις 3 για ακόμη και το απλούστερο των προγραμμάτων. Εντάξει.
Και τώρα θυμάμαι τη Δευτέρα φύγαμε για αυτό το σημείωμα με τις τιμές επιστροφής.
Έτσι, για πρώτη φορά γράψαμε ένα πρόγραμμα που δεν είναι μόνο να έχουν την κύρια?
έχει επίσης τη δική του προσαρμοσμένη συνάρτηση που έγραψα εδώ.
Έτσι, σε σειρά 31 έως 34 που έχω εφαρμόσει μια λειτουργία κύβο.
Δεν είναι πολύπλοκη. Είναι απλά μια * a * a σε αυτή την περίπτωση.
Αλλά αυτό που είναι σημαντικό για αυτό είναι ότι παίρνω εισόδου με τη μορφή ενός
και εγώ την επιστροφή στην παραγωγή με τη μορφή * a * a.
Έτσι, τώρα έχω τη δυνατότητα, όπως και εγώ που χρησιμοποιούνται για να με prinf μόνο,
να καλέσετε τη λειτουργία αυτή καλώντας τη λειτουργία κύβο.
>> Και η λειτουργία κύβος παίρνει κάποια δεδομένα εισόδου, και η λειτουργία κύβος επιστρέφει κάποιο αποτέλεσμα.
Αντίθετα, printf έκανε κάτι.
Δεν επιστρέφει τίποτα ότι νοιαζόμαστε για, έστω και αν ως μέρος αυτό δεν επιστρέφει μια τιμή?
απλά αγνοούν γενικά.
Printf έκανε κάτι. Είχε μια παρενέργεια της εκτύπωσης στην οθόνη.
Αντίθετα εδώ, έχουμε τη λειτουργία κύβου, η οποία επιστρέφει στην πραγματικότητα κάτι.
Έτσι, για όσους είναι εξοικειωμένοι με αυτό, είναι μια αρκετά απλή ιδέα.
Αλλά για εκείνους που είναι λιγότερο εξοικειωμένοι με την ιδέα αυτή να περάσει στις εισόδους και εξόδους πάρει πίσω,
ας προσπαθήσουμε κάτι εξαιρετικά απλό.
Είναι κανείς άνετα να ανεβαίνει στη σκηνή για λίγο;
Θα πρέπει να αισθάνονται άνετα με μια φωτογραφική μηχανή για σας επίσης. Ναι; Εντάξει.
Ποιο είναι το όνομά σου; >> [Φοιτητής] Ken. >> Ken. Εντάξει. Ken, έλα επάνω.
Ken πρόκειται να είναι μια συνάρτηση του είδους εδώ.
Ας πάμε μπροστά και να το κάνουμε αυτό. Ας πάμε λίγο φαντασία.
Χάρηκα για τη γνωριμία. Καλώς ήρθατε στο προσκήνιο. Εντάξει.
Ας χτυπήσει αυτό το κουμπί εδώ. Εντάξει.
Έτσι, εδώ έχετε ένα σύγχρονο μαυροπίνακα,
και τι είμαι είναι η κύρια λειτουργία, για παράδειγμα,
και δεν έχω ένα iPad στο χέρι μου.
>> Πραγματικά, δεν θυμάμαι πώς - Λοιπόν, δεν μπορώ να πω ότι.
Δεν έχω πραγματικά καλή γραφή,
και ως εκ τούτου έτσι θέλω να εκτυπώσετε κάτι στην οθόνη για μένα.
Είμαι είναι το κύριο πρόγραμμα, και είμαι πρόκειται να σας το πω αυτό
γράφοντας το μηδέν στο κοτόπουλο μου και στη συνέχεια περνώντας μια είσοδο σας.
Έτσι, αν και ανόητη αυτή η άσκηση είναι, η έννοια των λειτουργιών και καλώντας μια συνάρτηση
και επιστρέφει μια συνάρτηση πραγματικά βράζει κάτω σε αυτό.
Είμαι κύριος, έχω γράψει μόνο printf, παραθέτω-unquote κάτι στην οθόνη,
Τρέχω αυτό το πρόγραμμα, και το συντομότερο printf παίρνει ονομάζεται,
παίρνει ένα επιχείρημα ή μια παράμετρο μερικές φορές μεταξύ διπλά εισαγωγικά.
Εδώ είναι το επιχείρημα. Είμαι το πέρασμα στον Ken.
Είναι ένα μαύρο κουτί γραπτή κάποια αρκετά χρόνια πριν
ότι προφανώς μόνο ξέρει πώς να εκτυπώσετε τα πράγματα στην οθόνη.
Έτσι εκτελέσει.
Αυτό δεν είναι κακό. Πολύ καλό.
Έτσι τώρα ο Ken γίνεται εκτέλεσης. Μήπως πρέπει να το χέρι μου τίποτα πίσω;
Όχι ότι έχουμε δει μέχρι στιγμής.
Και πάλι, printf δεν επιστρέφει στην πραγματικότητα έναν αριθμό, αλλά θα πάμε να αγνοήσει ότι προς το παρόν
επειδή έχουμε ποτέ χρησιμοποιήσει. Έτσι, αυτό που είναι για τον Ken.
Και έτσι τώρα κύρια αναλαμβάνει τον έλεγχο του προγράμματος και πάλι
επειδή η γραμμή του κώδικα, printf, γίνεται εκτέλεσης.
Και πάμε για τον τρόπο μας, την εκτέλεση ό, τι άλλες γραμμές υπάρχουν.
Έτσι, τώρα ας προσπαθήσουμε ένα ελαφρώς διαφορετικό παράδειγμα.
Αυτή τη φορά εδώ ας ξεκαθαρίσουμε πρώτα την οθόνη, και αυτή τη φορά θα κάνουμε τη λειτουργία κοπής σε κύβους,
αλλά αυτή τη φορά, περιμένω μια τιμή εξόδου.
>> Ας προχωρήσουμε και να κάνουμε αυτό.
Τώρα έχω μια γραμμή κώδικα που λέει x παίρνει κύβο του x.
Η γραμμή του κώδικα, ανάκληση, μοιάζει με αυτό: x = κύβος (x)?
Λοιπόν, πώς είναι αυτό πρόκειται να λειτουργήσει; Ας πάμε μπροστά και να σας δώσει μια λευκή οθόνη και πάλι.
Πάω να γράψω τώρα την τιμή του x,
η οποία αυτή τη στιγμή συμβαίνει να είναι, ας πούμε, 2 για να το κρατήσει απλό.
Έχω γράψει κάτω σε ένα κομμάτι χαρτί η τιμή 2, το οποίο είναι x αξία μου.
Μου το χέρι στον Ken. >> Και γράφω απλά την απάντηση; >> Ναι, ας γράψει ακριβώς την απάντηση.
Εντάξει. Και τώρα πρέπει να επιστρέψει με κάτι. Τέλεια. Νίκαια segue.
Έτσι, τώρα τα χέρια μου πίσω την τιμή από 8 σε αυτή την περίπτωση, και τι μπορώ να κάνω με αυτό;
Στην πραγματικότητα - ας δούμε, να πάρει αυτό το δικαίωμα. Τι θα πάω να κάνω με αυτό;
Τώρα είμαι πρόκειται να λάβει αυτήν την τιμή και πραγματικά να το αποθηκεύσετε σε αυτά τα ίδια bits στη μνήμη.
Αλλά παρατηρήσετε είμαι το είδος του αγώνα εδώ.
Είμαι λίγο μπερδεμένος γιατί όπου μπορώ να γράψω πραγματικά την τιμή του x,
γιατί ό, τι έχω κάνει ακριβώς είναι φυσικά το χέρι Ken ένα κομμάτι χαρτί που είχε την τιμή 2,
που ήταν x, και πράγματι, αυτό είναι ακριβώς τι συνέβη.
Έτσι, αποδεικνύεται ότι όταν καλείτε τη λειτουργία και περνάτε σε ένα επιχείρημα
όπως γειά σου, τον κόσμο ή να περάσετε σε ένα επιχείρημα όπως είναι το 2,
γενικά, είστε περνώντας σε ένα αντίγραφο της εν λόγω επιχείρημα.
Και έτσι ακριβώς όπως έγραψα κάτω τον αριθμό 2 εδώ και παρέδωσαν στον Ken,
αυτό πρέπει να σημαίνει ότι έχω ακόμη ένα αντίγραφο του κάπου τιμή 2
διότι πράγματι, τώρα που έχω πάρει πίσω την τιμή 8, πρέπει να πάω πίσω στη μνήμη RAM
και πραγματικά γράψετε 8, όπου είχα μια φορά τον αριθμό 2.
Έτσι, οπτικά, να θυμάστε αυτή την ιδέα να περάσει σε, κυριολεκτικά, ένα αντίγραφο της αξίας.
>> Ken κάνει το πράγμα του, με τα χέρια πίσω κάτι - σε αυτή την περίπτωση μια τιμή, όπως 8 -
και στη συνέχεια, πρέπει να κάνω κάτι με αυτή την τιμή, αν θέλω να το κρατήσει γύρω.
Έτσι, όλα αυτά θα έρθει πίσω να είναι όλοι πάρα πολύ εξοικειωμένοι πριν από καιρό.
Σας ευχαριστώ πολύ για αυτό το demo, εδώ Ken. [Χειροκροτήματα]
Πολύ καλά κάνει.
Ας δούμε πώς τελικά που σχετίζεται με κάποια από τη λειτουργία καλώντας ότι έχουμε κάνει εδώ.
Επιτρέψτε μου να πάμε μπροστά και να μας φέρει πίσω στο παράδειγμα εδώ κοπής σε κύβους.
Σημειώστε ότι, αν θέλουμε πραγματικά να αρχίσετε να παίρνετε αυτό περαιτέρω,
θα πάμε να πρέπει να λαμβάνει υπόψη της το γεγονός ότι ο αριθμός x που είναι να περάσει το εδώ
είναι διαφορετική από ό, τι είναι στην πραγματικότητα που πέρασε μέσα στο λειτουργία.
Έτσι, και πάλι, αυτό το πέρασμα από το αντίγραφο πρόκειται να γίνει αρκετά γερμάνιο σε μια στιγμή.
Ας ρίξουμε μια ματιά σε κάτι που δεν εργάζονται αρκετά δεξιά ακόμα.
Πάω να πάει μπροστά και να ανοίξει ένα τρίτο παράδειγμα λάθη, που πάσχει από τη φύση,
και λέγεται buggy3 και εφαρμόζει μια εναλλαγή λειτουργίας.
Εδώ έχουμε μια κύρια λειτουργία που έχει x και y αυθαίρετα αρχικοποιείται στο 1 και 2, αντιστοίχως.
Θα μπορούσαμε να χρησιμοποιήσουμε GetInt, αλλά χρειαζόμαστε μια απλή άσκηση,
έτσι είναι δύσκολο-κωδικοποιημένα ως 1 και 2.
Στις γραμμές 21 και 22, μπορούμε προφανώς εκτυπώνει x και y, 1 ανά γραμμή.
Στη συνέχεια, στη γραμμή 23, που ισχυρίζονται είμαι εναλλαγή αυτές τις αξίες, τελεία, τελεία, τελεία.
Εγώ προφανώς καλούν σε μια λειτουργία που ονομάζεται γραμμή 24 ανταλλαγής που διαρκεί 2 επιχειρήματα.
Είναι εντελώς legit λειτουργίες για να πάρει 2 επιχειρήματα. Έχουμε δει printf το κάνει ήδη.
>> Έτσι ανταλλαγής παίρνει προφανώς x και y, και όπως υποδηλώνει το όνομά του,
Θα ήθελα να ελπίζω ότι πρόκειται να ανταλλάξει αυτά τα 2 τιμές.
Έτσι, τότε θα διεκδικήσει on line 25 "Αλλαγή εικόνων!" και εγώ επανεκτύπωση x και y
υπό την προϋπόθεση ότι έχουν πράγματι έχουν μετατραπεί.
Αλλά αν τρέξω πραγματικά αυτό το πρόγραμμα - επιτρέψτε μου να ανοίξει ένα παράθυρο τερματικού,
επιτρέψτε μου να κάνω buggy3 - όπως υποδηλώνει το όνομα, αυτό δεν πρόκειται να τελειώσει καλά
γιατί όταν χτύπησα Enter, παρατηρούμε ότι το x είναι 1, y είναι 2,
και ακόμη στο τέλος του προγράμματος, είναι ακόμα, στην πραγματικότητα, το ίδιο.
Έτσι, με βάση την επίδειξη μόλις τώρα με τον Ken, τι πραγματικά συμβαίνει;
Ας βουτιά σε αυτή τη λειτουργία swap. Είναι εξαιρετικά σύντομη. Είναι μόνο λίγες γραμμές κώδικα καιρό.
Αλλά ποιο είναι το βασικό πρόβλημα με βάση την απλή ιστορία είπε εδώ με τον Ken;
Γιατί έχει σπάσει swap;
[Φοιτητής] Είσαι αποθήκευση σε ένα αντίγραφο και όχι η μεταβλητή.
Ακριβώς. Είμαστε αποθήκευση σε ένα αντίγραφο, δεν είναι η ίδια η μεταβλητή.
Με άλλα λόγια, χρειάζεται προφανώς ανταλλαγής επιχειρημάτων 2, μια int,
και είναι αυθαίρετα ονομάζονται α και β,
και εδώ έχω περάσει σε x και y, τα οποία είναι αντίστοιχα 1 και 2,
αλλά δεν είμαι κυριολεκτικά περνώντας στο x, δεν είμαι κυριολεκτικά περνώντας y,
Είμαι περνώντας ένα αντίγραφο του x και ένα αντίγραφο του y.
Είναι σχεδόν σαν να αντιγραφεί και να επικολληθεί σε ανταλλαγή
οι τιμές που θέλετε πραγματικά να χειριστείτε.
Έτσι, αν αυτή είναι η περίπτωση, όταν η έναρξη του προγράμματος εκτέλεσης γραμμή 35 στη συνέχεια, 36,
όταν έχω στη γραμμή 37, σε αυτό το σημείο στην ιστορία, ποια είναι η αξία του ένα;
Σε αυτό το σημείο στην ιστορία, γραμμή 37, ποια είναι η αξία του ενός σε αυτό το σημείο; >> [Φοιτητής] 1.
[Malan] Θα πρέπει μόνο να είναι 1, δεξιά, επειδή x ψηφίστηκε ως το πρώτο επιχείρημα,
και αυτή η λειτουργία ακριβώς αυθαίρετα ζητά πρώτο επιχείρημα του ενός.
Ομοίως είναι y το δεύτερο επιχείρημα, και αυτό είναι ένα απλό τηλεφώνημα αυθαίρετα το δεύτερο β επιχείρημα.
>> Η διαφορά αυτή είναι στην πραγματικότητα αρκετά απλά εξήγησε. Σκεφτείτε το.
Κανείς από εμάς δεν έχουν συναντήσει το πρόσωπο που έγραψε printf,
έτσι σίγουρα, αυτός ή αυτή δεν έχει καμία ιδέα για το τι μεταβλητές μας 30 χρόνια αργότερα πρόκειται να κληθεί.
Έτσι, πρέπει να υπάρχει μια διάκριση ανάμεσα σε αυτό που αποκαλούν μεταβλητές σε συναρτήσεις είστε γραπτώς
και αυτό που εσείς ονομάζετε τις μεταβλητές σε συναρτήσεις που καλείτε ή χρήση.
Έτσι με άλλα λόγια, έχω γράψει μου ως μεταβλητές x και y,
αλλά αν κάποιος άλλος είχε γράψει τη λειτουργία ανταλλαγής, αυτός ή αυτή σίγουρα δεν θα ξέρουν
τι μου μεταβλητές πρόκειται να κληθεί,
έτσι ώστε να συνειδητοποιήσουν ότι αυτός είναι ο λόγος που έχουν αυτή τη δυαδικότητα των ονομάτων.
Τεχνικά, θα μπορούσα να κάνω αυτό από σύμπτωση,
αλλά θα εξακολουθεί να περάσει στην ως αντίγραφα.
Θα ήταν απλώς να είναι μια καθαρή σύμπτωση αισθητικά αν το πρόσωπο που έγραψε ανταλλαγής
είχε χρησιμοποιήσει τα ίδια ονόματα.
Έτσι, σε αυτό το σημείο στην ιστορία, γραμμή 37, είναι 1, β είναι 2, και τώρα θα προχωρήσει για να τους ανταλλάξουν.
Πρώτα απ 'όλα, επιτρέψτε μου να κάνω πραγματικά αυτό πολύ πιο απλά.
Δεν ξέρω ποιοί είναι αυτοί οι 3 γραμμές του κώδικα έκαναν.
Επιτρέψτε μου να κάνω ακριβώς αυτό: b = a? A = b? Γίνει.
Γιατί αυτό είναι σπασμένο, λογικά;
Είναι το είδος της διαισθητικής πράγμα, έτσι δεν είναι;
Έτσι, γίνεται ένα b και b γίνεται,
αλλά το πρόβλημα είναι ότι το συντομότερο γραμμή 37 εκτελεί, ποια είναι η αξία του ενός και β;
Το ίδιο, 1, επειδή έχετε clobbered, να το πω έτσι, έχετε αλλάξει β να ισούται με ένα.
Έτσι, μια φορά γραμμή 37 έχει εκτελέσει, αυτό είναι υπέροχο, τώρα έχετε 2 αντίγραφα του τον αριθμό 1
μέσα από αυτή τη λειτουργία, έτσι ώστε στη συνέχεια, όταν λέτε στην γραμμή 38 α = β,
είστε το είδος του βιδωθεί επειδή είστε ανάθεση μόλις 1 προς 1.
Έχετε είδος χάσει την αξία που νοιαζόταν για.
Έτσι, στην αρχική εκδοχή του αυτό, παρατηρήστε τι έκανα.
Είχα αντ 'αυτού μια τρίτη γραμμή του κώδικα που έμοιαζε με αυτό.
Δηλώνω μια προσωρινή μεταβλητή.
>> Tmp είναι ένα πολύ κοινό όνομα για μια προσωρινή μεταβλητή, και αυτό είναι ένα int
γιατί πρέπει να ταιριάζει με αυτό που θέλω να κάνω ένα αντίγραφο του.
Έχω αποθηκεύσει αντίγραφο στο εσωτερικό του tmp, έτσι μόλις γραμμή 37 έχει εκτελεστεί,
η τιμή του α είναι - γρήγορος έλεγχος λογικότητα - 1, η τιμή του b είναι 2,
και η τιμή του tmp είναι επίσης 1.
Έτσι, τώρα έχω εκτελέσει γραμμή 38.
Μόλις γραμμή 38 εκτελεί, ένα παίρνει την τιμή του b. Και ήταν 2 β, έτσι, ένα είναι τώρα 2.
Έτσι, σε αυτό το σημείο στην ιστορία, ένα είναι 2, b είναι 2, και tmp είναι 1,
έτσι και τώρα λογικά, μπορούμε αξία μόνο tmp γδούπο του σε β και τελειώσαμε.
Έτσι έχουμε λύσει αυτό το πρόβλημα.
Δυστυχώς, όταν εγώ τρέχω αυτό το πρόγραμμα σε αυτή τη μορφή, δεν αλλάζετε πραγματικά οποιεσδήποτε αξίες.
Αλλά για να είναι σαφής, γιατί;
I σταθερό το λογικό πρόβλημα από μόλις πριν από λίγο,
αλλά και πάλι, αν εκτελέσετε αυτό το πρόγραμμα, x και y παραμένουν αμετάβλητες
μέχρι το τέλος της εκτέλεσης του προγράμματος.
[Ακούγεται σχόλιο φοιτητής] >> Δεν έχουν επιστρέψει τίποτα, έτσι αυτό είναι αλήθεια.
Αλλά αποδεικνύεται ότι υπάρχει ένα μικρό πρόβλημα εδώ, γιατί μέχρι τώρα,
το μόνο πράγμα που έχουν βρεθεί εκεί σε θέση να επιστρέψει είναι ένα πράγμα, και αυτό είναι ένας περιορισμός του C.
Μπορείτε να επιστρέψετε μόνο πραγματικά μία τιμή, οπότε είμαι το είδος του κολλήσει εδώ
γιατί θα μπορούσε να επιστρέψει τη νέα τιμή του x ή θα μπορούσε να επιστρέψει τη νέα τιμή του y,
αλλά θέλω τόσο πίσω.
Έτσι επιστρέφοντας δεν είναι η απλή λύση εδώ.
Αλλά το πρόβλημα είναι ουσιαστικά ο λόγος; Τι έχουμε πραγματικά αντάλλαξαν;
[Φοιτητής] a και b. >> A και b.
Αλλά α και b είναι αντίγραφα των χ και γ, που σημαίνει ακριβώς κάναμε όλες αυτές τις εργασίες,
περάσαμε μόλις 3 λεπτά μιλώντας για τη λειτουργία ανταλλαγής και τα 3 από αυτές τις μεταβλητές,
και ότι είναι μεγάλη, απολύτως σωστό σε απομόνωση,
αλλά και το πεδίο εφαρμογής β είναι μόνο σε αυτές τις γραμμές εδώ.
>> Έτσι ακριβώς όπως ένα για βρόχο, αν κηρύξει έναν ακέραιο i στο εσωτερικό του για το βρόχο,
Ομοίως, εάν μια δήλωση και β μέσα από μια λειτουργία που έχετε γράψει,
από όπου και αν ισχύει μόνο στο εσωτερικό του εν λόγω λειτουργία, που σημαίνει το συντομότερο ανταλλαγής γίνεται εκτέλεση
και πάμε από τη γραμμή 24 προς τη γραμμή 25, χ και γ δεν έχουν μεταβληθεί καθόλου.
Θα χάσει μόλις ένα σωρό χρόνο ανταλλάσσοντας τα αντίγραφα των μεταβλητών.
Έτσι αποδεικνύεται ότι η λύση σε αυτό είναι πράγματι μη-προφανείς.
Δεν είναι αρκετά επαρκής για να επιστρέψουν οι τιμές, γιατί μπορούμε να επιστρέψουμε μόνο 1 τιμή,
και εγώ πραγματικά δεν θέλουν να ανταλλάξουν τα δύο x και y την ίδια στιγμή,
έτσι θα πάμε να πρέπει να επανέλθουμε σε αυτό.
Αλλά για τώρα, συνειδητοποιούν ότι το ζήτημα ουσιαστικά προέρχεται από το γεγονός ότι οι α και β είναι αντίγραφα
και είναι στο δικό τους πεδίο.
Ας προσπαθήσουμε να λύσουμε αυτό με κάποιο τρόπο.
Επιτρέψτε μου να μετακινηθείτε προς τα πίσω στην πραγματικότητα εδώ και να ανοίξει, ας πούμε, μια τέταρτη παραλλαγή αυτού, buggy4.
Τι γίνεται με αυτό;
Αυτό είναι ένα παρόμοιο αλλά απλούστερο πρόβλημα να εξετάσουμε πριν λάβουμε μια μαχαιριά στην επίλυση του προβλήματος.
Αυτό το πρόγραμμα ονομάζεται αύξηση, και αυτό προφανώς προετοιμάζει έναν ακέραιο x και 1 στη γραμμή 18.
Στη συνέχεια ισχυρίζονται x είναι 1, τότε θα διεκδικήσει «Προσαύξηση ..."
Καλώ λοιπόν αύξηση, αλλά στη συνέχεια στις γραμμές 22 και 23, που ισχυρίζονται ότι είναι ήδη αυξάνεται,
Ισχυρίζομαι x είναι τώρα ό, τι είναι - 2, προφανώς - αλλά αυτό το πρόγραμμα είναι λάθη.
Ποιο είναι το πρόβλημα;
Ναι. >> [Ακούγεται ανταπόκριση των φοιτητών] >> Ακριβώς.
Έτσι x έχει δηλωθεί, προφανώς, στη γραμμή 18.
Αυτό είναι μέσα σε αγκύλες κύριο του.
Έτσι, η απλή απάντηση εδώ είναι ότι ενώ υπάρχει x εδώ,
δεν υπάρχει στη γραμμή 32, έτσι ώστε το πρόγραμμα αυτό στην πραγματικότητα δεν θα είναι καν σύνταξη.
Ο compiler όταν προσπαθήσετε να χτίσετε τον κωδικό αυτό πρόκειται να μου φωνάζεις
για κάποιο αναγνωριστικό της αδήλωτης ή κάτι για το σκοπό αυτό. Στην πραγματικότητα, ας προσπαθήσουμε.
Αυτό είναι να buggy4. Εκεί είναι.
Η χρήση του «x» της αδήλωτης αναγνωριστικό στη γραμμή 32.
Και πραγματικά, ας είναι πιο σαφής εδώ σήμερα, έτσι ώστε αυτό είναι χρήσιμο
σε ώρες γραφείου και στο σπίτι.
>> Σημειώστε ότι είναι λίγο κρυφά γραμμένο.
Αλλά το γεγονός ότι έχει Clang φώναξε σε μας, λέγοντας buggy4.c: 32:5, είναι πραγματικά χρήσιμο.
Αυτό σημαίνει ότι το σφάλμα είναι στη γραμμή 32 στη θέση 5 χαρακτήρων.
Έτσι 1, 2, 3, 4, 5. Αυτό είναι, στην πραγματικότητα, όπου το πρόβλημα είναι.
Και επίσης, πάρα πολύ, να έχετε κατά νου σε ώρες γραφείου και στο σπίτι, είμαι τυχερός εδώ.
Έχω ένα λάθος. Είναι πρόκειται να είναι σχετικά εύκολο να καθοριστεί.
Αλλά αν μπορείτε να πάρετε μια ολόκληρη οθόνη με συντριπτική μηνύματα λάθους,
και πάλι να συνειδητοποιήσουμε ότι η κατώτατη θα μπορούσε κανείς να είναι απλά συμπτωματική του ανώτατου ένα.
Έτσι, πάντα να κυνηγήσει σφάλματα σας από πάνω προς τα κάτω
επειδή μπορεί να υπάρχει μόνο ένα αποτέλεσμα να είναι αλυσιδωτή
που προτείνει τον τρόπο έχετε περισσότερα προβλήματα από ό, τι στην πραγματικότητα κάνει.
Λοιπόν, πώς θα μπορούσαμε να το διορθώσω αυτό, αν ο στόχος μου είναι να αυξήσετε x; >> [Φοιτητής] Κάντε x παγκόσμια.
Εντάξει, έτσι μπορούμε να κάνουμε x παγκόσμια.
Ας πάρουμε τη συντόμευση που είχα προειδοποιήσει για νωρίτερα, αλλά καλό, χρειαζόμαστε μόνο μια γρήγορη λύση,
έτσι ας πούμε int x μέχρι εδώ. Αυτό κάνει την παγκόσμια x.
Έτσι τώρα έχει κύρια πρόσβαση σε αυτό και αύξηση έχει πρόσβαση σε αυτό,
και έτσι επιτρέψτε μου να προχωρήσει και να συγκεντρώσει αυτό τώρα.
Κάντε buggy4, Enter. Φαίνεται να συγκεντρώσει τώρα.
Ας τρέξει buggy4. Και αυτό φαίνεται να λειτουργούν πραγματικά.
Αυτό είναι ένα από αυτά τα πράγματα που κάνω είναι αυτό που λέω, όχι όπως κάνω εγώ,
όπως έχω κάνει εδώ ακριβώς, γιατί σε γενικές γραμμές,
προγράμματά μας πρόκειται να πάρει πολύ πιο ενδιαφέρουσα και πολύ περισσότερο από αυτό,
και αν σας λύση για τα προβλήματα της ζωής είναι απλά βάλτε όλες τις μεταβλητές στην κορυφή του αρχείου σας,
πολύ γρήγορα να πάρει τα προγράμματα τρομακτικά δύσκολο να διαχειριστεί.
Παίρνει πιο δύσκολο να σκεφτούμε νέες ονόματα μεταβλητών,
γίνεται πιο δύσκολο να καταλάβουμε τι μεταβλητή κάνει ό, τι,
και έτσι σε γενικές γραμμές, αυτό δεν είναι μία καλή λύση.
Ας κάνουμε αυτό καλύτερα.
Δεν θέλετε να χρησιμοποιήσετε μια καθολική μεταβλητή εδώ.
>> Θέλω να αυξήσετε x, οπότε θα μπορούσα προφανώς -
Στο τέλος της ημέρας, αυτό είναι το είδος της μια ανόητη ιστορία, γιατί κάνουμε ακριβώς αυτό -
αλλά αν δεν ήξερα για τον συγκεκριμένο φορέα εκμετάλλευσης ή δεν είχα τη δυνατότητα να το αλλάξετε σε κεντρικό ίδια,
πώς αλλιώς θα μπορούσα να εφαρμόσω Ken εδώ αυτή τη φορά να μην κύβο, αλλά να αυξήσετε;
Πώς μπορώ να αλλάξω αυτό το πράγμα εδώ; Ναι.
[Φοιτητής] Πέρασμα στο x και στη συνέχεια επιστρέφουν [δεν ακούγεται] >> Εντάξει, καλά.
Γιατί λοιπόν να μην έχω περάσει στο x και στη συνέχεια, αντί να επιστρέψει,
γιατί δεν μπορώ απλά να επιστρέψει x + 1.
Ένα ζευγάρι περισσότερα πράγματα πρέπει να αλλάξουν εδώ. Είμαι στο σωστό δρόμο.
Τι άλλο πρέπει να κάνω για να τσιμπιά; Κάποιος άλλος. Ναι.
[Ακούγεται ανταπόκριση των φοιτητών]
Πρέπει να αλλάξω τον τύπο επιστροφής της αύξησης επειδή δεν είναι άκυρη.
Void δεν σημαίνει τίποτα είναι να επιστρέψει, αλλά σαφώς είναι τώρα,
έτσι αυτό πρέπει να αλλάξει στο - >> [φοιτητής] int.
int να είναι συνεπής με ό, τι είμαι πραγματικά επιστρέφουν.
Τώρα κάτι άλλο είναι ακόμα εδώ λάθη. Ναι.
[Ακούγεται ανταπόκριση των φοιτητών] >> [Malan] Γι 'αυτό πρέπει να αυξήσετε x;
[Ακούγεται ανταπόκριση των φοιτητών] >> [Malan] Αχ, γι 'αυτό πρέπει να περάσει x.
Γι 'αυτό και πρέπει να το κάνουμε αυτό εδώ. >> [Ακούγεται σχόλιο φοιτητής]
[Malan] Έτσι, το πρωτότυπο, πρέπει να αλλάξει αυτό μέχρι εδώ.
Έτσι, αυτό πρέπει να γίνει ένας int, αυτό πρέπει να γίνει -
Χμμ, έχω πραγματικά ένα bug εδώ κάτω. Ας διορθώσετε αυτό ένα πρώτο.
Τι θα πρέπει πραγματικά να είναι αυτό; Είναι πήρε να είναι ένα int κάτι.
Θα μπορούσε να είναι x, αλλά ειλικρινά, αν ξεκινήσετε καλώντας όλες τις μεταβλητές x σας,
πρόκειται να πάρουν όλο και λιγότερο σαφές ποιο είναι ποιο.
>> Έτσι, ας επιλέγουν αυθαίρετα ένα διαφορετικό σύμβαση ονομασίας για τις λειτουργίες βοηθός μου,
οι λειτουργίες που γράφω. Θα το ονομάσουμε ένα, ή θα μπορούσαμε να το ονομάσουμε -
Ας το ονομάσουμε αριθμός να είναι ακόμη πιο σαφής.
Μέχρι τότε θα πρέπει να επιστρέψει ό, τι ο αριθμός είναι συν 1,
και τώρα πρέπει να αλλάξω 1 άλλο πράγμα εδώ και κάτι άλλο εδώ.
Τι πρέπει να αλλάξει στην γραμμή 21 πρώτα; >> [Ακούγεται ανταπόκριση των φοιτητών]
[Malan] Έχω να αναθέσει στο x. Δεν μπορώ να καλέσετε μόνο αύξηση (x).
Πρέπει να θυμηθώ την απάντηση, αλλάζοντας την τιμή του x για την αριστερή πλευρά.
Και ακόμα κι αν το x είναι τώρα στα αριστερά και δεξιά, αυτό είναι εντελώς πρόστιμο
επειδή η δεξιά πλευρά παίρνει εκτελείται πρώτη, τότε παίρνει plopped στην αριστερή πράγμα -
χ στην περίπτωση αυτή.
Και στη συνέχεια, τέλος, αυτό είναι μια εύκολη αποτύπωση τώρα.
Αυτό ακριβώς θα πρέπει να ταιριάζει με αυτό που είναι κάτω, int αριθμό.
Έτσι, ένα σωρό αλλαγές για ένα πραγματικά ηλίθιο λειτουργία
αλλά εκπρόσωπος των πραγμάτων που θα όλο και περισσότερο θέλουμε να κάνουμε.
Έτσι, βεβαιωθείτε buggy4. Έχω μαντάρα κάπου.
Ω, Θεέ μου. Πέντε λάθη σε ένα πρόγραμμα 6-line.
Έτσι τι είναι λάθος στη γραμμή 18, χαρακτήρα 5;
Γι 'αυτό και πρέπει να δηλώνουν αυτό, int.
Ας δούμε. Υπάρχουν ένα σωρό άλλα σφάλματα.
Ω, Θεέ μου - 19, 18, 21 - αλλά και πάλι, ας ξεκαθαρίσουμε λίγο την οθόνη, L Ελέγχου εδώ,
και επανάληψη Clang.
Έτσι 5 προβλήματα είναι πραγματικά ακριβώς ότι: 1.
Έτσι τώρα ας τρέξει buggy4, Enter. Ουφ, χ έχει αυξάνεται σωστά.
Εντάξει. Οποιεσδήποτε ερωτήσεις σχετικά με το πώς να αυξήσετε τους αριθμούς; Ναι.
[Ακούγεται ερώτηση φοιτητή] >> Καλή ερώτηση.
Πώς είναι ότι μπορώ να αλλάξω μόνο x με τον αριθμό και το πρόγραμμα θα γνωρίζουν αμέσως;
>> Και πάλι, σκεφτείτε το σαν αυτό αφαίρεση.
Έτσι, αν είμαι κύριος και ο Ken είναι αύξηση, ειλικρινά, δεν με νοιάζει τι Ken καλεί iPad του.
Δεν με νοιάζει ό, τι ο ίδιος αποκαλεί κάτι που έχει να κάνει με την εφαρμογή του από αυτή τη λειτουργία.
Αυτή είναι μια λεπτομέρεια εφαρμογής που έχω, κύρια, δεν χρειάζεται να νοιάζονται για.
Και έτσι απλά αλλάζουν συνεχώς μέσα από τη λειτουργία - αριθμός εδώ και εδώ τον αριθμό -
είναι το μόνο που χρειάζεται τόσο πολύ όπως εγώ ξαναμεταγλωττίσετε.
Είναι το είδος του αρέσει, αν νομίζετε ότι για πολλούς από εμάς, όσοι από εσάς με τις άδειες οδήγησης
που έχουν οδηγήσει ή εάν έχετε ακόμα οδηγείται σε ένα αυτοκίνητο,
οι περισσότεροι από εμάς δεν έχουν ιδέα για το πώς λειτουργεί ένα αυτοκίνητο κάτω από το καπό.
Και κυριολεκτικά, αν ανοίξετε το καπό, οι περισσότεροι από μας - συμπεριλαμβανομένου και εμού -
δεν πρόκειται να ξέρει πραγματικά τι ψάχνουμε σε,
είδος του, όπως μπορεί να νιώσετε με πράγματα όπως το δικαίωμα αυτό τώρα.
Αλλά εμείς δεν πρέπει πραγματικά να φροντίσει πώς λειτουργεί το αυτοκίνητο,
δεν έχουμε να ενδιαφέρει τι όλες τις ράβδους και τα έμβολα και τα καλώδια στο εσωτερικό του αυτοκινήτου
Τα πραγματικά κάνει.
Έτσι, κάτι σαν αυτό που εσείς ονομάζετε το έμβολο δεν έχει σημασία εδώ σε αυτή την περίπτωση. Η ίδια ιδέα.
Ναι. >> [Ακούγεται ερώτηση φοιτητή]
Εάν υπάρχουν περισσότερες χρήσεις της μεταβλητής στιγμή xa πριν,
εσείς, ο προγραμματιστής, θα πρέπει να τα αλλάξει παντού.
Ή θα μπορούσατε να κάνετε κυριολεκτικά αρχείου, Μενού, και στη συνέχεια, Εύρεση, Αντικατάσταση - κάτι τέτοιο -
αλλά θα έχετε την ευκαιρία να χρειαστεί να κάνετε τον εαυτό σας αυτές τις αλλαγές.
Θα πρέπει να είναι συνεπής. >> [Φοιτητής] Εάν υπάρχουν πολλές μεταβλητές [δεν ακούγεται]
Μια συγκεκριμένη σειρά, όπως εδώ, αν αυτό ήταν int έναν άλλο αριθμό; >> [Φοιτητής] Σωστό.
[Malan] Ναι. Παραγγελία σημασία όταν καλείτε τη λειτουργία.
>> Έτσι, αν ζητούσαν αύξηση εδώ με κάτι κόμμα κάτι,
υπάρχει μια άμεση χαρτογράφηση.
Η πρώτη μεταβλητή, ό, τι λέγεται, γίνεται ένα αντίγραφο από το πρώτο επιχείρημα εδώ.
Λυπάμαι. Αυτό δεν θα πρέπει να είναι μια παρένθεση.
Οι δεύτερες γραμμές επιχείρημα επάνω με το δεύτερο. Έτσι ώστε, ναι, θέματα. Εντάξει.
Λυπάμαι. Πήρα το μακρύ δρόμο για να φτάσετε εκεί. Άλλες ερωτήσεις; Εντάξει.
Ας δούμε λοιπόν αν δεν μπορούμε να ζωγραφίσει μια εικόνα του τι πραγματικά συμβαίνει εδώ
κάτω από την κουκούλα, να το πω έτσι.
Πρόκειται για ένα ορθογώνιο που θα μπορούσαν να αντιπροσωπεύουν τη μνήμη του υπολογιστή σας.
Ακόμα κι αν δεν έχετε καμία ιδέα για το πώς λειτουργεί η μνήμη RAM ή πώς λειτουργεί,
τουλάχιστον ας υποθέσουμε ότι έχετε τσαμπιά από αυτό αυτές τις μέρες.
Έχετε megabytes από αυτό, έχετε gigabytes του,
και γνωρίζουμε από εβδομάδα 0 ότι ένα byte είναι ακριβώς αυτό; >> [Φοιτητής] 8 bits.
8 bits, έτσι δεν είναι; So 8 μηδενικά και 1.
Έτσι, αν ο υπολογιστής σας έχει ένα gig του RAM, 2 συναυλίες των RAM αυτές τις μέρες,
έχετε ένα δισεκατομμύριο ή 2 δις bytes της μνήμης ή περίπου 8 δισ. ευρώ ή 16 δισεκατομμύρια bits
στο εσωτερικό του υπολογιστή σας.
Σε αντίθεση με το μικρό παράδειγμα Wooly Willy, δεν είναι μαγνητικά σωματίδια συνήθως πια.
Όλο και περισσότερο - σε φορητούς υπολογιστές τουλάχιστον - είναι solid state drives, SSDs,
που έχουν μόνο δεν έχουν κινούμενα μέρη. Είναι όλα ηλεκτρονικά. Είναι όλα ηλεκτρικής ενέργειας που βασίζονται.
Έτσι σκέφτονται αυτό το ορθογώνιο, όπως ακριβώς αντιπροσωπεύουν τα 1 ή 2 gigabytes μνήμης που έχετε.
>> Γι 'αυτό είναι ένα κομμάτι της μνήμης.
Ο κόσμος της επιστήμης των υπολογιστών έχει το είδος του διαμοιράζεται off
κομμάτια της μνήμης να κάνει διαφορετικά πράγματα.
Για παράδειγμα, αν αυτό είναι μνήμη RAM του υπολογιστή σας, όπως προτείνεται από το ορθογώνιο εκεί,
αποδεικνύεται ότι η σύμβαση, στην κορυφή της RAM σας, να το πω έτσι,
είναι γενικά αυτό που ονομάζεται ένα τμήμα κειμένου.
Αυτοί είναι οι 0s και 1s ότι έχετε φτιάξει.
Έτσι, όταν έχουμε εξετάσει κάτω από την κουκούλα σε ό, τι a.out είναι,
όλα αυτά 0s και 1s, όταν εκτελείτε ένα πρόγραμμα,
εκείνοι 0s και 1s φορτώνονται από τον σκληρό δίσκο σας σε κάτι που ονομάζεται RAM,
και στη RAM όπου και αν τεθεί στην κορυφή.
Εν τω μεταξύ, έχετε άλλα πράγματα: την αρχικοποίηση των δεδομένων, κατάργησε την προετοιμασία των δεδομένων.
Αυτές οι 2 δρεπανιές της μνήμης αναφέρονται σε καθολικές μεταβλητές, οι οποίες δεν χρησιμοποιούν συχνά
αλλά μερικές φορές αν το κάνετε, καταλήγουν εκεί, καθώς και.
Στη συνέχεια, υπάρχει κάποια άλλα πράγματα: μεταβλητές περιβάλλοντος, το οποίο δεν θα περνούν πολύ χρόνο για,
αλλά στη συνέχεια 2 σημαντικά πράγματα που θα έρθει πίσω σε όλο το εξάμηνο,
στοίβα και σωρού.
Έτσι, οι περισσότεροι από τη μνήμη του υπολογιστή σας διατηρούνται κατά την εκτέλεση ενός προγράμματος
για κάτι που ονομάζεται τη στοίβα και κάτι που ονομάζεται το σωρό.
Εμείς δεν πρόκειται να μιλήσουμε για το σωρό σήμερα, αλλά θα μιλήσουμε για τη στοίβα.
Η στοίβα έχει ως στόχο να πλάθω την οπτική των δίσκοι γεύμα τραπεζαρία αίθουσα στο Σπίτι Mather
ή όπου κι αν τυχαίνει να είναι όπου το προσωπικό τραπεζαρία τον καθαρισμό τους κάθε μέρα,
Τους στιβάζω από το δάπεδο μέχρι την,
και ομοίως, στη μνήμη, υπάρχει η ιδέα της τοποθέτησης κάτι σε μια στοίβα,
βάζοντας κάτι σε μια στοίβα, βάζοντας κάτι σε μια στοίβα.
Και τι εννοούμε με αυτό;
>> Ας ζουμ σε μόλις κάτω μισό αυτής της εικόνας, μνήμη RAM του υπολογιστή σας,
να προτείνω τα ακόλουθα.
Αποδεικνύεται ότι όταν εκτελείτε ένα πρόγραμμα όπως το a.out ή γειά σου -
ό, τι το πρόγραμμα είναι ότι έχετε γράψει -
πάλι, εκείνοι 0s και 1s έχουν φορτωθεί από το σκληρό σας δίσκο, που είναι μακροχρόνια αποθήκευση,
μένει εκεί ακόμα και όταν τραβάτε το βύσμα, φορτώνονται στη μνήμη RAM.
RAM είναι ταχύτερη από ό, τι σκληρούς δίσκους - είναι μικρότερη από σκληρούς δίσκους -
αλλά αυτό είναι όπου ζουν τα προγράμματα, ενώ είστε τους λειτουργία.
Έτσι, κάνετε διπλό κλικ σε ένα πρόγραμμα σε έναν υπολογιστή Mac ή PC, είναι φορτωμένο από το σκληρό δίσκο στη μνήμη RAM.
Από τη στιγμή που είναι φορτωμένο στη μνήμη RAM, η 0s και 1s πάει στην κορυφή τρόπο,
το λεγόμενο τμήμα κειμένου, αλλά στη συνέχεια, μόλις το πρόγραμμά σας αρχίζει πραγματικά το τρέξιμο,
η κύρια λειτουργία ονομάζεται, και κυρίως, όπως είδαμε, έχει συχνά τοπικές μεταβλητές,
και έχει ints και strings και χαρακτήρες και τα παρόμοια.
Έτσι, αν το πρόγραμμά σας ότι έχετε γράψει ή το πρόγραμμα που έχετε διπλό κλικ
χρησιμοποιούνται κάποιες μεταβλητές μέσα από τις κύριες,
καταλήγουν στο κάτω μέρος του stack σας της μνήμης, να το πω έτσι.
Πιο συγκεκριμένα, τι ακριβώς σημαίνει αυτό;
Αυτό σημαίνει απλά ότι αν επρόκειτο να τον αριθμό των bytes της μνήμης RAM στον υπολογιστή σας,
παρατηρήσετε ότι αυτό μπορεί να είναι αριθμός 0 byte, αυτό θα μπορούσε να είναι byte αριθμός 1, 2, 3, 4, 5, 6,
σε όλη τη διαδρομή έως 2 δισ. θα είναι σε όλη τη διαδρομή μέχρι εκεί στην κορυφή.
Έτσι με άλλα λόγια, όταν μιλάμε για τη μνήμη RAM ή από την άποψη των bytes,
αυτό σημαίνει απλά ότι κάποιος έχει αποφασίσει τι πρέπει να αριθμήσετε κάθε ένα από αυτά κομμάτια της μνήμης.
Έτσι, όταν θα πρέπει να έχετε 32 bit για έναν int ή χρειάζεστε 8 bits για ένα char,
πού καταλήγουν στη μνήμη;
>> Εννοιολογικά, το μόνο που καταλήγουν στο κάτω μέρος του αυτό το πράγμα που ονομάζεται στοίβα.
Αλλά αυτό που είναι ενδιαφέρον είναι τώρα, όταν κύρια καλεί μια λειτουργία -
ας υποθέσουμε ότι μια λειτουργία που ονομάζεται foo, μόλις ένα αυθαίρετο όνομα -
αυτό που συμβαίνει είναι κύρια είναι στο κάτω μέρος της στοίβας αυτής της μνήμης?
foo τώρα τίθεται στην κορυφή των κύριων στη μνήμη.
Έτσι, τυχόν τοπικές μεταβλητές που foo έχει καταλήξει είδος εννοιολογικά πάνω από αυτές σε κύρια.
Αν foo καλεί μια άλλη λειτουργία που ονομάζεται μπαρ, οι μεταβλητές καταλήγουν εδώ.
Εάν η γραμμή καλεί κάτι άλλο, εδώ, εδώ, εδώ.
Έτσι, αυτό που είναι ενδιαφέρον σχετικά με την εκτέλεση ενός προγράμματος είναι ότι σας καλούν συναρτήσεις
και όπως αποκαλούν οι λειτουργίες και λειτουργίες, όπως οι λειτουργίες κλήση λειτουργιών,
θα δημιουργηθεί αυτό το σωρό των λειτουργιών στη μνήμη.
Και μόνο μια φορά επιστρέφει λειτουργία να ξεκινήσει να πάρει πίσω αυτή τη μνήμη.
Έτσι, ένας από τους ευκολότερους τρόπους για να ξεμείνει από μνήμη σε ένα πρόγραμμα υπολογιστή
είναι να γράψει λειτουργίες που να μην επιστρέψει ποτέ.
Έτσι, για παράδειγμα, ας αποδείξει τόσο με ένα σκόπιμα λάθη πρόγραμμα.
Επιτρέψτε μου να προχωρήσει και να συμπεριλάβει # ,
int main (void),
και πάω να κάνω, ενώ (2> 1), η οποία κατά πάσα πιθανότητα δεν θα αλλάξει ποτέ για μας,
και επιτρέψτε μου να προχωρήσουμε και να κάνουμε τώρα printf.
Στην πραγματικότητα, αυτό πρόκειται να είναι λιγότερο ενδιαφέρουσα οπτικά. Ας το κάνουμε αυτό.
Για int i = 0? I> 0 - ας κάνουμε αυτό το λάθος - i + +.
Και ας μην printf εδώ. Ας πράξη αυτό που κηρύττει.
Ας ρίξουμε μια μέθοδο, εδώ χορωδία κενό, και εμείς θα πούμε int i,
και στη συνέχεια, Πάω να πω printf - όχι, ας κάνουμε αυτό πιο ενδιαφέρουσα.
Ας μην τυπώσει πραγματικά τίποτα καθόλου. Ας κάνουν ακριβώς αυτό: χορός (i).
Εντάξει. Έτσι, αυτό είναι προβληματικό, διότι ο λόγος;
Κάνω αυτό ως πάω γιατί το πρόγραμμα δεν κάνει πραγματικά τίποτα ενδιαφέρον.
>> Αλλά αυτό δεν είναι ο στόχος.
Ο στόχος είναι να γράψετε ένα πρόγραμμα, του οποίου η κύρια λειτουργία κάνει τι, προφανώς;
Καλέστε το ίδιο. Και στην πραγματικότητα, δεν χρειαζόμαστε το βρόχο.
Ας απλοποιήσει ακόμα και αυτό μόνο και μόνο για να μην χάσουμε από τα μάτια του πραγματικά το θεμελιώδες σφάλμα.
Κύρια κλήσεις χορωδία να τραγουδήσει κάποια χορωδία,
τότε έκανα κάτι ηλίθιο και είχα χορωδία Chorus Call
γιατί νόμιζα ότι κάποιος άλλος θα το εφαρμόσουν ίσως,
και τώρα αυτό δεν πρόκειται να συγκεντρώσει ακόμα. Πρέπει να κάνουμε ό, τι;
Χρειάζομαι το πρωτότυπο, θυμάται.
Γι 'αυτό πρέπει να έχουμε εδώ χορωδία άκυρη (int i)?
Έτσι τώρα, αν πάω εδώ κάτω - στην πραγματικότητα, ας χρησιμοποιήσουμε το μεγαλύτερο παράθυρο.
Ας πάμε μπροστά και να κάνουν χορωδία.
Η χρήση της αδήλωτης αναγνωριστικό i.
Ω, αυτό ήταν ηλίθιο. Δεν χρειαζόμαστε το επιχείρημα. Ας το κάνουμε αυτό.
Μακάρι να είχε αρχίσει με αυτόν τον τρόπο. Θα ήταν πολύ πιο εύκολο να γράψει το πρόγραμμα.
. Υπάρχει Τώρα ας πάμε πάνω στο παράθυρο του τερματικού μου, επανάληψη Clang, και εδώ πάμε.
Αυτό ήταν πραγματικά γρήγορα.
Τι πραγματικά συνέβη ακριβώς, όμως;
Λοιπόν, τώρα εγώ θα προσθέσω τη γραμμή εκτύπωσης έτσι μπορούμε να δούμε.
Επιτρέψτε μου να πω printf ("είμαι εδώ") - δεν μεταβλητές. Θα το αφήσουμε έτσι.
Επιτρέψτε μου να κάνω επανάληψη. Επιτρέψτε μου επανάληψη χορωδία.
Και ... έλα. Συνεχίστε.
Ως μέρος, γιατί δεν έχει συνετρίβη ακόμα;
Το σφάλμα καταμερισμού που συνέβη πριν από πολύ γρήγορο.
[Ακούγεται ανταπόκριση των φοιτητών] >> Ακριβώς. Γι 'αυτό χρειάζεται χρόνος για να εκτυπώσετε, έτσι δεν είναι;
Χρειάζονται μόνο περισσότερη δουλειά από την πλευρά του υπολογιστή.
Και εκεί είναι: Τμηματοποίηση σφάλμα.
>> Έτσι παρατηρήσετε πόσο γρήγορα τρέχουν προγράμματα.
Αν δεν είστε εκτύπωση κάτι, σούπερ γρήγορο.
Αλλά έχουμε ακόμα αυτό το σφάλμα κατάτμησης, επειδή ό, τι συνέβαινε;
Εάν σκέφτεστε για το πώς η μνήμη του υπολογιστή σας είναι που έξω,
αυτό συμβαίνει να είναι το κύριο, αλλά εδώ ας την ονομάσουμε ακριβώς αυτό το χορό, και ας την ονομάσουμε αυτή την χορωδία.
Και τώρα αν κάνω αισθητική μου δικαίωμα, αυτό ακριβώς πρόκειται να πω χορωδία, χορωδία, χορωδία,
χορός, χορός, χορός, χορός, nauseum αγγελία, και τελικά, τι πρόκειται να συμβεί;
Αν η μεγάλη εικόνα, στην κυριολεξία, είναι αυτό, τι ακριβώς συμβαίνει εννοιολογικά;
Οι υπερβάσεις στοίβα του σωρού.
Ή, ακόμα χειρότερα, μπορείτε πάντα απλά υπέρβαση, συμπεριλαμβανομένου του τμήματος κειμένου,
η οποία είναι η 0s και 1s που αντιπροσωπεύουν το πρόγραμμά σας.
Εν ολίγοις, αυτό είναι απλά σούπερ, σούπερ κακός.
Το πρόγραμμά σας έχει κινηθεί σπειροειδώς εκτός ελέγχου.
Είσαι με τον τρόπο περισσότερη μνήμη από ό, τι προορίζεται
όλα εξαιτίας ενός ηλίθιου λάθος σε αυτή την περίπτωση,
ή στην περίπτωση αυτή μια πολύ σκόπιμα κάνει η ίδια η λειτουργία κλήσης.
Τώρα, αυτό δεν είναι όλα άσχημα.
Λειτουργίες αυτοαποκαλούνται έχει πραγματικά μεγάλη δύναμη, όταν μπορείτε να το χρησιμοποιήσετε σωστά.
Δεν έχω χρησιμοποιήσει σωστά εδώ.
Έτσι, αυτό δεν είναι όλα άσχημα, αλλά το γεγονός ότι ποτέ δεν έχω πραγματικά να σταματήσει τον εαυτό μου κλήση
Είναι μια θεμελιώδης αδυναμία εδώ αυτού του προγράμματος.
Έτσι, όταν θα πάμε με όλα αυτά; Τι πραγματικά συμβαίνει;
Όταν καλείτε τη λειτουργία αύξησης, όπως κάναμε σε αυτά τα παραδείγματα,
Έχω μια αξία όπως 1 που περνάω μέσα
Περνώ σε ένα αντίγραφο του αριθμού 1, έτσι συμβαίνουν τα ακόλουθα.
Ας πάμε στο παράδειγμα αύξηση, αυτός ο τύπος δεξιά εδώ.
Εδώ είναι τι πραγματικά συμβαίνει.
Όταν καλώ αύξηση και περνώ στο x, εικονογραφικά, τι συμβαίνει εδώ είναι αυτό.
>> Αν έχω την τιμή 1 αποθηκεύονται εδώ και καλώ πραγματικά προσαύξηση,
η οποία καλείται τώρα χορωδία - το iPad μου είναι αποτίναξη εδώ.
Ας το ονομάσουμε αυτό το βήμα, και δεν ξέρουμε τι είναι αυτό επόμενη λειτουργία θα είναι.
Έτσι, αυτό που πραγματικά συμβαίνει είναι κάπου εδώ στην κύρια Έχω ένα κομμάτι της μνήμης
δηλαδή να αποθηκεύει τον αριθμό 1.
Όταν καλώ αύξηση, είμαι χρησιμοποιώντας ένα άλλο κομμάτι της μνήμης,
αλλά τώρα έχω το αντίγραφο 1.
Όταν αυξήσετε αυτή την τιμή, αυτό γίνεται 2,
αλλά τότε τι θα συμβεί το συντομότερο επιστρέφει αύξηση;
Αυτή η μνήμη παίρνει μόλις παραδοθεί πίσω στο λειτουργικό σύστημα,
πράγμα που σημαίνει ό, τι έχω κάνει δεν είναι τίποτα χρήσιμο.
Το 1 που περιλαμβανόταν αρχικά στην κύρια εξακολουθεί να είναι πραγματικά εκεί.
Έτσι, όταν θα πάμε με αυτό;
Αποδεικνύεται ότι στη μνήμη έχετε αυτό το back-to-back ακολουθία των bytes
ότι μπορείτε να βάλετε τα πράγματα σε, και αποδεικνύεται ότι έχουμε ήδη δει κάτι
που περιλαμβάνει την τοποθέτηση πράγματα πλάτη με πλάτη με πλάτη με πλάτη.
Τι είναι μια σειρά με βάση την εβδομάδα 1 και πλέον εβδομάδα 2;
Είναι απλά μια συλλογή από χαρακτήρες.
Έτσι αποδεικνύεται ακριβώς όπως μπορείτε να βάλετε τους αριθμούς στη μνήμη,
Ομοίως μπορείτε να βάλετε χαρακτήρες στη μνήμη.
Και τη στιγμή που θα αρχίσει η εφαρμογή τους χαρακτήρες στη μνήμη πλάτη με πλάτη με πλάτη με πλάτη,
αποδεικνύεται ότι η χρήση της πιο απλά πράγματα, όπως ένα για βρόχο ή ένα βρόχο, ενώ,
μπορούμε να επαναλάβει από αριστερά προς τα δεξιά κατά τη διάρκεια των χαρακτήρων σε μια συμβολοσειρά
μασάζ και να αρχίσει τους σε εντελώς διαφορετικούς χαρακτήρες -
θα μπορούσε να γίνει ένα β, β θα μπορούσε να γίνει γ -
έτσι ώστε τελικά, μπορούμε να πάρουμε μια αγγλική φράση που κάνει πραγματικά αίσθηση
και να μετατρέψει το καθένα από τα έγγραφα αυτά, ένα κάθε φορά
περπατώντας μέσα από τη μνήμη του υπολογιστή μας αριστερά προς τα δεξιά στην πραγματικότητα κρυπτογράφηση.
Έτσι, ας ρίξουμε πέντε λεπτά διάλειμμα μας εδώ,
και όταν θα έρθει πίσω, θα αρχίσουμε αυτή τη διαδικασία κρυπτογράφησης πληροφοριών.
>> Εντάξει.
Πριν βουτήξετε σε κάποια crypto και αυτά τα πράγματα που ονομάζονται συστοιχίες,
επιτρέψτε μου να σταματήσουμε για οποιαδήποτε απορία, γιατί νιώθω ότι πραγματικά το είδος των μπερδεμένη
ορισμένα από αυτά τα θέματα. Ας ορίσει τώρα, αν μπορούμε.
Εμείς απλά μίλησε για την επιστροφή αξίες, μιλήσαμε για τα επιχειρήματα,
και μιλήσαμε για την έννοια αυτή, η οποία θα επανέλθουμε στις επόμενες εβδομάδες,
προβολή της μνήμης ως ένα σωρό από αυτούς τους δίσκους στοιβάζονται, να το πω έτσι,
από τον πυθμένα επάνω, έτσι ώστε κάθε δίσκος που παίρνει τοποθετούνται στη στοίβα
αντιπροσωπεύει μια λειτουργία που είναι σήμερα ονομάζεται.
Οποιεσδήποτε ερωτήσεις;
Επιτρέψτε μου να κάνω μια ερώτηση εδώ.
Επιτρέψτε μου να απλοποιήσει την πλάτη σε ό, τι ήταν πριν από μερικές από τις προηγούμενες Q & A. μας
Το γεγονός ότι η αύξηση έχει ανοιχτή παρένθεση, int αριθμό, κλειστή παρένθεση -
τι int αριθμός αντιπροσωπεύει;
[Φοιτητής] Ένα επιχείρημα. >> Ένα επιχείρημα. Εντάξει. Αλλά αυτό είναι ένα επιχείρημα;
[Ακούγεται ανταπόκριση των φοιτητών] >> Τι είναι αυτό; >> [Φοιτητής] Κάτι που θα περάσει μέσα
Εντάξει, έτσι κάτι που θα περάσει μέσα Και γενικότερα, είναι απλά η είσοδος.
Αν έγραφαν μια λειτουργία και το σκοπό της εν λόγω λειτουργία στη ζωή
είναι να κάνουμε κάτι λίγο διαφορετικό κάθε φορά που το χρησιμοποιείτε,
τότε ο μόνος τρόπος για να συμβεί αυτό πραγματικά φαίνεται να είναι για να καταθέσουν τις απόψεις τους
έτσι ώστε να μπορεί να κάνει κάτι διαφορετικό με την είσοδο κάθε φορά.
>> Έτσι, θα πρέπει να καθορίσετε δύο πράγματα, όταν μια συνάρτηση παίρνει είσοδο.
Θα πρέπει να καθορίσετε το όνομα που θέλετε να δώσετε στη συγκεκριμένη είσοδο
αποκλειστικά για τη δική σας ευκολία, έτσι ώστε να μπορείτε να ανατρέχετε σε αυτό
στη λειτουργία που εσείς οι ίδιοι γράφουν, όπως έκανα εδώ στη γραμμή 32.
Αλλά θα πρέπει επίσης να καθορίσετε το είδος, γιατί το C είναι μια γλώσσα προγραμματισμού
που απαιτεί μόνο ότι αν θέλετε μια μεταβλητή, θα πρέπει να πείτε στον υπολογιστή τι είδους δεδομένα είναι,
σε μεγάλο μέρος έτσι ώστε να γνωρίζει πόσα κομμάτια να κατανείμει για την μεταβλητή
επειδή θα μπορούσε να είναι 6 - συγνώμη, δεν θα είναι 6.
Μπορεί να είναι 16, μπορεί να είναι 8, μπορεί να είναι 32, ακόμα και 64,
αλλά ο υπολογιστής πρέπει να γνωρίζει.
Τώρα, η int στην αριστερή πλευρά αντιπροσωπεύει αυτό, αντίθετα;
[Ακούγεται ανταπόκριση των φοιτητών] >> Τι είναι αυτό; >> [Φοιτητής] Τύπος της λειτουργίας.
Ο τύπος της λειτουργίας και, πιο συγκεκριμένα, τον τύπο της εξόδου της. Δεξιά.
Έτσι, ενώ το πράγμα σε παρένθεση αντιπροσωπεύει είσοδο του, αν υπάρχουν,
το πράγμα προς τα αριστερά αντιπροσωπεύει την παραγωγή της.
Και σε αυτή την περίπτωση, προφανώς αύξηση επιστρέφει ένα int,
int και έτσι είναι ο τύπος επιστροφής αυτής της λειτουργίας.
Τι σημαίνει να επιστρέφουν;
Κυριολεκτικά, μπορείτε να χρησιμοποιήσετε την επιστροφή λέξη-κλειδί και στη συνέχεια, αν αυτό που επιστρέφουν
στα δεξιά του τη λέξη-κλειδί είναι ένας ακέραιος,
τότε αυτό είναι πράγματι σύμφωνη με ό, τι έχουμε υποσχεθεί.
Δεν θα μπορούσε να κάνει κάτι τέτοιο - γειά σου, τον κόσμο - γιατί αυτό είναι ένα string.
>> Προφανώς, δεν είναι ένας ακέραιος.
Έτσι, με λίγα λόγια, το βάρος είναι πραγματικά για μας, ο προγραμματιστής, να είναι συγκεκριμένες
ως προς το τι είμαστε και να επιστρέφουν στη συνέχεια πραγματικά να πάμε για την επιστροφή του.
Το πλαίσιο είναι εδώ τώρα ότι η μνήμη του υπολογιστή σας είναι ένα gigabyte, 2 gigabyte -
ό, τι - ίσως είναι περισσότερο, ίσως είναι λιγότερο,
αλλά ο υπολογιστής βλέπει ως έχουν διαφορετικά τμήματα.
Κάτι πηγαίνει εκεί κάτω, κάτι άλλο πάει μέχρι εκεί,
διαφορετικά πράγματα πηγαίνει στη μέση, και σήμερα έχουμε μόλις αρχίσει λέει την ιστορία,
αλλά θα επανέλθω σε αυτό την πάροδο του χρόνου.
Προς το παρόν, το μόνο κομμάτι της μνήμης που πραγματικά νοιάζονται για το τμήμα κειμένου
γιατί αυτό αντιπροσωπεύει μόλις το 0s και 1s ότι έχει Clang εξάγεται.
Έτσι, όταν εκτελείτε μια εντολή στο πληκτρολόγιο, όπως a.out
ή κάνετε διπλό κλικ σε ένα εικονίδιο για Mac OS ή Windows,
το πρόγραμμά σας είναι φορτωμένο από το σκληρό σας δίσκο στη μνήμη RAM
και αυτό είναι plopped στην κορυφή της μνήμης RAM του υπολογιστή σας, να το πω έτσι.
Εν τω μεταξύ, το πρόγραμμά σας αρχίζει να τρέχει και παίρνει κύρια καλείται
στο πρόγραμμα που έγραψε ή το πρόγραμμα Microsoft ή η Apple έγραψε,
οποιαδήποτε από τις τοπικές μεταβλητές της καταλήγουν εκεί κάτω στο κάτω μέρος της μνήμης του υπολογιστή σας.
Αλλά αν κύριες κλήσεις μια άλλη λειτουργία που η ίδια έχει μεταβλητές ή επιχειρήματα, καταλήγουν πάνω από αυτό.
Και αν αυτή η λειτουργία απαιτεί κάτι, που καταλήγουν πάνω από αυτό, από πάνω, από πάνω.
>> Και μόνο μια φορά γίνεται η λειτουργία δεν εκτελεί η στοίβα των δίσκων, να το πω έτσι,
αρχίζουν να παίρνουν όλο και πιο χαμηλά.
Και αυτό είναι ό, τι τότε, με λίγα λόγια, εξηγεί γιατί όταν σας καλούν κύβο
ή να καλέσετε αύξηση, είστε περνώντας σε ένα αντίγραφο του αξία.
Και τι σημαίνει αυτό εικονογραφικά είναι ότι είστε γραπτώς στην κυριολεξία τον αριθμό 1
σε ένα άλλο μέρος της μνήμης, αλλάζοντας ότι 1 ως 2 στην περίπτωση της προσαύξησης
ή σε ένα 8 στην περίπτωση του κύβου και στη συνέχεια ρίχνοντας ότι η μνήμη μακριά
μόλις η αύξηση των αποδόσεων ή λειτουργία κύβου. Ερώτηση.
[Φοιτητής] Όταν οι καθολικές μεταβλητές αποθηκεύονται;
Οι παγκόσμιες μεταβλητές αποθηκεύονται σε ό, τι είναι σήμερα ονομάζεται αρχικοποίηση των δεδομένων ή δεν έχει προετοιμαστεί δεδομένα,
η διαφορά είναι αν έχετε μια καθολική μεταβλητή και να αναθέσει αμέσως μια τιμή
με το σύμβολο του ίσον, καταλήγει στην κορυφή εκεί,
και αν πω int x? χωρίς αξία, που καταλήγει σε ελαφρώς χαμηλότερα RAM
απλά με την σύμβαση.
Άλλες ερωτήσεις; Εντάξει.
Έτσι, αυτή η εικόνα θα επανέλθει, όπως έχουμε πιο ισχυρό
με ό, τι μπορούμε να κάνουμε με τον υπολογιστή,
αλλά για τώρα, ας ρίξουμε μια σύντομη εισαγωγή στην κρυπτογραφία,
ένα συγκεκριμένο τύπο κρυπτογραφίας που δεν λύνει όλα τα προβλήματα του κόσμου
αλλά δεν λύσει μερικά από αυτά.
Στην περίπτωση αυτή εδώ, έχουμε κάτι που ονομάζεται μυστικό κλειδί κρυπτογράφησης.
Μυστική-κλειδί κρυπτογράφησης, όπως υποδηλώνει το όνομα, προέρχεται από την ασφάλεια της ένα μυστικό.
>> Για παράδειγμα, αν ήσασταν πίσω στο σχολείο και θα περνούσαν ένα μικρό μυστικό ερωτικό γράμμα
για το αγόρι ή το κορίτσι που ήταν σύνθλιψη στην, αν θέλετε να περάσει μέσα από αυτό το σημείωμα το κοινό,
τότε μάλλον δεν θα γράψω ένα τέτοιο σημείωμα στα αγγλικά ή όποια και αν είναι η μητρική σας γλώσσα είναι.
Αντίθετα, μπορείτε να το κρυπτογραφήσετε ή ίσως απλά να τους στείλετε ένα μήνυμα κειμένου αυτές τις μέρες.
Αλλά στην πραγματικότητα μπορεί να περάσει ένα σημείωμα σε όλη την τάξη.
Και για να το κάνουμε αυτό με ασφάλεια με τέτοιο τρόπο που οι φίλοι σας και ο δάσκαλος
Δεν ξέρω τι είστε γραπτώς, μπορεί να καταλήξει σε ένα αρκετά απλό αλγόριθμο,
νέοι κι αν θα μπορούσε να είναι, για να ανακατώσει μόνο τις λέξεις.
Έτσι, αντί της γραφής ένας μπορεί να γράψει β,
αντί του β μπορείτε να γράψετε γ,
αντί του γ μπορείτε να γράψετε δ, και ούτω καθεξής.
Ή θα μπορούσε να καταλήξει σε μια πιο εξελιγμένη μετάφραση
γραμμάτων σε διαφορετικά γράμματα.
Όμως, τα αλιεύματα είναι το αγόρι ή κορίτσι, στους οποίους στέλνετε αυτή τη σημείωση
πρέπει να ξέρει κάτι, το οποίο είναι αυτό, προφανώς; >> [Φοιτητής] Τι στέλνετε.
Ποιο είναι το μυστικό σας, όπως και ό, τι είναι η χαρτογράφηση μεταξύ ενός και του β και του γ και d's.
Είναι προσθέτοντας μόλις 1 σε κάθε ένα από τα γράμματα για να πάει από το Α στο Β, b για να γ?
Είναι πιο περίπλοκο από αυτό;
>> Έτσι και φλερτ σας θα πρέπει να έχουν αυτό το μυστικό των πληροφοριών,
αλλά υπάρχει ένα είδος catch-22 εδώ.
Αν αυτή είναι η πρώτη φορά που στέλνετε αυτό το γράμμα αγάπης μέσα στην τάξη,
πώς είναι ότι το αγόρι ή το κορίτσι πρόκειται να ξέρει ποιο είναι το μυστικό ακόμα;
Έτσι μυστικό κλειδί κρυπτογράφησης δεν λύνει όλα τα προβλήματα του κόσμου,
και υπάρχει πραγματικά μια σχέση εδώ ότι θα έρθει πίσω στο προς το τέλος του εξαμήνου.
Ομοίως, δεν περισσότεροι από εμάς δεν γνωρίζουμε κάποιον που δουλεύει, για παράδειγμα, στο Amazon.com,
και όμως πολλοί από εμάς έχουν αγοράσει πιθανώς τα πράγματα στο Amazon.com,
και έχουμε διδαχθεί να υποθέσουμε ότι αυτές οι συναλλαγές ηλεκτρονικού εμπορίου είναι ασφαλείς.
Η διεύθυνση URL λέει πιθανώς https, υπάρχει ίσως ένα ανόητο μικρό εικονίδιο λουκέτου κάπου,
υπάρχει κάποιο είδος της κρυπτογραφίας διασφάλιση των στοιχείων της πιστωτικής σας κάρτας
ανάμεσα σε εσάς και το Amazon.com.
Και όμως, αν κρυπτογραφία περιλαμβάνει τη γνώση κάποιο μυστικό
και ακόμη δεν ξέρω κανέναν στο Amazon και δεν έχω τοποθετημένα σίγουρα κάθε είδους μυστικό
με κάποιον στο Amazon, πώς είναι ο υπολογιστής μου ή browser μου το κάνετε αυτό;
Αποδεικνύεται ότι υπάρχει άλλου είδους κρυπτογράφηση εντελώς ότι να λύσει αυτό το πρόβλημα.
Αλλά για σήμερα, θα επικεντρωθεί στην απλή
όπου μπορείτε να κανονίσετε εκ των προτέρων να γνωρίζει κάποιο μυστικό
σαν +1 ή κάποια αντιστοίχιση μεταξύ ενός και b.
Και η διαδικασία της κρυπτογραφίας περιλαμβάνει γενικά αυτό.
Έχετε κάποια μορφή απλού κειμένου, που απεικονίζονται εδώ στα αριστερά,
μπορείτε να εκτελέσετε μέσα από κάποιο είδος του αλγορίθμου ή διαδικασία για την κρυπτογράφηση το -
Ίσως αυτό είναι απλά ένα γίνεται β, γ γίνεται β -
και τότε θα καταλήξετε με ciphertext.
Εν τω μεταξύ, μία φορά φλερτ σας λάβει αυτό το μυστικό σημείωμα,
αυτός ή αυτή πρέπει να είναι στη συνέχεια να αποκρυπτογραφήσει με γενικά αναστροφή της αλγόριθμος
έτσι ώστε να πάρει πίσω το απλό κείμενο.
Υπάρχουν φυσικά ενσαρκώσεις του αυτό.
>> Για παράδειγμα, αυτό είναι ένα μικρό δακτύλιο αποκωδικοποιητή μυστικό,
και αυτό είναι ένας δακτύλιος με την έννοια ότι υπάρχουν δύο καντράν εδώ.
Στην εξωτερική περιφέρεια του αυτό το πράγμα, υπάρχει γράμματα A έως Z,
αν είστε σε τυχαία σειρά,
και στο εσωτερικό, δεν υπάρχει στην πραγματικότητα ορισμένοι αριθμοί
έτσι ώστε με αυτό το δαχτυλίδι, μπορείτε να ενεργοποιήσετε το είδος το εξωτερικό, αλλά όχι το εσωτερικό
προκειμένου να παρατάξει τους αριθμούς με γράμματα.
Από μια ταινία που ονομάζεται Μια ιστορία των Χριστουγέννων, θα δείτε ότι λίγο Ralphie
ήταν τόσο πρόθυμοι να καταλάβω ποιο είναι το μυστικό μήνυμα Little Orphan Annie ήταν να τον
που είχε κοινοποιηθεί, νομίζω, με τη μορφή των αριθμητικών μηνύματα σε ένα κουτί δημητριακών
και θα έπρεπε να συσσωρεύονται όλα τα μικρά φύλλα που ήρθαν στο κουτί δημητριακών,
θα έπρεπε να τους mail στο, θα έπρεπε να πάρει πίσω το μυστικό δαχτυλίδι αποκωδικοποιητή
έτσι ώστε να μπορείτε τελικά να καταλάβω τι είναι η χαρτογράφηση μεταξύ γραμμάτων και αριθμών
ή γράμματα και γράμματα.
Πώς σε έναν υπολογιστή μπορούμε να πάμε για την εφαρμογή ή εκπροσωπούν τα πράγματα όπως αυτό;
Χρειαζόμαστε έναν τρόπο να εκφράσουν τους εαυτούς μας λίγο πιο ευέλικτα
από τις μεταβλητές μας μέχρι στιγμής επέτρεψαν.
Είχαμε ints, είχαμε χαρακτήρες, είχαμε άρματα και δίκλινα και μερικά άλλα,
αλλά αυτά είναι μεμονωμένα κομμάτια της μνήμης που πραγματικά δεν μας επιτρέπουν να εκφράσουν τα πράγματα
όπως λέξεις και φράσεις και φράσεις.
Πράγματι, έχουμε τέτοιες ονομάζεται χορδές πράγματα,
αλλά υποσχόμαστε ότι αυτό είναι πραγματικά ακριβώς μια απλοποίηση στη βιβλιοθήκη CS50
ότι είμαστε προτίθενται να φλούδα πίσω.
Κι έτσι ας αρχίσουμε να το κάνουμε αυτό εδώ.
Επιτρέψτε μου να προχωρήσει και να ανοίξει ένα αρχείο -
όλα αυτά τα αρχεία είναι διαθέσιμα, ως συνήθως, σε απευθείας σύνδεση - που ονομάζεται array.c
για να λύσει ένα πρόβλημα που σχετίζεται με χορδές, αλλά ότι δίνει μια εικόνα εδώ
για το πώς μπορούμε να χρησιμοποιήσουμε κάτι που ονομάζεται μια σειρά.
>> Ένας πίνακας είναι ένας τύπος δεδομένων.
Είναι ένα είδος της μεταβλητής του είδους που έχει πολλά μικρότερα τύπους δεδομένων μέσα από το
πλάτη με πλάτη με πλάτη με πλάτη.
Έτσι, για παράδειγμα, αν θέλαμε να γράψει ένα μικρό πρόγραμμα που σας δίνει μέσο όρο κουίζ σας
για μια σειρά μαθημάτων, όπως 50 που έχει 2 κουίζ,
θα μπορούσε πολύ εύκολα να γράψω αυτό το πρόγραμμα που βασίζεται ακόμα σε μερικά από υλικό της περασμένης εβδομάδας
με τη χρήση GetInt και ένα ζευγάρι των μεταβλητών: int quiz1, int quiz2.
Και είναι αρκετά απλή.
Είναι ίσως 10, 20 γραμμές κώδικα max για την εφαρμογή ενός προγράμματος
που ζητά από το χρήστη για 2 αποτελέσματα κουίζ και στη συνέχεια υπολογίζει το μέσο όρο τους
με την προσθήκη τους μαζί, διαιρώντας με 2, και στη συνέχεια την εκτύπωση των αποτελεσμάτων.
Θα μπορούσαμε να κάνουμε ότι κατά πάσα πιθανότητα αρκετά εύκολα τώρα μετά από κάποιο αριθμό λεπτών.
Αλλά το πρόβλημα είναι ότι ας υποθέσουμε ότι το 50 είχε 3 ή 4 κουίζ.
Ας υποθέσουμε ότι θέλετε να χρησιμοποιήσετε το ίδιο πρόγραμμα για μια τάξη που είχε εβδομαδιαίο κουίζ.
Σκεφτείτε για μια κατηγορία που έχει εβδομαδιαίο κουίζ.
Αν υπάρχει 16 ή έτσι εβδομάδες σε ένα εξάμηνο, τώρα έχετε 16 μεταβλητές:
int quiz1, int quiz2, int quiz3, int quiz4.
Μόλις αρχίσετε να βλέπετε αυτή την απόλυση, η αντιγραφή και επικόλληση του κώδικα,
θα πρέπει να αρχίσει να σας κάνει να θέλετε υπήρχαν ένας καλύτερος τρόπος.
Και ευτυχώς, γιατί από συστοιχίες υπάρχει. Ας το κάνουμε αυτό.
Κατ 'αρχάς, επιτρέψτε μου να εισαγάγει ένα πολύ απλό πράγμα που δεν έχω χρησιμοποιήσει μέχρι στιγμής,
αλλά θα το δείτε περιστασιακά σε κώδικα.
>> Αυτό είναι αυτό που γενικά ονομάζεται μια σταθερά.
Έτσι είναι σταθερά συνδεδεμένο με την έννοια ότι ποτέ αυτή η τιμή αλλάζει.
Η ανθρώπινη σύμβαση κατά τη δημιουργία ενός σταθερού
είναι να χρησιμοποιήσει όλα τα κεφαλαία γράμματα ακριβώς, έτσι ώστε να ξεχωρίζει πραγματικά το κωδικό σας,
και το ειδικό κλειδί που χρησιμοποιείτε στο Γ # define.
Έτσι λέμε # define, τότε ένα διάστημα, στη συνέχεια, τη λέξη που θέλετε να χρησιμοποιήσετε για το όνομα της σταθεράς
και στη συνέχεια η τιμή της σταθεράς.
Παρατηρήστε αυτό είναι διαφορετικό από κάτι ανάθεση σε μια μεταβλητή.
Δεν υπάρχει ίσον, δεν υπάρχει ερωτηματικό.
Αυτό είναι ό, τι είναι γενικά γνωστή ως οδηγία προεπεξεργαστή,
αλλά περισσότερο για αυτό μια άλλη φορά.
Προς το παρόν, αυτό δημιουργεί μια αμετάβλητη αξία που ονομάζεται ΒΙΝΤΕΟ ΑΓΓΕΛΙΕΣ
πραγματική αριθμητική τιμή των οποίων είναι 2.
Έτσι, οπουδήποτε βλέπετε κουίζ, κουίζ, κουίζ σε όλο αυτό το αρχείο,
αυτό είναι ακριβώς ο αριθμός 2.
Αν κοιτάζω κύρια τώρα, ας δούμε πώς αυτό λειτουργεί.
Πρώτον φαίνεται λίγο περίεργη, αλλά είναι όλα τα πράγματα από την εβδομάδα 1.
Ζητήστε από το χρήστη για τους βαθμούς. Πώς θα το κάνουμε αυτό;
Στη γραμμή 22 - αυτό είναι πραγματικά το ζουμερό μέρος - Δηλώνω έναν πλωτήρα
αλλά δεν είναι μόνο μια ενιαία float. Είμαι δηλώνοντας, μάλλον, μια σειρά από floating-point αξίες.
Η μεταβλητή πρόκειται να κληθεί βαθμούς, όπως υπονοείται εδώ,
αλλά το μόνο κομμάτι του νέου σύνταξη τότε οι αγκύλες.
Το γεγονός ότι έχω πει float βαθμούς και στη συνέχεια ανοίξτε το στήριγμα και στη συνέχεια έναν αριθμό -
παρατηρήσετε αν αυτό είναι μια σταθερά αυτό είναι ακριβώς όπως το κάναμε αυτό -
αυτό σημαίνει, "Hey υπολογιστή, να μου δώσει 2 άρματα και ας συλλογικά τους αποκαλούν βαθμούς."
>> Αυτό είναι σε αντίθεση με ένα πολύ πιο επίπονη διαδικασία όπως αυτό: πλωτήρα βαθμός1?
επιπλέουν grade2? και ούτω καθεξής.
Έτσι, ένας πίνακας μας επιτρέπει να εφαρμόσει αυτή την ιδέα, αλλά πολύ λιγότερο messily,
με τέτοιο τρόπο ώστε να μπορούμε να γράψουμε 1 γραμμή κώδικα αντί, ας πούμε, 16 για ένα εξάμηνο 16-εβδομάδα.
Δεν ήθελα να σκληρό κωδικό 2, γιατί αν σκεφτούμε αυτό τώρα λογικά,
ας υποθέσουμε ότι το επόμενο έτος CS50 αλλαγές σε 3 αντί κουίζ
και είχα τον αριθμό 2 εδώ, είχα τον αριθμό 2 εδώ,
Είχα τον αριθμό 2, εδώ τον αριθμό 2 εδώ.
Γίνεται πολύ κουραστική και πολύ εύκολο να βίδα μέχρι
και να αλλάξουν κατά λάθος τιμή 1 έως 3 και χάσετε κάποια άλλη τιμή 2.
Έτσι, Πάω να αντί αφηρημένο αυτό μακριά και να χρησιμοποιήσετε αυτή την σταθερή ότι,
όπως υποδηλώνει το όνομά του, ποτέ δεν αλλάζει.
Και τώρα δεν έχει σημασία αν έχουμε διαφορετικές κουίζ αυτό το έτος ή το επόμενο,
Απλά πρέπει να το αλλάξετε σε ένα μέρος εδώ στην κορυφή.
Έτσι, αυτό είναι το μόνο σταθερό είναι.
Εν τω μεταξύ, η νέα εννοιολογική χαρακτηριστικό είναι ότι από μία συστοιχία.
Έτσι, οι αγκύλες να μου δώσει αυτό το πολλά άρματα και μου επιτρέπει να καλέσετε συλλογικά τους βαθμούς εδώ.
Έτσι, τώρα ας δούμε τι Πάω να κάνουμε.
Εδώ στην γραμμή 24 είναι η αρχή για ένα βρόχο.
>> Αυτό είναι πραγματικά φανταχτερό τίποτα. Είναι μόνο με τη χρήση ΒΙΝΤΕΟ ΑΓΓΕΛΙΕΣ αντί για σκληρό κωδικοποιημένο αριθμό.
Αλλά δεν υπάρχει τίποτα εκεί πνευματικά διαφορετικά από την προηγούμενη εβδομάδα.
Αυτό είναι απλά printf, έτσι printf ("Quiz #% d από% d:")
γιατί απλά θέλετε να εκτυπώσετε κουίζ μου δώσει τον αριθμό 1 από 2 και, στη συνέχεια 2 από 2.
Έτσι, αυτό είναι μια καθαρά αισθητική πράγμα.
Αλλά το ενδιαφέρον είναι τώρα στην γραμμή 27.
Για να συμπληρώσετε ένα από τα δύο σύμβολα κράτησης θέσης με floating-point αξία,
χρησιμοποιήσετε ξανά αγκύλες.
Σε αυτή την περίπτωση, είμαι με τη χρήση i επειδή αυτό για βρόχο έχει ξεκινήσει με το i ισούται με το τι αξία, προφανώς;
[Φοιτητής] 0. >> [Malan] 0.
Έτσι, στην πρώτη επανάληψη του βρόχου αυτού, είναι σαν να έγραψα αυτό σε κώδικα,
αλλά για τη δεύτερη επανάληψη του βρόχου, είναι σαν να έγραψα αυτό τον κωδικό μου.
Αλλά το γεγονός ότι είμαι με τη χρήση μιας μεταβλητής είναι τέλεια, επειδή, όπως υποδηλώνει το όνομα,
αυτό είναι διαφορετικό αξία του σε κάθε επανάληψη,
έτσι είμαι συμπληρώνοντας Αυτός ο πίνακας ένα σημείο κάθε φορά.
Τι σημαίνει αυτή η σειρά μοιάζει;
Ο λόγος που επέστησε την σούπερ απλό ορθογώνιο στην οθόνη εδώ πριν ήταν για το λόγο αυτό.
Ένας πίνακας είναι απλά ένα κομμάτι της μνήμης που ακολουθείται από ένα άλλο κομμάτι της μνήμης
ακολουθούμενο από ένα άλλο κομμάτι της μνήμης και ούτω καθεξής.
Έτσι, αν μου σειρά είναι το μέγεθος 2 σε αυτήν την περίπτωση εδώ, όλα θα ήθελα να κάνω
πληκτρολογώντας αποτελέσματα κουίζ μου αρέσει εδώ - πήρα 100 σε αυτό το σημείο και έπειτα πήρα ένα 99 σε αυτό το σημείο -
τότε η μνήμη θα μπορούσε ούτε καν να χρησιμοποιηθεί, επειδή έχω ζητήσει μόνο τον υπολογιστή
για μια σειρά μεγέθους 2.
Οι πλατείες είναι ακόμα εκεί, έτσι δεν είναι;
Έχετε ακόμα 2 gigabytes μνήμης RAM ακόμα και αν είστε ζητά μόνο για 2 επιπλέει.
Έτσι, η ιδέα πίσω από συστοιχίες είναι ότι ο υπολογιστής παίρνει μόνο ένα κομμάτι της μνήμης
και επιμερίζει στη συνέχεια μικρότερα κομμάτια πλάτη με πλάτη με πλάτη με πλάτη.
Και έτσι αυτό είναι όλο ένας πίνακας είναι.
>> Είναι ένα συνεχές κομμάτι της μνήμης μέσα από τα οποία μπορείτε να βάλετε τα πράγματα.
Αυτό συμβαίνει για να κάνει στη συνέχεια κάποια απλά βαρετό αριθμητική.
Αν μετακινηθείτε προς τα κάτω εδώ, αυτό είναι που εγώ τότε επαναλάβει πάνω στον πίνακα.
Έρχομαι με το άθροισμα όλων των τιμών του πίνακα,
και στη συνέχεια να μπορώ να χρησιμοποιήσω το γύρο λειτουργία εδώ για να κάνουμε πραγματικότητα το άθροισμα διαιρείται με κουίζ.
Αλλά επιτρέψτε μου να κύμα το χέρι μου στο ότι ως είδος αριθμητική αρκετά για τώρα.
Αλλά το μόνο που κάνει είναι για μένα τελικά να υπολογίσει τη μέση.
Έτσι, η πρώτη κουίζ κουίζ συν το δεύτερο διαιρείται με το 2 και στη συνέχεια εκτύπωση ως int.
Αλλά τώρα ας μετάβαση σε ένα διαφορετικό παράδειγμα που ονομάζεται συμβολοσειρά1,
η οποία περιγράφει μια παρόμοια κατάσταση, αλλά με χορδές.
Επιτρέψτε μου να προχωρήσει και να απλοποιήσει αυτό για μια στιγμή.
Συγχωρέστε την εσοχή για τώρα.
Ανακοίνωση στην γραμμή 19 του αυτό το παράδειγμα, έχω μια σειρά από τον χρήστη.
Αλλά παρατηρήσετε τι είμαι δίπλα σε αυτόν των γραμμών 22 και μετά.
Είμαι πραγματικά επανάληψη από i μέχρι - και αυτό είναι ένα νέο τέχνασμα - strlen, μήκους.
Πρόκειται για μια λειτουργία που έρχεται με C ότι αν δώσετε μια συμβολοσειρά,
αυτό σας λέει πόσοι χαρακτήρες είναι σε αυτό το string. Αυτό είναι όλο.
Και το γεγονός ότι είναι strlen αντί του μήκους είναι μόνο και μόνο επειδή είναι πιο σύντομη.
Τριάντα χρόνια πριν, οι άνθρωποι του άρεσε να γράφει τα πράγματα όπως συνοπτικά το δυνατόν,
έτσι έχουμε κρατήσει τη σύμβαση αυτή εδώ.
i + + απλά σημαίνει αυξήσετε i σε κάθε επανάληψη.
Και τώρα παρατηρήσετε αυτό, το οποίο είναι πολύ ενδιαφέρον.
Στη γραμμή 24, λέω, "Computer, να μου δώσει ένα χαρακτήρα, 8 bits, και να το ονομάσουμε γ».
Αλλά τι είναι αυτό για το δεξιά πλευρά λέγοντας;
Στα αγγλικά, τι σημαίνει αυτό αντιπροσωπεύει;
[Φοιτητής] Ο πρώτος χαρακτήρας του πίνακα.
Ακριβώς. Δώσε μου τον πρώτο χαρακτήρα του πίνακα.
Ή, πιο γενικά, να μου δώσει το i-χαρακτήρας στη σειρά.
Και συνειδητοποιούν ότι είναι σημαντικό τώρα που οι επιστήμονες ηλεκτρονικών υπολογιστών,
είμαστε πραγματικά ξεκινώντας από το 0.
>> Δεν έχουν την ευχέρεια τώρα να αρχίσουν να κάνουν αυτό.
Τώρα θα πρέπει να συμπεριφέρονται σύμφωνα με τις προσδοκίες του υπολογιστή και μετρήστε από 0
επειδή [0] θα είναι ο πρώτος χαρακτήρας σε μια σειρά,
[1] πρόκειται να είναι η δεύτερη, [2], πρόκειται να είναι η τρίτη, και ούτω καθεξής.
Έτσι, αυτό το πρόγραμμα, αν μπορώ να συγκεντρώνουν, αυτή είναι και πάλι συμβολοσειρά1, ώστε να συμβολοσειρά1,
και τώρα έχω τρέξει string1 στο παράθυρο του τερματικού μου.
Είναι σε αναμονή για την είσοδο, έτσι Πάω να πληκτρολογήσετε τον David, Enter,
και τώρα ο David εκτυπώνει όλα σε διαφορετικές γραμμές, επειδή ειδοποίηση τι κάνω.
Είμαι εκτύπωση ενός χαρακτήρα σε μια στιγμή.
Δεν θα μπω σε λεπτομέρειες για το θέμα αυτό σήμερα, αλλά έχω διαγράψει μια στιγμή πριν από τον έλεγχο αυτό εδώ.
Αποδεικνύεται ότι αν ο χρήστης δεν λειτούργησε σωστά, αντιδικία, ή απλά σύγχυση,
μπορείτε πραγματικά να αποτύχει να δώσει μια σειρά από κάποιο μήκος.
Αν πατήσετε το λάθος πλήκτρο στο πληκτρολόγιο, μπορεί να δώσει καμία συμβολοσειρά,
ή αν είστε κακόβουλο, μπορείτε να δοκιμάσετε να επικολλήσετε στην αξία ενός gigabyte του ένα δοκίμιο
να συμπληρώσετε αυτή τη σειρά, και αν ο υπολογιστής διαθέτει μνήμη,
αποδεικνύεται ότι θα πάμε για να πάρει πίσω αυτή την ειδική τιμή που ονομάζεται NULL.
Έτσι, για τώρα, απλά ξέρω ότι υπάρχει αυτή η ιδιαίτερη αξία που ονομάζεται NULL
που θα μας επιτρέψει να ελέγξετε όταν είμαστε έξω από τη μνήμη, μεταξύ άλλων.
Αλλά αν ανοίξει τώρα συμβολοσειρά2, παρατηρήσετε μια διαφορά εδώ.
Παρατηρήστε μια διαφορά εδώ με συμβολοσειρά2.
Με συμβολοσειρά2, αυτό για το βρόχο είναι λίγο διαφορετική.
>> Επιτρέψτε μου να διαγράψετε τις τιμές NULL, έτσι ώστε να μπορούμε να μιλήσουμε για μια άλλη φορά αυτά.
Τι είναι διαφορετικό για το βρόχο για αυτή τη φορά;
Μπορώ να πάω πίσω στο προηγούμενο παράδειγμα.
Έτσι, αυτό είναι έκδοση 2, αυτό είναι η έκδοση 1. 1, 2.
1, 2.
Η strlen κλήση είναι πού;
Είναι το πρώτο μέρος του βρόχου for.
Οποιεσδήποτε σκέψεις ως προς το γιατί το κάνω αυτό; Ναι.
[Φοιτητής] Έτσι δεν απαιτούν τη λειτουργία κάθε φορά.
[Malan] Γι 'αυτό και δεν απαιτούν τη λειτουργία κάθε φορά. Ακριβώς.
Ανάκληση από τους βρόχους για ότι είναι εξαιρετικά απλή
από τη στιγμή που το είδος καταλάβουμε ότι αυτή είναι η αρχικοποίηση, η κατάσταση και η ενημέρωση.
Το πρόβλημα είναι ότι η κατάσταση συμβαίνει σε κάθε επανάληψη του βρόχου.
Και έτσι σε αυτό το παράδειγμα εδώ, τι είναι κακό για το γεγονός ότι αυτή είναι η κατάστασή μου;
[Φοιτητής] Είσαι καλώντας strlen.
[Malan] Είσαι strlen καλώντας ξανά και ξανά και ξανά.
Αλλά από τη στιγμή που έχω πληκτρολογήσει στο Δαβίδ, το μήκος της στοιχειοσειράς είναι 5,
και δεν πρόκειται να αλλάξει σε κάθε επανάληψη του βρόχου
επειδή το κορδόνι είναι ακόμα ϋ-α-ν-ί-ά.
Έτσι, αυτό είναι μια νύξη στο τι πρόκειται να γίνει μια όλο και πιο σημαντική ιδέα
γνωστή ως απόφαση σχεδιασμού σε περιπτώσεις όπου απλά δεν κάνουν τον υπολογιστή να κάνει περιττές εργασίες.
>> Ακριβώς όπως μια προεπισκόπηση των pset2, pset2 στην τυπική έκδοση
πρόκειται να σας πρόκληση να εφαρμόσουν στην πράξη κάποια αριθμός των αλγόριθμους κρυπτογράφησης,
κάποια αριθμός των αλγορίθμων κρυπτογράφησης, έτσι ώστε να μπορεί τόσο να κρυπτογραφήσετε
και να αποκρυπτογραφήσει τα μηνύματα μυστικό μοιάζει πολύ με το Ralphie κανείς εκεί αποκωδικοποιηθεί.
Στην έκδοση του χάκερ pset2, θα πάμε για να πάει λίγο παραπέρα.
Εμείς πάμε για να σας παραδώσει ένα αρχείο από ένα πραγματικό σύστημα υπολογιστή
που περιέχει ένα σωρό ονόματα χρηστών και των πραγματικών κρυπτογραφημένους κωδικούς πρόσβασης,
και η πρόκληση για την έκδοση χάκερ θα είναι να σπάσει αυτούς τους κωδικούς πρόσβασης
και να καταλάβω τι κρυπτογραφία ή ποιο είναι το μυστικό έχει χρησιμοποιηθεί για την παραγωγή πραγματικά αυτούς τους κωδικούς πρόσβασης.
Και θα πάμε να το κάνετε αυτό, χρησιμοποιώντας ένα νέο χαρακτηριστικό εδώ από C
ότι θα σας δώσω μόνο ένα demo του είναι γνωστή ως ορίσματα της γραμμής εντολών.
Αποδεικνύεται, όπως κάποιοι από εσάς μπορεί να έχετε δει στο τμήμα ή στα σχολικά εγχειρίδια,
κύριος δεν πρέπει πάντα να είναι κενό σε παρένθεση.
Αποδεικνύεται ότι ο κύριος μπορεί επίσης να γραφτεί όπως αυτό, με δύο επιχειρήματα,
argc και argv, argc όπου είναι ο αριθμός των λέξεων
που πληκτρολογείτε μετά από το όνομα του προγράμματος στη γραμμή εντολών σας
και argv είναι οι πραγματικές λέξεις.
Και όπως δείχνουν οι αγκύλες εκεί, argv είναι προφανώς μια σειρά.
Είναι πρόκειται να είναι μια σειρά μετά από μια σειρά μετά από μια σειρά στη μνήμη.
>> Λοιπόν, τι θα πάμε να είναι σε θέση να κάνει εκκίνηση με PSET 2 είναι κάτι σαν αυτό.
Αν κάνω argv1, το οποίο είναι ένα παράδειγμα θα επανέλθουμε τη Δευτέρα, και τρέχει,
παρατηρήσετε ότι δεν φαίνεται να κάνει τίποτα ακόμα.
Είναι απλά τυπώνει το δικό του όνομα.
Αλλά αν πω αντίο τάξη, ειδοποίηση ότι το πρόγραμμα αυτό επαναλαμβάνεται προφανώς
για κάθε μία από τις λέξεις που πληκτρολογούνται στη γραμμή εντολών.
Και τα μέσα με τα οποία θα αποκτήσουν πρόσβαση σε λέξεις που ο χρήστης έχει πληκτρολογήσει στη γραμμή εντολών
είναι με την αλλαγή κύρια ξεκινώντας από αυτό το Σαββατοκύριακο int main (void) σε int main (argc, argv)
και έτσι θα γεννηθεί ορίσματα της γραμμής εντολών.
Και τη στιγμή που θα πάρει πραγματικά εξελιγμένη σε αυτό, θα είστε σε θέση να γράψει πραγματικά trippy προγράμματα
όπως αυτό εδώ, το οποίο πηγαίνει πάνω και πέρα ​​από
μερικές από τις λειτουργίες που έχουμε κάνει μέχρι τώρα, αλλά όλα είναι αρκετά ισχυρό.
>> Γι 'αυτό και θα αφήσει αυτό με αυτό στην οθόνη, και θα δείτε τη Δευτέρα.
>> [CS50.TV]