1 00:00:00,000 --> 00:00:09,572 2 00:00:09,572 --> 00:00:12,030 ROB BOWDEN: Γεια σας, είμαι ο Rob Bowden, και ας μιλήσουμε για quiz0. 3 00:00:12,030 --> 00:00:13,280 4 00:00:13,280 --> 00:00:14,545 >> Έτσι, το πρώτο ερώτημα. 5 00:00:14,545 --> 00:00:17,750 Αυτό είναι το ερώτημα στο οποίο που έπρεπε να δίνεται ο αριθμός 6 00:00:17,750 --> 00:00:21,270 127 στο δυαδικό βολβούς. 7 00:00:21,270 --> 00:00:23,550 Αν ήθελε, θα μπορούσε να κάνει την τακτική μετατροπής 8 00:00:23,550 --> 00:00:25,950 από bi-- ή, από το δεκαδικό στο δυαδικό. 9 00:00:25,950 --> 00:00:28,300 Αλλά αυτό είναι κατά πάσα πιθανότητα θα να πάρει πολύ χρόνο. 10 00:00:28,300 --> 00:00:31,750 Εννοώ, θα μπορούσα να καταλάβω ότι, Εντάξει, 1 είναι εκεί, 2 είναι εκεί, 11 00:00:31,750 --> 00:00:33,650 4 είναι εκεί, 8 είναι εκεί. 12 00:00:33,650 --> 00:00:39,280 Ευκολότερη τρόπο, 127 είναι 128 μείον ένα. 13 00:00:39,280 --> 00:00:42,013 Αυτή η λάμπα αριστερότερο είναι ο 128-bit. 14 00:00:42,013 --> 00:00:43,490 15 00:00:43,490 --> 00:00:47,860 Έτσι 127 είναι πραγματικά ακριβώς όλα των άλλων λαμπτήρων, 16 00:00:47,860 --> 00:00:51,420 δεδομένου ότι είναι η αριστερότερη λάμπα μείον 1. 17 00:00:51,420 --> 00:00:52,800 Αυτό είναι για το συγκεκριμένο ζήτημα. 18 00:00:52,800 --> 00:00:54,060 >> Ερώτηση ένα. 19 00:00:54,060 --> 00:00:56,710 Έτσι, με 3 κομμάτια μπορείτε αντιπροσωπεύουν 8 διακριτές τιμές. 20 00:00:56,710 --> 00:01:01,000 Γιατί, λοιπόν, είναι η 7 η μεγαλύτερη μη-αρνητικό ακέραιος αριθμός που μπορεί να αντιπροσωπεύει; 21 00:01:01,000 --> 00:01:04,050 Λοιπόν, αν μπορούμε μόνο αντιπροσωπεύουν 8 διακριτές τιμές, 22 00:01:04,050 --> 00:01:07,430 τότε τι θα πάμε να είναι που εκπροσωπούν είναι από 0 έως 7. 23 00:01:07,430 --> 00:01:08,745 0 καταλαμβάνει μία από τις αξίες. 24 00:01:08,745 --> 00:01:09,980 25 00:01:09,980 --> 00:01:11,190 >> Ερώτηση δύο. 26 00:01:11,190 --> 00:01:14,610 Με Ν bits, πόσες διακριτές τιμές μπορεί να σας εκπροσωπήσει; 27 00:01:14,610 --> 00:01:19,080 Έτσι, με n bits, έχετε 2 πιθανές τιμές για κάθε bit. 28 00:01:19,080 --> 00:01:22,300 Έτσι έχουμε 2 πιθανές τιμές για Το πρώτο bit, 2 πιθανές τιμές 29 00:01:22,300 --> 00:01:24,450 για το δεύτερο, 2 είναι δυνατόν για το τρίτο. 30 00:01:24,450 --> 00:01:28,730 Και έτσι αυτό είναι 2 φορές 2 φορές 2, και τελικά, η απάντηση είναι 2 στο Ν. 31 00:01:28,730 --> 00:01:30,010 32 00:01:30,010 --> 00:01:31,100 >> Ερώτηση τρία. 33 00:01:31,100 --> 00:01:33,450 Τι είναι 0x50 σε δυαδικό; 34 00:01:33,450 --> 00:01:39,490 Έτσι, να θυμάστε ότι δεκαεξαδικό έχει ένα πολύ απλή μετατροπή σε δυαδικό. 35 00:01:39,490 --> 00:01:43,180 Μέχρι εδώ, εμείς απλά πρέπει να δούμε το 5 και το 0 ανεξάρτητα. 36 00:01:43,180 --> 00:01:45,110 Έτσι τι είναι 5 στο δυαδικό; 37 00:01:45,110 --> 00:01:48,400 0101, αυτό είναι το bit 1 και το 4 bit. 38 00:01:48,400 --> 00:01:49,900 Τι είναι 0 σε δυαδικό; 39 00:01:49,900 --> 00:01:50,520 Δεν είναι δύσκολο. 40 00:01:50,520 --> 00:01:52,180 0000. 41 00:01:52,180 --> 00:01:54,970 Έτσι τα βάλει μόνο μαζί, και ότι είναι ο πλήρης αριθμός σε δυαδικό. 42 00:01:54,970 --> 00:01:57,640 01010000. 43 00:01:57,640 --> 00:02:00,439 Και αν ήθελε θα μπορούσε να απογείωση που αριστερότερο μηδέν. 44 00:02:00,439 --> 00:02:01,105 Είναι άσχετο. 45 00:02:01,105 --> 00:02:02,920 46 00:02:02,920 --> 00:02:05,733 >> Έτσι, στη συνέχεια, εναλλακτικά, τι είναι 0x50 σε δεκαδικό; 47 00:02:05,733 --> 00:02:08,649 Αν ήθελε, θα could-- αν είστε πιο άνετα με το δυαδικό, 48 00:02:08,649 --> 00:02:11,340 θα μπορούσατε να πάρετε αυτό το δυαδικό απάντηση και να μετατρέψετε ότι σε δεκαδικό. 49 00:02:11,340 --> 00:02:13,870 Ή θα μπορούσαμε απλά να θυμάστε ότι δεκαεξαδικό. 50 00:02:13,870 --> 00:02:21,140 Έτσι ώστε 0 είναι στο 0-ου τόπος, και το 5 είναι το 16 στην πρώτη θέση. 51 00:02:21,140 --> 00:02:25,990 Μέχρι εδώ, έχουμε 5 φορές 16 με το πρώτα, συν 0 φορές 16 στο μηδέν, 52 00:02:25,990 --> 00:02:27,520 είναι 80. 53 00:02:27,520 --> 00:02:29,710 Και αν κοίταξε το τίτλος στο ερώτημα, 54 00:02:29,710 --> 00:02:32,920 ήταν CS 80, το οποίο ήταν το είδος της ένα υπαινιγμός για την απάντηση σε αυτό το πρόβλημα. 55 00:02:32,920 --> 00:02:34,460 56 00:02:34,460 --> 00:02:35,420 >> Ερώτηση πέντε. 57 00:02:35,420 --> 00:02:40,320 Έχουμε αυτό το σενάριο Scratch, η οποία είναι επαναλαμβάνοντας 4 φορές φυστικοβούτυρο ζελέ. 58 00:02:40,320 --> 00:02:42,800 Έτσι, πώς εμείς τώρα τον κωδικό που σε C; 59 00:02:42,800 --> 00:02:47,730 Λοιπόν, έχουμε here-- έχουν το μέρος με έντονους είναι το μόνο μέρος που έπρεπε να εφαρμόσουν. 60 00:02:47,730 --> 00:02:51,950 Έτσι έχουμε ένα 4 βρόχο που είναι looping 4 φορές, printf-σης φυστικοβούτυρο ζελέ, 61 00:02:51,950 --> 00:02:53,910 με τη νέα γραμμή, όπως το πρόβλημα ζητά. 62 00:02:53,910 --> 00:02:55,250 63 00:02:55,250 --> 00:02:57,490 >> Ερώτηση έξι, ένα άλλο πρόβλημα Ξυστό. 64 00:02:57,490 --> 00:03:00,210 Βλέπουμε ότι είμαστε σε ένα βρόχο για πάντα. 65 00:03:00,210 --> 00:03:05,000 Εμείς λέμε την μεταβλητή i και στη συνέχεια προσαύξηση i από 1. 66 00:03:05,000 --> 00:03:09,580 Τώρα θέλουμε να το κάνουμε αυτό σε C. Υπάρχουν πολλαπλούς τρόπους με τους οποίους θα μπορούσαν να το έχουν κάνει αυτό. 67 00:03:09,580 --> 00:03:12,840 Εδώ έτυχε να κωδικοποιήσει το πάντα βρόχο ως μια στιγμή (αλήθεια). 68 00:03:12,840 --> 00:03:16,600 Έτσι, δηλώνουμε την μεταβλητή i, απλά όπως είχαμε μεταβλητή i στο Ξυστό. 69 00:03:16,600 --> 00:03:21,950 Δηλώστε τη μεταβλητή i, και για πάντα ενώ η (πραγματική), λέμε τη μεταβλητή i. 70 00:03:21,950 --> 00:03:25,260 Έτσι printf% i-- ή θα μπορούσατε να έχετε χρησιμοποιήσει% d. 71 00:03:25,260 --> 00:03:27,985 Λέμε ότι η μεταβλητή, και στη συνέχεια να την αυξήσετε, i ++. 72 00:03:27,985 --> 00:03:29,560 73 00:03:29,560 --> 00:03:30,830 >> Ερώτηση επτά. 74 00:03:30,830 --> 00:03:35,560 Τώρα θέλουμε να κάνουμε κάτι πολύ παρόμοιο στο Mario dot C από το πρόβλημα που μία. 75 00:03:35,560 --> 00:03:39,110 Θέλουμε να εκτυπώσετε αυτά τα hashtags, θέλουμε να εκτυπώσετε πέντε 76 00:03:39,110 --> 00:03:40,700 από τρεις ορθογώνιο αυτών των hashes. 77 00:03:40,700 --> 00:03:41,770 78 00:03:41,770 --> 00:03:43,162 Λοιπόν, πώς θα πάμε να το κάνουμε αυτό; 79 00:03:43,162 --> 00:03:45,370 Λοιπόν, θα σας δώσω μια ολόκληρη μάτσο κώδικα, και απλά 80 00:03:45,370 --> 00:03:47,560 πρέπει να συμπληρώσετε τη λειτουργία του δικτύου εκτύπωσης. 81 00:03:47,560 --> 00:03:49,540 >> Έτσι τι PrintGrid μοιάζει; 82 00:03:49,540 --> 00:03:51,480 Καλά είστε παρελθόν, η το πλάτος και το ύψος. 83 00:03:51,480 --> 00:03:53,520 Έτσι έχουμε ένα εξωτερικό 4 βρόχου, που είναι looping 84 00:03:53,520 --> 00:03:57,650 πάνω από όλες τις σειρές αυτό πλέγμα που θέλετε να εκτυπώσετε. 85 00:03:57,650 --> 00:04:01,250 Στη συνέχεια έχουμε την ενδο-ένθετα 4 βρόχο, ότι είναι η εκτύπωση πάνω από κάθε στήλη. 86 00:04:01,250 --> 00:04:06,210 Έτσι, για κάθε σειρά, θα εκτυπώσετε για κάθε στήλη, ένα ενιαίο χασίς. 87 00:04:06,210 --> 00:04:10,045 Στη συνέχεια, στο τέλος της σειράς θα εκτυπώσετε μια νέα ενιαία γραμμή για να μεταβείτε στην επόμενη σειρά. 88 00:04:10,045 --> 00:04:11,420 Και αυτό είναι για το σύνολο του δικτύου. 89 00:04:11,420 --> 00:04:12,810 90 00:04:12,810 --> 00:04:13,675 >> Ερώτηση οκτώ. 91 00:04:13,675 --> 00:04:17,170 Μια συνάρτηση, όπως PrintGrid λέγεται έχει μια παρενέργεια, αλλά όχι μια επιστροφή 92 00:04:17,170 --> 00:04:17,670 αξία. 93 00:04:17,670 --> 00:04:19,209 Εξηγήστε τη διάκριση. 94 00:04:19,209 --> 00:04:23,080 Έτσι, αυτό εξαρτάται από εσάς να θυμόμαστε τι μια παρενέργεια είναι. 95 00:04:23,080 --> 00:04:25,180 Λοιπόν, μια επιστροφή value-- γνωρίζουμε PrintGrid δεν 96 00:04:25,180 --> 00:04:28,180 έχει τιμή επιστροφής, δεδομένου εδώ λέει άκυρη. 97 00:04:28,180 --> 00:04:31,150 Έτσι, κάτι που επιστρέφει κενό δεν επιστρέφει τίποτα. 98 00:04:31,150 --> 00:04:32,200 99 00:04:32,200 --> 00:04:33,620 Έτσι ποια είναι η παρενέργεια; 100 00:04:33,620 --> 00:04:36,620 Λοιπόν, μια παρενέργεια είναι οτιδήποτε είδους επιμένει 101 00:04:36,620 --> 00:04:39,500 μετά το τέλος της λειτουργίας ότι δεν ήταν μόλις επέστρεψε, 102 00:04:39,500 --> 00:04:41,340 και δεν ήταν μόνο από τις εισόδους. 103 00:04:41,340 --> 00:04:44,970 >> Έτσι, για παράδειγμα, θα μπορούσαμε αλλάξετε μια καθολική μεταβλητή. 104 00:04:44,970 --> 00:04:46,590 Αυτό θα μπορούσε να είναι μια παρενέργεια. 105 00:04:46,590 --> 00:04:49,000 Σε αυτή τη συγκεκριμένη περίπτωση, μια πολύ σημαντική παρενέργεια 106 00:04:49,000 --> 00:04:51,070 εκτυπώνει στην οθόνη. 107 00:04:51,070 --> 00:04:53,110 Έτσι ώστε να είναι μια παρενέργεια ότι PrintGrid έχει. 108 00:04:53,110 --> 00:04:54,980 Εμείς να εκτυπώσετε αυτά τα πράγματα στην οθόνη. 109 00:04:54,980 --> 00:04:56,370 Και μπορείτε να σκεφτείτε ότι, ως παρενέργεια, 110 00:04:56,370 --> 00:04:58,690 δεδομένου ότι αυτό είναι κάτι που επιμένει μετά τελειώνει αυτή η λειτουργία. 111 00:04:58,690 --> 00:05:01,481 Αυτό είναι κάτι έξω από το πεδίο εφαρμογής αυτής της λειτουργίας που τελικά 112 00:05:01,481 --> 00:05:03,380 είναι να αλλάξει, η περιεχόμενα της οθόνης. 113 00:05:03,380 --> 00:05:05,200 114 00:05:05,200 --> 00:05:05,839 >> Ερώτηση εννέα. 115 00:05:05,839 --> 00:05:07,880 Εξετάστε το πρόγραμμα παρακάτω, στην οποία οι αριθμοί γραμμή 116 00:05:07,880 --> 00:05:09,740 έχουν προστεθεί για η χάρη της συζήτησης. 117 00:05:09,740 --> 00:05:13,480 Έτσι, σε αυτό το πρόγραμμα είμαστε μόνο καλώντας GetString, την αποθήκευσή 118 00:05:13,480 --> 00:05:16,220 Σε αυτήν την μεταβλητή s, και στη συνέχεια, την εκτύπωση της μεταβλητής s. 119 00:05:16,220 --> 00:05:16,720 ΟΚ. 120 00:05:16,720 --> 00:05:19,090 Έτσι εξηγήσει γιατί μία γραμμή είναι παρούσα. 121 00:05:19,090 --> 00:05:20,920 #include CS50 dot h. 122 00:05:20,920 --> 00:05:23,820 Γιατί πρέπει να #include CS50 dot h; 123 00:05:23,820 --> 00:05:26,180 Καλά είμαστε καλώντας το GetString λειτουργία, 124 00:05:26,180 --> 00:05:28,840 και GetString ορίζεται στη βιβλιοθήκη CS50. 125 00:05:28,840 --> 00:05:31,600 Έτσι, αν δεν είχαμε #include CS50 dot h, 126 00:05:31,600 --> 00:05:35,760 θα πάρει ότι σιωπηρή δήλωση του σφάλματος λειτουργίας GetString 127 00:05:35,760 --> 00:05:36,840 από τον compiler. 128 00:05:36,840 --> 00:05:40,110 Γι 'αυτό και πρέπει να περιλαμβάνει το library-- θα πρέπει να συμπεριλάβετε το αρχείο κεφαλίδας, 129 00:05:40,110 --> 00:05:42,870 ή αλλιώς ο compiler δεν θα αναγνωρίζουν ότι υπάρχει GetString. 130 00:05:42,870 --> 00:05:44,380 131 00:05:44,380 --> 00:05:46,140 >> Εξηγήστε γιατί γραμμή δύο είναι παρούσα. 132 00:05:46,140 --> 00:05:47,890 Έτσι πρότυπο io dot h. 133 00:05:47,890 --> 00:05:50,430 Είναι ακριβώς η ίδια όπως και το προηγούμενο πρόβλημα, 134 00:05:50,430 --> 00:05:53,310 εκτός αντί αντιμετώπιση GetString, μιλάμε για printf. 135 00:05:53,310 --> 00:05:56,654 Έτσι, αν εμείς δεν είπαμε χρειαζόμαστε να περιλαμβάνει τις τυποποιημένες io dot h, 136 00:05:56,654 --> 00:05:58,820 τότε δεν θα είμαστε σε θέση να χρησιμοποιήσετε τη λειτουργία printf, 137 00:05:58,820 --> 00:06:00,653 γιατί τον compiler δεν θα γνωρίζουν. 138 00:06:00,653 --> 00:06:01,750 139 00:06:01,750 --> 00:06:05,260 >> Why-- ποια είναι η σημασία του κενού στη γραμμή τέσσερα; 140 00:06:05,260 --> 00:06:08,010 Έτσι, εδώ έχουμε int main (void). 141 00:06:08,010 --> 00:06:10,600 Αυτό ακριβώς λέμε ότι δεν παίρνουν καμία γραμμή εντολών 142 00:06:10,600 --> 00:06:12,280 επιχειρήματα στο κύριο. 143 00:06:12,280 --> 00:06:17,390 Να θυμάστε ότι θα μπορούσαμε να πούμε int κύρια int argc παρένθεση εγχόρδων argv. 144 00:06:17,390 --> 00:06:20,400 Έτσι, εδώ απλά λέμε κενό για να πούμε εμείς Οι αγνοώντας τα επιχειρήματα της γραμμής εντολών. 145 00:06:20,400 --> 00:06:21,840 146 00:06:21,840 --> 00:06:25,225 >> Εξηγούν, σε σχέση με τη μνήμη, ακριβώς τι GetString στη γραμμή έξι αποδόσεις. 147 00:06:25,225 --> 00:06:27,040 148 00:06:27,040 --> 00:06:31,640 GetString επιστρέφει ένα μπλοκ του μνήμη, μια σειρά χαρακτήρων. 149 00:06:31,640 --> 00:06:34,870 Είναι πραγματικά μια επιστροφή Pointer στον πρώτο χαρακτήρα. 150 00:06:34,870 --> 00:06:37,170 Να θυμάστε ότι ένα string είναι ένα αστέρι ΧΑΡ. 151 00:06:37,170 --> 00:06:41,360 Έτσι s είναι ένας δείκτης για την πρώτη χαρακτήρα σε ό, τι το string είναι 152 00:06:41,360 --> 00:06:43,510 ότι ο χρήστης εγγράφεται στο πληκτρολόγιο. 153 00:06:43,510 --> 00:06:47,070 Και ότι η μνήμη που συμβαίνει να malloced, έτσι ώστε η μνήμη είναι στο σωρό. 154 00:06:47,070 --> 00:06:49,080 155 00:06:49,080 --> 00:06:50,450 >> Ερώτηση 13. 156 00:06:50,450 --> 00:06:51,960 Εξετάστε το παρακάτω πρόγραμμα. 157 00:06:51,960 --> 00:06:55,579 Έτσι όλο αυτό το πρόγραμμα κάνει είναι printf-ing 1 διαιρείται με το 10. 158 00:06:55,579 --> 00:06:57,370 Έτσι, όταν καταρτίζονται και εκτελείται, αυτό το πρόγραμμα 159 00:06:57,370 --> 00:07:01,170 εξόδους 0,0, μολονότι 1 διαιρούμενο με 10 είναι 0,1. 160 00:07:01,170 --> 00:07:02,970 Γιατί λοιπόν είναι 0.0; 161 00:07:02,970 --> 00:07:05,510 Λοιπόν, αυτό είναι επειδή της ακέραιος διαίρεσης. 162 00:07:05,510 --> 00:07:08,580 Έτσι, 1 είναι ένας ακέραιος, 10 είναι ένας ακέραιος. 163 00:07:08,580 --> 00:07:11,980 Έτσι, 1 διαιρούμενο με 10, όλα αντιμετωπίζεται ως ακέραιοι, 164 00:07:11,980 --> 00:07:16,380 και C, όταν κάνουμε διαίρεση ακέραιο, έχουμε περικόψει οποιαδήποτε δεκαδικού ψηφίου. 165 00:07:16,380 --> 00:07:19,590 Έτσι, 1 διαιρούμενο με 10 0, και στη συνέχεια προσπαθούμε 166 00:07:19,590 --> 00:07:24,410 να εκτυπώσετε ότι ως ένα πλωτήρα, έτσι μηδέν εκτυπώνονται ως πλωτήρας είναι 0,0. 167 00:07:24,410 --> 00:07:27,400 Και γι 'αυτό παίρνουμε 0.0. 168 00:07:27,400 --> 00:07:28,940 >> Εξετάστε το παρακάτω πρόγραμμα. 169 00:07:28,940 --> 00:07:31,280 Τώρα είμαστε εκτύπωση 0.1. 170 00:07:31,280 --> 00:07:34,280 Έτσι, δεν υπάρχει διαίρεση ακέραιο, είμαστε απλά εκτυπώνετε 0.1, 171 00:07:34,280 --> 00:07:37,100 αλλά είμαστε αυτό εκτύπωση με 28 δεκαδικά ψηφία. 172 00:07:37,100 --> 00:07:41,810 Και παίρνουμε αυτό το 0,1000, ένα σωρό από μηδενικά, 5 5 5, μπλα μπλα μπλα. 173 00:07:41,810 --> 00:07:45,495 Έτσι, το ερώτημα εδώ είναι γιατί το κάνει εκτυπώστε ότι, αντί ακριβώς 0.1; 174 00:07:45,495 --> 00:07:46,620 175 00:07:46,620 --> 00:07:49,640 >> Έτσι, ο λόγος εδώ είναι τώρα κινητής υποδιαστολής ανακρίβεια. 176 00:07:49,640 --> 00:07:53,410 Θυμηθείτε ότι ένας πλωτήρας είναι μόνο 32 bits. 177 00:07:53,410 --> 00:07:57,540 Έτσι μπορούμε να αντιπροσωπεύουν μόνο ένα πεπερασμένο αριθμό των τιμών κινητής υποδιαστολής με αυτά τα 32 178 00:07:57,540 --> 00:07:58,560 bits. 179 00:07:58,560 --> 00:08:01,760 Καλά υπάρχει τελικά απείρως πολλές τιμές κινητής υποδιαστολής, 180 00:08:01,760 --> 00:08:04,940 και υπάρχουν απείρως πολλά πλωτά τιμές σημείο μεταξύ 0 και 1, 181 00:08:04,940 --> 00:08:07,860 και είμαστε προφανώς σε θέση να αντιπροσωπεύουν ακόμη περισσότερες τιμές από αυτό. 182 00:08:07,860 --> 00:08:13,230 Έτσι πρέπει να κάνουμε θυσίες για να να είναι σε θέση να αντιπροσωπεύουν το μεγαλύτερο μέρος αξίες. 183 00:08:13,230 --> 00:08:16,960 >> Έτσι μια τιμή, όπως 0,1, προφανώς δεν μπορούμε να εκπροσωπεί ότι ακριβώς. 184 00:08:16,960 --> 00:08:22,500 Έτσι, αντί να εκπροσωπούν 0.1 κάνουμε το καλύτερο μπορούμε να αναπαραστήσουμε αυτό 0.100000 5 5 185 00:08:22,500 --> 00:08:23,260 5. 186 00:08:23,260 --> 00:08:26,306 Και αυτό είναι πολύ κοντά, αλλά για πολλές εφαρμογές 187 00:08:26,306 --> 00:08:28,430 έχετε να ανησυχείτε για κινητής υποδιαστολής ανακρίβεια, 188 00:08:28,430 --> 00:08:30,930 γιατί απλά δεν μπορεί να αντιπροσωπεύει όλα τα πλωτά σημεία ακριβώς. 189 00:08:30,930 --> 00:08:32,500 190 00:08:32,500 --> 00:08:33,380 >> Ερώτηση 15. 191 00:08:33,380 --> 00:08:34,679 Θεωρήστε τον παρακάτω κώδικα. 192 00:08:34,679 --> 00:08:36,630 Είμαστε μόνο εκτύπωση 1 συν 1. 193 00:08:36,630 --> 00:08:38,289 Έτσι δεν υπάρχει κανένα τέχνασμα εδώ. 194 00:08:38,289 --> 00:08:41,780 1 συν 1 αποτιμάται σε 2, και τότε είμαστε εκτύπωση αυτό. 195 00:08:41,780 --> 00:08:42,789 Αυτό απλά τυπώνει 2. 196 00:08:42,789 --> 00:08:43,850 197 00:08:43,850 --> 00:08:44,700 >> Ερώτηση 16. 198 00:08:44,700 --> 00:08:49,450 Τώρα είμαστε εκτύπωση του χαρακτήρα 1 συν το χαρακτήρα 1. 199 00:08:49,450 --> 00:08:52,110 Γιατί λοιπόν να κάνει αυτό που δεν εκτυπώστε το ίδιο πράγμα; 200 00:08:52,110 --> 00:08:57,680 Λοιπόν ο χαρακτήρας 1 συν το χαρακτήρα 1, ο χαρακτήρας 1 έχει τιμή ASCII 49. 201 00:08:57,680 --> 00:09:04,840 Έτσι, αυτό είναι πραγματικά λέγοντας 49 συν 49, και τελικά αυτό πρόκειται να εκτυπώσετε 98. 202 00:09:04,840 --> 00:09:06,130 Έτσι, αυτό δεν εκτυπώνει 2. 203 00:09:06,130 --> 00:09:08,070 204 00:09:08,070 --> 00:09:09,271 >> Ερώτηση 17. 205 00:09:09,271 --> 00:09:11,520 Ολοκλήρωση της εφαρμογής περίεργο παρακάτω με τέτοιο τρόπο 206 00:09:11,520 --> 00:09:14,615 ότι η συνάρτηση επιστρέφει true αν n είναι περιττός και ψευδής αν το n είναι άρτιος. 207 00:09:14,615 --> 00:09:16,710 208 00:09:16,710 --> 00:09:19,330 Αυτό είναι ένα μεγάλο σκοπό για το mod χειριστή. 209 00:09:19,330 --> 00:09:24,530 Έτσι παίρνουμε το επιχείρημα μας ν, αν n mod 2 ισούται με 1, και 210 00:09:24,530 --> 00:09:28,030 αυτό σημαίνει ότι n διαιρείται με 2 είχε ένα υπόλοιπο. 211 00:09:28,030 --> 00:09:33,270 Εάν n διαιρείται με 2 είχε ένα υπόλοιπο, ότι σημαίνει ότι ο n είναι περιττός, οπότε επιστρέφουμε αλήθεια. 212 00:09:33,270 --> 00:09:34,910 Αλλιώς θα επιστρέψει false. 213 00:09:34,910 --> 00:09:39,070 Μπορείτε, επίσης, θα μπορούσε να γίνει n mod 2 ίσων μηδέν, επιστρέφει False, αλλιώς επιστρέφει αλήθεια. 214 00:09:39,070 --> 00:09:41,600 215 00:09:41,600 --> 00:09:43,640 >> Εξετάστε την αναδρομική συνάρτηση παρακάτω. 216 00:09:43,640 --> 00:09:46,920 Έτσι, αν η είναι μικρότερο ή ίσο με 1, επιστροφή 1, 217 00:09:46,920 --> 00:09:50,430 άλλο αντάλλαγμα n φορές στ του ν μείον 1. 218 00:09:50,430 --> 00:09:52,556 Έτσι τι είναι αυτή η λειτουργία; 219 00:09:52,556 --> 00:09:54,305 Λοιπόν, αυτό είναι ακριβώς το παραγοντικό λειτουργία. 220 00:09:54,305 --> 00:09:55,410 221 00:09:55,410 --> 00:09:57,405 Αυτό είναι όμορφα εκπροσωπείται καθώς το n παραγοντικό. 222 00:09:57,405 --> 00:09:58,720 223 00:09:58,720 --> 00:10:02,310 >> Έτσι ερώτηση 19 τώρα, θέλουμε να λαμβάνουν αυτό αναδρομική συνάρτηση. 224 00:10:02,310 --> 00:10:04,530 Θέλουμε να γίνει επαναληπτική. 225 00:10:04,530 --> 00:10:05,874 Λοιπόν, πώς θα το κάνουμε αυτό; 226 00:10:05,874 --> 00:10:07,790 Καλά για το προσωπικό λύση, και πάλι δεν υπάρχει 227 00:10:07,790 --> 00:10:11,090 πολλαπλούς τρόπους που θα μπορούσαν να έχουν γίνει ότι, ξεκινάμε με αυτό το προϊόν int 228 00:10:11,090 --> 00:10:11,812 ισούται με 1. 229 00:10:11,812 --> 00:10:13,520 Και όλη αυτή η για βρόχο, θα πάμε 230 00:10:13,520 --> 00:10:17,590 να πολλαπλασιάζοντας το προϊόν σε τελικά καταλήγουν με την πλήρη παραγοντικό. 231 00:10:17,590 --> 00:10:21,870 Έτσι, για int i ισούται με 2, i είναι μικρότερη ή ίση με n, i ++. 232 00:10:21,870 --> 00:10:24,130 >> Ίσως να αναρωτιέστε γιατί i ισούται με 2. 233 00:10:24,130 --> 00:10:28,380 Λοιπόν, να θυμάστε ότι εδώ έχουμε να βεβαιωθείτε ότι βασική μας υπόθεση είναι σωστή. 234 00:10:28,380 --> 00:10:32,180 Έτσι, αν η είναι μικρότερη ή ίση σε 1, είμαστε μόλις είχαν επιστρέψει 1. 235 00:10:32,180 --> 00:10:34,830 Έτσι, εδώ, έχουμε ξεκινήσει σε i ισούται με 2. 236 00:10:34,830 --> 00:10:39,090 Λοιπόν αν μου ήταν 1, τότε the-- ή αν n ήταν 1, τότε ο βρόχος for 237 00:10:39,090 --> 00:10:40,600 δεν θα εκτελέσει καθόλου. 238 00:10:40,600 --> 00:10:43,190 Και γι 'αυτό θα ήταν απλά προϊόν επιστροφή, η οποία είναι 1. 239 00:10:43,190 --> 00:10:45,920 Ομοίως, εάν το η ήταν τίποτα λιγότερο από 1-- 240 00:10:45,920 --> 00:10:49,290 αν ήταν μηδέν, αρνητικές 1, whatever-- θα ήθελα ακόμα να επιστρέφει 1, 241 00:10:49,290 --> 00:10:52,260 το οποίο είναι ακριβώς ό, τι το αναδρομική έκδοση κάνει. 242 00:10:52,260 --> 00:10:54,660 >> Τώρα, εάν το η είναι μεγαλύτερο από 1, τότε θα πάμε 243 00:10:54,660 --> 00:10:56,550 να κάνουμε τουλάχιστον ένα επανάληψη αυτού του βρόχου. 244 00:10:56,550 --> 00:11:00,630 Ας πούμε ότι το π είναι 5, τότε είμαστε πρόκειται να κάνει χρόνους προϊόν ισούται με 2. 245 00:11:00,630 --> 00:11:02,165 Έτσι τώρα το προϊόν είναι 2. 246 00:11:02,165 --> 00:11:04,040 Τώρα θα πάμε να κάνουμε φορές προϊόντος ισούται με 3. 247 00:11:04,040 --> 00:11:04,690 Τώρα είναι 6. 248 00:11:04,690 --> 00:11:07,500 Χρόνοι προϊόν ισούται με 4, τώρα είναι 24. 249 00:11:07,500 --> 00:11:10,420 Χρόνοι προϊόν ισούται με 5, τώρα είναι 120. 250 00:11:10,420 --> 00:11:16,730 Μέχρι τότε, τελικά, γυρίζουμε 120, το οποίο είναι σωστά 5 παραγοντικό. 251 00:11:16,730 --> 00:11:17,510 >> Ερώτηση 20. 252 00:11:17,510 --> 00:11:22,480 Αυτό είναι το ένα, όπου θα πρέπει να συμπληρώσετε σε αυτόν τον πίνακα με οποιοδήποτε δεδομένο αλγόριθμο, 253 00:11:22,480 --> 00:11:25,735 κάτι που έχουμε δει, ότι ταιριάζει με αυτά αλγοριθμική τρέξιμο 254 00:11:25,735 --> 00:11:28,060 φορές αυτές οι ασυμπτωτικές χρόνους λειτουργίας. 255 00:11:28,060 --> 00:11:33,270 Έτσι τι είναι ένας αλγόριθμος που είναι το ωμέγα 1, αλλά μεγάλο O Ν; 256 00:11:33,270 --> 00:11:35,970 Έτσι, θα μπορούσε να υπάρξει απείρως πολλές απαντήσεις εδώ. 257 00:11:35,970 --> 00:11:39,790 Το μόνο που έχουμε δει πιθανώς πιο συχνά είναι ακριβώς γραμμική αναζήτηση. 258 00:11:39,790 --> 00:11:42,050 >> Έτσι, στην καλύτερη περίπτωση, σενάριο, το στοιχείο είμαστε 259 00:11:42,050 --> 00:11:44,050 ψάχνει για είναι σε το αρχή της λίστας 260 00:11:44,050 --> 00:11:47,400 και έτσι σε ωμέγα 1 βήματα, το πρώτο πράγμα που ελέγχει, 261 00:11:47,400 --> 00:11:49,740 εμείς απλά επιστρέψει αμέσως ότι βρήκαμε το στοιχείο. 262 00:11:49,740 --> 00:11:52,189 Στη χειρότερη περίπτωση, το στοιχείο είναι στο τέλος, 263 00:11:52,189 --> 00:11:53,730 ή το στοιχείο δεν είναι στη λίστα καθόλου. 264 00:11:53,730 --> 00:11:56,700 Έτσι, πρέπει να ψάξουμε ολόκληρη τη λίστα, όλα τα n 265 00:11:56,700 --> 00:11:58,480 στοιχεία, και γι 'αυτό είναι ο Ν. 266 00:11:58,480 --> 00:11:59,670 267 00:11:59,670 --> 00:12:04,880 >> Έτσι, τώρα είναι κάτι που είναι τόσο ω του n log n, και μεγάλη O Ν log n. 268 00:12:04,880 --> 00:12:08,650 Καλά το πιο σχετικό πράγμα έχουμε δει εδώ είναι η συγχώνευση του είδους. 269 00:12:08,650 --> 00:12:12,950 Έτσι Ταξινόμηση με συγχώνευση, θυμηθείτε, είναι τελικά θήτα 270 00:12:12,950 --> 00:12:16,920 του n log n, όπου θήτα ορίζεται αν τα δύο ωμέγα και μεγάλη O είναι το ίδιο. 271 00:12:16,920 --> 00:12:17,580 Τόσο n log n. 272 00:12:17,580 --> 00:12:18,690 273 00:12:18,690 --> 00:12:21,970 >> Αυτό είναι κάτι που είναι ωμέγα Ν, και Ο του Ν τετράγωνο; 274 00:12:21,970 --> 00:12:23,990 Λοιπόν, και πάλι δεν υπάρχει πολλαπλές πιθανές απαντήσεις. 275 00:12:23,990 --> 00:12:26,440 Εδώ τυχαίνει να πούμε bubble sort. 276 00:12:26,440 --> 00:12:28,840 Ταξινόμηση με εισαγωγή θα μπορούσε επίσης να λειτουργήσει εδώ. 277 00:12:28,840 --> 00:12:31,400 Να θυμάστε ότι το bubble sort έχει ότι η βελτιστοποίηση όπου, 278 00:12:31,400 --> 00:12:34,630 αν είστε σε θέση να πάρετε καθ 'όλη τη λίστα 279 00:12:34,630 --> 00:12:37,402 χωρίς να χρειάζεται να κάνετε τυχόν ανταλλαγές, τότε, επίσης, 280 00:12:37,402 --> 00:12:40,110 μπορούμε να επιστρέψουμε αμέσως ότι ο κατάλογος ήταν ταξινομημένο για να αρχίσει με. 281 00:12:40,110 --> 00:12:43,185 Έτσι, στην καλύτερη περίπτωση, είναι ακριβώς ωμέγα της Ν. 282 00:12:43,185 --> 00:12:45,960 Αν αυτό δεν είναι απλά μια ωραία ταξινομημένη λίστα για να αρχίσει με, 283 00:12:45,960 --> 00:12:48,270 τότε έχουμε O Ν τετράγωνο swaps. 284 00:12:48,270 --> 00:12:49,330 285 00:12:49,330 --> 00:12:55,610 Και τέλος, έχουμε το είδος επιλογής για ν τετράγωνο, τόσο ωμέγα και μεγάλα O. 286 00:12:55,610 --> 00:12:56,850 >> Ερώτηση 21. 287 00:12:56,850 --> 00:12:58,870 Τι είναι ακέραιος υπερχείλιση; 288 00:12:58,870 --> 00:13:02,160 Καλά πάλι, παρόμοια με τις προηγούμενες, έχουμε μόνο πεπερασμένο πλήθος bits 289 00:13:02,160 --> 00:13:04,255 να αντιπροσωπεύει έναν ακέραιο, οπότε ίσως 32 bits. 290 00:13:04,255 --> 00:13:06,300 291 00:13:06,300 --> 00:13:09,180 Ας πούμε ότι έχουμε ένα υπογεγραμμένο ακέραιο. 292 00:13:09,180 --> 00:13:12,800 Στη συνέχεια, τελικά, το υψηλότερο θετικός αριθμός που μπορεί να αντιπροσωπεύει 293 00:13:12,800 --> 00:13:15,910 είναι 2 έως το 31 μείον 1. 294 00:13:15,910 --> 00:13:19,370 Λοιπόν, τι θα συμβεί αν προσπαθήσουμε να στη συνέχεια, αύξηση που ακέραιος; 295 00:13:19,370 --> 00:13:25,320 Λοιπόν, θα πάμε για να πάει από το 2 έως το 31 μείον 1, σε όλη τη διαδρομή προς τα κάτω σε αρνητικές 2 296 00:13:25,320 --> 00:13:26,490 στο 31. 297 00:13:26,490 --> 00:13:29,470 Έτσι, αυτό είναι ακέραιος υπερχείλισης όταν κρατάτε προσαύξηση, 298 00:13:29,470 --> 00:13:32,330 και, τελικά, δεν μπορείτε πάρετε οποιαδήποτε υψηλότερη και αυτό ακριβώς 299 00:13:32,330 --> 00:13:34,520 αναδιπλώνεται όλος ο τρόπος πίσω γύρω σε μια αρνητική τιμή. 300 00:13:34,520 --> 00:13:35,850 301 00:13:35,850 --> 00:13:37,779 >> Τι γίνεται με υπερχείλιση; 302 00:13:37,779 --> 00:13:39,820 Έτσι, ένα ρυθμιστικό overflow-- θυμηθείτε τι ένα ρυθμιστικό είναι. 303 00:13:39,820 --> 00:13:41,000 Είναι απλά ένα κομμάτι της μνήμης. 304 00:13:41,000 --> 00:13:43,350 Κάτι σαν μια συστοιχία είναι ένα ρυθμιστικό. 305 00:13:43,350 --> 00:13:46,120 Έτσι, η υπερχείλιση του buffer είναι όταν μπορείτε να προσπαθήσετε να αποκτήσετε πρόσβαση μνήμης 306 00:13:46,120 --> 00:13:47,880 πέρα από το τέλος της εν λόγω διάταξης. 307 00:13:47,880 --> 00:13:50,410 Έτσι, εάν έχετε ένα σειρά μεγέθους 5 και 308 00:13:50,410 --> 00:13:53,700 προσπαθήσετε να αποκτήσετε πρόσβαση βραχίονα σειρά 5 ή 6 ή στήριγμα βραχίονα 7, 309 00:13:53,700 --> 00:13:56,610 ή οτιδήποτε άλλο πέρα ​​από το τέλος, ή ακόμα και τίποτα 310 00:13:56,610 --> 00:14:00,790 below-- βραχίονα σειρά αρνητικών 1-- όλα αυτά είναι υπερχειλίσεις μνήμης. 311 00:14:00,790 --> 00:14:02,810 Είσαι αγγίζοντας μνήμης σε κακή τρόπους. 312 00:14:02,810 --> 00:14:04,090 313 00:14:04,090 --> 00:14:04,730 >> Ερώτηση 23. 314 00:14:04,730 --> 00:14:05,760 315 00:14:05,760 --> 00:14:09,100 Έτσι, σε αυτό που χρειάζεστε για την εφαρμογή της strlen. 316 00:14:09,100 --> 00:14:11,630 Και θα σας πω ότι μπορείτε να υποθέσουμε s δεν θα είναι μηδενική, 317 00:14:11,630 --> 00:14:13,790 έτσι ώστε να μην χρειάζεται να κάνει οποιοδήποτε έλεγχο για μηδενική. 318 00:14:13,790 --> 00:14:16,190 Και υπάρχουν πολλοί τρόποι θα μπορούσατε να είχατε κάνει αυτό. 319 00:14:16,190 --> 00:14:18,440 Εδώ έχουμε λάβει μόνο την απλή. 320 00:14:18,440 --> 00:14:21,780 Ξεκινάμε με ένα μετρητή, Ν. η είναι μετρώντας πόσοι χαρακτήρες υπάρχουν. 321 00:14:21,780 --> 00:14:25,560 Ξεκινάμε λοιπόν σε 0, και στη συνέχεια εμείς επαναλάβετε σε ολόκληρη τη λίστα. 322 00:14:25,560 --> 00:14:29,092 >> Είναι s βραχίονα 0 ίση με το null χαρακτήρα τερματισμού; 323 00:14:29,092 --> 00:14:31,425 Θυμηθείτε ψάχνουμε για η μηδενική χαρακτήρας τερματισμού 324 00:14:31,425 --> 00:14:33,360 για να καθορίσει πόσο μακριά σειρά μας είναι. 325 00:14:33,360 --> 00:14:35,890 Αυτό πρόκειται να τερματίσει κάθε σχετική κορδόνι. 326 00:14:35,890 --> 00:14:39,400 Έτσι είναι s βραχίονα 0 ίση με τη μηδενική τερματισμού; 327 00:14:39,400 --> 00:14:42,850 Αν δεν είναι, τότε θα πάμε να εξετάσουμε s βραχίονα 1, s βραχίονα 2. 328 00:14:42,850 --> 00:14:45,050 Συνεχίζουμε μέχρι να βρείτε τη μηδενική τερματισμού. 329 00:14:45,050 --> 00:14:48,580 Μόλις έχουμε βρει, τότε η περιέχει το συνολικό μήκος του κορδονιού, 330 00:14:48,580 --> 00:14:49,942 και μπορούμε απλά να επιστρέψει αυτό. 331 00:14:49,942 --> 00:14:51,180 332 00:14:51,180 --> 00:14:51,865 >> Ερώτηση 24. 333 00:14:51,865 --> 00:14:53,010 334 00:14:53,010 --> 00:14:56,050 Έτσι, αυτό είναι το ένα, όπου μπορείτε πρέπει να κάνουν το εμπόριο off. 335 00:14:56,050 --> 00:14:59,810 Έτσι, ένα πράγμα είναι καλό σε ένα τρόπο, αλλά με ποιο τρόπο είναι αυτό κακό; 336 00:14:59,810 --> 00:15:02,980 Μέχρι εδώ, συγχώνευση είδος τείνει να είναι ταχύτερη από ό, τι bubble sort. 337 00:15:02,980 --> 00:15:06,530 Τούτου λεχθέντος that-- καλά, εκεί είναι πολλαπλές απαντήσεις εδώ. 338 00:15:06,530 --> 00:15:12,930 Αλλά το κυριότερο είναι ότι το bubble sort είναι ω ν για μια ταξινομημένη λίστα. 339 00:15:12,930 --> 00:15:14,950 >> Θυμηθείτε αυτόν τον πίνακα μόλις είδαμε νωρίτερα. 340 00:15:14,950 --> 00:15:17,600 Έτσι φούσκα ταξινομεί ωμέγα της n, το καλύτερο σενάριο 341 00:15:17,600 --> 00:15:20,010 είναι ότι είναι σε θέση να πήγαινε πάνω ο κατάλογος φορά, καθορίζουν 342 00:15:20,010 --> 00:15:22,270 hey αυτό το πράγμα είναι ήδη διαλογή, και την επιστροφή. 343 00:15:22,270 --> 00:15:25,960 Ταξινόμηση με συγχώνευση, δεν έχει σημασία τι κάνετε, είναι ωμέγα της n log n. 344 00:15:25,960 --> 00:15:29,200 Έτσι, για την ταξινομημένη λίστα, φούσκα Ταξινόμηση πρόκειται να είναι ταχύτερη. 345 00:15:29,200 --> 00:15:30,870 346 00:15:30,870 --> 00:15:32,430 >> Τώρα τι γίνεται με συνδεδεμένες λίστες; 347 00:15:32,430 --> 00:15:36,070 Έτσι, μια συνδεδεμένη λίστα μπορεί να αναπτυχθεί και να συρρικνωθεί για να χωρέσει όσο πολλά στοιχεία, όπως απαιτείται. 348 00:15:36,070 --> 00:15:38,489 Αφού είπε that-- έτσι συνήθως η άμεση σύγκριση 349 00:15:38,489 --> 00:15:40,280 πρόκειται να είναι ένα συνδεδεμένο λίστα με μια σειρά. 350 00:15:40,280 --> 00:15:41,600 351 00:15:41,600 --> 00:15:44,050 Έτσι, ακόμα κι αν συστοιχίες μπορούν εύκολα να αναπτυχθούν και να συρρικνωθεί 352 00:15:44,050 --> 00:15:47,130 για να χωρέσει τόσες στοιχεία όπως απαιτείται, μια λίστα που συνδέεται 353 00:15:47,130 --> 00:15:49,600 σε σύγκριση με ένα array-- σειρά έχει τυχαίας προσπέλασης. 354 00:15:49,600 --> 00:15:52,960 Μπορούμε δείκτη σε οποιαδήποτε συγκεκριμένο στοιχείο της συστοιχίας. 355 00:15:52,960 --> 00:15:56,430 >> Έτσι, για μια συνδεδεμένη λίστα, δεν μπορούμε απλά πηγαίνετε στο πέμπτο στοιχείο, 356 00:15:56,430 --> 00:16:00,260 πρέπει να διασχίσει από την αρχή μέχρι να φτάσουμε στο πέμπτο στοιχείο. 357 00:16:00,260 --> 00:16:03,990 Και αυτό πρόκειται να μας αποτρέψει από να κάνει κάτι σαν δυαδική αναζήτηση. 358 00:16:03,990 --> 00:16:08,150 Μιλώντας δυαδική αναζήτηση, δυαδική αναζήτηση τείνει να είναι ταχύτερη από ό, τι με τη γραμμική αναζήτηση. 359 00:16:08,150 --> 00:16:11,120 Αφού είπε that-- έτσι, ένα δυνατό πράγμα 360 00:16:11,120 --> 00:16:13,380 είναι ότι δεν μπορείτε να κάνετε δυαδικό αναζήτηση σε συνδεδεμένες λίστες, 361 00:16:13,380 --> 00:16:14,730 μπορείτε να το κάνετε μόνο σε συστοιχίες. 362 00:16:14,730 --> 00:16:18,030 Αλλά ίσως το πιο σημαντικό, δεν μπορείτε να κάνετε δυαδική αναζήτηση 363 00:16:18,030 --> 00:16:20,690 σε μια σειρά που δεν είναι ταξινομημένο. 364 00:16:20,690 --> 00:16:23,990 Εξ αρχής μπορεί να χρειαστεί να ταξινομήσετε η συστοιχία, και μόνο τότε μπορεί να 365 00:16:23,990 --> 00:16:25,370 κάνετε δυαδική αναζήτηση. 366 00:16:25,370 --> 00:16:27,660 Έτσι, αν το πράγμα σας δεν είναι διαλεγμένα για να αρχίσει με, 367 00:16:27,660 --> 00:16:29,250 Στη συνέχεια γραμμική αναζήτηση μπορεί να είναι γρηγορότερη. 368 00:16:29,250 --> 00:16:30,620 369 00:16:30,620 --> 00:16:31,740 >> Ερώτηση 27. 370 00:16:31,740 --> 00:16:34,770 Έτσι, θεωρούν το πρόγραμμα παρακάτω, η οποία θα είναι στην επόμενη διαφάνεια. 371 00:16:34,770 --> 00:16:37,790 Και αυτό είναι το ένα, όπου είμαστε Θα ήθελα να δηλώσω ρητά 372 00:16:37,790 --> 00:16:39,980 Οι τιμές για διάφορες μεταβλητές. 373 00:16:39,980 --> 00:16:41,990 Έτσι, ας ρίξουμε μια ματιά σε αυτό. 374 00:16:41,990 --> 00:16:43,160 >> Έτσι, μία γραμμή. 375 00:16:43,160 --> 00:16:45,457 Έχουμε int x ισούται με 1. 376 00:16:45,457 --> 00:16:47,040 Αυτό είναι το μόνο πράγμα που συνέβη. 377 00:16:47,040 --> 00:16:50,440 Έτσι, σε μία γραμμή, βλέπουμε σε μας τραπέζι, η Υ, Α, Β, και tmp είναι όλα 378 00:16:50,440 --> 00:16:51,540 σκοτεινόχρωμα. 379 00:16:51,540 --> 00:16:52,280 Έτσι τι είναι x; 380 00:16:52,280 --> 00:16:53,860 Λοιπόν αυτό που ακριβώς ίσο με 1. 381 00:16:53,860 --> 00:16:55,020 382 00:16:55,020 --> 00:16:58,770 Και τότε η Γραμμή δύο, και, βλέπουμε ότι η ομάδα έχει οριστεί σε 2, 383 00:16:58,770 --> 00:17:00,550 και ο πίνακας είναι ήδη συμπληρώνεται για εμάς. 384 00:17:00,550 --> 00:17:03,040 Έτσι, το χ είναι 1 και το γ είναι 2. 385 00:17:03,040 --> 00:17:05,890 >> Τώρα, γραμμή τρεις, είμαστε τώρα μέσα στη συνάρτηση swap. 386 00:17:05,890 --> 00:17:07,560 Τι περνάμε να ανταλλάξουν; 387 00:17:07,560 --> 00:17:11,609 Περάσαμε συμπλεκτικό σύμβολο x για Α, και εμπορικό και y για β. 388 00:17:11,609 --> 00:17:15,160 Όταν το πρόβλημα νωρίτερα δήλωσε ότι η διεύθυνση του x 389 00:17:15,160 --> 00:17:17,520 είναι 0x10, και η διεύθυνση του y είναι 0x14. 390 00:17:17,520 --> 00:17:18,970 391 00:17:18,970 --> 00:17:21,909 Έτσι, α και b είναι ίσες με 0x10 και 0x14, αντίστοιχα. 392 00:17:21,909 --> 00:17:23,670 393 00:17:23,670 --> 00:17:26,250 >> Τώρα στη γραμμή τρία, ποια είναι τα x και y; 394 00:17:26,250 --> 00:17:28,554 Λοιπόν, τίποτα δεν έχει αλλάξει για x και y σε αυτό το σημείο. 395 00:17:28,554 --> 00:17:30,470 Ακόμα κι αν είστε μέσα σε ένα κύριο πλαίσιο στοίβας, 396 00:17:30,470 --> 00:17:32,469 που εξακολουθούν να έχουν το ίδιο αξίες που έκαναν πριν. 397 00:17:32,469 --> 00:17:34,030 Δεν έχουμε τροποποιήσει οποιαδήποτε μνήμη. 398 00:17:34,030 --> 00:17:35,710 Έτσι, το χ είναι 1, το γ είναι 2. 399 00:17:35,710 --> 00:17:36,550 400 00:17:36,550 --> 00:17:37,050 Εντάξει. 401 00:17:37,050 --> 00:17:40,300 Μέχρι τώρα είπαμε int tmp ίσο να πρωταγωνιστήσει ένα. 402 00:17:40,300 --> 00:17:44,410 Έτσι, στη γραμμή τέσσερα, τα πάντα είναι η ίδια εκτός από tmp. 403 00:17:44,410 --> 00:17:47,130 Δεν έχουν αλλάξει οποιεσδήποτε τιμές τίποτα εκτός από tmp. 404 00:17:47,130 --> 00:17:49,230 Θέτουμε tmp ίσα να πρωταγωνιστήσει ένα. 405 00:17:49,230 --> 00:17:50,620 Τι είναι ένα αστέρι; 406 00:17:50,620 --> 00:17:56,240 Λοιπόν, ένα σημεία x, λοιπόν πρωταγωνιστήσει ένα πρόκειται για ίση x, η οποία είναι 1. 407 00:17:56,240 --> 00:18:00,080 Έτσι, τα πάντα είναι αντιγραφή προς τα κάτω, και TMP έχει οριστεί σε 1. 408 00:18:00,080 --> 00:18:01,110 >> Τώρα, η επόμενη γραμμή. 409 00:18:01,110 --> 00:18:03,380 Αστέρι το α ισούται με αστέρι β. 410 00:18:03,380 --> 00:18:10,000 Έτσι, από τη γραμμή five-- και πάλι καλά, τα πάντα είναι η ίδια, εκτός από ό, τι ένα αστέρι είναι. 411 00:18:10,000 --> 00:18:10,830 Τι είναι ένα αστέρι; 412 00:18:10,830 --> 00:18:13,720 Λοιπόν, εμείς απλά είπε ένα αστέρι είναι x. 413 00:18:13,720 --> 00:18:16,400 Έτσι αλλάζουμε x για ίση αστέρι β. 414 00:18:16,400 --> 00:18:18,960 Τι είναι το αστέρι β; Υ. σημεία β έως y. 415 00:18:18,960 --> 00:18:21,030 Έτσι αστέρων b είναι y. 416 00:18:21,030 --> 00:18:25,140 Έτσι είμαστε ρύθμιση x ίσο με το y, και όλα τα άλλα είναι το ίδιο. 417 00:18:25,140 --> 00:18:29,130 Έτσι βλέπουμε στην επόμενη σειρά ότι το x είναι τώρα 2, και τα υπόλοιπα είναι απλώς αντιγράψει. 418 00:18:29,130 --> 00:18:31,120 >> Τώρα στην επόμενη γραμμή, αστέρι β ισούται tmp. 419 00:18:31,120 --> 00:18:34,740 Λοιπόν, εμείς απλά είπε αστέρων b είναι y, έτσι είμαστε ρύθμιση y ίσο με tmp. 420 00:18:34,740 --> 00:18:37,450 Όλα τα άλλα είναι η ίδια, έτσι όλα παίρνουν αντιγράψει. 421 00:18:37,450 --> 00:18:42,050 Είμαστε ρύθμιση y ίσο με ΠΔΤ, η οποία είναι ένα, και όλα τα άλλα είναι το ίδιο. 422 00:18:42,050 --> 00:18:43,210 >> Τώρα, τέλος, σειρά επτά. 423 00:18:43,210 --> 00:18:44,700 Είμαστε πίσω στην κύρια λειτουργία. 424 00:18:44,700 --> 00:18:46,350 Είμαστε μετά τη συμφωνία ανταλλαγής έχει τελειώσει. 425 00:18:46,350 --> 00:18:48,972 Έχουμε χάσει ένα, b, και tmp, αλλά τελικά εμείς 426 00:18:48,972 --> 00:18:51,180 δεν αλλάζουν οποιεσδήποτε τιμές τίποτα σε αυτό το σημείο, 427 00:18:51,180 --> 00:18:52,800 εμείς απλά να αντιγράψετε x και y προς τα κάτω. 428 00:18:52,800 --> 00:18:56,490 Και βλέπουμε ότι τα x και y είναι τώρα 2 και 1, αντί του 1 και 2. 429 00:18:56,490 --> 00:18:58,160 Η συμφωνία ανταλλαγής έχει εκτελεστεί με επιτυχία. 430 00:18:58,160 --> 00:18:59,500 431 00:18:59,500 --> 00:19:00,105 >> Ερώτηση 28. 432 00:19:00,105 --> 00:19:01,226 433 00:19:01,226 --> 00:19:03,100 Ας υποθέσουμε ότι έχετε να αντιμετωπίσετε τα μηνύματα λάθους 434 00:19:03,100 --> 00:19:06,790 κάτω κατά τη διάρκεια των ωρών γραφείου το επόμενο έτος, όπως μια ΑΠ ή TF. 435 00:19:06,790 --> 00:19:08,930 Συμβουλές πώς να διορθώσετε το καθένα από αυτά τα λάθη. 436 00:19:08,930 --> 00:19:11,160 Έτσι αόριστη αναφορά σε GetString. 437 00:19:11,160 --> 00:19:12,540 Γιατί μπορεί να βλέπετε αυτό; 438 00:19:12,540 --> 00:19:15,380 Λοιπόν, αν ένας μαθητής χρησιμοποιεί GetString στον κώδικά τους, 439 00:19:15,380 --> 00:19:20,310 έχουν σωστά hash περιλαμβάνονται CS50 dot h για να συμπεριλάβει τη βιβλιοθήκη CS50. 440 00:19:20,310 --> 00:19:22,380 >> Λοιπόν, τι κάνουν αυτοί Πρέπει να διορθώσετε αυτό το σφάλμα; 441 00:19:22,380 --> 00:19:26,810 Θα πρέπει να κάνετε μια εξόρμηση σε lcs50 η γραμμή εντολών όταν είναι κατάρτιση. 442 00:19:26,810 --> 00:19:29,501 Έτσι, αν δεν περάσει κλαγγή παύλα lcs50, είναι 443 00:19:29,501 --> 00:19:32,000 δεν πρόκειται να έχουν την πραγματική κώδικα που υλοποιεί GetString. 444 00:19:32,000 --> 00:19:33,190 445 00:19:33,190 --> 00:19:34,170 >> Ερώτηση 29. 446 00:19:34,170 --> 00:19:36,190 Εμμέσως δηλώνοντας λειτουργία βιβλιοθήκης strlen. 447 00:19:36,190 --> 00:19:37,550 448 00:19:37,550 --> 00:19:40,360 Καλά αυτό τώρα, δεν έχουν κάνει τη σωστή hash περιλαμβάνουν. 449 00:19:40,360 --> 00:19:41,440 450 00:19:41,440 --> 00:19:45,410 Στη συγκεκριμένη περίπτωση, το αρχείο header θα πρέπει να συμπεριλάβετε είναι εγχόρδων dot h, 451 00:19:45,410 --> 00:19:48,710 και συμπεριλαμβανομένων των εγχόρδων dot ώρα, τώρα η student-- τώρα ο compiler 452 00:19:48,710 --> 00:19:51,750 έχει πρόσβαση ο δηλώσεις του strlen, 453 00:19:51,750 --> 00:19:54,120 και γνωρίζει ότι ο κωδικός σας χρησιμοποιεί σωστά strlen. 454 00:19:54,120 --> 00:19:55,380 455 00:19:55,380 --> 00:19:56,580 >> Ερώτηση 30. 456 00:19:56,580 --> 00:20:00,240 Περισσότερες μετατροπές τοις εκατό από τα επιχειρήματα των δεδομένων. 457 00:20:00,240 --> 00:20:01,540 Λοιπόν, τι είναι αυτό; 458 00:20:01,540 --> 00:20:06,470 Καλά να θυμάστε ότι αυτά τοις εκατό signs-- πώς είναι σχετικές με τις printf. 459 00:20:06,470 --> 00:20:08,890 Έτσι, στην printf θα μπορούσαμε να percent-- θα μπορούσαμε να εκτυπώσετε κάτι 460 00:20:08,890 --> 00:20:11,380 όπως τοις εκατό i backslash n. 461 00:20:11,380 --> 00:20:15,310 Ή θα μπορούσαμε να εκτυπώσετε σαν ποσοστό θ, χώρου, επί τοις εκατό Ι, το διάστημα, επί τοις εκατό Ι. 462 00:20:15,310 --> 00:20:18,950 Έτσι, για κάθε ένα από αυτά σημάδια τοις εκατό, χρειαζόμαστε 463 00:20:18,950 --> 00:20:21,560 να περάσει μια μεταβλητή στο τέλος της printf. 464 00:20:21,560 --> 00:20:26,980 >> Έτσι, αν λέμε παρένθεσης printf τοις εκατό i backslash n κλείσιμο παρένθεσης, 465 00:20:26,980 --> 00:20:30,270 καλά, μπορούμε να πούμε ότι είμαστε πρόκειται να εκτυπώσετε έναν ακέραιο, 466 00:20:30,270 --> 00:20:33,970 αλλά τότε δεν περνούν printf ένας ακέραιος για να εκτυπώσετε πραγματικά. 467 00:20:33,970 --> 00:20:37,182 Έτσι, εδώ περισσότερα τοις εκατό μετατροπές από τα επιχειρήματα των δεδομένων; 468 00:20:37,182 --> 00:20:39,390 Αυτό λέει ότι έχουμε ένα σωρό ποσοστά, 469 00:20:39,390 --> 00:20:42,445 και δεν έχουμε αρκετές μεταβλητές να συμπληρώσετε πραγματικά σε αυτές ποσοστά. 470 00:20:42,445 --> 00:20:44,850 471 00:20:44,850 --> 00:20:50,010 >> Και τότε σίγουρα, για την ερώτηση 31, σίγουρα έχασε 40 bytes σε ένα μπλοκ. 472 00:20:50,010 --> 00:20:52,350 Έτσι, αυτό είναι ένα λάθος Valgrind. 473 00:20:52,350 --> 00:20:54,720 Αυτό λέει ότι κάπου στον κώδικά σας, 474 00:20:54,720 --> 00:20:59,010 έχετε μια κατανομή που είναι 40 bytes μεγάλα ώστε να malloced 40 bytes, 475 00:20:59,010 --> 00:21:00,515 και ποτέ δεν θα απελευθερωθεί. 476 00:21:00,515 --> 00:21:02,480 477 00:21:02,480 --> 00:21:05,140 Το πιο πιθανό είναι το μόνο που χρειάζεται να βρείτε κάποια διαρροή μνήμης, 478 00:21:05,140 --> 00:21:07,650 και βρείτε πού θα πρέπει να ελευθερώσετε αυτό το μπλοκ της μνήμης. 479 00:21:07,650 --> 00:21:08,780 480 00:21:08,780 --> 00:21:11,910 >> Και ερώτηση 32, άκυρη εγγραφής του μεγέθους 4. 481 00:21:11,910 --> 00:21:13,250 Και πάλι αυτό είναι ένα λάθος Valgrind. 482 00:21:13,250 --> 00:21:15,440 Αυτό δεν έχει να κάνει με διαρροές μνήμης τώρα. 483 00:21:15,440 --> 00:21:20,750 Αυτό είναι, οι περισσότεροι likely-- εννοώ, είναι κάποιο είδος άκυρα δικαιώματα μνήμης. 484 00:21:20,750 --> 00:21:23,270 Και το πιο πιθανό είναι κάποια το είδος της υπερχείλισης buffer. 485 00:21:23,270 --> 00:21:26,560 Όταν έχετε μια σειρά, ίσως μια σειρά ακέραιος, και ας 486 00:21:26,560 --> 00:21:30,115 λένε ότι είναι του μεγέθους 5, και σας προσπαθήστε να αγγίξετε βραχίονα πίνακα 5. 487 00:21:30,115 --> 00:21:34,150 Έτσι, αν προσπαθήσετε να γράψετε ότι αξία, αυτό δεν είναι ένα κομμάτι της μνήμης 488 00:21:34,150 --> 00:21:37,440 ότι έχετε πράγματι πρόσβαση σε αυτά, και έτσι θα πάμε για να πάρει αυτό το σφάλμα, 489 00:21:37,440 --> 00:21:39,272 λέγοντας άκυρο εγγραφής του μεγέθους 4. 490 00:21:39,272 --> 00:21:42,480 Valgrind πρόκειται να αναγνωρίσετε ότι είστε προσπαθώντας να αγγίξει τη μνήμη ανάρμοστα. 491 00:21:42,480 --> 00:21:43,980 >> Και αυτό είναι για quiz0. 492 00:21:43,980 --> 00:21:47,065 Είμαι Rob Bowden, και αυτό είναι CS50. 493 00:21:47,065 --> 00:21:51,104