1 00:00:00,000 --> 00:00:02,350 >> [Παίζει μουσική] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Εντάξει. 4 00:00:06,360 --> 00:00:07,770 Είδος ένα παράξενο θέμα, σωστά; 5 00:00:07,770 --> 00:00:09,050 Magic αριθμοί. 6 00:00:09,050 --> 00:00:12,012 Τι ελαφίνα που εννοούμε όταν αυτός είναι μιλάμε για τη μαγεία τους αριθμούς; 7 00:00:12,012 --> 00:00:14,220 Λοιπόν, ορισμένα από τα προγράμματα ότι έχουμε γράψει σε CS50 8 00:00:14,220 --> 00:00:16,660 μέχρι τώρα είχαν κάποια περίεργα αριθμούς είδους ρίχνονται σε αυτά. 9 00:00:16,660 --> 00:00:19,680 Ίσως για λόγους που δεν εξ ολοκλήρου καταλάβουν τώρα. 10 00:00:19,680 --> 00:00:23,950 Για παράδειγμα, το πρόβλημα Mario, εμείς ανώτατο όριο το ύψος της πυραμίδας στο 23. 11 00:00:23,950 --> 00:00:26,880 Σας είπε ρητά δεν μπορεί να υπερβεί το 23. 12 00:00:26,880 --> 00:00:28,702 >> Αλλά τι σημαίνει 23; 13 00:00:28,702 --> 00:00:30,410 Λοιπόν, αν έχετε διαβάσει το spec σας προσεκτικά, 14 00:00:30,410 --> 00:00:32,493 θα μπορούσε να φανεί ότι η λόγος για τον οποίο το ανώτατο όριο σε 23 15 00:00:32,493 --> 00:00:36,160 επειδή είναι το κανονικό ύψος από ένα παράθυρο τερματικού είναι 24. 16 00:00:36,160 --> 00:00:38,860 Και έτσι αν έχουμε το πυραμίδα είναι ψηλότερο από αυτό, 17 00:00:38,860 --> 00:00:41,290 θα μπορούσε να κάνει αυτό το περίεργο πράγμα όπου τρέχει από την οθόνη. 18 00:00:41,290 --> 00:00:45,140 Και ξέρετε, τι κάνει αυτό σημαίνει ότι σε αυτό το πλαίσιο, έτσι δεν είναι; 19 00:00:45,140 --> 00:00:48,880 >> Είναι το νόημα της 23ης αμέσως προφανές σε κάποιον που κοιτάζει το πρόγραμμά σας 20 00:00:48,880 --> 00:00:51,550 και ίσως έχει μια διαφορετική παράθυρο τερματικού μέγεθος; 21 00:00:51,550 --> 00:00:52,330 Πιθανώς όχι. 22 00:00:52,330 --> 00:00:53,080 Φαίνεται σαν, ΟΚ. 23 00:00:53,080 --> 00:00:55,005 Λοιπόν, γιατί είναι λίγο λιγότερο από 23; 24 00:00:55,005 --> 00:00:56,880 Σε γενικές γραμμές, αυτό είναι το είδος από μια κακή συνήθεια πραγματικότητα 25 00:00:56,880 --> 00:00:58,940 να γράψει σε σταθερές κωδικό σας. 26 00:00:58,940 --> 00:01:02,190 Με τον τρόπο αυτό, όταν το κάνετε πραγματικά Αποστολή σε σταθερή κωδικό σας, 27 00:01:02,190 --> 00:01:05,630 είναι μερικές φορές αναφέρεται ως χρησιμοποιώντας μαγικοί αριθμοί, το οποίο είναι κάτι 28 00:01:05,630 --> 00:01:08,030 που γενικά θέλουν να προσπαθήσει και να αποφύγει. 29 00:01:08,030 --> 00:01:12,830 >> Για παράδειγμα, ας ρίξουμε μια ματιά σε αυτή την απλή λειτουργία εδώ. 30 00:01:12,830 --> 00:01:15,726 Προφανώς δεν υπάρχουν στοιχεία τύπου C που ονομάζεται κάρτα ή κατάστρωμα. 31 00:01:15,726 --> 00:01:16,600 Έτσι απλά να φέρει μαζί μου. 32 00:01:16,600 --> 00:01:18,910 Είναι ένα μικρό κομμάτι της pseudocode αναμιγνύονται εδώ. 33 00:01:18,910 --> 00:01:21,050 Αυτή είναι μια λειτουργία που ονομάζεται ασχοληθεί κάρτα που προφανώς 34 00:01:21,050 --> 00:01:26,570 παίρνει ένα κατάστρωμα ως παράμετρο, και βούληση εξόδου για μένα μια ενιαία κάρτα. 35 00:01:26,570 --> 00:01:30,990 >> Και κάνω κάτι εδώ όπου έχουν έναν βρόχο που τρέχει 0-52, 36 00:01:30,990 --> 00:01:33,394 και ασχολούμαι κάρτα. 37 00:01:33,394 --> 00:01:35,310 Λοιπόν, έχουμε μια μαγική αριθμό εδώ, σωστά. 38 00:01:35,310 --> 00:01:38,790 Βλέπετε τι ο μαγικός αριθμός είναι; 39 00:01:38,790 --> 00:01:42,280 Ή το πιο σημαντικό, να κάνετε δείτε ποιο είναι το πρόβλημα εδώ; 40 00:01:42,280 --> 00:01:44,310 Ιδιαίτερα εάν αυτό είναι μόνο μια λειτουργία 41 00:01:44,310 --> 00:01:48,030 στο δικό της αρχείο σε ένα φάκελο που περιέχει 42 00:01:48,030 --> 00:01:49,970 μια δέσμη των διαφορετικών αρχεία, καθένα από τα οποία 43 00:01:49,970 --> 00:01:51,670 κάνει άλλο πράγμα σε μια τράπουλα. 44 00:01:51,670 --> 00:01:57,310 Ίσως να τους ανακατεύει, ή ασχολείται ένα χέρι πέντε κάρτες αντί για μία μόνο κάρτα. 45 00:01:57,310 --> 00:01:59,420 >> Βλέπετε τι το το πρόβλημα θα μπορούσε να είναι εδώ; 46 00:01:59,420 --> 00:02:03,220 Βλέπετε το μαγικό αριθμό Έχω εγχέεται στον κώδικα; 47 00:02:03,220 --> 00:02:04,390 Είναι 52, δεξιά. 48 00:02:04,390 --> 00:02:06,440 >> Όπως, διαισθητικά ίσως γνωρίζετε, εντάξει. 49 00:02:06,440 --> 00:02:09,740 Όπως μια τράπουλα κάρτες περιέχει 52 φύλλα. 50 00:02:09,740 --> 00:02:12,570 Αλλά στο πρόγραμμά μας, είναι ακριβώς είδος που επιπλέουν γύρω εκεί. 51 00:02:12,570 --> 00:02:15,280 Είναι σαν ξαφνικά υπάρχει ένα 52. 52 00:02:15,280 --> 00:02:18,290 >> Ένας τρόπος για να επιλύσετε αυτό το πρόβλημα είναι να το κάνουμε αυτό. 53 00:02:18,290 --> 00:02:22,724 Είμαστε πολύ ρητώς τώρα καλώντας το μέγεθος καταστρώματος, όπως 52. 54 00:02:22,724 --> 00:02:25,390 Δίνει λίγο πιο διαισθητικό που σημαίνει ότι όταν ο βρόχος for 55 00:02:25,390 --> 00:02:28,650 Αργότερα στη συνέχεια να πω, εγώ είναι μικρότερο από το μέγεθος του καταστρώματος. 56 00:02:28,650 --> 00:02:32,666 Φαίνεται λίγο καλύτερα από ό, τι λέει 52. 57 00:02:32,666 --> 00:02:34,290 Τώρα αυτό δεν διορθώσει το πρόβλημα στην πραγματικότητα. 58 00:02:34,290 --> 00:02:38,460 Αυτό δίνει κάποια συμβολική νόημα στη σταθερή. 59 00:02:38,460 --> 00:02:40,820 Αλλά το κάνει πραγματικότητα το είδος του εισαγάγει ένα άλλο πρόβλημα 60 00:02:40,820 --> 00:02:43,770 ότι μπορεί να μην είναι άμεσα εμφανής. 61 00:02:43,770 --> 00:02:45,859 Ακόμη και αν αυτή η μεταβλητή δηλώνεται globally-- 62 00:02:45,859 --> 00:02:47,650 Θυμάσαι τι σημαίνει ότι όταν δηλώνουμε 63 00:02:47,650 --> 00:02:50,500 μια μεταβλητή σε παγκόσμιο επίπεδο σε σχέση με τοπικά; 64 00:02:50,500 --> 00:02:53,340 Ακόμα κι αν δηλώνουμε μια μεταβλητή σε παγκόσμιο επίπεδο, τι εάν υπάρχει 65 00:02:53,340 --> 00:02:55,500 μια άλλη λειτουργία σουίτα μας λειτουργιών 66 00:02:55,500 --> 00:02:59,750 που ασχολούνται με το χειρισμό της κάρτας ότι αλλάζει ακούσια μέγεθος καταστρώματος, 67 00:02:59,750 --> 00:03:02,727 ή να αυξάνει από 1 ή μειώνεται κατά 1. 68 00:03:02,727 --> 00:03:04,060 Αυτό θα μπορούσε να σημάνει πρόβλημα, σωστά; 69 00:03:04,060 --> 00:03:08,261 Ειδικά αν έχουμε να κάνουμε με ένα σετ των καρτών, όπου το ανακάτεμα πλήρες κατάστρωμα 70 00:03:08,261 --> 00:03:08,760 απαιτείται. 71 00:03:08,760 --> 00:03:12,804 Εάν το μέγεθος του καταστρώματος μειώνεται με 1, για παράδειγμα, για 51, 72 00:03:12,804 --> 00:03:14,970 δεν είμαστε στην πραγματικότητα το ανακάτεμα όλες οι κάρτες πιθανώς. 73 00:03:14,970 --> 00:03:16,500 Φεύγουμε από έναν από τους έξω. 74 00:03:16,500 --> 00:03:21,680 Και η αξία μπορούσε ίσως να είναι προβλέψει ή να αξιοποιούνται από μια κακή ηθοποιό. 75 00:03:21,680 --> 00:03:24,920 >> C παρέχει ό, τι λέγεται οδηγία προεπεξεργαστή, η οποία 76 00:03:24,920 --> 00:03:27,764 καλείται επίσης μια μακροεντολή για δημιουργώντας συμβολική σταθερές. 77 00:03:27,764 --> 00:03:30,180 Και στην πραγματικότητα, έχετε ήδη δει μια οδηγία προεπεξεργαστή, 78 00:03:30,180 --> 00:03:32,916 ακόμη και αν δεν το έχετε ακούσει που ονομάζεται ότι με #include. 79 00:03:32,916 --> 00:03:37,150 Είναι άλλο ένα παράδειγμα ενός μακρο ή οδηγία προεπεξεργαστή. 80 00:03:37,150 --> 00:03:41,290 >> Ο τρόπος για να δημιουργήσετε συμβολικό σταθερές, ή δίνοντας ένα όνομα σε ένα σταθερό 81 00:03:41,290 --> 00:03:43,740 έτσι ώστε να έχει περισσότερη έννοια, έχει ως εξής. 82 00:03:43,740 --> 00:03:47,030 #define, το όνομα, την αντικατάσταση. 83 00:03:47,030 --> 00:03:49,140 Πραγματικά σημαντικό μέρος Εδώ πραγματικά γρήγορα. 84 00:03:49,140 --> 00:03:54,180 Μην βάζετε ένα ερωτηματικό στο το τέλος του #defines σας. 85 00:03:54,180 --> 00:03:57,310 Έτσι είναι #define, το όνομα, την αντικατάσταση. 86 00:03:57,310 --> 00:03:59,540 >> Όταν το πρόγραμμα έχει συνταχθεί, τι συμβαίνει στην πραγματικότητα 87 00:03:59,540 --> 00:04:01,740 είναι ο compiler, αν πρόκειται να περάσει μέσα από τον κωδικό σας 88 00:04:01,740 --> 00:04:06,770 και να αντικαταστήσει κάθε περίπτωση η λέξη "όνομα", με ό, τι 89 00:04:06,770 --> 00:04:08,860 θέσει ως αντικατάσταση. 90 00:04:08,860 --> 00:04:13,060 Κατ 'αναλογία, αν #include είναι είδος παρόμοιων με αντιγραφή και επικόλληση, 91 00:04:13,060 --> 00:04:15,700 τότε #define είναι το είδος του παρόμοιο με βρείτε και να αντικαταστήσετε, 92 00:04:15,700 --> 00:04:19,180 αν έχετε χρησιμοποιήσει ποτέ αυτό το χαρακτηριστικό σε ένα πρόγραμμα επεξεργασίας κειμένου, για παράδειγμα. 93 00:04:19,180 --> 00:04:26,345 >> Έτσι, για παράδειγμα, αν #define pi όπως 3.14159265, 94 00:04:26,345 --> 00:04:28,720 αν είστε σε καλύτερη μαθηματικά κλίση και ξαφνικά 95 00:04:28,720 --> 00:04:31,640 δείτε 3.14159265 φέρουν γύρω στον κώδικά σας, 96 00:04:31,640 --> 00:04:33,517 ίσως γνωρίζετε ότι μιλάει πίν. 97 00:04:33,517 --> 00:04:35,850 Αλλά ίσως μπορούμε να δώσουμε μια λίγο περισσότερο συμβολική σημασία. 98 00:04:35,850 --> 00:04:39,850 Και μπορούμε να πούμε αντί #define pi ως εκείνη μπουκιά αριθμών 99 00:04:39,850 --> 00:04:42,110 ότι δεν πρόκειται να κρατήσω διαβάζοντας ξανά και ξανά. 100 00:04:42,110 --> 00:04:45,560 >> Και τι πρόκειται να συμβεί στη συνέχεια σε τη διάρκεια της μεταγλώττισης είναι όταν το πρόγραμμα είναι 101 00:04:45,560 --> 00:04:48,530 καταρτίζονται, το πρώτο πράγμα που θα συμβεί είναι ότι θα περάσει 102 00:04:48,530 --> 00:04:51,520 και θα αντικαταστήσει κάθε φορά βλέπει κεφάλαιο P, κεφάλαιο Ι, 103 00:04:51,520 --> 00:04:55,610 αυτό θα το αντικαταστήσει κυριολεκτικά με 3.14 και ούτω καθεξής, έτσι ώστε να 104 00:04:55,610 --> 00:04:58,090 Δεν χρειάζεται να πληκτρολογήσετε το κάθε το χρόνο, ενώ το πρόγραμμα εξακολουθεί να 105 00:04:58,090 --> 00:05:00,631 έχει τη λειτουργικότητα που Αναμένουμε, επειδή εργάζεστε 106 00:05:00,631 --> 00:05:05,090 με το χειρισμό, τον πολλαπλασιασμό, διαίρεση, ό, τι είναι από πίν. 107 00:05:05,090 --> 00:05:08,230 >> Δεν περιορίζονται σε αυτό αντικατάσταση μόνο αριθμούς. 108 00:05:08,230 --> 00:05:12,279 Για παράδειγμα, θα μπορούσα να #define Φυσικά, όπως το CS50 κορδόνι. 109 00:05:12,279 --> 00:05:14,070 Στην περίπτωση αυτή, όταν η πρόγραμμα καταρτίζεται, 110 00:05:14,070 --> 00:05:16,236 #define θα περάσουν από το κώδικας, αντικαταστήστε κάθε φορά 111 00:05:16,236 --> 00:05:19,900 βλέπει "μάθημα" με τον CS50 κορδόνι. 112 00:05:19,900 --> 00:05:21,720 >> Θα παρατηρήσετε εδώ επίσης ότι συχνά 113 00:05:21,720 --> 00:05:26,090 #define ορίζονται όλα μου συμβολική σταθερές, να το πω έτσι, 114 00:05:26,090 --> 00:05:28,130 είναι πάντα σε όλα τα καλύμματα. 115 00:05:28,130 --> 00:05:28,960 Είναι μια σύμβαση. 116 00:05:28,960 --> 00:05:30,170 Δεν απαιτείται. 117 00:05:30,170 --> 00:05:33,900 Ο λόγος γενικά οι άνθρωποι θα χρησιμοποιήσουν όλες οι πρωτεύουσες όταν είναι #defining 118 00:05:33,900 --> 00:05:37,590 Είναι ακριβώς για να είναι πραγματικά σαφές ότι Αυτό το συγκεκριμένο στοιχείο του κωδικού μου 119 00:05:37,590 --> 00:05:38,820 είναι μια καθορισμένη σταθερή. 120 00:05:38,820 --> 00:05:43,730 Αν ήταν πεζά, είναι πιθανό ότι θα μπορούσε να συγχέεται με μια μεταβλητή. 121 00:05:43,730 --> 00:05:46,120 Και αυτό είναι πιθανώς δεν είναι ένα καλό πράγμα που κάνει. 122 00:05:46,120 --> 00:05:48,910 >> Έτσι, η συγκεκριμένη διάλυμα είναι πολύ καλύτερη 123 00:05:48,910 --> 00:05:50,550 από οποιοδήποτε από τα προηγούμενα. 124 00:05:50,550 --> 00:05:59,950 Αν ήμουν πρώτη #define μέγεθος καταστρώματος 52, στη συνέχεια, τώρα μου χρήση του 52, ή το μέγεθος του καταστρώματος εδώ, 125 00:05:59,950 --> 00:06:01,850 είναι πολύ πιο έξυπνο και πολύ πιο ασφαλής. 126 00:06:01,850 --> 00:06:03,280 Δεν μπορείτε να χειριστείτε ένα σταθερό. 127 00:06:03,280 --> 00:06:05,259 Δεν μπορούμε να πούμε 52 συν συν. 128 00:06:05,259 --> 00:06:06,800 Αυτό δεν πρόκειται να το μετατρέψετε σε 53. 129 00:06:06,800 --> 00:06:09,390 Δεν μπορείτε να αλλάξετε 52 σε κάτι. 130 00:06:09,390 --> 00:06:12,470 >> Μπορείτε να αλλάξετε μια μεταβλητή των οποίων η αξία είναι 52, 131 00:06:12,470 --> 00:06:14,870 η οποία ήταν η πρώτη λύση που είχαμε πριν. 132 00:06:14,870 --> 00:06:17,000 Και θα μπορούσε να αυξήσει ότι οι μεταβλητές έως 53. 133 00:06:17,000 --> 00:06:21,100 Αλλά δεν μπορούμε να πούμε 52 συν συν και πρέπει να μετατραπεί ξαφνικά σε 52 53. 134 00:06:21,100 --> 00:06:23,350 52 είναι πάντα 52. 135 00:06:23,350 --> 00:06:28,860 Και έτσι δεν μπορείτε να αλλάξετε κατά λάθος μέγεθος κατάστρωμα εδώ με το χειρισμό αυτό, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Μια άλλη καλή πλευρά αποτέλεσμα αυτής είναι όμως 138 00:06:32,390 --> 00:06:38,310 που γνωρίζετε ότι δεν όλες οι χώρες σε όλο τον κόσμο 139 00:06:38,310 --> 00:06:40,690 χρησιμοποιήστε μια τράπουλα μεγέθους 52; 140 00:06:40,690 --> 00:06:45,630 Για παράδειγμα, είναι πολύ συχνές σε Γερμανία να χρησιμοποιήσετε ένα μέγεθος κατάστρωμα 32, 141 00:06:45,630 --> 00:06:48,020 όπου βγαίνουν έξω μερικά των χαμηλότερων κάρτες αξίας. 142 00:06:48,020 --> 00:06:50,960 Και σε αυτή την περίπτωση, ήθελαν να μεταφέρουν σουίτα μου 143 00:06:50,960 --> 00:06:55,390 των λειτουργιών που ασχολούνται με χειραγώγηση της κάρτας στη Γερμανία. 144 00:06:55,390 --> 00:06:59,440 Θα μπορούσα σε πρώτη φάση θα έδειξε, πρέπει να πάμε και να αντικαταστήσετε 145 00:06:59,440 --> 00:07:03,570 όλες οι παρουσίες του 52 στον κώδικά μου με 32. 146 00:07:03,570 --> 00:07:07,940 >> Αλλά εδώ, αν μου #define μέγεθος κατάστρωμα ως 32 στην κορυφή του κωδικού μου, 147 00:07:07,940 --> 00:07:11,730 αν χρειαστεί να το αλλάξετε, μπορώ απλά πηγαίνετε και να αλλάξετε αυτό το ένα πράγμα. 148 00:07:11,730 --> 00:07:15,010 Επαναμεταγλωττίστε τον κωδικό μου, και όλοι μια ξαφνική διαδίδεται μέσω του. 149 00:07:15,010 --> 00:07:18,850 Στην πραγματικότητα, μπορούμε να αλλάξουμε το κατάστρωμα μέγεθος σε οποιαδήποτε τιμή θέλουμε. 150 00:07:18,850 --> 00:07:22,500 >> Μπορώ να σας ενδιαφέρουν σε μια παιχνίδι του μεγέθους κατάστρωμα pickup; 151 00:07:22,500 --> 00:07:23,430 >> Είμαι ο Νταγκ Lloyd. 152 00:07:23,430 --> 00:07:25,840 Και αυτό είναι CS50. 153 00:07:25,840 --> 00:07:27,772