[Review: Quiz 1] [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Πανεπιστήμιο Χάρβαρντ] [Αυτό είναι CS50.] [CS50.TV] [Lucas Freitas] Καλώς ήρθατε όλοι. Αυτή είναι η κριτική για το κουίζ 1. Ακριβώς όπως μια αποκήρυξη, αυτό - εννοώ, θα πάμε να προσπαθήσουμε να καλύψουμε όσο το δυνατόν περισσότερο υλικό, αλλά αυτό δεν σημαίνει ότι θα πάμε για να καλύψει όλα τα πράγματα που μπορεί να είναι σε κουίζ 1. Έτσι να είστε βέβαιος επίσης να λάβει μια ματιά σε διάλεξη, τμήματα, ό, τι μπορείς. Quiz 1 θα είναι την Τετάρτη, την επόμενη Τετάρτη. Έτσι να είστε βέβαιος να μελετήσει. Είναι πρόκειται να είναι, λίγο πολύ, όπως και το πρώτο κουίζ σχετικά με τη μορφή του, αλλά κατά πάσα πιθανότητα θα είναι πολύ πιο δύσκολο. Τουλάχιστον, πέρυσι, όταν πήρα 50, σκέφτηκα ότι ήταν πολύ πιο δύσκολο. Έτσι μελετήσει πολύ. Πάω να καλύψει τις δομές δεδομένων και η κωδικοποίηση Huffman. Αυτό είναι κάτι που πολλοί άνθρωποι πιστεύουν ότι είναι πολύπλοκη, αλλά Πάω να προσπαθήσουμε να το κάνουμε όσο πιο εύκολη γίνεται. Πρώτα απ 'όλα, αυτό που θέλουμε εσείς να ξέρετε για το κουίζ 1 είναι κατανοήσει τις εννοιολογικές περιγραφές καθενός των δομών δεδομένων που θα πάω να παρουσιάσει. Αυτό σημαίνει ότι δεν έχετε πραγματικά να εφαρμόσουν ένα πίνακα κατακερματισμού στο κουίζ σας 1. Δεν θέλουμε να εφαρμόσει ένα ολόκληρο πίνακα κατακερματισμού? Ίσως θα προσπαθήσουμε να σας κάνει να εφαρμόσουν κάποιες λειτουργίες, οι πιο κοινές λειτουργίες, αλλά εμείς δεν πρόκειται να σας κάνει να εφαρμόσουν τα πάντα. Γι 'αυτό είναι σημαντικό να καταλάβετε την έννοια πίσω από κάθε δομή δεδομένων και, επίσης, ότι είστε σε θέση να κωδικοποιήσουν σε C, μόνο οι πιο κοινές λειτουργίες που έχουν για κάθε δομή δεδομένων. Και, επίσης, να είναι σε θέση να εξετάσει τους δείκτες και structs, επειδή φαίνεται πολύ σε αυτές τις δομές δεδομένων. Πρώτον, συνδεδεμένες λίστες. Συνδεδεμένες λίστες είναι στην πραγματικότητα πολύ παρόμοια με συστοιχίες, αλλά η διαφορά ανάμεσα σε μια συνδεδεμένη λίστα και μία συστοιχία, Πρώτα απ 'όλα, είναι ότι μία συνδεδεμένη λίστα έχει ένα πολύ ευέλικτο μέγεθος, ενώ σε συστοιχίες που έχετε να επιλέξετε είτε ένα πολύ μεγάλο μέγεθος για τον πίνακα, ώστε να γνωρίζετε ότι θα πάμε να είναι σε θέση να αποθηκεύουν όλα τα δεδομένα σας σε αυτόν τον πίνακα, ή θα πρέπει να χρησιμοποιήσετε malloc για να έχουν ένα ευέλικτο μήκος του πίνακα. Σε συνδεδεμένες λίστες είναι πολύ εύκολο να πάρει ακριβώς περισσότερα στοιχεία, βάλει περισσότερα στοιχεία στη συνδεδεμένη λίστα ή να καταργήσετε στοιχεία. Και στην πραγματικότητα, αν δεν θέλετε η συνδεδεμένη λίστα να διευθετηθεί, μπορείτε να αναζητήσετε και να καταργήσετε στοιχεία σε συνεχή χρόνο, έτσι O (1) χρόνο, γι 'αυτό είναι πολύ βολικό. Απλά πρέπει να είμαστε προσεκτικοί για να θυμάστε πάντα να malloc και δωρεάν οι κόμβοι, μόνο και μόνο επειδή αν δεν το κάνετε, θα έχετε διαρροές μνήμης. Έτσι, συνδεδεμένες λίστες - ο ορισμός ενός κόμβου είναι ακριβώς όπως αυτό που έχουμε εκεί. Έβαλα int n, αλλά μπορείτε να αποθηκεύσετε τα δεδομένα που θέλετε. Έτσι, αν θέλετε να αποθηκεύσετε μια σειρά, είναι μια χαρά. Εάν θέλετε να αποθηκεύσετε ένα struct, είναι μια χαρά, ένα διπλό, ό, τι θέλετε. Έβαλα μόνο int n για τα παραδείγματα εδώ. Και έχετε ένα δείκτη στον επόμενο κόμβο. Έτσι, βασικά, μία συνδεδεμένη λίστα έχει κάποια δεδομένα, και στη συνέχεια επισημαίνει στον επόμενο κόμβο. Αν είναι το τελευταίο στοιχείο της συνδεδεμένης λίστας, πρόκειται να επισημάνω στην τιμή NULL. Έτσι, αυτό είναι ένα παράδειγμα μιας συνδεδεμένης λίστας. Εντάξει, τώρα ας δούμε τι πρέπει να κάνω αν θέλω να εισαγάγετε ένα στοιχείο σε μια συνδεδεμένη λίστα. Κατ 'αρχάς, ένα ένθετο λειτουργία θα είναι τύπου void γιατί δεν θέλω να επιστρέψει τίποτα. Και Πάω να λάβει int ως επιχείρημα, επειδή θέλω να ξέρω τι θέλετε να εισαγάγετε. Έτσι, ποιο είναι το πρώτο πράγμα που πρέπει να κάνω; Λοιπόν, θα ήθελα να malloc για newnode, έτσι ώστε η πρώτη γραμμή. Είμαι απλά δημιουργώντας ένα νέο κόμβο για να βάλει σε μια συνδεδεμένη λίστα. Λοιπόν, τι μπορώ να κάνω; Λοιπόν, γνωρίζουμε ότι στις εφαρμογές μας συνδεδεμένες λίστες στην τάξη, βάζουμε πάντα το κεφάλι ως global μεταβλητή. Έτσι, αυτό που μπορούμε να κάνουμε είναι να αλλάξουμε το κεφάλι. Μπορώ να κάνω αυτό το νέο κόμβο είναι ο νέος επικεφαλής, και πρόκειται να επισημάνω και το προηγούμενο. Πώς μπορούμε να το κάνουμε αυτό; Το πρώτο πράγμα που πρέπει να κάνετε είναι να αλλάξετε το «ν» στο νέο κόμβο σε αξία, το οποίο διαβιβάστηκε στη συνάρτηση. Στη συνέχεια newnode δίπλα πρόκειται να είναι η κεφαλή. Η κεφαλή πρόκειται να newnode. Έτσι, είναι αρκετά απλό. Για τη διαγραφή ενός κόμβου, μπορούμε να το κάνουμε, όπως - Ένας τρόπος θα μπορούσαμε να κάνουμε δηλαδή, εντάξει, αν ήθελα να διαγράψει, για παράδειγμα, 3, τι θα μπορούσα να κάνω είναι να επισημάνω απλώς το προηγούμενο κόμβο στον επόμενο κόμβο του 3. Θα ήθελα λοιπόν να κάνει ακριβώς κάτι τέτοιο. Αλλά ποιο είναι το πρόβλημα με τον τρόπο αυτό; Έχω μια διαρροή μνήμης, οπότε δεν έχω πρόσβαση στον αριθμό 3 πια. Το πρόβλημα με αυτό είναι ότι εγώ δεν πρόκειται να είναι σε θέση να απελευθερώσει ότι ο κόμβος. Πάω να έχει διαρροή μνήμης και (ακατάληπτο) θα με μισούν. Έτσι, αντί να το κάνουμε αυτό, θα πρέπει να έχετε πιθανώς ένα προσωρινό δείκτη. Έτσι έβαλα temp. Δεν πρόκειται να επισημάνω στον κόμβο που θέλετε να διαγράψετε. Και τότε μπορεί να κινηθεί τα προηγούμενα κόμβους με το σημείο στον επόμενο κόμβο του κόμβου που θέλετε να διαγράψετε. Και τέλος, μπορώ να ελευθερώσει το δείκτη. Έχω να ελευθερώσει το δείκτη που δημιουργήθηκε εκεί; Δεν έχω να, μόνο και μόνο επειδή - η διαφορά είναι ότι αυτός ο κόμβος δημιουργήθηκε με τη χρήση malloc, έτσι είναι στο σωρό, ενώ αυτή ήταν μόλις κηρυχθεί ως διακόπτης NULL στη στοίβα. Γι 'αυτό και δεν χρειάζεται να το απελευθερώσει. Εντάξει. Έτσι τώρα ας μιλήσουμε για στοίβες. Στοίβες είναι αρκετά απλή. Κάναμε στοίβες και ουρές στην τάξη μόνο με τη χρήση πινάκων, αλλά πρέπει να είστε εξοικειωμένοι - απλά να γνωρίζουν ότι μπορείτε επίσης να κάνετε στοίβες στις ουρές χρησιμοποιώντας συνδεδεμένες λίστες, καθώς και. Έτσι, εάν έχετε μια σειρά, τι θα ήταν μια στοίβα; Μια στοίβα, πρώτον, θα πρέπει να έχουν ένα μέγεθος. Θα πρέπει να αποθηκεύσετε ποιο είναι το μέγεθος της στοίβας που έχετε τώρα. Και επίσης θα έχουν μια σειρά, σε αυτή την περίπτωση των αριθμών, αλλά αν θέλετε, μπορεί να είναι ένας πίνακας χορδές, μια σειρά από struct, κάτι που θέλετε να αποθηκεύσετε. Σχετικά με τη στοίβα: Η διαφορά ανάμεσα σε ένα σωρό και μια συνδεδεμένη λίστα είναι ότι στη στοίβα έχετε πρόσβαση μόνο στο τελευταίο στοιχείο που τέθηκε στη στοίβα. Λέγεται τελευταία in, first out. Ακριβώς όπως έχετε μια στοίβα των δίσκων, αν βάλετε ένα δίσκο στην κορυφή της στοίβας, θα πρέπει να καταργήσετε αυτό το δίσκο πρώτα για να έχετε πρόσβαση σε άλλους δίσκους. Είναι το ίδιο πράγμα με στοίβες. Έτσι, αν θέλω να, για παράδειγμα, να προσθέσετε ένα στοιχείο σε μια στοίβα, τι πρέπει να κάνω; Λέγεται ώθηση, και αυτό είναι αρκετά απλή. Το πρώτο πράγμα που έχετε να κάνετε είναι να ελέγξετε εάν το μέγεθος της στοίβας δεν είναι μεγαλύτερη ή ίση με την χωρητικότητα της στοίβας. Διότι, αν είστε ήδη σε πλήρη παραγωγική ικανότητα, δεν μπορείτε να προσθέσετε κάτι άλλο. Και τότε, αν όχι, απλά πρέπει να προσθέσετε το στοιχείο στη στοίβα. Και τέλος, αυξήσετε το μέγεθος. Γι 'αυτό είναι αρκετά απλή. Γι 'αυτό ακριβώς προσθέστε τον αριθμό 2. Και αν θέλω να σκάσει, πράγμα που σημαίνει ότι θέλω να αφαιρέσω Το τελευταίο στοιχείο που προστέθηκε και επιστρέφει την τιμή του στοιχείου, το πρώτο πράγμα που πρέπει να ελέγξετε είναι ότι η στοίβα δεν είναι κενή. Διότι αν είναι άδειο, δεν μπορώ να επιστρέψει τίποτα. Σε αυτή την περίπτωση, είμαι επιστρέφουν -1. Διαφορετικά, θα πάω για να μειώσετε το μέγεθος του spec, και να επιστρέψει αριθμούς (s.size). Γιατί έχω ελαττώσει το μέγεθος και στη συνέχεια επιστρέφουν s.size; Είναι επειδή, σε αυτή την περίπτωση, το spec έχει μέγεθος 4, και θέλω να επιστρέψει το τέταρτο στοιχείο, έτσι δεν είναι; Αλλά τι είναι ο δείκτης του τέταρτου στοιχείου; Τρία. Επειδή κάνω μέγεθος - θα είναι 3, s.numbers μπορώ να επιστρέψω μόνο (s.size) επειδή είναι 3. Έτσι είναι απλά ο δείκτης. Τώρα ουρές. Ουρές είναι λίγο πολύ το ίδιο πράγμα. Η μόνη διαφορά είναι ότι αντί να έχουμε τελευταία in, first out, έχετε first in, first out. Πιθανώς, αν είστε σε αναμονή για να πάμε σε μια συναυλία, δεν θα είναι ευτυχής εάν είχε μια στοίβα αντί για μια ουρά. Όντας το τελευταίο πρόσωπο για να έρθει θα είναι το πρώτο πρόσωπο για να εισέλθουν στην συναυλία. Πιθανότατα δεν θα είναι ευτυχισμένος. Στην ουρά, το πρώτο πρόσωπο για να πάρει το είναι επίσης το πρώτο πρόσωπο για να βγούμε. Έτσι στον ορισμό του μια ουρά, πέραν του ότι έχει το μέγεθος της συστοιχίας, θα πρέπει επίσης να έχουν το κεφάλι, το οποίο είναι ο δείκτης με τον επικεφαλής της στοίβας. Έτσι, το πρώτο στοιχείο αυτή τη στιγμή. Τοποθέτηση στην ουρά είναι το ίδιο πράγμα με ώθηση για στοίβες. Αν ήταν πολύ αφελής, θα ήθελα απλώς να πω, καλά, μπορώ να κάνω ακριβώς ακριβώς το ίδιο πράγμα όπως έκανα για την ώθηση. Δεν μπορώ ακριβώς να ελέγξετε αν δεν είναι πέρα ​​από την ικανότητα. Αν είναι, θα επιστρέψει false, αλλιώς μπορώ να εξαγάγετε μόνο την νέα τιμή και μετά αύξησε το μέγεθος. Αλλά γιατί είναι αυτό το λάθος; Ας δούμε το παράδειγμα αυτό. Προσπαθώ να enqueue ένα σωρό πράγματα, και, στη συνέχεια, Πάω να dequeue και enqueue. Υπάρχει πολλή των εντολών, αλλά είναι πολύ απλό. Πάω να enqueue 5, πρέπει να προστεθούν 5, 7 και, στη συνέχεια, 1, 4, 6, και τότε θέλω να dequeue κάτι, πράγμα που σημαίνει ότι θα πάω να αφαιρέσετε το πρώτο στοιχείο. Έτσι, Πάω να αφαιρέσετε τον αριθμό 3, σωστά; Το πρώτο στοιχείο. Εντάξει. Τώρα, αν θα προσπαθήσουν να enqueue κάτι άλλο, τι πρόκειται να συμβεί; Σύμφωνα με την εφαρμογή μου, Ήμουν έτοιμος να θέσει τον επόμενο αριθμό στην q.size δείκτη. Σε αυτή την περίπτωση, το μέγεθος είναι 8, έτσι ώστε ο δείκτης 8 θα είναι εδώ στην τελευταία θέση. Αν προσπαθήσω να enqueue 1 δεξιά εδώ, θα ήθελα να αντικαταστήσετε την τελευταία θέση με τον αριθμό 1, η οποία είναι εντελώς λανθασμένη. Αυτό που θέλω να κάνετε είναι να τυλίξετε γύρω και να πάει στην πρώτη θέση. Ίσως θα σας πω απλά, καλά, απλά πρέπει να ελέγξετε αν μπορώ να βάλω πραγματικά κάτι εκεί. Αν όχι, θα ήθελα απλώς να πω, OH, το νέο πλήρες δυναμικό είναι στην πραγματικότητα ικανότητα - 1, και δεν μπορείτε να βάλετε ένα στοιχείο εκεί. Αλλά ποιο είναι το πρόβλημα; Το πρόβλημα είναι ότι αν απλά dequeue πάντα εδώ και τότε θα προσπαθήσω να προσθέσω κάτι άλλο, θα ήθελα απλώς να πω, καλά, θα ήταν σε πλήρη δυναμικότητα, η οποία είναι 0. Έτσι ουρά σας έχει φύγει. Μπορείτε να τυλίξετε γύρω, και ένας τρόπος για την περιτύλιξη ότι εσείς έμαθε οραματιστής και άλλα psets χρησιμοποιούσε mod. Μπορείτε να το δοκιμάσετε στο σπίτι για να καταλάβετε γιατί θα κάνετε q.size + q.head mod ικανότητα, αλλά αν έχετε ελέγξει εδώ, μπορούμε να δούμε ότι λειτουργεί. Έτσι, στο τελευταίο παράδειγμα, ήταν q.size 8 και η κεφαλή ήταν 1, επειδή ήταν η θέση εδώ της συστοιχίας. Έτσι θα είναι 8 + 1, 9. Mod χωρητικότητα 9 θα είναι 0. Θα πάει στο δείκτη 0. Θα είναι στη σωστή θέση. Και στη συνέχεια, δοκιμάστε την ουρά στο σπίτι. Μερικά σημαντικά πράγματα: να προσπαθήσουμε να κατανοήσουμε τη διαφορά ανάμεσα σε μια στοίβα και ουρά. Στο σπίτι, προσπαθήστε να πάρετε πολύ εξοικειωμένοι με την εφαρμογή enqueue, dequeue, ώθησης και ποπ. Και επίσης να καταλάβουμε πότε θα χρησιμοποιήσει κάθε ένα από αυτά. Ας χαλαρώστε για 10 δευτερόλεπτα με μια δέσμη των Pokemons. Και τώρα ας πάμε πίσω στις δομές δεδομένων. Hash πίνακες. Πολλοί άνθρωποι ήταν φοβισμένοι από πίνακες κατακερματισμού. στο πρόβλημα που 6, Spell Checker. Hash πίνακες και προσπαθεί, πολλοί άνθρωποι φοβούνται τους. Νομίζουν ότι είναι τόσο δύσκολο να κατανοηθεί. Ναι; [Rob Bowden] Πρόβλημα σετ 5. Πρόβλημα σετ 5, ναι. Ευχαριστώ Rob. Ναι. Έξι ήταν Huff n 'Puff, ναι. Πρόβλημα που ήταν 5 Spell Checker, και θα έπρεπε να χρησιμοποιήσετε είτε ένα πίνακα κατακερματισμού ή μια δοκιμή. Πολλοί άνθρωποι νόμιζαν ότι ήταν εξαιρετικά δύσκολο να κατανοηθεί, αλλά είναι πραγματικά αρκετά απλή. Τι είναι ένας πίνακας κατακερματισμού, βασικά; Ένας πίνακας hash είναι μια σειρά από συνδεδεμένες λίστες. Η μόνη διαφορά μεταξύ ενός πίνακα και ένα πίνακα κατακερματισμού είναι ότι στον πίνακα κατακερματισμού έχετε κάτι που ονομάζεται συνάρτηση κατακερματισμού. Τι είναι μια συνάρτηση κατακερματισμού; Δεν ξέρω αν εσείς μπορείτε να διαβάσετε εδώ. Αυτό είναι ένα παράδειγμα ενός πίνακα κατακερματισμού. Έτσι μπορείτε να δείτε ότι έχετε έναν πίνακα με 31 στοιχεία. Και τι κάνουμε σε έναν πίνακα κατακερματισμού έχει μια συνάρτηση κατακερματισμού ότι πρόκειται να μεταφράσει ένα κλειδί, κάθε int με ένα δείκτη. Αν, για παράδειγμα, εάν θέλετε να επιλέξετε για τον Β. Harrison, Θα ήθελα να θέσω B. Harrison σε συναρτήσεις κατακερματισμού μου, και η συνάρτηση κατακερματισμού θα επιστρέψει 24. Έτσι, ξέρω ότι θέλετε να αποθηκεύσετε B. Harrison σε 24. Έτσι, αυτή είναι η διαφορά μεταξύ έχοντας μόλις μία συστοιχία και πίνακα κατακερματισμού. Στον πίνακα κατακερματισμού θα έχετε μια λειτουργία που πρόκειται να σας πω πού να αποθηκεύσετε τα δεδομένα που θέλετε να αποθηκεύσετε. Για τη συνάρτηση κατακερματισμού, που θέλετε να αναζητήσετε για μια συνάρτηση κατακερματισμού ότι είναι προσδιοριστική και καλά κατανεμημένη. Όπως μπορείτε να δείτε εδώ, θα δείτε ότι πολλά από τα στοιχεία που ήθελα να κατάστημα ήταν στην πραγματικότητα 19 αντί να χρησιμοποιεί 31 και 30 και 29, τα οποία ήταν όλα δωρεάν. Έτσι, η συνάρτηση κατακερματισμού που χρησιμοποιήθηκε δεν ήταν πολύ καλά κατανεμημένη. Όταν λέμε καλά κατανεμημένη, αυτό σημαίνει ότι θέλουμε να έχουμε, περίπου, τουλάχιστον 1 ή 2 για κάθε ένα από τα - παρόμοια, μία διαφορά 1 ή 2 για κάθε ένα από τους δείκτες στις συστοιχίες. Θέλετε να έχετε, περίπου, τον ίδιο αριθμό των στοιχείων σε κάθε συνδεδεμένη λίστα στον πίνακα. Και είναι εύκολο να ελέγξετε αν είναι έγκυρο στον πίνακα κατακερματισμού, βλέπουν ως πίνακες κατακερματισμού. Τότε δέντρα. Αυτό είναι ένα δέντρο. Δέντρα στην επιστήμη των υπολογιστών είναι ανάποδα για κάποιο λόγο. Έτσι, εδώ έχετε τη ρίζα του δέντρου και στη συνέχεια τα φύλλα. Θα πρέπει να ξέρετε ακριβώς την ονοματολογία για τους γονείς και το παιδί. Κάθε κόμβος έχει τα παιδιά της, που είναι οι κόμβοι που βρίσκονται κάτω από τη μητρική εταιρεία. Έτσι, για παράδειγμα, 2 πρόκειται να είναι ο γονέας για 3 και για το άλλο παιδί εκεί, ενώ 3 πρόκειται να είναι ο γονέας για 1 και τα άλλα παιδιά που είναι εκεί. Και 1 πρόκειται να είναι το παιδί 3 του, και ούτω καθεξής. Έχουμε κάτι πολύ πιο ενδιαφέρον, ονομάζεται ένα δυαδικό δένδρο αναζήτησης, κατά την οποία όλες οι τιμές στα δεξιά του κόμβου πρόκειται να είναι στα δεξιά, ακριβώς εδώ - σχετικά με το δικαίωμα, πρόκειται να είναι μεγαλύτερο από το στοιχείο στη ρίζα. Έτσι, αν έχω τον αριθμό 5 εδώ, όλα τα στοιχεία σχετικά με το δικαίωμα πρόκειται να είναι μεγαλύτερος από 5, και στην αριστερή όλα τα στοιχεία που πρόκειται να είναι μικρότερη από 5. Γιατί είναι αυτό χρήσιμο; Λοιπόν, αν θέλετε να ελέγξετε εάν ο αριθμός 7 είναι εδώ, για παράδειγμα, Απλά πηγαίνετε στο 5 πρώτη και πάω να δω, είναι 7 μεγαλύτερη ή μικρότερη από 5; Είναι μεγαλύτερο, έτσι ξέρω ότι πρόκειται να πρέπει να είναι στα δεξιά του δέντρου. Γι 'αυτό και έχουν πολύ λιγότερα πράγματα να δούμε. Σε εφαρμογή ενός δυαδικού δέντρου αναζήτησης, τον κόμβο, είμαι απλώς πρόκειται να πρέπει να έχουν τα δεδομένα, έτσι int n? θα μπορούσε επίσης να έχει ένα string ή ό, τι ήθελε. Απλά πρέπει να είμαστε προσεκτικοί σχετικά με τον καθορισμό ποια είναι μεγαλύτερη, αυτό που είναι λιγότερο. Έτσι, αν είχε χορδές, για παράδειγμα, θα μπορούσατε να ορίσετε ότι όλα αυτά τα πράγματα σχετικά με το δικαίωμα θα έχουν μεγαλύτερο μήκος, το αριστερό πρόκειται να έχουν χαμηλότερα μήκη, έτσι είναι πραγματικά μέχρι σας. Πώς μπορώ να εφαρμόσω για να βρει BST; Το πρώτο πράγμα που θα έχετε να κάνετε είναι να ελέγξετε εάν η ρίζα είναι NULL. Αν είναι NULL, αυτό σημαίνει ότι το πράγμα δεν υπάρχει γιατί δεν έχουν καν ένα δέντρο, έτσι δεν είναι; Γι 'αυτό και επιστρέφει false. Διαφορετικά, θα πάω για να ελέγξετε αν ο αριθμός είναι μεγαλύτερος από την τιμή στη ρίζα. Πάω να προσπαθήσουμε να βρούμε το στοιχείο σχετικά με το δικαίωμα του δέντρου. Θα δείτε ότι είμαι με τη χρήση της αναδρομής εδώ. Και στη συνέχεια, αν είναι λιγότερο, είμαι πρόκειται να δούμε στα αριστερά. Και τέλος, αλλιώς, αν δεν είναι μικρότερη ή όχι μεγαλύτερη, αυτό σημαίνει ότι είναι και η αξία του. Γι 'αυτό ακριβώς το return true. Μπορείτε να δείτε εδώ ότι χρησιμοποιείται εάν, εάν, εάν. Και να θυμάστε, στο κουίζ 0, είχαμε ένα πρόβλημα που είχε, αν, αν, αν, και θα έπρεπε να βρει την αναποτελεσματικότητα, και η αναποτελεσματικότητα ήταν ότι θα χρησιμοποιηθεί εάν. Θα πρέπει να χρησιμοποιήσετε if, else if, else, αν και αλλού. Έτσι, θα πρέπει να χρησιμοποιήσω άλλο αν και αλλιώς αν και άλλος εδώ; Υπάρχει κάποιος που - ναι; [Φοιτητής μιλώντας, δεν ακούγεται] Τέλειο. Έτσι, η ίδια λέει ότι δεν έχει σημασία, μόνο και μόνο επειδή η αναποτελεσματικότητα που είχαμε πριν ήταν ότι επειδή, ίσως αν είχε ικανοποιηθεί κάποια συνθήκη, έτσι ώστε να έχουν πραγματοποιηθεί μια ενέργεια, αλλά στη συνέχεια επρόκειτο να ελέγξει όλες τις άλλες προϋποθέσεις. Αλλά στην περίπτωση αυτή, επέστρεψε αμέσως, γι 'αυτό δεν έχει σημασία. Έτσι, δεν χρειάζεται να χρησιμοποιήσετε άλλο αν. Και τέλος, ας μιλήσουμε για χώρες, το οποίο είναι το αγαπημένο όλων. Μια δοκιμή είναι ένα δέντρο συστοιχιών. Είναι πολύ γρήγορα για να κοιτάζω προς τα πάνω τις τιμές, αλλά χρησιμοποιεί πολλή μνήμη. Και είναι συνήθως για να φιλτράρετε τα λόγια, έτσι ώστε όταν θέλει να εφαρμόσει, για παράδειγμα, δεν ξέρω, όπως ένα τηλεφωνικό κατάλογο του τηλεφώνου σας και θέλετε να είστε σε θέση να τύπου Β και να έχουμε μόνο τα ονόματα των ανθρώπων που έχουν B. Είναι πολύ εύκολο να εφαρμόσει ότι χρησιμοποιώντας μια δοκιμή, για παράδειγμα. Πώς μπορείτε να ορίσετε έναν κόμβο σε μια δοκιμή; Απλά πρέπει να έχουν μια bool που πρόκειται να is_word. Αυτό αντιπροσωπεύει ότι η χρήση όλων των χαρακτήρων πριν από αυτόν τον κόμβο, θα ήταν σε θέση να σχηματίσει μία λέξη, και, στη συνέχεια, θα έχετε μια σειρά από δείκτες σε κόμβους. Μπορείτε να δείτε ότι έχουμε μια σειρά μητρικών κόμβων, έτσι ώστε ο κόμβος * array; Ναι; Έτσι, ας δούμε πώς θα λειτουργήσει αυτό. Για τον ορθογραφικό έλεγχο, έχουμε μια σειρά από 27 στοιχεία, γιατί έχουμε όλες τις επιστολές συν την απόστροφο. Πριν από εδώ είμαι απλώς πρόκειται να χρησιμοποιήσετε 2 γιατί θέλω να είναι σε θέση να γράψει στον πίνακα. Εντάξει. Έτσι, αυτό είναι ένα παράδειγμα μια δοκιμή. Αν μπορώ να προσδιορίσω ακριβώς το πρώτο κόμβο, θα έχει μια σειρά από 2 στοιχεία που είναι 2 δείκτες σε NULL, οπότε έβαλα ακριβώς «α» και «β». Και Πάω να έχουν μια bool που λέει is_word. Είναι πρόκειται να είναι ψευδής για το πρώτο, μόνο και μόνο επειδή, πριν από αυτό δεν έχει χαρακτήρες. Έτσι, μια κενή λέξη, δεν είναι μια λέξη. Έτσι είναι ψευδείς. Αν θέλω να προσθέσω «α» σε αυτό το λεξικό, τι θα πρέπει να κάνω; Θα πρέπει ακριβώς να malloc ένα νέο κόμβο για «α», και στη συνέχεια προσθέστε το λόγο του για να είναι αληθινό. Γι 'αυτό αντιπροσωπεύει ακριβώς αυτό που «α» πρόκειται να είναι αληθινό. Νόημα; Στη συνέχεια, αν θέλω να προσθέσω «βα», εγώ θα πρέπει να malloc 1 για «β», και, στη συνέχεια, Πάω να δημιουργήσει το boolean σε ψευδείς, επειδή «β» από μόνη της δεν είναι μια λέξη. Στη συνέχεια, Πάω να malloc ένα άλλο για «α», έτσι ώστε «βα», και, στη συνέχεια, Πάω να δημιουργήσει είναι μια λέξη για να είναι αληθινό. Επειδή «βα» είναι μια λέξη. Και τότε, αν θέλω να δω αν «β» είναι σε αυτό το λεξικό, Δεν μπορώ ακριβώς να πάτε με το πρώτο, «β». Έχω πάει κάτω, και κοιτάω είναι η λέξη, και λέει ψευδής. Έτσι δεν είναι μια λέξη. Αν θέλω να ελέγξετε «βα», Πηγαίνω στην πρώτη, «β», και στη συνέχεια πηγαίνετε στο «α», και βλέπω αλήθεια, γι 'αυτό είναι μια λέξη. Νόημα; Πολλοί άνθρωποι μπερδεύονται από προσπάθειες. Όχι; Τέλος, η κωδικοποίηση Huffman. Huffman κωδικοποίηση είναι πολύ χρήσιμο για να εξοικονομήσετε μνήμη και να συμπιέσετε αρχεία κειμένου, μόνο και μόνο επειδή πολλές φορές που θα χρησιμοποιήσετε «a» και «e», για παράδειγμα, στα έγγραφά σας, αλλά δεν ξέρω αν εσείς χρησιμοποιείτε «q» ή «z», όπως πολύ. Έχοντας μόλις 1 byte για κάθε χαρακτήρα, κάθε - οι 256 χαρακτήρες που έχουμε στον πίνακα ASCII δεν είναι πολύ βέλτιστη, μόνο και μόνο επειδή υπάρχουν κάποιοι χαρακτήρες που χρησιμοποιούν πολύ περισσότερο, οπότε μάλλον θα πρέπει να χρησιμοποιούν λιγότερη μνήμη για εκείνους. Πώς μπορώ να χρησιμοποιήσω Huffman κωδικοποίηση; Πρέπει να κάνουμε μια Huffman δέντρο.  Μια Huffman δέντρο έχει κόμβους που έχουν ένα σύμβολο που πρόκειται να είναι όπως, «a», «b», «c», το γράμμα, ό, τι e-mail που έχετε, μια συχνότητα που είναι η συχνότητα που εμφανίζεται η λέξη στο κείμενο, ότι έφτιαχνες το δέντρο Huffman για, και, στη συνέχεια, ένας κόμβος που πρόκειται να επισημαίνουν την αριστερά του δέντρου Huffman και άλλος κόμβος που πρόκειται να υποδείξει τη σωστή. Έτσι ακριβώς όπως ένα δέντρο. Πώς να οικοδομήσουμε μια Huffman δέντρο; Θα πάμε για να πάρει τους 2 κόμβους που έχουν τις χαμηλότερες συχνότητες. Εάν έχετε μια γραβάτα θα πάμε για να πάρει τους 2 κόμβους που έχουν τις χαμηλότερες τιμές ASCII, καθώς και. Στη συνέχεια θα πάμε να δημιουργήσουμε ένα νέο δέντρο έξω από αυτά τα 2 κόμβοι που πρόκειται να έχει το συνδυασμένο συχνότητα στο μητρικό κόμβο. Και τότε θα πάμε να αφαιρέσετε τα 2 παιδιά από το δάσος και την αντικατάστασή τους με την μητρική. Και θα πάμε να επαναλάβω ότι έως ότου έχετε μόνο 1 δέντρο στο δάσος. Ας δούμε λοιπόν πώς θα κάνετε μια Huffman δέντρο για ZAMYLA. Μπορείτε να δείτε εδώ ότι όλα τα γράμματα έχουν συχνότητα 1 εκτός από την «Α»? Που έχει συχνότητα 2. Γι 'αυτό και δημιούργησε κόμβων για όλα τα γράμματα έβαλα κατά σειρά αξίας ASCII και συχνότητα. Έτσι, εάν θέλετε να δημιουργήσετε το πρώτο δέντρο, θα είναι με το «L» και «M». Γι 'αυτό είναι εδώ. Η συχνότητα του ζεύγους θα είναι 2 επειδή είναι 1 + 1, τότε το επόμενο 2 με τις χαμηλότερες συχνότητες είναι «Υ» και «Ζ». Και τότε έχω όλα αυτά είναι - έχουν συχνότητα 2. Έτσι, ποιες είναι οι αυτοί που έχουν τη χαμηλότερη τιμή ASCII για την επόμενη; «Α» και «L». Γι 'αυτό να δημιουργήσετε το νέο κόμβο, και, τέλος, είναι 4 και 2, οπότε 2 πρόκειται να είναι στα αριστερά. Και αυτό είναι το Huffman δέντρο. Στη συνέχεια, αν θέλω να γράψω κάποιο κείμενο, όπως σε δυαδική να μετατρέψετε σε κείμενο, χρησιμοποιώντας τη Huffman δέντρο είναι πολύ εύκολο. Για παράδειγμα, αν πω ότι κινείται προς τα αριστερά είναι 0 και κινείται προς τα δεξιά είναι 1, Τι είναι αυτό πρόκειται να εκπροσωπήσει; Έτσι όπως το 1, 1, τόσο δεξιά, δεξιά, και στη συνέχεια 0, οπότε θα ήταν αριστερά L, και στη συνέχεια 1, 0, 0. Έτσι, 1, 0, έτσι ακριβώς 1, 0, 'A'. Και στη συνέχεια 0, 1, έτσι ώστε «Ζ». Και στη συνέχεια 1, 0, 0 - δεν υπάρχει. 0, 0 θα είναι «Υ», έτσι Lazy. Έτσι, αυτό είναι όλο για μένα, του Rob πρόκειται να αναλάβει. [Rob Bowden] Έτσι, την εβδομάδα 7 πράγματα. Έχουμε πολλά να πάει πέρα ​​από πολύ γρήγορα. Δυαδικούς τελεστές, υπερχείλιση, Βιβλιοθήκη CS50, στη συνέχεια, HTML, HTTP, CSS. Όλοι σαν 15 έως 20 λεπτά. Δυαδικούς τελεστές. Υπάρχουν 6 από αυτά που πρέπει να ξέρετε. Δυαδικό και bitwise ή, XOR, αριστερή στροφή, δεξιά στροφή, και όχι. Δεξιά στροφή και να μην σας μόλις είδε στη διάλεξη καθόλου. Θα πάμε πέρα ​​από το γρήγορα εδώ, αλλά είναι καλό να γνωρίζουμε ότι αυτά είναι τα 6 που υπάρχουν. Να θυμάστε ότι οι φορείς εκμετάλλευσης bitwise είναι όπως όταν κάνεις 3 + 4. Δεν ασχολούνται με το δυαδικό του 3 και 4. Με bitwise φορείς που είναι στην πραγματικότητα ασχολούνται με τα επιμέρους κομμάτια από τους αριθμούς 3 και 4. Έτσι, το πρώτο που θα πω είναι bitwise όχι, και το μόνο που κάνει είναι να αναστρέψετε όλα τα κομμάτια. Μέχρι εδώ, αν είστε γραπτώς αυτό σε C, δεν θα το γράψω ως ~ 11011 ή οτιδήποτε άλλο, θα πρέπει να γράφεις αρέσει ~ 4, και στη συνέχεια θα αναστρέψετε την δυαδική αναπαράσταση του 4. Έτσι, εδώ, ~ κάποιου δυαδικό αριθμό 1101101 πρόκειται να αναστρέψετε ακριβώς όλα 1 στο 0 και όλα τα 0 στα 1 του. Όπως είπα εκεί, η συχνή χρήση αυτής, και θα το δούμε σε λίγο, είναι σαν να θέλουμε να καταλήξουμε σε κάποιο αριθμό όπου όλα τα bits είναι 1, εκτός από ένα από αυτά. Έτσι είναι συνήθως πιο εύκολο να εκφράσουν τον αριθμό όπου ακριβώς ότι και μόνο bit έχει οριστεί, και στη συνέχεια να λάβει την ~ του, έτσι ώστε κάθε άλλο κομμάτι έχει οριστεί, εκτός από εκείνο το ένα. Οπότε αυτό είναι που θα πάμε να χρησιμοποιούν περισσότερο σε λίγο. Bitwise ή. Εδώ είναι 2 δυαδικούς αριθμούς, και αυτά τα 2 αριθμούς είναι αρκετά αντιπροσωπευτικό, δεδομένου ότι αντιπροσωπεύουν κάθε δυνατή συνδυασμός των bit που θα μπορούσε να χρειαστεί να λειτουργήσει. Εδώ, όταν or'd κάθε λίγο, είμαστε ακριβώς πρόκειται να συγκριθούν κατ 'ευθείαν κάτω. Έτσι, στην αριστερή πλευρά έχουμε μια 1 και 1. Όταν bitwise | εκείνων, τι είμαι πρόκειται να πάρει; Ένα. Στη συνέχεια bitwise | 0 και 1 δεν πρόκειται να μου δώσει; Ένα. Bitwise 1 και 0 πρόκειται να είναι το ίδιο πράγμα, ένα. Bitwise 0 | 0 πρόκειται να μου δώσει 0. Έτσι, η μόνη περίπτωση όπου παίρνω το 0 είναι το 0 | 0 υπόθεσης. Και μπορείτε να σκεφτείτε ότι όπως ακριβώς λογική ΙΑΠ σας. Έτσι, αν νομίζετε ότι από 1 ως αληθινή και 0 false, το ίδιο ισχύει και εδώ. Έτσι αλήθεια ή αλήθεια είναι αλήθεια? Αληθής ή ψευδής είναι αλήθεια. Ψευδείς ή αλήθεια είναι αλήθεια? Ψευδής ή ψευδής είναι το μόνο πράγμα που είναι πραγματικά λάθος. Εδώ είναι το παράδειγμα που πρέπει να ξέρετε ως ένα πολύ καλό παράδειγμα του όταν bitwise τελεστές που χρησιμοποιούνται. Εδώ αν θέλουμε ή του κεφαλαίου «Α» με OX20, και θα δούμε αυτά σε ένα δεύτερο, παίρνουμε κάτι. Και αν εμείς ή πεζό «α» με OX20, έχουμε πάρει κάτι. Οπότε ας σηκώσει τον πίνακα ASCII. Εντάξει. Εδώ βλέπουμε ότι «Α» είναι - εδώ έχουμε «Α» είναι δεκαδικός 65. Αλλά εγώ θα πάω με το δεκαεξαδικό, η οποία είναι Ox41. Αρκετά σίγουρος είδαμε στην τάξη. Νομίζω ότι είδαμε στην τάξη ότι είναι αρκετά εύκολο να μετατρέψετε από δεκαεξαδικό σε δυαδικό. Έτσι, εδώ, αν θέλετε να βάλετε 4 σε δυαδικό, αυτό είναι ακριβώς πρόκειται να είναι 0100. Αυτό είναι 1 του θέση, τη θέση 2, τον τόπο 4, οπότε αυτό είναι 4. Τότε μπορώ να χωριστεί 1 σε δυαδικό, το οποίο πρόκειται να είναι το 0001. Και έτσι αυτό πρόκειται να είναι η αναπαράσταση της «Α» σε δυαδική. Λαμβάνοντας πεζά γράμματα «α», είναι τώρα πρόκειται να είναι Ox61, όπου, διάσπαση αυτών επάνω σε δυαδικό του, έτσι, ένα 6 - Ας το κάνουμε πραγματικότητα - δεν είναι γόμα εκεί; Eraser. Ox61. Έτσι, ο διαχωρισμός 6 σε δυαδικό πρόκειται να είναι 0 + 4 + 2 + 0. Και σχισίματος 1 θα είναι 0001. Κοιτάζοντας τη διαφορά μεταξύ αυτών των 2, βλέπουμε ότι η μόνη διαφορά ανάμεσα σε ένα πεζό και κεφαλαίο «Α» είναι το ενιαίο κομμάτι. Έτσι, επιστρέφουν εδώ - εντάξει. Επιστρέφοντας εδώ, αν κοιτάξουμε τι το bit OX20 είναι, επομένως ο διαχωρισμός του OX20 σε δυαδικό του, είναι 0010, 0000. OX20, το μόνο κομμάτι που έχει οριστεί είναι το κομμάτι που μας απασχολεί, με την εναλλαγή μεταξύ κεφαλαίων και πεζών «ένα». Αν ήμουν ή «Α», το οποίο είναι αυτό, «Α», αν ή 'A' με OX20, τι είμαι πρόκειται να πάρει; [Student, δεν ακούγεται] Πεζά «α», επειδή πρόκειται να αναστρέψετε αυτό το κομμάτι σε ένα 1. Και αν εγώ ή «a» με OX20, τι είμαι πρόκειται να πάρει; Πεζά ένα, επειδή ακριβώς oring «α» με OX20, Είμαι ακριβώς πρόκειται να oring αυτό το μοναδικό κομμάτι σε 1? Είναι ήδη 1, οπότε δεν έχει σημασία. Έτσι έχουμε «α» και «a». Bitwise και. Και πάλι, μπορούμε να σκεφτούμε αυτό ως λογικό και μας ομόλογό του. Από την αριστερή πλευρά έχουμε πραγματική και αληθινή. Είναι πρόκειται να είναι αληθινό, και για όλες τις περιπτώσεις, ψευδείς και αληθινή ή αλήθεια και ψευδείς, ή ψευδής και ψευδής, κανένα από αυτά τα πράγματα είναι αλήθεια. Έτσι, αυτό που καταλήγουμε να πάρει είναι το 1000. Έτσι, τώρα, εδώ, εδώ είναι που έχω χρησιμοποιήσει το έμπιστος bitwise όχι, όπου είχαμε OX20. Έτσι, αυτό είναι OX20. Τώρα αυτό που θέλω να κάνω, bitwise ~ του OX20. Αυτό πρόκειται να αναστρέψετε όλα τα κομμάτια. Έτσι έχω 1101, 1111. Και έτσι «Α» anded με ~ OX20 πρόκειται να μου δώσει ό, τι; Το μόνο κομμάτι που πρέπει πραγματικά να σκεφτούμε είναι αυτό, δεδομένου ότι, εάν όλα αυτά τα δυαδικά ψηφία έχουν οριστεί σε 1, Στη συνέχεια θα πάμε για να πάρει ακριβώς αυτό που «Α» ήταν, εκτός, ενδεχομένως, αυτό το bit αυτό είναι. Γιατί αν ήταν 1, τώρα πρόκειται να τεθεί σε 0, γιατί ό, τι είναι αυτό, anded με αυτό πρόκειται να είναι 0. Έτσι τι είναι «Α» & ~ OX20 πρόκειται να μου δώσει; [Φοιτητές απαντήσει, δεν ακούγεται] Και τι είναι «a» και - είναι «Α». Και τι είναι «a» & ~ OX20 πρόκειται να μου δώσει; «Α.» Επειδή αυτό είναι σήμερα μια 1. Anding με αυτό 0 πρόκειται να κάνουν ένα 0, και τώρα θα πάμε να πάρετε ένα «Α». Και οι δύο είναι «Α», και τελευταίο αλλά όχι λιγότερο από αυτού του τύπου, έχουμε XOR. Είναι πολύ παρόμοια ή, εκτός από αυτό σημαίνει αποκλειστικά ή. Αυτό είναι σαν αυτό που συνήθως σκέφτονται όπως και στον πραγματικό κόσμο. Έτσι, μπορείτε να κάνετε είτε «x» ή «y», αλλά όχι και τα δύο. Εδώ 1 ^ 1 θα είναι 0. Επειδή η αλήθεια, αυτό είναι - δεν λειτουργεί τόσο καλά με τη λογική αληθινό και το ψεύτικο όπως bitwise & ή να κάνετε, αλλά αληθινό ^ αλήθεια είναι ψευδής. Επειδή θέλουμε μόνο να επιστρέψει true αν μόνο ένα από αυτά είναι αλήθεια. Έτσι, 1 ^ 1 είναι 0. Τι γίνεται με 0 ^ 1; Είναι 1. 1 ^ 0 είναι 1, 0 ^ 0 είναι 0. Έτσι, κάτω από όλες τις συνθήκες, 0 0 bitwise κάτι πρόκειται να είναι 0. 1 bitwise κάτι 0 ή 0 bitwise 1, αν είναι | ή ^, αυτό θα είναι ένα 1, και αν είναι και θα είναι 0. Και η μόνη περίπτωση όπου 1 bitwise 1 δεν είναι η 1η είναι με αποκλειστική ή. Αυτό είναι 0110. Έτσι, εδώ και τώρα, με τη χρήση XOR - έτσι είμαστε πίσω στο 20. «Α» ^ OX20 είναι αυτά τα 2 bits εμείς συγκρίνουμε. Έτσι, ένα 1 ^ 0 πρόκειται να μου δώσει ένα τι; Μια μοναδική. ^ OX20 πρόκειται «Α» για να μου δώσει; Πεζά ένα. «Α» ^ OX20 πρόκειται να μου δώσει; Κεφαλαίου Α. Επειδή ό, τι αυτό που κάνει, αυτό XORing με OX20 αποτελεσματικά ρίχνεις ό, τι αυτό το bit. Εάν αυτό είναι ένα 0, είναι τώρα πρόκειται να γίνει 1. Δεδομένου ότι αυτό είναι ένα 1, 1 ^ 1 είναι 0. Έτσι μας «α» έχει γίνει «Α» και μας «Α» έχει γίνει «ένα». Έτσι XOR είναι ένα πολύ βολικό τρόπο μόνο αλλάζουμε την υπόθεση. Μπορείτε απλά θέλετε να μετακινηθείτε σε μια σειρά από επιστολές και εναλλάσσονται την περίπτωση του κάθε χαρακτήρα, απλά XOR πάντα με OX20. Τώρα έχουμε αριστερή στροφή. Αριστερή στροφή είναι ακριβώς πρόκειται να, βασικά, ωθήσει όλους τους αριθμούς σε ή προς τα αριστερά, και τοποθετήστε 0 πίσω τους. Έτσι, εδώ έχουμε 00001101. Εμείς πάμε για να ωθήσει 3 σε 0 από τα δεξιά, και παίρνουμε 01101000. Σε μη δυαδικές όρους, θα δούμε ότι αυτό είναι πραγματικά ασχολούνται 13 αριστερά-μετατοπίστηκε με 3, η οποία μας δίνει 104. Έτσι αριστερή στροφή, βλέπουμε εδώ, x << y είναι βασικά x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 είναι 8, οπότε 13 * 8 είναι 104. Αν απλά σκεφτείτε δυαδικό σε γενικές γραμμές, πώς κάθε ψηφίο, αν αρχίσουμε από τα δεξιά, είναι η 1η του θέση, τότε η θέση του 2, τότε η θέση του είναι 4. Έτσι, πιέζοντας 0 από τα δεξιά, είμαστε απλά πιέζοντας τα πράγματα που ήταν στη θέση του 4 στην θέση του 8, το και πράγματα που ήταν στη θέση του 8 στην θέση του 16 του. Κάθε στροφή πολλαπλασιάζει μόνο με 2. Ναι; [Φοιτητής] Τι θα συμβεί αν μετατοπιστεί από 5; [Bowden] Αν μετατοπιστεί κατά 5 θα χάσει μόνο ψηφία. Αναπόφευκτα, αυτό είναι το ίδιο πράγμα. Όπως, ακέραιοι αριθμοί είναι μόνο 32 bits, οπότε αν μπορείτε να προσθέσετε 2 πραγματικά μεγάλα ακέραιοι, απλά δεν ταιριάζει σε έναν ακέραιο. Έτσι είναι το ίδιο πράγμα εδώ. Αν μετατοπιστεί από 5, θα χάσει μόνο το ένα. Και αυτό είναι το είδος του τι εννοώ με "περίπου" όπου κι αν αλλάξει πάρα πολύ μακριά, θα χάσετε bits. Δεξιά στροφή πρόκειται να είναι το αντίθετο, όπου θα πάμε για να σπρώξουν τα 0 από το τέλος, και για τους σκοπούς μας, συμπληρώστε 0 από τα αριστερά. Έτσι, για να γίνει αυτό, είμαστε ουσιαστικά αναιρώντας όσα είχαμε ήδη κάνει. Και βλέπουμε ότι οι τρεις 0 σχετικά με το δικαίωμα που μόλις πέσει, και έχουμε ωθήσει το 1101 σε όλη τη διαδρομή προς τα δεξιά. Αυτό κάνει 104 3, η οποία είναι, ουσιαστικά, x / 2 ^ y. Έτσι, τώρα, εδώ, είναι μια παρόμοια ιδέα. Γιατί είναι ακριβώς περίπου x / 2 ^ y, και όχι πραγματικά x / 2 ^ y; Γιατί αν είχε μετατοπιστεί από 4, θα είχα χάσει ένα 1. Βασικά, αυτό που σκέφτεστε, απλά σκεφτείτε διαίρεσης σε γενικές γραμμές. Έτσι, όπως το 5/2 2. Δεν είναι 2.5. Είναι η ίδια ιδέα εδώ. Όταν χωρίζουν από 2, μπορούμε να χάσουμε περίεργα κομμάτια κατά μήκος του τρόπου. Έτσι τώρα - αυτό είναι για bitwise. Αυτό είναι όλα όσα χρειάζεται να ξέρετε. Θυμηθείτε τις περιπτώσεις χρήσης που είδαμε στην τάξη, όπως μια μάσκα bit είναι χρήσιμο για bitwise φορείς, ή μπορείτε να τα χρησιμοποιήσετε για μάσκες bit. Κεφαλαία και πεζά γράμματα, μετατροπές είναι μια αρκετά πρωτότυπη παράδειγμα. Εντάξει, έτσι buffer overflow επιθέσεις. Όποιος θυμάται τι ήταν λάθος με αυτή τη λειτουργία; Ανακοίνωση δηλώσαμε μια σειρά από 12 bytes, 12 χαρακτήρες, και στη συνέχεια να αντιγράψετε σε ρυθμιστικό μας από 12 χαρακτήρες ολόκληρη η μπάρα χορδή. Έτσι, ποιο είναι το πρόβλημα εδώ; Ο μαγικός αριθμός 12 θα πρέπει να εμφανιστεί λίγο πολύ αμέσως ως - γιατί 12; Τι θα συμβεί αν bar συμβαίνει να είναι περισσότερο από 12 χαρακτήρες; Τι θα συμβεί αν το μπαρ είναι τα εκατομμύρια των χαρακτήρων; Εδώ το θέμα είναι memcpy. Εάν η γραμμή είναι αρκετά μεγάλο χρονικό διάστημα, θα είναι ακριβώς τελείως - «c», «c» δεν με νοιάζει ότι ήταν μόνο 12 χαρακτήρες? «C» δεν νοιάζεται ότι δεν μπορεί να χωρέσει ότι πολλές bytes. Θα αντικαταστήσει μόνο εντελώς χαρακτηριστικά, τα 12 bytes έχουμε διατίθενται γι 'αυτό, και ό, τι το παρελθόν στη μνήμη που στην πραγματικότητα δεν ανήκουν σε αυτό το ρυθμιστικό με ό, τι η γραμμή string είναι. Έτσι, αυτή ήταν η εικόνα που είδαμε στην τάξη όπου έχουμε stack μας μεγαλώνουν. Θα πρέπει να χρησιμοποιείται σε αυτές τις εικόνες ή να εξοικειωθεί μαζί τους και πάλι. Έχουμε stack μας μεγαλώνουν, διευθύνσεις μνήμης ξεκινούν από το 0 στην κορυφή και μεγαλώνει προς τα κάτω για να αρέσει 4 δισ. στο κάτω μέρος. Έχουμε σειρά μας «c» κάπου στη μνήμη, τότε έχουμε το δείκτη μας να απαγορεύσει το δικαίωμα κάτω από αυτό, και στη συνέχεια να έχουμε αυτήν την αποθηκευμένη δείκτη πλαισίου σε διεύθυνση επιστροφής μας και στοίβα μητρική μας ρουτίνα του. Θυμηθείτε τι η διεύθυνση επιστροφής είναι; Είναι κατά κύριο καλεί μια συνάρτηση foo, καλεί μια γραμμή λειτουργιών, αναπόφευκτα, μπαρ αποδόσεις. Έτσι, όταν επιστρέφει bar, πρέπει να ξέρουν ότι πρόκειται πίσω στο foo που ονομάζεται. Έτσι, η διεύθυνση του αποστολέα είναι η διεύθυνση της συνάρτησης που πρέπει να επιστρέψει, όταν οι αποδόσεις λειτουργίας. Ο λόγος που είναι σημαντικό για τις επιθέσεις υπερχείλισης buffer είναι επειδή, βολικά, hackers θέλατε να αλλάξετε αυτήν τη διεύθυνση επιστροφής. Αντί να πηγαίνουν πίσω στο foo, Πάω να πάει πίσω όπου ο χάκερ θέλει να πάει πίσω. Και, βολικά, όπου ο χάκερ θέλει συχνά να πάει πίσω στο είναι η αρχή του buffer που είχε αρχικά. Έτσι παρατηρούμε, και πάλι, Little Indian. Η συσκευή είναι ένα παράδειγμα ενός συστήματος Little Indian, έτσι ώστε ένας ακέραιος ή ένας δείκτης αποθηκεύεται με τις ψηφιολέξεις αντιστραφεί. Έτσι, εδώ βλέπουμε - είναι αυτό; Ναι. Βλέπουμε Ox80, OxC0, ΟΧ35, OxO8. Θυμηθείτε τα δεκαεξαδικά ψηφία; Εμείς δεν μπορούν να ανατρέψουν τα δεκαεξαδικά ψηφία σε Little Indian, γιατί 2 δεκαεξαδικά ψηφία συνθέτουν ένα byte, και να αναστρέψει τα bytes. Αυτός είναι ο λόγος για τον οποίο δεν αποθηκεύουν, όπως, 80530CO8. Εμείς αποθηκεύουν, αντ 'αυτού, κάθε ζεύγος 2 ψηφία, αρχίζοντας από τα δεξιά. Αυτή η διεύθυνση αναφέρεται στη διεύθυνση της έναρξης ρυθμιστικού μας που πραγματικά ήθελε να αντιγράψετε στην πρώτη θέση. Ο λόγος που είναι χρήσιμο είναι γιατί, τι και αν ο εισβολέας συνέβη, αντί να έχουν ένα string που μόλις ένα αβλαβές σειρά, όπως, το όνομα τους ή κάτι τέτοιο, τι θα γινόταν αν, αντίθετα, ότι η σειρά ήταν μερικά μόνο αυθαίρετου κώδικα που έκανε ό, τι ήθελε να κάνει; Έτσι, θα μπορούσαν - Δεν μπορώ να σκεφτώ κάποιο δροσερό κώδικα. Θα μπορούσε να είναι οτιδήποτε, όμως. Κάθε καταστροφικό κώδικα. Αν ήθελαν, θα μπορούσαν να κάνουν ακριβώς κάτι σε seg ελαττώματα, αλλά αυτό θα ήταν άσκοπο. Συνήθως το κάνουν για να χαράξει το σύστημά σας. Εντάξει. Βιβλιοθήκη CS50. Αυτό είναι, κατά βάση, getInt, GetString, όλες αυτές οι λειτουργίες που παρέχονται για σας. Έτσι έχουμε char * string, και αυτή είναι η αφαίρεση που φύσηξε μακριά σε κάποιο σημείο κατά τη διάρκεια του εξαμήνου. Να θυμάστε ότι ένα string είναι απλά μια σειρά από χαρακτήρες. Έτσι, εδώ βλέπουμε μια συντομευμένη έκδοση του GetString. Θα πρέπει να κοιτάξουμε πίσω σε αυτό για να θυμηθούμε πώς είναι στην πραγματικότητα. Βασικά στοιχεία είναι, να παρατηρήσετε έχουμε σε ένα ενιαίο χαρακτήρα, σε μια εποχή από πρότυπο, το οποίο είναι ακριβώς όπως μας πληκτρολογώντας στο πληκτρολόγιο. Έτσι, ένας χαρακτήρας σε έναν χρόνο, και αν έχουμε πάρα πολλούς χαρακτήρες, οπότε αν n + 1 είναι μεγαλύτερη από την ικανότητα, τότε θα πρέπει να αυξήσουν την ικανότητα του ρυθμιστικού μας. Έτσι, εδώ είμαστε διπλασιάζοντας το μέγεθος της προσωρινής μνήμης μας. Και αυτό συνεχίζει να πηγαίνει? Εισάγουμε το χαρακτήρα σε ρυθμιστικό μας μέχρι να λάβουμε μια νέα γραμμή ή στο τέλος του αρχείου ή οτιδήποτε άλλο, στην οποία περίπτωση, τελειώσαμε με κορδόνι και στη συνέχεια το πραγματικό GetString συρρικνώνει τη μνήμη, όπως και αν έχει χορηγηθεί πάρα πολύ μνήμη θα πάει πίσω και να συρρικνωθεί λίγο. Γι 'αυτό και δεν αποδεικνύουν ότι, αλλά η βασική ιδέα είναι πρέπει να διαβαστεί σε ένα μόνο χαρακτήρα σε μια στιγμή. Δεν μπορούμε έτσι απλά να διαβάσετε σε ένα όλο θέμα με τη μία, επειδή ρυθμιστικό τους είναι μόνο από ένα ορισμένο μέγεθος. Έτσι, αν το string που προσπαθεί να εισαγάγει σε buffer είναι πολύ μεγάλο, τότε θα ξεχειλίσει. Έτσι, εδώ έχουμε εμποδίσει το μόνο ανάγνωση σε ένα ενιαίο χαρακτήρα σε έναν χρόνο και αυξάνεται κάθε φορά που το χρειάζεστε. Έτσι getInt και οι άλλες λειτουργίες της βιβλιοθήκης CS50 τείνουν να χρησιμοποιούν GetString στις εφαρμογές τους. Γι 'αυτό και τόνισε τα σημαντικά πράγματα εδώ. Καλεί GetString να πάρετε ένα string. Αν GetString απέτυχε να επιστρέψει μνήμη, να θυμάστε ότι GetString mallocs κάτι, έτσι ώστε κάθε φορά που θα καλέσετε GetString δεν θα πρέπει να (ακατάληπτο) δωρεάν αυτό το αλφαριθμητικό που έχεις. Τόσο εδώ, αν δεν malloc κάτι, επιστρέφουμε INT_MAX ως απλά μια σημαία που, hey, δεν ήταν πραγματικά σε θέση να πάρετε έναν ακέραιο. Θα πρέπει να αγνοήσουμε ό, τι έχω επιστρέψει σε εσάς, ή δεν θα πρέπει να θεωρήσει ότι πρόκειται για ένα έγκυρο εισόδου. Τέλος, αν υποτεθεί ότι τα κατάφερε, χρησιμοποιούμε sscanf με το εν λόγω ειδικό σημαία, πράγμα που σημαίνει, πρώτα ταιριάζει έναν ακέραιο, στη συνέχεια να ταιριάζουν χαρακτήρες μετά την ακέραιος. Έτσι παρατηρήσετε θέλουμε να ισούται με 1. Έτσι sscanf αποδόσεις πόσα παιχνίδια, αν γίνει με επιτυχία; Θα επιστρέψει 1 αν συνδυάζεται με επιτυχία έναν ακέραιο, θα επιστρέψει 0 αν δεν ταιριάζει με έναν ακέραιο, και θα επιστρέψει 2 αν συνδυάζεται ένας ακέραιος που ακολουθείται από κάποιο χαρακτήρα. Έτσι θα παρατηρήσετε επαναλάβετε αν ταιριάζει με τίποτα, αλλά 1. Έτσι, αν μπήκαμε 1, 2, 3, C, ή 1, 2, 3, X, τότε 1, 2, 3 θα πάρει αποθηκεύονται στο ακέραιο, X θα πάρει αποθηκεύονται στο χαρακτήρα, sscanf θα επιστρέψει 2, και θα επαναλάβετε, γιατί θέλουμε μόνο έναν ακέραιο. Γρήγορα φυσά μέσω HTML, HTTP, CSS. HyperText Markup Language είναι η δομή και τη σημασιολογία του web. Εδώ είναι το παράδειγμα από διάλεξη όπου έχουμε HTML tags. Έχουμε ετικέτες κεφάλι, ετικέτες σώματος, έχουμε παραδείγματα κενές ετικέτες όπου στην πραγματικότητα δεν έχουν μια αρχή και σε tag κλεισίματος, έχουμε μόνο σύνδεση και την εικόνα. Δεν υπάρχει ετικέτα εικόνας κλεισίματος? Υπάρχει μόνο μια ενιαία ετικέτα που θα επιτυγχάνει πάντα η ετικέτα πρέπει να κάνει. Ο σύνδεσμος είναι ένα παράδειγμα? Θα δούμε πώς θα συνδεθούν με CSS, το σενάριο είναι ένα παράδειγμα του πώς θα συνδέσετε σε μια εξωτερική JavaScript. Είναι αρκετά απλό, και να θυμάστε, HTML δεν είναι μια γλώσσα προγραμματισμού. Εδώ, θυμάστε πώς θα ορίσετε μια φόρμα ή τουλάχιστον ό, τι αυτό θα κάνουμε; Μια τέτοια μορφή έχει μια δράση και μια μέθοδο. Οι μέθοδοι που θα δείτε μόνο ποτέ είναι GET και POST. Έτσι GET είναι η έκδοση, όπου το πράγμα παίρνει θέσει στη διεύθυνση URL. POST είναι όταν δεν έχει τεθεί στη διεύθυνση URL. Αντ 'αυτού, όλα τα δεδομένα από τη φόρμα εισάγεται πιο κρυφά στην αίτηση HTTP. Μέχρι εδώ, η δράση καθορίζει όταν η αίτηση HTTP πηγαίνει. Όταν πρόκειται είναι google.com / search. Μέθοδος. Θυμηθείτε τις διαφορές μεταξύ GET και POST, και, απλώς να πω ως παράδειγμα, αν θέλετε να προσθέσετε κάτι. Ποτέ δεν θα είναι σε θέση να σελιδοδείκτη μια διεύθυνση URL POST επειδή τα δεδομένα δεν περιλαμβάνεται στη διεύθυνση URL. HTTP, τώρα, είναι το πρωτόκολλο μεταφοράς υπερκειμένου. Η το Hypertext Transfer Protocol, θα περίμενε κανείς να μεταφέρει HyperText Markup Language, και το κάνει. Αλλά μεταφέρει επίσης τις εικόνες μπορείτε να βρείτε στο διαδίκτυο, τυχόν λήψεις σας κάνει να ξεκινήσει ως ένα αίτημα HTTP. Έτσι HTTP είναι μόνο η γλώσσα του World Wide Web. Και εδώ θα πρέπει να αναγνωρίσει αυτό το είδος της αίτησης HTTP. Εδώ HTTP/1.1 από την πλευρά απλά λέει ότι είναι η έκδοση του πρωτοκόλλου είμαι με τη χρήση. Είναι λίγο πολύ πάντα θα είναι HTTP/1.1, όπως θα το δείτε. Στη συνέχεια, θα δούμε ότι αυτό ήταν GET, η εναλλακτική λύση είναι POST, που μπορείτε να δείτε. Και η διεύθυνση URL που προσπαθούσα να επισκεφθείτε ήταν www.google.com/search?q = μπλα, μπλα, μπλα. Έτσι, να θυμάστε ότι αυτό, το q ερωτηματικό = μπλα μπλα μπλα, είναι το είδος της ουσίας που υποβάλλεται από μια φόρμα. Η απάντηση θα μπορούσε να επιστρέψει σε μένα, θα δούμε κάτι σαν αυτό. Ξανά, ξεκινώντας με το πρωτόκολλο, η οποία πρόκειται να είναι ότι, ακολουθούμενο από τον κωδικό κατάστασης. Εδώ είναι 200 ​​OK. Και τέλος, η ιστοσελίδα που έχω πραγματικά ζητήσει θα ακολουθήσει. Η πιθανή κωδικός κατάστασης μπορείτε να δείτε, και θα πρέπει να γνωρίζετε αρκετά από αυτά. 200 OK πιθανότατα έχετε δει πριν. 403 Forbidden, 404 Not Found, Σφάλμα 500 Internal Server είναι συνήθως, αν πάτε σε μια ιστοσελίδα και κάτι σπασμένα ή διακόπτεται η λειτουργία PHP κώδικα τους, λαμβάνοντας υπόψη ότι στη συσκευή που έχουμε τόσο μεγάλο πορτοκαλί κουτί που έρχεται και λέει, όπως, κάτι δεν πάει καλά, αυτός ο κώδικας δεν λειτουργεί ή αυτής της συνάρτησης κακό. Συνήθως ιστοσελίδες δεν θέλουν να γνωρίζουν ποιες λειτουργίες θα είναι πραγματικά κακό, έτσι ώστε αντί να σας δώσω μόνο 500 Εσωτερικό Λάθη Server. TCP / IP είναι 1 στρώμα κάτω από το HTTP. Να θυμάστε ότι δεν υπάρχει στο Διαδίκτυο έξω από το World Wide Web. Όπως και αν μπορείτε να παίξετε ένα online παιχνίδι που δεν περνούν HTTP, πρόκειται μέσα από μια διαφορετική - είναι ακόμα χρησιμοποιούν το Διαδίκτυο, αλλά δεν χρησιμοποιούν το πρωτόκολλο HTTP. HTTP είναι ένα μόνο παράδειγμα του πρωτοκόλλου χτισμένο σε TCP / IP. IP κυριολεκτικά σημαίνει Internet Protocol. Κάθε υπολογιστής έχει μια διεύθυνση IP? Είναι αυτά τα 4-ψήφιο πράγματα όπως 192.168.2.1, ή οτιδήποτε άλλο? που τείνει να είναι ένα τοπικό μία. Αλλά αυτό είναι το πρότυπο μιας διεύθυνσης IP. Έτσι, το DNS, Domain Name Service, αυτό είναι που μεταφράζει τα πράγματα όπως google.com σε μια πραγματική διεύθυνση IP. Έτσι, αν πληκτρολογήσετε ότι η διεύθυνση IP σε μια διεύθυνση URL, που θα σας φέρει στο Google, αλλά έχετε την τάση να μην θυμόμαστε αυτά τα πράγματα. Έχετε την τάση να θυμόμαστε google.com αντ 'αυτού. Το τελευταίο πράγμα που έχουμε είναι τα λιμάνια, όπου αυτό είναι το μέρος του TCP IP. TCP κάνει περισσότερα. Σκεφτείτε, όπως, έχετε web browser σας λειτουργία. Ίσως έχετε κάποια εφαρμογή που τρέχει email? ίσως έχετε κάποιο άλλο πρόγραμμα που χρησιμοποιεί τη λειτουργία του Διαδικτύου. Όλοι πρέπει να έχουν πρόσβαση στο Διαδίκτυο, αλλά ο υπολογιστής σας έχει μόνο 1 κάρτα WiFi ή οτιδήποτε άλλο. Έτσι, τα λιμάνια είναι ο τρόπος που είμαστε σε θέση να χωρίσουν πώς αυτές οι εφαρμογές είναι σε θέση να χρησιμοποιούν το Διαδίκτυο. Κάθε αίτηση παίρνει 1 συγκεκριμένη θύρα που μπορεί να ακούσετε για, και από προεπιλογή, HTTP χρησιμοποιεί τη θύρα 80. Ορισμένες υπηρεσίες ηλεκτρονικού ταχυδρομείου χρησιμοποιούν 25. Οι χαμηλές αριθμημένα αυτά τείνουν να διατηρούνται. Είστε συνήθως σε θέση να πάρει υψηλότερη αρίθμηση αυτά για τον εαυτό σας. CSS, Cascading Style Sheets. Ιστοσελίδες Εμείς στυλ με CSS, όχι με HTML. Υπάρχουν 3 μέρη που μπορείτε να βάλετε CSS σας. Μπορεί να είναι inline, μεταξύ ετικέτες στυλ, ή σε ένα εντελώς ξεχωριστό αρχείο και στη συνέχεια συνδέονται μέσα Και εδώ είναι μόνο ένα παράδειγμα του CSS. Θα πρέπει να αναγνωρίσουμε αυτό το μοτίβο, όπου το πρώτο παράδειγμα είναι ότι πλέον έχουμε να ταιριάζουν με την ετικέτα του σώματος, και εδώ είμαστε κεντράρισμα της ετικέτας του σώματος. Το δεύτερο παράδειγμα, που ταιριάζουν με το θέμα με ID υποσέλιδο, και είμαστε σε εφαρμογή ορισμένα στυλ για αυτό. Παρατηρήστε ότι ID footer κείμενο ευθυγραμμίζεται προς τα αριστερά, ενώ το σώμα κειμένου ευθυγραμμίζεται κέντρο. Τελικοί είναι μέσα στο σώμα. Θα Αντίθετα, text-align αριστερά, ακόμα και αν το σώμα λέει κέντρο text-align. Αυτό είναι όλο το μέρος υπερχείλιση του. Μπορείτε να έχετε - μπορείτε να καθορίσετε τα στυλ για το σώμα, και τότε τα πράγματα στο σώμα σας να καθορίσετε πιο συγκεκριμένες μορφές, και τα πράγματα λειτουργούν όπως θα περιμένατε. Πιο συγκεκριμένα προσδιοριστικά CSS υπερισχύει. Νομίζω ότι είναι. [Ali Nahm] Γεια σε όλους. Αν θα μπορούσα να πάρω μόνο την προσοχή σας. Είμαι Ali και είμαι πρόκειται να πάει μέσω της PHP και SQL πολύ γρήγορα. Έτσι, μπορούμε να αρχίσουμε. PHP είναι μικρή για PHP: Hypertext Preprocessor. Και όπως όλοι πρέπει να γνωρίζουν, είναι ένα server-side scripting γλώσσα, και το χρησιμοποιούμε για το πίσω άκρο των δικτυακών τόπων, και πώς το κάνει πολύ τους υπολογισμούς, το τμήμα πίσω από τα παρασκήνια. Σύνταξη. Δεν είναι όπως C, τι έκπληξη. Πρέπει πάντα να ξεκινήσω με την, αν μπορείτε να δείτε, το - δεν μπορώ να προχωρήσουμε. Μπορείτε να δείτε θα πρέπει να έχετε τα νέα είδη τιράντες και, στη συνέχεια, θα πρέπει να έχετε επίσης την php?. Αυτό είναι πάντα το πώς θα πρέπει να πλαισιώσει PHP κειμένου σας, ο κώδικας της PHP. Έτσι, δεν μπορεί απλώς να είναι όπως C, όπου μπορείτε να το είδος του να θέσει σε πρώτη. Θα πρέπει να το περιβάλλουν πάντα. Και τώρα, η κύρια σύνταξη είναι ότι όλες οι μεταβλητές πρέπει να ξεκινήσει με το χαρακτήρα $. Θα πρέπει να το κάνετε όταν τα ορισμό? Θα πρέπει να το κάνουμε όταν αναφέρεται σε αυτά αργότερα. Θα πρέπει να έχετε πάντα αυτό το $. Είναι ο καλύτερός σας φίλος, λίγο πολύ. Μπορείτε να το κάνετε όχι - σε αντίθεση με C, δεν χρειάζεται να βάλει το είδος της μεταβλητής τύπου είναι. Έτσι, ενώ χρειάζεστε το $, δεν χρειάζεται να θέσει, όπως, int x ή y εγχόρδων, και τα λοιπά, και τα λοιπά. Έτσι, μια μικρή διαφορά. Ως αποτέλεσμα αυτού, αυτό σημαίνει ότι η PHP είναι ένα ασθενώς τύπου. PHP είναι μια γλώσσα ασθενώς τύπου, και έχει ασθενώς πληκτρολογήσει μεταβλητές. Με άλλα λόγια, αυτό σημαίνει ότι μπορείτε να κάνετε εναλλαγή μεταξύ των διαφόρων ειδών των τύπων μεταβλητών. Μπορείτε να αποθηκεύσετε τον αριθμό σας 1 ως int, μπορείτε να το αποθηκεύσετε ως ένα string, και μπορείτε να το αποθηκεύσετε ως float, και όλα θα είναι ο αριθμός 1. Ακόμα κι αν είστε αποθήκευση σε διάφορες μορφές, είναι ακόμα - οι τύποι μεταβλητών εξακολουθούν να κατέχουν στο τέλος. Έτσι, αν δείτε εδώ, αν θυμάστε από το chipset 7, πολλοί από εσάς ίσως να είχε προβλήματα με αυτό. Δύο σύμβολα ισότητας, 3 ίσες σημάδια, 4 ίσα σημάδια. Εντάξει, υπάρχουν 4 σύμβολα ισότητας, αλλά υπάρχουν 2 και 3. Μπορείτε να χρησιμοποιήσετε 2 ίσες σημάδια για να ελέγξετε τις τιμές. Μπορεί να ελέγξει σε όλους τους τύπους. Έτσι, εάν μπορείτε να δείτε στο πρώτο παράδειγμα, Έχω num_int == num_string. Έτσι int σας και κορδόνι σας είναι τεχνικώς, 1, αλλά είναι διαφορετικών τύπων. Αλλά για το διπλό ίσον, αυτό θα εξακολουθεί να περάσει. Ωστόσο, για τα τριπλά ίσων, ελέγχει αξίας καθώς και τα διάφορα είδη. Αυτό σημαίνει ότι δεν πρόκειται να περάσει στην δεύτερη αυτή υπόθεση εδώ, Όπου και αν χρησιμοποιείτε 3 ίσες σημάδια αντ 'αυτού. Έτσι, αυτό είναι μια σημαντική διαφορά που θα πρέπει όλοι να έχουν δείξει τώρα. String συνένωση είναι ένα άλλο ισχυρό πράγμα που μπορείτε να χρησιμοποιήσετε σε PHP. Είναι βασικά ακριβώς αυτό το εύχρηστο συμβολισμό με την τελεία, και αυτό είναι το πώς μπορείτε να συνδέσετε χορδές μαζί. Έτσι, εάν έχετε γάτα και έχετε το σκυλί και θέλετε να βάλετε τις 2 σειρές από κοινού, μπορείτε να χρησιμοποιήσετε την περίοδο, και αυτό είναι το είδος του πώς λειτουργεί. Μπορείτε επίσης να τα τοποθετήσετε δίπλα στο άλλο, όπως μπορείτε να δείτε εδώ στο κάτω μέρος παράδειγμα, όπου έχω echo σειρά 1, χώρου συμβολοσειράς 2. PHP θα ξέρει για να τους αντικαταστήσουν ως τέτοια. Πίνακες. Τώρα, σε PHP, υπάρχουν 2 διαφορετικά είδη των συστοιχιών. Μπορείτε να έχετε τακτική συστοιχίες, και μπορείτε επίσης να έχετε συνειρμική συστοιχίες, και θα πάμε για να πάει μέσα από αυτά τώρα. Η τακτική συστοιχίες είναι ακριβώς αυτό στο C, και έτσι έχετε δείκτες που είναι αριθμημένες. Αυτή τη στιγμή είμαστε ακριβώς πρόκειται να δημιουργήσει και να θέσει ένα - έτσι αυτό είναι πώς θα δημιουργήσουμε έναν άδειο πίνακα, στη συνέχεια, θα πάμε να τεθούν σε αριθμό δείκτη 0. Εμείς πάμε για να βάλετε τον αριθμό 6, η τιμή 6. Μπορείτε να το δείτε στο κάτω μέρος εδώ. Where's - σε αριθμό 1 θα πάμε να θέσει τον αριθμό αξίας 4, και έτσι μπορείτε να δείτε υπάρχει ένα 6, υπάρχει ένα 4, και στη συνέχεια, όπως είμαστε εκτύπωση πράγματα, όταν προσπαθούμε και να εκτυπώσετε την τιμή που είναι αποθηκευμένη στον αριθμό δείκτη 0, Στη συνέχεια θα δούμε την τιμή 6 να εκτυπωθεί. Cool; Έτσι ώστε να είναι τακτική συστοιχίες για σας. Ένας άλλος τρόπος που μπορείτε επίσης να προσθέσετε τα πράγματα στην τακτική συστοιχίες τώρα είναι ότι μπορείτε να τους προσαρτήσετε μόνο στο τέλος. Αυτό σημαίνει ότι δεν χρειάζεται να καθορίσετε το συγκεκριμένο δείκτη. Μπορείτε να δείτε τον αριθμό, και στη συνέχεια, στις αγκύλες δεν υπάρχει δείκτης που ορίζεται. Και θα ξέρετε - PHP θα ξέρει για να το προσθέσετε ακριβώς στο τέλος της λίστας, το επόμενο ελεύθερο σημείο. Έτσι, μπορείτε να δείτε το 1 εκεί σε εκείνο το σημείο 0, το 2 πήγε εκεί στην πρώτη θέση. Το 3 πηγαίνει - προστίθεται εκεί. Έτσι, αυτό το είδος της νόημα. Είστε ακριβώς συνεχώς προσθέτοντας ότι, και στη συνέχεια, όταν κάνουμε τις ίδιες το δείκτη του αριθμού 1, θα εκτυπώνει την τιμή 2. Στη συνέχεια έχουμε πίνακες που είναι συνειρμική συστοιχίες. Associative arrays, αντί να έχουν αριθμητικές τιμές, αυτό που κάνουν είναι, έχουν δείκτες που είναι από κορδόνι. Μπορείτε να δείτε, αντί - Πήρα απαλλαγούμε από όλους αυτούς τους δείκτες αριθμό, και τώρα είναι key1, key2, key3, και είναι σε διπλά εισαγωγικά για να δηλώσει ότι είναι όλες οι χορδές. Έτσι, μπορούμε να έχουμε ένα παράδειγμα για αυτό. Το παράδειγμα αυτό είναι ότι έχουμε την tf, και αυτό είναι το όνομα του ευρετηρίου. Εμείς πάμε για να βάλει "Ali", όπως το όνομα, στο δείκτη, τις θερμίδες που καταναλώνονται, μπορούμε να βάλουμε ένα int αυτή τη φορά αντί για ένα string, και στη συνέχεια στους ομοίους του δείκτη, μπορούμε να βάλουμε μια ολόκληρη σειρά μέσα από αυτό. Έτσι, αυτό είναι το είδος της - είναι μια παρόμοια ιδέα για το πώς θα έπρεπε δείκτες με αριθμούς, αλλά τώρα μπορούμε να αλλάξουμε τους δείκτες γύρω να τους έχουν ως χορδές αντ 'αυτού. Μπορείτε επίσης να το κάνετε αυτό, εκτός από απλά να το κάνει μεμονωμένα, μπορείτε να κάνετε όλα σε ένα κομμάτι. Έτσι μπορείτε να δείτε ότι tf μέρους αυτής της διάταξης, και στη συνέχεια όλα αυτά που σε μια γιγάντια πλατεία σύνολο βραχίονα. Έτσι ώστε να επιταχυνθούν τα πράγματα. Είναι κάτι περισσότερο από ένα στυλιστικό επιλογή από όχι. Έχουμε επίσης βρόχους. Στη C έχουμε βρόχους που λειτουργούν σαν αυτό. Είχαμε σειρά μας, και πήγαμε από το δείκτη 0 στο τέλος της λίστας, και θα το εκτυπώσετε όλα, έτσι δεν είναι; Εκτός από το πρόβλημα είναι, για συστοιχίες συνειρμική, δεν ξέρουμε κατ 'ανάγκη τους αριθμητικούς δείκτες γιατί τώρα έχουμε τα string ευρετήρια. Τώρα χρησιμοποιούμε βρόχους foreach, η οποία, και πάλι, θα χρησιμοποιείται ελπίζουμε σε 7 από το chipset. Βρόχους foreach θα γνωρίζουν ακριβώς κάθε μέρος της λίστας. Και δεν πρέπει να γνωρίζουμε ακριβώς την αριθμητική δείκτη που έχετε. Έτσι έχετε τη σύνταξη foreach, γι 'αυτό είναι foreach, βάζετε τον πίνακα. Έτσι σειρά μου ονομάζεται το chipset, και στη συνέχεια, όπως η λέξη, όπως, και στη συνέχεια βάζετε αυτό το τοπικό προσωρινή μεταβλητή που πρόκειται να χρησιμοποιήσετε μόνο για το συγκεκριμένο πράγμα που πρόκειται να κρατήσει το συγκεκριμένο - ένα παράδειγμα ή ένα τμήμα του πίνακα. Το chipset της αναμέτρησης θα κρατήσει 1, και τότε ίσως θα κρατήσει τον αριθμό 6, και στη συνέχεια θα κρατήσει τον αριθμό 2. Αλλά αυτό είναι εγγυημένη για να περάσει μέσα από κάθε τιμή που είναι στον πίνακα. Χρήσιμες λειτουργίες που πρέπει να ξέρετε σε PHP είναι το απαιτούν, έτσι ώστε να εξασφαλίζει ότι είστε συμπεριλαμβανομένων ορισμένων αρχείων, ηχώ, την έξοδο, άδειο. I Συστήνουμε ιδιαίτερα να δούμε το chipset 7 και να δούμε αυτές τις λειτουργίες. Ίσως πρέπει να γνωρίζουν εκείνοι, έτσι σίγουρα θα ξέρω τι, ακριβώς, αυτά είναι όλα τα κάνει. Και τώρα θα πάμε να περάσουν από το πεδίο εφαρμογής πολύ γρήγορα. Στο πεδίο εφαρμογής, η PHP είναι το είδος της μια funky πράγμα, σε αντίθεση με C, και έτσι είμαστε ακριβώς πρόκειται να περάσει μέσα από αυτό γρήγορα. Ας πούμε ότι ξεκινάμε σε αυτό το βέλος που έχουμε εκεί. Και θα πάμε να ξεκινήσει με $ i. Έτσι, η μεταβλητή «i» πρόκειται να είναι 0, και είμαστε ακριβώς πρόκειται να κρατήσει το εκτυπώσετε σε αυτό το μεγάλο άσπρο κουτί εκεί. Εμείς πάμε για να ξεκινήσει με i0, και στη συνέχεια θα πάμε να το επαναλάβω. Έτσι, υπάρχει το 0. Και μετά θα πάμε για να αυξήσετε το βρόχο for, και στη συνέχεια πρόκειται να είναι η αξία του 1. Ένα είναι μικρότερο από 3, γι 'αυτό πρόκειται να περάσει μέσα από αυτό για το βρόχο, και στη συνέχεια θα πάμε να το δούμε να εκτυπωθεί ξανά. Εμείς πάμε για να την αυξήσετε και πάλι στο 2, και 2 είναι μικρότερο από 3, έτσι θα περάσει ο βρόχος for, και αυτό θα εκτυπώσετε το 2. Στη συνέχεια, θα σημειώσετε ότι το 3 δεν είναι μικρότερο από 3, οπότε θα βγούμε από το βρόχο for. Έτσι τώρα έχουμε φθάσει, και στη συνέχεια θα πάμε για να πάει σε aFunction. Εντάξει. Έτσι, θα πρέπει να σημειωθεί ότι αυτή η μεταβλητή που έχουμε δημιουργήσει, το «i» μεταβλητή, δεν είναι τοπικά πεδία. Αυτό σημαίνει ότι δεν είναι το τοπικό έως το βρόχο, και ότι η μεταβλητή που εξακολουθούν να έχουν πρόσβαση και να αλλάξει στη συνέχεια, και θα εξακολουθεί να είναι αποτελεσματική. Έτσι, αν πάτε σε λειτουργία τώρα, θα δείτε ότι μπορούμε επίσης να χρησιμοποιήσετε το «i» μεταβλητή, και θα πάμε για να αυξήσετε 'i' + +. Θα πίστευε κανείς ότι, σε πρώτη φάση, με βάση C, ότι αυτό είναι ένα αντίγραφο του «i» μεταβλητή. Είναι ένα εντελώς διαφορετικό πράγμα, το οποίο είναι σωστό. Έτσι, όταν το εκτυπώσετε, θα πάμε για να εκτυπώσετε το «i» + +, η οποία πρόκειται να εκτυπώσετε ότι το 4, και στη συνέχεια θα πάμε να - συγγνώμη. Στη συνέχεια θα πάμε στο τέλος από αυτή τη λειτουργία, και θα πάμε να είναι όταν η βέλος είναι τώρα. Αυτό σημαίνει ότι, στη συνέχεια, ωστόσο, ακόμη και αν η συνάρτηση αλλάξει την τιμή του «i», δεν αλλάζει εκτός της συνάρτησης, επειδή η συνάρτηση έχει ένα ξεχωριστό πεδίο. Αυτό σημαίνει ότι όταν έχουμε echo 'i', δεν έχει αλλάξει στο πεδίο της λειτουργίας, και έτσι τότε θα πάμε να εκτυπώσετε και πάλι 3. Διαφορετικά τα πράγματα σχετικά με το πεδίο εφαρμογής σε σχέση με το PHP C. Τώρα σε PHP και HTML. PHP χρησιμοποιείται για να κάνει δυναμικές ιστοσελίδες. Είναι το είδος της κάνει τα πράγματα διαφορετικά. Έχουμε διαφορετικό από HTML. Με την HTML, έχουμε πάντα ακριβώς το ίδιο στατικό πράγμα, όπως το πώς Rob έδειξε, λαμβάνοντας υπόψη ότι η PHP, μπορείτε να αλλάξετε τα πράγματα με βάση το ποιος είναι ο χρήστης. Έτσι, αν έχω αυτό, έχω, "Έχετε συνδεθεί ως -" και, στη συνέχεια, το όνομα, και μπορώ να αλλάξω το όνομα. Έτσι, αυτή τη στιγμή το όνομα Ιωσήφ, και έχει το "για μένα", αλλά στη συνέχεια μπορεί επίσης να αλλάξει το όνομα για να έχουν Tommy. Και αυτό θα είναι ένα διαφορετικό πράγμα. Έτσι, τότε μπορούμε να αλλάξουμε διαφορετικά πράγματα γι 'αυτόν, και θα δείξει διαφορετικό περιεχόμενο με βάση το όνομα. Έτσι, η PHP μπορεί να αλλάξει το είδος του τι συμβαίνει στην ιστοσελίδα σας. Το ίδιο κι εδώ. Ακόμα, σημειώστε ότι έχουν διαφορετικό περιεχόμενο, ακόμα κι αν είναι τεχνικά συνεχίζει να έχει πρόσβαση το ίδιο ιστοσελίδα στην επιφάνεια. Παραγωγή HTML. Υπάρχουν 2 διαφορετικοί τρόποι που μπορείτε να το κάνετε αυτό. Έτσι θα πάμε μέσα από αυτό το δικαίωμα τώρα. Ο πρώτος τρόπος είναι, έχετε - Ναι, συγγνώμη. Έτσι, μόλις έχετε τακτικές σας για βρόχο σε PHP, και τότε θα αντηχούν σε PHP και θα επαναλάβω έξω HTML. Χρησιμοποιώντας αυτό που σας έδειξα Rob της HTML script και στη συνέχεια, χρησιμοποιώντας την PHP εκτύπωσης για να εκτυπώσετε μόνο από την ιστοσελίδα. Ο εναλλακτικός τρόπος είναι να το κάνουμε σαν να διαχωριστούν από την PHP και την HTML. Έτσι μπορείτε να έχετε μια σειρά από PHP που ξεκινά ο βρόχος for, τότε μπορείτε να έχετε τη γραμμή του HTML σε ένα ξεχωριστό πράγμα, και τότε θα καταλήξουμε το βρόχο, και πάλι, με την PHP. Έτσι είναι το είδος του να διαχωρισμό. Στην αριστερή πλευρά, μπορείτε να έχετε όλα τα - Είναι μόλις 1 κομμάτι της PHP. Στα δεξιά μπορείτε να δείτε ότι έχετε μια σειρά από PHP, έχετε μια σειρά από HTML, και έχετε και πάλι μια σειρά από PHP. Έτσι, διαχωρίζοντας σε αυτό που κάνουν. Και θα σημειώσετε ότι σε κάθε περίπτωση, για οποιοδήποτε από αυτά, εξακολουθούν να εκτυπώσετε την εικόνα, η εικόνα, η εικόνα, έτσι ώστε HTML εξακολουθεί να είναι τυπωμένο με τον ίδιο τρόπο. Και τότε θα δείτε ακόμα τα 3 εικόνες εμφανίζονται στην ιστοσελίδα σας. Έτσι είναι 2 διαφορετικούς τρόπους για να κάνει το ίδιο πράγμα. Τώρα έχουμε τις μορφές και τα αιτήματα. Όπως Rob σας έδειξα, υπάρχουν μορφές HTML, και εμείς θα αεράκι μόνο μέσα από αυτό. Έχετε μια δράση και έχετε μια μέθοδο, και η δράση σας ευγενικό εκ μέρους σας, όπου θα πάμε για να το στείλετε δείχνει, και η μέθοδος είναι κατά πόσον πρόκειται να είναι ένα GET ή POST. Και μια αίτηση GET, όπως δήλωσε ο Rob, σημαίνει ότι θα πάμε για να το θέσω σε μια μορφή και θα το δείτε ως μια διεύθυνση URL, ενώ μια αίτηση POST δεν θα δείτε σε μια διεύθυνση URL. Έτσι, μια μικρή διαφορά. Ωστόσο, ένα πράγμα που είναι ένα παρόμοιο πράγμα είναι ότι POST και GET είναι εξίσου ανασφαλής. Έτσι, μπορείτε να σκεφτείτε ότι μόνο και μόνο επειδή εσείς δεν το βλέπετε στο URL, αυτό σημαίνει ότι το POST είναι πιο ασφαλής, αλλά μπορείτε να το δείτε στα cookies στις πληροφορίες που σας στέλνουμε. Έτσι, δεν νομίζω ότι περίπου το ένα ή το άλλο. Ένα άλλο πράγμα που πρέπει να σημειωθεί είναι ότι έχετε επίσης το τμήμα μεταβλητές. Εσείς που χρησιμοποιούνται σε αυτό το chipset 7 για να πάρει πληροφορίες για το όνομα χρήστη σας. Αυτό που συνέβη ήταν ότι μπορείτε να χρησιμοποιήσετε αυτό το associative πίνακα, το $ _SESSION, και τότε θα είστε σε θέση να έχουν πρόσβαση σε διαφορετικά πράγματα και να αποθηκεύουν διαφορετικά πράγματα σε όλες τις σελίδες. Τελευταία πράγμα είναι ότι έχουμε SQL, Structured Query Language, και αυτό είναι μια γλώσσα προγραμματισμού για τη διαχείριση των βάσεων δεδομένων. Τι, ακριβώς, είναι οι βάσεις δεδομένων; Είναι συλλογές πινάκων, και κάθε πίνακας μπορεί να έχει παρόμοια είδη αντικειμένων. Έτσι, είχαμε ένα τραπέζι των χρηστών όσον αφορά τη χρηματοδότηση από το chipset σας. Και γιατί είναι χρήσιμες; Επειδή είναι ένας τρόπος για την αποθήκευση πληροφοριών σε μόνιμη βάση. Είναι ένας τρόπος παρακολούθησης των πραγμάτων και τη διαχείριση των πραγμάτων και πραγματικά να δει σε διαφορετικές σελίδες και την τήρηση κομμάτι. Ότι, αν αποθηκεύετε ακριβώς εκείνη τη στιγμή ένα άμεσο και στη συνέχεια να το χρησιμοποιήσετε αργότερα, δεν θα είναι σε θέση να έχουν πρόσβαση σε κάτι που έχετε αποθηκεύσει. Έχουμε 4 σημαντικότερα πράγματα που χρησιμοποιούμε για τις εντολές SQL. Έχουμε select, insert, delete και update. Αυτά είναι πραγματικά σημαντικό για σας παιδιά να γνωρίζουν για το κουίζ σας. Θα μεταβείτε γρήγορα πάνω επιλέξτε αυτή τη στιγμή. Βασικά, εσείς την επιλογή γραμμών από μια βάση δεδομένων. Έτσι, εάν έχετε, ακριβώς εδώ - έχουμε αυτά τα 2 διαφορετικά πράγματα, και θέλουμε να επιλέξετε από τον πίνακα τάξεις όπου φοβερό - όπου το φοβερό στήλη η τιμή είναι 1. Έτσι, μπορείτε να δείτε εδώ, έχουμε αυτά τα 2 πράγματα από το όνομα της κλάσης, CS50 και Stat110, και έχουμε τα αναγνωριστικά κατηγορίας και το σύνθημα. Έτσι, θέλουμε να επιλέξετε όλες αυτές τις πληροφορίες. Στη συνέχεια, μπορείτε να δείτε εδώ ότι είναι το είδος του να πάρει από αυτό το φοβερό στήλης, όπου όλα τα πράγματα είναι 1, και στη συνέχεια να έχει την κλάση ID, το όνομα της κλάσης και το σύνθημα που μπορεί να ξεχωρίσω. Πώς ακριβώς το κάνεις αυτό στον κώδικα; Θα πρέπει να χρησιμοποιήσετε το PHP. Έτσι, αυτό είναι το είδος του τρόπου με PHP και SQL σχετίζονται μεταξύ τους. Τώρα έχουμε τον κωδικό μας, και θα πάμε να χρησιμοποιήσετε τη λειτουργία των ερωτημάτων μας όπως κάναμε στο 7 από το chipset, και θα πάμε να εκτελέσετε το ερώτημα SQL. Στη συνέχεια, θα πάμε να έχουν - πρέπει πάντα να ελέγξετε αν τριπλή σειρά ίση εάν ψευδείς. Έτσι και πάλι, θέλετε να ελέγξετε το είδος και την αξία, και στη συνέχεια, αν αυτό δεν λειτουργήσει, τότε θα ήθελα να ζητήσω συγνώμη, ως συνήθως, όπως κάναμε και στο 7 από το chipset. Σε αντίθετη περίπτωση, θέλετε να βρόχο μέσω πάντα με αυτά τα εύχρηστα foreach βρόχους που μόλις πήγε πάνω. Τώρα που είμαστε μέσα looping και το κάναμε παρελθόν, ας υποθέσουμε ότι το ερώτημα μας πέρασε, τώρα έχουμε βρόχο foreach μας. Και η πρώτη σειρά που έχει, τόσο εδώ είναι η γραμμή, ακριβώς εδώ? Είναι εγκλωβιστούμε. Είναι πρόκειται να εκτυπώσετε όλες τις πληροφορίες που έχει πάρει. Έτσι πρόκειται να εκτυπώσετε στο κάτω μέρος "Θέλετε να μάθετε HTML;" Στη συνέχεια, πρόκειται να πάνε στην επόμενη σειρά, γιατί έχει ολοκληρώσει το πρώτο για το βρόχο, και έτσι τότε πρόκειται να εκτυπώσετε τη δεύτερη γραμμή του, η οποία πρόκειται να είναι STAT110, Βρείτε όλες τις στιγμές. Ένα τελευταίο πράγμα που είναι στο SQL ευπάθειας. Ξέρω ότι ο Δαβίδ άγγιξε σε αυτό λίγο στη διάλεξη. Μπορείτε να διαβάσετε αυτό αργότερα. Είναι πραγματικά αστείο. SQL Injection είναι ένα είδος δύσκολο πράγμα. Ας πούμε ότι έχετε κολλήσει ακριβώς αυτές τις μεταβλητές δεξιά στο ερώτημά σας, όπως μπορείτε να δείτε σε αυτή την πρώτη γραμμή. Γι 'αυτό φαίνεται μια χαρά, έτσι δεν είναι; Είσαι απλά βάζοντας το όνομα χρήστη και τον κωδικό πρόσβασης στο ερώτημα SQL σας και θέλετε να τα μεταφέρει μακριά και να πάρει ό, τι είναι στον πίνακα των δεδομένων σας. Αυτό φαίνεται αρκετά απλή. Έτσι, ας πούμε κάποιος βάζει μέσα, για τον κωδικό πρόσβασης, αυτό Ή το κείμενο εδώ - θα πρέπει πραγματικά να είναι στο κόκκινο κουτί. Ας πούμε ότι βάζουν αυτόν τον κωδικό σε - αυτό είναι που αρχίζει. Έτσι βάζουν Ή "1" = 1. Το είδος της μια ανόητη κωδικό πρόσβασης για να έχουν. Τώρα ας το αντικαταστήσει, και θα σημειώσετε ότι σε αυτό το ερώτημα SQL τώρα, αξιολογεί να είναι πάντα αλήθεια, γιατί θα σημειώσετε ότι μπορείτε να επιλέξετε το ερώτημα SQL όλες αυτές τις πληροφορίες ή μπορείτε να έχετε μόνο 1 = 1. Έτσι ώστε να είναι πάντα πρόκειται να αξιολογήσει την τιμή true. Αυτό δεν πρόκειται να λειτουργήσει πραγματικά, γιατί αυτό σημαίνει ότι ο χάκερ μπορεί να σπάσει στο σύστημά σας. Η λύση σε αυτό είναι ότι θα πρέπει να χρησιμοποιήσετε το σύστημα ΠΟΠ, πράγμα που σημαίνει ότι θα πρέπει να χρησιμοποιήσετε ερωτηματικά, το οποίο είναι ό, τι εσείς που χρησιμοποιούνται σε 7 από το chipset, όπου θα πάμε να χρησιμοποιήσετε ένα ερωτηματικό στη θέση όπου θέλετε να βάλετε κάτι, και στη συνέχεια θα πάμε να έχουν ένα κόμμα, και στη συνέχεια, θα έχετε στη συνέχεια, μετά από σειρά σας, οι διαφορετικές μεταβλητές που θέλετε να αντικαταστήσετε στο ερωτηματικό σας. Έτσι θα σημειώσουμε εδώ ότι τώρα έχω αυτά τα κόκκινα ερωτηματικά. Στη συνέχεια έβαλα τις μεταβλητές, μετά χορδές μου, οπότε ξέρω να τους αντικαταστήσουν με αυτή τη σειρά μετά. Αυτό θα βεβαιωθείτε ότι αν κάποιος το κάνει σαν αυτό, και έχουν την ή 1 = 1 κατάσταση, η οποία θα βεβαιωθείτε ότι, στο πίσω άκρο, βεβαιωθείτε ότι δεν θα σπάσει στην πραγματικότητα το ερώτημα SQL. Εντάξει, έτσι ώστε να είναι λίγο πολύ αυτό, ένας ανεμοστρόβιλος της PHP και SQL. Καλή τύχη σε όλους σας, και τώρα στο Όρεγκον [Oreoluwatomiwa Babarinsa] Εντάξει ο καθένας. Ώρα να πάει πέρα ​​από κάποια JavaScript και κάποια άλλα πράγματα πολύ γρήγορα, ώστε να μην κρατάτε μέχρι απόψε. JavaScript. Ναι. JavaScript είναι είδος δροσερό πράγμα, υποτίθεται. Τα πράγματα που πραγματικά πρέπει να ξέρετε για το JavaScript, είναι περίπου όπως το client-side τέλος τι το web app σας πρόκειται να κάνει. Υπάρχουν μερικά πράγματα που απλά δεν θέλουν να ασχοληθούν με όλη την ώρα στην πλευρά του διακομιστή. Όλες οι μικρές αλληλεπιδράσεις, τονίζοντας ένα πράγμα, κάνει κάτι εξαφανίζονται. Μπορείτε πραγματικά δεν θέλουν να πρέπει να μιλήσετε με το διακομιστή σας όλη την ώρα γι 'αυτό. Και μερικά από τα οποία δεν είναι ακόμη δυνατό να γίνει από την πλευρά του διακομιστή. Αυτός είναι ο λόγος που χρειαζόμαστε κάτι σαν το JavaScript. Cool πράγματα σχετικά με JavaScript: Είναι δυναμικά πληκτρολογήσει. Τι αυτό σημαίνει είναι ότι το πρόγραμμά σας δεν χρειάζεται να ξέρετε τι, ακριβώς, οι μεταβλητές είναι όταν το γράψει. Θα ακριβώς το είδος του να το καταλάβω, δεδομένου ότι τρέχει. Άλλα πράγματα που είναι δροσερό γι 'αυτό: Είναι μια γλώσσα σγουρά στήριγμα, το οποίο σημαίνει ότι η σύνταξη είναι παρόμοια με C και PHP. Δεν χρειάζεται να κάνει πολλά επαναλάβει όταν μαθαίνετε JavaScript. Εδώ έχουμε ένα μικρό κομμάτι της JavaScript. Ενδιαφέρον πράγμα εδώ είναι ότι, αν το δει κανείς, έχουμε ένα κομμάτι της JavaScript εκεί στην ετικέτα της κεφαλής. Τι είναι δεν είναι βασικά ακριβώς περιλαμβάνει ένα αρχείο JavaScript. Αυτός είναι ένας τρόπος που μπορείτε να συμπεριλάβετε JavaScript στο πρόγραμμα σας. Στη συνέχεια, η δεύτερη λίγο είναι στην πραγματικότητα κάποια inline JavaScript, πολύ παρόμοιο με ένα ενσωματωμένο στυλ με CSS, και είστε ακριβώς γράφει κάποιο κώδικα πολύ γρήγορα εκεί. JavaScript έχει συστοιχίες. Ακριβώς ένας άλλος τρόπος για να διατηρήσετε τα δεδομένα γύρω, πολύ χρήσιμο. Πολύ ωραία και εύκολη σύνταξη. Μπορείτε να χρησιμοποιήσετε αγκύλες για να αποκτήσετε πρόσβαση σε ό, τι και να κρατήσει τα πάντα μαζί. Τίποτα δεν είναι πολύ περίπλοκο. Το δροσερό πράγμα για JavaScript και scripting γλωσσών γενικότερα είναι ότι δεν έχετε να ανησυχείτε για τα μεγέθη του πίνακα. Μπορείτε να χρησιμοποιήσετε μόνο array.length και να παρακολουθείτε αυτό, καθώς επίσης και η σειρά μπορεί να αυξηθεί ή να συρρικνωθεί όσο χρειάζεστε για να. Έτσι, δεν χρειάζεται καν να ανησυχείτε για κάθε είδος, Ω, όχι, εγώ πρέπει να διαθέσουν περισσότερα πράγματα, ή κάτι τέτοιο. Το δροσερό πράγμα εδώ είναι ότι η JavaScript έχει κάτι που ονομάζεται αντικείμενα. Είναι μια αντικειμενοστραφής γλώσσα, έτσι ώστε ό, τι έχει είναι, κατ 'ουσίαν, ένας τρόπος για να μπορείτε να ομαδοποιήσετε τα δεδομένα μαζί, κάπως παρόμοιο με ένα struct, αλλά μπορείτε να έχετε πρόσβαση σαν ένα struct ή ένα συνδυαστικό σύνταξη array. Είναι αρκετά απλό και τι μπορείτε να κάνετε με αυτό είναι τα δεδομένα της ομάδας μαζί εάν έχετε μια δέσμη των στοιχείων που είναι σχετικές. Επειδή είναι όλα τα πράγματα που χρειάζεστε για να περιγράψει ένα αυτοκίνητο, δεν χρειάζεται να το έχετε σε ένα σωρό διαφορετικές θέσεις. Μπορείτε να κολλήσετε μόνο σε 1 αντικείμενο στο JavaScript. Όπως ίσως γνωρίζετε, την επανάληψη είναι μία από αυτές τις κουραστικές εργασίες. Μπορείτε απλά να το κάνετε πάνω από ένα ξανά. Θα πρέπει να μιλήσετε με κάθε αντικείμενο μέσα στο αυτοκίνητο, ή θα πρέπει να περάσει μέσα από κάθε στοιχείο σε μια λίστα ή κάτι τέτοιο. Έτσι JavaScript έχει, παρόμοια με την PHP, μια σύνταξη foreach. Σε αυτή την περίπτωση, είναι ένα από το βρόχο. Θέλετε να χρησιμοποιήσετε αυτό μόνο σε αντικείμενα. Υπάρχουν κάποια προβλήματα που προκύπτουν, εάν χρησιμοποιήσετε αυτό σε συστοιχίες. Είναι γενικά είναι ένα από εκείνα τα πράγματα, όμως, ότι είναι πολύ χρήσιμο, επειδή θα εξαλείψει πολλές υπερυψωμένες επειδή δεν έχετε να σηκώσει τα πάντα στο αντικείμενό σας από τον εαυτό σας. Δεν χρειάζεται να θυμάστε όλα τα βασικά ονόματα. Μπορείτε ακριβώς το είδος του να πάρει πίσω σε αυτή τη σύνταξη. Σε αυτό, με, μπορείτε απλά θέλετε να θυμάστε ότι παίρνετε πίσω όλα τα πλήκτρα, με πολύ παρόμοιο τρόπο με hash πίνακα. Αν θυμάστε από αυτό, όταν θα τεθεί σε μια σειρά που θα μπορούσε να πάρει κάτι από ότι θα έχουν μια σχετική αξία με αυτό. Τι μπορείτε να κάνετε με αυτό είναι ότι μπορείτε να πείτε, εντάξει, Έβαλα σε ένα αυτοκίνητο, και μου ζήτησε μια Ferrari. Έτσι, μπορείτε να βάλετε στο αλφαριθμητικό Ferrari και πάλι αργότερα, και μπορείτε να πάρετε ότι έξω. Και μπορείτε να το κάνετε αυτό σε έναν βρόχο, με την στο βρόχο. Έτσι απλά περισσότερα για τα αντικείμενα. Το βασικό πράγμα από αυτό που πρέπει να θυμάστε είναι ότι μπορείτε να χρησιμοποιήσετε το struct αντικείμενο, όπως σύνταξη όποτε θέλετε με αυτά, εκτός αν αυτό σας πρόκειται να χρησιμοποιηθεί ως ένα string δεν είναι ένα έγκυρο όνομα μεταβλητής. Έτσι, αν δούμε ότι εκεί, έχουμε το κλειδί με κενά. Λοιπόν, αν ήταν να βάλει object.key, το διάστημα, με, χώρο, τους χώρους, ότι απλά δεν θα είχε νόημα συντακτικά. Έτσι, το μόνο που μπορεί να κάνει ότι με αυτό το είδος της σύνταξης βραχίονα. Επίσης, είναι πολύ JavaScript πεδίο-σοφό να PHP. Έχετε 2 τρόπους αντιμετώπισης πεδίο. Δεν μπορείτε να έχετε το var μπροστά από μια μεταβλητή, και αυτό ακριβώς σημαίνει αυτό είναι παγκόσμιο. Μπορείτε να το δείτε από οπουδήποτε. Ακόμα κι αν επρόκειτο να τεθεί αυτό σε μια δήλωση if, οπουδήποτε αλλού στον κώδικά σας μετά από αυτό το σημείο μπορείτε να δείτε αυτή τη μεταβλητή. Ένα άλλο πράγμα, όμως, είναι με το var, είναι περιορισμένη σε ό, τι λειτουργία είστε μέσα Εάν δεν είστε σε μια λειτουργία, καλά, είναι παγκόσμια. Αλλά εάν είστε σε μια λειτουργία που είναι ορατό μόνο εντός αυτής της λειτουργίας. Δεν έχω ένα παράδειγμα, αλλά, ναι. Είναι ένα από εκείνα τα πράγματα που μπορείτε να διαχειριστείτε ποιες μεταβλητές που θέλετε να είναι παγκόσμια, τι μεταβλητές που θέλετε να είναι τοπικές, αλλά εσείς πρέπει να είστε προσεκτικοί σχετικά με αυτό, επειδή δεν έχετε τον τύπο του προστίμου ελέγχου σιτηρών κάνετε σε C, όπου αν κάτι έχει δηλωθεί σε ένα βρόχο, πρόκειται να μείνετε σε αυτό για το βρόχο. Το πράγμα που πραγματικά νοιάζονται για τη χρήση JavaScript για το χειρισμό ιστοσελίδες, έτσι δεν είναι; Θέλω να πω, γι 'αυτό κάνουμε αυτό. Για να το κάνουμε αυτό, χρησιμοποιούμε κάτι που ονομάζεται DOM. Το Document Object Model. Βασικά, αυτό που κάνει είναι να παίρνει όλα τα HTML σας και τα μοντέλα έξω σε ένα σωρό αντικείμενα που εμφωλιασμένα. Μπορείτε να ξεκινήσετε με κάτι σαν αυτό. Έχετε, σχετικά με το δικαίωμα για μένα, ένα μάτσο κώδικα εκεί έξω αυτό είναι το είδος της - Θα νόμιζε κανείς ότι θα ήταν πολύ δύσκολο να χειραγωγήσουν, γιατί θα πρέπει να parsing μέσα από μια δέσμη του κειμένου και χρειάζεται να κομμάτι χώρια τα πράγματα. Και τι θα γινόταν αν δεν έχει διαμορφωθεί σωστά; Κακά πράγματα θα συμβούν. Έτσι JavaScript φροντίζει γι 'αυτό για σας, και μπορείτε να πάρετε μια ωραία δομή δεδομένων, όπως αυτό στα αριστερά μου, όπου έχετε μόνο ένα έγγραφο, και στο εσωτερικό ότι έχετε κάτι που ονομάζεται HTML, και στο εσωτερικό ότι έχετε ένα κεφάλι και ένα σώμα, και μέσα σε αυτό το κεφάλι σας έχει έναν τίτλο, και τα λοιπά, και τα λοιπά, και τα λοιπά. Αυτό απλοποιεί το χειρισμό μιας ιστοσελίδας έτσι ώστε να είναι απλά, Ω, θέλω απλώς να μιλήσω σε αυτό το αντικείμενο. Ταξινόμηση από ένα πολύ παρόμοιο τρόπο θα απευθυνθείτε σε ένα άλλο αντικείμενο που ο ίδιος έκανε. Όπως είπα, όλα τα DOM είναι το αντικείμενο του εγγράφου. Είτε αυτό είναι μόνο ένα μέρος και, στη συνέχεια, μπορείτε να πάτε μέσα να βρείτε τα πράγματα, και μπορείτε να το κάνετε - αυτό είναι το παλιό στυλ του για να γίνει αυτό, εκεί πάνω, όπου μπορείτε να κάνετε document.getElementById, και στη συνέχεια το όνομα, και όπως μπορείτε να πείτε ίσως, αυτό παίρνει πολύ δυσκίνητο μετά από λίγο. Έτσι, ίσως δεν θέλετε να το κάνετε αυτό. Αυτός είναι ο λόγος για τον οποίο έχουμε το επόμενο πράγμα που θα πάμε να μιλήσουμε για μετά από αυτό. Το βασικό πράγμα εδώ είναι ότι, εντάξει, έχετε όλα αυτά τα στοιχεία, έτσι δεν είναι; Έτσι, ίσως μπορώ να αλλάξω το χρώμα του κάτι, όταν η σελίδα φορτώνει. Και τι έγινε; Τι εάν ο χρήστης κάνει κλικ κάτι μου; Θέλω να κάνεις κάτι ενδιαφέρον, όταν κάνετε κλικ σε κάτι. Αυτός είναι ο λόγος που έχουμε γεγονότα. Μπορείτε, ουσιαστικά, να βρουν οποιοδήποτε στοιχείο στο DOM σας, και στη συνέχεια να πω, hey. Όταν αυτό φορτώνει ή κάποιος κάνει κλικ, ή όταν το ποντίκι πάνω του, να κάνει κάτι με αυτό. Και τι έχετε είναι, έχετε λειτουργίες που χειρίζονται αυτό για σας. Αυτές οι λειτουργίες είναι χειριστές συμβάντων. Τι επιλέγουν να φτιάξουν - είναι ακριβώς ένα φανταχτερό τρόπο λέγοντας, η λειτουργία αυτή εκτελείται μόνο όταν αυτό το γεγονός θα συμβεί. Έτσι, τον οποίο χειρίζεται το γεγονός που συμβαίνει. Αυτό είναι το πώς θα τοποθετήσετε ένα πρόγραμμα χειρισμού συμβάντων. Έχω κάποιο κουμπί, και όταν κάνετε κλικ, θα εκραγεί. Έτσι, μην κάνετε κλικ στο κουμπί. Αυτός είναι ένας τρόπος προσέγγισης, σωστά; Έχετε μια ετικέτα κουμπιού, και κάντε κλικ έχετε ένα string που λέει, Ω, από τον τρόπο, να κάνω αυτή την έκρηξη πράγμα για μένα. Διαφορετικά, είναι ακριβώς όπως ένα κανονικό κουμπί που μόλις κάνατε. Μπορείτε επίσης να κάνετε αυτό με άλλο τρόπο, με την αρπαγή του στοιχείου DOM, αλλά θα σώσει ότι μετά μιλάμε για jQuery. JQuery: Είναι μια βιβλιοθήκη που είναι cross-browser. Μπορείτε να το χρησιμοποιήσετε σε σχεδόν τίποτα. Και απλά σου δίνει πολλά εργαλεία για να εργαστεί με. Επειδή JavaScript, ενώ οι ισχυροί, δεν έχουν όλα τα εργαλεία που χρειάζεστε έξω από το κουτί για να αντιμετωπίσουμε πραγματικά ένα web app μπορεί να θέλετε να κάνετε. Γι 'αυτό απλοποιεί πολλά πράγματα, σας δίνει πολλές λειτουργίες έξω από το κουτί που θα έπρεπε κανονικά να σας γράψω, ξανά και ξανά και ξανά. Και απλά κάνει τα πράγματα πολύ απλά. Μπορείτε επίσης να έχουν επιλογείς, τα οποία σας επιτρέπουν να λαμβάνουν όλα εκείνα τα στοιχεία DOM από σας πολύ πιο απλά, αντί να χρειάζεται να χρησιμοποιούν αυτές τις πολύ μεγάλες κλήσεις λειτουργίας. Περισσότερα για αυτά τα επιλογείς. Θα πρέπει, εκεί που έχετε, ας πούμε, Θέλω να πάρω ένα στοιχείο με το αναγνωριστικό "ροκ". Λοιπόν, σε jQuery, είναι μόλις $ και, στη συνέχεια, μια σειρά που έχει ένα κιλό, και στη συνέχεια "ροκ". Είναι πολύ απλό και πολύ πιο γρήγορα από ό, τι το παραδοσιακό JavaScript τρόπος αντιμετώπισης αυτού του προβλήματος. Και έχετε παρόμοια πράγματα για τις κατηγορίες και τους τύπους στοιχείων. jQuery είναι - ένα από τα δροσερά χαρακτηριστικά γνωρίσματα είναι ότι μπορείτε κάπως να συμπιέσει κάτω από τις απορίες σας σχετικά με DOM σας πολύ, πολύ γρήγορα. Τώρα είμαστε πίσω στο χειρισμό εκδήλωση, και αυτό είναι το πώς θα χειριστεί μια εκδήλωση στο jQuery. Έτσι, αυτό που θα πάμε εδώ είναι που λέμε, εντάξει. Έχω μια ετικέτα script, έτσι δεν είναι; Έτσι, δεν έχω αυτό το inline JavaScript. Τι θα πάμε να κάνουμε είναι να πάμε να πούμε, εντάξει. Όταν το έγγραφο είναι έτοιμο, το οποίο σημαίνει ότι έχει φορτωθεί το έγγραφο, πρόκειται να πάει σε αυτή τη λειτουργία, και θα πάμε να πούμε, εντάξει, αυτή η λειτουργία είναι πραγματικά να κάνει κάτι άλλο. Είναι σαν να λέει, εντάξει, μου πάρει το στοιχείο με το αναγνωριστικό "MyID." Και στη συνέχεια να δώσει σε αυτό μια λειτουργία χειρισμού που εκτελεί όταν κάνετε κλικ. Ουσιαστικά αυτό που κάνει είναι, λέει, εντάξει. Η σελίδα φορτώνεται, έτσι είμαι πρόκειται να το, βρείτε το στοιχείο αυτό, δώσει αυτό το πρόγραμμα χειρισμού συμβάντων, και θέτει ουσιαστικά τη σελίδα σας για σας. Και αυτό είναι το πώς θέλετε να σκεφτείτε για το χειρισμό εκδήλωση. Απλά θέλω να το σκέφτομαι, εντάξει, όταν κάτι συμβαίνει, αυτό που θέλω να συμβεί αυτό; Δεν θέλω να το σκέφτομαι, εντάξει, θα πρέπει να βεβαιωθείτε ότι οι συνομιλίες αυτό το πράγμα σε αυτό το πράγμα, αυτό το πράγμα μπλα μπλα μπλα, επειδή απλά θέλετε να μιλήσετε πράγμα από την άποψη των γεγονότων. Όταν συμβαίνει αυτό, αυτό συμβαίνει. Όταν συμβαίνει αυτό, συμβαίνει αυτό. Και αν τα πράγματα και να προκαλέσει άλλα πράγματα, αυτό είναι υπέροχο. Αλλά δεν θέλετε να προσπαθήσουμε και να κάνουμε πολύπλοκο κώδικα Όπου και αν προκαλώντας πολλαπλά πράγματα ταυτόχρονα, επειδή είστε ακριβώς πρόκειται να δώσετε στον εαυτό σας έναν πονοκέφαλο. Εντάξει. Τώρα μπορούμε να πάρουμε τη σελίδα μας για να χειριστεί τα γεγονότα, αλλά ας πούμε χρήστη μου κάνει κλικ σε ένα κουμπί. Τι γίνεται αν θέλω να στείλω αυτό το αίτημα πίσω στο διακομιστή, αλλά δεν θέλω να ξαναφορτώσετε την σελίδα, γιατί να χρειάζεται να φορτώσετε μια νέα σελίδα κάθε φορά που παίρνει το είδος της κουραστική, και γιατί πρέπει να κάνω να γκρεμίσει την επικεφαλίδα και πάλι, και το υποσέλιδο και πάλι, και όλα τα στοιχεία της σελίδας και πάλι απλά για να ανανεώσετε το χαιρετισμό ή το χρόνο; Έτσι, γι 'αυτό έχουμε κάτι σαν Ajax. Τι μπορούμε να κάνουμε εδώ με τον Άγιαξ είναι μπορούμε να πούμε, εντάξει, Θέλω να στείλω κάποια στοιχεία στο διακομιστή, και θέλω να πάρω μια απάντηση πίσω ώστε να μπορώ να ενημερώσετε τη σελίδα μου, ή ίσως απλά να κάνετε κάποια αλγοριθμική υπολογισμού που δεν δείχνει απαραίτητα κάτι για το χρήστη. Τι χρειάζεστε για να το κάνετε αυτό; Λοιπόν, θα πρέπει να έχετε μια διεύθυνση URL θα πρέπει να μιλήσει. Ο διακομιστής σας δεν μπορεί ακριβώς μαγικά να ακούσετε από πουθενά. Θα πρέπει να έχουν ένα συγκεκριμένο μέρος που θα στείλει τα δεδομένα σε. Και θα πρέπει επίσης κάποια στοιχεία για την αποστολή, ή ίσως είναι ένα ερώτημα dataless. Απλά θέλετε να κάνετε ping στο διακομιστή και να πω, hey, είμαι ζωντανός, ή κάτι τέτοιο. Και τότε θα θέλετε μια λειτουργία που χειρίζεται ουσιαστικά με επιτυχία. Ας πούμε ότι έχετε πάρει πίσω κάποιες πληροφορίες από το διακομιστή σας, και θέλετε να αλλάξετε τον τίτλο του χρήστη στη σελίδα τους. Έτσι θα πάρετε τις πληροφορίες πίσω, και θα ωθήσει ότι στην οθόνη. Αυτό που συμβαίνει είναι, όταν είναι έτοιμη η σελίδα, μπορείτε να δημιουργήσετε ένα στη λειτουργία click για αυτό το κουμπί ονομάζεται greeter. Τότε, αυτό που κάνει είναι, όταν το κουμπί πιέζεται, μιλάτε για greetings.php, κάνετε μια αίτηση POST, και λέτε, hey, μου πάρει κάτι από τη σελίδα σας. Δεν χρειάζεται πραγματικά να περιγράψει αυτό, αλλά greetings.php, ας πούμε, δίνει πίσω "hello world." Έτσι παίρνουμε πίσω αυτό το "hello world", και για την επιτυχία αυτού του γεγονότος, υποθέτοντας ότι τίποτα δεν πάει στραβά, τότε απλά πηγαίνετε σε αυτό τον τόπο-στόχο ότι καθορίζονται και εμείς απλά να κολλήσει την απάντηση εκεί. Και αυτό είναι ένα πολύ απλό τρόπο για τη δημιουργία ενός ερωτήματος Ajax. Πολύ γρήγορα, Rob αναφέρθηκε είδος αυτό ήδη, τα πράγματα μπορούν να πάνε στραβά, κακά πράγματα μπορούν να συμβούν, έτσι θέλετε να εξοικειωθείτε με αυτούς τους κωδικούς απόκρισης HTTP. Τι είναι αυτά είναι απλά, όπως, 200, όλα πήγαν καλά. Κάτι άλλο, κακά πράγματα συνέβησαν. Είναι γενικά το πράγμα που θέλετε να θυμάστε. Αλλά είναι καλό να γνωρίζουμε όλα αυτά. Και τέλος, αφού έχουμε περάσει από όλα αυτά, πρέπει να μιλήσουμε πολύ γρήγορα σχετικά με το σχεδιασμό, και στη συνέχεια μπορούμε να αφήσουμε όλοι φύγει. Σχεδιασμός. Πράγματα που θέλετε να θυμάστε. Ρωτήστε τον εαυτό σας αυτές τις ερωτήσεις: Ποιος θα πρέπει να χρησιμοποιούν αυτό; Τι θα πρέπει να το χρησιμοποιεί για; Τι βλέπουν οι χρήστες μου νοιάζει; Τι δεν νοιάζονται; Απλά δεν θέλουν να κάνουν μια εφαρμογή και αφήστε το απλά μεγαλώνουν και να γίνει αυτός ο γίγαντας, όλα τα καταναλώνουν πράγμα που δεν μπορείτε καν να τελειώσει. Θέλετε να έχετε διακριτές στόχους και τα σχέδια και τα πράγματα που θέλετε να αντιμετωπίσει. Καθιστούν πολύ εύκολη. Όλα αυτά, λέει, ουσιαστικά, να είναι εύκολο για τον χρήστη να το χρησιμοποιήσει? δεν πρόκειται για ένα γιγαντιαίο σταγόνα του κειμένου όπως αυτό slide είναι να κάνει, στην πραγματικότητα. Απλά θέλουν να είναι κάτι για το οποίο είναι πολύ εύκολο για κάποιον να πάει στο και να κάνουν ό, τι θέλουν να κάνουν. Δεν θέλετε να πρέπει να πλοηγηθείτε 5 σελίδες για να φτάσουμε στην πρωταρχική σας λειτουργία του site σας. Αν η Google είχε 5 σελίδες πριν θα μπορούσε ακόμη και να αναζητήσετε κάτι, κανείς δεν θα το χρησιμοποιήσει. Και τέλος, το πρωτότυπο έγγραφο, ομάδα εστίασης. Έχετε καλό σχεδιασμό και τις πρακτικές δοκιμές. Ακριβώς επειδή νομίζετε ότι λειτουργεί για σας, δεν σημαίνει ότι κάποιος άλλος νομίζει ότι δουλεύει. Αλλά ναι, αυτό είναι όλο. [CS50.TV]