[Powered by Google Translate] [Εβδομάδα 3] [David J. Malan - Πανεπιστήμιο του Χάρβαρντ] [Αυτό είναι CS50. - CS50.TV] Επιτρέψτε μου να μας κατευθύνει προς την κατεύθυνση όπου αφήσαμε τελευταία φορά, το οποίο είχε αρχίσει να σκέφτονται λίγο περισσότερο από ό, τι για τη σύνταξη και προσπαθώ να σκεφτώ λίγο λιγότερο για όλες τις μικρολεπτομέρειες αυτό παίρνει λίγο χρόνο για να εγκλιματιστεί στο μέχρι στιγμής όσον αφορά ερωτηματικά και παρενθέσεις και αγκύλες, να αρχίσετε να παίρνετε τα πράγματα λίγο σε ένα υψηλότερο επίπεδο εννοιολογικό έτσι ώστε τα προβλήματα που τώρα αρχίζουν την επίλυση τη διάρκεια των επόμενων μερικών εβδομάδων πρόκειται να συμμετέχουν πολύ περισσότερο σε υψηλότερο επίπεδο εννοιολογικά προβλήματα και λίγο λιγότερο στην συντακτική, όπως μπορείτε να πάρετε τα πόδια σας υγρά και τα χέρια σας βρώμικα με μερικά από τη σύνταξη από αυτές τις τελευταίες εβδομάδες. Έτσι, υπενθυμίζουν ότι την περασμένη εβδομάδα παρουσιάσαμε αυτή την έννοια ενός πίνακα. Και μια σειρά στην αγγλική γλώσσα μπορεί να περιγραφεί ως τι; >> [Ακούγεται ανταπόκριση των φοιτητών] Συγνώμη; Μια συλλογή του; >> [Ακούγεται ανταπόκριση των φοιτητών] >> Εντάξει, καλά. Μια συλλογή από αντικείμενα. Έτσι είδαμε σε συστοιχίες Scratch. Αν συμβεί να χρησιμοποιήσετε για PSET 0 μία από τις λίστες Scratch ότι μπορείτε να μεταφέρετε τα πράγματα όπως τα πορτοκάλια και μπανάνες σε, μια απογραφή των ειδών, αυτό είναι κάτι σαν αυτό που είναι ένας πίνακας. Και ακολούθως περισσότερο τεχνικώς, στο πλαίσιο ενός πραγματικού υπολογιστή, ένας πίνακας είναι απλά ένα συνεχές κομμάτι της μνήμης. Με άλλα λόγια, έχετε ένα byte, τότε ένα άλλο byte, τότε ένα άλλο byte, τότε ένα άλλο byte, και αν ήταν να καταλήξουμε σε αυτά τα bytes σε μια εικόνα, θα είναι πλάτη με πλάτη με πλάτη με πλάτη. Αυτό είναι ό, τι εννοούμε με τον όρο συνεχόμενα. Έτσι είναι byte αριθμό 1, τότε 2, στη συνέχεια 3. Αυτό δεν σημαίνει εδώ, εδώ, εδώ, εδώ. Ένας πίνακας είναι ένα συνεχές κομμάτι του 0 ή περισσότερα bytes. Έτσι, αυτό που είναι χρήσιμοι για; Ανάκληση είχαμε αυτό το είδος της τεχνητής παράδειγμα των βαθμών κουίζ αποθήκευση των ανθρώπων σε ένα πρόγραμμα για τον υπολογισμό μέσου όρου κουίζ σας για κάποιο μάθημα, και υπενθυμίζουν ότι θα μπορούσαμε να αρχίσει να γράφει αυτό το πρόγραμμα, δηλώνοντας μια μεταβλητή quiz1. Στη συνέχεια, θα μπορούσαμε να έχουμε μια άλλη μεταβλητή που ονομάζεται quiz2. Στη συνέχεια, όμως, αν υπήρχαν 3 κουίζ σε αυτή την κατηγορία, quiz4. Ή αν υπήρχε ένα εβδομαδιαίο κουίζ, θα ήταν quiz5, quiz6, quiz7. Έτσι θα έχετε όλες αυτές τις μεταβλητές δηλώνονται μέσα από τους κύριους ή κάπου αλλού στο πρόγραμμά σας, και το πρόβλημα με την προσέγγιση αυτή, αν και εύκολο είναι απλά να αντιγράψετε και να επικολλήσετε, είναι απλά πολύ γρήγορα γίνεται δυσκίνητο. Θεός φυλάξοι που πραγματικά έχουν 30 ή 50 κουίζ κουίζ. Αν είναι σαν ένα υψηλό στυλ σχολείο καθημερινά κουίζ ποπ, τότε έχετε μόνο μια γελοία μακρύ κατάλογο των μεταβλητών που δηλώνονται, και αυτό ακριβώς πολύ γρήγορα ξεφεύγει από τον έλεγχο. Είναι άσχημο, είναι δύσκολο να διατηρηθεί, είναι τόσο πολύ πιο εύκολο να κάνει ένα τυπογραφικό λάθος αν παίρνετε 1 αριθμός γραφεί σωστά κάπου στο πρόγραμμά σας. Γι 'αυτό και εισήγαγε την έννοια της μια σειρά αντ' αυτού. Και υπενθυμίζουν ότι έχουμε εφαρμόσει αυτό το πρόγραμμα κάνοντας μια μικρή κάτι τέτοιο. Επιτρέψτε μου να πάω στην Πηγή 3 κατάλογο Δευτέρα σήμερα και να ανοίξει σειρά, που είδαμε τελευταία φορά. Και ακόμα κι αν υπήρχαν μερικά νέα κόλπα εδώ C, μεταξύ των οποίων και η ιδέα ενός σταθερού, Υπενθυμίζω ότι δηλώσαμε πολλαπλές επιπλέει ουσιαστικά χρησιμοποιώντας τη σύνταξη: πλωτήρα, τότε το όνομα της μεταβλητής, τότε χρησιμοποιούνται αγκύλες πραγματικά για πρώτη φορά, και τι κάναμε μέσα από τις αγκύλες τέθηκε ουσιαστικά έναν αριθμό. Αλλά, αντί να θέσουμε έναν αριθμό, έβαλα αυτό το κεφαλαίο λέξη, κουίζ. Και αυτό ήταν το κίνητρο για την τοποθέτηση ενός κεφαλαία λέξη σαν κουίζ και στη συνέχεια, χρησιμοποιώντας το τέχνασμα 17 γραμμής εδώ για να δώσει πραγματικά ότι μια σειρά; Ποιο ήταν το κίνητρο εκεί; Ναι. [Ακούγεται ανταπόκριση των φοιτητών] >> Ακριβώς. Αν θέλουμε να αλλάξουμε αυτή την τιμή 2, δεν έχουμε παρά να το αλλάξετε σε 1 θέση επειδή θεωρούν - Δεν θυμάμαι καν τι είναι αυτό το πρόγραμμα έκανε ακριβώς, αλλά αν άπαχο ακριβώς βλέπετε κουίζ, κουίζ. Βλέπετε κουίζ, εδώ κάτω πιο κουίζ. Έτσι, αν δεν είχαμε αυτή η συνεχής, η χρήση αιχμηρών καθορίζουν, θα είχαμε πληκτρολογήσει 2, στη συνέχεια 2, στη συνέχεια 2, στη συνέχεια 2, η οποία είναι λεπτή. Θα ήταν εξίσου σωστό. Αλλά ας υποθέσουμε ότι τον επόμενο χρόνο έχουμε 3 κουίζ σε CS50. Γι 'αυτό και πρέπει να πάμε και να ενημερώσετε τον κώδικα, θα πρέπει να το μεταγλωττίσετε, αλλά το πρόβλημα είναι αν κάνω κάτι ηλίθιο, όπως εγώ θέα αναφορά 1 από 2 και ξεχάσετε να συνδέσετε 3, ολόκληρο το πρόγραμμα θα μπορούσε κάλλιστα να σπάσει. Έτσι απλά για μπελάδες. Έτσι, η έννοια της σταθεράς είναι όλα για το factoring από κάποιο κομμάτι των δεδομένων, είτε πρόκειται για ένα string ή ένα char ή ένα πλωτήρα ή οτιδήποτε άλλο, και δηλώνοντας ότι 1 θέση έτσι ώστε να μπορείτε πιο εύκολα να αλλάξει στο μέλλον. Και είναι, επίσης, ειλικρινά, είναι λίγο πιο εύκολο να διαβάσει γιατί αν απλά σκεφτείτε αυτό τώρα, Είναι κουίζ, ή θα μπορούσαμε ακόμα και να μετονομάσετε το κάτι σαν NUMBER_OF_QUIZZES ή κάτι πιο σαφής. Ο κώδικας γίνεται λίγο πιο εμφανής ως προς το τι κάνει, και να αναρωτιέσαι λίγο λιγότερο τι αριθμό 2 μπορεί να συμβεί να σημαίνει. Έτσι, η συνεχής δεν είχε τίποτα να κάνει ουσιαστικά με συστοιχίες. Η διάταξη εισήχθη μέσω αυτών των αγκύλες. Έτσι, παρατηρούμε ότι στη γραμμή 23 θα ζητήσει από το χρήστη, "Τι ήταν αποτελέσματα κουίζ σας;" Τότε έχουμε ακριβώς αυτό το βρόχο που ζητά προφανώς το χρήστη για τους βαθμούς τους. Πώς; Είναι επαναλαμβάνει 0-2. Και το λέω επειδή κουίζ 2 ​​σε όλα τα καλύμματα είναι επί του παρόντος 2. Γι 'αυτό επαναλαμβάνεται από το 0 έως 2 και στη συνέχεια εκτυπώνει Quiz # κάτι από κάτι, και μετά χρησιμοποιεί GetFloat να πάρει μια τιμή από τον χρήστη. Έτσι παρατηρήσετε αυτό είναι το μοναδικό νέο κομμάτι της σύνταξης από την περασμένη Τετάρτη. Εάν θέλετε να αποθηκεύσετε κάτι σε μια συγκεκριμένη θέση σε αυτό το φάσμα, χρησιμοποιήσετε ξανά τις αγκύλες. Έτσι, υπάρχει ένα κομμάτι της διχοτόμησης εδώ. Η πρώτη φορά που θα χρησιμοποιήσετε τις αγκύλες μπορείτε να το χρησιμοποιήσετε για να καθορίσετε πόσο μεγάλο θέλετε η σειρά να είναι. Αλλά αυτό εδώ επόμενο πλαίσιο όπου θα απασχολούν και πάλι αυτές τις αγκύλες σημαίνει, όπου σε αυτό το φάσμα θέλετε να βάλετε κάποια αξία; Και εδώ η διάκριση μπορεί να συναχθεί από τα συμφραζόμενα. Σημειώστε εδώ έχουμε έναν τύπο δεδομένων, τότε έχουμε το όνομα μιας μεταβλητής, τότε έχουμε αγκύλες μας με έναν αριθμό μέσα, ερωτηματικό. Αυτό είναι όλο. Έτσι, αυτό είναι μια δήλωση. Είναι ακριβώς σαν να είχαμε κάνει κάτι σαν float βαθμός1? Float grade2? αλλά και πάλι, αυτό πολύ γρήγορα περιέρχεται σε πάρα πολύ αντιγραφή, επικόλληση, έτσι αντί να απλοποιηθεί ακριβώς ως τέτοιο, πράγμα που σημαίνει πλέον έχουμε ένα βαθμό που μπορεί να αποθηκεύεται σε βραχίονα 0, έχουμε ένα άλλο βαθμό που μπορούν να αποθηκευτούν σε βραχίονα 1, αλλά τι γίνεται αν εγώ βλάκας και, για παράδειγμα, βρόχος μου πηγαίνει μέχρι στιγμής - για παράδειγμα, κάνω αυτό λιγότερο από ή ίσο με, που ανάκληση ήταν η πηγή της προηγούμενης bug - που ουσιαστικά σημαίνει ότι σε κάποια τρίτη τυχαία επανάληψη αυτού του βρόχου Χρησιμοποιώ βραχίονα 2. Ουσιαστικά, αυτό που θα μπορούσε να συμβεί εδώ; Συγνώμη; [Φοιτητής] Είναι πρόκειται να αντικατασταθεί. >> Είναι πρόκειται να αντικατασταθεί; Τι θα πρέπει να αντικατασταθούν; Αυτό είναι κυριολεκτικά λέγοντας αντικαταστήσει ό, τι είναι στη θέση 2 με την επιστροφή της αξίας GetFloat. Αλλά το πρόβλημα είναι πόσο μεγάλη είναι η σειρά σε αυτό το σημείο στην ιστορία; [Ακούγεται ανταπόκριση των φοιτητών] >> Η σειρά είναι ακόμα μόνο του το μέγεθος 2 επειδή στον πίνακα, όπως και κάθε μεταβλητή, ανακηρύχθηκε πρώτη φορά, πριν το χρησιμοποιήσαμε, και εμείς που καθορίζονται εδώ, λόγω αυτής της σταθερά ότι έχω 2 βαθμούς που Πάω να θέσει. Αλλά θυμηθείτε, οι επιστήμονες της πληροφορικής αρχίζουν να μετρούν από το 0. Έτσι, η πρώτη θέση στην εν λόγω σειρά είναι στήριγμα 0. Η επόμενη θέση είναι 1. Αυτό το πράγμα είναι πάντα τόσο λίγο πολύ με το μέρος. Έτσι με άλλα λόγια, αν είχα πραγματικά αυτή την σειρά - και επιτρέψτε μου να δούμε πόσο καλά αυτό συνεργάζεται εδώ για μας - αν έχω μια σειρά που έχω απλά συντάσσεται ως εξής και έχω διατεθεί χώρος για 2 στοιχεία, θα ήθελα να επιστήσω αυτό, όπως αυτό στη μνήμη όπου αυτό το μεγάλο λευκό καμβά είναι. Είναι απλά η μνήμη RAM που έχω στον υπολογιστή μου, μια συναυλία μνήμης RAM, 2 συναυλίες των RAM, όποια και αν είναι, αλλά αυτά τα 2 κουτιά τώρα αντιπροσωπεύουν μεμονωμένα πλωτήρα, 32 bit. Έτσι, αν έβαλα 1 αριθμός εδώ το 1,0, τότε έβαλα έναν άλλο αριθμό, όπως εδώ 3,2 αλλά στη συνέχεια να κάνω βραχίονα 2, που είναι σαν να βάζουμε κάτι εδώ. Και όπως δείχνει η εικόνα, δεν υπάρχει τίποτα εκεί. Είναι το είδος του όπως η γη του πουθενά, γιατί δεν έχω ζητήσει το λειτουργικό σύστημα να μου δώσει αυτό το τρίτο κουίζ. Αν έκανα θέλουν αυτής της τρίτης κουίζ, θα έπρεπε να είχαν την προνοητικότητα να ζητήσει από το λειτουργικό σύστημα για να δηλώνοντας κουίζ για να είναι όχι 2 αλλά αντ 'αυτού να ισούται 3. Έτσι με άλλα λόγια, η εικόνα που έχουμε ουσιαστικά έχουν στο χέρι μοιάζει με αυτό εδώ. Αυτό είναι και πάλι γη του κανενός. Εμείς δεν πρέπει να προσπαθήσετε εγγράφως τις τιμές εδώ. Αλλά και πάλι, επειδή οι επιστήμονες υπολογίζουν τον υπολογιστή από το 0, όταν μιλάμε για αυτή τη θέση στον πίνακα, που υποτίθεται ότι είναι θέση 0, αυτό υποτίθεται ότι είναι θέση 1, και αυτό δεν υπάρχει καν επειδή ζητήσαμε μόνο το λειτουργικό σύστημα για 2 τέτοιους χώρους. Έτσι, όσοι από εσάς με προηγούμενη εμπειρία προγραμματισμού από άλλες γλώσσες να ξέρετε ότι αυτό δεν είναι πάντα η περίπτωση με συστοιχίες ή τα πράγματα που ονομάζονται διανύσματα. Αντ 'αυτού, μπορείτε απλά να συνεχίσουμε να προσθέτουμε και την προσθήκη και προσθέτοντας πράγματα στους πίνακες, η οποία, ειλικρινά, δεν είχαμε αυτή τη δυνατότητα στο Ξυστό και παρόλα αυτά φαίνεται να έχουν εγκαταλείψει εδώ επειδή με C που θέλετε να προγραμματίσετε πολύ πιο ρητά. Είναι μόνο εσείς και ο υπολογιστής αυτή τη στιγμή, και ο υπολογιστής θα είναι μόνο για να κάνει τι θα πει να κάνετε. Έτσι, αν σας πω ότι μόνο για να σας δώσει 2 πλωτήρες μέσω της γραμμής 22 εδώ, αυτό είναι το μόνο που πρόκειται να πάρει πίσω από το λειτουργικό σύστημα: χώρος για 2. Έτσι, όλο και περισσότερο τα προγράμματά σας θα είναι περιστασιακά λάθη όσον αφορά τις συστοιχίες. Αυτό είναι ακριβώς το είδος της φύσης του θηρίου σύμφωνα με την οποία όλοι μας κάνουμε λάθη, και σε κάποιο σημείο που θα είναι πολύ πιθανό δείκτη πέρα ​​από το όριο του πίνακα σας. Και αυτό είναι μόνο ένα φανταχτερό τρόπο λέγοντας ότι πήγατε σε κάτι βραχίονα και κάτι ήταν ακριβώς πάρα πολύ μεγάλο από έναν αριθμό. Μπορείτε πήγε πέρα ​​από τα όρια του πίνακα σας. Αλλά το θετικό είναι τώρα αυτό. Το υπόλοιπο του εν λόγω προγράμματος έχει πραγματικά τίποτα να κάνει βασικά με συστοιχίες. Είναι όλα απλά για κάποια απλή αριθμητική για μέσους υπολογιστών. Έτσι, έχουμε εδώ σε αυτό το βρόχο για εδώ πρώτα μια μεταβλητή που ονομάζεται ποσό που θα προετοιμαστεί στο 0. Στη συνέχεια, θα επαναλάβει από 0 έως 2 ξανά και προσθέτουμε σε αυτή τη μεταβλητή άθροισης το i-βαθμού, έτσι στήριγμα βραχίονα 0 τότε 1. Και τότε, όπως θα κάνατε σε δημοτικό σχολείο για τον υπολογισμό του μέσου όρου, παίρνουμε απλά το εν λόγω ποσό, το διαιρούμε με τον συνολικό αριθμό των κουίζ, και στη συνέχεια για το καλό μέτρο καλούμε μια συνάρτηση που ονομάζεται εδώ γύρο. Τώρα, ως ένα μέρος, ποια είναι η συμφωνία με αυτή την παρενθετική int γραμμή 34; Μπορεί να έχουν έρθει ήδη σε τμήμα, δεν έχουν πραγματικά μίλησε γι 'αυτό επισήμως εδώ, αλλά τι είναι αυτό το int σε παρενθέσεις πιθανώς να κάνει; >> [Ακούγεται ανταπόκριση των φοιτητών] Ναι, αυτό αναφέρεται στη χύτευση ή στοιχειοθεσία, πράγμα που σημαίνει λήψη 1 τύπο δεδομένων και τη μετατροπή του σε ένα άλλο. Δεν μπορείτε να το κάνετε αυτό με όλους τους τύπους δεδομένων, επειδή μερικές φορές θα ήταν λίγο περίεργο. Αλλά σε αυτή την περίπτωση, εάν η τιμή επιστροφής του γύρου είναι float γιατί, μετά από όλα, παίρνω ένα πλωτήρα και διαιρώντας το με έναν αριθμό όπως είναι το 2, Πάω να πάρει πίσω ένα πλωτήρα. Αλλά οι άνθρωποι βαθμού σχολείο δεν ήθελα πραγματικά να γνωρίζω ότι ο μέσος όρος τους ήταν 93,4 επειδή θα συνειδητοποιήσετε ότι ήταν ποτέ τόσο κοντά στο σημείο ότι το 95 στρογγυλοποίησης. Έτσι θέλουμε να χρησιμοποιήσετε αντί για int γύρω όλοι στο πλησιέστερο int, οποίο στην περίπτωση αυτή πρόκειται να είναι 94 με κανένα σημείο μετά από αυτό. Έτσι, αυτό είναι μόνο ένα μικρό μαθηματικό τέχνασμα. Και θα επανέλθουμε σε αυτό έννοια της χύτευσης, διότι θα έχει επιπτώσεις, αν δεν το έχετε ήδη ανακαλύψει, για το πρόβλημα που 2. Έτσι, μια σειρά, στη συνέχεια, μπορείτε να σκεφτείτε - πρόκειται να με κάνει να χαμόγελο όλη την ημέρα. Μοιάζει με αυτό, αν σχεδιάσετε μια εικόνα από αυτό, αλλά το βασικό είναι ότι το μέγεθος έχει επίσης επιλεγεί από εσάς όταν το ζητήσει από το λειτουργικό σύστημα. Οποιεσδήποτε ερωτήσεις σχετικά με συστοιχίες τότε; Ναι. [Ακούγεται ερώτηση φοιτητή] Αχ, καλή ερώτηση. Το ερώτημα είναι τι θα συμβεί με το null 0 στην σειρά; Αυτό δεν υπάρχει σε αυτό το πλαίσιο. Αυτό υπάρχει μόνο στο πλαίσιο των χορδών, που είμαστε έτοιμοι να έρθουν να σε λίγο. Αλλά για μια σειρά, όπως στην προκειμένη περίπτωση, το μόνο που έχετε να πάρετε είναι αυτό που ζητάς το λειτουργικό σύστημα για. Και ως ένα μέρος, μήπως αυτό είναι ασαφές, Συνεχίζω λέγοντας ότι θα ζητήσει από το λειτουργικό σύστημα, να ζητήσει από το λειτουργικό σύστημα. Ένα λειτουργικό σύστημα, όπως ίσως γνωρίζετε, είναι το Mac OS, Windows, Linux. Όταν είστε καλώντας λειτουργίες όπως GetFloat ή είστε δηλώνοντας μεταβλητές όπως βαθμούς, Στο τέλος της ημέρας θα είναι αποτελεσματικά ζητώντας από κάποιον άλλο να σας δώσει ότι η μνήμη γιατί φιλοδοξεί ως προγραμματιστές δεν έχουν καμία ιδέα για το πώς να πάρει πραγματικά φυσική πρόσβαση στη μνήμη. Αλλά κάποιος κάνει: το λειτουργικό σύστημα. Έτσι, εκτός από την παρουσίαση μας με αρκετά εικονίδια και μενού και τους φακέλους και τα παρόμοια που βλέπετε στην επιφάνεια εργασίας σας, αν ένα Mac ή PC, λειτουργικά συστήματα κάνουν επίσης το χαμηλό επίπεδο πεζά πράγματα, το άκρως τεχνικό προσωπικό για τη διαχείριση της gigabyte ή 2 gigabytes μνήμης που έχετε, τη διαχείριση της CPU που έχετε, και ούτω καθεξής. Έτσι, όταν είστε σύνταξη κώδικα, είστε πραγματικά συνδέοντας το με το λειτουργικό σας σύστημα σε αυτή την έννοια. Πάω να πρέπει να ελαχιστοποιηθεί αυτό. Εντάξει. Άλλα ερωτήματα σχετικά με πίνακες; Όχι; Εντάξει. Έτσι, η μετάβαση από φυσικά συστοιχίες είναι πραγματικά σε ένα θέμα που είναι λίγο εξοικειωμένοι. Και κοιτάξαμε ποτέ τόσο σύντομο χρονικό διάστημα σε αυτό το τελευταία φορά πάρα πολύ. Αυτό ήταν ένα παράδειγμα συμβολοσειράς από την Τετάρτη. Αυτό το παράδειγμα χορδών ήταν ένα πολύ απλό πρόγραμμα, και έχω απλοποιημένη πραγματικά από ένα ζευγάρι των γραμμών για τους σκοπούς του σήμερα. Το μόνο που κάνει στην γραμμή 19 είναι να πάρετε μια σειρά από το χρήστη, το αποθηκεύει σε μια μεταβλητή που ονομάζεται s. Στη συνέχεια, στη γραμμή 22 και μετά αυτό είναι προφανώς εκτύπωση αυτή τη συμβολοσειρά 1 χαρακτήρα ανά γραμμή. Αλλά πώς το κάνει αυτό; Είμαστε κηρύσσει μια μεταβλητή i, το οποίο ισούται με 0, και αυτό γίνεται συνήθεια παλιά τώρα. Δεν είχε δει αυτό μέχρι την Τετάρτη, αλλά μπορείτε να το είδος του να συναγάγει από το όνομά του strlen επιστρέφει Ακριβώς ό, τι όταν δίνεται s; Το μήκος του string. Έτσι, αν μπορώ να το δώσετε μια συμβολοσειρά, παραθέτω-unquote DAVID, αυτό είναι ενδεχομένως πρόκειται να επιστρέψει σε μένα τον αριθμό 5, λόγω του Δαβίδ. Έτσι, ότι είναι ο σκοπός της ζωής είναι να λάβει μια σειρά, είτε σκληρά κωδικοποιούνται από εσάς ή στην περίπτωση αυτή συνδεδεμένο ως μεταβλητή, ως επιχείρημα, και τα στοιχεία από ό, τι το μήκος της στοιχειοσειράς είναι. Έτσι, εδώ είμαστε τώρα δανείζονται κάποια σημείωση από το προηγούμενο παράδειγμα κουίζ. Αυτό δεν έχει να κάνει με πλωτήρες, δεν έχει τίποτα να κάνει με κουίζ, αλλά αποδεικνύεται ότι το μικρό λευκό ψέμα έχουμε ήδη σας λέω από την εβδομάδα 1 είναι ότι μια σειρά δεν υπάρχει στην πραγματικότητα σε C. Μια συμβολοσειρά στο τέλος της ημέρας είναι πραγματικά ακριβώς μια σειρά. Είναι μια σειρά από bytes, έτσι byte, byte, byte, byte, το οποίο ανάκληση είναι μόνο 8 bits, έτσι κομμάτι της μνήμης, κομμάτι της μνήμης, κομμάτι της μνήμης, κομμάτι της μνήμης. Και τα μέσα με τα οποία ένα string εφαρμογή Είναι βάζοντας τον πρώτο χαρακτήρα εδώ, τότε εδώ, τότε εδώ, τότε εδώ, πλάτη με πλάτη με πλάτη στη μνήμη του υπολογιστή. Έτσι, αν θέλετε να διευκρινίσει μια λέξη σαν Γεια σας, θα έβαζε 1 χαρακτήρα H, Ε τότε, στη συνέχεια, στη συνέχεια, L L, τότε O - 5 χαρακτήρες συνολικά - κάπου στη μνήμη RAM του υπολογιστή σας. Αλλά το βασικό λεπτομέρεια εδώ είναι ότι από όπου και αν πρόκειται να είναι πλάτη με πλάτη με πλάτη με πλάτη, ακριβώς δίπλα ο ένας στον άλλο. Όταν λέω όταν s [i], τι στα αγγλικά είναι αυτό μου δίνει; Τι s [i] αντιπροσωπεύουν σε αυτή την περίπτωση; Ναι. [Φοιτητής] Το i-χαρακτήρα της συμβολοσειράς. Ακριβώς >>. Το i-χαρακτήρα της συμβολοσειράς. Τώρα, εγώ θα ξεκινούν από το 0 ως ανά μου για βρόχο εδώ, αλλά αυτό είναι καλό γιατί ό, τι αρχίζει να μετρά από το 0. Έτσι, s [0] πρόκειται να εκπροσωπήσει την H επιστολή σε μια λέξη όπως HELLO, s [1] πρόκειται να αντιπροσωπεύει ένα γράμμα Ε σαν σε μια λέξη όπως το HELLO, και ούτω καθεξής. Και αυτό που φαίνεται να κάνει σε κάθε επανάληψη του βρόχου αυτού αποθηκεύει προσωρινά την i-οστή χαρακτήρα σε μια μεταβλητή που ονομάζεται C, η οποία είναι απλά μια χαρα, και στη συνέχεια να είμαστε εκτύπωση γ έτσι ώστε στο τέλος της ημέρας τι αυτό το πρόγραμμα κάνει είναι η ακόλουθη. Αν πάω στον πηγαίο κατάλογο και να κάνω string1 και να πάω μπροστά και να τρέξει συμβολοσειρά1, και τότε πληκτρολογήστε μια λέξη όπως HELLO, Enter, το μόνο που κάνει είναι να εκτυπώσετε το 1 χαρακτήρα σε μια στιγμή. Έτσι, υπάρχει μια ευκαιρία για βελτίωση εδώ. Είμαι το είδος του να κάνει περισσότερη δουλειά, ακόμα κι αν είναι πιο σαφής ίσως με αυτό τον τρόπο, ό, τι χρειάζεται. Ποια γραμμή κώδικα εδώ μπορώ ίσως να ρίξει μακριά εντελώς; Ναι. Γραμμή 24. Στη γραμμή 24 Είμαι δηλώνοντας μια μεταβλητή c. Είμαι αποθήκευση του i-χαρακτήρας του s σε αυτό, αλλά τότε είμαι με τη χρήση γ εδώ. Έτσι, είμαι με τη χρήση γ, οπότε νιώθω ότι δεν μπορεί να ρίξει λίγο μακριά γραμμή 24. [Ακούγεται σχόλιο φοιτητής] >> Ακριβώς. Έτσι, όταν πρόκειται να μιλάμε για το σχεδιασμό των προγραμμάτων, παρατηρήσετε αυτή την μικρή απλοποίηση του κώδικα, το οποίο είναι εξίσου αναγνώσιμη, αλλά συνειδητοποιούν ότι s είναι απλά μια μεταβλητή, ο τύπος δεδομένων του είναι ένας πίνακας, έτσι s [i] είναι ακριβώς πρόκειται να επιστρέψει αμέσως να σας το i-οστό χαρακτήρα στην εν λόγω σειρά. Και αν θέλετε να το εκτυπώσετε, αυτό είναι εντάξει. Απλά πρέπει να χρησιμοποιήσετε γ% επειδή δεν είστε εκτύπωση μιας συμβολοσειράς, εκτυπώνετε ένα χαρακτήρα σε μια σειρά, και αυτό έχει πάρα πολύ το αποτέλεσμα της εκτύπωσης του i-χαρακτήρα. Και υπενθυμίζουν τη μόνη διαφορά πραγματικά από την προηγούμενη εβδομάδα με τη χρήση printf είναι ότι ενώ στο παρελθόν τις επόμενες εβδομάδες θα κάνουμε κάτι εξαιρετικά απλό σαν σύμβολο κράτησης θέσης% s τότε το όνομα του μια σειρά εδώ, Τώρα είμαστε σε καταδύσεις λίγο βαθύτερα κάτω από το καπό και να λένε, Δεν εκτυπώσετε το string? εκτύπωση του ενιαίου χαρακτήρα σ 'αυτό. Έτσι, μπορούμε να κάνουμε κάτι λίγο διαφορετικό εδώ επειδή υπάρχει 1 άλλο - δεν bug επειδή το πρόγραμμα αυτό είναι σωστό, αλλά κάνω κάτι ηλίθιο που ανέφερα εν συντομία την Τετάρτη. Αλλά σκέψης πίσω, πώς θα μπορούσε να το σχεδιασμό αυτού του προγράμματος να βελτιωθεί ακόμη περισσότερο; Ναι. [Ακούγεται ανταπόκριση των φοιτητών] >> Ωραία. Έτσι, υπενθυμίζουν ότι εισήγαγε μια δεύτερη μεταβλητή που ονομάζεται n τελευταία φορά, η οποία φαίνεται να έρχεται σε αντίθεση με τον εαυτό μας, γιατί ο στόχος μου πριν από ένα δευτερόλεπτο ήταν απλά για να ρίξει μακριά μια μεταβλητή ως περιττά, αλλά θυμάμαι ότι την Τετάρτη κάναμε πραγματικότητα αυτό. Έχω αλλάξει το βρόχο για να έχουν πραγματικά ένα κόμμα εδώ, τότε n = strlen, και στη συνέχεια, εδώ έκανα i > [Ακούγεται ανταπόκριση των φοιτητών] >> Ακριβώς. Δεν είμαι υπενθυμίζοντας strlen ξανά και ξανά και ξανά, επειδή θυμάμαι πώς το βρόχο για τα έργα. Ακόμη και αν αρχίσουν να παίρνουν πιο περίπλοκη εμφάνιση, Υπενθυμίζω ότι το πράγμα πριν από την πρώτη τελεία είναι η αρχικοποίηση, η οποία συμβαίνει μια φορά. Η προϋπόθεση, όμως, είναι στη μέση, και αυτό παίρνει ελέγχεται κάθε φορά που περνάτε από το βρόχο. Γι 'αυτό είναι χαζό να ζητά τον υπολογιστή την ίδια ερώτηση ξανά και ξανά - Ποιο είναι το μήκος του ΓΕΙΑ ΣΟΥ; Ποιο είναι το μήκος του ΓΕΙΑ ΣΟΥ; Ποιο είναι το μήκος του ΓΕΙΑ ΣΟΥ; - γιατί όπως θα δούμε σήμερα και την Τετάρτη, αυτό είναι σίγουρα πρόκειται να πάρει χρόνο, και δεν είναι μια πολύ καλή χρήση του χρόνου, διότι για να υπολογίσει το μήκος μιας συμβολοσειράς πραγματικά παίρνει ένα κομμάτι της προσπάθειας. Δεν είναι στιγμιαία, όπως είναι σε ορισμένες γλώσσες. Έτσι, με την αλλαγή αυτή στο n, η τιμή είμαι πληρώνουν ό, τι είναι; Βλέπουμε ένα trade-off εδώ. Μπορώ να εξοικονομήσετε χρόνο με το να μην ζητά από το ίδιο καταραμένο ερώτηση ξανά και ξανά, αλλά θα μου κοστίσει κάτι, το οποίο είναι αυτό; [Φοιτητής] Θα χάσει ένα συγκεκριμένο ποσό μνήμης. Ακριβώς >>. Είναι πρόκειται να μου κόστισε κάποια μνήμη. Έτσι, σε αυτή την περίπτωση το κόστος με τι; Ένα άλλο 32 bit, επειδή n είναι απλά ένα int, όπως υπονοείται από τη λέξη int εδώ. Όμως, είναι ότι εντάξει; Ειλικρινά, αυτό είναι πιθανώς εντάξει, γιατί αν το καλοσκεφτείς, όσο μεγαλύτερη είναι η χορδή, τόσο περισσότερο χρόνο θα πάω να χάσουμε strlen επειδή πρόκειται να πάρει καλείται ξανά και ξανά και ξανά για κάθε επανάληψη του βρόχου. Και αυτές τις μέρες, το Mac μου έχει 2 συναυλίες των RAM, αυτές τις μέρες 4 συναυλίες των RAM μερικές φορές. Νομίζω ότι μπορούν να αντέξουν 4 του εν λόγω bytes πραγματικά να επιταχύνει τα πράγματα. Αλλά αυτό πρόκειται να είναι ένα trade-off και ένα θέμα πραγματικά στον προγραμματισμό και στην επιστήμη των υπολογιστών από ποτέ να πάρει τίποτα για δωρεάν. Αν θέλετε να βελτιώσετε κάτι εδώ, θα πρέπει να πληρώσουν για αυτό στην άλλη πλευρά με κάποιο τρόπο. Χώρου συναρτήσει του χρόνου στην περίπτωση αυτή. Έτσι, αυτό ήταν όλα οδηγούν προς κάτι αινιγματικά σαν αυτό, η οποία, όπως ίσως καταλάβει από τώρα, στην πραγματικότητα λέει; [Ακούγεται ανταπόκριση των φοιτητών] >> Ναι, έτσι είναι, Φροντίστε να πίνετε Ovaltine σας, πραγματικά χρησιμοποιώντας έναν αλγόριθμο που ονομάζεται ROT13, ROT 1-3, πράγμα που σημαίνει απλά περιστρέφετε όλα τα γράμματα 13 θέσεις, πράγμα που σημαίνει λάβει Α και στη συνέχεια προσθέστε το 13 έως και πάει τελεία, τελεία, τελεία σε όλη τη διαδρομή μέχρι το 13ο γράμμα μακριά, να κάνει το ίδιο πράγμα για τη Β και Γ και για για το D και ούτω καθεξής. Και έτσι αν θέλουμε πραγματικά μετατρέψει αυτό εδώ χρησιμοποιώντας μια μετατόπιση από 13 θέσεις, θα πάρει πίσω ό, τι είχε λίγο Ralphie, η οποία, Φροντίστε να πίνετε Ovaltine σας. Τώρα, όμως, για το πρόβλημα που 2, στη βασική έκδοση, τουλάχιστον, θα πρέπει να κάνουν το είδος αυτό στον εαυτό σας κρυπτογράφηση, και πρέπει με κάποιο τρόπο να λάβει εισόδου όπως αυτό και να κρυπτογραφήσετε ή να το αποκρυπτογραφήσει. Έτσι, ποιο από τα βασικά στοιχεία του είδους μας οδηγεί σε αυτή την ευκαιρία; Ας ρίξουμε μια ματιά σε αυτό το τρίτο παράδειγμα εδώ. Πρώτα απ 'όλα, αυτό λέγεται ASCII. Τι σημαίνει ASCII αναφερθώ σε; American Standard Κώδικας για Ανταλλαγή Πληροφοριών, το οποίο είναι ένα πραγματικά μεγάλο τρόπος για να πούμε τι; Τι είναι ASCII; [Ακούγεται ανταπόκριση των φοιτητών] >> Τι είναι αυτό; >> [Φοιτητής] Ένας χάρτης χαρακτήρα. >> Ένας χάρτης χαρακτήρα. Χαράσσει απλώς αριθμούς στα γράμματα, γιατί ο κόσμος έχει τυποποιηθεί τι αριθμούς θα εκπροσωπήσει τι γράμματα, έτσι ώστε όλοι μας να χρησιμοποιούν τους υπολογιστές και τα προγράμματα μας όλα είναι συμβατά μόνο όταν πρόκειται για την εκτύπωση από τα πράγματα που εμφανίζονται στην οθόνη. Έτσι, υπενθυμίζουν ότι το 65 συμβαίνει να εκπροσωπούν ένα, 97 συμβαίνει να εκπροσωπούν ένα πεζά. Και έτσι αυτό το απλό πρόγραμμα εδώ είναι ASCII εκμεταλλευόμενοι το γεγονός αυτό - ότι ο κόσμος γνωρίζει ότι το κεφάλαιο Α είναι 65 - και αυτό είναι μόνο η εκτύπωση χαρτογράφησης. Έτσι, πριν να βουτήξει σε αυτόν τον κώδικα, επιτρέψτε μου αντί να ανοίξει ένα παράθυρο τερματικού. Επιτρέψτε μου να προχωρήσει και να κάνει ASCII, και στη συνέχεια, ας τρέξει ακριβώς αυτό το πράγμα απλά για να χαλάσει την έξοδο. Και αυτό κάνει ακριβώς αυτό: ένα πραγματικά μεγάλο διάγραμμα που απλά μου λέει όλους τους διάφορους κωδικούς για όλα τα διάφορα γράμματα. Έτσι, ένα σούπερ απλό πρόγραμμα, αλλά δεν είχα στο σκληρό κωδικό τους 52 γραμμές παραγωγής: 26 κεφαλαία, 26 πεζά. Αντ 'αυτού, το έκανα αυτό με προγραμματισμό με ένα ζευγάρι των βρόχων. Παρατηρήστε τι έκανα εδώ. I επαναλαμβάνεται από το i είναι 65 σε έως και 65 + 26, επειδή ήθελα να εκτυπώσετε 26 γράμματα στην αγγλική αλφάβητο, i + + σε κάθε επανάληψη, και να παρατηρήσετε τώρα αυτό πάλι. Είναι η επανεμφάνιση της στοιχειοχυσίας φίλος μας σύμφωνα με την οποία μπορείτε να μετατρέψετε 1 Τύπος δεδομένων σε ένα άλλο γιατί ό, τι θέλω να κάνω σε αυτό το συγκεκριμένο πρόγραμμα; Θέλω να υπολογίζει αριθμητικά, διότι αυτό είναι το πώς μεγάλωσα καταμέτρηση - 65, 66, 67, και ούτω καθεξής - αλλά δεν θέλω να εκτυπώσετε μόνο τους αριθμούς. Θέλω να εκτυπώσετε το γράμμα ακολουθούμενο από τον αριθμό. Θέλω να εκτυπώσετε A: αριθμός, Β: αριθμός, αλλά μπορώ να το κάνω αυτό με τον ίδιο ακριβώς μεταβλητή. Γι 'αυτό και εκτυπώστε γ% ως σύμβολο κράτησης θέσης για το χαρακτήρα, Δ% ως σύμβολο κράτησης θέσης για ένα ψηφίο ή έναν αριθμό. Τότε τι μπορώ να συνδέσετε για αυτές τις 2 κράτησης θέσης; Θέλω πρώτα συνδέστε το αντίστοιχο χαρακτήρα του i, και στη συνέχεια μπορώ να εκτυπώσω από το ίδιο i. Έτσι παρατηρήσετε αυτό πολύ απλά λειτουργεί. Ακριβώς όπως μπορώ να ρίχνει από ένα άρμα σε int για να πάνε από ένα πραγματικό αριθμό σε ακέραιο, εδώ μπορώ να πάω από έναν int σε char, το οποίο είναι λίγο περίεργο - δεν είναι αρκετά χάρτη πάνω στον πραγματικό κόσμο - αλλά σε ηλεκτρονικούς υπολογιστές μια χαρα είναι απλά ένας αριθμός κάτω από την κουκούλα, έτσι ώστε να είμαστε πάντα τόσο σαφής εδώ στον υπολογιστή, λέγοντας, printf, εκτυπώστε δεν θ ως 65 ετών, να το τυπώσετε από το αριθμητικό ισοδύναμο του. Και βγάζει εγώ τεχνικά δεν χρειάζεται καν αυτό. Αυτό που έκανα πριν από λίγο ρητά χύτευση καθορίζοντας ποια δεδομένα τύπου θέλω να πάω από και προς. Αλλά παρατηρώ ότι έχω ήδη το γ% κράτησης θέσης και αυτό το άλλο κράτησης θέσης% c εδώ. Ακόμη και αν αυτό δεν είναι int, ο υπολογιστής αναγνωρίζει ότι ένα απανθράκωμα, είναι απλά μια int κάτω από την κουκούλα. Έτσι, αν πραγματικά αυτό το μεταγλωττίσετε και να εκτελέσετε ξανά το πρόγραμμα ASCII, παρατηρήσετε ότι εξακολουθεί να λειτουργεί ακριβώς επειδή ο υπολογιστής αντιλαμβάνεται ότι υπάρχει αυτή η αλληλογραφία. Τώρα, είναι πιο σημαντικό να κάνουμε τη ρητή χύτευσης στον κόσμο των αρμάτων να ints γιατί εκεί έχετε κάνει πραγματικά μια υπολογισμένη απόφαση: πετάμε τα πάντα μετά την υποδιαστολή. Εδώ υπάρχει πραγματικά τίποτα για να ρίξει μακριά, γιατί ένας χαρακτήρας είναι απλά ένας αριθμός, και ένα string είναι απλώς μια σειρά από χαρακτήρες. Έτσι, όταν έρχεται η ώρα για την υλοποίηση κάποιου κρυπτογράφησης ή αποκρυπτογράφησης, πώς είναι ότι μπορούμε να μεταφράσουμε πραγματικά κάτι σαν αυτές τις ανοησίες για, Να είστε βέβαιος να πιει Ovaltine σας; Τι θα συμβεί αν γνωρίζουμε αυτή τη στιγμή - ας ρίξουμε ως υπόθεση - ότι το κλειδί, ο αριθμός ότι είμαστε εκ περιτροπής όλα αυτά τα γράμματα με, είναι ο αριθμός 13; Γι 'αυτό και πήγε από το γράμμα Β σε όλη τη διαδρομή έως Ξ στην αρχή της πρότασης, Να είστε βέβαιος να πιει Ovaltine σας, γιατί αν το κάνω Β και στη συνέχεια πάω Γ, Δ, Ε, ΣΤ, Ζ, Η, Θ, Ι, Κ, L, Μ, Ν, Ο, γι 'αυτό η κρυπτογράφηση της Β επιστολής γίνεται O γιατί προστέθηκε μόλις 13 σε αυτό. Έτσι, αν θέλω να αποκρυπτογραφήσει αυτό, κατ 'ουσίαν, πρέπει να λάβει O και στη συνέχεια αφαιρέστε 13 από αυτό. Ή, ειλικρινά, γιατί υπάρχει 26 γράμματα του αλφαβήτου, αυτό είναι υπέροχο συμμετρικό, Μπορούμε επίσης να προσθέσουμε μόνο 13 και θα πάρει πίσω το γράμμα B. Αλλά πώς θα πάτε για την εφαρμογή κάτι τέτοιο σε Καίσαρα ή το χειρισμό πραγματικά χορδές σε γενικές γραμμές; Αν το γράμμα Β είναι ό, τι αριθμό; Ποιο είναι το γράμμα Β; Γι 'αυτό είναι 66, έτσι δεν είναι; Έτσι, αν το γράμμα Α είναι 65 και το γράμμα Β είναι 66, έτσι 66, το μόνο που έχετε να κάνετε είναι να προσθέσετε 13 έως αυτήν, και αυτό μου δίνει 79. Και αν πάμε λίγο να μας εξαπατήσει φύλλο, 79 πράγματι χάρτες στο O. Αλλά υπάρχει ένα κομμάτι μιας υπόθεσης γωνία εδώ. Τι είναι, ας πούμε, το γράμμα Z; Αν το κάνουμε 66 + 25 για να πάρει όλη τη διαδρομή μέχρι το τέλος της αλφαβήτου, είμαστε στο 91. 91 + 13 μου δίνει 104, και μάντεψε τι; 104 δεν ισούται με ένα κεφαλαίο γράμμα. Ας πάμε πίσω σε ένα μικρό φύλλο εξαπατήσει εδώ. Αν επανάληψη αυτό το πρόγραμμα στη συσκευή, ειδοποίηση ότι 104, αν πάω πίσω στο παράθυρο του τερματικού, 104 είναι προφανώς το πεζό h. Χρειάζεται λοιπόν κάποια βασικά τέχνασμα εδώ για να βεβαιωθείτε ότι όταν ξεκινούν Z και προσθέτουμε 13 έως το δεν θέλουμε απλά να να προχωρά σε όλο και μεγαλύτερο αριθμό. Τι θέλουμε πραγματικά να κάνουμε; Θέλετε να τυλίξετε γύρω. Έτσι, αποδεικνύεται, όπως έχετε δει πιθανώς στο τμήμα τώρα ή στο σύνολο spec ίδιο το πρόβλημα συνειδητοποίησε ότι υπάρχει αυτή η άλλη επιχείρηση στην C, που επίσης είναι ένα σημάδι τοις εκατό, αλλά ότι έχουμε χρησιμοποιήσει% εδώ για να καθορίσετε ένα σύμβολο κράτησης θέσης, γνωρίζουμε ότι, ειδικά για το πρόβλημα σύνολο 2, υπάρχει και κάτι σαν αυτό: int x = y z%. Επιτρέψτε μου να παρουσιάσει ακριβώς αυτό ως μια πολύ γενική μορφή του αυτό. Ποσοστό τι σημαίνει σε μια γλώσσα προγραμματισμού; >> [Φοιτητής] Modulo. Modulo, το οποίο είναι ένα φανταχτερό τρόπο λέγοντας το υπόλοιπο. Ακόμα κι αν υπάρχει μια μικρή διαφορά με τον ορισμό εκεί, αυτό σημαίνει χωρίζουν από y z, αλλά δεν επιστρέφουν το αποτέλεσμα του εν λόγω τμήματος? αντ 'αυτού, να επιστρέψει το υπόλοιπο. Έτσι, εάν το γ είναι στην πραγματικότητα 3 και το ζ είναι στην πραγματικότητα 2, 3 διαιρείται με 2 είναι 1 με υπόλοιπο 1, έτσι τι πραγματικά ίσες x σε αυτό το σενάριο; 1. Αυτό είναι ένα τέτοιο απλό, χαμηλού επιπέδου ιδέα. Παίρνει λίγο χρόνο για να πάρετε το μυαλό σας τυλιγμένο γύρω από το επειδή είναι πιθανώς μια στιγμή δεδομένου ότι έχετε ακόμα έπρεπε να νοιάζονται για υπολείμματα και να τα χρησιμοποιούν για κάτι πραγματικά σκόπιμη, αλλά σε αυτή την περίπτωση το απλό γεγονός ότι μπορείτε να πάτε από ένα μεγάλο αριθμό σαν 3 σε ένα σχετικά μικρό αριθμό όπως είναι το 2 και στη συνέχεια τυλίξτε γύρω αποτελεσματικά χρησιμοποιώντας το υπόλοιπο σε μικρότερη τιμή, όπως 1 πρόκειται να είναι ένα πολύτιμο τέχνασμα ότι μπορούμε να χρησιμοποιήσουμε τόσο για κάτι σαν Καίσαρα και αυτό το άλλο πράγμα Vigenere πρόβλημα σε σετ 2, αλλά αυτό πρόκειται να είναι ένα επαναλαμβανόμενο τέχνασμα τη διάρκεια του εξαμήνου. Αυτή η απλή, απλή ιδέα απλά να παίρνουμε το υπόλοιπο σε γενικές γραμμές πρόκειται να επιτρέψει σε μας για να τυλίξει γύρω. Και όπως έχουμε αρχίσει να παίζει περισσότερο με συστοιχίες, καθώς αρχίζουν να παίζουν περισσότερο με τη μνήμη το ίδιο, αυτό πρόκειται να γίνει όλο και περισσότερο από ένα ισχυρό τέχνασμα. Έτσι, οποιεσδήποτε ερωτήσεις τότε ASCII ή η αναπαράσταση της χορδές, όπως πίνακες; Και εμείς θα το πάρω μέχρι 1 εγκοπή περαιτέρω. Ναι. [Ακούγεται ερώτηση φοιτητή] >> Καλή ερώτηση. Τι σημαίνει όταν μια μεταβλητή έχει ένα αστερίσκο μπροστά από αυτό; Επιτρέψτε μου να αναβάλει την απάντηση ότι, σε κάθε λεπτομέρεια, αλλά ότι αναφέρεται σε ένα θέμα γνωστό ως δείκτη. Οι δείκτες έχουν να κάνουν με τη μνήμη, και είμαστε πραγματικά σήμερα το πρώτο βήμα προς αυτή τη συζήτηση, αλλά για τώρα, επιτρέψτε μου να προσποιούνται ότι το αστέρι δεν υπάρχει και θα εξακολουθήσει να απευθύνει έκκληση χορδές χορδές αντί να χρησιμοποιεί char *, που πιθανώς έχετε ξαναδεί και θα βάλω στην οθόνη σε μια στιγμή σαν τρέιλερ. Γι 'αυτό και θα επανέλθω σε αυτό τον τρόπο περισσότερη λεπτομέρεια από ό, τι πολλοί από εσάς θα θέλατε πιθανότατα. Τελικά, όχι σήμερα. Ναι. [Ακούγεται ερώτηση φοιτητή] Σε ποιο πλαίσιο δεν θα πρέπει να παρέχει το σήμα για ένα χαρακτήρα; >> [Φοιτητής] Ναι. Έτσι, από προεπιλογή, όταν δεν έχετε θέσει μια +, υποτίθεται ότι μόλις θετικούς αριθμούς. Έτσι, αν γράψετε μόνο τον αριθμό 1, είναι ένα θετικό 1. Αν πραγματικά θέλετε να καθορίσετε την άρνηση της αξίας, που κυριολεκτικά έχουν να κάνουν -1 στο πληκτρολόγιό σας. Αλλά αυτό δεν είναι πιθανώς η ερώτησή σας. >> [Ακούγεται ανταπόκριση των φοιτητών] Καλή ερώτηση. Εντάξει. Έτσι, αυτό έχει να κάνει, υποθέτω, με κάποιο είδος bug που έτρεξε σε επειδή ήσασταν μετατροπή έναν ακέραιο σε ένα χαρακτήρα, αλλά με κάποιο τρόπο πήρε αρνητικότητα που εμπλέκονται, και έτσι ο χαρακτήρας μόλις βγήκε munged κάπως. Έτσι, για τώρα, επιτρέψτε μου να υπεραπλουστεύουμε λίγο μέχρι να έρθει πίσω σε αυτό το είδος του θέματος. Προς το παρόν, σκέφτομαι τα πράγματα με αυτόν τον τρόπο - και αυτό είναι μια υπεραπλούστευση. Όμως, στον κόσμο του ακεραίου, έχετε πόσα bits στη διάθεσή σας; Έχετε 32 bits. Και μέχρι στιγμής, έχουμε μιλήσει για το συνολικό αριθμό των ακεραίων ως εκ τούτου μπορείτε να αντιπροσωπεύουν είναι περίπου 4 δισεκατομμύρια συνολικά, επειδή έχετε 32 bits, έτσι ώστε να είναι 2 έως το 32, έτσι ώστε να είναι περίπου 4 δισ. ευρώ. Αλλά είδαμε μια εβδομάδα ή 2 πριν ότι δεν έχετε πραγματικά μια σειρά από αριθμούς από 0 μέχρι και σε 4 δισ. ευρώ. Η σειρά πηγαίνει αντίθετα από περίπου 2 δισεκατομμύρια αρνητική σε θετική 2 δισ. ευρώ. Αλλά τίθεται το ερώτημα, πώς θα εκπροσωπούν την έννοια της αρνητικής 2 δισεκατομμύρια πόσο μάλλον αρνητική 1; Προς το παρόν, μπορούμε να υπεραπλουστεύουμε και μόνο να πω ότι θα πάμε να χρησιμοποιήσετε το αριστερότερο bit των 32 bits, και αν είναι το 1 είναι ένας αρνητικός αριθμός, και αν είναι το 0 είναι ένας θετικός αριθμός. Το πρόβλημα με την απλουστευμένη παρουσίαση των αρνητικών αριθμών είναι ότι αν ήταν σκόπιμα να είναι έξυπνος και προσπαθεί να μετατρέψει από ένα χαρακτήρα σε μια σειρά ή αντίστροφα, δεν υπάρχει τέτοιο πράγμα όπως ένα αρνητικό χαρακτήρα. Στον κόσμο του ASCII, η οποία χρησιμοποιεί μόνο 8 bits, όλων των 8 αυτών των bits θέμα, και το αριστερό κομμάτι δεν έχει καμία σχέση με την αρνητικότητα. Και ακριβώς για να είναι σαφής, όταν λέω αριστερότερα bits, Υπενθυμίζω ότι όταν κάναμε λίγο-σχετικά παραδείγματα μας την πρώτη εβδομάδα Υπενθυμίζω ότι αντλήσαμε τα πράγματα όπως 1001101, κάτι σαν αυτό. Όταν λέω το αριστερότερο bit, απλά σημαίνει κυριολεκτικά το 1 που γράφετε σε όλη τη διαδρομή πάνω προς τα αριστερά. Έτσι, στον κόσμο των χαρακτήρων δεν υπάρχει η έννοια της αρνητικότητας, έτσι ώστε αριστερό κομμάτι έχει πραγματικά κάτι να κάνει με το ASCII, τίποτα να κάνει με την αρνητικότητα. Γι 'αυτό ακούγεται σαν - και έξω από το πλαίσιο είναι δύσκολο να απαντήσω ακριβώς - αλλά με κάποιο τρόπο, κωδικό σας προκαλεί σύγχυση το ότι ήταν αριστερότερο bit, οι οποίοι αντιπροσωπεύουν μια αρνητική τιμή όταν πραγματικά ήταν μέρος του χαρακτήρα στην ερώτηση. Και πάλι, είμαι υπεραπλούστευση, επειδή οι υπολογιστές κάνουν πραγματικά κάτι λίγο πιό φανταχτερό από ό, τι ακριβώς αλλάζει ότι αριστερότερο bit σε 1 για αρνητικό πρόσημο σε σχέση με ένα 0. Οι αντ 'αυτού, αν είστε περίεργοι να Google, χρησιμοποιήστε κάτι συνήθως ονομάζεται συμπλήρωμα ως προς 2, το οποίο είναι λίγο πιο πολύπλοκη από μια προσέγγιση αλλά η ιδέα είναι τελικά το ίδιο. Έτσι, με λίγα λόγια, είχε να κάνει με το γεγονός ότι ήσασταν μασάζ έναν αριθμό σε ένα χαρακτήρα ή το αντίστροφο, αλλά κωδικός σας δεν ήταν εν γνώσει του γεγονότος ότι 1 από εκείνα τα κομμάτια είχε σημασία στο αριθμητικό κόσμο. Αυτό δεν είναι η περίπτωση στον κόσμο χαρακτήρα. Αλλά ακούγεται σαν να καθοριστεί, οπότε αμφισβητήσιμο τώρα. Άλλες ερωτήσεις. Εντάξει. Έτσι, μέχρι στιγμής, όλα τα προγράμματα που έχουμε γράψει έχουν ίσως εισόδου από το χρήστη με τη μορφή των λειτουργιών όπως GetInt, GetString, ή αν έχετε την ανάγνωση μπροστά σε διάφορα βιβλία ή σε απευθείας σύνδεση αναφορές, εσείς οι ίδιοι θα μπορούσαν να χρησιμοποιηθούν λειτουργίες όπως η scanf η οποία, ειλικρινά, που χρησιμοποιούμε στη βιβλιοθήκη CS50. Αλλά σε μια εβδομάδα ή 2, θα σας δείξουμε πώς πραγματικά η βιβλιοθήκη CS50 υλοποιείται έτσι ώστε να μπορούμε να πάρουμε αυτές τις ρόδες μακριά εντελώς. Αλλά αποδεικνύεται ότι δεν υπάρχει άλλος τρόπος για να πάρετε είσοδο από το χρήστη. Στην πραγματικότητα, εμείς οι ίδιοι έχουν χρησιμοποιήσει τα επιχειρήματα της γραμμής εντολών για μια-δυο εβδομάδες τώρα. Κάθε φορά που έχουμε τρέξει Clang ή έχουμε κάνει τρέχει, δεν έχουμε πληκτρολογήσει μόνο κλαγγή, Enter, δεν έχουμε να πληκτρολογήσει, Enter. Τι έχουμε γράψει συνήθως μετά την κλαγγή λέξη στο τερματικό εντολών παράθυρα μας; [Φοιτητής] Το όνομα του αρχείου. >> Το όνομα του αρχείου, έτσι δεν είναι; Hello.c ή mario.c ή οτιδήποτε το σχετικό όνομα του αρχείου είναι. Και με αυτή την έννοια ό, τι έχετε κάνει είναι πραγματικά έχετε επηρεαστεί η συμπεριφορά του Clang γιατί σίγουρα οι άνθρωποι που έγραψαν Clang δεν είχε ιδέα ότι λίγο παλιό σας επρόκειτο να γράψει ένα πρόγραμμα που ονομάζεται mario.c χρόνια αργότερα. Έτσι θα έπρεπε να επηρεάσει κάπως τη συμπεριφορά του εν λόγω προγράμματος, και ότι Clang πρόγραμμα έπρεπε να γραφτεί με τέτοιο τρόπο ώστε να μπορεί να δεχτεί είσοδο από εσάς με την προσθήκη των λέξεων για την ερώτηση πριν Εισάγετε τα χτυπήματα των χρηστών. Έτσι, αποδεικνύεται ότι εδώ και αρκετό καιρό έχουμε δηλώνοντας σχεδόν το σύνολο των προγραμμάτων μας για να ξεκινήσει σαν αυτό - int main (void) - και στη συνέχεια έχουμε προχωρήσει και άρχισε να γράφει κώδικα μας. Και μπορεί να έχουμε κάποια απότομη περιλαμβάνει στο επάνω μέρος του αρχείου, αλλά σχεδόν όλα τα προγράμματα μας μέχρι τώρα έχουν ξεκινήσει με αυτό παρόλο που μπορεί να έχετε δει σε τμήμα, σε βιβλία, σε απευθείας σύνδεση αναφορές ότι αυτό δεν πρέπει στην πραγματικότητα να είναι άκυρη. Μια άλλη νόμιμη μορφή γι 'αυτό να είναι int argc και argv τότε εγχόρδων []. Και τώρα τι είναι αυτό συνεπάγεται; Αποδεικνύεται ότι argc, η οποία είναι μια ανθρώπινη σύμβαση - θα μπορούσαμε να ονομάσουμε αυτό το foo, αλλά θα ήταν απλώς να είναι πολύ λιγότερο σαφές στους αναγνώστες - argc είναι απλώς ένα επιχείρημα για τη λειτουργία που ονομάζεται κύριος που αντιπροσωπεύει ό, τι; Τι σημαίνει argc σταθεί για για όσους είναι εξοικειωμένοι; [Ακούγεται ανταπόκριση των φοιτητών] >> Ναι, τον αριθμό των επιχειρημάτων ή αριθμός επιχείρημα. Είναι τόσο απλό όσο αυτό. Πόσα επιχειρήματα πέρασαν σε αυτό το πρόγραμμα; Τι σημαίνει αυτό; Εάν στη γραμμή εντολών που έχω τρέξει κάτι τέτοιο - κλαγγή-mario.c - argc όταν χτύπησα Εισάγετε πρόκειται να λάβει την τιμή του, κάπως συγκεχυμένα, 2. Έτσι, αποδεικνύεται ότι είναι argc μετράνε επιχείρημα, αλλά για ιστορικούς λόγους, το όνομα του ίδιου του προγράμματος περιλαμβάνεται στην εν λόγω μέτρηση. Έτσι argc είναι 2 όταν έγραψα κλαγγή mario.c. Τι περιέχει argv; Πρώτα από όλα, argv μοιάζει με ένα κορδόνι, αλλά όχι αρκετά διότι από την περασμένη Τετάρτη και ακόμη περισσότερο σήμερα, αυτές οι αγκύλες δηλώνουν τι; Αυτό είναι μια σειρά. Δεν υπάρχει αριθμός στη σειρά, και ότι θα πρέπει να έχει νόημα διαισθητικά επειδή οι άνθρωποι που έγραψε χρόνια πριν Clang σίγουρα είχε καμία ιδέα πόσοι άνθρωποι λέξεις όπως μας θα πρέπει να πληκτρολογήσετε στην προτροπή Enter πριν από το χτύπημα. Έτσι, σε αυτή την περίπτωση εδώ που έχουν δηλώσει την κύρια λειτουργία του, όπως τη λήψη μια σειρά από επιχειρήματα, 0 ή περισσότερα ορίσματα. Δεν ξέρουν εκ των προτέρων πόσα υπάρχουν, έτσι δεν γίνεται σκοπίμως αριθμός μέσα από αυτές τις αγκύλες. Αλλά το γεγονός ότι οι αγκύλες υπάρχουν λένε τον υπολογιστή, αναμένουν μια σειρά. Argv είναι ακριβώς σημειογραφία στενογραφία για το διάνυσμα επιχείρημα. Ένα διάνυσμα είναι ένα φανταχτερό τρόπο λέγοντας πίνακα, και πίνακας είναι ένα φανταχτερό τρόπο λέγοντας μια λίστα ή συλλογή. Έτσι, αυτό σημαίνει απλά ότι αν γράψετε κύρια σαν αυτό αντί του όπως το πώς έχουμε κάνει για τις τελευταίες δύο εβδομάδες, το πρόγραμμά σας έχει τώρα τη δύναμη να αποδεχθεί τα επιχειρήματα της γραμμής εντολών έτσι ώστε να μην είναι πλέον έχετε να γράψετε Mario και στη συνέχεια πατήστε Enter, στη συνέχεια, πληκτρολογήστε σε ένα αριθμό για το πόσες ομάδες υψηλού θέλετε η πυραμίδα να είναι, στη συνέχεια, πατήστε Enter και πάλι. Δεν χρειάζεται καν να χρησιμοποιήσετε GetString πια ή GetInt GetFloat ή για εκείνο το θέμα. Μπορούμε να περιμένουμε απλά ο χρήστης να πληκτρολογήσετε αυτά τα λόγια η ίδια στην προτροπή ακριβώς όπως οι συγγραφείς της Clang αποφάσισε ότι θα ήταν ένα πραγματικά ενοχλητικό πρόγραμμα αν για την κατάρτιση κώδικα σας δακτυλογραφημένο πρώτα κλαγγή, πατήστε Enter, τότε είπε στον χρήστη, παρακαλώ πληκτρολογήστε το όνομα του αρχείου που θέλετε να μεταγλωττίσετε, τότε θα πληκτρολογήσετε mario.c και πατήστε Enter. Αλλά αυτό είναι ακριβώς ό, τι έχουμε κάνει για τους χρήστες μας τις τελευταίες δύο εβδομάδες. Χρησιμοποιούμε GetString και περιμένουμε έως ότου το πρόγραμμα τρέχει για να τους προτρέψει για εισαγωγή. Ότι δεν χρειάζεται πλέον να είναι η περίπτωση. Έτσι, σε αυτό το παράδειγμα εδώ, έχουμε τώρα σειρά argv, και αυτό είναι πάρα πολύ μια υπεραπλούστευση, ρόδες που πολύ σύντομα θα βγει. Αυτός είναι ο πιο κατάλληλος τρόπος για να γράψω αυτό το εναλλακτικό δήλωση του κύριου γιατί αποδεικνύεται ότι αυτό που κρατάμε καλώντας σειρά έχει πραγματικά ένα αστέρι, ένας αστερίσκος, σε πραγματικό ορισμό της, αλλά αυτό φαίνεται μόνο περίπλοκη, αυτό είναι προκαλέσει σύγχυση στην αρχή, έτσι ώστε να απλοποιηθεί με απλά δημιουργώντας ένα συνώνυμο του είδους στη βιβλιοθήκη CS50 ότι char * χάρτες για αυτό το πιο φιλικό προς το χρήστη σειρά λέξη. Ας προσπαθήσουμε πραγματικά αυτό τότε. Επιτρέψτε μου να πάμε μπροστά και να ανοίξει το gedit εδώ. Επιτρέψτε μου να πάμε μπροστά και να ανοίξει argv του 1. Αυτό το πρόγραμμα τυπώνει προφανώς τα επιχειρήματα, αλλά στα αγγλικά όρους, κοιτάζοντας αυτόν τον κώδικα, τι κάνει αυτό πιο συγκεκριμένα; Αν πληκτρολογήστε την εντολή a.out foo bar, τι θα εκτυπωθεί σε μαύρο και λευκό παράθυρο μου; A.out foo bar, Enter. Προχωρήστε. Ναι. >> [Ακούγεται ανταπόκριση των φοιτητών] Καλή. Έτσι a.out, νέα γραμμή, foo, νέα γραμμή, μπαρ, νέα γραμμή. Γιατί συμβαίνει αυτό; Μπορούμε σίγουρα να επιβεβαιώσει σε λίγο. Αυτό είναι το είδος της μια χνουδωτή γραμμή κώδικα.  Τυπώνει μόνο μια νέα γραμμή μόνο για να κάνει τα πράγματα πιο όμορφη στην οθόνη. Αυτό είναι ένας βρόχος που είναι επανάληψη από 0 μέχρι και σε argc, και αυτό που αυξάνει σε κάθε επανάληψη + +. Έτσι, αυτό είναι τώρα λέει τυπώσει μια συμβολοσειρά, όπως υπονοείται από αυτό% s. Argv [i] είναι λίγο πολύ η ίδια ιδέα από το προηγούμενο παράδειγμα. Θα χρησιμοποιηθεί για να καλέσετε την μεταβλητή s? Τώρα λέγεται,, αυθαίρετα argv. Αυτό σημαίνει εκτυπώσετε το i-επιχείρημα που πληκτρολογήσατε στη γραμμή εντολών, και στη συνέχεια, μετά από όλο αυτό το πράγμα γίνεται, μόνο και μόνο για το καλό μέτρο εκτυπώσετε μια άλλη νέα γραμμή. Ας δούμε αυτό. Επιτρέψτε μου να ανοίξει το παράθυρο τερματικού. Επιτρέψτε μου να καταρτίζουν από 1 argv, και τώρα επιτρέψτε μου να τρέχουν από 1 argv, Enter. Χμμ. Εντάξει. Ας τρέξει foo bar. Ενδιαφέρουσες. Baz. Και αν έχετε ποτέ αναρωτηθεί γιατί το είδος αυτό, αυτό είναι μόνο ένα ηλίθιο επίσης σύμβαση της επιστήμης των υπολογιστών. Ο κόσμος χρειάζεται συχνά μόνο λεκτική κράτησης θέσης για τις λέξεις. Έτσι, αν θέλετε να μιλήσουμε για κάποια γενική σειρά, επιστήμονες της πληροφορικής έχουν την τάση μόνο να πω foo όταν χρειάζονται μια τυχαία λέξη, τότε λένε μπαρ αν χρειάζεστε ένα δεύτερο τυχαίο λέξη, τότε λένε baz αν χρειαζόταν μια τρίτη λέξη, τότε λένε qux αν χρειάζονται ένα τέταρτο λέξη, και στη συνέχεια, υπάρχει μια τεράστια θρησκευτική απευθείας σύνδεση συζήτηση για το τι έρχεται μετά qux, ώστε να μπορείτε να το Google ότι για να καταλάβουμε ποια είναι η άλλη αυθαίρετη λέξη θα πρέπει να είναι. Αλλά αυτά δεν έχουν καμία απολύτως νόημα, αν foo bar, αν το Google ότι, αυτό δεν έχει νόημα, το οποίο αποτελεί μέρος της ετυμολογίας εδώ. Έτσι, όλα αυτά που κάνει τότε η εκτύπωση 1 από αυτές τις χορδές ανά γραμμή. Έτσι, αν αντ 'αυτού, όμως, ήθελε να πάρει λίγο πιό φανταχτερό, ας υποθέσουμε ότι δεν θέλετε να εκτυπώσετε κάθε χορδή ανά γραμμή? Ήθελα να εκτυπώσετε κάθε χαρακτήρα από κάθε σειρά ανά γραμμή. Πώς θα μπορούσα να κάνω ότι αντί; Τι πρέπει να αλλάξει για αυτό το πρόγραμμα, αν θέλω να εκτυπώσετε όχι κάθε λέξη αλλά θέλω να εκτυπώσετε το κάθε γράμμα λέξης με επιστολή με την επιστολή, τότε η επόμενη λέξη επιστολή με την επιστολή με την επιστολή; Πώς μπορούμε να συνδυάσουμε αυτές τις ιδέες μέχρι στιγμής; Ναι. [Φοιτητής]% c. >> Εντάξει. Χρειάζεται λοιπόν κάπου ένα γ%. Καλό, γιατί δεν θέλετε να εκτυπώσετε ολόκληρο χορδές, θέλω να εκτυπώσετε χαρακτήρες. Τι άλλο; [Ακούγεται ανταπόκριση των φοιτητών] >> Ενδιαφέρουσες. Έτσι, χρειαζόμαστε ένα είδος δεύτερη διάσταση εδώ τώρα επειδή σκέφτομαι argv ως μια σειρά, αλλά είναι μια σειρά από χορδές. Αλλά, όπως, όπως, 15 λεπτά πριν, τι είναι μια χορδή; Είναι μια σειρά από χαρακτήρες. Έτσι, πραγματικά, argv είναι μια σειρά από μία συστοιχία των χαρακτήρων, μία συστοιχία των συστοιχιών των χαρακτήρων. Έτσι αποδεικνύεται ότι μπορούμε να χρησιμοποιήσουμε λίγο πιο τετράγωνο σύμβολα στήριγμα. Ας το κάνουμε αυτό. Στην κορυφή αυτού του βρόχου στη γραμμή 19, Πάω να επαναλάβει από i μέχρι argc, αλλά στη συνέχεια Πάω να το κάνετε αυτό: για - δεν μπορώ να μπορώ να χρησιμοποιήσω τώρα. Χρειάζομαι μια άλλη μεταβλητή, επειδή θέλω να επαναλάβει πάνω από τις λέξεις αλλά στη συνέχεια και πάνω από τα γράμματα των λέξεων οπότε I είδος έχει ένα κατακόρυφο άξονα και έναν οριζόντιο άξονα, είδος εννοιολογικά. Έτσι, int j παίρνει 0, τότε θέλω να κάνω ι όσο ι είναι μικρότερο - και εγώ θα καθαρίσει αυτό επάνω σε ένα κομμάτι. Πώς μπορώ να επαναλάβει τα γράμματα σε μια σειρά; Το κάναμε αυτό πριν από λίγο. Strlen του argv [i]. Καλή. Και πάλι, κάνω μια μικρή αναποτελεσματικότητα εδώ με το να μην δημιουργεί n ή οτιδήποτε άλλο, αλλά θα επανέλθω σε αυτό. Έτσι τώρα j + +. Τώρα έχω να παύλα περαιτέρω εδώ. Τι μπορώ να κάνω τώρα θέλετε να εκτυπώσετε σε κάθε επανάληψη; [Ακούγεται ανταπόκριση των φοιτητών] >> Έτσι [i] θα μου δώσει τη λέξη. [I] [j], περίπου όπως μια μήτρα. Όσοι από εσάς με τα μαθηματικά-y υπόβαθρο, είμαστε το είδος της ευρετηρίασης ακόμη βαθύτερα σε αυτή την μήτρα ή αυτή σειρά των πινάκων, Αυτή η 2-διάστατη δομή. Έτσι, τώρα ας δούμε τι συμβαίνει εδώ. Επιτρέψτε μου να ανοίξει μεγαλύτερο παράθυρο τερματικού μου. Επιτρέψτε μου να κάνω επανάληψη του argv του 1. Και έχω μαντάρα εδώ, το οποίο είναι ένα καλό μάθημα, γιατί εγώ ξέχασα να το κάνετε αυτό. Εμμέσως δηλώνοντας «strlen« C λειτουργία της βιβλιοθήκης με ανυπόγραφο τύπου »- Εγώ δεν ξέρω καν τι το υπόλοιπο του εν λόγω μέσου, αλλά έχω ξαναδεί αυτό, δηλώνοντας έμμεσα. Κάθε φορά που βλέπουμε αυτό το σφάλμα, τι σημαίνει αυτό συνήθως σημαίνει; [Ακούγεται ανταπόκριση των φοιτητών] >> ξέχασα μια βιβλιοθήκη επάνω στην κορυφή. Αλλά περιμένετε ένα λεπτό. Συνήθως έχω μαντάρα γιατί ξέχασα το CS50 βιβλιοθήκη, αλλά ότι υπάρχει. Συνήθως έχω μαντάρα γιατί έχω ξεχάσει Standard I / O. Και ειλικρινά, εγώ δεν χρειάζεται καν αυτό. Εμείς δεν χρησιμοποιείτε GetString σήμερα. Έτσι, αυτό που είμαι λείπει; Υπάρχει μια άλλη βιβλιοθήκη ότι τώρα θα πρέπει να χρησιμοποιούν περιστασιακά ονομάζεται string.h, και αυτό είναι απλά ένα ακόμη βιβλιοθήκη που διαθέτει περισσότερες λειτουργίες που δεν είναι στο πρότυπο I / O. Ας πάμε πίσω στο μεγάλο παράθυρο τερματικού μου. Εντάξει. Τώρα, γαμώτο, υποθέτω ότι ήταν λάθος. Ήμουν χρησιμοποιώντας το CS50 βιβλιοθήκη. Έτσι, μπορούμε να το διορθώσω αυτό είτε από 2 τρόπους. Μπορούμε να πάρουμε τις βοηθητικές ρόδες από αυτή τη στιγμή και μόλις γίνει αυτό, ή ας το είδος του να κρατήσει ότι η απλούστευση μόνο για τώρα, επικόλληση αυτής της πίσω, λύσει αυτό το πρόβλημα, και τώρα πάμε πίσω στο παράθυρο του τερματικού. Έτσι, για να είναι σαφής, στη βιβλιοθήκη CS50 δεν είναι μόνο λειτουργίες, Είναι, επίσης, το string λέξη-κλειδί, το οποίο είναι ο λόγος για το σφάλμα αυτό ακριβώς συνέβη. Έτσι, εδώ πηγαίνουμε. Ι καθορίζεται τόσο από τα θέματα της βιβλιοθήκης. Enter. Καλή. Argv από 1, foo bar, Enter. Εξαιρετική. Έτσι τώρα έχουμε κάθε γράμμα κάθε λέξης τυπωμένο 1 ανά γραμμή, το οποίο δεν κάνει για ένα πολύ ενδιαφέρον πρόγραμμα, ειδοποίηση αλλά τώρα έχουμε τη δυνατότητα όχι μόνο την επανάληψη πάνω από τις λέξεις αλλά και πάνω από ατομικές επιστολές σε λόγια, που ακούγεται απαίσια εξοικειωμένοι να ακόμη και τα απλούστερα από εφαρμογές όπως κρυπτογράφησης γράμματα σε μια σειρά σαν αυτή. Ας πάμε μπροστά και να λάβει 5-λεπτά διάλειμμα μας εδώ. Και όταν θα έρθει πίσω, θα αρχίσουμε να μιλάμε για την αποτελεσματικότητα με το οποίο μπορούμε να κάνουμε αυτά τα πράγματα καλύτερα. Εντάξει. Είμαστε πίσω. Χάρη σε ένα από τα ΤΡ μας που παίζει πολύ bananagrams, έχουμε πραγματικά ένα σωρό χαρακτήρες μαζί μας εδώ σήμερα σωματικά ενσάρκωσε με αυτά τα μικρά πλαστικά κομμάτια, και επιτρέψτε μου να προτείνω ότι αυτή η κενή λευκή πλάκα αντιπροσωπεύει εδώ τη μνήμη RAM του υπολογιστή μου - laptop, desktop, οτιδήποτε - και εκεί μοιάζει με πολλά από αυτά γιατί αν αρχίσουμε τεμαχισμό αυτό το RAM σε μικρό μέγεθος-byte κομμάτια, ας πούμε ότι κάτι αυθαίρετα ότι το μέγεθος και η θολή αντιπροσωπεύει - εκεί πάμε, και ας σμίκρυνση λίγο εδώ - ας πούμε ότι κάτι μέγεθος αντιπροσωπεύει ένα μόνο byte. Γι 'αυτό και μπορεί να χωρέσει πράγματι ένα σωρό byte ή χαρακτήρες μέσα από αυτή τη μνήμη, όπως προτείνεται από το σχετικό μέγεθος εδώ. Έτσι, ας υποθέσουμε τώρα ότι ο στόχος είναι να εκχωρήσει μνήμη για ένα string. Πώς αυτό πραγματικά εργασία; Στα προγράμματα που έχουμε γράψει, έχουμε συνήθως χρησιμοποιούν GetString, αλλά τώρα, σαφώς, υπάρχει αυτό το άλλο κανάλι μέσω του οποίου μπορούμε να πάρουμε είσοδο του χρήστη στο argv μέσω της γραμμής εντολών. Αλλά τι πραγματικά συμβαίνει κάτω από την κουκούλα; Βγάζει αν λέμε - ας μετακινηθείτε προς τα πίσω για να GetString - η λειτουργία GetString στη βιβλιοθήκη CS50, ζητείται από το χρήστη για μια σειρά, πληκτρολογεί ο χρήστης σε κάποια λέξη - ας το ονομάσουμε ΓΕΙΑ. Και έχουμε πει για τις τελευταίες δύο εβδομάδες ότι η αξία της επιστροφής GetString είναι στην πραγματικότητα μια συμβολοσειρά, όπως τη λέξη HELLO. Αλλά αυτό που πραγματικά κάνει GetString; Καθώς ο χρήστης πληκτρολογεί στο HELLO, Enter, GetString υπολογίζει, εντάξει, πόσοι χαρακτήρες είναι αυτό; Αυτό είναι Η-Ε-Ε-Ε-Ο. Γι 'αυτό χρειάζεται να διαθέσει, θα πρέπει να ζητήσει από το λειτουργικό σύστημα - Linux σε αυτή την περίπτωση - για τουλάχιστον 5 bytes για την αποθήκευση ΓΕΙΑ. Και τι προχωρεί στη συνέχεια να κάνει μια φορά παίρνει πίσω τα 5 bytes από το λειτουργικό σύστημα είναι να θέσει εκτός ΓΕΙΑ πλάτη με πλάτη με πλάτη με πλάτη. Και έτσι αυτό που πραγματικά επέστρεψε από GetString είναι ένα κομμάτι δεδομένων που μοιάζει με αυτό. Αλλά αυτό είναι λίγο ανακριβής επειδή αποδεικνύεται ότι δεν είναι τόσο απλό όπως ακριβώς αποθήκευση ΓΕΙΑ στη μνήμη του υπολογιστή γιατί ας υποθέσουμε ότι το πρόγραμμά μου που γράφω σε C τότε καλεί GetString πάλι, και η επόμενη λέξη ο χρήστης πληκτρολογεί το είναι BYE, BYE. Λοιπόν, θα πρέπει να ταιριάζει ότι BYE λέξη κάπου στη μνήμη. Δεν μπορώ να κοπανάω ΓΕΙΑ. Για παράδειγμα, δεν θέλω ο υπολογιστής να ξεκινήσει μόλις αντικατάσταση όπως αυτό η αρχική λέξη, γιατί μπορεί να εξακολουθεί να χρησιμοποιεί τη λέξη ΓΕΙΑ σε μια μεταβλητή κάπου αλλού στο πρόγραμμά μου. Έτσι, B-Υ-Ε πρέπει να καταλήξει κάπου αλλού στη μνήμη. Όμως, η σύμβαση είναι συνήθως ότι η επόμενη σειρά που διαθέτουν πιθανώς, αλλά όχι πάντα, θα καταλήξει στην επόμενη διαθέσιμη θέση μνήμης. Και αν δεν έχω ζήτησε από το λειτουργικό σύστημα για κάθε μνήμη από την τελευταία φορά που καλείται GetString, οι πιθανότητες είναι η λέξη BYE πρόκειται να καταλήξει αμέσως μετά τη λέξη ΓΕΙΑ στη μνήμη. Αλλά σε αυτό το σημείο μπορείτε να δείτε πού ίσως ένα πιθανό πρόβλημα. Επειδή τα επόμενα κομμάτια της μνήμης, τα επόμενα bytes που ήταν μόνο δωρεάν - καθαρίστε λευκό σχιστόλιθο - στη μνήμη του υπολογιστή ήταν ακριβώς δίπλα στο HELLO, είναι σαν την πρώτη σειρά ζήτησα να αλλάξει τώρα ξαφνικά επειδή έχω αλλάξει ουσιαστικά να HELLOBYE αντί της demarcing κάπως την έναρξη της BYE και το τέλος του HELLO. Έτσι, αποδεικνύεται ότι αυτό που πραγματικά συμβαίνει κάτω από την κουκούλα, που μπορεί να έχετε είδαμε σε απευθείας σύνδεση αναφορές ή τμήμα ή βιβλία ή καθόλου λίγο ακόμα είναι ότι υπάρχει πραγματικά μια εσκεμμένη οριοθέτηση μεταξύ των λέξεων στη μνήμη ενός υπολογιστή. Και στην πραγματικότητα, σε αυτήν την περίπτωση εδώ, όχι απλά βάλτε BYE δίπλα στο HELLO, Αντ 'αυτού, ο υπολογιστής δίνει έναν ιδιαίτερο χαρακτήρα, ο ειδικός χαρακτήρας null, να το πω έτσι, η οποία εκπροσωπείται με ένα δείκτη με backslash 0. Έτσι, τα πολυλογώ, υπενθυμίζουν ότι οι χαρακτήρες εκπροσωπούνται σε ASCII. ASCII είναι απλά μια χαρτογράφηση μεταξύ των αριθμών και των γραμμάτων, και τα περισσότερα από αυτά τα γράμματα αρχίζουν περίπου 65 για κεφάλαιο Α, αλλά βγάζει μπορείτε να αντιπροσωπεύουν σίγουρα το 0 Αριθμός ως ακέραιος ή σε δυαδική, και βγάζει ο κόσμος αποφάσισε καιρό, πολύ καιρό πριν, "Ξέρεις τι;" "0 Ας αριθμός αποθεματικό δεν αντιπροσωπεύουν χαρακτήρες στο πληκτρολόγιο - "Δεν γράμματα, αριθμούς δεν, δεν στίξης. 0 είναι ειδική." "Είναι πρόκειται να είναι ο ειδικός null χαρακτήρα, και θα πάμε να το γράψετε ως \ 0." Η διαφορά είναι αν γράψαμε μόλις 0, 0 είναι ένας χαρακτήρας. Υπενθυμίζουμε ότι υπάρχουν κώδικες ASCII για 0, για 1, για 2, για 3 επειδή το 0 χαρακτήρας είναι διαφορετικός από τον αριθμό 0. Και μπορείτε να δείτε ότι αν κοιτάξουμε πίσω από την εβδομάδα 1, όταν συναντηθήκαμε για πρώτη μίλησε για ASCII, 0 και 1 και 2 και 3, σε όλη τη διαδρομή μέχρι και 9 είχαν τη δική τους κωδικούς ASCII. Δεν είναι, συμπτωματικά, 0 έως 9. Είναι πολύ διαφορετικό. Έτσι, το 0 σημαίνει απλώς «Είμαι ειδική," και οι \ 0 σημαίνει, κυριολεκτικά, "δεν είμαι το 0 χαρακτήρα." "Είμαι αυτό ιδιαίτερη αξία, η μηδενική χαρακτήρα." Γι 'αυτό χρειάζεται πραγματικά ένα άλλο ένα από αυτά επειδή δεν μπορώ να κάνω το ίδιο λάθος δύο φορές. Έτσι, μετά τη λέξη BYE είμαστε επίσης πρόκειται να χρειαστείτε ένα άλλο ένα από αυτά τα null χαρακτήρες. Επιτρέψτε μου να αρπάξει πένα μου εδώ και επιτρέψτε μου να επιστήσω την άλλη γρήγορα \ 0 έτσι ώστε μετά ζήτησα το λειτουργικό σύστημα για 2 χορδές μέσω GetString ακολουθείται από μια άλλη κλήση σε GetString, αυτό είναι ό, τι είναι στην πραγματικότητα στη μνήμη. Έτσι, όταν γυρίσω μια σειρά, είμαι πραγματικά να πάρει πίσω ότι, και όταν πάρω την επόμενη σειρά, είμαι πραγματικά να πάρει πίσω αυτό. Έτσι, αυτό εγείρει το ερώτημα, strlen, πρώτα απ 'όλα, αυτό που θα πρέπει να το επιστρέψετε; Όταν καλώ strlen για το string s και s ήταν η λέξη ΓΕΙΑ ότι ο χρήστης πληκτρολογήσει, ό, τι δεν μπορούμε προφανώς να πω το μήκος του ΓΕΙΑ ήταν πριν από λίγα λεπτά; Ήταν 5, έτσι δεν είναι; H-Ε-Ε-Ε-Ο. Και αυτό είναι πράγματι το πώς strlen έργων. Επιστρέφει τι ένας κανονικός άνθρωπος θα περίμενε κανείς το μήκος της συμβολοσειράς να είναι. Αλλά στην πραγματικότητα, πόσο μεγάλη είναι η ποικιλία των χαρακτήρων που είναι αποθήκευση γεια; Είναι στην πραγματικότητα 6. Έτσι strlen δεν αναφέρει το γεγονός αυτό σε εσάς. Αλλά κάτω από την κουκούλα ο υπολογιστής χρησιμοποιεί πράγματι 6 bytes για την αποθήκευση ενός 5-επιστολή λέξη, και αυτό είναι αλήθεια, δεν έχει σημασία πόσο καιρό η λέξη είναι. Εκεί πάντα θα είναι ένας ειδικός χαρακτήρας null τερματισμού στο τέλος του string να demarc συνολικό μήκος του. Έτσι, στη συνέχεια, αν είναι τώρα το πρόσωπο εφαρμογή strlen 20, πριν από 30 χρόνια, πώς πηγαίνετε για την εφαρμογή ίδια strlen; Παίρνουμε ως δεδομένο ότι υπάρχει, όπως ακριβώς και εμείς θεωρούμε δεδομένο ότι υπάρχει printf, αλλά αν ΓΕΙΑ είναι η λέξη εν λόγω και ό, τι έχω στη μνήμη είναι κάτι που μοιάζει με αυτό, αν έπρεπε να strlen Νέα υλοποίηση γιατί ζητήθηκε να ή επειδή, ειλικρινά, δεν ξέρατε υπήρχαν strlen - θα έπρεπε να κυλήσει αυτό το ένα με δική σας - πώς θα μπορούσε να εφαρμόσει strlen όταν δίνεται κάτι που μοιάζει με αυτό; Τώρα που γνωρίζουμε ότι ένα string είναι ένας πίνακας, μπορούμε να επαναλάβει πάνω από καθεμία από τις επιμέρους χαρακτήρες χρησιμοποιώντας κάτι σαν - ας προσπαθήσουμε να το κάνουμε αυτό on the fly. Επιτρέψτε μου να πάω στη συσκευή. Επιτρέψτε μου να δημιουργήσετε ένα νέο αρχείο, strlen.c. Επιτρέψτε μου τώρα να προχωρήσει και δεν περιλαμβάνουν stdio.h έτσι ώστε να έχουμε πρόσβαση σε printf. Επιτρέψτε μου να κάνω int main (void). Αχ. Θα κάνω ακριβώς αυτό για τη δική μου για τώρα τότε. [Συγκρατημένα γέλια] Σας ευχαριστώ. Αυτό είναι ό, τι κάνω. Εντάξει. Έτσι, πριν άνοιξα την οθόνη, θα πληκτρολογήσει όλα αυτά. Και τώρα τι Πάω να κάνουμε είναι το εξής: printf ("Δώσε μου μια συμβολοσειρά:") Αυτό είναι ακριβώς αφράτα οδηγίες. Τώρα, επιτρέψτε μου να κάνω = GetString string s. Έχω ήδη πρέπει να κάνετε μια αλλαγή τώρα. Είμαι χρησιμοποιώντας το CS50 βιβλιοθήκη ξαφνικά, οπότε επιτρέψτε μου να προχωρήσει και να πληκτρολογήσετε cs50.h. Και τώρα ας κάνουμε αυτό: printf ("Το μήκος είναι:% d, strlen [s] - και δεν είμαι ακόμα γίνει. Τι άλλο μπορώ να προσθέσω σε αυτό το πρόγραμμα; [Φοιτητής] string.h. >> String.h. Έτσι, προς το παρόν, είμαστε χρησιμοποιώντας strlen, οπότε ας βεβαιωθείτε ότι ο compiler ξέρει πού είναι ότι, έτσι μια μικρή λογική ελέγχου. Παίρνω ένα string σε γραμμή 8, και σε γραμμή 9 Είμαι εκτύπωση με το μήκος του% d. Ας πάμε μπροστά και να ανοίξει αυτό επάνω. Έχουμε κάνει strlen - συγκεντρώνει εντάξει - strlen - επιτρέψτε μου μεγέθυνση - Εισαγωγή, Η-Ε-Ι-L-O, Enter. Το μήκος του είναι 5. Εντάξει, έτσι strlen φαίνεται να λειτουργεί, αλλά ο κόσμος ήξερε ότι. Ας εφαρμόσουν τώρα strlen τους εαυτούς μας ως εξής. Επιτρέψτε μου να εκμεταλλευτώ αυτή την βιβλιοθήκη μακριά. Δεν έχουμε πλέον πρόσβαση σε string.h γιατί δεν ήξερα καν ότι υπήρχε. Αλλά αυτό είναι εντάξει, γιατί μπορεί να εφαρμόσει τον εαυτό μου strlen και έχετε λάβει μια σειρά που ονομάζεται εισόδου, και τώρα θα πρέπει να υπολογίσετε το μήκος του string. Λοιπόν, πώς μπορώ να το κάνω αυτό; Τι να κάνω αν - ας δούμε πώς να το κάνουμε αυτό - Τι θέλετε να κάνετε; [Ακούγεται ανταπόκριση των φοιτητών] >> Εντάξει. Έτσι, μπορούμε να το κάνουμε αυτό σε ένα σωρό τρόπους. Επιτρέψτε μου να προσπαθήσω να εκμεταλλευτώ αυτή την προσέγγιση. Επιτρέψτε μου να δώσω στον εαυτό μου μια μεταβλητή int i, γι 'αυτό ξεκινά από το 0. Και επιτρέψτε μου να πω το εξής: ενώ η είσοδος [i] δεν είναι ίσο με αυτό; \ 0. Έτσι, αποδεικνύεται, όπως με την περίπτωση με όλους τους χαρακτήρες τους, όταν γράφει κυριολεκτικά σε ένα πρόγραμμα, θα πρέπει να χρησιμοποιήσετε μονά εισαγωγικά όχι, διπλά εισαγωγικά. Έτσι, αν έγραφα το γράμμα a, θα ήθελα να το κάνουμε αυτό, το γράμμα Β, θα ήθελα να το κάνουμε αυτό. Αυτό, αντίθετα, θα είναι μια σειρά, όχι ένα μεμονωμένο χαρακτήρα. Γι 'αυτό θέλω \ 0 κυριολεκτικά. Τι θέλω να κάνω σε αυτό το βρόχο; Στην πραγματικότητα, χρειάζομαι μια άλλη μεταβλητή, έτσι int μήκος παίρνει 0. Ακόμα κι αν δεν είστε σίγουροι γιατί ξεκινήσαμε με τον τρόπο που το έκανε, τώρα που θα πάμε προς αυτή την κατεύθυνση, τι θέλω να κάνω στη γραμμή 9; μήκος + + και στη συνέχεια, εδώ κάτω στη γραμμή 10, μήκος επιστροφή. Λοιπόν, πώς είναι strlen εφαρμοστεί; Είναι πράγματι εφαρμόζεται μάλλον σαν αυτό. Ίσως το πρόσωπο που χρησιμοποιείται για ένα βρόχο, ίσως κάνετε, ενώ βρόχο - ποιος ξέρει; Θα θέλαμε πραγματικά να δούμε κάτω από το καπό στο πηγαίο κώδικα σε κάποιο αρχείο που ονομάζεται string.c πιθανώς. Αλλά εδώ ας σκεφτούμε τι κάνω. Είμαι δηλώνοντας μια μεταβλητή που ονομάζεται i, το οποίο ισούται με 0. Είμαι δηλώνοντας στη συνέχεια, μια άλλη μεταβλητή που ονομάζεται μήκος, το οποίο ισούται με 0. Τότε λέω, ενώ το i-χαρακτήρα στην είσοδο δεν είναι ίσο με το ειδικό χαρακτήρα null, \ 0, αυξήσετε το μήκος. Αλλά μόλις ο i-οστός χαρακτήρας είναι αυτό ειδικό χαρακτήρα, τι συμβαίνει με το βρόχο; Είναι βραχυκυκλώματα. Σταματά, το οποίο σημαίνει ότι στη συνέχεια επιστρέφουν αμέσως μήκος. Έτσι, αν δεν είχα βρωμίσει επάνω, ας πάμε μπροστά και να πάει πίσω στο παράθυρο του τερματικού μου. Επιτρέψτε μου να μεταγλωττίσετε. Και έκανα μαντάρα. Ασυμβίβαστο του δήλωση ξανά τη λειτουργία της βιβλιοθήκης strlen. Γι 'αυτό και προσπαθεί να πάρει πάρα πολύ έξυπνος για το καλό το δικό μου εδώ. Ο μεταγλωττιστής γνωρίζει πραγματικά ότι υπάρχει μια λειτουργία που ονομάζεται strlen μολονότι δεν έχουμε συμπεριλάβει τη βιβλιοθήκη. Αυτό είναι μια χαρά. Όποια και αν είναι. Είμαστε ακριβώς πρόκειται να συνεργαστούν στη συνέχεια. Ας μετονομάσετε αυτό το μήκος. Επιτρέψτε μου να αλλάξετε τη χρήση του το μήκος εδώ, και αυτό θα κάνει Clang πιο ευτυχισμένοι. Ως μέρος, διότι ορισμένες από αυτές τις λειτουργίες είναι τόσο καταριέται κοινό - strlen, prinf - έχουν πραγματικά είδος του ειδικού καθεστώτος. Και έτσι Clang ξέρει λίγο κάτι το ιδιαίτερο γι 'αυτούς. Αυτό δεν είναι πάντα η περίπτωση με τις περισσότερες λειτουργίες, έτσι ώστε να είναι ο λόγος που πήρε φώναξε. Επιτρέψτε μου να προσπαθήσω ξανά. Ευτυχώς, εκείνη την εποχή εργαζόταν. Έτσι, τώρα επιτρέψτε μου να τρέχει το δικό μου πρόγραμμα strlen. Δώσε μου ένα string: H-Ε-Ι-L-O, Enter. Και έχω μαντάρα. Γιατί; >> [Ακούγεται ανταπόκριση των φοιτητών] >> Ακριβώς. Έτσι έχω εγώ εδώ μια πολύ ωραία εμφάνιση άπειρο βρόχο γιατί ακόμα κι αν είμαι προσαύξηση μήκος σε κάθε επανάληψη, τι είμαι εγώ σαφώς δεν κάνει; Δεν είμαι i προσαύξηση. Εντάξει. Εύκολη λύση. Ναι; Εντάξει. Όχι τώρα θα τρέξει afoul από κάποιο άλλο κοινό λάθος που χρειάζομαι παρένθεση. Και ειλικρινά, αυτός ο κώδικας αρχίζει να φαίνεται άσχημο, έτσι θα ρίξουμε μια μαχαιριά στον καθαρισμό αυτό σε μια στιγμή. Αλλά τώρα είμαι προσαύξηση τόσο το μήκος και εγώ. Ειλικρινά, δεν βλέπω ήδη μια ευκαιρία για βελτίωση εδώ, αλλά θα επανέλθω σε αυτό. Έτσι τώρα ας βεβαιωθείτε ότι είμαστε τουλάχιστον σημειώνουν πρόοδο. Αυτό έχει συμβεί σε μερικούς από εσάς, και εγώ αμέλησε να το αναφέρω αυτό εκ των προτέρων. Όταν έχετε την ατυχία ενός σεναρίου όπως αυτό, πώς να διορθώσετε αυτό σύντομη επανέναρξη του τη συσκευή ή τον υπολογιστή σας ή κλείνοντας το παράθυρο; Είναι πραγματικά εύκολο. Έλεγχος C θα στείλει αυτό το μικρό καρότο σύμβολο C, και η οποία τερματίζει ακριβώς τα περισσότερα προγράμματα. Εάν έχετε μια πραγματικά κακή άπειρο βρόχο που εκτυπώνεται πράγματα απείρως πολλές φορές, Μερικές φορές μπορεί να χρειαστεί να χτυπήσει Ελέγχου C χίλιες φορές για να το ακούσει πραγματικά. Έτσι, μόλις τώρα συνειδητοποιούν, επειδή δεν είμαι τίποτα εκτύπωσης, που ήταν αρκετά εύκολο. Και τεχνικά, μια φορά αρκεί, αλλά έχω ανυπόμονος και χτύπησα συνήθως είναι ότι πολλές φορές. Έτσι strlen. Δώσε μου ένα string: HELLO. Είναι πρόκειται να λειτουργήσει αυτή τη φορά; Εντάξει. Ένα άλλο κοινό λάθος. Έχετε να κάνετε ξανά compile. Αυτό ήταν σκόπιμη, ότι ένα. Εντάξει. Έτσι strlen, Η-Ε-Ι-L-O, Enter. Εξαιρετική. Έτσι, έχουμε τώρα ένα strlen έως 5. Έτσι έχουμε επαναυλοποιηθεί κυριολεκτικά ότι τροχό. Έτσι τώρα ας καθαρίσει αυτό επάνω, επειδή αυτό δεν μου κάνει εντύπωση με το σχεδιασμό του κώδικα μου. Τι μπορούμε να εξαλείψει σαφώς σε αυτό το πρόγραμμα για να καθαρίσει αυτό επάνω; [Ακούγεται ανταπόκριση των φοιτητών] >> Ναι. Κυριολεκτικά, είμαστε θεραπεία i και το μήκος τον ίδιο τρόπο. Γιατί λοιπόν να μην μπορούμε απλά να πούμε έξυπνα και ενώ το μήκος; Αντ 'αυτού, ας το ονομάσουμε μήκος για να αρχίσει με, η προετοιμασία είναι στο 0 επειδή, από προεπιλογή η συμβολοσειρά δεν έχει μήκος μέχρι να καταλάβω τι είναι. Τώρα το κάνουμε αυτό, και τώρα αυτό είναι μια πολύ κομψή πρόγραμμα. Μία μεταβλητή. Μου καθαριστεί, σφιγμένα επάνω. Έτσι τώρα ας πάμε πίσω στο παράθυρο του τερματικού μου. Ας πάμε μπροστά και να τρέξει αυτό. Κάντε strlen. Φαίνεται καλό. Εκτελέστε strlen πάλι, Enter. Δώσε μου ένα string: HELLO, Enter. Και αυτό φαίνεται να λειτουργεί ως 5. Τώρα, για να είναι σαφής, αν δεν είχα γράψει, για παράδειγμα, ΓΕΙΑ σε 1 σειρά και στη συνέχεια σε ένα άλλο BYE, μπορούμε να έχουμε σίγουρα πολλά λόγια. Εάν η έκφραση που πραγματικά ήθελε ήταν να πληκτρολογήσετε δεν ΓΕΙΑ, αλλά, για παράδειγμα, HELLO WORLD, ειδοποίηση ότι αυτό δεν θα είχαμε αυτή την κατάσταση είναι εδώ, έτσι δεν είναι; Αυτό θα δείχνουν ότι είναι 2 χορδές. Σίγουρα μπορεί να έχει χαρακτήρες space bar, οπότε αν έχουμε πραγματικά πληκτρολογήσει σε μια πιο φράση όπως WORLD HELLO, αυτό που πραγματικά θα έχει στη μνήμη μοιάζει λίγο σαν κάτι που υπάρχει. Εντάξει. Οποιεσδήποτε ερωτήσεις σχετικά με τη συνέχεια εδώ εκπροσώπηση των χορδών; Όχι; Εντάξει. Γι 'αυτό είπα προηγουμένως ότι strlen καλώντας ξανά και ξανά, όπως σκόπιμα ότι ίσως δεν είναι η καλύτερη ιδέα, επειδή θα πάμε να κάνουμε ένα σωρό δουλειά ξανά και ξανά και ξανά. Πράγματι, αυτό το είδος της εργασίας είναι απαραίτητη για την εξεύρεση από το μήκος του string, προφανώς; Θα πρέπει να ξεκινήσουμε από την αρχή και στη συνέχεια, κοίτα, κοίτα, κοίτα, κοίτα, κοίτα μέχρι να δείτε ότι τελικά ιδιαίτερο χαρακτήρα, σε ποιο σημείο, αχ, τώρα ξέρω το μήκος. Έτσι, νωρίτερα όταν είχαμε strlen που καλείται ξανά και ξανά και ξανά, ο λόγος που πρότεινα ότι ήταν χαζό γιατί είναι και πάλι, ότι η σειρά μοιάζει με αυτό. Δεν πρόκειται να αλλάξει κάθε φορά που θα επαναλάβει μέσω κάποιου βρόχου, έτσι κάνετε περιττές εργασίες. Ταυτόχρονα, θα πρέπει να γνωρίζετε, ως ένα μέρος, όπως οι μεταγλωττιστές Clang αυτές τις μέρες έχουν αναπτυχθεί εδώ και πολλά χρόνια, και συγγραφείς compiler, προγραμματιστές, είναι αρκετά έξυπνος. Και έτσι αποδεικνύεται ότι Clang και άλλες μεταγλωττιστές μπορεί πραγματικά να καταλάβω ότι, εντάξει, ναι, μπορείτε έγραψε strlen στην κατάστασή σας, πράγμα που σημαίνει τεχνικά ότι θα το ονομάσουμε ξανά και ξανά και ξανά. Αλλά έξυπνα compilers μπορούν να βελτιστοποιήσουν στην πραγματικότητα αυτά τα είδη των φτωχών αποφάσεις των χρηστών από τον κωδικό σας για την αποκατάσταση πράγματα. Έτσι, απλά δεν συνειδητοποιούν ότι μερικές φορές ο compiler είναι πιο έξυπνη από εμάς και θα το είδος κρύψει τα λάθη μας. Αλλά σίγουρα όταν πρόκειται για σύνολα πρόβλημα και τα παρόμοια, δεν πρέπει να σκεφτόμαστε αυτά θεμελιωδώς λανθασμένες αποφάσεις σχεδιασμού ενδεχομένως, για τον απλούστατο λόγο ότι είχαμε να κάνουμε περισσότερη δουλειά τρόπο από ό, τι πραγματικά πρέπει να κάνουμε. Αλλά πόσο πολύ περισσότερη δουλειά; Στην περίπτωση του HELLO WORLD, ας αρχίσουμε να γενικεύσει το μέγεθος του προβλήματος. Τι το μήκος του προβλήματος ή το μέγεθος του προβλήματος όταν η λέξη ο χρήστης πληκτρολογήσει είναι ΓΕΙΑ ΣΟΥ; Είναι προφανώς 5, ίσως 6. Πλέον ή μείον 1. Όποια και αν είναι. Είναι τόσο κοντά που θα τον ονομάσουμε απλώς 5. Έτσι, ποιο είναι το μέγεθος του προβλήματος εδώ όταν προσπαθώ να καταλάβω το μήκος του ΓΕΙΑ ΣΟΥ; Είναι 1, 2, 3, 4, 5, 6 και ίσως για τον τελευταίο χαρακτήρα, αλλά ας γενικεύσουμε ότι ως n. Έτσι, n, μόλις η μεταβλητή n, είναι αυτό που οι επιστήμονες υπολογιστών θα χρησιμοποιούν συνήθως για να περιγράψει το μέγεθος του προβλήματος, και το πρόβλημα είναι στο χέρι πόσο καιρό είναι ΓΕΙΑ ΣΟΥ; Πόσο χρόνο χρειάζεται να strlen; Λαμβάνει της τάξεως n βήματα, όπου κάθε βήμα σημαίνει ματιά σε ένα χαρακτήρα, δούμε ένα χαρακτήρα, να δούμε ένα χαρακτήρα. Και είχαμε αυτή τη συζήτηση λίγο πίσω, ο αριθμός των πράξεων κάτι γίνεται. Η πρώτη ημέρα της κατηγορίας είχαμε όλοι αδέξια σηκωθεί, και τότε όλοι άρχισαν από την αντιστοίχιση με κάθε άλλο προκειμένου να μετρήσει πραγματικά ιδανικά πόσοι άνθρωποι βρίσκονταν στο δωμάτιο. Και κάναμε επίσης ένα άλλο πράγμα το οποίο αν αντί έκανε ο παλιός τρόπος σχολείο μόλις αρχίζει 1, 2, 3, 4, 5, 6 και ούτω καθεξής, ότι πάρα πολύ, το μέγεθος του εν λόγω προβλήματος ήταν μεγέθους n. Υπήρχαν n άνθρωποι σε ένα δωμάτιο. Αλλά θα μπορούσε να επιταχύνει ότι επάνω, έτσι δεν είναι; Βαθμολογία στυλ σχολείο θα μπορούσα να αρχίζουν να μετρούν σε 2s. 2, 4, 6, 8, 10, 12. Και ότι αισθάνεται πολύ πιο γρήγορα, και πράγματι είναι. Είναι κυριολεκτικά δύο φορές πιο γρήγορα, αλλά και πάλι, αν άλλοι 400 άνθρωποι περπάτησαν σε αυτό το δωμάτιο όλα με τη μία, οι αλγόριθμοι θα λάβει άλλα 400 ή ίσως 200 σκαλοπάτια. Αλλά αντίθετα, αν θέλουμε πραγματικά να είμαστε έξυπνοι και αντί να έχουμε όλοι εσείς οι ίδιοι υπολογίζουν, θυμηθούμε πώς λειτούργησε ότι ο αλγόριθμος. Όλοι σηκώθηκαν. Επιτρέψτε μου γρήγορα προς τα εμπρός σε αυτό. Όλοι σηκώθηκαν, μπορείτε ζεύγη μακριά, το μισό από εσάς κάθισε, το ήμισυ του που κάθισε, οι μισοί από εσάς κάθισε, και σε κάθε επανάληψη του βρόχου από αυτή την εβδομάδα 0, θα μειωθεί κατά το ήμισυ το πρόβλημα στο χέρι και πήγε στο ν / 2, τότε n / 4, τότε ν / 8. Και η επίπτωση της αυτό είναι ότι, αν άλλα 400 άτομα περπατούν μέσα στο δωμάτιο, δεν είναι μεγάλη υπόθεση, θα μας πάρει 1 ακόμα γύρο, όχι επιπλέον 400 γύρους, όχι 200 ​​επιπλέον γύρους. Και έτσι η ιστορία μας είπε λίγο πίσω είχε να κάνει λίγο κάτι με αυτό. Η κόκκινη γραμμή είναι εδώ γραμμική, είναι ευθεία, και είναι χαρακτηρισμένα ως n επειδή όπως το μέγεθος ενός προβλήματος μεγαλώνει, εάν ο αλγόριθμος ή πρόγραμμα σας με την οποία είστε επίλυση παίρνει n βήματα, μπορούμε να σχεδιάσουμε ως μια ευθεία γραμμή όπου χρειάζεται περισσότερο χρόνο για όσο μεγαλύτερο το μέγεθος του προβλήματος. Και η προσέγγιση twosies, μετρώντας 2, 4, 6, 8, ακόμα μια ευθεία γραμμή, λίγο καλύτερα. Παίρνει λίγο λιγότερο χρόνο, έτσι ώστε η κίτρινη γραμμή είναι κάτω από την κόκκινη γραμμή για το σημείο το σημείο. Αλλά ήταν ακόμα καλύτερα αυτό το ιερό δισκοπότηρο της αυτό που ονομάζεται λογαριθμική χρόνο όπου ακόμα κι αν και πάλι θα διπλασιαστεί ο αριθμός των ατόμων στο δωμάτιο, θα διπλασιάσει το μέγεθος του τηλεφωνικού καταλόγου από την πρώτη ημέρα της κατηγορίας, δεν είναι μεγάλη υπόθεση, χρειάζεται 1 ακόμα δάκρυ σελίδα, διαρκεί 1 πιο κάτω συνεδρίαση προκειμένου να λύσει ένα πρόβλημα που είναι διπλάσια. Και έτσι η συζήτηση τώρα να πάρει για να ξεκινήσει με το πώς μπορούμε να λύσουμε πραγματικά προβλήματα αποτελεσματικά αν λάβουμε υπόψη την απλούστερη των προβλημάτων όπως αυτό; Ας υποθέσουμε ότι έχουμε 8 πόρτες πίσω από τις οποίες είναι ορισμένοι αριθμοί, και κάθε ένα από αυτούς τους αριθμούς δεν ταξινόμηση με οποιονδήποτε τρόπο, είναι απλά τυχαίους ακέραιους αριθμούς πίσω από αυτές τις πόρτες, και κάνουμε την ερώτηση πώς πηγαίνετε για την εύρεση του αριθμού - ποιος ξέρει - 7 πίσω από αυτές τις πόρτες; Τι θα, ένας άνθρωπος, κάνει για να βρει με τον αριθμό 7 αν και πάλι το καθένα από αυτά είναι πόρτες και να δείτε μια αξία που πρέπει να ανοίξει μια πόρτα; Τι θα σας αλγόριθμος είναι ίσως; [Ακούγεται ανταπόκριση των φοιτητών] >> Έτσι ξεκινήσει με το αριστερό και να ανοίξει μια πόρτα, ανοίγει μια πόρτα, ανοίγει μια πόρτα. Και στη χειρότερη περίπτωση, πόσο καιρό είναι αυτό πρόκειται να μας πάρει για να βρείτε τον αριθμό 7; Και πάλι, δεν είστε ταξινομημένο, έτσι δεν είναι τόσο εύκολο όσο, επίσης, Πάω να ανοίξει το 7ο πόρτα. Θα μπορούσε να μας πάρει,, μέγιστο 8 βήματα. Στη χειρότερη περίπτωση, 7 είναι τυχαία στο τέλος της γραμμής των θυρών, έτσι μπορεί να έχουμε να δοκιμάσετε όλες τις πόρτες n. Έτσι και πάλι εδώ, φαίνεται να έχουμε ένα γραμμικό αλγόριθμο. Στην πραγματικότητα, αυτό που κάναμε μόλις δύο χρόνια πριν. Ένας από τους προκατόχους σας αμφισβητήθηκε με ακριβώς αυτό το όπου δεν είχαμε μια ψηφιακή έκδοση, αντίθετα είχαμε ένα μαυροπίνακα με κάποια κομμάτια του χαρτί για αυτό. Και ό, τι νόμιζα ότι θα κάνετε είναι να ρίξουμε μια γρήγορη ματιά πίσω στο πώς αυτό πήγε, μία από τις καλύτερες και ίσως πιο δύσκολη ευκαιρίες στη σκηνή να έχουν μια επίδειξη εδώ για Sanders. Είχαμε 2 σειρές των αριθμών. Είμαστε μόνο πρόκειται να δούμε τι συμβαίνει εδώ με τον Sean για την κορυφή αυτών των σειρών. Αν κανείς ποτέ ξανά σε εθελοντές CS50, είχαμε την ευλογία του Sean για να κρατήσει αυτό στην κάμερα, έτσι ξέρει ότι εκατοντάδες άνθρωποι έχουν παρακολουθεί αυτή τη στιγμή εδώ και χρόνια. Αλλά Sean έκανε μια καταπληκτική δουλειά - ή μήπως - σε πραγματικά μας βρείτε ένα συγκεκριμένο αριθμό. Ας δούμε λοιπόν πώς θα λυθεί αυτόν τον αλγόριθμο, έτσι ώστε θα συνεχίσετε αυτή τη συζήτηση πριν από καιρό για το πώς θα βρούμε τα πράγματα αποτελεσματικά. [Malan σε βίντεο] Έχω κρύβεται πίσω από αυτές τις πόρτες τον αριθμό 7, αλλά μακριά μπαίνει σε ορισμένες από αυτές τις πόρτες, καθώς και οι άλλες μη-αρνητικούς αριθμούς, και ο στόχος σας είναι να σκεφτείτε αυτήν την κορυφαία σειρά των αριθμών, όπως ακριβώς μια σειρά ή απλά μια σειρά από κομμάτια του χαρτί με τους αριθμούς πίσω τους, και ο στόχος σας είναι, χρησιμοποιώντας μόνο την κορυφή σειρά εδώ, βρείτε μου τον αριθμό 7. Και στη συνέχεια θα κριτική τρόπο με τον οποίο μπορείτε να κάνετε για αυτό. >> Εντάξει. [Malan] Βρείτε μας τον αριθμό 7, παρακαλώ. [Γέλια] [Malan] Όχι [γέλια] 5, 19, 13, [γέλια]. Δεν είναι μια ερώτηση παγίδα. 1. [Γέλια] Σε αυτό το σημείο το σκορ σου δεν είναι πολύ καλή, έτσι ίσως και να συνεχίζω. [Γέλια] 3. Μετάβαση σε. Ειλικρινά, δεν μπορώ να βοηθήσει, αλλά αναρωτιέμαι τι είστε καν να το σκεφτούμε. [Γέλια] Μόνο η πρώτη σειρά, έτσι ώστε να έχετε 3 αριστερά. Έτσι, βρείτε μου 7. [Φοιτητές μουρμουρίζοντας] [Malan] 17. [Φοιτητές μουρμουρίζοντας] [Malan] 7! [Χειροκροτήματα] Έτσι, την Τετάρτη θα έχουμε βουτήξει σε αυτό και πιο εξελιγμένοι αλγόριθμοι για την εύρεση τα πράγματα. Προς το παρόν θα σας αφήσει με τον Sean και να σας δούμε την Τετάρτη. [CS50.TV]