[Powered by Google Translate] [Κριτική] [Κουίζ 0] [Lexi Ross, Tommy MacWilliam, Lucas Freitas, Joseph Ong] [Πανεπιστήμιο του Χάρβαρντ] [Αυτό είναι CS50.] [CS50.TV] Γεια σου, όλοι. Καλώς ήρθατε στη συνεδρία για επανεξέταση Quiz 0, η οποία λαμβάνει χώρα αυτή την Τετάρτη. Τι θα πάμε να κάνουμε απόψε, είμαι με 3 άλλα ΤΡ, και μαζί θα πάμε να περάσουν από μια ανασκόπηση του τι έχουμε κάνει στην μέχρι τώρα πορεία. Δεν πρόκειται να είναι 100% ολοκληρωμένη, αλλά θα πρέπει να σας δώσει μια καλύτερη ιδέα από ό, τι έχετε ήδη κάτω και τι θα πρέπει ακόμα να μελετήσει πριν από την Τετάρτη. Και μη διστάσετε να σηκώστε το χέρι σας με ερωτήσεις όπως θα πάμε μαζί, αλλά να έχετε κατά νου ότι θα έχουμε επίσης ένα μικρό κομμάτι του χρόνου στο τέλος- αν έχουμε περάσει με λίγα λεπτά για να ανταλλακτικά-να κάνουν γενικές ερωτήσεις, γι 'αυτό κρατήστε αυτό κατά νου, και έτσι θα πάμε να ξεκινήσουμε από την αρχή με την Εβδομάδα 0. [Κουίζ 0 Review!] [Μέρος 0] [Lexi Ross] Αλλά πριν το κάνουμε αυτό ας μιλήσουμε για τα logistics του κουίζ. [Logistics] [Quiz λαμβάνει χώρα την Τετάρτη 10/10 αντί της διάλεξης] [(Βλέπε http://cdn.cs50.net/2012/fall/quizzes/0/about0.pdf για λεπτομέρειες)] Είναι στις Τετάρτη 10 Οκτώβρη. Αυτό είναι την Τετάρτη, και αν πάτε σε αυτή τη διεύθυνση URL εδώ, το οποίο είναι επίσης προσβάσιμο από CS50.net-υπάρχει μια σύνδεση με αυτό- μπορείτε να δείτε πληροφορίες σχετικά με το πού να πάνε με βάση το επώνυμό σας ή την υπαγωγή τους σχολείο, καθώς και λέει για το τι ακριβώς το κουίζ θα καλύπτει και τα είδη των ερωτήσεων που πρόκειται να πάρει. Λάβετε υπόψη σας ότι θα έχετε επίσης την ευκαιρία να αναθεωρήσετε για το κουίζ στην ενότητα, έτσι TFs σας θα πρέπει να πηγαίνει πέρα ​​από κάποια προβλήματα πρακτική, και αυτό είναι μια άλλη καλή ευκαιρία για να δούμε πού θα πρέπει ακόμα να μελετήσει για το κουίζ. Ας ξεκινήσουμε από την αρχή με Bytes 'n' Bits. Θυμηθείτε λίγο απέχει μόλις 0 ή 1, και ένα byte είναι μια συλλογή από 8 αυτών των bits. Ας ρίξουμε μια ματιά σε αυτή τη συλλογή των bits δεξιά εδώ. Θα πρέπει να είναι σε θέση να υπολογίσει πόσα bits υπάρχουν. Όταν μετράμε υπάρχει μόνο 8 από τους οκτώ 0 ή 1 μονάδες. Και δεδομένου ότι υπάρχει 8 bits, που είναι 1 byte, και ας το μετατρέψει σε δεκαεξαδικό. Δεκαεξαδικό βάση είναι 16, και είναι αρκετά εύκολο να μετατρέψετε ένας αριθμός σε δυαδική μορφή, το οποίο είναι αυτό που είναι, σε έναν αριθμό σε δεκαεξαδική. Το μόνο που κάνουμε είναι να κοιτάξουμε τις ομάδες των 4, και τη μετατροπή τους στο κατάλληλο ψηφίο δεκαεξαδικό. Ξεκινάμε με την πιο δεξιά-ομάδα 4, οπότε 0011. Αυτό πρόκειται να είναι ένα 1 και ένα 2, έτσι που κάνει μαζί 3. Και τότε ας δούμε την άλλη μπλοκ 4. 1101. Αυτό πρόκειται να είναι ένα 1, ένα 4 και ένα 8. Μαζί που πρόκειται να είναι 13, γεγονός που καθιστά Δ. Και θα θυμάστε ότι σε δεκαεξαδική δεν πάμε μόνο 0 έως 9. Πάμε 0 έως F, έτσι ώστε μετά τις 9, 10 αντιστοιχεί στο A, 11 έως Β, κ.λπ. όπου F είναι 15. Εδώ 13 είναι ένα D, έτσι ώστε να το μετατρέψει σε δεκαδικό το μόνο που κάνουμε είναι ότι στην πραγματικότητα αντιμετώπιση κάθε θέση ως δύναμη του 2. Αυτό είναι ένα 1, ένα 2, μηδέν 4s, μηδέν 8άρια, ένας 16, κ.λπ., και είναι λίγο δύσκολο να υπολογιστεί στο κεφάλι σας, αλλά αν πάμε στην επόμενη διαφάνεια μπορούμε να δούμε την απάντηση σε αυτό. Ουσιαστικά θα πάμε απέναντι από δεξιά προς τα αριστερά πίσω, και είμαστε πολλαπλασιασμό κάθε ψηφίο με την αντίστοιχη δύναμη του 2. Και να θυμάστε, για δεκαεξαδικό που χαρακτηρίζει αυτούς τους αριθμούς με 0x στην αρχή έτσι ώστε να μην συγχέεται με ένα δεκαδικό αριθμό. Συνεχίζοντας, αυτό είναι ένα ASCII πίνακα, και αυτό που χρησιμοποιούμε για ASCII είναι να χαρτογραφηθεί από τους χαρακτήρες σε αριθμητικές τιμές. Θυμηθείτε το PSET κρυπτογραφία που έκαναν εκτεταμένη χρήση του πίνακα ASCII προκειμένου να χρησιμοποιήσει διάφορες μεθόδους κρυπτογράφησης, ο Καίσαρας και ο cipher Vigenere, για να μετατρέψετε διαφορετικές επιστολές σε μια συμβολοσειρά σύμφωνα με την κλείδα δίνονται από τον χρήστη. Ας δούμε λίγο από ASCII μαθηματικά. Κοιτάζοντας 'Ρ' + 1, σε μορφή χαρακτήρα που θα μπορούσε να είναι το Q, και να θυμάστε ότι το '5 '≠ 5. Και πώς ακριβώς θα γίνεται η μετατροπή μεταξύ αυτών των 2 μορφές; Δεν είναι πραγματικά πάρα πολύ σκληρά. Για να πάρετε 5 αφαιρούμε '0 ' επειδή υπάρχουν 5 θέσεις μεταξύ του '0 'και το '5 ». Για να πάει ο άλλος τρόπος να προσθέσουμε μόνο το 0, γι 'αυτό είναι το είδος του σαν κανονικό αριθμητική. Απλώς να θυμάστε ότι όταν κάτι έχει εισαγωγικά γύρω από αυτό είναι ένας χαρακτήρας και έτσι αντιστοιχεί σε μία τιμή στον πίνακα ASCII. Προχωρώντας σε πιο γενικά θέματα της επιστήμης των υπολογιστών. Μάθαμε τι ένας αλγόριθμος είναι και πώς χρησιμοποιούμε τον προγραμματισμό αλγορίθμους για την εφαρμογή. Μερικά παραδείγματα των αλγορίθμων είναι κάτι πολύ απλό, όπως ελέγχει αν ένας αριθμός είναι άρτιος ή περιττός. Γι 'αυτό να θυμάστε ότι ο αριθμός mod με 2 και ελέγξτε αν το αποτέλεσμα είναι 0. Αν ναι, είναι ακόμα. Αν όχι, είναι περίεργο. Και αυτό είναι ένα παράδειγμα μιας πραγματικά βασικό αλγόριθμο. Ένα μικρό κομμάτι από ένα πιο ενεργά το ένα είναι δυαδική αναζήτηση, που θα πάμε αργότερα πάνω στη σύνοδο κριτική. Και ο προγραμματισμός είναι ο όρος που χρησιμοποιούμε για τη λήψη έναν αλγόριθμο και να το μετατρέψει για την κωδικοποίηση του υπολογιστή μπορεί να διαβάσει. 2 παραδείγματα προγραμματισμού Scratch είναι, η οποία είναι ό, τι κάναμε στην Εβδομάδα 0. Ακόμα κι αν στην πραγματικότητα δεν πληκτρολογήστε το κωδικό είναι ένας τρόπος για την εφαρμογή της ο αλγόριθμος αυτός, ο οποίος εκτυπώνει τους αριθμούς 1-10, και εδώ κάνουμε το ίδιο στη γλώσσα προγραμματισμού C. Αυτά είναι λειτουργικά ισοδύναμες, απλά γραμμένα σε διαφορετικές γλώσσες ή σύνταξη. Στη συνέχεια έμαθα για boolean εκφράσεις, και μια boolean είναι μια τιμή που είναι είτε αληθείς ή ψευδείς, και εδώ πολλές φορές boolean εκφράσεις πάει μέσα από τις συνθήκες, έτσι ώστε αν (x ≤ 5), καλά, έχουμε ήδη x = 5, έτσι ώστε η κατάσταση πρόκειται να αξιολογήσει την πραγματική. Και αν είναι αλήθεια, ό, τι κώδικας είναι κάτω από τον όρο πρόκειται να αξιολογηθούν από τον υπολογιστή, έτσι ώστε συμβολοσειρά πρόκειται να εκτυπωθεί στην κανονική έξοδο, και ο όρος κατάσταση αναφέρεται σε ό, τι είναι μέσα στις παρενθέσεις της if. Θυμηθείτε όλες τις επιχειρήσεις. Να θυμάστε ότι && και | | όταν προσπαθούμε να συνδυάσουμε 2 ή περισσότερες συνθήκες, == = Όχι για να ελέγξετε αν 2 πράγματα είναι ίσες. Να θυμάστε ότι είναι =, ενώ για την ανάθεση == είναι μια boolean χειριστή. ≤, ≥ και στη συνέχεια το τελικό 2 είναι αυτονόητα. Μια γενική επισκόπηση της boolean λογική εδώ. Και boolean εκφράσεις είναι επίσης σημαντικό σε βρόχους, που θα πάμε πάνω από τώρα. Μάθαμε περίπου 3 είδη βρόχων μέχρι στιγμής σε CS50, για, ενώ, και ενώ κάνει. Και είναι σημαντικό να γνωρίζουμε ότι, ενώ για τους περισσότερους σκοπούς μπορούμε να χρησιμοποιήσουμε πραγματικά οποιοδήποτε είδος του βρόχου γενικά υπάρχουν ορισμένα είδη σκοπούς ή κοινά πρότυπα στον προγραμματισμό που ειδικώς απαιτούν μία από αυτές τις θηλιές που καθιστούν την πιο αποτελεσματική ή κομψό για την κωδικοποίησή του με αυτόν τον τρόπο. Ας πάει πάνω τι κάθε αυτών των βρόχων τείνει να χρησιμοποιείται για πιο συχνά. Σε ένα για βρόχο που κατά κανόνα ήδη γνωρίζουμε πόσες φορές θέλουμε να επαναλάβει. Αυτό είναι ό, τι βάζουμε στην κατάσταση. Για, i = 0, ί <10, για παράδειγμα. Γνωρίζουμε ήδη ότι θέλουμε να κάνουμε κάτι 10 φορές. Τώρα, για έναν βρόχο, ενώ, γενικά δεν απαραίτητα ξέρω πόσες φορές θέλουμε ο βρόχος να τρέξει. Αλλά γνωρίζουμε κάποια προϋπόθεση ότι θέλουμε να πάντα να είναι αληθής ή ψευδής πάντα. Για παράδειγμα, ενώ έχει οριστεί. Ας πούμε ότι είναι μια μεταβλητή boolean. Ενώ είναι αλήθεια ότι θέλουμε ο κωδικός για την αξιολόγηση, έτσι λίγο πιο επεκτάσιμη, λίγο περισσότερο από ό, τι γενικά ένα για βρόχο, αλλά οποιαδήποτε για βρόχο μπορεί επίσης να μετατραπεί σε ένα βρόχο, ενώ. Τέλος, κάνει, ενώ βρόχοι, το οποίο μπορεί να είναι το δυσκολότερο να καταλάβει αμέσως, συχνά χρησιμοποιούνται όταν θέλουμε να αξιολογήσουμε τον κώδικα πρώτου πριν από την πρώτη φορά που θα ελέγξετε την κατάσταση. Μια συνηθισμένη περίπτωση χρήσης για ένα do while loop είναι όταν θέλετε να πάρετε είσοδο του χρήστη, και ξέρετε ότι θέλετε να ζητήσει από το χρήστη για την είσοδο τουλάχιστον μία φορά, αλλά αν δεν σας δώσει καλή εισόδου αμέσως θέλετε να κρατήσετε ζητώντας τους μέχρι να σας δώσει το καλό εισόδου. Αυτή είναι η πιο κοινή χρήση ενός βρόχου ενώ κάνουν, και ας δούμε την πραγματική δομή αυτών των βρόχων. Κατά κανόνα, πάντα έχουν την τάση να ακολουθούν αυτά τα πρότυπα. Στο βρόχο για μέσα έχετε 3 στοιχεία: αρχικοποίηση, συνήθως κάτι σαν int i = 0 όπου i είναι ο μετρητής, κατάσταση, όπου θέλουμε να πούμε τρέξει αυτό το βρόχο για όσο διάστημα αυτή η κατάσταση εξακολουθεί να κατέχει, όπως i <10, και στη συνέχεια, τελικά, την ενημέρωση, η οποία είναι το πώς θα αυξήσετε ο μετρητής μεταβλητής σε κάθε σημείο του βρόχου. Ένα κοινό πράγμα για να δείτε εκεί είναι ακριβώς i + +, πράγμα που σημαίνει αυξήσετε i από 1 κάθε φορά. Θα μπορούσατε επίσης να κάνετε κάτι σαν i + = 2, πράγμα που σημαίνει προσθέσετε 2 έως θ κάθε φορά που περνάτε από το βρόχο. Και τότε το κάνετε αυτό ακριβώς αναφέρεται σε κάθε κωδικό που πραγματικά λειτουργεί ως μέρος του βρόχου. Και για έναν βρόχο, ενώ, αυτή τη φορά έχουμε πραγματικά την εκκίνηση έξω από το βρόχο, Έτσι, για παράδειγμα, ας υποθέσουμε ότι προσπαθούμε να κάνουμε το ίδιο είδος βρόχου ως που μόλις περιέγραψα. Θα λέγαμε int i = 0 πριν ο βρόχος αρχίζει. Στη συνέχεια, θα μπορούσαμε να πούμε, ενώ θ <10 το κάνετε αυτό, έτσι το ίδιο μπλοκ του κώδικα όπως και πριν, και αυτή τη φορά το τμήμα ενημέρωσης του κώδικα, για παράδειγμα, ί + +, πραγματικά πηγαίνει στο εσωτερικό του βρόχου. Και, τέλος, για ένα κάνει, ενώ, είναι παρόμοιο με το βρόχο while, αλλά πρέπει να θυμόμαστε ότι ο κώδικας θα αξιολογήσει μια φορά πριν η κατάσταση ελέγχεται, έτσι ώστε να κάνει μια πολύ πιο λογικό αν το δει κανείς σε σειρά πάνω προς τα κάτω. Σε ένα do while loop ο κωδικός αξιολογεί προτού καν εξετάσει την κατάσταση, ενώ, λαμβάνοντας υπόψη ότι ένα βρόχο, ενώ, ελέγχει πρώτα. Δηλώσεις και μεταβλητές. Όταν θέλουμε να δημιουργήσουμε μια νέα μεταβλητή πρώτα θέλουμε να το αρχικοποιήσει. Για παράδειγμα, int γραμμή αρχικοποιεί τη μεταβλητή μπαρ, αλλά δεν της δώσει μια τιμή, έτσι ποια είναι η αξία μπαρ τώρα; Δεν ξέρουμε. Θα μπορούσε να είναι κάποια αξία σκουπίδια που είχε αποθηκευθεί προηγουμένως στη μνήμη εκεί, και δεν θέλουμε να χρησιμοποιεί το εν λόγω μεταβλητή έως ότου πραγματικά να δώσει μια τιμή, έτσι ώστε να το δηλώσει εδώ. Στη συνέχεια, προετοιμασία για να είναι 42 κατωτέρω. Τώρα, βέβαια, γνωρίζουμε ότι αυτό μπορεί να γίνει σε μία γραμμή, γραμμή int = 42. Αλλά ακριβώς για να καθαρίσετε τα πολλά βήματα που βρίσκονται σε εξέλιξη, Η δήλωση και η αρχικοποίηση συμβαίνουν χωριστά εδώ. Αυτό συμβαίνει σε ένα βήμα, και η επόμενη, int = baz bar + 1, αυτή η παρακάτω δήλωση, ότι baz βήματα, ώστε στο τέλος αυτού του μπλοκ κώδικα αν ήταν να εκτυπώσετε την αξία του baz θα είναι 44 επειδή δηλώνουμε και αρχικοποίηση να είναι 1 bar>, και τότε θα αυξήσετε για μια ακόμη φορά με το + +. Πήγαμε σε αυτό το όμορφο εν συντομία, αλλά είναι καλό να έχουμε μια γενική κατανόηση του τι είναι τα θέματα και γεγονότα. Το κάναμε αυτό, κυρίως στο Scratch, έτσι μπορείτε να σκεφτείτε θέματα όπως πολλαπλές ακολουθίες κώδικα κινούνται με την ίδια φορά. Στην πραγματικότητα, είναι πιθανόν να μην λειτουργεί με την ίδια στιγμή, αλλά το είδος της αφηρημένα μπορούμε να σκεφτούμε ότι με αυτόν τον τρόπο. Το Scratch, για παράδειγμα, είχαμε τις πολλαπλές sprites. Θα μπορούσε να είναι διαφορετικό κώδικα εκτέλεσης ταυτόχρονα. Κάποιος θα μπορούσε να είναι το περπάτημα, ενώ ο άλλος λέει κάτι σε ένα διαφορετικό μέρος της οθόνης. Εκδηλώσεις είναι ένας άλλος τρόπος διαχωρισμού από τη λογική μεταξύ των διαφόρων στοιχείων του κωδικού σας, και σε Scratch ήμασταν σε θέση να προσομοιώνουν τα γεγονότα με την Broadcast, και ότι στην πραγματικότητα όταν λαμβάνω, δεν όταν ακούω, αλλά ουσιαστικά είναι ένας τρόπος για τη μετάδοση πληροφοριών από τη μία στην άλλη sprite. Για παράδειγμα, μπορεί να θέλετε να μεταδώσει το παιχνίδι τελείωσε, και όταν ένα άλλο ξωτικό παιχνίδι λαμβάνει πάνω, ανταποκρίνεται με έναν ορισμένο τρόπο. Είναι ένα σημαντικό μοντέλο για την κατανόηση για τον προγραμματισμό. Ακριβώς για να πάει πέρα ​​από τη βασική Εβδομάδα 0, αυτό που έχουμε περάσει πάνω μέχρι στιγμής, ας ρίξουμε μια ματιά σε αυτό το απλό πρόγραμμα C. Το κείμενο μπορεί να είναι λίγο μικρό από εδώ, αλλά θα πάω πέρα ​​από το πραγματικά γρήγορα. Είμαστε συμπεριλαμβανομένων 2 αρχεία κεφαλίδας στην κορυφή, cs50.h και stdio.h. Είμαστε καθορίζει στη συνέχεια μια σταθερή ονομάζεται όριο είναι 100. Είμαστε εφαρμογή τότε η κύρια λειτουργία μας. Από τη στιγμή που δεν χρησιμοποιούν τα επιχειρήματα της γραμμής εντολών εδώ πρέπει να βάλουμε κενό καθώς τα επιχειρήματα για τις κύριες. Βλέπουμε int πάνω από την κύρια. Αυτός είναι ο τύπος επιστροφής, επιστρέφουν ως εκ τούτου, 0 στο κάτω μέρος. Και είμαστε χρησιμοποιώντας CS50 λειτουργία της βιβλιοθήκης να πάρει int να ζητήσει από το χρήστη για την είσοδο, και να το αποθηκεύσετε σε αυτή τη μεταβλητή x, έτσι δηλώνουμε x παραπάνω, και θα το προετοιμάσει με x = GetInt. Στη συνέχεια ελέγξτε για να δείτε αν ο χρήστης μας έδωσε καλή εισόδου. Αν είναι ΟΡΙΟ ≥ θέλουμε να επιστρέψει ένα κωδικό σφάλματος από 1 και να εκτυπώσετε ένα μήνυμα σφάλματος. Και τέλος, αν ο χρήστης μας έχει δώσει καλή εισόδου θα πάμε να τετραγωνίσει τον αριθμό και να εκτυπώσετε το αποτέλεσμα. Ακριβώς για να βεβαιωθείτε ότι όλα αυτά σπίτι χτύπημα μπορείτε να δείτε τις ετικέτες των διαφόρων τμημάτων του κώδικα εδώ. Ανέφερα σταθερή, header αρχεία. Ω, int x. Φροντίστε να θυμάστε ότι είναι μια τοπική μεταβλητή. Αυτό έρχεται σε αντίθεση από μια καθολική μεταβλητή, η οποία θα μιλήσουμε για λίγο αργότερα, στη σύνοδο επανεξέτασης, και καλούμε τη λειτουργία της βιβλιοθήκης printf, έτσι αν δεν είχε συμπεριληφθεί το stdio.h αρχείο κεφαλίδας δεν θα είναι σε θέση να καλέσετε printf. Και πιστεύω ότι το βέλος που πήρε αποκοπεί εδώ είναι στραμμένη προς τα% d, η οποία είναι μια συμβολοσειρά μορφοποίησης σε printf. Λέει εκτυπώσετε αυτήν τη μεταβλητή ως ένας αριθμός,% d. Και αυτό είναι για την Εβδομάδα 0. Τώρα Lucas πρόκειται να συνεχιστεί. Γεια σας, παιδιά. Το όνομά μου είναι Lucas. Είμαι δευτεροετής φοιτητής στο καλύτερο σπίτι στην πανεπιστημιούπολη, Mather, και θα πάω να μιλήσω λίγο για εβδομάδα 1 και 2,1. [Εβδομάδα 1 και 2,1!] [Lucas Freitas] Όπως Lexi έλεγε, όταν άρχισε να μεταφράζει τον κωδικό σας από γρατζουνιές με C ένα από τα πράγματα που έχουμε παρατηρήσει είναι ότι μπορείτε όχι μόνο γράψετε τον κωδικό σας και να το εκτελέσετε χρησιμοποιώντας μια πράσινη σημαία πια. Στην πραγματικότητα, θα πρέπει να χρησιμοποιήσετε κάποια βήματα για να κάνετε το πρόγραμμά σας C γίνει ένα εκτελέσιμο αρχείο. Βασικά αυτό που κάνετε όταν γράφετε ένα πρόγραμμα είναι ότι να μεταφράσετε την ιδέα σας σε μια γλώσσα που ο μεταγλωττιστής μπορεί να καταλάβει, έτσι όταν γράφετε ένα πρόγραμμα σε C τι κάνετε γράφει ότι στην πραγματικότητα κάτι μεταγλωττιστή σας πρόκειται να καταλάβει, και τότε ο compiler πρόκειται να μεταφράσει αυτόν τον κώδικα σε κάτι που ο υπολογιστής σας θα καταλάβει. Και το πράγμα είναι, ο υπολογιστής σας είναι πραγματικά πολύ χαζή. Ο υπολογιστής σας μπορεί να καταλάβει μόνο 0s και 1s, έτσι στην πραγματικότητα το πρώτο υπολογιστές άνθρωποι συνήθως προγραμματιστεί χρησιμοποιώντας 0s και 1s, αλλά όχι πια, δόξα τω Θεώ. Εμείς δεν χρειάζεται να απομνημονεύουν τις ακολουθίες για 0s και 1s για ένα ή για το βρόχο για έναν βρόχο, ενώ και ούτω καθεξής. Γι 'αυτό έχουμε ένα μεταγλωττιστή. Τι compiler που κάνει είναι να μετατρέπει ουσιαστικά τον κώδικα C, στην περίπτωσή μας, σε μια γλώσσα που ο υπολογιστής σας θα καταλάβει, το οποίο είναι το αντικείμενο κώδικα, και ο compiler που χρησιμοποιείτε λέγεται κλαγγή, έτσι αυτό είναι πραγματικά το σύμβολο για κλαγγή. Όταν έχετε το πρόγραμμα σας, θα πρέπει να κάνετε 2 πράγματα. Κατ 'αρχάς, θα πρέπει να καταρτίσει το πρόγραμμά σας, και στη συνέχεια θα πάμε να τρέξετε το πρόγραμμά σας. Για την κατάρτιση του προγράμματος σας, έχετε πολλές επιλογές για να το πράξουν. Το πρώτο είναι να κάνει program.c κλαγγή σε ποιο πρόγραμμα είναι το όνομα του προγράμματός σας. Σε αυτή την περίπτωση μπορείτε να δείτε ότι απλά λέγοντας "Γεια σου, συγκεντρώνουν το πρόγραμμά μου." Δεν λέτε "θέλω αυτό το όνομα για το πρόγραμμά μου» ή οτιδήποτε. Η δεύτερη επιλογή δίνει ένα όνομα για το πρόγραμμά σας. Μπορείτε να πείτε κλαγγή-o και στη συνέχεια το όνομα που θέλετε το εκτελέσιμο αρχείο που θα ονομαστεί ως και, στη συνέχεια program.c. Και μπορείτε επίσης να κάνουν το πρόγραμμα, και να δούμε πώς τις πρώτες 2 περιπτώσεις Έβαλα. Γ, και το τρίτο που έχω μόνο τα προγράμματα; Ναι, μπορείτε πραγματικά δεν θα πρέπει να θέσει. Γ. όταν χρησιμοποιείτε το κάνουν. Διαφορετικά, ο μεταγλωττιστής είναι πραγματικά πρόκειται να φωνάζω σε σας. Και επίσης, δεν ξέρω αν θυμάστε εσείς, αλλά πολλές φορές επίσης χρησιμοποιείται lcs50-ή-lm. Που ονομάζεται σύνδεση. Λέει απλώς τον compiler ότι θα χρησιμοποιήσετε αυτές τις βιβλιοθήκες εκεί, οπότε αν θέλετε να χρησιμοποιήσετε cs50.h που πραγματικά πρέπει να πληκτρολογήσετε κλαγγή program.c-lcs50. Αν δεν το κάνουμε αυτό, ο compiler δεν πρόκειται να γνωρίζετε ότι χρησιμοποιείτε αυτές τις λειτουργίες σε cs50.h. Και όταν θέλετε να τρέξετε το πρόγραμμά σας έχετε 2 επιλογές. Αν το κάνατε program.c κλαγγή δεν έχετε δώσει ένα όνομα στο πρόγραμμά σας. Θα πρέπει να το τρέξει με. / A.out. A.out είναι ένα πρότυπο όνομα που κλαγγή δίνει το πρόγραμμά σας, αν δεν του δώσετε ένα όνομα. Διαφορετικά, θα πάμε να κάνουμε. / Πρόγραμμα αν έδωσε ένα όνομα για το πρόγραμμά σας, και, επίσης, αν έκανε το όνομα του προγράμματος ότι το πρόγραμμα πρόκειται να πάρει έχει ήδη πρόκειται να προγραμματιστεί το ίδιο όνομα με το αρχείο c. Στη συνέχεια μιλήσαμε για τους τύπους δεδομένων και δεδομένων. Βασικά τύπους δεδομένων είναι το ίδιο πράγμα με μικρά κουτιά που χρησιμοποιούν για την αποθήκευση τιμών, έτσι ώστε τα δεδομένα τύποι είναι πραγματικά ακριβώς όπως Pokémons. Έρχονται σε όλα τα μεγέθη και τύπους. Δεν ξέρω αν αυτή η αναλογία έχει νόημα. Το μέγεθος εξαρτάται από πραγματικά δεδομένα για την αρχιτεκτονική του μηχανήματος. Όλα τα μεγέθη δεδομένων που Πάω να δείξει εδώ είναι στην πραγματικότητα για ένα 32-bit μηχάνημα, το οποίο είναι η περίπτωση της συσκευής μας, αλλά αν είστε πραγματικά κωδικοποίησης Mac σας ή σε έναν υπολογιστή με Windows, επίσης, κατά πάσα πιθανότητα θα πάμε να έχουν ένα 64-bit μηχάνημα, ώστε να θυμάστε ότι τα μεγέθη των δεδομένων που Πάω να δείξει εδώ είναι για το 32-bit μηχάνημα. Το πρώτο που είδαμε ήταν ένα int, η οποία είναι αρκετά απλή. Μπορείτε να χρησιμοποιήσετε int να αποθηκεύσει έναν ακέραιο. Είδαμε, επίσης, το χαρακτήρα, το char. Αν θέλετε να χρησιμοποιήσετε μια επιστολή ή ένα μικρό σύμβολο είστε πιθανώς πρόκειται να χρησιμοποιήσετε μια χαρα. Μια χαρα έχει 1 byte, που σημαίνει 8 bits, όπως δήλωσε ο Lexi. Βασικά έχουμε ένα πίνακα ASCII που έχει 256 πιθανών συνδυασμών 0s και 1s, και στη συνέχεια, όταν πληκτρολογείτε μια χαρα πρόκειται να μεταφράσει ο χαρακτήρας σας ότι οι εισροές ένας αριθμός που έχετε στον πίνακα ASCII, όπως δήλωσε ο Lexi. Έχουμε επίσης τον πλωτήρα, το οποίο χρησιμοποιούμε για την αποθήκευση δεκαδικούς αριθμούς. Αν θέλετε να επιλέξετε 3,14, για παράδειγμα, θα πάμε να χρησιμοποιήσετε ένα απόθεμα ή ένα διπλό που έχει μεγαλύτερη ακρίβεια. Ο πλωτήρας έχει 4 byte. Ένα διπλό έχει 8 bytes, οπότε η μόνη διαφορά είναι η ακρίβεια. Έχουμε επίσης μια μακρά που χρησιμοποιείται για ακέραιους αριθμούς, και μπορείτε να δείτε για ένα 32-bit μηχάνημα ένα int και ένα καιρό έχουν το ίδιο μέγεθος, γι 'αυτό δεν κάνει πραγματικά αίσθηση να χρησιμοποιήσετε ένα χρονικό διάστημα σε ένα 32-bit μηχάνημα. Αλλά αν χρησιμοποιείτε ένα μηχάνημα Mac και 64-bit, στην πραγματικότητα μια μακρά έχει μέγεθος 8, γι 'αυτό πραγματικά εξαρτάται από την αρχιτεκτονική. Για την 32-bit μηχάνημα αυτό δεν έχει νόημα να χρησιμοποιήσει μια μακρά πραγματικά. Και στη συνέχεια μια μακρά μακρά, από την άλλη πλευρά, έχει 8 bytes, γι 'αυτό είναι πολύ καλό, αν θέλετε να έχετε ένα μεγαλύτερο ακέραιο αριθμό. Και τέλος, έχουμε σειρά, η οποία είναι στην πραγματικότητα ένα char *, το οποίο είναι ένας δείκτης σε char. Είναι πολύ εύκολο να σκεφτεί κανείς ότι το μέγεθος του string θα είναι σαν ο αριθμός των χαρακτήρων που έχετε εκεί, αλλά στην πραγματικότητα το ίδιο το char * Έχει το μέγεθος ενός δείκτη σε char, η οποία είναι 4 bytes. Το μέγεθος ενός char * είναι 4 bytes. Δεν έχει σημασία αν έχετε μια μικρή λέξη ή μια επιστολή ή οτιδήποτε. Είναι πρόκειται να είναι 4 bytes. Μάθαμε επίσης λίγο για χύτευση, Έτσι, όπως μπορείτε να δείτε, αν έχετε, για παράδειγμα, ένα πρόγραμμα που λέει int x = 3 και στη συνέχεια printf ("% d", το χ / 2) κάνετε εσείς ξέρετε τι πρόκειται να εκτυπώσετε στην οθόνη; Κάποιος; >> [Φοιτητές] 2. 1. >> 1, ναι. Όταν το κάνετε 3/2 πρόκειται να πάρει 1,5, αλλά επειδή είμαστε χρησιμοποιώντας έναν ακέραιο πρόκειται να αγνοήσει το δεκαδικό μέρος, και θα πάμε να έχουν 1. Αν δεν θέλετε να συμβεί ό, τι μπορείτε να κάνετε, για παράδειγμα, έχει κηρύξει έναν πλωτήρα y = x. Τότε x που χρησιμοποιείται για να είναι 3 είναι τώρα πρόκειται να είναι σε 3,000 y. Και τότε μπορείτε να εκτυπώσετε το y / 2. Στην πραγματικότητα, θα έπρεπε να έχω ένα 2. εκεί πέρα. Είναι πρόκειται να κάνει 3.00/2.00, και θα πάμε για να πάρει 1,5. Και έχουμε αυτό το .2 f είναι να ρωτήσετε απλά για 2 δεκαδικές μονάδες στο δεκαδικό μέρος. Αν έχετε 0.3 στ πρόκειται να έχουν πραγματικά 1,500. Αν είναι 2 πρόκειται να είναι 1,50. Έχουμε, επίσης, την υπόθεση εδώ. Αν παρουσιάζουν διακυμάνσεις x = 3,14 και τότε printf x θα πάμε για να πάρει 3,14. Και αν το κάνετε x = int του x, πράγμα που σημαίνει θεραπεία x ως int και θα τυπώνει το x τώρα θα πάμε να έχει 3,00. Μήπως αυτό έχει νόημα; Επειδή είστε θεραπεία πρώτη x ως ακέραιος αριθμός, ώστε να είστε αγνοώντας το δεκαδικό μέρος, και στη συνέχεια να είστε εκτύπωση x. Και τέλος, μπορείτε επίσης να κάνετε αυτό, int x = 65, και τότε θα κηρύξει char c = x, και στη συνέχεια, αν εκτυπώσετε το γ είστε πραγματικά πρόκειται να πάρει Α, έτσι ουσιαστικά τι κάνετε εδώ η μετάφραση του σε ακέραιο χαρακτήρα, ακριβώς όπως ο πίνακας ASCII κάνει. Μιλήσαμε επίσης για μαθηματικούς τελεστές. Οι περισσότεροι από αυτούς είναι αρκετά απλή, οπότε +, -, *, /, και μιλήσαμε για mod, το οποίο είναι το υπόλοιπο της διαίρεσης του 2 αριθμούς. Εάν έχετε 10% 3, για παράδειγμα, αυτό σημαίνει ότι χωρίζουν 10 με 3, και ποιο είναι το υπόλοιπο; Είναι πρόκειται να είναι 1, έτσι είναι πραγματικά πολύ χρήσιμο για πολλά από τα προγράμματα. Για Vigenere Καίσαρα και είμαι σίγουρος ότι όλοι εσείς που χρησιμοποιούνται mod. Σχετικά με μαθηματικούς τελεστές, να είναι πολύ προσεκτικοί όταν συνδυάζονται και * /. Για παράδειγμα, αν κάνετε (3/2) * 2 τι πρόκειται να πάρει; [Φοιτητές] 2. Ναι, 2, γιατί τρία δεύτερα πρόκειται να είναι 1,5, αλλά από τη στιγμή που κάνεις πράξεις μεταξύ 2 ακέραιοι είστε πραγματικά ακριβώς πρόκειται να εξετάσει 1, και στη συνέχεια, 1 * 2 θα είναι 2, έτσι ώστε να είναι πολύ, πολύ προσεκτικός όταν κάνουμε αριθμητική με ακέραιους αριθμούς, επειδή μπορείτε να πάρετε ότι 2 = 3, σε αυτή την περίπτωση. Και, επίσης, να είναι πολύ προσεκτικοί σχετικά με προβάδισμα. Θα πρέπει να χρησιμοποιείτε συνήθως παρενθέσεις για να είστε σίγουροι ότι ξέρετε τι κάνετε. Μερικές χρήσιμες συντομεύσεις, φυσικά, το ένα είναι i + + ή + i = 1 ή χρησιμοποιώντας + =. Αυτό είναι το ίδιο πράγμα με το να κάνει i = i + 1. Μπορείτε να το κάνετε, επίσης, i - ή i - = 1, το οποίο είναι το ίδιο πράγμα με i = i -1, κάτι που εσείς χρησιμοποιείτε πολλά για βρόχους, τουλάχιστον. Επίσης, για *, αν χρησιμοποιείτε * = και αν το κάνετε, για παράδειγμα, * i = 2 είναι το ίδιο πράγμα με το να λέμε i = i * 2, και το ίδιο πράγμα για τη διαίρεση. Αν το κάνετε i / = 2 είναι το ίδιο πράγμα με i = i / 2. Τώρα σχετικά με τις λειτουργίες. Εσείς μάθει ότι οι λειτουργίες είναι μια πολύ καλή στρατηγική για να αποθηκεύσετε τον κωδικό ενώ είστε προγραμματισμό, οπότε αν θέλετε να εκτελέσετε την ίδια εργασία στον κώδικα ξανά και ξανά, ίσως θέλετε να χρησιμοποιήσετε μια συνάρτηση ακριβώς έτσι δεν χρειάζεται να αντιγράψετε και να επικολλήσετε τον κώδικα ξανά και ξανά. Στην πραγματικότητα, είναι μια κύρια λειτουργία, και όταν σας δείξει τη μορφή μιας συνάρτησης θα πάμε να δούμε ότι αυτό είναι αρκετά προφανές. Μπορούμε επίσης να χρησιμοποιήσετε τις λειτουργίες από ορισμένες βιβλιοθήκες, για παράδειγμα, printf GetIn, η οποία είναι από τη βιβλιοθήκη CS50, και άλλες λειτουργίες, όπως toupper. Όλες αυτές οι λειτουργίες είναι πράγματι εφαρμόζεται σε άλλες βιβλιοθήκες, και όταν βάζετε αυτά τα αρχεία πρόσδεσης στην αρχή του προγράμματός σας λέτε να σας παρακαλώ να μου δώσει τον κώδικα για αυτές τις λειτουργίες γι 'αυτό δεν χρειάζεται να τους εφαρμόσουν με τον εαυτό μου; Και μπορείτε επίσης να γράψετε τις δικές σας συναρτήσεις, έτσι ώστε όταν αρχίσει ο προγραμματισμός έχετε συνειδητοποιήσει ότι οι βιβλιοθήκες δεν έχουν όλες τις λειτουργίες που χρειάζεστε. Για την τελευταία PSET, για παράδειγμα, γράψαμε κλήρωση, αγωνίζομαι, και αναζήτηση, και είναι πολύ, πολύ σημαντικό να είναι σε θέση να γράψει λειτουργίες επειδή είναι χρήσιμα, και χρησιμοποιούμε τους όλη την ώρα στον προγραμματισμό, και εξοικονομεί πολύ κώδικα. Η μορφή μιας συνάρτησης είναι αυτό. Έχουμε τύπου επιστροφή στην αρχή. Ποιος είναι ο τύπος επιστροφής; Είναι μόνο όταν η λειτουργία σας πρόκειται να επιστρέψει. Αν έχετε μια λειτουργία, για παράδειγμα, παραγοντικό, δηλαδή πρόκειται για τον υπολογισμό μιας παραγοντικού του ακεραίου, κατά πάσα πιθανότητα πρόκειται να επιστρέψει έναν ακέραιο επίσης. Τότε ο τύπος επιστροφής πρόκειται να είναι int. Printf έχει πραγματικά ένα κενό τύπο επιστροφής επειδή δεν είστε επιστρέφουν τίποτα. Είσαι απλά τα πράγματα εκτύπωση στην οθόνη και το κλείσιμο της λειτουργίας μετά. Στη συνέχεια, έχετε το όνομα της συνάρτησης που μπορείτε να επιλέξετε. Θα πρέπει να είναι λίγο λογική, όπως δεν επιλέγουν ένα όνομα όπως xyz ή όπως x2f. Προσπαθήστε να κάνετε ένα όνομα που έχει νόημα. Για παράδειγμα, αν είναι παραγοντικό, λένε παραγοντικό. Αν είναι μια λειτουργία που πρόκειται να συντάξει κάτι, το όνομα ισοπαλία. Και τότε έχουμε τις παραμέτρους, οι οποίες ονομάζονται επίσης επιχειρήματα, που είναι σαν τους πόρους που χρειάζεται η λειτουργία σας από τον κώδικά σας για να εκπληρώσει την αποστολή του. Αν θέλετε να υπολογίσετε το παραγοντικό ενός αριθμού μάλλον θα πρέπει να έχετε έναν αριθμό για να υπολογίσει ένα παραγοντικό. Ένα από τα επιχειρήματα που θα πάμε να είναι ο ίδιος ο αριθμός. Και στη συνέχεια, πρόκειται να κάνει κάτι και να επιστρέψει την αξία τους στο τέλος εκτός αν είναι μια άκυρη λειτουργία. Ας δούμε ένα παράδειγμα. Αν θέλω να γράψω μια λειτουργία που συνοψίζει όλους τους αριθμούς σε μια σειρά από ακέραιους αριθμούς, πρώτα από όλα, ο τύπος επιστροφής πρόκειται να είναι int γιατί έχω μια σειρά από ακέραιους αριθμούς. Και τότε Πάω να έχει το όνομα της συνάρτησης, όπως sumArray, και στη συνέχεια πρόκειται να λάβει την ίδια σειρά, σε int Nums, και στη συνέχεια το μήκος του πίνακα, έτσι ξέρω πόσους αριθμούς που έχω να συνοψίσω. Τότε θα πρέπει να προετοιμάσει μια μεταβλητή που ονομάζεται ποσό, για παράδειγμα, στο 0, και κάθε φορά που βλέπω ένα στοιχείο του πίνακα θα πρέπει να το προσθέσετε στο σύνολο, έτσι έκανα ένα για βρόχο. Ακριβώς όπως είπε ο Lexi, κάνετε int i = 0, i μήκος <και i + +. Και για κάθε στοιχείο του πίνακα έκανα άθροισμα + = Nums [i], και στη συνέχεια θα επιστρέψει το ποσό, γι 'αυτό είναι πολύ απλό, και εξοικονομεί πολύ κώδικα αν χρησιμοποιείτε αυτή τη λειτουργία πολλές φορές. Στη συνέχεια πήραμε μια ματιά σε όρους. Έχουμε αν, αλλιώς, αν και αλλιώς. Ας δούμε ποια είναι η διαφορά μεταξύ αυτών. Ρίξτε μια ματιά σε αυτές τις 2 κωδικούς. Ποια είναι η διαφορά μεταξύ τους; Η πρώτη έχει-ουσιαστικά οι κωδικοί θέλετε να πείτε αν ένας αριθμός είναι +, -, ή 0. Η πρώτη λέει ότι αν είναι> 0 τότε είναι θετικό. Αν είναι = 0 τότε να είναι 0, και αν είναι <0 τότε είναι αρνητική. Και ο άλλος κάνει αν, αλλιώς αν, αλλιώς. Η διαφορά μεταξύ των δύο είναι ότι αυτό είναι στην πραγματικότητα πρόκειται να ελέγξετε εάν> 0, <0 = 0 ή τρεις φορές, οπότε αν έχετε τον αριθμό 2, για παράδειγμα, πρόκειται να έρθει εδώ και να πω if (x> 0), και πρόκειται να πω ναι, έτσι μπορώ να εκτυπώσω θετικά. Αλλά ακόμα κι αν ξέρω ότι είναι> 0 και δεν πρόκειται να είναι 0 ή <0 Είμαι ακόμα πρόκειται να κάνουμε είναι το 0, είναι <0, έτσι είμαι πραγματικά συμβαίνει στο εσωτερικό του IFS ότι δεν είχα να επειδή ξέρω ήδη ότι δεν πρόκειται να ικανοποιήσει κάποια από αυτές τις συνθήκες. Μπορώ να χρησιμοποιήσω το αν, αλλιώς αν, else. Λέει βασικά αν x = 0 I εκτυπώσετε το θετικό. Αν δεν είναι, θα πάω να δοκιμάσει και αυτό. Αν είναι 2 εγώ δεν πρόκειται να το κάνουμε αυτό. Βασικά αν είχα x = 2 θα σας πω if (x> 0), ναι, έτσι εκτυπώσετε αυτό. Τώρα που ξέρω ότι είναι> 0 και ότι ικανοποιείται εάν η πρώτη Δεν είμαι καν πρόκειται να εκτελέσετε αυτόν τον κώδικα. Ο κώδικας τρέχει πιο γρήγορα, στην πραγματικότητα, 3 φορές πιο γρήγορα αν χρησιμοποιείτε αυτό. Μάθαμε επίσης για και και ή. Είμαι δεν πρόκειται να περάσει μέσα από αυτό, επειδή Lexi ήδη μιλήσει γι 'αυτούς. Είναι ακριβώς οι && και | χειριστή |. Το μόνο που θα πω είναι να είστε προσεκτικοί όταν έχετε 3 συνθήκες. Χρησιμοποιήστε παρενθέσεις γιατί είναι πολύ συγκεχυμένη, όταν έχετε μια κατάσταση και ένα άλλο ή ένα άλλο. Χρησιμοποιήστε παρενθέσεις μόνο για να είναι σίγουρος ότι οι συνθήκες σας έχουν νόημα γιατί σε αυτή την περίπτωση, για παράδειγμα, μπορείτε να φανταστείτε ότι θα μπορούσε να είναι η πρώτη κατάσταση και η μία ή η άλλη ή οι 2 συνθήκες συνδυάζονται σε ένα και ή ο τρίτος, έτσι απλά να είστε προσεκτικοί. Και τέλος, μιλήσαμε σχετικά με τους διακόπτες. Ένας διακόπτης είναι πολύ χρήσιμο όταν έχετε μια μεταβλητή. Ας πούμε ότι έχετε μια μεταβλητή, όπως n που μπορεί να είναι 0, 1, ή 2, και για κάθε μία από αυτές τις περιπτώσεις θα πάμε για να εκτελέσει μια εργασία. Μπορείτε να πείτε αλλάξετε τη μεταβλητή, και αυτό δείχνει ότι η αξία είναι τότε σαν τιμή1 Πάω να το κάνετε αυτό, και στη συνέχεια θα σπάσει, πράγμα που σημαίνει ότι δεν πρόκειται να δούμε καμία από τις άλλες περιπτώσεις ικανοποιημένοι γιατί ήδη ότι η υπόθεση και στη συνέχεια value2 και ούτω καθεξής, και μπορώ επίσης να έχουν ένα διακόπτη προεπιλογή. Αυτό σημαίνει ότι αν δεν πληροί καμία από τις περιπτώσεις που είχα ότι θα πάω να κάνω κάτι άλλο, αλλά αυτό είναι προαιρετικό. Αυτό είναι όλα για μένα. Τώρα, ας ρίξουμε Tommy. Εντάξει, αυτό πρόκειται να είναι εβδομάδα 3-ish. Αυτά είναι μερικά από τα θέματα που θα πρέπει να καλύπτει, crypto, το πεδίο εφαρμογής, πίνακες, κ.λπ.. Απλά μια γρήγορη λέξη για crypto. Εμείς δεν πρόκειται να σφυρί το σπίτι. Το κάναμε αυτό στην PSET 2, αλλά για το κουίζ βεβαιωθείτε ότι γνωρίζετε τη διαφορά μεταξύ του Καίσαρα κρυπτογράφησης και τον αλγόριθμο Vigenere, πως και οι δύο από αυτούς τους αλγόριθμους κρυπτογράφησης και το έργο αυτό είναι σαν να κρυπτογραφήσετε αποκρυπτογραφήσει το κείμενο και τη χρήση αυτών των 2 αλγόριθμους κρυπτογράφησης. Θυμηθείτε, η Caesar cipher περιστρέφεται απλά κάθε χαρακτήρα κατά το ίδιο ποσό, φροντίζοντας να mod με τον αριθμό των γραμμάτων του αλφαβήτου. Και το κρυπτογράφημα Vigenere, από την άλλη πλευρά, περιστρέφει κάθε χαρακτήρα από ένα διαφορετικό ποσό, έτσι αντί να πει κάθε χαρακτήρα περιστρέφεται κατά 3 Vigenere θα εναλλάσσονται κάθε χαρακτήρα από ένα διαφορετικό ποσό, ανάλογα με κάποια λέξη-κλειδί όπου κάθε γράμμα τη λέξη-κλειδί αντιπροσωπεύει κάποια διαφορετική ποσότητα για να περιστρέψετε το κείμενο με σαφή. Ας μιλήσουμε πρώτα για την εμβέλεια των μεταβλητών. Υπάρχουν 2 διαφορετικοί τύποι των μεταβλητών. Έχουμε τοπικές μεταβλητές, και αυτές πρόκειται να οριστεί έξω από τις κύριες ή έξω από οποιαδήποτε λειτουργία ή μπλοκ, και αυτοί θα είναι προσβάσιμοι σε οποιοδήποτε σημείο του προγράμματός σας. Αν έχετε μια λειτουργία και στη λειτουργία είναι ένας βρόχος, ενώ η μεγάλη παγκόσμια μεταβλητή είναι προσβάσιμη παντού. Μια τοπική μεταβλητή, από την άλλη πλευρά, είναι scoped στον τόπο όπου ορίζεται. Αν έχετε μια λειτουργία εδώ, για παράδειγμα, έχουμε αυτή την συνάρτηση g, και στο εσωτερικό της g υπάρχει μια μεταβλητή που ονομάζεται εδώ y, και αυτό σημαίνει ότι αυτή είναι μια τοπική μεταβλητή. Ακόμη και αν αυτή η μεταβλητή ονομάζεται y και αυτή η μεταβλητή ονομάζεται y αυτές τις 2 λειτουργίες δεν έχουν ιδέα τι είναι οι τοπικές μεταβλητές του άλλου. Από την άλλη πλευρά, εδώ λέμε int x = 5, και αυτό είναι εκτός του πεδίου της οποιαδήποτε λειτουργία. Είναι έξω από το πεδίο των βασικών, έτσι αυτό είναι μια καθολική μεταβλητή. Αυτό σημαίνει ότι μέσα από αυτές τις 2 λειτουργίες, όταν λέω x - ή x + + Είμαι πρόσβαση στον ίδιο χ όπου αυτή y και η y είναι διαφορετικές μεταβλητές. Αυτή είναι η διαφορά ανάμεσα σε μια καθολική μεταβλητή και μια τοπική μεταβλητή. Όσον αφορά το σχεδιασμό ανησυχεί, μερικές φορές είναι πιθανώς μια καλύτερη ιδέα για να κρατήσει τις τοπικές μεταβλητές κάθε φορά που μπορείτε ενδεχομένως δεδομένου ότι έχει ένα σωρό καθολικές μεταβλητές μπορούν να πάρουν πραγματικά σύγχυση. Εάν έχετε μια δέσμη των λειτουργιών τροποποίηση όλοι το ίδιο πράγμα μπορείτε να ξεχάσετε ό, τι αν αυτή η λειτουργία αλλάζει κατά λάθος αυτό το παγκόσμιο, και η άλλη λειτουργία δεν ξέρει γι 'αυτό, και έχει πάρει αρκετά συγκεχυμένη, όπως μπορείτε να πάρετε περισσότερες κωδικό. Κρατώντας τις τοπικές μεταβλητές κάθε φορά που μπορείτε ενδεχομένως είναι μόνο καλός σχεδιασμός. Πίνακες, θυμηθείτε, είναι απλώς καταλόγους στοιχείων του ίδιου τύπου. Μέσα από CI δεν μπορεί να έχει μια λίστα όπως 1, 2,0, γειά σου. Εμείς απλά δεν μπορούμε να το κάνουμε αυτό. Όταν δηλώνουμε μια σειρά σε C όλα τα στοιχεία πρέπει να είναι του ίδιου τύπου. Εδώ έχω μια σειρά από 3 ακέραιους αριθμούς. Εδώ έχω το μήκος του πίνακα, αλλά αν είμαι δηλώνοντας ακριβώς σε αυτή τη σύνταξη όπου μπορώ να προσδιορίσω τι όλα τα στοιχεία είναι ότι δεν χρειάζεται αυτή την τεχνική 3. Ο compiler είναι αρκετά έξυπνος για να καταλάβω πόσο μεγάλη είναι η σειρά πρέπει να είναι. Τώρα όταν θέλω να πάρω ή να ορίσετε την αξία ενός πίνακα αυτή είναι η σύνταξη για να το κάνουμε αυτό. Αυτό θα τροποποιήσει ουσιαστικά το δεύτερο στοιχείο του πίνακα, διότι, θυμηθείτε, αρίθμηση ξεκινά από το 0, όχι σε 1. Αν θέλετε να διαβάσετε αυτή την τιμή μπορώ να πω κάτι σαν int x = array [1]. Ή αν θέλετε να ορίσετε αυτή την τιμή, όπως κάνω εδώ, Μπορώ να πω array [1] = 4. Εκείνη την εποχή πρόσβαση σε στοιχεία από το δείκτη τους ή τη θέση τους ή όταν είναι στη συστοιχία, και ότι η επιχείρηση αρχίζει από το 0. Μπορούμε επίσης να έχουμε συστοιχίες συστοιχιών, και αυτό ονομάζεται ένα πολυδιάστατο πίνακα. Όταν έχουμε μια πολυδιάστατη array αυτό σημαίνει ότι μπορούμε να έχουμε κάτι σαν γραμμές και στήλες, και αυτό είναι μόνο ένας τρόπος για οπτικοποίηση αυτό ή το σκέφτομαι. Όταν έχω μια πολυδιάστατη array αυτό σημαίνει ότι είμαι πρόκειται να ξεκινήσει χρειάζεται περισσότερο από 1 δείκτη, διότι αν έχω ένα πλέγμα ακριβώς ό, τι λέει σειρά είστε δεν μας δίνει έναν αριθμό. Αυτός είναι πραγματικά ακριβώς πρόκειται να μας δώσει μια λίστα των αριθμών. Ας πούμε ότι έχω αυτή την σειρά εδώ. Έχω μια σειρά που ονομάζεται πλέγμα, και το λέω αυτό είναι 2 γραμμές και 3 στήλες, και έτσι αυτό είναι ένας τρόπος απεικόνισης της. Όταν λέω θέλω να πάρω το στοιχείο στο [1] [2] τούτο σημαίνει ότι επειδή αυτές είναι σειρές πρώτα και έπειτα στήλες Πάω να πηδήξει με τη σειρά 1, αφού είπα 1. Στη συνέχεια, Πάω να έρθω εδώ στη στήλη 2, και είμαι πρόκειται να πάρει την τιμή 6. Κάνετε την αίσθηση; Πολυδιάστατη πίνακες, να θυμάστε, είναι τεχνικά απλώς μια σειρά από πίνακες. Μπορούμε να έχουμε πίνακες των συστοιχιών των συστοιχιών. Μπορούμε να συνεχίσουμε, αλλά πραγματικά ένας τρόπος για να σκεφτεί για πώς γίνεται αυτό που πρέπει και αυτό που συμβαίνει είναι να απεικονίσει σε ένα πλέγμα σαν αυτό. Όταν περνάμε πίνακες στις συναρτήσεις, από όπου και αν πρόκειται να συμπεριφέρονται λίγο διαφορετικά από ό, τι όταν περνάμε τακτικές μεταβλητές σε συναρτήσεις όπως το πέρασμα ενός int ή float. Όταν περνάμε σε ένα int ή char ή οποιοδήποτε από αυτούς τους άλλους τύπους δεδομένων μόλις πήραμε μια ματιά στο αν η λειτουργία αλλάζει η τιμή αυτής της μεταβλητής ότι η αλλαγή δεν πρόκειται να διαδώσει τις στην καλούσα λειτουργία. Με μια διάταξη, από την άλλη πλευρά, αυτό θα συμβεί. Αν έχω περάσει σε μια σειρά σε κάποια λειτουργία και ότι η λειτουργία αλλάζει ορισμένα από τα στοιχεία, όταν έρχομαι πίσω μέχρι και τη λειτουργία που θα ονομάζεται σειρά μου τώρα πρόκειται να είναι διαφορετική, και το λεξιλόγιο για να Οι πίνακες είναι περάσει από αναφορά, όπως θα δούμε αργότερα. Αυτό σχετίζεται με το πώς το έργο δείκτες, όπου οι βασικοί τύποι δεδομένων, Από την άλλη πλευρά, έχουν περάσει ήδη από αξία. Μπορούμε να σκεφτούμε ότι κάνοντας ένα αντίγραφο κάποιας μεταβλητής και στη συνέχεια περνώντας στο αντίγραφο. Δεν έχει σημασία τι κάνουμε με αυτή τη μεταβλητή. Η λειτουργία κλήσης δεν θα πρέπει να γνωρίζει ότι ήταν να αλλάξει. Οι πίνακες είναι απλά ένα λίγο διαφορετικό σε αυτό το θέμα. Για παράδειγμα, ως είδομεν, κύριος είναι απλά μια συνάρτηση που μπορεί να πάρει σε 2 επιχειρήματα. Το πρώτο επιχείρημα για την κύρια λειτουργία τους είναι argc, ή ο αριθμός των επιχειρημάτων, και το δεύτερο επιχείρημα ονομάζεται argv, και αυτοί είναι οι πραγματικές τιμές αυτών των επιχειρημάτων. Ας πούμε ότι έχω ένα πρόγραμμα που ονομάζεται this.c, και το λέω αυτό κάνω, και θα πάω για να τρέξει αυτό στη γραμμή εντολών. Τώρα, για να περάσει σε κάποια επιχειρήματα για να μου πρόγραμμα που ονομάζεται αυτό, Θα μπορούσα να πω κάτι τέτοιο. / Cs αυτό είναι 50. Αυτό είναι ό, τι φανταζόμαστε τον David να κάνουμε κάθε μέρα στο τερματικό. Τώρα, όμως, η κύρια λειτουργία του μέσα σε αυτό το πρόγραμμα έχει αυτές τις τιμές, έτσι argc είναι 4. Θα μπορούσε να είναι μια μικρή σύγχυση, γιατί πραγματικά είμαστε μόνο περνώντας μέσα είναι cs 50. Αυτό είναι μόνο 3. Αλλά να θυμάστε ότι το πρώτο στοιχείο του argv ή το πρώτο επιχείρημα είναι το όνομα της συνάρτησης. Έτσι, αυτό σημαίνει ότι έχουμε 4 πράγματα εδώ, και το πρώτο στοιχείο πρόκειται να είναι. / αυτό. Και αυτό θα πρέπει να εκπροσωπούνται ως ένα string. Στη συνέχεια, τα υπόλοιπα στοιχεία είναι αυτό που πληκτρολογήσατε στο μετά το όνομα του προγράμματος. Έτσι απλά ως ένα μέρος, όπως κατά πάσα πιθανότητα είδε το PSET 2, να θυμάστε ότι η σειρά 50 είναι το ακέραιο ≠ 50. Γι 'αυτό και δεν μπορούμε να πούμε κάτι σαν, "int x = argv 3. Αυτό απλά δεν πρόκειται να έχει νόημα, επειδή αυτό είναι ένα string, και αυτό είναι ένας ακέραιος. Έτσι, εάν θέλετε να μετατρέψετε μεταξύ των 2, θυμηθείτε, θα πάμε να έχουν αυτή τη μαγική λειτουργία που ονομάζεται atoi. Αυτό απαιτεί μια σειρά και επιστρέφει το ακέραιο εκπροσωπούνται στο εσωτερικό της εν λόγω σειράς. Έτσι, αυτό είναι ένα εύκολο λάθος να κάνει με το κουίζ, ακριβώς να σκεφτεί ότι αυτό θα είναι αυτόματα το σωστό τύπο. Αλλά ξέρω ότι αυτά θα είναι πάντα χορδές ακόμη και αν το string περιέχει μόνο έναν ακέραιο αριθμό ή ένα χαρακτήρα ή ένα πλωτήρα. Έτσι τώρα ας μιλήσουμε για το χρόνο λειτουργίας. Όταν έχουμε όλα αυτά τα αλγόριθμους που κάνουν όλα αυτά τα τρελά πράγματα, γίνεται πραγματικά χρήσιμο να θέσουμε το ερώτημα, "Πόσο καιρό θα πάρει;" Εκπροσωπούμε ότι με κάτι που ονομάζεται ασυμπτωτικό συμβολισμό. Έτσι, αυτό σημαίνει ότι - καλά, ας πούμε ότι δίνουμε αλγόριθμος μας μερικά πραγματικά, πραγματικά, πραγματικά μεγάλη είσοδο. Θέλουμε να θέσουμε το ερώτημα, «πόσο καιρό είναι αυτό πρόκειται να πάρει; Πόσα μέτρα προτίθεται να λάβει αλγόριθμος μας να τρέξει ως συνάρτηση του μεγέθους της εισόδου; " Έτσι, ο πρώτος τρόπος που μπορούμε να περιγράψουμε τρέχει ο χρόνος είναι με το μεγάλο Ο. Και αυτό είναι η χειρότερη περίπτωση-το χρόνο μας λειτουργία. Έτσι, αν θέλουμε να ταξινομήσετε μια σειρά, και δίνουμε τον αλγόριθμο μας μια σειρά αυτό είναι, κατά φθίνουσα σειρά, όταν θα πρέπει να είναι σε αύξουσα σειρά, αυτό πρόκειται να είναι η χειρότερη περίπτωση. Αυτό είναι πάνω μας δεσμεύεται στο μέγιστο μήκος του χρόνου αλγόριθμος μας θα λάβει. Από την άλλη πλευρά, αυτό το Ω πρόκειται να περιγράψει καλύτερη περίπτωση χρόνου λειτουργίας. Έτσι, αν έχουμε δώσει μια σειρά ήδη ταξινομημένο σε ένα αλγόριθμο ταξινόμησης, πόσο καιρό θα πάρει για να το τακτοποιήσουμε; Και αυτό, στη συνέχεια, περιγράφει ένα κάτω όριο για χρόνο λειτουργίας. Τόσο εδώ είναι μερικά μόνο από τις λέξεις που περιγράφουν μερικές φορές κοινή λειτουργία. Αυτά είναι σε αύξουσα σειρά. Ο ταχύτερος χρόνος εκτέλεσης έχουμε ονομάζεται σταθερή. Αυτό σημαίνει ότι δεν έχει σημασία πόσο πολλά στοιχεία που δίνουμε αλγόριθμος μας, Δεν έχει σημασία πόσο μεγάλο είναι σειρά μας, διαλογή ή να κάνει ό, τι κάνουμε στη συστοιχία θα είναι πάντα το ίδιο χρονικό διάστημα. Έτσι μπορούμε να αντιπροσωπεύει ότι μόνο με ένα 1, η οποία είναι μια σταθερά. Εξετάσαμε επίσης λογαριθμική χρόνο εκτέλεσης. Έτσι, κάτι σαν δυαδική αναζήτηση είναι λογαριθμική, όπου θα κοπεί το πρόβλημα στο μισό κάθε φορά και τότε τα πράγματα απλά να πάρει υψηλότερη από εκεί. Και αν είστε γραπτώς ποτέ O κάθε παραγοντικό αλγορίθμου, τότε μάλλον δεν θα πρέπει να θεωρούν αυτό ως εργασία ημέρας σας. Όταν συγκρίνουμε τους χρόνους εκτέλεσης είναι σημαντικό να έχουμε κατά νου αυτά τα πράγματα. Έτσι, αν έχω έναν αλγόριθμο που είναι O (n), και κάποιος άλλος έχει ένας αλγόριθμος του O (2n) αυτά είναι πραγματικά ασυμπτωτικά ισοδύναμη. Έτσι, αν φανταζόμαστε n να είναι ένα μεγάλο αριθμό, όπως eleventy δισ. ευρώ: έτσι όταν είμαστε συγκρίνοντας eleventy δισεκατομμύρια κάτι σαν eleventy + 3 δισ., 3 ξαφνικά ότι δεν κάνει πραγματικά μια μεγάλη διαφορά πια. Γι 'αυτό θα πάμε να αρχίσουμε να εξετάζουμε αυτά τα πράγματα να είναι ισοδύναμες. Έτσι τα πράγματα, όπως αυτές τις σταθερές εδώ, υπάρχει 2 χ αυτό, ή την προσθήκη ενός 3, αυτά είναι μόνο σταθερές, και αυτά που πρόκειται να πέσουν επάνω. Έτσι ώστε είναι ο λόγος όλων των 3 αυτών των χρόνων λειτουργίας είναι το ίδιο με το να λέμε ότι είναι O (n). Ομοίως, σε περίπτωση που έχουμε άλλες 2 φορές τρέξιμο, ας πούμε O (n ³ + 2n ²), μπορούμε να προσθέσουμε + N, + 7, και στη συνέχεια έχουμε ένα άλλο χρόνο εκτέλεσης που είναι μόνο O (n ³). πάλι, αυτά είναι το ίδιο πράγμα, επειδή αυτά - αυτές δεν είναι το ίδιο. Αυτά είναι τα ίδια πράγματα, λυπάμαι. Έτσι, αυτά είναι τα ίδια, διότι this ³ n πρόκειται να κυριαρχούν σε αυτή την 2n ². Τι δεν είναι το ίδιο πράγμα είναι αν έχουμε τρέξει φορές σαν O (n ³) και Ο (n ²) επειδή αυτό ³ n είναι πολύ μεγαλύτερο από αυτό ² n. Έτσι, αν έχουμε εκθέτες, ξαφνικά αυτό αρχίζει να έχει σημασία, αλλά όταν είμαστε ακριβώς που ασχολούνται με παράγοντες όπως είμαστε εδώ, τότε δεν πρόκειται να έχει σημασία γιατί ακριβώς πρόκειται να πέσει έξω. Ας ρίξουμε μια ματιά σε μερικά από τους αλγόριθμους που έχουμε δει μέχρι στιγμής και να μιλήσουμε για το χρόνο εκτέλεσης τους. Ο πρώτος τρόπος για να ψάχνει για έναν αριθμό σε μια λίστα, που είδαμε, ήταν γραμμική αναζήτηση. Και η εφαρμογή της γραμμικής αναζήτησης είναι εξαιρετικά απλή. Έχουμε μόνο μια λίστα, και θα πάμε να δούμε κάθε στοιχείο στη λίστα μέχρι να βρούμε τον αριθμό που ψάχνουμε. Έτσι αυτό σημαίνει ότι στη χειρότερη περίπτωση, αυτό το O (n). Και η χειρότερη περίπτωση εδώ θα μπορούσε να είναι εάν το στοιχείο είναι το τελευταίο στοιχείο, στη συνέχεια, χρησιμοποιώντας γραμμική αναζήτηση πρέπει να εξετάσουμε κάθε στοιχείο μέχρι να φτάσουμε στο τελευταίο, ώστε να γνωρίζουν ότι στην πραγματικότητα ήταν στη λίστα. Δεν μπορούμε απλά να εγκαταλείψει στα μισά του δρόμου και να πει, "Είναι πιθανόν να μην είναι εκεί." Με γραμμική αναζήτηση θα πρέπει να εξετάσουμε το όλο θέμα. Η καλύτερη περίπτωση χρόνου τρέξιμο, από την άλλη πλευρά, είναι σταθερή γιατί στην καλύτερη περίπτωση το στοιχείο που ψάχνουμε είναι μόνο το πρώτο στη λίστα. Γι 'αυτό πρόκειται να μας πάρει ακριβώς 1 βήμα, δεν έχει σημασία πόσο μεγάλη είναι η λίστα είναι αν ψάχνουμε για το πρώτο στοιχείο κάθε φορά. Έτσι, όταν κάνετε αναζήτηση, να θυμάστε, δεν απαιτεί ότι η λίστα μας είναι ταξινομημένο. Επειδή είμαστε απλώς πρόκειται να κοιτάξουν πέρα ​​από κάθε στοιχείο, και αυτό δεν έχει τόση σημασία Για ποιο αυτά τα στοιχεία είναι μέσα Μια πιο ευφυή αλγόριθμο αναζήτησης είναι κάτι σαν δυαδική αναζήτηση. Θυμηθείτε, η εφαρμογή της δυαδικής αναζήτησης είναι όταν πάμε να κρατήσει κοιτάζοντας την μέση της λίστας. Και επειδή ψάχνουμε στο κέντρο, θα απαιτήσει ότι η λίστα είναι ταξινομημένη ή αλλιώς δεν ξέρουμε όπου η μεσαία είναι, και πρέπει να κοιτάξουν πέρα ​​από ολόκληρη η λίστα να το βρείτε, και στη συνέχεια, σε αυτό το σημείο είμαστε απλά χάσιμο χρόνου. Έτσι, αν έχουμε μια ταξινομημένη λίστα και βρίσκουμε τη μέση, θα πάμε να συγκρίνουμε τη μέση με το στοιχείο που ψάχνουμε. Εάν είναι πάρα πολύ υψηλή, τότε μπορούμε να ξεχάσουμε το δεξί μισό γιατί ξέρουμε ότι αν στοιχείο μας είναι ήδη πολύ υψηλή και πάντα στα δεξιά αυτού του στοιχείου είναι ακόμη υψηλότερο, τότε δεν χρειάζεται να κοιτάξουμε πια εκεί. Όταν από την άλλη πλευρά, εάν το στοιχείο μας είναι πολύ χαμηλή, γνωρίζουμε τα πάντα στα αριστερά του εν λόγω στοιχείου είναι επίσης πολύ χαμηλή, γι 'αυτό δεν κάνει πραγματικά νόημα να δούμε εκεί, είτε. Με αυτό τον τρόπο, με κάθε βήμα και κάθε φορά που κοιτάζουμε στο μέσο της λίστας, θα πάμε να κόψει το πρόβλημά μας κατά το ήμισυ, επειδή ξαφνικά ξέρουμε ένα σωρό αριθμούς που δεν μπορεί να είναι αυτός που ψάχνουμε. Σε ψευδοκώδικα αυτό θα δούμε κάτι σαν αυτό, και επειδή είμαστε κοπή της λίστας στο μισό κάθε φορά, στη χειρότερη περίπτωση άλματα μας χρόνος λειτουργίας από γραμμική σε λογαριθμική. Έτσι ξαφνικά έχουμε log-in βήματα για να βρει ένα στοιχείο σε μια λίστα. Η καλύτερη περίπτωση-χρόνο που τρέχει, όμως, εξακολουθεί να είναι σταθερό γιατί τώρα, ας πούμε ότι το στοιχείο που ψάχνουμε είναι πάντα την ακριβή μέση της αρχικής λίστας. Γι 'αυτό και μπορούν να αναπτυχθούν λίστα μας τόσο μεγάλο όσο θέλουμε, αλλά αν το στοιχείο που ψάχνουμε είναι στο κέντρο, τότε αυτό είναι μόνο πρόκειται να μας πάρει 1 βήμα. Έτσι, γι 'αυτό είμαστε O (log n) και Ω (1) ή σταθερή. Ας τρέξει πραγματικά δυαδική αναζήτηση σε αυτή τη λίστα. Ας πούμε ότι ψάχνουμε για το στοιχείο 164. Το πρώτο πράγμα που θέλουμε να κάνουμε είναι να βρούμε το μέσο αυτού του καταλόγου. Συμβαίνει ότι το μέσο πρόκειται να πέσει στο μεταξύ αυτών των 2 αριθμών, οπότε ας πούμε απλώς αυθαίρετα, κάθε φορά που πέφτει το μέσο σημείο μεταξύ 2 αριθμών, ας στρογγυλοποιεί προς τα πάνω. Εμείς απλά πρέπει να βεβαιωθείτε ότι το κάνουμε αυτό σε κάθε βήμα του τρόπου. Έτσι θα πάμε για να στρογγυλοποιεί προς τα πάνω, και θα πάμε να πούμε ότι 161 είναι η μέση της λίστας μας. So 161 <164, και κάθε στοιχείο προς τα αριστερά του 161 Είναι επίσης <164, έτσι γνωρίζουμε ότι δεν πρόκειται να μας βοηθήσει καθόλου να αρχίσει να ψάχνει πάνω από εδώ, επειδή το στοιχείο που ψάχνουμε δεν μπορεί να είναι εκεί. Έτσι, αυτό που μπορούμε να κάνουμε είναι απλά μπορούμε να ξεχάσουμε το όλο αριστερό μισό του πίνακα, και τώρα θεωρούν μόνο από το δικαίωμα του 161 και μετά. Έτσι και πάλι, αυτό είναι το μέσο? Ας απλά στρογγυλοποιεί προς τα πάνω. Τώρα 175 είναι πάρα πολύ μεγάλο. Γνωρίζουμε, λοιπόν, ότι δεν πρόκειται να μας βοηθήσει να ψάχνει εδώ ή εδώ, έτσι ώστε να μπορούμε απλά να ρίξει ότι μακριά, και τελικά θα χτυπήσει το 164. Οποιεσδήποτε ερωτήσεις σχετικά με δυαδική αναζήτηση; Ας περάσουμε από την αναζήτηση μέσα από ένα ήδη ταξινομημένο λίστα να λάβει πραγματικά μια λίστα των αριθμών με οποιαδήποτε σειρά και να καταστεί η λίστα σε αύξουσα σειρά. Ο πρώτος αλγόριθμος κοιτάξαμε ονομαζόταν bubble sort. Και αυτό θα ήταν απλούστερο των αλγορίθμων είδαμε. Bubble sort λέει ότι όταν οι 2 στοιχεία μέσα στον κατάλογο είναι εκτός τόπου, που σημαίνει ότι υπάρχει ένας μεγαλύτερος αριθμός προς τα αριστερά από ένα μικρότερο αριθμό, τότε θα πάμε να τα ανταλλάξουν, διότι αυτό σημαίνει ότι ο κατάλογος θα είναι "Πιο ταξινομημένο" από ό, τι ήταν πριν. Και είμαστε ακριβώς πρόκειται να συνεχίσει αυτή τη διαδικασία ξανά και ξανά και ξανά έως ότου τελικά το είδος στοιχεία της φούσκας στην σωστή θέση τους και έχουμε μια ταξινομημένη λίστα. Ο χρόνος λειτουργίας του αυτό πρόκειται να είναι O (n ²). Γιατί να; Λοιπόν, επειδή στη χειρότερη περίπτωση, θα πάμε να λάβουν κάθε στοιχείο, και θα πάμε να καταλήξουμε συγκρίνοντάς την με κάθε άλλο στοιχείο από τη λίστα. Όμως, στην καλύτερη περίπτωση, έχουμε ήδη ταξινομημένη λίστα, φούσκα είδος του ακριβώς πρόκειται να περάσουν από μια φορά, ας πούμε "Όχι. Δεν είχα κάνει καμία swaps, έτσι είμαι γίνει." Έτσι έχουμε μια καλύτερη περίπτωση-χρόνος εκτέλεσης του Ω (n). Ας τρέξει είδος φούσκα σε μια λίστα. Ή πρώτα, ας δούμε κάποια ψευδοκώδικα πραγματικά γρήγορα. Θέλουμε να πούμε ότι θέλετε να παρακολουθείτε, σε κάθε επανάληψη του βρόχου, να παρακολουθείτε από το αν ή δεν αλλάξαμε κάποια στοιχεία. Έτσι, ο λόγος για αυτό είναι, θα πάμε να σταματήσει όταν δεν έχουμε ανταλλάξει κάποια στοιχεία. Έτσι, στο ξεκίνημα του βρόχου μας δεν έχουμε ανταλλάξει τίποτα, γι 'αυτό θα πω ότι είναι ψευδείς. Τώρα, θα πάμε να περάσουν από τη λίστα και συγκρίνετε στοιχείου i στο στοιχείο i + 1 και αν είναι η περίπτωση ότι υπάρχει ένας μεγαλύτερος αριθμός στα αριστερά του μικρότερου αριθμού, τότε είμαστε ακριβώς πρόκειται να τα ανταλλάξουν. Και μετά θα πάμε να θυμόμαστε ότι αντάλλαξαν ένα στοιχείο. Αυτό σημαίνει ότι θα πρέπει να περάσουν από τη λίστα τουλάχιστον 1 φορά επειδή η κατάσταση στην οποία σταματήσαμε είναι όταν ολόκληρη η λίστα είναι ήδη ταξινομημένο, που σημαίνει ότι δεν έχουν γίνει οποιεσδήποτε συμφωνίες ανταλλαγής. Οπότε αυτό είναι γιατί κατάστασή μας εδώ κάτω είναι «ενώ ορισμένα στοιχεία έχουν μετατραπεί. Έτσι τώρα ας εξετάσουμε μόνο αυτό που εκτελείται σε μια λίστα. Έχω την λίστα 5,0,1,6,4. Bubble sort πρόκειται να ξεκινήσει σε όλη τη διαδρομή στο αριστερό, και πρόκειται να συγκρίνουν τα στοιχεία θ, έτσι 0 έως i + 1, η οποία είναι στοιχείο 1. Είναι πρόκειται να πούμε, και 5> 0, αλλά αυτή τη στιγμή 5 είναι προς τα αριστερά, γι 'αυτό πρέπει να ανταλλάξουν το 5 και το 0. Όταν τα ανταλλάξουν, ξαφνικά να βρω αυτό το διαφορετικό κατάλογο. Τώρα 5> 1, έτσι θα πάμε να τα ανταλλάξουν. 5 δεν είναι> 6, γι 'αυτό δεν χρειάζεται να κάνετε τίποτα εδώ. Αλλά 6> 4, γι 'αυτό πρέπει να ανταλλάξουν. Και πάλι, θα πρέπει να διατρέχουν το σύνολο της λίστα για να ανακαλύψουν τελικά ότι αυτά είναι εκτός λειτουργίας? εμείς τους ανταλλάξουν, και σε αυτό το σημείο θα πρέπει να τρέχει μέσα από τη λίστα 1 φορά για να βεβαιωθείτε ότι όλα είναι σε τάξη, και σε αυτό το σημείο είδος φούσκα έχει ολοκληρωθεί. Ένα διαφορετικό αλγόριθμο για τη λήψη ορισμένων στοιχείων και τη διαλογή τους είναι το είδος επιλογής. Η ιδέα πίσω από την επιλογή του είδους είναι ότι θα πάμε για να δημιουργήσουν μια ταξινομημένο τμήμα της λίστας 1 στοιχείο τη φορά. Και ο τρόπος που θα πάμε να το κάνουμε αυτό είναι με τη δημιουργία το αριστερό τμήμα της λίστας. Και βασικά, κάθε - σε κάθε βήμα, θα πάμε να λάβει το μικρότερο στοιχείο που έχουμε μείνει το οποίο δεν έχει ακόμα ταξινομημένο, και θα πάμε για να το μετακινήσετε σε αυτή ταξινομημένο τμήμα. Αυτό σημαίνει ότι πρέπει να βρούμε συνεχώς το ελάχιστο στοιχείο αδιαχώριστα και στη συνέχεια να λάβει αυτό το ελάχιστο στοιχείο και να ανταλλάξει με ό, τι αριστερά-πλέον στοιχείο που δεν είναι ταξινομημένο. Ο χρόνος τρέχει από αυτό πρόκειται να είναι O (n ²), γιατί στη χειρότερη περίπτωση πρέπει να συγκρίνουμε κάθε μεμονωμένο στοιχείο σε κάθε άλλο στοιχείο. Γιατί λέμε ότι αν αρχίσουμε στο αριστερό μισό του πίνακα, χρειαζόμαστε να περάσει ολόκληρο το δεξί τμήμα για να βρείτε το μικρότερο στοιχείο. Και τότε, πάλι, θα πρέπει να πάει πέρα ​​από το ολόκληρο τμήμα δεξιά και συνεχίστε κατά τη διάρκεια αυτής ξανά και ξανά και ξανά. Αυτό πρόκειται να είναι n ². Εμείς πάμε να χρειάζονται ένα για βρόχο μέσα από ένα άλλο για βρόχο γεγονός που υποδηλώνει n ². Στην καλύτερη περίπτωση σκέψης, ας πούμε ότι δίνουμε ένα ήδη ταξινομημένο λίστα? στην πραγματικότητα δεν κάνουν καθόλου καλύτερα από ό, τι n ². Επειδή η επιλογή του είδους δεν έχει καμία δυνατότητα να γνωρίζει ότι το ελάχιστο στοιχείο είναι ακριβώς το ένα που τυχαίνει να είναι κοιτάζοντας. Θα πρέπει ακόμα να βεβαιωθείτε ότι αυτό είναι πραγματικά το ελάχιστο. Και ο μόνος τρόπος για να βεβαιωθείτε ότι είναι το ελάχιστο, χρησιμοποιώντας αυτόν τον αλγόριθμο, είναι να εξετάσουμε κάθε στοιχείο και πάλι. Έτσι, στην πραγματικότητα, αν το δώσει - αν δώσεις ένα είδος επιλογής ήδη ταξινομημένο κατάλογο, δεν πρόκειται να κάνει καθόλου καλύτερα από ό, τι του δίνει μια λίστα που δεν είναι ταξινομημένο ακόμα. Με την ευκαιρία, αν συμβαίνει να είναι η περίπτωση που κάτι είναι O (κάτι) και το ωμέγα του κάτι, μπορούμε να πούμε πιο λακωνικά ότι είναι κάτι θ του. Έτσι, αν βλέπετε ότι έρχονται οπουδήποτε, αυτό είναι τι σημαίνει αυτό ακριβώς. Αν κάτι είναι θήτα του ν ², είναι τόσο μεγάλο Ο (n ²) και Ω (n ²). Επομένως, καλή περίπτωση και στη χειρότερη περίπτωση, δεν κάνει τη διαφορά, ο αλγόριθμος πρόκειται να κάνει το ίδιο πράγμα κάθε φορά. Έτσι, αυτό είναι ό, τι ψευδοκώδικα για την επιλογή του είδους θα μπορούσε να μοιάζει. Είμαστε ουσιαστικά πρόκειται να πω ότι θέλω να επαναλάβει πάνω από τη λίστα από αριστερά προς τα δεξιά, και σε κάθε επανάληψη του βρόχου, Πάω να μετακινήσετε το ελάχιστο στοιχείο σ 'αυτό το τμήμα με ταξινόμηση του καταλόγου. Και από τη στιγμή που κινούνται κάτι εκεί, ποτέ δεν πρέπει να δούμε ξανά αυτό το στοιχείο. Επειδή μόλις έχω ανταλλάξει ένα στοιχείο προς τα αριστερά τμήμα της λίστας, είναι ταξινομημένο γιατί κάνουμε ό, τι σε αύξουσα σειρά χρησιμοποιώντας ελάχιστα. Έτσι είπαμε, εντάξει, είμαστε σε θέση i, και εμείς πρέπει να εξετάσουμε όλα τα στοιχεία στα δεξιά του i για να βρείτε το ελάχιστο. Έτσι ώστε σημαίνει ότι θέλουμε να δούμε από το i + 1 στο τέλος της λίστας. Και τώρα, αν το στοιχείο ότι αυτή τη στιγμή εξετάζουμε είναι μικρότερη από την ελάχιστη μας μέχρι σήμερα, που, θυμηθείτε, ξεκινάμε από το ελάχιστο να είναι μόνο ανεξάρτητα από το στοιχείο είμαστε αυτή τη στιγμή? Θα υποθέσουμε ότι αυτό είναι το ελάχιστο. Αν βρω ένα στοιχείο που είναι μικρότερο από αυτό, τότε θα πάω να πω, εντάξει, καλά, έχω βρει ένα νέο ελάχιστο. Πάω να θυμηθείτε πού ήταν αυτό το ελάχιστο. Μέχρι τώρα, από τη στιγμή που έχω περάσει αυτό το δικαίωμα αδιαχώριστα τμήμα, Μπορώ να πω ότι είμαι πρόκειται να ανταλλάξει το ελάχιστο στοιχείο με το στοιχείο που είναι σε θέση i. Αυτό πρόκειται να δημιουργήσει λίστα μου, ταξινομημένο τμήμα μου στη λίστα από αριστερά προς τα δεξιά, και δεν πρέπει ποτέ να δούμε ένα στοιχείο για μια ακόμη φορά ότι είναι σε αυτό το τμήμα. Μόλις έχουμε άλλαζε. Ας τρέξει είδος επιλογή σε αυτή τη λίστα. Το μπλε στοιχείο εδώ θα είναι το i, και το κόκκινο στοιχείο θα είναι το ελάχιστο στοιχείο. Γι 'αυτό και ξεκινά σε όλη τη διαδρομή στο αριστερό μέρος της λίστας, έτσι ώστε σε 5. Τώρα πρέπει να βρούμε το ελάχιστο στοιχείο αδιαχώριστα. Γι 'αυτό και λένε 0 <5, οπότε 0 είναι νέα ελάχιστα μου. Αλλά δεν μπορώ να σταματήσει εκεί, διότι ακόμη και αν μπορούμε να αναγνωρίσουμε ότι το 0 είναι το μικρότερο, πρέπει να τρέξει μέσα από κάθε άλλο στοιχείο της λίστας για να βεβαιωθείτε. So 1 είναι μεγαλύτερο, 6 είναι μεγαλύτερο, 4 είναι μεγαλύτερο. Αυτό σημαίνει ότι μετά την εξέταση όλων αυτών των στοιχείων, έχω αποφασισμένος 0 είναι το μικρότερο. Γι 'αυτό και πρόκειται να ανταλλάξει το 5 και το 0. Μόλις ανταλλάξουν ότι, Πάω να πάρετε μια νέα λίστα, και ξέρω ότι ποτέ δεν πρέπει να εξετάσουμε και πάλι ότι 0 γιατί από τη στιγμή που έχω άλλαζε, έχω ταξινομημένο και τελειώσαμε. Τώρα είναι ακριβώς έτσι συμβαίνει ότι το μπλε στοιχείο είναι και πάλι το 5, και θα πρέπει να εξετάσουμε το 1, το 6 και το 4 για να καθορίσει ότι 1 είναι το μικρότερο στοιχείο ελάχιστο, οπότε θα ανταλλάξουν το 1 και το 5. Και πάλι, θα πρέπει να εξετάσουμε - συγκρίνετε το 5 στο 6 και το 4, και θα πάμε για να ανταλλάξει το 4 και το 5, και, τέλος, να συγκρίνουν οι 2 αριθμοί και ανταλλαγής τους μέχρι να φτάσουμε ταξινομημένη λίστα μας. Οποιεσδήποτε ερωτήσεις σχετικά με την επιλογή του είδους; Εντάξει. Ας προχωρήσουμε στο τελευταίο θέμα εδώ, και αυτό είναι αναδρομή. Αναδρομή, θυμηθείτε, είναι πραγματικά αυτό το πράγμα, όπου μετα μια λειτουργία επανειλημμένα αυτοαποκαλείται. Έτσι, σε κάποιο σημείο, ενώ fuction μας καλεί η ίδια επανειλημμένα, πρέπει να υπάρχει κάποιο σημείο στο οποίο θα σταματήσουμε καλώντας τους εαυτούς μας. Γιατί αν δεν το κάνουμε αυτό, τότε απλά θα συνεχίσουμε να το κάνουμε αυτό για πάντα, και το πρόγραμμά μας είναι απλώς δεν πρόκειται να λύσει. Καλούμε αυτή η κατάσταση η βασική περίπτωση. Και το βασικό σενάριο λέει ότι, αντί να ζητά μια λειτουργία και πάλι, Είμαι ακριβώς πρόκειται να επιστρέψει κάποια αξία. Έτσι, όταν έχουμε επιστρέψει μια τιμή, έχουμε σταματήσει να καλεί τον εαυτό μας, και το υπόλοιπο των προσκλήσεων που έχουμε κάνει μέχρι τώρα μπορεί να επιστρέψει. Το αντίθετο του το βασικό σενάριο είναι η αναδρομική περίπτωση. Και αυτό είναι που θέλουμε να κάνουμε άλλη κλήση στη λειτουργία που είμαστε σήμερα μέσα Και κατά πάσα πιθανότητα, αν και όχι πάντα, θέλουν να χρησιμοποιούν διαφορετικά επιχειρήματα. Έτσι, αν έχουμε μια λειτουργία που ονομάζεται στ, ζ και ονομάζεται απλά πάρτε 1 επιχείρημα, και εμείς απλά να κρατήσει καλώντας f (1), f (1), f (1), και είναι ακριβώς έτσι συμβαίνει ότι το επιχείρημα 1 εμπίπτει σε περίπτωση επαναληπτικής, είμαστε ακόμα ποτέ δεν πρόκειται να σταματήσει. Ακόμα και αν έχουμε μια βασική περίπτωση, θα πρέπει να βεβαιωθείτε ότι τελικά θα πάμε για να χτυπήσει το βασικό σενάριο. Δεν κρατήσει μόνο διαμονή σε αυτή την περίπτωση επαναληπτικής. Σε γενικές γραμμές, όταν εμείς οι ίδιοι αποκαλούν, θα πρόκειται πιθανώς να έχουν ένα διαφορετικό επιχείρημα κάθε φορά. Εδώ είναι ένα πολύ απλό αναδρομική συνάρτηση. Έτσι, αυτό θα υπολογιστεί το παραγοντικό ενός αριθμού. Μέχρι κορυφή εδώ έχουμε περίπτωση βάση μας. Στην περίπτωση που n ≤ 1, δεν πρόκειται να καλέσει ξανά παραγοντικού. Εμείς πάμε για να σταματήσει? Είμαστε ακριβώς πρόκειται να επιστρέψει κάποια αξία. Αν αυτό δεν είναι αλήθεια, τότε θα πάμε για να χτυπήσει αναδρομική περίπτωσή μας. Σημειώστε εδώ ότι δεν είμαστε ένα απλό τηλεφώνημα στο παραγοντικό (n), γιατί αυτό δεν θα ήταν πολύ χρήσιμη. Εμείς πάμε για να καλέσει παραγοντικό του κάτι άλλο. Και έτσι μπορείτε να δείτε, αν τελικά περνάμε παραγοντικό (5) ή κάτι, θα πάμε να καλέσει παραγοντικό (4) και ούτω καθεξής, και τελικά θα πάμε για να χτυπήσει αυτό το βασικό σενάριο. Έτσι, αυτό φαίνεται καλό. Ας δούμε τι συμβαίνει όταν τρέχουμε στην πραγματικότητα αυτό. Αυτή είναι η στοίβα, και ας πούμε ότι ο κύριος πρόκειται να καλέσετε τη λειτουργία αυτή με το επιχείρημα (4). Έτσι, όταν βλέπει και παραγοντικό = 4, θα παραγοντικό να ζητήσει η ίδια. Τώρα, ξαφνικά, έχουμε παραγοντικό (3). Έτσι αυτές οι λειτουργίες θα συνεχίσει να αυξάνεται έως ότου τελικά χτυπάμε περίπτωση βάση μας. Σε αυτό το σημείο, η τιμή επιστροφής της είναι η επιστροφή (nx η τιμή επιστροφής αυτής), η αξία της επιστροφής είναι nx η τιμή επιστροφής αυτής. Τελικά θα πρέπει να χτυπήσει κάποιον αριθμό. Στην κορυφή εδώ, λέμε επιστροφή 1. Αυτό σημαίνει ότι τη στιγμή που θα επιστρέψει τον αριθμό αυτό, μπορούμε να σκάσει αυτό από τη στοίβα. Έτσι, αυτό το παραγοντικό (1) γίνεται. Όταν επιστρέφει 1, αυτό το παραγοντικό (1) επιστρέφει, αυτή η επιστροφή στην 1. Η τιμή επιστροφής αυτής, θυμηθείτε, ήταν nx η τιμή επιστροφής αυτής. Έτσι, ξαφνικά, αυτός ο τύπος ξέρει ότι θέλω να επιστρέψω 2. Έτσι θυμηθείτε, επιστρέφει τιμή του είναι μόλις nx η τιμή επιστροφής μέχρι εδώ. Έτσι τώρα μπορούμε να πούμε 3 x 2, και, τέλος, εδώ μπορούμε να πούμε αυτό ακριβώς πρόκειται να είναι 4 x 3 x 2. Και όταν αυτή η επιστροφή, θα πάρει κάτω σε ένα μόνο ακέραιο μέσα από τα κύρια. Οποιεσδήποτε ερωτήσεις σχετικά με αναδρομή; Εντάξει. Έτσι, υπάρχει περισσότερος χρόνος για τις ερωτήσεις στο τέλος, αλλά τώρα Ιωσήφ θα καλύψει τα υπόλοιπα θέματα. [Joseph Ong] Εντάξει. Έτσι τώρα που έχουμε μιλήσει για επαναλήψεις, Ας μιλήσουμε λίγο για το τι είδους είναι συγχώνευση. Συγχώνευση είδος είναι ουσιαστικά ένας άλλος τρόπος για τη διαλογή μια λίστα αριθμών. Και πώς λειτουργεί είναι, με τέτοια συγχώνευση έχετε μια λίστα, και αυτό που κάνουμε είναι λέμε, ας χωριστεί αυτή σε 2 μισά. Θα πρώτα να εκτελέσετε συγχώνευση είδος και πάλι στο αριστερό μισό, τότε θα τρέξει συγχώνευση είδος στο δεξιό μισό, και ότι τώρα μας δίνει 2 μισά που είναι ταξινομημένο, και τώρα θα πάμε να συνδυάσει τα μισά μαζί. Είναι λίγο δύσκολο να δει χωρίς ένα παράδειγμα, έτσι θα πάμε μέσα από τις κινήσεις και να δούμε τι θα συμβεί. Έτσι θα ξεκινήσει με αυτόν τον κατάλογο, θα το χωρίσει σε 2 ημίχρονα. Τρέχουμε συγχώνευση είδος στο αριστερό μισό πρώτα. Οπότε αυτό είναι το αριστερό μισό, και τώρα μπορούμε να τρέχει μέσα από αυτήν τη λίστα και πάλι που παίρνει πέρασε σε είδος συγχώνευσης, και στη συνέχεια να δούμε, και πάλι, στην αριστερή πλευρά του εν λόγω καταλόγου και διατρέχουμε συγχώνευσης είδος σε αυτό. Τώρα, έχουμε τα κάτω σε μια λίστα από 2 αριθμούς, και τώρα το αριστερό μισό είναι μόνο 1 στοιχείο καιρό, και δεν μπορούμε να χωρίσει μια λίστα που είναι μόνο 1 στοιχείο σε μισό, έτσι απλά να πω, από τη στιγμή που έχουμε 50, το οποίο είναι μόλις 1 στοιχείο, είναι ήδη ταξινομημένο. Μόλις τελειώσουμε με αυτό, μπορούμε να δούμε ότι μπορούμε προχωρήσουμε στο δεξιό μισό αυτού του καταλόγου, και 3 είναι επίσης ταξινομημένο, και έτσι τώρα που ταξινομούνται τα δύο μισά αυτού του καταλόγου μπορούμε να ενώσουμε αυτούς τους αριθμούς πίσω από κοινού. Γι 'αυτό και δούμε σε 50 και 3? 3 είναι μικρότερο από το 50, έτσι ώστε να πηγαίνει στην πρώτη και στη συνέχεια 50 μπαίνει Τώρα, αυτό το κάνει? Πάμε πίσω μέχρι εκείνη τη λίστα και το είδος είναι σωστό μισό. 42 είναι το δικό της αριθμό αυτό, γι 'αυτό είναι ήδη ταξινομημένο. Έτσι τώρα συγκρίνουμε αυτά τα 2 και 3 είναι μικρότερο από 42, έτσι ώστε παίρνει θέσει στην πρώτη, τώρα 42 παίρνει θέσει σε, και 50 παίρνει θέσει in Τώρα, που είναι ταξινομημένο, θα πάνε όλα το δρόμο της επιστροφής προς την κορυφή, 1337 και 15. Λοιπόν, τώρα εξετάσουμε το αριστερό μισό αυτού του καταλόγου? 1337 είναι από μόνη της έτσι ώστε να είναι ταξινομημένο και ίδιο με 15. Έτσι τώρα να συνδυάσουμε αυτά τα 2 αριθμούς για να ταξινομήσετε ότι η αρχική λίστα, 15 <1337, έτσι ώστε να πηγαίνει στην πρώτη, στη συνέχεια, πηγαίνει μέσα 1337 Και τώρα ταξινομημένο δύο μισά της αρχικής λίστας επάνω στην κορυφή. Και το μόνο που έχουμε να κάνουμε είναι να συνδυάσει αυτά. Εξετάζουμε τις 2 πρώτοι αριθμοί αυτού του καταλόγου, 3 <15, έτσι ώστε να πηγαίνει στο είδος σειρά πρώτα. 15 <42, έτσι ώστε να πηγαίνει μέσα Τώρα, 42 <1337, που πηγαίνει μέσα 50 <1337, έτσι ώστε να πηγαίνει μέσα και παρατηρήσετε ότι πήραμε μόλις 2 αριθμούς μακριά από αυτή τη λίστα. Γι 'αυτό και δεν είστε απλά εναλλαγή μεταξύ των 2 λιστών. Είμαστε απλά κοιτάζοντας την αρχή, και παίρνετε το στοιχείο αυτό είναι μικρότερο και στη συνέχεια, θέτει σε σειρά μας. Τώρα έχουμε συγχωνευθεί όλα τα μισά και τελειώσαμε. Οποιεσδήποτε ερωτήσεις σχετικά με τη συγχώνευση του είδους; Ναι; [Φοιτητικό] Αν είναι διαιρεθεί σε πολλές ομάδες, γιατί δεν γίνεται διαχωρισμός μόνο μία φορά και έχετε 3 και 2 σε μια ομάδα; [Υπόλοιπο ακατάληπτο ερώτημα] Ο λόγος - έτσι το ερώτημα είναι, γιατί να μην μπορούμε να συγχωνεύσει τους ακριβώς σε αυτό το πρώτο βήμα αφού τους έχουμε; Ο λόγος που μπορούμε να το κάνουμε αυτό, ξεκινούν από τα αριστερά, τα περισσότερα στοιχεία από τις δύο πλευρές, και στη συνέχεια να λάβει το μικρότερο και το βάζουμε σε, είναι ότι ξέρουμε ότι αυτά μεμονωμένες λίστες είναι ταξινομημένο σε παραγγελίες. Έτσι, αν κοιτάζω αριστερά-τα περισσότερα στοιχεία των δύο ημίχρονα, Ξέρω ότι πρόκειται να είναι τα μικρότερα στοιχεία αυτών των καταλόγων. Γι 'αυτό και μπορεί να τα βάλει σε μικρότερες κηλίδες στοιχείο αυτής της μεγάλης λίστας. Από την άλλη πλευρά, αν δούμε τις 2 λίστες στο δεύτερο επίπεδο εκεί πέρα, 50, 3, 42, 1337 και 15, αυτά δεν είναι ταξινομημένο. Έτσι, αν κοιτάζω 50 και 1337, Πάω να βάλει 50 στην λίστα μου πρώτα. Αλλά αυτό δεν κάνει πραγματικά νόημα, διότι το 3 είναι το μικρότερο στοιχείο από όλα αυτά. Έτσι, ο μόνος λόγος που μπορούμε να κάνουμε αυτό το βήμα είναι συνδυάζοντας επειδή οι λίστες μας ήδη ταξινομημένο. Αυτός είναι ο λόγος που έχουμε να πιάσουμε σε όλη τη διαδρομή προς τα κάτω γιατί όταν έχουμε μόνο έναν αριθμό, ξέρετε ότι ένα μόνο αριθμό και αυτή η ίδια είναι ήδη ταξινομημένη λίστα. Οποιεσδήποτε ερωτήσεις; Όχι; Πολυπλοκότητα; Λοιπόν, μπορείτε να δείτε ότι σε κάθε βήμα υπάρχει αριθμοί τέλος, και μπορούμε να διαιρέσουμε μια λίστα στο ημερολόγιο ενός δεύτερου n φορές, το οποίο είναι όπου παίρνουμε αυτό n log n x πολυπλοκότητα. Και θα δείτε την καλύτερη περίπτωση για το είδος συγχώνευσης είναι n log n, και είναι ακριβώς έτσι συμβαίνει ότι η χειρότερη περίπτωση, ή το Ω εκεί πέρα, είναι επίσης n log n. Κάτι που πρέπει να θυμάστε. Προχωρώντας, πάμε για κάποια σούπερ βασικό αρχείο I / O. Αν κοίταξε Scramble, θα παρατηρήσετε είχαμε κάποιο είδος του συστήματος όπου θα μπορούσατε να γράψετε σε ένα αρχείο καταγραφής, αν μπορείτε να διαβάσετε μέσω του κώδικα. Ας δούμε πώς μπορείτε να το κάνετε αυτό. Λοιπόν, έχουμε fprintf, το οποίο μπορείτε να σκεφτείτε, όπως ακριβώς printf, αλλά μόνο εκτύπωση σε αρχείο αντί, και ως εκ τούτου η f στην αρχή. Αυτό το είδος του κώδικα μέχρι εδώ, αυτό που κάνει είναι, όπως ίσως έχετε δει στο Scramble, περνά από 2-διαστάσεων εκτύπωση από σειρά σας ανά γραμμή τι είναι οι αριθμοί. Σε αυτή την περίπτωση, printf εκτυπώνει σε τερματικό σας ή αυτό που λέμε η τυπική έξοδο του τμήματος. Και τώρα, σε αυτή την περίπτωση, το μόνο που έχουμε να κάνουμε είναι να αντικαταστήσει printf με fprintf, πω ότι αυτό το αρχείο που θέλετε να εκτυπώσετε, και στην περίπτωση αυτή εκτυπώνει ακριβώς έξω για αυτό το αρχείο αντί να την εκτύπωση στο τερματικό σας. Καλά, τότε ανακύπτει το ερώτημα: Πού θα πάρει αυτό το είδος του αρχείου από το, έτσι δεν είναι; Περάσαμε συνδεθείτε σε αυτό το fprintf fuction, αλλά δεν είχαμε ιδέα από πού προήλθε. Λοιπόν, στις αρχές του κώδικα, ό, τι είχαμε ήταν αυτό κομμάτι του κώδικα πάνω από εδώ, η οποία ουσιαστικά λέει ότι το αρχείο ανοιχτό καλεί log.txt. Τι κάνουμε μετά από αυτό είναι ότι πρέπει να βεβαιωθείτε ότι το αρχείο είναι στην πραγματικότητα άνοιξε με επιτυχία. Γι 'αυτό μπορεί να αποτύχει για πολλούς λόγους? Δεν έχετε αρκετό χώρο στον υπολογιστή σας, για παράδειγμα. Γι 'αυτό είναι πάντα σημαντικό, πριν κάνετε οποιαδήποτε εργασία με το αρχείο να ελέγξουμε αν αυτό το αρχείο άνοιξε με επιτυχία. Έτσι τι ότι, αυτό είναι ένα επιχείρημα για να fopen, καλά, μπορούμε να ανοίξουμε ένα αρχείο με πολλούς τρόπους. Τι μπορούμε να κάνουμε είναι, μπορούμε να περάσουμε το w, το οποίο σημαίνει ότι υπερισχύει το αρχείο αν βγαίνει ήδη, Μπορούμε να περάσει ένα ένα, τα οποία θα επισυνάπτει στο τέλος του αρχείου αντί του σημαντικού αυτό, ή μπορούμε να ορίσουμε r, πράγμα που σημαίνει, ας ανοίξετε το αρχείο ως μόνο για ανάγνωση. Έτσι, αν το πρόγραμμα προσπαθεί να κάνει αλλαγές στο αρχείο, φωνάζω σε αυτούς και να μην τους αφήσουμε να το κάνουν. Τέλος, μόλις τελειώσετε με το αρχείο, κάνει να κάνει εργασίες σε αυτό, θα πρέπει να βεβαιωθείτε ότι κλείνουμε το αρχείο. Και έτσι στο τέλος του προγράμματός σας, θα έχετε την ευκαιρία να τους περάσει και πάλι αυτό το αρχείο που ανοίξατε, και μόλις το κλείσετε. Έτσι, αυτό είναι κάτι σημαντικό που θα πρέπει να βεβαιωθείτε ότι έχετε κάνει. Έτσι θυμηθείτε, μπορείτε να ανοίξετε ένα αρχείο, τότε μπορείτε να γράψετε στο αρχείο, κάνουν εργασίες στο αρχείο, αλλά τότε θα πρέπει να κλείσετε το αρχείο στο τέλος. Οποιεσδήποτε ερωτήσεις σχετικά με τις βασικές αρχείο I / O; Ναι; [Ερώτηση Φοιτητών, ακατάληπτο] Δικαίωμα εδώ. Το ερώτημα είναι, όταν το κάνει αυτό αρχείο log.txt εμφανίζονται; Λοιπόν, αν έχετε μόλις δώσει log.txt, αυτό δημιουργεί στον ίδιο κατάλογο με το εκτελέσιμο. Έτσι, εάν Μπορείτε πλέον - >> [ερώτηση Φοιτητών, ακατάληπτο] Ναι. Στον ίδιο φάκελο, ή στον ίδιο κατάλογο, όπως την αποκαλούν. Τώρα μνήμη, η καπνοδόχος, και σωρού. Λοιπόν, πώς είναι η μνήμη που ορίζονται στον υπολογιστή; Λοιπόν, μπορείτε να φανταστείτε μνήμη ως είδος αυτού του μπλοκ εδώ. Και στη μνήμη έχουμε αυτό που ονομάζεται το σωρό κολλήσει εκεί πέρα, και τη στοίβα που υπάρχει εκεί κάτω. Και ο σωρός μεγαλώνει προς τα κάτω και η στοίβα μεγαλώνει προς τα πάνω. Έτσι, όπως ανέφερε ο Tommy - Ω, καλά, και έχουμε αυτά τα άλλα 4 τμήματα που θα πάρω στο δεύτερο - Όπως δήλωσε ο Tommy νωρίτερα, ξέρετε πώς τα καθήκοντά του αποκαλούν τους εαυτούς τους και καλούν ο ένας τον άλλο; Θα δημιουργήσει αυτό το είδος της στοίβας πλαίσιο. Λοιπόν, αν η κύρια κλήσεις foo, foo παίρνει τοποθετούνται στη στοίβα. Foo καλεί bar, να βάλουμε στη στοίβα, και που παίρνει τοποθετούνται στη στοίβα μετά. Και καθώς επιστρέφουν, ο καθένας να απογειωθεί τη στοίβα. Ποια είναι η κάθε μία από αυτές τις θέσεις και κρατήστε τη μνήμη; Λοιπόν, η κορυφή, η οποία είναι το τμήμα κειμένου, περιέχει το ίδιο το πρόγραμμα. Έτσι, τον κώδικα μηχανής, που υπάρχει, τη στιγμή που θα καταρτίσει το πρόγραμμά σας. Στη συνέχεια, οποιαδήποτε καθολικές μεταβλητές αρχικοποιηθούν. Έτσι έχετε καθολικές μεταβλητές στο πρόγραμμά σας, και όπως λέτε, α = 5, που παίρνει θέσει σε αυτό το τμήμα, και ακριβώς κάτω από αυτό, έχετε δεν έχει προετοιμαστεί παγκόσμια δεδομένα, τα οποία είναι απλά μια int, αλλά δεν λες ότι είναι ίσο με τίποτα. Συνειδητοποιήστε αυτές είναι καθολικές μεταβλητές, έτσι ώστε να είμαστε έξω από τα κύρια. Έτσι, αυτό σημαίνει ότι όλα τα παγκόσμια μεταβλητές που έχουν δηλωθεί αλλά δεν αρχικοποιείται. Έτσι, ό, τι είναι στο σωρό; Η μνήμη που εκχωρείται με malloc, το οποίο θα φτάσουμε στο λίγο. Και τέλος, με τη στοίβα έχετε τοπικές μεταβλητές και οποιεσδήποτε λειτουργίες μπορείτε να καλέσετε σε οποιαδήποτε από τις παραμέτρους τους. Το τελευταίο πράγμα, δεν πρέπει πραγματικά να ξέρετε τι κάνουν οι μεταβλητές περιβάλλοντος, αλλά κάθε φορά που τρέχει το πρόγραμμα, δεν υπάρχει κάτι που σχετίζεται, όπως αυτό είναι το όνομα του προσώπου που έτρεξε το πρόγραμμα. Και αυτό πρόκειται να είναι το είδος του στο κάτω μέρος. Όσον αφορά τις διευθύνσεις μνήμης, η οποία είναι δεκαεξαδικές τιμές, οι τιμές στην κορυφή ξεκίνημα στο 0, και πάνε σε όλη τη διαδρομή προς τα κάτω. Σε αυτή την περίπτωση, αν είστε στο σύστημα 32-bit, η διεύθυνση στο κάτω μέρος πρόκειται να είναι 0x, ακολουθούμενη από af, γιατί αυτό είναι 32 bits, η οποία είναι 8 bytes, και σε αυτή την περίπτωση 8 bytes αντιστοιχεί σε 8 ψηφία δεκαεξαδική. Έτσι, εδώ κάτω θα πάμε να έχουν, όπως, 0xffffff, και εκεί θα πάμε να έχουν 0. Έτσι, ποιες είναι οι δείκτες; Μερικοί από εσάς μπορεί να μην καλύπτονται στο τμήμα αυτό πριν. αλλά εμείς δεν πάμε πάνω σε διάλεξη, οπότε ένας δείκτης είναι απλά ένας τύπος δεδομένων η οποία αποθηκεύει, αντί κάποιου είδους αξίας, όπως 50, αποθηκεύει τη διεύθυνση της κάποια θέση στη μνήμη. Όπως αυτή τη μνήμη [ακατάληπτο]. Έτσι, σε αυτή την περίπτωση, αυτό που έχουμε είναι, έχουμε ένα δείκτη σε ακέραιο ή έναν int *, και περιέχει αυτή δεκαεξαδική διεύθυνση του 0xDEADBEEF. Έτσι, αυτό που έχουμε είναι, τώρα, αυτό δείχνει το δείκτη σε κάποια θέση στη μνήμη, και αυτό είναι μόνο ένα, η τιμή 50 είναι σε αυτή τη θέση μνήμης. Σε μερικά συστήματα 32-bit, σε όλα τα συστήματα 32-bit, δείκτες καταλαμβάνουν 32 bits ή 4 bytes. Αλλά, για παράδειγμα, σε ένα σύστημα 64-bit, δείκτες είναι 64 μπιτ. Έτσι, αυτό είναι κάτι που θα θέλετε να έχετε κατά νου. Έτσι, σε ένα σύστημα τέλος-bit, είναι ένας δείκτης bits τέλος μακρύς. Οι δείκτες είναι είδος δύσκολο να αφομοιώσουν χωρίς επιπλέον πράγματα, οπότε ας πάμε μέσα από ένα παράδειγμα της δυναμικής κατανομής μνήμης. Τι δυναμική κατανομή μνήμης κάνει για σας, ή αυτό που λέμε malloc, σας επιτρέπει να διαθέσει κάποιο είδος των δεδομένων έξω από το σετ. Έτσι αυτά τα δεδομένα είναι είδος μονιμότερη για όλη τη διάρκεια του προγράμματος. Διότι, όπως γνωρίζετε, αν δηλώνουν x μέσα από μια συνάρτηση, και ότι επιστρέφει λειτουργία, δεν έχετε πλέον πρόσβαση στα δεδομένα που είναι αποθηκευμένα στο x. Τι δείκτες ας κάνουμε είναι να αποθηκεύουν ας μνήμη ή κατάστημα αξίες σε ένα διαφορετικό τμήμα της μνήμης, δηλαδή το σωρό. Τώρα μόλις επιστρέψει από τη λειτουργία, εφ 'όσον έχουμε ένα δείκτη σε αυτή τη θέση στη μνήμη, τότε τι μπορούμε να κάνουμε είναι να μπορούμε να εξετάσουμε μόνο τις τιμές που υπάρχουν. Ας δούμε ένα παράδειγμα: Αυτή είναι η διάταξη της μνήμης μας και πάλι. Και έχουμε αυτή τη λειτουργία, τα κύρια. Αυτό που κάνει είναι - εντάξει, έτσι απλά, έτσι; - int x = 5, αυτό είναι απλά μια μεταβλητή στη στοίβα σε κύρια. Από την άλλη πλευρά, τώρα δηλώνουμε ένα δείκτη ο οποίος καλεί τους giveMeThreeInts λειτουργία. Και έτσι τώρα πάμε σε αυτή τη λειτουργία και δημιουργούμε ένα νέο πλαίσιο για το stack. Ωστόσο, σε αυτό το πλαίσιο στοίβας, δηλώνουμε int * temp, η οποία σε ακέραιους mallocs 3 για εμάς. Έτσι, το μέγεθος του int θα μας δώσει πόσα bytes αυτό είναι int, malloc και μας δίνει ότι πολλά byte του χώρου στο σωρό. Έτσι, σε αυτή την περίπτωση, έχουμε δημιουργήσει αρκετό χώρο για 3 ακέραιους αριθμούς, και ο σωρός είναι ο τρόπος εκεί, το οποίο είναι ο λόγος που έχω είναι που ψηλότερα. Μόλις τελειώσετε, θα επανέλθουμε εδώ, το μόνο που χρειάζεστε 3 ints επέστρεψε, και επιστρέφει την διεύθυνση, στην περίπτωση αυτή πάνω, όταν η μνήμη είναι. Και θέτουμε το δείκτη = διακόπτη, και εκεί έχουμε μόνο ένα άλλο δείκτη. Αλλά τι επιστρέφει η λειτουργία στοιβάζονται εδώ και εξαφανίζεται. Έτσι θερμοκρασία εξαφανίζεται, αλλά εξακολουθούν να διατηρούν τη διεύθυνση όπου αυτές οι 3 είναι ακέραιοι μέσα από δίκτυο. Έτσι, σε αυτό το σύνολο, οι δείκτες είναι scoped σε τοπικό επίπεδο για την στοιβάζονται πλαίσιο, αλλά η μνήμη στο οποίο αναφέρονται είναι στο σωρό. Μήπως αυτό έχει νόημα; [Φοιτητικό] Θα μπορούσατε να επαναλάβετε αυτό; >> [Joseph] Ναι. Έτσι, αν πάω πίσω μόνο λίγο, θα δείτε ότι διατίθενται temp μέρος της μνήμης στο σωρό μέχρι εκεί. Έτσι, όταν αυτή η λειτουργία, giveMeThreeInts επιστρέφει, αυτή η στοίβα εδώ πρόκειται να εξαφανιστούν. Και με αυτό οποιαδήποτε από τις μεταβλητές, σε αυτή την περίπτωση, αυτό δείκτη που διατέθηκε στο πλαίσιο στοιβάζονται. Δηλαδή πρόκειται να εξαφανιστεί, αλλά από τη στιγμή που επέστρεψε temp και θέτουμε δείκτη = temp, ο δείκτης είναι τώρα πρόκειται να επισημάνω την ίδια μνήμη του θέση, όπως η θερμοκρασία ήταν. Μέχρι τώρα, ακόμα κι αν χάνουμε temp, ότι οι τοπικές δείκτη, που εξακολουθούν να διατηρούν τη διεύθυνση μνήμης του τι έδειχνε προς τα μέσα αυτής της μεταβλητής δείκτη. Ερωτήσεις; Αυτό μπορεί να είναι το είδος της μια σύγχυση θέμα, αν δεν έχετε περάσει από πάνω του στο τμήμα. Μπορούμε, TF σας σίγουρα θα πάει πέρα ​​από αυτό και φυσικά μπορούμε να απαντήσουμε σε ερωτήσεις στο τέλος της συνεδρίας επανεξέτασης για αυτό. Αλλά αυτό είναι το είδος της ένα περίπλοκο θέμα, και έχω περισσότερα παραδείγματα που πρόκειται να εμφανιστούν που θα βοηθήσει να διευκρινιστεί τι πραγματικά είναι δείκτες. Σε αυτή την περίπτωση, οι δείκτες είναι ισοδύναμα με συστοιχίες, έτσι μπορώ να χρησιμοποιήσω ακριβώς αυτό το δείκτη, όπως το ίδιο πράγμα με έναν int array. Έτσι είμαι ευρετηρίαση σε 0, και αλλάζοντας το πρώτο ακέραιο έως 1, αλλάζοντας τη δεύτερη ακέραιος έως 2, και η 3η ακέραιος έως 3. Έτσι, περισσότερο για δείκτες. Λοιπόν, θυμάμαι Binky. Σε αυτή την περίπτωση θα έχουμε ένα δείκτη που διατίθενται, ή θα κηρυχθεί δείκτη, αλλά αρχικά, όταν μου δήλωσε απλώς ένα δείκτη, δεν είναι να δείχνει οπουδήποτε στη μνήμη. Είναι ακριβώς αξίες σκουπίδια στο εσωτερικό του. Έτσι, δεν έχω καμία ιδέα για το πού το δείκτη να δείχνει. Έχει μια διεύθυνση που μόλις γεμίσει με το 0 και το 1, όπου είχε αρχικά δηλωθεί. Δεν μπορώ να κάνω τίποτα με αυτό μέχρι καλώ malloc για το και τότε μου δίνει ένα μικρό χώρο στο σωρό, όπου μπορώ να βάλω τις τιμές στο εσωτερικό. Στη συνέχεια, και πάλι, δεν ξέρω τι είναι μέσα από αυτή τη μνήμη. Έτσι, το πρώτο πράγμα που πρέπει να κάνετε είναι να ελέγξετε αν το σύστημα είχε αρκετή μνήμη να μου δώσει προηγούμενη 1 ακέραιο στην πρώτη θέση, η οποία είναι ο λόγος που κάνω αυτό το ελέγξετε. Αν ο δείκτης είναι μηδέν, που σημαίνει ότι δεν έχει αρκετό χώρο ή κάποιο άλλο σφάλμα, γι 'αυτό θα πρέπει να βγείτε έξω από το πρόγραμμά μου.  Αλλά αν το έκανε επιτυχία, τώρα μπορώ να χρησιμοποιήσω αυτό το δείκτη και τι δείκτη * που κάνει είναι να ακολουθεί, όπου η διεύθυνση είναι όπου η τιμή αυτή είναι, και θέτει αυτό ισούται με 1. Έτσι, πάνω από εδώ, είμαστε έλεγχο εάν η μνήμη υπήρχε. Μόλις ξέρετε ότι υπάρχει, μπορείτε να βάλετε σε αυτό τι τιμή που θέλετε να βάλετε σε αυτό? σε αυτήν την περίπτωση 1. Μόλις τελειώσουμε με αυτό, θα πρέπει να ελευθερώσετε ότι ο δείκτης γιατί πρέπει να πάρει πίσω το σύστημα ότι η μνήμη που ζήτησε στην πρώτη θέση. Επειδή ο υπολογιστής δεν ξέρει πότε θα τελειώσετε με αυτό. Σε αυτή την περίπτωση λέμε ρητά, εντάξει, τελειώσαμε με αυτή την μνήμη. Εάν κάποια άλλη διαδικασία που χρειάζεται, κάποιο άλλο πρόγραμμα χρειάζεται, μη διστάσετε να προχωρήσει και να το πάρετε. Αυτό που μπορούμε να κάνουμε είναι, επίσης, μπορούμε να πάρουμε μόνο τη διεύθυνση των τοπικών μεταβλητών για το σύνολο. Έτσι, int x είναι μέσα στο πλαίσιο του στοιβάζονται κύρια. Και όταν χρησιμοποιούμε αυτό το εμπορικό, και το φορέα εκμετάλλευσης, αυτό που κάνει είναι παίρνει χ, και το χ είναι μόνο μερικά δεδομένα στη μνήμη, αλλά έχει μια διεύθυνση. Βρίσκεται κάπου. Έτσι, με την κλήση & x, τι είναι αυτό που κάνει είναι να μας δίνει τη διεύθυνση του x. Με τον τρόπο αυτό, κάνουμε το σημείο δείκτη στο σημείο όπου x είναι στη μνήμη. Τώρα απλά κάτι σαν x *, θα πάμε για να πάρει 5 πίσω. Το αστέρι ονομάζεται εύρεση τιμών του. Ακολουθείτε τη διεύθυνση και μπορείτε να πάρετε την αξία του να είναι αποθηκευμένα εκεί. Οποιεσδήποτε ερωτήσεις; Ναι; [Φοιτητικό] Αν δεν κάνει το 3-επισήμανε πράγμα, δεν είναι ακόμα συγκεντρώνουν; Ναι. Αν δεν κάνουμε το 3-δείκτη πράγμα, είναι ακόμη σε εξέλιξη για την κατάρτιση, αλλά εγώ θα σου δείξω τι θα συμβεί σε ένα δεύτερο, και χωρίς να κάνει ότι, ότι είναι αυτό που λέμε μια διαρροή μνήμης. Δεν είστε δίνοντας στο σύστημα πίσω τη μνήμη του, έτσι μετά από λίγο το πρόγραμμα πρόκειται να συσσωρεύονται μνήμης που δεν είναι με τη χρήση, και τίποτα άλλο δεν μπορεί να το χρησιμοποιήσει. Αν έχετε δει ποτέ με τον Firefox 1,5 εκατομμύρια kilobytes στον υπολογιστή σας, στο έργο του διαχειριστή, αυτό είναι ό, τι συμβαίνει. Έχετε μια διαρροή μνήμης στο πρόγραμμα ότι δεν είστε χειρισμό. Και πώς δείκτη εργασίας αριθμητική; Λοιπόν, αριθμητική δείκτης είναι περίπου όπως ευρετηρίαση σε μια σειρά. Σε αυτή την περίπτωση, έχω ένα δείκτη, και αυτό που κάνω είναι να κάνω το σημείο δείκτη στο πρώτο στοιχείο αυτής της σειράς 3 ακέραιους αριθμούς που έχω διατεθεί. Και τώρα τι κάνω, αστέρι δείκτης αλλάζει μόνο το πρώτο στοιχείο στη λίστα. Κατηγορία δείκτης +1 σημεία εδώ. Έτσι, ο δείκτης είναι πάνω από εδώ, ο δείκτης +1 είναι πάνω από εδώ, δείκτης +2 είναι εδώ. Έτσι, προσθέτοντας μόλις 1 είναι το ίδιο πράγμα όπως κινείται κατά μήκος αυτού του πίνακα. Αυτό που κάνουμε είναι, όταν κάνουμε έναν δείκτη μπορείτε να πάρετε τη διεύθυνση πάνω από εδώ, και για να πάρει την τιμή εδώ, να βάλετε ένα αστέρι μέσα από το σύνολο της έκφρασης για να dereference. Έτσι, σε αυτή την περίπτωση, είμαι καθορισμό του πρώτου θέση σε αυτή την σειρά σε 1, δεύτερη θέση σε 2, και σε τρίτη θέση 3. Στη συνέχεια, αυτό που κάνω εδώ είναι Είμαι εκτύπωση δείκτη μας +1, η οποία δίνει μόνο εγώ 2. Τώρα είμαι προσαύξηση δείκτη, έτσι ώστε ο δείκτης ισούται με το δείκτη +1, η οποία κινείται προς τα εμπρός. Και έτσι τώρα αν μπορώ να εκτυπώσω από το δείκτη +1, δείκτης +1 είναι τώρα 3, που στην περίπτωση αυτή εκτυπώνει 3. Και για να δωρεάν κάτι, ο δείκτης που δίνω πρέπει να δείχνει στην αρχή του πίνακα που πήρα πίσω από malloc. Έτσι, σε αυτή την περίπτωση, εάν επρόκειτο να καλέσετε 3 δικαίωμα εδώ, αυτό δεν θα ήταν σωστό, επειδή είναι στη μέση της διάταξης. Θα πρέπει να αφαιρέσετε για να φτάσουμε στην αρχική του θέση η αρχική πρώτη θέση πριν μπορώ να το απελευθερώσει. Έτσι, εδώ είναι μια πιο περίπλοκη παράδειγμα. Σε αυτή την περίπτωση, είμαστε κατανομή 7 χαρακτήρες σε μια σειρά χαρακτήρων. Και σε αυτή την περίπτωση αυτό που κάνουμε εμείς είναι looping πάνω από την πρώτη 6 από αυτούς, και είμαστε ρύθμιση για τους Z. Έτσι, για int i = 0, i> 6, ί + +, Έτσι, ο δείκτης + i θα μας δώσει ακριβώς, στην περίπτωση αυτή, δείκτη, ο δείκτης 1, ο δείκτης 2, δείκτης 3, και ούτω καθεξής και ούτω καθεξής στο βρόχο. Τι πρόκειται να κάνουμε είναι να παίρνει αυτή τη διεύθυνση, dereferences να πάρετε την τιμή, και ότι οι αλλαγές σε αξία Ζ. Στη συνέχεια, στο τέλος θυμηθείτε ότι αυτό είναι ένα string, έτσι δεν είναι; Όλες οι χορδές πρέπει να τελειώνει με το null χαρακτήρα τερματισμού. Έτσι, αυτό που κάνω είναι στο δείκτη 6 έβαλα το null χαρακτήρα τερματισμού μέσα Και τώρα τι είμαι βασικά κάνει εδώ εφαρμόζει printf για μια σειρά, έτσι δεν είναι; Έτσι, όταν δεν printf τώρα όταν έχει φτάσει στο τέλος της σειράς; Όταν χτυπά το null χαρακτήρα τερματισμού. Έτσι, σε αυτή την περίπτωση, το αρχικό σημεία δείκτη μου στην αρχή αυτής της συστοιχίας. Μπορώ να εκτυπώσω τον πρώτο χαρακτήρα έξω. Εγώ να το μετακινήσετε πάνω από ένα. Μπορώ να εκτυπώσω αυτό το χαρακτήρα έξω. Εγώ να το μετακινήσετε πάνω. Και συνεχίζω να το κάνετε αυτό μέχρι να φτάσετε στο τέλος. Και τώρα ο δείκτης * τέλος θα dereference αυτό και να πάρει το null χαρακτήρα τερματισμού πίσω. Και έτσι, ενώ βρόχος μου τρέχει μόνο όταν η τιμή δεν είναι η μηδενική χαρακτήρας τερματισμού. Έτσι, τώρα έχω την έξοδο από αυτόν τον βρόχο. Και έτσι αν αφαιρέσουμε 6 από αυτό το δείκτη, Πάω πίσω σε όλη τη διαδρομή προς την αρχή. Θυμηθείτε, το κάνω αυτό, γιατί πρέπει να πάω στην αρχή για να το απελευθερώσει. Έτσι, ξέρω ότι ήταν μια πολύ. Υπάρχουν ερωτήσεις; Παρακαλώ, ναι; [Ακατάληπτο ερώτημα Φοιτητών] Μπορείτε να πείτε ότι πιο δυνατά; Λυπάμαι. [Φοιτητικό] Την τελευταία διαφάνεια δεξιά προτού να απελευθερωθεί το δείκτη, όπου ήταν που πραγματικά αλλάζει την τιμή του δείκτη; [Joseph] Έτσι, ακριβώς εδώ. >> [Φοιτητικό] Ω, εντάξει. [Joseph] Έτσι, έχω ένα δείκτη μείον μείον, δεξιά, που κινείται το πράγμα πίσω ένα, και στη συνέχεια θα το ελευθερώσει, επειδή αυτό δείκτης πρέπει να επισημανθεί στην αρχή του πίνακα. [Φοιτητικό] Αλλά αυτό δεν θα είχε χρειαστεί θα σταματήσει μετά από αυτή την γραμμή. [Joseph] Έτσι, αν είχα σταματήσει μετά από αυτό, αυτό θα μπορούσε να θεωρηθεί μια διαρροή μνήμης, επειδή δεν είχα τρέξει το δωρεάν. [Φοιτητικό] Ι [ακατάληπτο] μετά από τις πρώτες τρεις γραμμές, όπου είχατε δείκτης +1 [ακατάληπτο]. [Joseph] Uh-huh. Έτσι, ποιο είναι το θέμα εκεί; Λυπάμαι. Όχι, όχι. Πηγαίνετε, πηγαίνετε, παρακαλώ. [Φοιτητικό] Έτσι, δεν είστε αλλάζοντας την τιμή της δείκτες. Μπορείτε δεν θα έπρεπε να κάνουμε δείκτη μείον μείον. [Joseph] Ναι, ακριβώς. Έτσι, όταν κάνω δείκτης δείκτης +1 και +2, Δεν το κάνω δείκτης ισούται με το δείκτη +1. Έτσι, ο δείκτης παραμένει ακριβώς δείχνοντας στην αρχή του πίνακα. Είναι μόνο όταν κάνω συν συν ότι θέτει την αξία πίσω στο εσωτερικό του δείκτη, ότι κινείται στην πραγματικότητα αυτό μαζί. Εντάξει. Περισσότερες ερωτήσεις; Και πάλι, αν αυτό είναι το είδος της συντριπτικής, αυτό θα καλυφθεί στη σύνοδο. Ρωτήστε τους συναδέλφους σας διδασκαλία γι 'αυτό, και μπορούμε να απαντήσουμε στις ερωτήσεις στο τέλος. Και συνήθως δεν ήθελα να κάνω αυτό το πράγμα μείον. Αυτό πρέπει να απαιτεί από μένα να παρακολουθείτε πόσα έχω αντισταθμίζεται στον πίνακα. Έτσι, σε γενικές γραμμές, αυτό είναι μόνο για να εξηγήσει πώς λειτουργεί η αριθμητική δείκτη. Αλλά αυτό που συνήθως αρέσει να κάνουμε είναι να θέλουμε να δημιουργήσουμε ένα αντίγραφο του δείκτη, και στη συνέχεια θα χρησιμοποιεί το εν λόγω αντίγραφο, όταν κινούμαστε γύρω στη συμβολοσειρά. Έτσι, σε αυτές τις περιπτώσεις θα χρησιμοποιήσετε το αντίγραφο για να εκτυπώσετε το σύνολο εγχόρδων, αλλά δεν έχουμε να κάνουμε σαν δείκτη μείον 6 ή να παρακολουθείτε πόσο προχωρήσαμε σε αυτό, μόνο και μόνο επειδή γνωρίζουμε ότι το αρχικό σημείο μας εξακολουθεί να επισημάνει την αρχή της λίστας και όλα αυτά που αλλάξαμε ήταν αυτό το αντίγραφο. Έτσι, σε γενικές γραμμές, να αλλάξει τα αντίγραφα του αρχικού δείκτη σας. Μην προσπαθήσετε να ταξινομήσετε όπως του - μην αλλάξει πρωτότυπα. Προσπαθώντας να αλλάξει μόνο αντίγραφα της αρχικής σας. Έτσι, θα παρατηρήσετε όταν περνάμε το string σε printf δεν έχετε να βάλετε ένα αστέρι μπροστά του όπως κάναμε με όλες τις άλλες dereferences, έτσι δεν είναι; Έτσι, εάν εκτυπώνετε από το σύνολο εγχόρδων s% αναμένει είναι μια διεύθυνση, και στην περίπτωση αυτή ένας δείκτης ή στην περίπτωση αυτή, όπως μια σειρά από χαρακτήρες. Χαρακτήρες, char * s, και συστοιχίες είναι το ίδιο πράγμα. Ο δείκτης είναι χαρακτήρες, και συστοιχίες χαρακτήρας είναι το ίδιο πράγμα. Και έτσι, το μόνο που έχουμε να κάνουμε είναι να περάσει στο δείκτη. Δεν πρέπει να περάσει με τον ίδιο δείκτη του * ή κάτι τέτοιο. Έτσι, πίνακες και δείκτες είναι το ίδιο πράγμα. Όταν κάνεις κάτι σαν x [y] εδώ για έναν πίνακα, τι κάνει κάτω από την κουκούλα είναι λέει, εντάξει, είναι μια σειρά χαρακτήρων, γι 'αυτό είναι ένας δείκτης. Και έτσι Χ είναι το ίδιο πράγμα, και έτσι αυτό που κάνει είναι να προσθέτει y στο x, το οποίο είναι το ίδιο πράγμα όπως κινείται προς τα εμπρός στη μνήμη τόσο πολύ. Και τώρα x + y μας δίνει κάποια διεύθυνση, και εμείς dereference τη διεύθυνση ή να ακολουθήσετε το βέλος όπου η θέση είναι στη μνήμη και παίρνουμε την αξία από αυτή τη θέση στη μνήμη. Έτσι, έτσι ώστε αυτά τα δύο είναι ακριβώς το ίδιο πράγμα. Είναι απλά μια συντακτική ζάχαρη. Κάνουν το ίδιο πράγμα. Είναι απλά διαφορετικές syntactics ένας για τον άλλον. Έτσι, τι μπορεί να πάει στραβά με δείκτες; Όπως, πολύ. Εντάξει. Έτσι, τα κακά πράγματα. Μερικά κακά πράγματα που μπορείτε να κάνετε δεν ελέγχουν αν malloc κλήση σας επιστρέφει null, έτσι δεν είναι; Σε αυτή την περίπτωση, ρωτάω το σύστημα να μου δώσει - τι είναι αυτός ο αριθμός; Like 2 δισεκατομμύρια φορές 4, επειδή το μέγεθος του ακεραίου είναι 4 bytes. Είμαι αυτό που ζητούν σαν 8 δις bytes. Φυσικά ο υπολογιστής μου δεν πρόκειται να είναι σε θέση να μου δώσει αυτό το πολύ πίσω μνήμης. Και εμείς δεν ελέγχει αν αυτή είναι μηδενική, έτσι όταν προσπαθούμε να dereference το πάνω εκεί - ακολουθήστε το βέλος στο σημείο όπου πρόκειται να - δεν έχουμε αυτή τη μνήμη. Αυτό είναι αυτό που λέμε μια εύρεση τιμών null δείκτη. Και αυτό προκαλεί ουσιαστικά να segfault. Αυτός είναι ένας από τους τρόπους που μπορείτε να segfault. Άλλες κακά πράγματα που μπορείτε να κάνετε - OH καλά. Αυτό ήταν ένα εύρεση τιμών null δείκτη. Εντάξει. Άλλες κακά πράγματα - και, για να καθορίσει ότι μόλις βάλατε μια επιταγή εκεί ότι ελέγχει αν ο δείκτης είναι null και την έξοδο από το πρόγραμμα, εφόσον αυτό συμβαίνει ότι malloc επιστρέφει null δείκτη. Αυτό είναι το xkcd κόμικ. Οι άνθρωποι το καταλαβαίνουν τώρα. Ταξινόμηση του. Έτσι, η μνήμη. Και πήγα πάνω από αυτό. Καλούμε malloc σε έναν βρόχο, αλλά κάθε φορά που λέμε malloc χάνουμε κομμάτι της όπου αυτό δείκτης δείχνει να, γιατί είμαστε το πειράζουν. Έτσι, η αρχική κλήση μου δίνει malloc μνήμη εδώ. Δείκτες δείκτη μου σε αυτό. Τώρα, εγώ δεν μπορώ να το ελευθερώσει, έτσι και τώρα καλώ και πάλι malloc. Τώρα επισημαίνει εδώ. Τώρα η μνήμη μου είναι στραμμένο προς τα εδώ. Υπογραμμίζοντας εδώ. Υπογραμμίζοντας εδώ. Αλλά έχω χάσει τα ίχνη από τις διευθύνσεις όλων των μνήμη πάνω από εδώ που διατίθενται. Και έτσι τώρα δεν έχω καμία σχέση με αυτούς πια. Έτσι, δεν μπορώ να τους απελευθερώσει έξω από αυτόν τον βρόχο. Και έτσι για να διορθώσετε κάτι τέτοιο, αν ξεχάσετε την ελεύθερη μνήμη και μπορείτε να πάρετε αυτή την διαρροή μνήμης, Θα πρέπει να ελευθερώσετε τη μνήμη μέσα από αυτό το βρόχο μόλις τελειώσετε με αυτό. Λοιπόν, αυτό είναι ό, τι συμβαίνει. Ξέρω πολλά μισείτε αυτό. Αλλά τώρα - yay! Μπορείτε να πάρετε σαν 44.000 kilobytes. Έτσι, μπορείτε να ελευθερώσετε στο τέλος του βρόχου, και ότι πρόκειται απλά να ελευθερώσετε τη μνήμη κάθε φορά. Ουσιαστικά, το πρόγραμμά σας δεν έχει μια διαρροή μνήμης πια. Και τώρα κάτι άλλο που μπορείτε να κάνετε είναι να ελευθερώσετε μνήμη που έχετε ζητήσει δύο φορές. Σε αυτή την περίπτωση, κάτι malloc, μπορείτε να αλλάξετε την αξία του. Μπορείτε να ελευθερώσετε μία φορά, επειδή είπατε ότι έγιναν με αυτό. Αλλά τότε θα ελευθερωθεί ξανά. Αυτό είναι κάτι που είναι πολύ κακή. Δεν πρόκειται να segfault αρχικά, αλλά μετά από λίγο τι είναι αυτό που κάνει είναι διπλή απελευθέρωση διαφθείρει τη δομή αυτού του σωρού σας, και θα μάθετε λίγο περισσότερα γι 'αυτό, αν επιλέξετε να πάρετε μια τάξη, όπως CS61. Αλλά ουσιαστικά μετά από λίγο ο υπολογιστής σας πρόκειται να μπερδευτείτε Σχετικά με το τι είναι οι θέσεις μνήμης όπου και όπου είναι αποθηκευμένο - όπου τα δεδομένα αποθηκεύονται στη μνήμη. Και απελευθερώνοντας έτσι ένα δείκτη δύο φορές είναι ένα κακό πράγμα που δεν θέλετε να το κάνετε. Άλλα πράγματα που μπορεί να πάει στραβά δεν χρησιμοποιεί sizeof. Έτσι, σε αυτή την περίπτωση θα malloc 8 byte, και ότι είναι το ίδιο πράγμα με δύο ακέραιους αριθμούς, έτσι δεν είναι; Έτσι, αυτό είναι απόλυτα ασφαλές, αλλά είναι αυτό; Λοιπόν, ως Lucas μίλησε για διαφορετικές αρχιτεκτονικές, ακέραιοι έχουν διαφορετικά μήκη. Έτσι, με τη συσκευή που χρησιμοποιείτε, ακέραιοι είναι περίπου 4 bytes, αλλά σε κάποιο άλλο σύστημα που θα μπορούσε να είναι 8 bytes ή θα μπορούσαν να είναι 16 bytes. Έτσι, αν μπορώ να χρησιμοποιήσω μόνο τον αριθμό αυτό πάνω από εδώ, το πρόγραμμα αυτό θα μπορούσε να λειτουργήσει στη συσκευή, αλλά δεν πρόκειται να διαθέσει αρκετή μνήμη για κάποιο άλλο σύστημα. Σε αυτή την περίπτωση, αυτό είναι που ο χειριστής sizeof χρησιμοποιείται για. Όταν λέμε sizeof (int), τι είναι αυτό που κάνει είναι να  μας δίνει το μέγεθος του ακεραίου στο σύστημα ότι το πρόγραμμα εκτελείται. Έτσι, στην περίπτωση αυτή, sizeof (int) θα επιστρέψει 4 για κάτι σαν τη συσκευή, και τώρα αυτή η βούληση 4 * 2, η οποία είναι 8, το οποίο είναι ακριβώς το ποσό του χώρου που απαιτείται για δύο ακέραιους αριθμούς. Σε ένα διαφορετικό σύστημα, αν ένας int είναι σαν 16 byte ή 8 bytes, είναι ακριβώς πρόκειται να επιστρέψει αρκετά bytes για την αποθήκευση αυτό το ποσό. Και τέλος, structs. Έτσι, αν θέλετε να αποθηκεύσετε ένα sudoku συμβούλιο στη μνήμη, πώς να το κάνουμε αυτό; Μπορείτε να σκεφτείτε σαν μια μεταβλητή για το πρώτο πράγμα που, μια μεταβλητή για το δεύτερο πράγμα, μια μεταβλητή για το τρίτο πράγμα, μια μεταβλητή για το τέταρτο πράγμα - κακό, έτσι δεν είναι; Έτσι, μια βελτίωση που μπορείτε να κάνετε πάνω από αυτό είναι να γίνει ένα 9 x 9 πίνακα. Αυτό είναι ωραία, αλλά τι γίνεται αν ήθελε να συνδέσει άλλα πράγματα με το διοικητικό συμβούλιο sudoku όπως αυτό που η δυσκολία του πλοίου, ή, για παράδειγμα, ποια είναι η βαθμολογία σας, ή πόσο χρόνο έχει πάρει σας για να λύσει αυτό το συμβούλιο; Λοιπόν, τι μπορείτε να κάνετε είναι να δημιουργήσετε ένα struct. Τι είμαι βασικά λέγοντας ότι είναι Είμαι καθορισμό αυτής της δομής πάνω από εδώ, Είμαι και τον καθορισμό ενός sudoku συμβούλιο το οποίο αποτελείται από ένα διοικητικό συμβούλιο που είναι 9 x 9. Και ό, τι έχει να έχει δείκτες στο όνομα του επιπέδου. Έχει, επίσης, x και y, που είναι οι συντεταγμένες του πού είμαι τώρα. Έχει επίσης το χρόνο που δαπανάται [ακατάληπτο], και έχει τον συνολικό αριθμό των κινήσεων που έχω εισάγεται μέχρι τώρα. Και έτσι σε αυτή την περίπτωση, μπορώ να ομαδοποιήσετε ένα σωρό των δεδομένων σε μία μόνο δομή αντί να πετούν γύρω σαν σε διάφορες μεταβλητές, όπως ότι δεν μπορώ να κρατήσει πραγματικά κομμάτι της. Και αυτό μας επιτρέπει να έχουν μόνο ωραία σύνταξη για το είδος των παραπομπών διαφορετικά πράγματα μέσα από αυτό το struct. Δεν μπορώ ακριβώς να κάνω board.board, και παίρνω το sudoku πλακέτα πίσω. Board.level, παίρνω πόσο δύσκολο είναι. Board.x και board.y να μου δώσει τις συντεταγμένες του, όπου θα μπορούσε να είναι στο διοικητικό συμβούλιο. Και έτσι είμαι πρόσβαση σε αυτό που ονομάζουμε πεδία του struct. Αυτό ορίζει sudokuBoard, η οποία είναι ένας τύπος που έχω. Και τώρα είμαστε εδώ. Έχω μια μεταβλητή που ονομάζεται "συμβούλιο" του sudokuBoard τύπου. Και έτσι τώρα μπορώ να έχουν πρόσβαση όλα τα πεδία που συνθέτουν αυτή τη δομή εδώ. Οποιεσδήποτε ερωτήσεις σχετικά με structs; Ναι; [Φοιτητικό] Για int x, y, δηλώσατε και οι δύο σε μια γραμμή; >> [Joseph] Uh-huh. [Φοιτητικό] Έτσι, θα μπορούσατε να κάνετε ακριβώς αυτό με όλα αυτά; Όπως και σε x, y κόμμα φορές ότι η συνολική; [Joseph] Ναι, θα μπορούσατε να κάνετε σίγουρα ότι, αλλά ο λόγος που έβαλα x και y στην ίδια γραμμή - και το ερώτημα είναι γιατί μπορούμε να κάνουμε αυτό ακριβώς στην ίδια γραμμή; Γιατί δεν βάζουμε απλώς όλα αυτά στην ίδια γραμμή είναι χ και γ συνδέονται μεταξύ τους, και αυτό είναι μόνο στυλιστικά πιο σωστό, κατά μία έννοια, επειδή είναι ομαδοποίηση δύο πράγματα στην ίδια γραμμή ότι σαν είδος σχετίζονται με το ίδιο πράγμα. Και εγώ μόλις χωρίσει χώρια αυτά. Είναι απλά ένα θέμα στυλ. Δεν κάνει καμία διαφορά λειτουργικά απολύτως. Οποιεσδήποτε άλλες ερωτήσεις σχετικά με structs; Μπορείτε να ορίσετε ένα Pokédex με ένα struct. Ένα Pokémon έχει έναν αριθμό και ένα γράμμα, ένας ιδιοκτήτης, ένας τύπος. Και στη συνέχεια, αν έχετε μια σειρά από Pokémon, μπορείτε να κάνετε μια Pokédex, έτσι δεν είναι; Εντάξει, δροσερό. Έτσι, ερωτήματα σχετικά με structs. Αυτοί είναι που σχετίζονται με structs. Τέλος, GDB. Τι σημαίνει GDB σας επιτρέπουν να το κάνετε; Σας επιτρέπει να διορθώσετε το πρόγραμμά σας. Και αν δεν έχετε χρησιμοποιήσει GDB, θα ήθελα να συνιστάται βλέποντας το μικρό και απλώς πηγαίνει πέρα ​​από ό, τι GDB είναι, πώς μπορείτε να εργαστείτε με αυτό, πώς μπορείτε να το χρησιμοποιήσετε, και δοκιμάστε το σε ένα πρόγραμμα. Και έτσι αυτό που GDB σας επιτρέπει να κάνετε είναι να αφήνει το παύση [ακατάληπτο] το πρόγραμμά σας και ένα πρακτικό γραμμή. Για παράδειγμα, θέλω να σε παύση εκτέλεσης, όπως τη γραμμή 3 του προγράμματός μου, και ενώ είμαι σε γραμμή 3 μπορώ να εκτυπώσετε όλες τις τιμές που υπάρχουν. Και έτσι αυτό που λέμε σαν παύσεις σε μια γραμμή είναι αυτό που λέμε βάζοντας ένα breakpoint σε αυτή τη γραμμή και στη συνέχεια μπορούμε να τυπώσουμε τις μεταβλητές για την κατάσταση του προγράμματος εκείνη τη στιγμή. Μπορούμε στη συνέχεια από το βήμα εκεί μέσω του προγράμματος γραμμή-γραμμή. Και τότε μπορούμε να εξετάσουμε την κατάσταση της στοίβας κατά τη χρονική στιγμή. Και έτσι για να χρησιμοποιήσετε GDB, αυτό που κάνουμε είναι που λέμε κλαγγή στο αρχείο C, αλλά πρέπει να περάσουμε αυτό το-ggdb σημαία. Και μόλις τελειώσετε με αυτό θα τρέξει μόνο gdb για το τελικό αρχείο εξόδου. Και έτσι μπορείτε να πάρετε κάποια σαν μάζα του κειμένου, όπως αυτό, αλλά πραγματικά το μόνο που έχετε να κάνετε είναι να πληκτρολογήσετε εντολές στην αρχή. Σπάστε κύρια βάζει ένα breakpoint στο κύριο. Λίστα 400 παραθέτει τις γραμμές του κώδικα γύρω από τη γραμμή 400. Και έτσι σε αυτή την περίπτωση μπορείτε απλά να κοιτάξουμε γύρω μας και να πούμε, OH, Θέλω να ορίσετε ένα breakpoint στη γραμμή 397, που είναι η γραμμή, και στη συνέχεια, το πρόγραμμα σας τρέχει σε αυτό το βήμα και πρόκειται να σπάσει. Είναι πρόκειται να σταματήσει εκεί, και μπορείτε να εκτυπώσετε, για παράδειγμα, η αξία των χαμηλών ή υψηλών. Και έτσι υπάρχει μια δέσμη των εντολών που πρέπει να ξέρετε, και αυτή η παρουσίαση θα ανεβαίνουν στην ιστοσελίδα της, οπότε αν απλά θέλετε να αναφοράς αυτών ή ήθελε να τους εξαπατήσει σχετικά με τα φύλλα σας, μη διστάσετε. Cool. Αυτό ήταν Quiz Αξιολόγηση 0, και θα μείνω, αν έχετε οποιεσδήποτε ερωτήσεις. Εντάξει.  [Χειροκροτήματα] [CS50.TV]