DAVID J. MALAN: Εντάξει. Έτσι, καλωσορίζουμε το πρώτο στην ιστορία CS50 μεταθανάτια για ένα κουίζ. Σκεφτήκαμε ότι θα εγκαινιάσει αυτή η παράδοση του τρέχοντος έτους. Και αυτό θα είναι μια ευκαιρία να περπατήσει μέσα από το λύσεις για το κουίζ. Και θα επιταχύνει ή να επιβραδύνει με βάση επί των τόκων αυτών εδώ. Έτσι, είστε πιθανώς εδώ επειδή είστε ενδιαφέρονται για το πώς θα μπορούσατε να έχετε ή θα έπρεπε να απαντήσει σε ορισμένες από αυτά τα προβλήματα. Έτσι, γιατί δεν ρίχνουμε μια ματιά σε αυτό το τμήμα πρώτα; Έτσι, να πάρει χορδές. Αυτό σας έδωσε τρεις διαφορετικές εκδόσεις ενός προγράμματος που ήταν, τελικά, σήμαινε να πάρει μια σειρά από ένα χρήστη. Και αν δεν έκανε ότι ήταν αριστερά για να μπορείτε να προσδιορίσετε. Και ζητήσαμε Ερώτηση 0, ας υποθέσουμε ότι η έκδοση 1 είναι καταρτίζονται και εκτελούνται. Γιατί μπορεί segfault το πρόγραμμα; Με την πρώτη ματιά, οποιεσδήποτε προτάσεις ως προς το γιατί; Ναι. ΚΟΙΝΟ: Έτσι Θυμάμαι που έβλεπα αυτό ένα προηγούμενο παράδειγμα κοιτάζοντας το char * s και βλέποντας τη σάρωση των s και βλέποντας επειδή είναι ένας δείκτης, πώς δεν επηρεάζει αυτό που σαρώνονται; Είναι s ή η διεύθυνση του s; DAVID J. MALAN: OK. Καλή. Έτσι, τελικά, η πηγή κάθε πρόβλημα είναι προφανώς πρόκειται να μειώσει σε αυτή τη μεταβλητή s. Και είναι πράγματι μια μεταβλητή. Ο τύπος δεδομένων της μεταβλητής είναι char *, πράγμα που σημαίνει ότι πρόκειται να περιέχει τη διεύθυνση ενός χαρακτήρα. Και εκεί βρίσκεται η εικόνα. Είναι πρόκειται να περιέχει τη διεύθυνση του ένα χαρακτήρα ή, γενικότερα, η διεύθυνση του πρώτου χαρακτήρα ένα ολόκληρο οικοδομικό τετράγωνο χαρακτήρων. Όμως, τα αλιεύματα είναι ότι s σάρωσης, σκοπό ζωή, έχει δοθεί μια διεύθυνση και δεδομένου κωδικός μορφή, όπως% s, διαβάστε μια σειρά στο κομμάτι της μνήμη σε αυτή τη διεύθυνση. Αλλά επειδή δεν υπάρχει ίσον πριν ότι ερωτηματικό σχετικά με την πρώτη γραμμή κώδικα, γιατί δεν το κάνουμε πραγματικότητα χορηγεί κανένα μνήμης με malloc, γιατί στην πραγματικότητα δεν διαθέσει μια σειρά από κάποιο μέγεθος, όλα κάνετε διαβάζει το χρήστη πληκτρολόγιο εισόδου σε κάποιο ολοκληρωμένο αξία σκουπιδιών, η οποία είναι s από προεπιλογή. Έτσι πιθανότητες είναι εσείς πρόκειται να segfault αν ότι η διεύθυνση δεν είναι μόνο έτσι να συμβεί να είναι μια τιμή που μπορείτε, Στην πραγματικότητα, γράψτε. Τόσο κακό να μην διαθέσει μνήμη σας εκεί. Έτσι, στο ερώτημα 1, ζητήσαμε, ας υποθέσουμε ότι η έκδοση 2 είναι καταρτίζονται και εκτελούνται. Γιατί μπορεί να segfault αυτό το πρόγραμμα; Έτσι, αυτό είναι λιγότερο λάθη. Και υπάρχει πραγματικά μόνο ένας προφανής τρόπος όπου μπορείτε να το έναυσμα για μια segfault εδώ. Και αυτό είναι θεματικό. Κάθε φορά που χρησιμοποιούμε c στη μνήμη, ό, τι θα μπορούσατε να κάνετε για να προκαλέσει μια segfault με την έκδοση 2; ΚΟΙΝΟ: Εάν χρησιμοποιήσετε αυτή την είσοδο στην μια σειρά που είναι περισσότερο από 49 χαρακτήρων. DAVID J. MALAN: Ακριβώς. Κάθε φορά που βλέπετε κάτι σταθερό μήκος όταν πρόκειται για έναν πίνακα, σας ραντάρ πρέπει να πάει μακριά ότι αυτό θα μπορούσε να είναι προβληματική, αν δεν είστε τον έλεγχο της όρια μιας συστοιχίας. Και αυτό είναι το πρόβλημα εδώ. Είμαστε εξακολουθούν να χρησιμοποιούν scanf. Είμαστε ακόμα χρησιμοποιώντας% s, το οποίο σημαίνει να προσπαθήσουμε να διαβάσει ένα κορδόνι από το χρήστη. Αυτό πρόκειται να διαβαστεί σε s, η οποία, σε αυτό το σημείο, είναι ουσιαστικά η διεύθυνση του ένα μεγάλο κομμάτι της μνήμης ή να είναι ισοδύναμες. Είναι το όνομα ενός πίνακα των χαρακτήρων της μνήμης. Αλλά ακριβώς αυτό, αν έχετε διαβάσει ένα string αυτό είναι μεγαλύτερο από 49 χαρακτήρες, 49 γιατί θα πρέπει να έχετε χώρο για το backslash 0, θα πάμε να ξεχειλίσει ότι το ρυθμιστικό. Και μπορείτε να πάρετε τυχεροί και να είναι σε θέση να γράφετε 51η χαρακτήρα, 52η, 53η. Αλλά σε κάποιο σημείο, το λειτουργικό σύστημα πρόκειται να πει, όχι. Αυτό σίγουρα δεν είναι η μνήμη σας επιτρέπεται να αγγίξει. Και το πρόγραμμα πρόκειται να segfault. Έτσι εκεί, τα heuristics πρέπει να είναι κάθε φορά που θα έχεις σταθερό μήκος, έχετε για να βεβαιωθείτε ότι έχετε τον έλεγχο του μήκους από ό, τι είναι αυτό που προσπαθείτε να διαβάσει σε αυτό. ΚΟΙΝΟ: Έτσι για να λύσει αυτό, θα μπορούσε να είχαν μια δήλωση ελέγχου πραγματικότητα είναι το μήκος μεγαλύτερο ή μικρότερο από; DAVID J. MALAN: Απολύτως. Απλά έχουν μια κατάσταση που λέει, αν η - ή μάλλον δεν γνωρίζουν απαραίτητα εκ των προτέρων πόσους χαρακτήρες η χρήστης πρόκειται να πληκτρολογήσετε, επειδή έχετε το κοτόπουλο και το αυγό. Δεν έως ότου έχετε διαβάσει με scanf μπορεί να σας καταλάβω πόσο καιρό είναι. Αλλά σε εκείνο το σημείο, είναι πολύ αργά, επειδή έχετε ήδη διαβάσει σε κάποια μπλοκ της μνήμης. Έτσι, ως ένα μέρος, τα αποφεύγει βιβλιοθήκη CS50 αυτό το ζήτημα συνολικά, ανάκληση με τη χρήση fgetc. Και να διαβάζει ένα χαρακτήρα κάθε φορά, tip-toeing μαζί, γνωρίζοντας ότι θα δεν μπορεί να υπερχειλίσει έναν χαρακτήρα εάν μπορείτε να διαβάσετε ένα κάθε φορά. Τα αλιεύματα είναι με GetString ανάκληση είναι ότι πρέπει διαρκώς να επανεξετάζουμε το μέγεθος ότι κομμάτι της μνήμης, η οποία είναι απλά ένας πόνος. Είναι πολύ γραμμών κώδικα για να το κάνουμε αυτό. Έτσι, μια άλλη προσέγγιση θα ήταν να πραγματικά να χρησιμοποιήσετε έναν ξάδελφο, έτσι να μιλήσει, της scanf. Υπάρχουν παραλλαγές σε πολλά από αυτά λειτουργίες που στην πραγματικότητα ελέγχουν το μήκος πόσους χαρακτήρες μπορείτε να διαβάσετε στο μέγιστο. Και μπορείτε να καθορίσετε, δεν διαβάζουν περισσότερο από 50 χαρακτήρες. Έτσι, αυτό θα είναι μια άλλη προσέγγιση, αλλά μικρότερη υποδοχή των μεγαλύτερων εισροών. Έτσι ερώτηση 2 ερωτά, ας υποθέσουμε ότι η έκδοση 3 καταρτίζεται και εκτελείται. Γιατί μπορεί segfault ότι το πρόγραμμα; Έτσι, αυτό είναι στην πραγματικότητα το ίδιο απαντήσει, μολονότι φαίνεται λίγο περίπλοκη. Είμαστε με malloc, η οποία αισθάνεται σαν δίνουμε τον εαυτό μας περισσότερες επιλογές. Και τότε είμαστε απελευθερώνοντας ότι μνήμη στο τέλος. Είναι ακόμα μόνο 50 bytes της μνήμης. Έτσι, θα μπορούσαμε ακόμα προσπαθώ να διαβάσω σε 51, 52, 1000 bytes. Είναι πρόκειται να segfault για τον ίδιο ακριβώς λόγο. Αλλά υπάρχει και ένας άλλος λόγος πάρα πολύ. Τι άλλο θα μπορούσε malloc επιστροφή, εκτός από η διεύθυνση του ένα μεγάλο κομμάτι της μνήμης; Θα μπορούσε να επιστρέψει null. Και επειδή δεν είμαστε ο έλεγχος για ότι, θα μπορούσαμε να κάνουμε κάτι ηλίθιο για έναν άλλο λόγο, που είναι ότι θα μπορούσαμε να λέει scanf, διαβάστε είσοδο του χρήστη από το πληκτρολόγιο σε θέση 0, AKA null. Και αυτό, επίσης, θα είναι σίγουρα το έναυσμα για μια segfault. Έτσι, για το σκοπό του κουίζ του, θα θέλαμε έχουν αποδεχθεί είτε από αυτούς ως βάσιμο λόγο. Το ένα είναι πανομοιότυπο. Το ένα είναι λίγο πιο λεπτή. Τέλος, σε σχέση με το προγράμματος χρήση της μνήμης, πώς να κάνει την έκδοση 2 και έκδοση 3 διαφέρουν; Έτσι, για ό, τι αξίζει, είδαμε μια φαινομενικά ατελείωτη προσφορά των πιθανών απαντήσεις σε αυτό. Και μεταξύ των απαντήσεων των ανθρώπων, αυτό που ήταν ελπίζοντας, αλλά το δεχτήκαμε άλλα τα πράγματα, ήταν κάποια αναφορά του το γεγονός ότι η έκδοση 2 χρησιμοποιώντας η λεγόμενη στοίβα. Έκδοση 3 χρησιμοποιεί το σωρό. Και λειτουργικά, αυτό δεν κάνει πραγματικά κάνουν όλοι ότι ένα μεγάλο μέρος μιας διαφοράς. Στο τέλος της ημέρας, είμαστε ακόμα απλά να πάρει 50 bytes της μνήμης. Αλλά αυτό ήταν μία από τις πιθανές απαντήσεις ότι ψάχναμε. Αλλά θα δούμε, όπως μπορείτε να πάρετε κουίζ σας πίσω από το TFs, ότι κάναμε αποδεχθεί άλλες συζητήσεις τους ανόμοιες χρήσεις της μνήμης, καθώς και. Αλλά και στοίβα σωρός θα ήταν μια εύκολη απάντηση για να πάει με. Οποιεσδήποτε ερωτήσεις; Σας δίνω τον Rob. ROB BOWDEN: Έτσι το πρόβλημα 4. Αυτό είναι το ένα, όπου θα έπρεπε να συμπληρώσετε στον αριθμό των bytes έξω από όλα αυτοί οι διαφορετικοί τύποι που χρησιμοποιούνται. Έτσι το πρώτο πράγμα που βλέπουμε. Ας υποθέσουμε ότι μια αρχιτεκτονική 32-bit, όπως αυτή τη συσκευή CS50. Έτσι, ένα από τα θεμελιώδη πράγματα για Αρχιτεκτονικές 32-bit, που μας λέει ακριβώς πόσο μεγάλη είναι ένας δείκτης θα να είναι στην αρχιτεκτονική. Έτσι, αμέσως, γνωρίζουμε ότι κάθε δείκτη τύπος είναι 32-bits ή 4 bytes. Έτσι, αναζητούν σε αυτό το τραπέζι, ένα * κόμβος είναι ένας τύπος δείκτη. Αυτό πρόκειται να είναι 4 bytes. Struct node *, είναι κυριολεκτικά ταυτόσημη με κόμβο αστέρι. Και έτσι αυτό θα είναι 4 bytes. String, γι 'αυτό δεν μοιάζει με ένα pointer ακόμα, αλλά το typedef, ένα string είναι απλά ένα char *, η οποία είναι ένας τύπος δείκτη. Έτσι, αυτό πρόκειται να είναι 4 bytes. Έτσι, αυτά τα τρία είναι τα 4 bytes. Τώρα, ο κόμβος και ο μαθητής είναι λίγο πιο περίπλοκη. Έτσι, κοιτάζοντας κόμβο και φοιτητών, βλέπουμε κόμβο ως ακέραιο και ένα δείκτη. Και μαθητής είναι δύο δείκτες στο εσωτερικό του. Έτσι, τουλάχιστον για την περίπτωσή μας εδώ, ο τρόπος ότι θα καταλήξουμε υπολογισμό του μεγέθους της αυτό το struct είναι απλώς προσθέστε τα πάντα αυτό είναι μέσα στο struct. Έτσι, για τον κόμβο, έχουμε έναν ακέραιο, η οποία είναι 4 bytes. Έχουμε ένα δείκτη, η οποία είναι 4 bytes. Και έτσι ένας κόμβος θα να αναλάβουν 8 bytes. Και ομοίως για το μαθητή, έχουμε ένα δείκτη που είναι 4 bytes και ένα άλλο δείκτη που είναι 4 bytes. Έτσι, αυτό πρόκειται να καταλήξει να είναι 8 bytes. Έτσι, ο κόμβος και ο μαθητής είναι 8 bytes. Και αυτά τα τρία είναι τα 4 bytes. Ερωτήσεις σχετικά με αυτό; Ναι. ΚΟΙΝΟ: Είναι ήταν ένα 64-bit αρχιτεκτονική, θα ήταν αυτό διπλασιάσει όλα αυτά; ROB BOWDEN: Δεν θα διπλασιάσει όλα αυτά. Έτσι, 64-bit αρχιτεκτονική, αυτό, και πάλι, αλλαγές που βασικό πράγμα ότι ένα δείκτης είναι σήμερα 64 bits. Ναι. Έτσι, ένας δείκτης είναι 8 bytes. Έτσι, αυτά που ήταν 4 bytes πρόκειται να είναι 8 bytes. Ένας φοιτητής, ο οποίος ήταν δίποντα, καλά, τώρα πρόκειται να είναι 8 bytes, 8 bytes. Είναι πρόκειται να κάνει 16 bytes. Αλλά ένας κόμβος εξακολουθεί να είναι 4 bytes. Έτσι, αυτό το δείκτη πρόκειται να είναι 8 bytes. Αυτό είναι 4 bytes. Έτσι, ένας κόμβος θα είναι μόνο να είναι 12 bytes. Οποιεσδήποτε άλλες ερωτήσεις σχετικά με αυτό; Έτσι ώστε η επόμενη, αυτά είναι οι κωδικοί κατάστασης HTTP. Και θα έπρεπε να περιγράψει τις συνθήκες υπό τους οποίους θα μπορούσε να σας επιστραφεί. ένα πρόβλημα που άκουσα μερικούς μαθητές έχουν είναι ότι προσπάθησαν να κάνουν το σφάλματα είναι στο τέλος του πελάτη. Έτσι, όταν θα προσπαθήσουμε να κάνουμε το αίτημα στο διακομιστή, κάτι πάει λάθος στο τέλος μας. Αλλά γενικά, οι κωδικοί αυτοί είναι επιστρέφεται από το διακομιστή. Έτσι θέλουμε να καταλάβουμε τι συμβαίνει σωστό ή λάθος στο διακομιστή που προκαλεί αυτά τα πράγματα που πρέπει να επιστραφεί. Γιατί, λοιπόν, θα μπορούσε ένας διακομιστής επιστρέφει κωδικό κατάστασης 200; Οποιεσδήποτε σκέψεις; Ναι. Έτσι, κάτι για επιτυχία το αίτημα πέρασε. Και θα είστε σε θέση να επιστρέψει ό, τι ζήτησε. Έτσι, όλα ήταν μια χαρά. Τι γίνεται με 302 βρέθηκε; Ναι. ΚΟΙΝΟ: Ο διακομιστής έψαχνε για ό, τι ζητήσει. Αλλά δεν μπορούσα να το βρω. Έτσι, υπάρχει ένα λάθος. ROB BOWDEN: Έτσι, ο διακομιστής ήταν ψάχνει για ό, τι ήθελε. Έτσι απλά ψάχνουν εδώ, 302 βρέθηκαν, ήταν σε θέση να το βρείτε. ΚΟΙΝΟ: Λυπάμαι. Βρέθηκαν σημαίνει ότι έκαναν το βρείτε. Λυπάμαι. ROB BOWDEN: Μέχρι 302 εγγραφές. Ο διακομιστής είναι σε θέση να βρει ό, τι ήθελε. ΚΟΙΝΟ: Αλλά δεν το εμφανίζει; ROB BOWDEN: Η διαφορά μεταξύ Αυτό το 302 και 200 ​​είναι ότι ξέρει τι θέλετε. Αλλά δεν είναι ακριβώς όπου θα ήθελα να ρωτήσω. Έτσι 302 είναι ένα τυπικό ανακατεύθυνση. Έτσι θα ζητήσει μία σελίδα. Γνωρίζει, OH, θέλω να σας επιστρέψουμε αυτό. Αλλά αυτό είναι μια διαφορετική διεύθυνση URL. Έτσι, hey, που πραγματικά το θέλουν. DAVID J. MALAN: Είναι ένα κομμάτι που είπε ότι δώσαμε εσείς μια ανακατεύθυνση λειτουργία που χρησιμοποιείται η header ότι, με τη σειρά του, να εκτυπωθούν τοποθεσία, του παχέος εντέρου, και, στη συνέχεια, η διεύθυνση URL στην οποία θέλετε να απορρίψετε το χρήστη. Ακόμα κι αν δεν έχετε δει 302 ρητά εκεί, αυτό είναι ό, τι PHP θα εισάγετε μαγικά με την κεφαλίδα λέει ακριβώς τι είπε ο Rob εκεί - βρέθηκε. Αλλά αντ 'αυτού πηγαίνετε εδώ. ROB BOWDEN: OK. Έτσι τι γίνεται με 403 απαγορεύεται; ΚΟΙΝΟ: Νομίζω ότι είναι ότι ο διακομιστής είναι βασικά λέγοντας ότι ο πελάτης δεν μπορούν να έχουν πρόσβαση από το σπίτι σελίδα. ROB BOWDEN: Ναι λοιπόν. Λοιπόν, η τυπική απάντηση ήμασταν περιμένει είναι κάτι σαν, τα αρχεία δεν chmodded κατάλληλα. Αυτό είναι πιθανώς κάτω από ποιες συνθήκες τους είδατε. Αλλά υπάρχει ένας λόγος για τον οποίο ο πελάτης θα μπορούσε να είναι σε υπαιτιότητά του εδώ. Υπάρχει πράγματι ένας άλλος κωδικός κατάστασης - 401. Έτσι, αυτά είναι πολύ παρόμοια. 401 δεν είναι εξουσιοδοτημένο. Και 403 απαγορεύεται. Και έτσι τη μη εξουσιοδοτημένη σας αποκλειστικά πάρετε αν δεν είστε συνδεδεμένοι μέσα Αλλά συνδεθείτε μπορεί να σημαίνει ότι έχετε εξουσιοδοτηθεί. Αλλά αν είστε ήδη συνδεδεμένος και εξακολουθούν να μην έχουν δικαίωμα, στη συνέχεια, μπορείτε επίσης να πάρετε απαγορεύεται. Έτσι, εάν είστε συνδεδεμένοι και δεν έχουν άδεια, απαγορεύεται επίσης κάτι που μπορείτε να πάρετε. DAVID J. MALAN: Και ο μηχανισμός με τον οποία τα προβλήματα αυτά είναι συνήθως λυθεί στο διακομιστή είναι μέσω ποια εντολή; Chmod, αν είναι, πράγματι, ένας δικαιώματα εκδίδουν στο αρχείο ή κατάλογο. ROB BOWDEN: 404 Τότε δεν βρέθηκε. Ναι. Έτσι, σε αντίθεση με 302 όπου δεν ήταν ακριβώς όπου ζητάς, αλλά ξέρει τι θέλετε, αυτό, έχει μόνο καμία ιδέα για το τι θέλετε. Και δεν ζητούν κάτι που ισχύει. 418 Είμαι μια τσαγιέρα και, στη συνέχεια, 500 εσωτερικό διακομιστή. Έτσι, γιατί μπορεί να σας πάρει αυτό; Έτσι segfault - Εγώ πραγματικά δεν ξέρω την ταξινόμηση πρότυπο για αυτό. Αλλά εάν ο κώδικας PHP σας είχε κάτι λάθος σε αυτό, θεωρητικά, θα μπορούσε να πράγματι segfault, στην οποία περίπτωση, η παρούσα 500 error εσωτερικό διακομιστή, κάτι είναι λάθος με το διακομιστή σας διαμόρφωσης. Ή υπάρχει συντακτικό σφάλμα στον κώδικα PHP σας. Ή κάτι κακό συμβαίνει. DAVID J. MALAN: Κάναμε δούμε segfault μεταξύ των απαντήσεων λίγα ανθρώπων. Και από τεχνική άποψη, θα μπορούσε να συμβεί. Αλλά αυτό θα ήταν ένα PHP, το πρόγραμμα γραμμένα από άλλους ανθρώπους, στην πραγματικότητα segfaulted, που μόνο αν αυτοί οι άνθρωποι σκάτωσε και έγραψε λάθη κώδικα σε διερμηνέα τους θα Η ίδια η PHP segfault. Έτσι, παρόλο που 500 είναι σαν ένα segfault στο πνεύμα, είναι σχεδόν πάντα η αποτέλεσμα της έκδοσης του αρχείου ρυθμίσεων με τον web server σας ή, όπως δήλωσε ο Rob, συντακτικό σφάλμα, όπως σας δεν κλείσει ένα απόσπασμα. Ή έχετε χάσει ένα ερωτηματικό κάπου. ΚΟΙΝΟ: Έτσι, για το Shuttle από το chipset, I ότι όταν το έκανα μια φορά χτύπησα το πρόγραμμα περιήγησης, αλλά τίποτα δεν ήρθε, αυτό που ονομάζεται λευκή σελίδα. Αλλά ήταν εξαιτίας του κώδικα. Νομίζω ότι ήταν JavaScript, σωστά; ROB BOWDEN: Ναι. ΚΟΙΝΟ: Θα το σφάλμα ακόμα καταλήξει; ROB BOWDEN: Έτσι δεν θα έχετε πάρει αυτό το σφάλμα επειδή τα πάντα από την πλευρά του διακομιστή διαδικτύου ήταν εντελώς καλά. Αλλά ζητήσατε index.html. Ζητήσατε shuttle.js και service.js. Και ήταν σε θέση να επιστρέψει με επιτυχία σε όλους σας αυτά τα πράγματα - 200. OK. Είναι μόνο όταν το πρόγραμμα περιήγησης προσπάθησε να ερμηνεύσει τον κώδικα JavaScript που είναι παρόμοια, περιμένετε, αυτό δεν είναι έγκυρο σφάλμα JavaScript. Οποιεσδήποτε άλλες ερωτήσεις; Εντάξει. DAVID J. MALAN: Μέχρι την επόμενη up ήταν νούμερο 11. Και 11 ήταν το πιο τρομακτικό για πολλούς ανθρώπους. Έτσι, το πιο σημαντικό πράγμα που πρέπει να σημειωθεί εδώ ήταν ότι αυτό ήταν, πράγματι, περίπου μια διπλά συνδεδεμένη λίστα. Αλλά αυτό δεν ήταν το ίδιο με πέρυσι διπλά συνδεδεμένη λίστα προβλήματος, που δεν σας δώσει την προειδοποίηση ότι ο κατάλογος θα μπορούσε, στην πραγματικότητα, είναι αδιαχώριστα. Έτσι, το γεγονός ότι ο κατάλογος ήταν αδιαχώριστα και το γεγονός ότι η λέξη αυτή υπογράμμισε υπήρχε ως στόχο να μεταφέρει ότι αυτό είναι στην πραγματικότητα μια απλοποίηση από ό, τι διαφορετικά θα ήταν ένα πιο δύσκολο πρόβλημα και ένα μακρύτερο. Έτσι, ένα κοινό λάθος εδώ ήταν να έχουν θέσει λύση του περασμένου έτους σε ένα σας τηλεειδοποίησης και στη συνέχεια απλά να αντιγράψετε τυφλά ότι προς τα κάτω ως απάντηση, η οποία είναι η σωστή απαντήσετε σε μια διαφορετική ερώτηση συναφείς στο πνεύμα. Αλλά οι λεπτές αποχρώσεις εδώ ήταν ως ακολούθως. Έτσι, ένα, έχουμε ένα κόμβο που δηλώνονται και ορίζεται με τον συνήθη τρόπο εδώ. Στη συνέχεια ορίσαμε λίστα είναι μια παγκόσμια pointer αρχικοποιείται σε null. Στη συνέχεια, προφανώς, υπάρχουν δύο λειτουργίες έχουμε πρωτότυπα για εδώ, ένθετο και αφαιρέστε το. Και τότε έχουμε κάποια δείγμα κώδικα εδώ να κάνει ένα σωρό προσθήκες. Και τότε θα σας ζητήσουμε να συμπληρώσετε το εφαρμογή του ενθέματος κάτω σε τέτοιες τρόπο ώστε να εισάγει το η στον κατάλογο σε συνεχή χρόνο, υπογράμμισε επίσης, ακόμη και αν ήδη υπάρχουν. Έτσι, η ομορφιά της είναι σε θέση να εισαγάγετε σε σταθερό χρόνο είναι ότι συνεπάγεται ότι θα πρέπει να τοποθετήσετε ο νέος κόμβος πού; Στο μπροστινό. Έτσι, εξαλείφει, ευτυχώς, τουλάχιστον μία από τις περιπτώσεις που χρησιμοποιείται για να απαιτήσει ακόμη περισσότερες γραμμές κώδικα, όπως το έκανε πέρυσι και ακόμα και στην τάξη, όταν εμείς μίλησε μέσα από αυτό το είδος του πράγματος με τον άνθρωπο και με μερικά λεκτική ψευδοκώδικα. Έτσι, στη λύση εδώ, ας υπερπηδήσει στο ότι μόνο και μόνο για να έχουν οπτική επαφή με η οθόνη. Παρατηρήστε ότι κάνουμε το εξής. Και επίσης να παρατηρήσετε την περαιτέρω απλοποίηση ήταν ότι ακόμα κι αν είναι που υπάρχουν ήδη, έτσι αυτό σημαίνει ότι, ακόμη και αν ο αριθμός είναι ήδη εκεί, μπορείτε να ακριβώς τυφλά εισάγετε άλλη αντίγραφό της. Και αυτό, επίσης, ήταν γραφτό να γίνει μια απλοποίηση, έτσι ώστε να μπορούσε να επικεντρωθεί, πραγματικά, κάποιες από τις πιο διανοητικά ενδιαφέρον μέρος και όχι μόνο μερικά επιπλέον έλεγχο σφαλμάτων δεδομένου του περιορισμένου χρόνου. Έτσι, σε αυτό το διάλυμα του δείγματος, διαθέτουμε ένα δείκτη στο αριστερό χέρι πλευρά εδώ σε έναν κόμβο. Τώρα, συνειδητοποιούν ότι δείκτη, όπως Rob είπε, είναι μόνο 32 bits. Και στην πραγματικότητα δεν περιέχει μια διεύθυνση μέχρι να αντιστοιχίσετε τη διεύθυνση. Και το κάνουμε αυτό για το δεξί χέρι πλευρά μέσω malloc. Όπως ένας καλός πολίτης, ελέγχουμε ότι malloc δεν είναι, στην πραγματικότητα, NULL, έτσι ώστε δεν δημιουργούν λάθος μια segfault εδώ. Και κάθε φορά που χρησιμοποιείτε malloc στη ζωή, πρέπει να ελέγξει for null, μήπως έχετε μια λεπτή bug. Τότε θα προετοιμαστεί αυτό το άκυρο με n ανάθεση και την προηγούμενη και την επόμενη. Και σε αυτήν την περίπτωση εδώ, έχω προετοιμαστεί προηγούμενο με μηδενική, επειδή αυτό το νέο κόμβος πρόκειται να είναι η νέα ξεκινώντας από τη λίστα μου. Έτσι υπάρχει πρόκειται να είναι τίποτα πριν από αυτό. Και θέλω να προσαρτήσει ουσιαστικά η υπάρχουσα λίστα στο νέο κόμβο ρύθμιση δίπλα ίσο με λίστα η ίδια. Αλλά εγώ δεν τελείωσα ακόμα. Έτσι, αν η ίδια η λίστα υπήρχε ήδη, και υπήρχε τουλάχιστον ένας κόμβος ήδη σε ισχύ, αν αυτή είναι η λίστα εδώ και εισάγετε ένα νέο κόμβο εδώ, πρέπει να βεβαιωθείτε ότι ο πρώην κόμβο μου επισημαίνει προς τα πίσω στο νέο μου κόμβο, επειδή αυτό είναι, και πάλι, μια διπλά συνδεδεμένη λίστα. Έτσι, κάνουμε έναν έλεγχο λογική. Εάν η λίστα δεν είναι null, αν υπάρχει ήδη έναν ή περισσότερους κόμβους εκεί, τότε προσθέσω ότι πίσω αναφοράς, ώστε να μιλήσουν. Και τότε το τελευταίο πράγμα που χρειαζόμαστε να κάνετε είναι να ενημερώσετε την παγκόσμια ίδια λίστα μεταβλητών στο σημείο στο νέο κόμβο. Ναι. ΚΟΙΝΟ: Στο δείκτη βέλους [Δεν ακούγεται] ισούται με null, το κάνει αυτό ασχολούνται με τη λίστα, επειδή ο κατάλογος είναι άκυρη; DAVID J. MALAN: Όχι. Αυτό είναι απλά μου είναι προληπτικά Προσέξτε, ότι αν αυτό είναι μου αρχική λίστα με ίσως κάποιες περισσότερους κόμβους εδώ και είμαι εισαγωγή μου νέος κόμβος εδώ, υπάρχει μετάβαση να είναι τίποτα εδώ. Και θέλω να συλλάβει αυτή την ιδέα θέτοντας προηγούμενο για null στο νέο κόμβο. Και προφανώς, αν κωδικό μου είναι σωστή και δεν υπάρχει κανένας άλλος τρόπος για να εισάγετε κόμβοι πλην αυτή τη λειτουργία, προφανώς, ακόμη και αν η λίστα έχει ήδη έναν ή περισσότερους κόμβους σε αυτό, πιθανώς το κατάλογο, ο πρώτος κόμβος, θα έχουν προηγούμενο δείκτη του ίδιου null. ΚΟΙΝΟ: Και μόλις παρακολούθηση. Ο λόγος που βάζετε το δείκτη του επόμενου ίσων κατάλογος κάνεις το δείκτη πριν από κατάλογο που να υποδεικνύουν στην επόμενη, υποθέτω - I ικ - απλά παραθέτει; DAVID J. MALAN: Ακριβώς. Και έτσι ας εξετάσουμε στην πραγματικότητα δύο περιπτώσεις εδώ πραγματικά, ακόμα και αν η σειρά που θα τις εξετάσει, δεν είναι ακριβώς το ίδιο με τον κώδικα. Αλλά σε ένα υψηλό επίπεδο, αν αυτό αντιπροσωπεύει λίστα και αυτό είναι ένα 32-bit δείκτη, η απλούστερη σενάριο είναι ότι αυτό είναι μηδενική από προεπιλογή. Και ας υποθέσουμε ότι θέλετε να εισαγάγετε το αριθμός 50 ήταν ο πρώτος αριθμός. Έτσι, Πάω να πάει μπροστά και να διαθέσει ένας κόμβος, ο οποίος πρόκειται να περιέχουν τρεις τομείς - n, την προηγούμενη και την επόμενη. Πάω να θέσει τον αριθμό 50 εδώ, γιατί αυτό θα είναι n. Αυτό θα είναι το επόμενο. Και αυτό θα είναι προγενέστερη. Και ναι, τι μπορώ να κάνω σε αυτή την περίπτωση; Λοιπόν, έχω κάνει μόνο 1 γραμμή εδώ. Δείκτη n παίρνει n. Είμαι στη συνέχεια, λέγοντας προηγούμενο θα πρέπει να πάρει null. Έτσι, αυτό πρόκειται να είναι null. Στη συνέχεια, Πάω να πω στη συνέχεια πρόκειται να πάρετε τον κατάλογο. Και αυτό λειτουργεί ακριβώς καλά. Αυτό είναι null. Και έτσι λέω, ο νέος κόμβος δίπλα τομέα θα πρέπει να πάρει ό, τι είναι αυτό. Έτσι ώστε να προσφέρει έναν ακόμη null εκεί. Και τότε το τελευταίο πράγμα Που κάνω είναι να δείτε εδώ. Εάν η λίστα δεν είναι ίση με μηδενική, αλλά είναι ίση με null, έτσι ώστε να παραλείψετε το συνολικά. Και έτσι το μόνο που κάνω είναι την επόμενη λίστα παίρνει δείκτη, η οποία οδηγεί σε εικονογραφικά μια εικόνα σαν αυτό. Έτσι, αυτό είναι ένα σενάριο. Και αυτό που σας ζητούσαν για Συγκεκριμένα είναι μια κατάσταση όπως αυτή, όπου έχουμε ήδη μια λίστα ενός κόμβου. Και αν μπορώ να πάω πίσω στην αρχική Δήλωση πρόβλημα, η επόμενη θα εισάγετε ας πούμε είναι 34, μόνο για η χάρη της συζήτησης. Έτσι, Πάω να απλά βολική Ισοπαλία ότι εδώ. Έχω μόλις malloced. Ας υποθέσουμε ότι είμαι έλεγχο για null. Τώρα, είμαι πρόκειται να προετοιμαστεί n να είναι 34. Και αυτό θα είναι n. Αυτό θα είναι το επόμενο. Και αυτό θα είναι προγενέστερη. Ας βεβαιωθείτε ότι δεν το έκανα πάρετε αυτό προς τα πίσω. Προηγούμενη έρχεται πρώτη στον ορισμό. Επιτρέψτε μου να το διορθώσω αυτό. Αυτή είναι η προηγούμενη. Αυτό είναι το επόμενο. Ακόμα κι αν αυτά είναι ταυτόσημα, ας μείνει συνεπής. Προηγούμενη. Αυτό είναι το επόμενο. Έτσι έχω μόνο malloced σημείωμά μου, που ελέγχθηκαν for null, αποδίδεται 34 εντός του κόμβου. Προηγούμενη παίρνει null. Έτσι, αυτό μου δίνει αυτό. Στη συνέχεια παίρνει λίστα. Έτσι, η λίστα είναι αυτό. Έτσι, αυτό είναι η ίδια σήμερα όπως κατάρτιση αυτή βέλος, ώστε να είναι στραμμένες προς ένα στο ίδιο. Και τότε Φεύγω εάν η λίστα δεν είναι ίση με null. Και δεν είναι αυτή τη φορά. Στη συνέχεια, Πάω να κάνουμε λίστα προηγούμενη παίρνει δείκτη. Έτσι λίστα προηγούμενη παίρνει PTR. Έτσι αυτό έχει ως αποτέλεσμα την τοποθέτηση ένα γραφικό βέλος εδώ. Και ότι είναι να πάρει μια μικρή κυματιστό, οι γραμμές. Και στη συνέχεια, τέλος, μπορώ να ενημερώσω λίστα να επισημάνω pointer. Μέχρι τώρα αυτά τα σημεία σε αυτόν τον τύπο. Και τώρα, ας κάνουμε μια γρήγορη ελέγχου ασφαλείας. Εδώ είναι η λίστα, η οποία είναι η παγκόσμια μεταβλητή. Ο πρώτος κόμβος είναι, πράγματι, 34, διότι Είμαι μετά από αυτό το βέλος. Και αυτό είναι σωστό, γιατί θέλω να τοποθετήστε στην αρχή της λίστας όλα τα νέα κόμβους. Επόμενο πεδίο του με οδηγεί σε αυτόν τον άνθρωπο. Αν μπορώ να συνεχίσω, χτύπησα επόμενο είναι null. Έτσι, δεν υπάρχει ακόμα λίστα. Αν χτύπησα προηγούμενο, παίρνω πίσω που περιμένω. Έτσι, υπάρχουν ακόμα μερικοί δείκτες, προφανώς, να χειραγωγήσουν. Αλλά το γεγονός ότι σας είπαν να κάνετε αυτό σε σταθερό χρόνο σας σημαίνει μόνο έχει έναν πεπερασμένο αριθμό των πραγμάτων έχετε τη δυνατότητα να κάνετε. Και τι είναι αυτός ο αριθμός; Θα μπορούσε να είναι ένα βήμα. Θα μπορούσε να είναι δύο. Θα μπορούσε να είναι 1000 βήματα. Αλλά είναι πεπερασμένο, το οποίο σημαίνει ότι δεν μπορείτε να Οι κάθε είδους looping σε εξέλιξη εδώ, δεν αναδρομή, χωρίς βρόγχους. Είναι μόλις πήρε να είναι δύσκολο κωδικοποιημένων γραμμών του κώδικα, καθώς έχουμε σε αυτό το δείγμα. Έτσι, το επόμενο πρόβλημα 12 μας ζήτησε να ολοκληρωθεί η εφαρμογή της αφαίρεση κάτω κατά τέτοιο τρόπο ώστε να απομακρύνει n από τον κατάλογο σε γραμμικό χρόνο. Έτσι, έχετε λίγο περισσότερο περιθώρια κουνάω τώρα. Μπορείτε να υποθέσετε ότι n, αν υπάρχει στον κατάλογο, θα είναι παρούσα όχι περισσότερο από μία φορά. Και αυτό επίσης είναι γραφτό να γίνει ένα κουίζ που βασίζονται απλουστευτική παραδοχή, τόσο ότι αν βρείτε τον αριθμό 50 κάπου στη λίστα, δεν χρειάζεται να έχετε να ανησυχείτε για τη συνέχιση της επαναλήψεις, ψάχνει για κάθε πιθανή αντίγραφο του 50, η οποία θα μεταβιβάσει μόνο σε κάποια minutia σε περιορισμένο χρονικό διάστημα. Έτσι, με αφαίρεση, αυτό ήταν σίγουρα πιο δύσκολο και πιο κώδικα για να γράψει. Αλλά με την πρώτη ματιά, ειλικρινά, ότι θα μπορούσε φανεί συντριπτική και σαν κάτι δεν υπάρχει κανένας τρόπος που θα μπορούσε να έχει καταλήξουμε σε ένα κουίζ. Αλλά αν έχουμε επικεντρωθεί σε επιμέρους βήματα, ελπίζουμε, θα ξαφνικά χτυπάτε ότι καθένα από αυτά τα μεμονωμένα βήματα καθιστά προφανή αίσθηση εκ των υστέρων. Έτσι, ας ρίξουμε μια ματιά. Έτσι, η πρώτη, έχουμε προετοιμαστεί δείκτη να είναι η ίδια λίστα. Επειδή θέλω γραμμικό χρόνο, αυτό σημαίνει Πάω να έχουν κάποια βρόχο. Και ένας κοινός τρόπος για να μετακινηθείτε πάνω από το κόμβων σε μια δομή λίστας ή οποιουδήποτε είδους της δομής επαναληπτικά είναι να λάβει ένα δείκτη προς το μπροστινό μέρος του στοιχείων δομή και στη συνέχεια, μόλις αρχίσει ενημέρωση αυτό και τα πόδια το δρόμο σας μέσω της δομής των δεδομένων. Έτσι, Πάω να κάνουμε ακριβώς αυτό. Ενώ δείκτη, προσωρινή μεταβλητή μου, δεν είναι ίση με null, ας να προχωρήσει και να ελέγξετε. Μήπως είμαι τυχερός; Είναι το πεδίο n στον κόμβο είμαι σήμερα κοιτάζοντας ίσο με το Αριθμός ψάχνω; Και αν ναι, ας κάνουμε κάτι. Τώρα, αν παρατηρήσετε αυτό τον όρο περιβάλλει ολόκληρο παρακάτω γραμμές κώδικα. Αυτό είναι το μόνο που με νοιάζει - βρίσκοντας έναν αριθμό σε ερώτηση. Έτσι, δεν υπάρχει άλλο, το οποίο απλοποιεί εννοιολογικά τα πράγματα λίγο. Αλλά τώρα, κατάλαβα, και μπορεί να έχετε υλοποιηθεί μόνο αυτό μετά από σκέψη μέσα από ένα κομμάτι, υπάρχει στην πραγματικότητα δύο περιπτώσεις εδώ. Το ένα είναι όπου ο κόμβος είναι κατά τη αρχή της λίστας, η οποία είναι μια λίγο ενοχλητικό, γιατί αυτό είναι ένα ειδική περίπτωση, γιατί θα έχουν να αντιμετωπίσουν με αυτό το πράγμα, το οποίο είναι η μόνη ανωμαλία. Οπουδήποτε αλλού στον κατάλογο, είναι το ίδιο πράγμα. Υπάρχει ένα προηγούμενο κόμβο και το επόμενο κόμβο, τον προηγούμενο κόμβο, το επόμενο κόμβο. Αλλά αυτός ο τύπος είναι λίγο ειδική αν είναι στην αρχή. Έτσι, αν ο δείκτης ισούται με τη λίστα μόνη της, οπότε αν είμαι στην αρχή του ο κατάλογος και έχω βρεθεί n, χρειάζομαι να κάνει μερικά πράγματα. Ένα, θα πρέπει να αλλάξει σε λίστα σημείο στο επόμενο πεδίο, 50. Έτσι, ας υποθέσουμε ότι εγώ προσπαθώ για την απομάκρυνση 34. Έτσι, αυτός ο τύπος πρέπει να πάει μέσα σε μόλις μια στιγμή. Έτσι, Πάω να πω, λίστα pointer παίρνει το επόμενο. Λοιπόν, αυτό είναι δείκτης. Επόμενο είναι στραμμένο προς τα εδώ. Έτσι, αυτό αλλάζει αυτό το δεξί βέλος τώρα να επισημάνω σε αυτόν τον άνθρωπο εδώ. Τώρα, να θυμάστε, έχουμε μια προσωρινή μεταβλητή. Έτσι, δεν έχουμε καμία ορφανά κόμβους, γιατί και εγώ έχω αυτόν τον τύπο κατά τη γνώμη μου εφαρμογή του αφαίρεση. Έτσι τώρα, αν η ίδια η λίστα δεν είναι null, Θα πρέπει να καθοριστεί κάτι. Πρέπει τώρα να διασφαλίσουμε ότι αυτό το βέλος, το οποίο προηγουμένως κατάδειξης 50-34, αυτό πρέπει να πάει μακριά, γιατί αν προσπαθώ να απαλλαγούμε 34, 50 είχαν καλύτερα να μην διατηρεί καμία το είδος της αναφοράς πίσω σε αυτό, όπως η βέλος πρότεινε. Γι 'αυτό ακριβώς έκανα αυτή τη γραμμή. Έτσι, στη συνέχεια, τέλειωσα. Η υπόθεση αυτή είναι πραγματικά αρκετά εύκολο. Κόβοντας το κεφάλι της λίστας είναι σχετικά απλή. Δυστυχώς, υπάρχει αυτή η ενοχλητικό άλλο μπλοκ. Μέχρι τώρα, έχω να εξετάσει την περίπτωση όπου υπάρχει κάτι στη μέση. Αλλά δεν είναι πολύ φοβερό, εκτός για σύνταξη σαν αυτό. Έτσι, αν δεν είμαι στην αρχή της λίστα, είμαι κάπου στη μέση. Και αυτή η γραμμή εδώ λέει, έναρξη σε ό, τι κόμβο είστε. Μετάβαση στο επόμενο πεδίο του προηγούμενου κόμβου και το σημείο ότι στο δείκτη. Ας κάνουμε αυτό εικονογραφικά. Αυτό ήταν να πάρει περίπλοκη. Έτσι, αν έχω προηγούμενα πεδία εδώ - ας το κάνουμε αυτό - επόμενη τομείς εδώ. Πάω να απλοποιήσει τους δείκτες μου και όχι από σχεδιάσετε ένα σωρό τα πράγματα και πίσω διασταυρώνονται κάθε άλλο. Και τώρα, ας πούμε ότι αυτό είναι 1, 2, 3 για χάρη της συζήτησης, ακόμη αν και αυτό δεν είναι ευθυγραμμισμένο με το εν λόγω πρόβλημα. Έτσι, εδώ είναι συνδεδεμένη λίστα μου. Είμαι προσπαθεί να αφαιρέσει δύο σε αυτό συγκεκριμένη εκδοχή της ιστορίας. Έτσι έχω ενημερωθεί δείκτη σε να δείχνει σε αυτόν τον άνθρωπο. Έτσι, αυτό είναι το PTR. Έχει δείχνει εδώ. Αυτή είναι η λίστα, η οποία υπάρχει σε παγκόσμιο επίπεδο όπως και πριν. Και αυτός είναι προς τα εδώ δεν έχει σημασία τι. Και τώρα, προσπαθώ να αφαιρέσει δύο. Έτσι, αν δείκτης δείχνει εδώ, είμαι πρόκειται να ακολουθήσει, προφανώς, η προηγούμενο δείκτη, που με βάζει σε 1. Είμαι στη συνέχεια πρόκειται να πει ότι η επόμενη πεδίο, το οποίο με φέρνει πάνω σε αυτό box εδώ, πρόκειται να ίση δείκτη επόμενο. Έτσι, αν αυτό το δείκτη, αυτό είναι το επόμενο. Αυτό σημαίνει ότι αυτό το βέλος ανάγκες να επισημάνω σε αυτόν τον άνθρωπο. Έτσι, αυτό που η γραμμή του κώδικα έχει μόνο γίνει είναι λίγο αυτό. Και τώρα, αυτό μοιάζει με μια βήμα προς τη σωστή κατεύθυνση. Εμείς θέλουμε ουσιαστικά να κόβουν από 2 του μέσου των 1 και 3. Έτσι είναι λογικό ότι θέλουμε να διαδρομή αυτού του δείκτη γύρω από αυτό. Έτσι, αυτή η επόμενη γραμμή είναι να ελέγξετε αν το δείκτη επόμενο δεν είναι null, δεν υπάρχει πράγματι κάποιος το δικαίωμα των 2, αυτό σημαίνει ότι έχουμε επίσης να κάνουμε ένα μικρό απόκομμα εδώ. Γι 'αυτό τώρα πρέπει να ακολουθήσουν αυτόν το δείκτη και να ενημερώσετε το προηγούμενο δείκτη για αυτός ο τύπος να κάνει ένα μικρό κομμάτι ενός παρακάμψετε εδώ το σημείο εδώ. Και τώρα, οπτικά αυτό είναι ωραίο. Είναι λίγο ακατάστατο στο ότι υπάρχει κανείς δεν δείχνει στο 2 πια. 2 είναι στραμμένη προς τα αριστερά. Και 2 είναι στραμμένη προς τα δεξιά. Αλλά μπορεί να κάνει ό, τι θέλει, γιατί είναι έτοιμος να πάρει απελευθερωθεί. Και δεν έχει σημασία τι αυτές οι τιμές είναι πια. Αυτό που είναι σημαντικό είναι ότι το υπόλοιπο Τα παιδιά δρομολόγησης παραπάνω και κάτω από αυτόν τώρα. Και πράγματι, αυτό είναι που θα κάνουμε στη συνέχεια. Εμείς δωρεάν δείκτη, πράγμα που σημαίνει ότι πει η το λειτουργικό σύστημα, είστε ευπρόσδεκτοι να διεκδικήσει αυτό. Και στη συνέχεια, τέλος, θα επιστρέψει. Αλλιώς σιωπηρά, αν δεν έχουν επιστρέψει ακόμα, έχουμε να συνεχίσετε να ψάχνετε. Έτσι δείκτης ισούται με το δείκτη δίπλα ακριβώς σημαίνει να μετακινήσετε αυτόν τον τύπο εδώ. Μετακινήστε αυτόν τον τύπο εδώ. Μετακινήστε αυτόν τον τύπο εδώ αν, στην πραγματικότητα, δεν βρήκαμε τον αριθμό ψάχνουμε ακόμη για. Έτσι, ειλικρινά, φαίνεται εντελώς συντριπτική, νομίζω, κατά την πρώτη ματιά, ειδικά αν έχετε παλέψει με αυτό κατά τη διάρκεια του κουίζ στη συνέχεια να δούμε κάτι σαν αυτό. Και εσείς τον εαυτό σας ελαφρύ κτύπημα στην πλάτη. Λοιπόν, δεν υπάρχει κανένας τρόπος που θα μπορούσε να έχει καταλήξει ότι στο κουίζ. Αλλά θα έλεγα, μπορείτε αν σπάσει προς τα κάτω σε αυτές τις μεμονωμένες περιπτώσεις και μόνο με τα πόδια μέσα από αυτό προσεκτικά, αν και, κατά γενική ομολογία, υπό στρεσογόνες συνθήκες. Ευτυχώς, η εικόνα που πάντα ευτυχισμένοι. Θα μπορούσε να αντλήσει αυτό οποιοδήποτε αριθμό τρόπων. Δεν χρειάζεται να κάνουν το διασταυρώνονται πράγμα εδώ. Θα μπορούσατε να το κάνετε με ευθείες γραμμές όπως αυτό. Αλλά η ουσία του προβλήματος αυτού, σε Γενικά, ήταν να συνειδητοποιήσουμε ότι η εικόνα στο τέλος θα πρέπει να κοιτάξουμε λίγο κάτι σαν αυτό, γιατί συνεχή φορά άφησε να εννοηθεί ότι θα κρατήσει εμπλοκές και εμπλοκές και εμπλοκές της νέων κόμβων στην αρχή του καταλόγου. Οποιεσδήποτε ερωτήσεις; Πιθανώς το πιο δύσκολο από σίγουρα η κωδικοποίηση ερωτήσεις. ΚΟΙΝΟ: Έτσι είναι η λίστα παρόμοια με κεφάλι στα προηγούμενα παραδείγματα. DAVID J. MALAN: Ακριβώς, ακριβώς. Απλά ένα διαφορετικό όνομα για μια καθολική μεταβλητή. Σε παγκόσμιο επίπεδο, τι; ROB BOWDEN: OK. Έτσι, αυτό είναι το ένα, όπου μπορείτε Έπρεπε να γράψει το σημείο. Μερικοί άνθρωποι έγραψαν δοκίμια για το θέμα αυτό. Αλλά το μόνο που χρειάζεται να χρησιμοποιήσετε αυτές τις έξι όρους για να περιγράψει τι συμβαίνει όταν θα προσπαθήσει να επικοινωνήσει με facebook.com. Γι 'αυτό θα μιλήσω μόνο μέσω της διαδικασίας χρήση όλων αυτών των όρων. Έτσι, στο πρόγραμμα περιήγησής μας, πληκτρολογήστε facebook.com και πατήστε Enter. Έτσι, το πρόγραμμα περιήγησης μας πρόκειται να κατασκευάσει ένα HTTP ζητήσει ότι πρόκειται να στείλει μέσα από κάποια διαδικασία στο Facebook για Facebook για να μας απαντήσουν με το HTML της σελίδας του. Έτσι ποια είναι η διαδικασία με την οποία η αίτηση HTTP παίρνει πραγματικά στο Facebook; Έτσι, η πρώτη, θα πρέπει να μεταφράσει Facebook.com. Έτσι μόλις δοθεί το όνομα Facebook.com, όταν κάνει πραγματικότητα το αίτημα HTTP Πρέπει να πάτε; Πρέπει, λοιπόν, να μεταφράσει Facebook.com σε μια διεύθυνση IP, που με μοναδικό τρόπο προσδιορίζει τι μηχανή που πραγματικά θέλετε να στείλετε το αίτημα αυτό. Ο φορητός υπολογιστής σας έχει μια διεύθυνση IP. Οτιδήποτε συνδέεται στο διαδίκτυο έχει μια διεύθυνση IP. Έτσι, DNS, Domain Name System, που είναι τι πρόκειται να αναλάβουμε τη μετάφραση από facebook.com σε μια διεύθυνση IP που που πραγματικά θέλετε να επικοινωνήσετε. Έτσι, ερχόμαστε σε επαφή με τους διακομιστές DNS και ας πούμε, τι είναι facebook.com; Λέει, το OH, αυτό είναι η διεύθυνση IP 190,212 κάτι, κάτι, κάτι. Εντάξει. Τώρα, ξέρω τι μηχανή Θέλω να επικοινωνήσω. Έτσι, τότε μπορείτε να στείλετε το αίτημα σας HTTP πάνω σε αυτό το μηχάνημα. Έτσι, πώς να το φτάσουμε σε αυτό το μηχάνημα; Λοιπόν, το αίτημα πηγαίνει από το router γερός. Θυμηθείτε το παράδειγμα στην τάξη, όπου είδαμε πραγματικά την πορεία που ακολουθεί το πακέτα πήρε όταν προσπαθήσαμε να επικοινωνούν. Είδαμε να πηδήξει πάνω από τον Ατλαντικό Ocean σε ένα σημείο ή οτιδήποτε άλλο. Έτσι, το τελευταίο διάστημα το λιμάνι. Έτσι, αυτό είναι τώρα στον υπολογιστή σας. Μπορείτε να έχετε πολλαπλές πράγματα σήμερα επικοινωνεί με το διαδίκτυο. Γι 'αυτό και μπορεί να τρέχει, ας πούμε, το Skype. Θα μπορούσα να έχω ένα web browser ανοιχτό. Μπορεί να έχω κάτι που torrenting αρχεία. Έτσι, όλα αυτά τα πράγματα είναι που επικοινωνεί με το διαδίκτυο με κάποιο τρόπο. Έτσι, όταν ο υπολογιστής σας λαμβάνει κάποια δεδομένα από το διαδίκτυο, πώς το κάνει γνωρίζουν τι πραγματικά εφαρμογής θέλει τα δεδομένα; Πώς να ξέρω αν αυτό το συγκεκριμένο δεδομένων προορίζεται για την torrenting εφαρμογή σε αντιδιαστολή στο πρόγραμμα περιήγησης στο Web; Έτσι, αυτός είναι ο σκοπός των λιμένων που όλες αυτές οι εφαρμογές έχουν υποστήριξε μια θύρα του υπολογιστή σας. Έτσι, web browser σας λέει, hey, Είμαι ακρόαση στη θύρα 1000. Και το πρόγραμμα torrenting σας λέει, Είμαι ακρόαση στη θύρα 3000. Και Skype λέει, είμαι χρησιμοποιώντας τη θύρα 4000. Έτσι, όταν θα έχετε κάποια στοιχεία που ανήκει σε μία από αυτές τις εφαρμογές, τα δεδομένα επισημαίνεται με τη θύρα πραγματικά πρέπει να αποστέλλονται μαζί με. Έτσι, αυτό λέει, ω, ανήκω στη θύρα 1000. Ξέρω τότε θα πρέπει να διαβιβάσει αυτό μαζί με πρόγραμμα περιήγησης στο web μου. Έτσι, ο λόγος που είναι σχετικές εδώ είναι ότι οι web server τείνουν να ακρόαση στη θύρα 80. Έτσι, όταν μπορώ να επικοινωνήσω με Facebook.com, είμαι επικοινωνεί με κάποια μηχανή. Αλλά πρέπει να πω ποια θύρα του ότι μηχάνημα θέλω να επικοινωνήσω με. Και διακομιστές web τείνουν να είναι ακρόαση στη θύρα 80. Αν ήθελαν, θα μπορούσαν να το ρυθμίσετε έτσι απαριθμεί όπως στη θύρα 7000. Και στη συνέχεια, σε ένα πρόγραμμα περιήγησης στο web, θα μπορούσα πληκτρολογώντας Facebook.com: 7000 έως αποστέλλει το αίτημα στη θύρα 7000 του web server του Facebook. DAVID J. MALAN: Και σε αυτή την περίπτωση, ακόμα και παρόλο που δεν απαιτούν ότι οι άνθρωποι Το αναφέρω αυτό, στην περίπτωση αυτή, ποια θύρα Θα το αίτημα πραγματικά να πάει να? Δοκιμάστε ξανά. Ακριβώς. Δεν ψάχνει για αυτό, αλλά μια λεπτότητα ότι δεν υπάρχει κανένας το τελευταίο. ROB BOWDEN: Έτσι, το HTTPS, δεδομένου ότι είναι ακούγοντας ειδικά για το κρυπτογραφημένα, είναι στη θύρα 4430. ΚΟΙΝΟ: Και τα μηνύματα είναι 25, σωστά; DAVID J. MALAN: Εξερχόμενος emails, 25, ναι. ROB BOWDEN: Εγώ δεν ξέρω καν οι περισσότεροι από η - όλα από τα χαμηλότερα αυτά τείνουν να είναι προορίζεται για τα πράγματα. Νομίζω ότι τα πάντα κάτω από 1024 είναι δεσμευμένο. ΚΟΙΝΟ: Γιατί το είπες 3 ήταν το λάθος αριθμό; ROB BOWDEN: Επειδή σε μια διεύθυνση IP, υπάρχει τέσσερις ομάδες ψηφίων. Και είναι από 0 έως 255. Έτσι 192.168.2.1 είναι μια κοινή τοπική διεύθυνση IP του δικτύου. Παρατηρήστε όλα αυτά είναι μικρότερη από 255. Έτσι, όταν άρχισα με 300, ότι δεν θα μπορούσε να έχει ήταν ένας από τους αριθμούς. DAVID J. MALAN: Αλλά αυτή η ανόητη clip από - ήταν CSI, όπου είχαν μια Αριθμός μονάδων που ήταν πολύ μεγάλο για τη διεύθυνση IP. ROB BOWDEN: Οποιεσδήποτε ερωτήσεις σχετικά με αυτό; Η επόμενη, τόσο ολοκληρωτική αλλαγή το θέμα, αλλά έχουμε αυτό το PHP-array για τα σπίτια στο τετραπλό. Και έχουμε μια μη διατεταγμένη λίστα. Και θέλουμε να εκτυπώσει το κάθε στοιχείο της λίστας ακριβώς περιέχει το όνομα του σπιτιού. Έτσι έχουμε έναν βρόχο foreach. Έτσι θυμηθείτε, η σύνταξη είναι foreach πίνακα ως στοιχείο της συστοιχίας. Έτσι μέσα από κάθε επανάληψη του βρόχου, το σπίτι πρόκειται να αναλάβει μία από τις τιμές στο εσωτερικό της συστοιχίας. Από την πρώτη επανάληψη, το σπίτι θα είναι Cabot House. Σε μια δεύτερη επανάληψη, το σπίτι θα να Courier Σπίτι και ούτω καθεξής. Έτσι, για κάθε quad, όπως το σπίτι, είμαστε ακριβώς πρόκειται να εκτυπώσετε - μπορείτε επίσης θα μπορούσε να έχει απήχηση - το στοιχείο της λίστας και στη συνέχεια το όνομα του σπιτιού και στη συνέχεια κλείστε το στοιχείο λίστας. Οι αγκύλες είναι προαιρετικές εδώ. Και τότε είπε, επίσης, στην ερώτηση η ίδια, θυμηθείτε να κλείσετε το μη διατεταγμένη λίστα tag. Γι 'αυτό και πρέπει να βγείτε από τη λειτουργία PHP για να γίνει αυτό. Ή θα μπορούσαμε να έχουμε επανέλαβε το κλείστε μη διατεταγμένη λίστα tag. DAVID J. MALAN: Επίσης ωραία εδώ θα ήταν να χρησιμοποιήσετε ένα παλιό σχολείο για βρόχο με $ i = 0 0 και χρησιμοποιώντας Η προς καταλάβουμε το μήκος της ακτίνας. Εντελώς πάρα πολύ ωραία, απλά λίγο wordier. ΚΟΙΝΟ: Έτσι, αν επρόκειτο να [Δεν ακούγεται], θα κάνουμε - Ξεχάσω ό, τι ο βρόχος [δεν ακούγεται] είναι. Θα σας $ βραχίονα quad i; DAVID J. MALAN: Ακριβώς. Ναι, ακριβώς. ROB BOWDEN: Τίποτα άλλο; DAVID J. MALAN: Εντάξει. Εμπόριο-offs. Έτσι, υπήρχαν δέσμες των απαντήσεων δυνατό για καθένα από αυτά. Ήμασταν πολύ απλά ψάχνουν για κάτι συναρπαστικό για ένα αναποδογυρισμένο και ένα μειονέκτημα. Και το νούμερο 16 ζήτησε, την επικύρωση των χρηστών εισόδου στην πλευρά του πελάτη, όπως και με JavaScript, αντί των server-side, όπως με την PHP. Έτσι, αυτό είναι ένα θετικό στοιχείο της κάνει client-side; Λοιπόν, ένα από τα πράγματα που προτείνεται είναι ότι μείωση του χρόνου αναμονής, γιατί Δεν χρειάζεται να ασχοληθείτε σε επαφή με το διακομιστή, η οποία μπορεί να διαρκέσει μερικά χιλιοστά του δευτερολέπτου ή ακόμη και ένα ζευγάρι δευτερόλεπτα αποφεύγοντας ότι και μόνο επικύρωση των χρηστών εισόδου client-side από προκαλώντας μια on-χειριστή και να υποβάλει μόνο τον έλεγχο, έκαναν τύπου κάτι για το όνομα; Μήπως πληκτρολογήσετε κάτι μέσα για τη διεύθυνση ηλεκτρονικού ταχυδρομείου; Μήπως θα επιλέξουν έναν κοιτώνα από το drop-down μενού; Μπορείτε να τους δώσει στιγμιαία ανατροφοδότηση χρησιμοποιώντας τον υπολογιστή gigahertz ή ό, τι έχει αυτό είναι στην πραγματικότητα στο γραφείο τους. Έτσι είναι απλά μια καλύτερη χρήστη δοκιμάσει συνήθως. Αλλά ένα μειονέκτημα να κάνει client-side επικύρωση, αν το κάνεις χωρίς να κάνει επικύρωση server-side είναι ότι οι περισσότεροι καθένας που βγαίνει από CS50 ξέρει ότι μπορείτε απλά να στείλετε τα δεδομένα που θέλετε σε ένα διακομιστή οποιοδήποτε αριθμό από τρόπους. Ειλικρινά, στα περισσότερα οποιοδήποτε πρόγραμμα περιήγησης, μπορείτε να κλικ γύρω στις ρυθμίσεις και απλά σβήνετε τη JavaScript, τα οποία θα μπορούσε, Ως εκ τούτου, απενεργοποιήστε κάθε μορφή επικύρωση. Αλλά μπορείτε επίσης να θυμηθούμε ότι ακόμα και εγώ έκανε κάποιες απόκρυφες πράγματα σε τάξη με τη χρήση telnet και μάλιστα προσποιείται ότι είναι ένα πρόγραμμα περιήγησης με την αποστολή get αιτήσεις σε ένα διακομιστή. Και αυτό σίγουρα δεν είναι χρησιμοποιώντας οποιαδήποτε JavaScript. Αυτό ακριβώς μου πληκτρολογώντας εντολές σε ένα πληκτρολόγιο. Έτσι, πραγματικά, κάθε προγραμματιστής μέσα σε αρκετά άνεση με το διαδίκτυο και HTTP θα μπορούσε να στείλει οποιαδήποτε στοιχεία που θέλει σε ένα διακομιστή χωρίς επικύρωση. Και αν ο διακομιστής σας δεν είναι, επίσης, τον έλεγχο, δεν μου δίνουν ένα όνομα, είναι Αυτό πραγματικά μια έγκυρη διεύθυνση e-mail, έκανε επιλέγουν έναν κοιτώνα, ίσως να καταλήξετε μέχρι την εισαγωγή ανύπαρκτων ή απλά κενό δεδομένων στη βάση δεδομένων σας, η οποία κατά πάσα πιθανότητα Δεν πρόκειται να είναι ένα καλό πράγμα, αν θα ήταν αν υποτεθεί ότι υπήρχε. Έτσι, αυτό είναι μια ενοχλητική πραγματικότητα. Αλλά σε γενικές γραμμές, client-side επικύρωση είναι μεγάλη. Αλλά αυτό σημαίνει διπλάσια δουλειά. Παρά το γεγονός ότι υπάρχουν πράγματι διάφορες βιβλιοθήκες, βιβλιοθήκες JavaScript για παράδειγμα, που κάνουν αυτό το πολύ, πολύ λιγότερο από έναν πονοκέφαλο. Και μπορείτε να χρησιμοποιήσετε ξανά μερικά από τα κωδικού server-side, client-side. Αλλά συνειδητοποιούν ότι είναι συνήθως πρόσθετη εργασία. Ναι. ΚΟΙΝΟ: Έτσι, αν εμείς απλά είπε ο λιγότερο ασφαλής - DAVID J. MALAN: [Γελάει] Ugh. Αυτά είναι πάντα το πιο δύσκολο αυτοί να αποφανθεί. ROB BOWDEN: Αυτό θα έχουν γίνει αποδεκτές. DAVID J. MALAN: Τι; ROB BOWDEN: Δημιούργησα αυτό το πρόβλημα. Αυτό θα μπορούσε να γίνει αποδεκτή. DAVID J. MALAN: Ναι. ΚΟΙΝΟ: Cool. ROB BOWDEN: Αλλά δεν αποδέχονται για το πρώτο - καλά, αυτό που ψάχναμε για είναι κάτι σαν να μην χρειάζεται να επικοινωνία με το διακομιστή. Δεν δεχόμαστε μόνο πιο γρήγορα. ΚΟΙΝΟ: Τι γίνεται με Δεν επανάληψη φόρτωσης της σελίδας; ROB BOWDEN: Ναι. Αυτό ήταν μια αποδεκτή απάντηση. DAVID J. MALAN: Οτιδήποτε όπου αισθανθήκαμε ήταν πιο πιθανό από ό, τι δεν είναι πιθανό ότι ήξερες τι ήταν λέγοντας, η οποία είναι μια σκληρή γραμμή για να συντάξει μερικές φορές. Χρησιμοποιώντας μια συνδεδεμένη λίστα, αντί ενός πίνακα για να διατηρήσει μια ταξινομημένη λίστα των ακεραίων. Έτσι, και η άλλη πλευρά που αναφέρουν συχνά συνδέονται με καταλόγους που παρακίνησε όλη τους τη εισαγωγή ήταν μπορείτε να πάρετε δυναμισμό. Μπορούν να αναπτυχθούν. Μπορούν να συρρικνωθεί. Έτσι, δεν χρειάζεται να πηδούν μέσα από στεφάνες για να δημιουργήσετε πραγματικά περισσότερη μνήμη με μία συστοιχία. Ή δεν χρειάζεται να είναι μόνο λένε, συγγνώμη, ο χρήστης. Η συστοιχία είναι γεμάτη. Έτσι δυναμική ανάπτυξη του καταλόγου. Ένα μειονέκτημα όμως από συνδεδεμένες λίστες; ΚΟΙΝΟ: Είναι γραμμική. Ψάχνοντας για συνδεδεμένη λίστα είναι γραμμική αντί για αυτό που θα συνδεθείτε DAVID J. MALAN: Ακριβώς. Ψάχνοντας για μια συνδεδεμένη λίστα είναι γραμμική, ακόμα κι αν είναι ταξινομημένο, επειδή μπορείτε να μόνο ακολουθήστε τα ψίχουλα ψωμιού, αυτά δείκτες, από την αρχή της λίστας μέχρι το τέλος. Δεν μπορείτε να μόχλευσης τυχαίας προσπέλασης και, Έτσι, δυαδική αναζήτηση, ακόμα κι αν είναι ταξινόμηση, ότι θα μπορούσατε κάνει με μια σειρά. Και υπάρχει επίσης ένα άλλο κόστος. Ναι. ΚΟΙΝΟ: Μνήμη αναποτελεσματική; DAVID J. MALAN: Ναι. Λοιπόν, εγώ δεν θα 'ανάγκην λένε αναποτελεσματική. Αλλά δεν σας κοστίσει περισσότερη μνήμη, γιατί θα πρέπει να έχετε 32 bits για κάθε κόμβος για την πρόσθετη δείκτη, σε τουλάχιστον για μεμονωμένα συνδεδεμένη λίστα. Τώρα, αν είστε αποθήκευση μόνο ακέραιοι και θέλετε να προσθέσετε το δείκτη, αυτό είναι πραγματικά το είδος της μη τετριμμένη. Είναι διπλασιάζοντας την ποσότητα της μνήμης. Αλλά στην πραγματικότητα, εάν είστε αποθήκευση ενός συνδεδεμένη λίστα structs που μπορεί να έχουν 8 bytes, 16 bytes, ακόμη πιο από αυτό, ίσως είναι λιγότερο του οριακού κόστους. Αλλά αυτό είναι ένα κόστος, ωστόσο. Έτσι, είτε από εκείνους που θα έχουμε ήταν ωραία ως μειονεκτήματα. 18. Χρησιμοποιώντας την PHP, αντί της C για να γράψει ένα πρόγραμμα γραμμής εντολών. Έτσι, εδώ, είναι συχνά πιο γρήγορα για να χρησιμοποιήσετε ένα γλώσσα όπως PHP ή Ruby ή Python. Απλά ανοίξετε γρήγορα μέχρι ένα πρόγραμμα επεξεργασίας κειμένου. Έχετε πολλές περισσότερες λειτουργίες στη διάθεσή σας. PHP έχει το νεροχύτη της κουζίνας των λειτουργιών, ενώ στην C, θα έχουν πολύ, πολύ μικρή. Στην πραγματικότητα, τα παιδιά το γνωρίζουν το σκληρό τρόπο ότι δεν έχετε πίνακες κατακερματισμού. Δεν έχετε συνδεδεμένες λίστες. Αν θέλετε αυτά, θα πρέπει να εφαρμόσουν οι ίδιοι. Έτσι, ένα θετικό στοιχείο της PHP ή πραγματικά οποιοδήποτε ερμηνευμένη γλώσσα είναι η ταχύτητα με την οποία μπορείτε να γράψετε κώδικα. Αλλά ένα μειονέκτημα, είδαμε αυτό όταν γρήγορα χτυπημένη ένα misspeller εφαρμογή στη διάλεξη με χρήση PHP, είναι ότι χρησιμοποιώντας ένα ερμηνευμένη γλώσσα είναι συνήθως πιο αργή. Και είδαμε ότι αποδεδειγμένα με ένα αύξηση του χρόνου από 0,3 δευτερόλεπτα έως 3 δευτερόλεπτα, λόγω της ερμηνείας αυτό συμβαίνει στην πραγματικότητα. Μια άλλη ανάποδα ήταν ότι θα Δεν χρειάζεται να συγκεντρώνουν. Έτσι, είναι να επιταχύνει την ανάπτυξη παρεμπιπτόντως, επειδή δεν έχετε δύο βήματα για την εκτέλεση ενός προγράμματος. Έχετε μόνο ένα. Και έτσι ώστε να είναι αρκετά συναρπαστικό, καθώς και. Χρησιμοποιώντας μια βάση δεδομένων SQL, αντί της ένα αρχείο CSV για την αποθήκευση δεδομένων. Έτσι SQL βάση δεδομένων χρησιμοποιείται για pset7. Αρχεία CSV που δεν χρησιμοποιούν σε μεγάλο βαθμό. Αλλά μπορείτε να το χρησιμοποιείται έμμεσα ως pset7 και μιλώντας με το Yahoo Finance. Αλλά CSV είναι ακριβώς όπως ένα αρχείο Excel, αλλά εξαιρετικά απλή, όπου οι στήλες είναι απλά μαρκάρεται με κόμματα μέσα μιας κατά τα άλλα αρχείο κειμένου. Και χρησιμοποιώντας μια βάση δεδομένων SQL είναι λίγο πιο συναρπαστικό. Είναι η άλλη πλευρά, επειδή μπορείτε να πάρετε τα πράγματα όπως επιλέξετε και να εισάγετε και να διαγράψετε. Και μπορείτε να πάρετε, κατά πάσα πιθανότητα, τα ευρετήρια που MySQL και άλλες βάσεις δεδομένων, όπως Oracle, χτίζουμε για εσάς στη μνήμη, η οποία σημαίνει επιλέξτε σας δεν είναι πιθανώς πρόκειται να είναι γραμμική πάνω προς τα κάτω. Είναι πραγματικά πρόκειται να είναι κάτι όπως δυαδική αναζήτηση ή κάτι συναφείς στο πνεύμα. Έτσι είναι γενικά πιο γρήγορα. Αλλά ένα μειονέκτημα είναι ότι είναι απλά περισσότερη δουλειά. Είναι περισσότερη προσπάθεια. Θα πρέπει να καταλάβετε τις βάσεις δεδομένων. Θα πρέπει να το δημιουργήσει. Χρειάζεται ένα διακομιστή για να τρέξει ότι η βάση δεδομένων σχετικά. Θα πρέπει να κατανοήσουν πώς να το ρυθμίσετε. Έτσι, αυτά είναι μόνο αυτά είδη των συμβιβασμών. Λαμβάνοντας υπόψη ότι ένα αρχείο CSV, μπορείτε να δημιουργήστε το gedit. Και είστε καλοί να πάτε. Δεν υπάρχει καμία πολυπλοκότητα πέρα ​​από αυτό. Χρησιμοποιώντας ένα trie αντί για ένα πίνακα κατακερματισμού με Ξεχωριστές αλυσίδες για να αποθηκεύσετε ένα λεξικό των λέξεων που θυμίζουν της pset5. Έτσι, μια προσπαθεί ανάποδα, στη θεωρία τουλάχιστον, είναι αυτό; Σταθερό χρόνο, τουλάχιστον αν είστε hashing σε καθένα από τα επιμέρους γραμμάτων σε μια λέξη, όπως σας θα μπορούσε να έχει για pset5. Αυτό θα μπορούσε να είναι πέντε hashes, έξι hashes αν υπάρχουν πέντε ή έξι γράμματα της λέξης. Και αυτό είναι πολύ καλό. Και αν υπάρχει ένα άνω φράγμα για το πώς καιρό τα λόγια σας μπορεί να είναι, αυτό είναι Πράγματι ασυμπτωτικά σταθερό χρόνο. Λαμβάνοντας υπόψη ότι ένας πίνακας κατακερματισμού με ξεχωριστό αλυσιδωτή σύνδεση, το πρόβλημα υπάρχει με αυτό είδος της δομής δεδομένων είναι ότι η απόδοση των αλγορίθμων σας συνήθως εξαρτάται από τον αριθμό των πραγμάτων ήδη στη δομή δεδομένων. Και αυτό είναι σίγουρα η περίπτωση με αλυσίδες, σύμφωνα με την οποία η περισσότερα πράγματα βάζετε σε έναν πίνακα κατακερματισμού, ο πλέον εκείνων αλυσίδες πάει, πράγμα που σημαίνει στη χειρότερη περίπτωση, το πράγμα που μπορεί να ψάχνει για είναι όλος ο τρόπος στο τέλος του ενός από αυτές τις αλυσίδες, τα οποία ουσιαστικά περιέρχεται σε κάτι γραμμικό. Τώρα, στην πράξη, θα μπορούσε να είναι απολύτως είναι η περίπτωση που ένα πίνακα κατακερματισμού με αλυσίδες είναι ταχύτερη από ό, τι ένα αντίστοιχο εφαρμογή trie. Αλλά αυτό είναι για διάφορους λόγους, μεταξύ των τα οποία προσπαθεί να χρησιμοποιήσετε ένα σωρό ότι η μνήμη μπορεί, στην πραγματικότητα, αργά τα πράγματα προς τα κάτω, επειδή δεν έχετε ωραία οφέλη από κάτι που ονομάζεται caching, όπου τα πράγματα που είναι κοντά μεταξύ τους στη μνήμη μπορεί να προσεγγιστεί συχνά πιο γρήγορα. Και μερικές φορές μπορείτε να καταλήξει σε μια πραγματικά καλή συνάρτηση κατακερματισμού. Ακόμα κι αν πρέπει να χάνουμε ένα κομμάτι της τη μνήμη, ίσως, πράγματι, να είναι σε θέση να βρείτε τα πράγματα γρήγορα και δεν τόσο άσχημα όσο γραμμικά. Έτσι, με λίγα λόγια, δεν υπήρχε κατ 'ανάγκην με οποιοδήποτε από αυτά ένα ή ακόμα και δύο συγκεκριμένα πράγματα που ψάχναμε. Πραγματικά τίποτα πειστική ως ανοδικοί και καθοδικοί γενικά έπεσε στην αντίληψή μας. ROB BOWDEN: Έτσι, για την άλλη πλευρά, κάναμε Δεν δέχονται από μόνη της "πιο γρήγορα." Εσείς Έπρεπε να πω κάτι γι 'αυτό. Ακόμα κι αν είπε θεωρητικά πιο γρήγορα, ξέραμε ότι το είδος κατανοητή ότι είναι 0 1. Και πίνακα κατακερματισμού, στη θεωρία, δεν είναι μηδέν 1. Η αναφορά τίποτα για το χρόνο εκτέλεσης γενικά έχεις τα σημεία. Αλλά "πιο γρήγορα," περισσότερες λύσεις στην το μεγάλο πλοίο που προσπαθεί ήταν αντικειμενικά πιο αργή από ό, τι λύσεις ότι υπήρχαν πίνακες κατακερματισμού. Έτσι ταχύτερη και αυτή η ίδια Δεν είναι αλήθεια. DAVID J. MALAN: Dom de dom dom. Είμαι ίσως ο μόνος που αντιλαμβάνεται αυτό είναι το πώς υποτίθεται πως να προφέρεται, σωστά; ROB BOWDEN: είχα πραγματικά καμία ιδέα. DAVID J. MALAN: Έκανε αίσθηση στο κεφάλι μου. ROB BOWDEN: Κάνω αυτό. OK. Έτσι, αυτό είναι το ένα, όπου θα έπρεπε να επιστήσει το διάγραμμα παρόμοιο με ίσως έχουν δει στο παρελθόν εξετάσεις. Οπότε ας δούμε αυτό. Έτσι, από τον κόμβο HTML, έχουμε δύο τα παιδιά, το κεφάλι και το σώμα. Γι 'αυτό και υποκατάστημα - το κεφάλι και το σώμα. Το κεφάλι έχει μια ετικέττα τίτλου. Έτσι έχουμε έναν τίτλο. Τώρα, το μόνο πράγμα που πολλοί άνθρωποι ξέχασα είναι ότι αυτές οι κόμβοι κειμένου είναι στοιχεία μέσα σε αυτό το δέντρο. Έτσι, εδώ έχουμε να τους συμβεί επιστήσει την ωοειδή για να τους διακρίνει από αυτά τύπους κόμβων. Αλλά προσέξτε, επίσης, εδώ έχουμε κορυφή, μέση και κάτω θα καταλήξει να είναι κόμβους κειμένου. Έτσι, ξεχνώντας εκείνα ήταν κάπως μιας κοινής λάθος. Το σώμα έχει τρία παιδιά - αυτά τα τρία divs. Έτσι div, div, div και στη συνέχεια το κείμενο παιδιά κόμβο αυτών των divs. Αυτό είναι λίγο πολύ αυτό για το ότι οι ερωτήσεις. DAVID J. MALAN: Και αξίζει να σημειωθεί, ακόμη και αν δεν κατοικεί σε αυτές λεπτομέρειες στο χρόνο που δαπανούν για JavaScript, ότι η διάταξη κάνει, σε Πράγματι, το θέμα τεχνικά. Έτσι, αν το κεφάλι έρχεται πριν από το σώμα στο HTML, τότε θα πρέπει να εμφανίζεται στην αριστερά του σώματος στην πραγματική DOM. Αυτό του είναι, σε γενικές γραμμές, απλά FYI, κάτι που ονομάζεται σειρά εγγράφων, όπου αυτό έχει σημασία. Και αν εφάρμοζαν ένα πρόγραμμα ανάλυσης, ένα πρόγραμμα που διαβάζει HTML στο κτίριο μέχρι το δέντρο στη μνήμη, για να είμαι ειλικρινής, ότι είναι διαισθητικά ίσως ό, τι κάνουμε έτσι κι αλλιώς - πάνω προς τα κάτω, αριστερά προς τα δεξιά. ROB BOWDEN: Ερωτήσεις σχετικά με αυτό; Πρέπει να κάνω το επόμενο; DAVID J. MALAN: Σίγουρα. ROB BOWDEN: OK. Έτσι, αυτή είναι η υπέρβαση του buffer ερώτηση επίθεση. Το κύριο πράγμα που πρέπει να αναγνωρίσουμε είναι εδώ, καλά, πώς θα μπορούσε ένα τέχνασμα αντίπαλος αυτό το πρόγραμμα σε εκτέλεση αυθαίρετου κώδικα; Έτσι argv1, η πρώτη γραμμή εντολών επιχείρημα σε αυτό το πρόγραμμα, που μπορεί να είναι αυθαίρετα καιρό. Αλλά εδώ είμαστε με memcpy να αντιγράψετε argv1, η οποία εδώ είναι το μπαρ. Είμαστε περνώντας ως επιχείρημα. Και γι 'αυτό παίρνει το όνομα bar. Έτσι είμαστε memcpying bar σε αυτό το buffer c. Πόσα bytes είμαστε αντιγραφή; Λοιπόν, ωστόσο ο αριθμός των bytes bar συμβαίνει σε να χρησιμοποιεί, το μήκος του εν λόγω επιχειρήματος. Αλλά c είναι μόνο 12 bytes μεγάλη. Έτσι, αν πληκτρολογήσετε ένα όρισμα γραμμής εντολών που είναι περισσότερο από 12 bytes, είμαστε πρόκειται να ξεχειλίσει αυτό συγκεκριμένο ρυθμιστικό. Τώρα, πώς θα μπορούσαν να ξεγελάσουν ένας αντίπαλος ο το πρόγραμμα σε εκτέλεση αυθαίρετου κώδικα; Έτσι, να θυμάστε ότι εδώ κύρια καλεί foo. Και έτσι στη συνέχεια κύρια κλήσεις foo. Ας συντάξει αυτό. Έτσι έχουμε stack μας. Και κύρια έχει ένα πλαίσιο στοίβας στο κάτω μέρος. Σε κάποιο σημείο, ο κυρίως κλήσεις foo. Λοιπόν, αμέσως, κύρια κλήσεις foo. Και έτσι foo παίρνει το δικό του πλαίσιο stack του. Τώρα, σε κάποιο σημείο, foo πρόκειται να επιστρέψει. Και πήγε επιστρέφει foo, θα πρέπει να γνωρίζει σε ποια γραμμή κώδικα στο εσωτερικό του κύριου μας ήταν έτσι ώστε να γνωρίζουν πού θα πρέπει να επαναληφθούν σε κύρια. Μπορούμε να καλέσετε foo από το σύνολο πολλά και διάφορα μέρη. Πώς ξέρουμε πού να επιστρέψει; Λοιπόν, θα πρέπει να αποθηκεύσετε αυτό το κάπου. Έτσι, κάπου εδώ γύρω, αποθηκεύουμε όπου θα πρέπει να επιστρέψει σε μια φορά επιστρέφει foo. Και αυτή είναι η διεύθυνση του αποστολέα. Πώς, λοιπόν, ένας αντίπαλος μπορεί να επωφεληθούν αυτού είναι το γεγονός ότι αυτό το ρυθμιστικό γ αποθηκεύεται, ας πω, εδώ είναι c. Έτσι έχουμε 12 bytes για το γ. Αυτό είναι c. Και αυτό είναι το δαχτυλίδι στοίβα foo του. Έτσι, αν ο κακόβουλος χρήστης εισάγει περισσότερα bytes από 12 ή εισάγετε μια εντολή όρισμα της γραμμής που είναι περισσότερο από 12 χαρακτήρες, τότε θα πάμε να ξεχειλίζουν από αυτό το ρυθμιστικό. Μπορούμε να συνεχίσουμε. Και σε κάποιο σημείο, θα πάει μακριά αρκεί να ξεκινήσουμε αντικατάσταση αυτή τη διεύθυνση επιστροφής. Έτσι, τη στιγμή που θα αντικαταστήσει τη διεύθυνση επιστροφής, αυτό σημαίνει ότι όταν foo επιστρέφει, γυρίζουμε όπου η κακόβουλος χρήστης είναι αυτό που λέει να με ό, τι αξία που τέθηκε, με όποια χαρακτήρων, ο χρήστης εισάγει. Και έτσι, αν ο κακόβουλος χρήστης είναι να ιδιαίτερα έξυπνος, μπορεί να έχει αυτό το επιστροφή στο κάπου στο printDef λειτουργία ή κάπου στο malloc λειτουργία, ακριβώς οπουδήποτε αυθαίρετη. Αλλά ακόμη πιο έξυπνο είναι ό, τι και αν έχει ο χρήστης επιστρέψει προς τα δεξιά εδώ. Και τότε θα αρχίσει η εκτέλεση αυτές οι γραμμές κώδικα. Έτσι, σε εκείνο το σημείο, ο χρήστης μπορεί να εισέλθει ό, τι θέλει σε αυτή την περιοχή. Και ο ίδιος έχει τον πλήρη έλεγχο πάνω από το πρόγραμμά σας. Ερωτήσεις σχετικά με αυτό; Έτσι, η επόμενη ερώτηση είναι πλήρης, η επαναϋλοποίηση foo με τέτοιο τρόπο ότι δεν είναι πλέον ευάλωτος. Έτσι, υπάρχει μια-δυο τρόπους θα μπορούσατε να έχετε κάνει αυτό. Έχουμε ακόμα γ μόνο είναι μήκους 12. Θα μπορούσε να αλλάξει αυτή ως μέρος της λύσης σας. Προσθέσαμε επίσης έναν έλεγχο για να βέβαιος μπαρ δεν ήταν μηδενική. Αν και δεν χρειάζεται ότι, για την πλήρη πίστωση. Έτσι είμαστε έλεγχο για πρώτη φορά το μήκος του νήματος του μπαρ. Εάν είναι μεγαλύτερη από 12, τότε στην πραγματικότητα δεν κάνουν το αντίγραφο. Έτσι, αυτό είναι ένας τρόπος για τον καθορισμό αυτό. Ένας άλλος τρόπος για τον καθορισμό αυτό είναι, αντί να έχοντας γ είναι μόνο μήκους 12, το έχουν είναι μήκους strlen (bar). Ένας άλλος τρόπος για τον καθορισμό είναι πραγματικά μόλις επιστρέψει. Έτσι, αν είχε μόλις πάρει απαλλαγούμε από όλα αυτό, αν έχετε μόλις είχε διαγράψει όλα γραμμές κώδικα, που θα έχουν πάρει πλήρη πίστωση, δεδομένου ότι αυτή η λειτουργία δεν καταφέρει τίποτα στην πραγματικότητα. Είναι αντιγραφή από τη γραμμή εντολών επιχείρημα σε κάποια σειρά στην τοπικό πλαίσιο stack του. Και τότε το πράγμα επιστρέφει. Και ανεξάρτητα από το καταφέρει έχει φύγει. Έτσι απόδοση ήταν επίσης ένα επαρκές τρόπος για να πάρει πλήρη πίστωση. DAVID J. MALAN: Όχι ακριβώς το πνεύμα της το ερώτημα, αλλά αποδεκτή ανά την spec παρ 'όλα αυτά. ROB BOWDEN: Ερωτήσεις σχετικά με οποιοδήποτε από αυτό; Το ένα πράγμα που μπορείτε τουλάχιστον χρειαζόταν να έχουν την κατάρτιση κώδικα. Έτσι ακόμα κι αν τεχνικά δεν είναι ευάλωτες εάν ο κώδικάς σας δεν μεταγλώττιση, εμείς δεν το δέχομαι αυτό. Δεν υπάρχουν ερωτήσεις; OK. DAVID J. MALAN: Θέλετε να πω αυτόν τον τίτλο; ROB BOWDEN: Όχι. DAVID J. MALAN: Έτσι, σε αυτό το ένα, αυτό ήταν είτε καλή ή κακή είδηση. Αυτό είναι κυριολεκτικά το ίδιο πρόβλημα ως το πρώτο κουίζ. Και είναι σχεδόν το ίδιο πρόβλημα, όπως pset1. Αλλά ήταν απλοποιηθεί σκοπίμως ούτως ώστε να μια απλούστερη πυραμίδα, ένα που μπορεί να είναι λυθεί με μια ελαφρώς απλούστερη επανάληψη. Και πραγματικά, τι είχαμε πάρει σε εδώ δεν ήταν τόσο η λογική, επειδή ίσως, από αυτό το σημείο, είστε πιο άνετα από ό, τι ήταν σε μία εβδομάδα με για βρόχους ή γιατί βρόχους, αλλά πραγματικά να δώσουμε έμφαση, εκτός ότι είστε λίγο άνετα με το αντίληψη ότι η PHP δεν είναι μόνο για το τι προγραμματισμού. Μπορεί πράγματι να χρησιμοποιηθεί ως γλώσσα να γράψει τα προγράμματα της γραμμής εντολών. Και πράγματι, αυτό είναι αυτό που προσπαθούσαμε να επιστήσω την προσοχή σας. Αυτό είναι ένα πρόγραμμα γραμμής εντολών PHP. Έτσι κώδικα C εδώ, ενώ η σωστή σε C, δεν είναι σωστή για την PHP. Αλλά ο κώδικας είναι πραγματικά η ίδια. Αν συγκρίνει κανείς τις λύσεις για Quiz 0 κατά Quiz 1, θα διαπιστώσετε ότι είναι σχεδόν πανομοιότυπες, με εξαίρεση μερικά σημάδια δολαρίων και για το απουσία ενός τύπου δεδομένων. Συγκεκριμένα, αν ρίξουμε μια ματιά εδώ, θα δείτε ότι έχουμε επαναλάβει, σε αυτό το περίπτωση, από την 1η έως έως 7. Θα μπορούσαμε να είχαμε κάνει το 0 index. Αλλά μερικές φορές, νομίζω ότι είναι ακριβώς διανοητικά πιο εύκολο να σκεφτούμε τα πράγματα από 1 έως 7. Αν θέλετε ένα τετράγωνο, τότε δύο μπλοκ, τότε τρία, τότε τελεία, τελεία, τελεία επτά. Έχουμε ι που με αρχική τιμή 1 και στη συνέχεια να βασίζομαι σε έως i. Και είναι όλα εδώ άλλα πανομοιότυπη. Αλλά αξίζει να σημειωθεί είναι μερικά πράγματα. Σας δίνουμε αυτές τις δύο γραμμές, αυτή η πρώτη ένα, goofily ονομάστηκε ως δουλεία για την απότομη έκρηξη. Και αυτό καθορίζει μόνο τη διαδρομή, η φάκελο, στον οποίο ένα πρόγραμμα μπορεί να είναι διαπίστωσε ότι θέλετε να χρησιμοποιήσετε να ερμηνεύσει αυτό το αρχείο. Και τότε η γραμμή μετά από αυτό, του Φυσικά, σημαίνει είσοδο στη λειτουργία PHP. Και η γραμμή στο κάτω μέρος σημαίνει τη λειτουργία εξόδου PHP. Και αυτό λειτουργεί, γενικά, με ερμηνευμένες γλώσσες. Είναι ενοχλητικό είδος της, αν γράφετε πρόγραμμα σε ένα αρχείο που ονομάζεται foo.php. Και τότε οι χρήστες σας έχουν ακριβώς θυμηθείτε, OK, για να εκτελέσετε αυτό το πρόγραμμα, θα πρέπει να πληκτρολογήσετε "χώρο php foo.php." Είδος ενοχλητικό αν μη τι άλλο. Και αποκαλύπτει επίσης ότι το πρόγραμμά σας Είναι γραμμένο σε PHP, η οποία δεν είναι όλα ότι φωτισμού για το χρήστη. Έτσι, μπορείτε να αφαιρέσετε το. Php συνολικά θυμάστε από την διάλεξη. Και μπορείτε να το κάνετε πραγματικά. / Foo, αν έχετε chmodded καθιστώντας εκτελέσιμο. Έτσι chmod a + x foo θα το έκανε αυτό. Και αν μπορείτε επίσης να προσθέσετε την δουλεία εδώ. Αλλά πραγματικά, το πρόβλημα ήταν να πάρει σε εκτύπωση κάτι σαν αυτό. Όχι HTML, δεν C-code βεβαίως, μόνο μερικά PHP. Έτσι Milo στη συνέχεια επέστρεψε στο πρόβλημα 25. Και στο 25, θα ήταν και οι ακόλουθοι σκελετός κώδικα, το οποίο ήταν ένα αρκετά απλή ιστοσελίδα. Και το ζουμερό μέρος HTML-σοφός ήταν κάτω εδώ, όπου έχουμε εσωτερικό του σώματος μια μορφή που έχει μοναδικό αναγνωριστικό των εισροών εσωτερικό του οποίου ήταν δύο εισόδους, μία με μια ιδέα του ονόματος, ένα με μια ιδέα του κουμπιού. Ο πρώτος ήταν είδος κειμένου, η δεύτερη του τύπου υποβάλλουν. Και γι 'αυτό σας έδωσε, στην πραγματικότητα, περισσότερο συστατικά από ό, τι χρειάζεται, ακριβώς έτσι εσείς είχε επιλογές με τις οποίες να λύσει αυτό το πρόβλημα. Δεν χρειάζεται απολύτως όλες αυτές τις ταυτότητες. Αλλά σας επιτρέπει να λύσουν αυτό με διαφορετικούς τρόπους. Και στην κορυφή, παρατηρούμε ότι ο στόχος ήταν να προκαλέσει ένα παράθυρο σαν αυτό - Γεια σας, Milo! - να εμφανιστεί στο πρόγραμμα περιήγησης χρησιμοποιώντας το σούπερ απλό, αν Δεν άσχημο, λειτουργία ειδοποίησης. Και έτσι, τελικά, αυτό βράζει κάτω εννοιολογικά με κάποιο τρόπο να ακούτε για ισχυρισμούς της μορφής client-side , Όχι ο server-side, με κάποιο τρόπο ανταποκρινόμενα στις εν λόγω υποβολή από αρπάζοντας την τιμή που ο χρήστης πληκτρολογήσει μέσα στο πεδίο Όνομα, και στη συνέχεια δείτε αυτό στο σώμα ενός συναγερμού. Έτσι, ένας τρόπος που μπορείτε να το κάνετε αυτό είναι με jQuery, το οποίο μοιάζει λίγο συντακτικά περίπλοκο στην αρχή. Μπορείτε να το κάνετε αυτό με καθαρό κώδικα DOM - document.getelement με ID. Αλλά ας ρίξουμε μια ματιά σε αυτή την έκδοση. Έχω ένα ζευγάρι των σημαντικών γραμμές πρώτα. Έτσι, το ένα, έχουμε αυτή τη γραμμή, η οποία είναι πανομοιότυπο με αυτό που μπορεί να έχετε δει σε, πιστεύω, form2.html από την τάξη στην εβδομάδα 9. Και αυτό ακριβώς λέει, να εκτελέσει ο κώδικας που ακολουθεί, όταν το έγγραφο είναι έτοιμο. Αυτό είναι σημαντικό μόνο και μόνο επειδή Οι σελίδες HTML διαβάζονται από πάνω προς τα κάτω, αριστερά προς τα δεξιά. Και ως εκ τούτου, αν προσπαθήσετε να κάνετε κάτι στον κώδικα εδώ σε κάποιο DOM στοιχείο, κάποια ετικέτα HTML, που είναι κάτω εδώ, το κάνετε πάρα πολύ σύντομα, γιατί αυτό δεν έχει ακόμη έχουν διαβάσει στη μνήμη. Έτσι, λέγοντας αυτό document.ready γραμμή, λέμε, εδώ είναι μερικά κωδικό, το πρόγραμμα περιήγησης. Αλλά μην εκτελέσει αυτό μέχρι το σύνολο το έγγραφο είναι έτοιμο, αυτό είναι το DOM δέντρο υπάρχει στη μνήμη. Αυτό είναι ένα λίγο πιο απλή, αν ένας συντακτικά λίγο διαφορετική, όπου λέω, πιάσε το στοιχείο HTML των οποίων η μοναδική αναγνωριστικό είναι εισόδους. Αυτό είναι ό, τι το hash ετικέτα δηλώνει, το μοναδικό αναγνωριστικό. Και τότε είμαι καλώντας. Υποβάλετε. Έτσι. Υποβάλει εδώ είναι μια λειτουργία, διαφορετικά γνωστή ως μέθοδος, που είναι στο εσωτερικό του αντικειμένου για την αριστερά πλευρά εκεί που δεν είχα τονίσει. Έτσι, αν νομίζετε των εισροών ως αντικείμενο στη μνήμη - και πράγματι είναι. Είναι ένας κόμβος σε ένα δέντρο - . Υποβάλουν μέσα, όταν αυτή η μορφή με αυτό το αναγνωριστικό υποβάλλεται, εκτελέστε τον παρακάτω κώδικα. Δεν με νοιάζει ό, τι το όνομα του λειτουργία είναι ότι είμαι εκτέλεσης. Έτσι, εδώ είμαι με τη χρήση, όπως και πριν, τι είναι ονομάζεται συνάρτηση λάμδα ή μία ανώνυμη συνάρτηση. Δεν είναι καθόλου διανοητικά ενδιαφέρον, εκτός από αυτό δεν έχει όνομα, το οποίο είναι καλό, αν είστε μόνο πρόκειται ποτέ να το ονομάσουμε μια φορά. Και μέσα εκεί εγώ πραγματικά να χειριστεί η υποβολή της φόρμας. Θέλω πρώτα να δηλώσει μια μεταβλητή ονομάζεται αξία. Και στη συνέχεια ποια είναι η επίδραση αυτής της επισημασμένο μέρος εδώ τώρα; Τι σημαίνει ότι το κάνουμε σε ένα υψηλού επιπέδου για μένα; ΚΟΙΝΟ: Παίρνει την αξία που η χρήστης δεν έκανε την παρακάτω HTML. Παίρνει ότι η ταυτότητα και, στη συνέχεια, βρίσκει την αξία του. DAVID J. MALAN: Ακριβώς. Είναι αρπάζει τον κόμβο, του οποίου η μοναδική αναγνωριστικό είναι το όνομα. Παίρνει την τιμή σ 'αυτήν, η οποία είναι, προφανώς, αυτό που ο χρήστης τον εαυτό πληκτρολογήσει. Και στη συνέχεια αποθηκεύει ότι η μεταβλητή που ονομάζεται αξία. Παρεμπιπτόντως, θα μπορούσε επίσης να έχει κάνει αυτό λίγο διαφορετικά. Απόλυτα αποδεκτό κάνοντας κάτι αξία ψέμα var παίρνει document.getElementById. Και γι 'αυτό είναι λίγο κουραστικό να μην χρησιμοποιούν jQuery. "Name". Αξία. Έτσι, απολύτως αποδεκτή. Διαφορετικοί τρόποι να γίνει αυτό. jQuery μόνο τείνει να είναι λίγο πιο συνοπτική και σίγουρα πιο δημοφιλή ανάμεσα στους προγραμματιστές. Τώρα, κάνω ένα κομμάτι της λογικής ελέγξετε, γιατί το πρόβλημα Δήλωση είπαμε ρητά, εάν η χρήστης δεν έχει πληκτρολογήσει του ή της όνομα, δεν εμφανίζουν ειδοποιήσεις. Αλλά μπορείτε να ελέγξετε για αυτό, από μόνο έλεγχο για την κενή συμβολοσειρά για μια quote-unquote αν υπάρχει τίποτα στην πραγματικότητα. Αλλά αν δεν είναι ίσο με το απόσπασμα-unquote, Θέλω να καλέσω ειδοποιήσεις. Και το ενδιαφέρον εδώ είναι ότι είμαστε με τον τελεστή συν, το οποίο κάνει ό, τι σε JavaScript; Ενώσετε. Έτσι είναι σαν phps τελεστή τελεία. Ίδια ιδέα, ελαφρώς διαφορετική σύνταξη. Και είμαι απλά δημιουργώντας το string που είδατε στην οθόνη shot - Γεια σας, έτσι και έτσι. Και στη συνέχεια η τελευταία λεπτομέρεια είναι αυτό. Γιατί μπορώ να επιστρέψει false μέσα αυτής ανώνυμη συνάρτηση; ΚΟΙΝΟ: Δεν υπάρχει καμία αξία. Μπορείτε να το βάλετε σε μορφή. Λέει απλά, αν η αξία δεν είναι ίση με το κενό, τότε το κάνει. Υπήρχε ένα κενό στην εν λόγω δήλωση. DAVID J. MALAN: OK. Προσοχή όμως. Δεν υπάρχει κανείς άλλος εδώ. Και αυτό ανακριβούς δήλωσης είναι έξω από το εάν οι συνθήκες. Έτσι, αυτό επισημασμένη γραμμή, επιστρέφει false, εκτελεί δεν το θέμα αυτό, όταν την υποβολή της φόρμας. Τι σημαίνει επιστροφή ψευδείς μέσα σ 'αυτό χειρισμού συμβάντων, όπως λέγεται, το εν λόγω συμβάν είναι υποβολής; ΚΟΙΝΟ: Επειδή συμβαίνει μόνο μία φορά. DAVID J. MALAN: συμβαίνει μόνο μία φορά. Δεν είναι αρκετά. Ναι; ΚΟΙΝΟ: Αποτρέπει τη φόρμα από την υποβολή στην προεπιλεγμένη συμπεριφορά, η οποία θα κάνει το reload τη σελίδα. DAVID J. MALAN: Ακριβώς. Έτσι είμαι υπερφόρτωση ο όρος υποβάλει εδώ, γιατί λέω, η μορφή είναι που υποβάλλονται. Αλλά, όπως σας προτείνω, στην πραγματικότητα δεν είναι έχουν υποβληθεί στο αληθινό τρόπο HTTP. Όταν κάνετε κλικ στο κουμπί Υποβολή, λόγω της μας onsubmit χειριστή, είμαστε παρακολουθούν ότι η υποβολή της φόρμας, ώστε να μιλήσουν. Είμαστε στη συνέχεια να κάνει το πράγμα μας με τον κώδικα JavaScript. Αλλά είμαι σκόπιμα επιστροφή ψευδείς, γιατί ό, τι δεν θέλω να συμβεί ένα κλάσμα του δευτερολέπτου αργότερα, είναι για το σύνολο του μορφή η ίδια να υποβληθεί στο διαδίκτυο server με βασικά ζευγάρια αξίας με την αλλαγή η διεύθυνση URL να είναι κάτι σαν q = γάτες ή ό, τι κάναμε, για παράδειγμα, στην τάξη. Δεν θέλω να συμβεί αυτό, γιατί δεν υπάρχει ακρόαση διακομιστή για αυτό αποτελούν την υποβολή. Είναι καθαρά γίνει στον κώδικα JavaScript. Και αυτός είναι ο λόγος για τον οποίο δεν είχα καν μια δράση αποδίδουν στη φόρμα μου, γιατί δεν προτίθενται για αυτό να ποτέ να πάτε στο διακομιστή. Έτσι, αυτό είναι που υποβάλλονται. Αλλά είμαστε παρακολουθούν το εν λόγω έντυπο την υποβολή και την πρόληψη της αθέτησης συμπεριφορά, η οποία είναι πραγματικά πάνε όλα το δρόμο στο διακομιστή. ΚΟΙΝΟ: Έτσι, κρατώντας το client-side. DAVID J. MALAN: Κρατώντας το client-side. Ακριβώς δεξιά. Έπειτα επάνω ήταν μου oh MySQL. ROB BOWDEN: OK. Έτσι, αυτό το πρώτο ερώτημα ήταν γενικά τραχύ για τους ανθρώπους. Αν και οι μεταγενέστερες πήγε καλύτερα. Έτσι θα έπρεπε να επιλέξουν τα σωστά δεδομένα τύπων για δύο από αυτές τις στήλες. Και τα δύο από αυτά έχουν κάποια τα πράγματα γι 'αυτούς που κάνουν την επιλογή δύσκολη. Έτσι int δεν είναι έγκυρη πληκτρολογήστε τον αριθμό. Ο λόγος είναι ένα 12-ψήφιο λογαριασμό αριθμός, ένας int δεν είναι αρκετά μεγάλη για να αποθηκεύσετε συνολικά ψηφία. Έτσι, μια έγκυρη επιλογή θα ήταν μια μεγάλη int, αν τυχαίνει να γνωρίζω αυτό. Μια άλλη επιλογή θα μπορούσε να έχει ένα πεδίο char μήκους 12. Έτσι, είτε από εκείνους που θα έχουν εργαστεί. Int δεν θα. Τώρα, την ισορροπία, σκεφτείτε ότι πίσω σε pset7. Γι 'αυτό και χρησιμοποιείται ειδικά δεκαδικών αποθηκεύει την τιμή των μετοχών ή - DAVID J. MALAN: Μετρητά. ROB BOWDEN: Μετρητά. Χρησιμοποιήσαμε δεκαδικά για να αποθηκεύσετε το ποσό των μετρητών που ο χρήστης έχει σήμερα. Έτσι, ο λόγος που το κάνουμε αυτό είναι γιατί, θυμηθείτε, επιπλέει. Υπάρχει κινητής υποδιαστολής στην ακρίβεια. Δεν μπορεί να αποθηκεύσει ακριβώς τα μετρητά αξίες όπως θέλουμε εδώ. Έτσι δεκαδικό είναι σε θέση να ακριβώς κατάστημα κάτι, ας πούμε, με δύο δεκαδικά ψηφία. Γι 'αυτό την ισορροπία, θέλουμε να είναι σε δεκαδικό σύστημα και να μην επιπλέουν. DAVID J. MALAN: Και επίσης, πάρα πολύ, αν θα μπορούσε να είναι έξυπνος και σε άλλες πλαίσια για να σκεφτεί, ίσως αυτό Είναι μια ευκαιρία για έναν int. Θα συνεχίσω να παρακολουθείτε πένες. Επειδή δείξαμε ρητά την προεπιλεγμένη αξία είναι 100,00, ότι σημαίνει ότι θα μπορούσε απλώς να είναι μια int. Και ένα άλλο πολύ λεπτότητα με τον αριθμό ήταν ότι δεν ήταν γραφτό να είναι μια ερώτηση παγίδα. Αλλά υπενθυμίζουν ότι ένας int σε MySQL, όπως σε C, τουλάχιστον στην συσκευής, είναι 32-bit. Και ακόμα κι αν δεν μπορείτε να περιμένετε να ξέρετε ακριβώς πόσα ψηφία που μέσα, θυμάμαι ότι ο μεγαλύτερος αριθμός μπορείτε να εκπροσωπεί δυνητικά με αριθμό 32-bit είναι περίπου αυτό; Τι αριθμό δεν λέμε πάντα; 2 έως το 32, το οποίο είναι αυτό περίπου; Δεν χρειάζεται να γνωρίζουν με ακρίβεια. Αλλά χονδρικά είναι χρήσιμη στη ζωή. Είναι περίπου 4 δισ. ευρώ. Έτσι, έχουμε πει ότι μερικές φορές. Ξέρω ότι έχω πει ότι μερικές φορές. Και είναι περίπου 4 δισ. ευρώ. Και αυτό είναι ένας καλός κανόνας του αντίχειρα να γνωρίζουν. Αν έχετε 8 bits, 256 είναι ο μαγικός αριθμός. Αν έχετε 32 bits, 4 δις ή να δώσει. Έτσι, αν απλά γράψετε 4 δισ. ευρώ, θα δείτε ότι είναι λιγότερα ψηφία από 12, το οποίο σημαίνει ότι δεν είναι σαφώς αρκετή εκφραστικότητα για να συλλάβει ένα 12-ψήφιο αριθμό λογαριασμού. ROB BOWDEN: OK. Έτσι, οι υπόλοιπες πήγαν καλύτερα. Έτσι, ας υποθέσουμε ότι η τράπεζα επιβάλλει $ 20 μηνιαίες τέλος συντήρησης σε όλους τους λογαριασμούς. Με ποιο ερώτημα SQL θα μπορούσε η τράπεζα αφαιρούμε $ 20 από την κάθε μέτρηση, ακόμη και αν αυτό οδηγεί σε κάποια αρνητικά υπόλοιπα; Έτσι, βασικά, υπάρχουν τέσσερις κύριοι τύποι των ερωτήσεων - εισάγετε, επιλέξτε, ενημέρωση και διαγραφή. Έτσι, αυτό που νομίζουμε ότι είμαστε πρόκειται να χρησιμοποιήσετε εδώ; Ενημέρωση. Έτσι, ας ρίξουμε μια ματιά. Έτσι, εδώ είμαστε ενημέρωση. Τι πίνακα είμαστε ενημέρωση των λογαριασμών; Έτσι, την ενημέρωση των λογαριασμών. Και τότε η σύνταξη, λέει, τι στους λογαριασμούς είμαστε ενημέρωση; Λοιπόν, είμαστε ρύθμιση ισορροπίας ίση με το τρέχουσα αξία της ισορροπίας μείον 20. Έτσι, αυτό θα ενημερώσει όλες τις γραμμές των λογαριασμών, αφαιρώντας $ 20 από το υπόλοιπο. DAVID J. MALAN: Ένα κοινό λάθος εδώ, ακόμα κι αν μερικές φορές συγχώρεσε, ήταν να έχουν πραγματικά PHP κώδικα εδώ καλώντας το ερώτημα λειτουργία ή τη θέση εισαγωγικά γύρω από ό, τι απαιτεί δεν πρέπει να είναι εκεί. ROB BOWDEN: Να θυμάστε ότι η MySQL είναι μια ξεχωριστή γλώσσα από την PHP. Εμείς τυχαίνει να γράφει MySQL σε PHP. Και PHP είναι τότε αποστολή πάνω στο διακομιστή MySQL. Αλλά δεν χρειάζεται PHP, προκειμένου να επικοινωνεί με το διακομιστή MySQL. DAVID J. MALAN: Ακριβώς. Έτσι, δεν έχει μεταβλητές με το σύμβολο του δολαρίου θα πρέπει να είναι σε αυτό το πλαίσιο. Μπορεί να κάνει ακριβώς όλα τα μαθηματικά εντός της ίδιας της βάσης δεδομένων. ROB BOWDEN: OK. Έτσι ώστε το επόμενο. Είναι αυτό το επόμενο; Ναι. Έτσι, με ό, τι SQL ερώτημα θα μπορούσε η τράπεζα ανακτήσετε τους αριθμούς των λογαριασμών του της πλουσιότερες πελάτες, τα άτομα με υπόλοιπα μεγαλύτερες από 1000; Έτσι, ποια από τις τέσσερις βασικούς τύπους θα πάμε να θέλουν εδώ; Επιλέξτε. Έτσι, θέλουμε να επιλέξετε. Τι θέλουμε να επιλέξετε; Τι στήλη θέλουμε να επιλέξετε; Θα ήθελα συγκεκριμένα για να επιλέξετε τον αριθμό. Αλλά αν το εν λόγω αστέρι, εμείς Επίσης, δέχθηκε ότι. Έτσι, επιλέξτε τον αριθμό από ό, τι το τραπέζι; Λογαριασμοί. Και τότε η κατάσταση που θέλουμε; Όπου ισορροπίας μεγαλύτερη από 1000. Έχουμε επίσης αναλάβει μεγαλύτερη ή ίση. Τελευταία ένα. Με ποιο ερώτημα SQL θα μπορούσε η τράπεζα κοντά, δηλαδή, διαγράφει κάθε λογαριασμό που έχει μια ισορροπία των $ 0; Έτσι, ποιο από τα τέσσερα είμαστε πρόκειται να θέλετε να χρησιμοποιήσετε; Διαγραφή. Έτσι, η σύνταξη γι 'αυτό; Διαγραφή από το ποιο τραπέζι; Λογαριασμοί. Και στη συνέχεια η κατάσταση στην οποία θέλουμε να διαγράψετε - όπου ισορροπία ισούται με το μηδέν. Έτσι διαγράψετε όλες τις σειρές από τους λογαριασμούς όπου το υπόλοιπο είναι μηδέν. Ερωτήσεις σχετικά με κάποιο από αυτά; Θέλετε να περιμένουν στην ουρά; DAVID J. MALAN: Οδηγός Queue. Έτσι, σε αυτό το ένα, σας δώσαμε μια κάπως γνωστή δομή που να διερευνηθούν bit στην τάξη μαζί του structs, που ήταν ένα δεδομένο που σχετίζονται με το πνεύμα δομή. Η διαφορά όμως με μια ουρά είναι ότι θα έπρεπε να θυμόμαστε κάποιο τρόπο ο οποίος ήταν στο μπροστινό μέρος της ουράς, σε μεγάλο μέρος, έτσι ώστε θα μπορούσαμε να κάνουμε περισσότερα αποδοτική χρήση της μνήμης, τουλάχιστον αν χρησιμοποιούσαμε μια σειρά. Επειδή η ανάκληση, αν έχουμε έναν πίνακα, εάν, για παράδειγμα, αυτή είναι η πρόσοψη η ουρά, αν έχω μπει στην ουρά εδώ, και στη συνέχεια κάποιος παίρνει σε γραμμή πίσω μου, πίσω μου, πίσω μου, και ένα άτομο βήματα από τη γραμμή, θα θα μπορούσε, όπως είδαμε κάποιες από τις ανθρώπινες μας εθελοντές στην τάξη, έχει ο καθένας μετατόπιση με αυτόν τον τρόπο. Αλλά σε γενικές γραμμές, αφού ο καθένας κάνει κάτι που δεν είναι η καλύτερη χρήση του χρόνου σε ένα πρόγραμμα, γιατί αυτό σημαίνει ότι σας αλγόριθμος τρέχει σε ό, τι ασυμπτωτική χρόνο λειτουργίας; Είναι γραμμική. Και νιώθω σαν αυτό είναι χαζό. Εάν το επόμενο πρόσωπο στη σειρά είναι η επόμενη πρόσωπο που υποτίθεται ότι θα πάει σε το κατάστημα, δεν έχουν όλα να προχωρήσουμε μαζί. Απλά αφήστε το άτομο να αποπτέρωση off όταν έρθει η ώρα, για παράδειγμα. Έτσι, μπορούμε να εξοικονομήσουμε λίγο χρόνο εκεί. Και έτσι για να το κάνουμε αυτό όμως, ότι μέσα ότι η κεφαλή της ουράς ή η μπροστά από την ουρά πρόκειται να σταδιακά κινούνται όλο και βαθύτερα στη συστοιχία και τελικά θα μπορούσε πραγματικά τυλίξτε γύρω εάν είμαστε χρησιμοποιώντας ένα πίνακα για να αποθηκεύσετε το λαό σε αυτήν την ουρά. Έτσι, μπορείτε σχεδόν να σκεφτείτε το πίνακα ως ένα κυκλικό δεδομένων δομή με αυτή την έννοια. Έτσι κατά κάποιο τρόπο πρέπει να παρακολουθείτε το μέγεθός της ή πραγματικά το τέλος της και στη συνέχεια, όταν η αρχή του είναι. Γι 'αυτό προτείνουμε να δηλώσουν μία τέτοια ουρά, καλώντας το q, μόνο ένα γράμμα. Στη συνέχεια, προτείνουμε ότι το μέτωπο είναι αρχικοποιείται σε μηδέν και ότι το μέγεθος να προετοιμαστεί με μηδέν. Έτσι, αυτή τη στιγμή, δεν υπάρχει τίποτα εσωτερικό της εν λόγω ουράς. Και σας ζητάμε να ολοκληρώσετε την εφαρμογή του enqueue παρακάτω στο κατά τέτοιο τρόπο ώστε η συνάρτηση προσθέτει n έως το τέλος του q και, στη συνέχεια, επιστρέφει true. Αλλά εάν το q είναι πλήρης ή αρνητική, ο λειτουργία θα πρέπει αντ 'αυτού να επιστρέψει false. Και σας έδωσε ένα ζευγάρι των υποθέσεων. Αλλά δεν είναι πραγματικά λειτουργικά περίπτωση, υπάρχει μόνο ότι bool, επειδή, από τεχνική άποψη, δεν bool υπάρχουν σε C εκτός και αν περιλαμβάνουν συγκεκριμένο αρχείο κεφαλίδας. Έτσι ώστε ήταν απλά βεβαιωθείτε ότι υπάρχει ήταν δεν είναι αυτό ένα τέχνασμα ζήτημα το είδος του πράγματος. Έτσι enqueue, προτείναμε στο δείγμα λύσεις για την εφαρμογή ως ακολούθως. Ένα, θα ελέγχει πρώτα την ευκολία, τα χαμηλός-κρεμώντας φρούτα. Αν η ουρά είναι πλήρης ή ο αριθμός που προσπαθείτε να εισαγάγετε είναι λιγότερο από το μηδέν, το οποίο είπαμε στην προδιαγραφή του προβλήματος θα πρέπει να δεν πρέπει να επιτρέπεται, διότι θέλουμε μόνο μη αρνητικές τιμές, τότε θα πρέπει να μόλις επιστρέψει false αμέσως. Έτσι, κάποια σχετικά εύκολο σφάλμα ελέγχου. Αν όμως θέλετε να προσθέσετε αυτό το πραγματικό τον αριθμό, θα έπρεπε να κάνει ένα κομμάτι της Αναφέρομαι εδώ. Και αυτό είναι όπου είναι λίγο ενοχλητικό διανοητικά, γιατί πρέπει να καταλάβω πώς να χειριστεί περιτύλιξης. Αλλά το μικρόβιο της ιδέας εδώ ότι είναι από ενδιαφέρον για εμάς είναι ότι περιτύλιξης συνεπάγεται συχνά modular αριθμητική και το mod φορέα, από την πλευρά τοις εκατό, όπου μπορείτε να πάτε από μια μεγαλύτερη αξία πίσω στο μηδέν και στη συνέχεια, ένα και δύο και τρεις και στη συνέχεια πίσω γύρω στο μηδέν, ένα και δύο και τρία και ούτω καθεξής ξανά και ξανά. Έτσι, ο τρόπος που προτείνουμε να γίνει αυτό είναι ότι θέλουμε να το δείκτη σε array ονομάζεται αριθμών, όταν ακέραιοι μας βρίσκονται. Αλλά για να φτάσουμε εκεί, πρώτα θέλουμε να κάνουμε ανεξάρτητα από το μέγεθος της ουράς αναμονής είναι όμως στη συνέχεια, προσθέστε σε αυτό ανεξάρτητα από το μπροστά από τη λίστα είναι. Και το αποτέλεσμα αυτού είναι να μας βάλει σε η σωστή θέση στην ουρά και να υποθέσω ότι το πρώτο πρόσωπο στη γραμμή είναι στην αρχή, το οποίο ο ίδιος ή που θα μπορούσε να είναι απολύτως αν Επίσης μετατόπιση όλους. Αλλά είμαστε απλά δημιουργώντας το έργο για τους εαυτούς μας αν παίρναμε ότι η συγκεκριμένη διαδρομή. Έτσι μπορούμε να το κρατήσει σχετικά απλή. Οφείλουμε να θυμόμαστε ότι μόνο προστίθεται ένα int στην ουρά. Και τότε θα επιστρέψουν μόλις αλήθεια. Εν τω μεταξύ, σε dequeue, ζητήσαμε μπορείτε να κάνετε τα εξής. Το εφαρμόσει κατά τέτοιο τρόπο ώστε να dequeues, δηλαδή αφαιρεί και επιστρέφει, το int στο μπροστινό μέρος του ουρά. Για να αφαιρέσετε το int, αρκεί να το ξεχάσω. Δεν χρειάζεται να παρακάμψετε κομμάτι της. Έτσι, εξακολουθεί να είναι πραγματικά εκεί. Ακριβώς όπως και τα δεδομένα σε έναν σκληρό δίσκο, είμαστε απλά αγνοώντας το γεγονός ότι υπάρχει τώρα. Και αν το q είναι άδειο, θα πρέπει να αντί να επιστρέψει αρνητική 1. Έτσι, αυτό το αισθάνεται αυθαίρετη. Γιατί να επιστρέψει αρνητική 1 αντί λάθος; Ναι. ΚΟΙΝΟ: Q είναι η αποθήκευση θετικές τιμές. Δεδομένου ότι μπορείτε να αποθηκεύσετε μόνο θετικές τιμές στο q, αρνητικό είναι ένα σφάλμα. DAVID J. MALAN: Εντάξει, είναι αλήθεια. Έτσι, επειδή είμαστε μόνο αποθήκευση θετική ή μηδενικές τιμές, τότε είναι μια χαρά για να επιστρέψει μια αρνητική τιμή ως φρουρός αξία, ένα ειδικό σύμβολο. Αλλά είστε ξαναγράψιμο της ιστορίας εκεί, επειδή ο λόγος που είμαστε μόνο επιστροφή μη αρνητικές τιμές είναι γιατί θέλουμε να έχουν αξία φρουρού. Έτσι, πιο συγκεκριμένα, γιατί δεν είναι μόνο return false σε περίπτωση σφάλματος; Ναι. ΚΟΙΝΟ: Έχετε αποτύχει να επιστρέφουν έναν ακέραιο. DAVID J. MALAN: Ακριβώς. Και αυτό είναι όπου παίρνει C αρκετά περιοριστικό. Εάν λέτε θα πάμε για να επιστρέψει έναν int, έχετε για να επιστρέψει έναν int. Δεν μπορείτε να πάρετε φανταχτερό και να αρχίσει την επιστροφή μια bool ή ένα πλωτήρα ή σπάγκο ή κάτι τέτοιο. Τώρα, εν τω μεταξύ, JavaScript και PHP και κάποιες άλλες γλώσσες μπορεί, στην πραγματικότητα, έχετε την επιστροφή διαφορετικά τύπους τιμών. Και αυτό μπορεί πραγματικά να είναι χρήσιμη, όταν θα μπορούσε να επιστρέψει το θετικό ints, μηδενικά, αρνητικές ints ή ψευδείς ή null ακόμα και να δηλώσει σφάλμα. Αλλά δεν έχουμε ότι ευελιξία σε C. Έτσι, με dequeue, τι προτίθεστε να κάνετε είναι - ROB BOWDEN: Μπορείτε να επιστρέψετε ψευδής. Είναι απλά ότι είναι ψευδή hash καθορίσει ψευδείς στο μηδέν. Έτσι, αν επιστρέψει false, που επιστρέφετε το μηδέν. Και το μηδέν είναι μια έγκυρη πράγμα στην ουρά μας, ενώ οι αρνητικές 1 δεν είναι αν ψευδείς έτυχε να είναι αρνητική 1. Αλλά δεν θα έπρεπε καν Πρέπει να γνωρίζετε ότι. DAVID J. MALAN: Αυτό είναι Γι 'αυτό δεν το λένε. ROB BOWDEN: Αλλά δεν ήταν αλήθεια ότι δεν μπορεί να επιστρέψει false. DAVID J. MALAN: Σίγουρα. Έτσι dequeue, παρατηρήσετε δεχόμαστε άκυρη ως επιχείρημά της. Και αυτό γιατί δεν είμαστε περνά τίποτα μέσα Εμείς απλά θέλετε να καταργήσετε το στοιχείο στο μπροστινό μέρος της ουράς. Λοιπόν, πώς θα μπορούσαμε να κάνετε για αυτό; Λοιπόν, πρώτα, ας το κάνουμε γρήγορο έλεγχο λογική. Εάν το μέγεθος της ουράς αναμονής είναι 0, υπάρχει καμία δουλειά να γίνει. Επιστροφή αρνητική 1. Έγινε. Έτσι, αυτό είναι μερικές γραμμές του προγράμματός μου. Έτσι, μόνο τέσσερις γραμμές παραμένουν. Εδώ, λοιπόν, αποφασίσετε να μειώσετε το μέγεθος. Και Μειώσης το μέγεθος αποτελεσματικά σημαίνει ότι ξεχνάω κάτι που είναι εκεί μέσα. Αλλά δεν έχω, επίσης, να ενημερωθούν όταν το μέτωπο των αριθμών είναι. Έτσι για να το κάνουμε αυτό, θα πρέπει να κάνει δύο πράγματα. Θα πρέπει πρώτα να θυμηθείτε τι ο αριθμός βρίσκεται στο μπροστινό μέρος της ουράς, γιατί πρέπει να επιστρέψει αυτό το πράγμα. Γι 'αυτό δεν θέλω να ξεχάσω λάθος γι 'αυτό και στη συνέχεια να το αντικαταστήσετε. Είμαι ακριβώς πρόκειται να θυμάστε σε int. Και τώρα, θέλω να αναβαθμίσω q.front να q.front +1. Έτσι, αν αυτό ήταν το πρώτο πρόσωπο στην γραμμή, τώρα, θέλω να κάνω συν 1 σημείο στο επόμενο πρόσωπο στη γραμμή. Αλλά έχω να χειριστεί αυτό το περιτύλιξης. Και, αν η χωρητικότητα είναι μια παγκόσμια σταθερά, ότι πρόκειται να μου επιτρέψετε να βεβαιωθείτε όπως τόνισα στο τελευταίο άτομο γραμμή, η λειτουργία modulo θα φέρει μου πίσω στο μηδέν, η μπροστά από την ουρά. Και αυτό χειρίζεται την περιτύλιξης εδώ. Και τότε θα προχωρήσει να επιστρέψει n. Τώρα, για να κυριολεκτήσουμε, δεν το έκανα πρέπει να δηλώνουν n. Δεν είχα να το αρπάξει και να το αποθηκεύσετε προσωρινά, επειδή η τιμή είναι ακόμα εκεί. Έτσι θα μπορούσα να κάνω ακριβώς το σωστό αριθμητικό να επιστρέψει ο πρώην επικεφαλής της ουράς. Αλλά εγώ απλά ένιωσα ότι αυτό ήταν πιο σαφής να αρπάξει πραγματικά την int, βάλτε σε n, και στη συνέχεια επιστρέφουν ότι για λόγους σαφήνειας, αλλά δεν είναι απολύτως απαραίτητο. Ψιτ. Είναι όλοι προφερθεί στο κεφάλι μου. ROB BOWDEN: Έτσι το πρώτο ερώτημα είναι το δυαδικό δένδρο πρόβλημα. Έτσι, το πρώτο ερώτημα είναι, είμαστε δεδομένου αυτοί οι αριθμοί. Και θέλουμε να τα εισάγετε με κάποιον τρόπο στην Αυτοί οι κόμβοι έτσι ώστε να είναι ένα έγκυρο δυαδικό δένδρο αναζήτησης. Έτσι, το ένα πράγμα που πρέπει να θυμάστε σχετικά με δυαδικά δένδρα αναζήτησης είναι ότι δεν είναι ακριβώς αυτό το πράγμα προς τα αριστερά είναι μικρότερη και το πράγμα που πρέπει να το δικαίωμα είναι μεγαλύτερη. Πρέπει να είναι ότι ολόκληρο το δέντρο να το αριστερό είναι μικρότερη, και ολόκληρο το δέντρο προς τα δεξιά είναι μεγαλύτερη. Έτσι, αν βάλω 34 εδώ στην κορυφή, και στη συνέχεια Έβαλα 20 εδώ, έτσι ώστε να είναι έγκυρες, καθόσον τώρα, γιατί 34 έως εδώ. 20 πρόκειται προς τα αριστερά. Έτσι ώστε να είναι λιγότερο. Αλλά δεν μπορώ να στη συνέχεια να βάλει 59 εδώ, γιατί ακόμη και αν είναι 59 σχετικά με το δικαίωμα 20, είναι ακόμα στο αριστερό μέρος της 34. Έτσι, με αυτό το εμπόδιο στο μυαλό, η ευκολότερος τρόπος για την επίλυση αυτού πιθανώς το πρόβλημα είναι ακριβώς το είδος από αυτούς τους αριθμούς - έτσι 20, 34, 36, 52, 59, 106. Και στη συνέχεια, τοποθετήστε τα από αριστερά προς τα δεξιά. Έτσι, 20 πηγαίνει εδώ. 34 πηγαίνει εδώ. 36 πηγαίνει εδώ. 52, 59, 106. Και μπορείτε επίσης θα μπορούσε να καταλάβει με κάποιοι συνδέοντας και την υλοποίηση, Ω, περιμένετε, δεν έχω αρκετά αριθμούς να συμπληρώσετε το πεδίο αυτό εδώ. Γι 'αυτό πρέπει να reshift τι μου σημείωση διαδρομή πρόκειται να είναι. Να σημειωθεί όμως ότι στην τελική τρεις, αν μπορείτε να διαβάσετε από αριστερά προς τα δεξιά, είναι σε αύξουσα σειρά. Έτσι τώρα, θέλουμε να δηλώσει ποια είναι η struct πρόκειται να είναι για το κόμβοι σε αυτό το δέντρο. Έτσι, αυτό που χρειαζόμαστε σε ένα δυαδικό δέντρο; Έτσι έχουμε μια τιμή του τύπου int, έτσι κάποια αξία int. Δεν ξέρω αυτό που ονομάζεται αυτό στο διάλυμα - int n. Χρειαζόμαστε ένα δείκτη στο αριστερό παιδί και έναν δείκτη για το δικαίωμα του παιδιού. Έτσι πρόκειται να μοιάζει με αυτό. Και θα δούμε πραγματικά πριν όταν έκανε το διπλά-συνδεδεμένη Λίστα πράγματα, έτσι ώστε προειδοποίηση - Πάω να πρέπει να μετακινηθείτε σε όλη την δρόμο της επιστροφής προς τα κάτω για το πρόβλημα 11. Έτσι παρατηρήσετε ότι φαίνεται το ίδιο με αυτό, εκτός από απλά τυχαίνει να καλέσετε αυτά διαφορετικά ονόματα. Έχουμε ακόμα έναν ακέραιο αξία και δίποντα. Είναι απλά ότι αντί για τη θεραπεία της δείκτες, όπως δείχνουν προς το επόμενο πράγμα και το προηγούμενο θέμα, προσπαθούμε να γιατρέψουμε οι δείκτες να δείχνουν ένα αριστερό παιδί και το δικαίωμα του παιδιού. OK. Έτσι ώστε να είναι struct node μας. Και τώρα, η μόνη λειτουργία που πρέπει να εφαρμόσουν για αυτό είναι εγκάρσια, η οποία θέλουμε να πάμε πάνω από το δέντρο, εκτύπωση από τις τιμές του δέντρου με τη σειρά. Έτσι, αναζητούν εδώ, θα θέλαμε να εκτυπώσετε έξω 20, 34, 36, 52, 59, και 106. Πώς θα επιτευχθεί αυτό; Έτσι είναι αρκετά παρόμοια. Αν είδατε στο παρελθόν εξετάσεις το πρόβλημα ότι θέλετε να εκτυπώσετε ολόκληρο το δέντρο με κόμματα ανάμεσα τα πάντα, ήταν στην πραγματικότητα ακόμα ευκολότερο από αυτό. Τόσο εδώ είναι η λύση. Αυτό ήταν σημαντικά ευκολότερη αν το έκανε κατ 'επανάληψη. Δεν ξέρω αν κάποιος επιχειρήσει να το κάνουμε επαναληπτικό. Αλλά πρώτα, έχουμε τη βασική μας υπόθεση. Τι θα συμβεί αν η ρίζα είναι άκυρη; Στη συνέχεια, είμαστε ακριβώς πρόκειται να επιστρέψει. Δεν θέλουμε να εκτυπώσετε τίποτα. Αλλιώς θα πάμε να διασχίσει αναδρομικά προς τα κάτω. Εκτυπώστε ολόκληρη την αριστερά υποδένδρο. Έτσι, εκτυπώνουν τα πάντα, λιγότερο από την τρέχουσα αξία μου. Και στη συνέχεια, Πάω να εκτυπώσετε τον εαυτό μου. Και στη συνέχεια, Πάω να recurse κάτω μου ολόκληρο το δεξί υποδέντρο, έτσι ώστε τα πάντα μεγαλύτερη από την αξία μου. Και αυτό πρόκειται να εκτυπώσετε τα πάντα σε τάξη. Ερωτήσεις σχετικά με το πώς αυτή η πραγματικότητα επιτυγχάνει αυτό; ΚΟΙΝΟ: Έχω μια ερώτηση σχετικά με την [δεν ακούγεται]. ROB BOWDEN: Έτσι, ένας τρόπος προσέγγισης του οποιαδήποτε αναδρομική πρόβλημα είναι να σκεφτούμε μόνο γι 'αυτό ήθελα να πρέπει να σκεφτείτε για όλες τις περιπτώσεις γωνία. Έτσι θεωρούν ότι θέλουμε να εκτυπωθεί ολόκληρο αυτό το δέντρο. Έτσι, το μόνο που πρόκειται να επικεντρωθεί σε είναι αυτό το συγκεκριμένο κόμβο - 36. Οι αναδρομικές κλήσεις, προσποιούμαστε εκείνους ακριβώς που εργάζονται. Έτσι, εδώ, αυτή η αναδρομική κλήση για να εγκάρσιο, εμείς χωρίς καν να σκεφτόμαστε γι 'αυτό, απλά διέρχονται από το αριστερό τρία, φανταστείτε ότι εκτυπώνει ήδη 20 και 34 για μας. Και στη συνέχεια, όταν τελικά αναδρομικά καλέστε τραβέρσα για το σωστά, ότι θα εκτυπώνεται σωστά 52, 59, 106 και για εμάς. Έτσι δεδομένου ότι αυτό μπορεί να εκτυπώσει 20, 34, και ο άλλος μπορεί να εκτυπώσει 52, 59, 108, όλοι πρέπει να είμαστε σε θέση να κάνετε είναι να εκτυπώσετε τον εαυτό μας στη μέση του αυτό. Έτσι εκτυπώσετε τα πάντα μπροστά μας. Εκτυπώστε τον εαυτό μας, έτσι ώστε η τρέχουσα εκτύπωση κόμβου 36, η τακτική printf, και στη συνέχεια εκτυπώνουν τα πάντα, μετά από εμάς. DAVID J. MALAN: Αυτό είναι όπου αναδρομή παίρνει πραγματικά όμορφο. Είναι αυτό το εκπληκτικό άλμα της πίστης, όπου κάνετε το παραμικρό κομμάτι της εργασίας. Και τότε θα αφήσει κάποιον άλλο να κάνει τα υπόλοιπα. Και ότι κάποιος άλλος είναι, κατά ειρωνεία της τύχης, μπορείτε. Έτσι, για σοβαρές brownie σημεία, αν πραγματοποιείτε κύλιση πάνω στις ερωτήσεις - ROB BOWDEN: Στις ερωτήσεις; DAVID J. MALAN: Και κάτω λίγο να οι αριθμοί, Ξέρει κανείς πού οι αριθμοί αυτοί προέρχονται από; ROB BOWDEN: Δεν έχω καμία ιδέα κυριολεκτικά. DAVID J. MALAN: Φαίνονται σε όλο το κουίζ. ΚΟΙΝΟ: Είναι οι ίδιοι αριθμοί; DAVID J. MALAN: Αυτοί οι αριθμοί. Ένα μικρό αυγό του Πάσχα. Έτσι, για όσους από εσάς παρακολουθούν σε απευθείας σύνδεση στην σπίτι, αν μπορείτε να μας πείτε μέσω ηλεκτρονικού ταχυδρομείου στη heads@CS50.net ποια είναι η σημασία από αυτά τα επαναλαμβανόμενα έξι αριθμούς είναι όλη Quiz 1, θα σας ντους με καταπληκτική προσοχή στο τελικό διάλεξη και μια μπάλα για το άγχος. Νίκαια, λεπτή. ROB BOWDEN: Οι τελευταίες ερωτήσεις για οτιδήποτε σχετικά με το κουίζ;