[Powered by Google Translate] [Walkthrough - Σετ Πρόβλημα 2] [Zamyla Chan - Πανεπιστήμιο του Χάρβαρντ] [Αυτό είναι CS50. CS50.TV] Εντάξει. Γεια σας, όλοι, και καλωσορίζουμε στο Walkthrough 2. Κατ 'αρχάς, θέλω να σας συγχαρώ για το τελείωμα των PSET 1. Ξέρω ότι θα μπορούσε να ήταν λίγο δύσκολο για μερικούς από εσάς, θα μπορούσε να είναι το πρώτο πρόγραμμα στον υπολογιστή σας που γράψατε, αλλά απλά να θυμάστε ότι στο τέλος του αυτό, όταν κοιτάξουμε πίσω στο τέλος του εξαμήνου, θα δούμε PSET 1 και θα πείτε, "Γεια σου, θα μπορούσα να έχω κάνει ότι σε 5 λεπτά." Έτσι γνωρίζετε και εμπιστεύεστε ότι στο τέλος αυτό θα βρείτε σίγουρα PSET 1 αρκετά απλή. Αλλά για τώρα είναι ένα τεράστιο επίτευγμα, συγχαρητήρια και για να πάρει γίνει. Τώρα, επίσης, μια γρήγορη σημείωση πριν φτάσουμε στο κρέας του πέρασμα. Θέλω μόνο να κάνω μια γρήγορη σημείωση ότι μερικές φορές δεν θα έχουν αρκετό χρόνο κατά τη διάρκεια των walkthroughs να περάσει κάθε τρόπο για να γίνει το σύνολο πρόβλημα και όχι απλά ίσως επικεντρωθεί σε 1 ή 2 είδος των εφαρμογών, τρόπους με τους οποίους θα μπορούσατε να το κάνετε αυτό. Αλλά αυτό δεν σημαίνει ότι απαγορεύεται να το κάνουν με έναν άλλο τρόπο. Υπάρχουν συχνά, όπως με την επιστήμη των υπολογιστών, πολλοί τρόποι για να κάνει τα πράγματα, και έτσι σίγουρα διστάσετε να χρησιμοποιήσετε ένα διαφορετικό είδος της λύσης από ό, τι μπορεί να παρουσιάζονται. [PSET 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. Ένα τμήμα των ερωτήσεων - 1. Καίσαρα - 2. Vigenere] Εντάξει. Έτσι, το πρόβλημα σετ 2: Crypto είναι ένα διασκεδαστικό ένα. Και πάλι, με κάθε PSET θα ξεκινήσει με ένα τμήμα των ερωτήσεων που πρόκειται να διεξαχθεί στις ενότητες σας με τους συναδέλφους ανατεθεί διδασκαλία σας. Εμείς δεν πρόκειται να περάσουν από αυτά πάνω από το πέρασμα, αλλά σίγουρα θα σας βοηθήσει να ολοκληρώσει το PSET. Έτσι, το πρώτο μέρος του συνόλου πρόβλημα είναι Καίσαρα. Και έτσι σε Καίσαρα κάποιος θα σας περάσει ένα κλειδί με έναν ακέραιο αριθμό, και θα κρυπτογραφήσει μια συμβολοσειρά κειμένου που σας παρέχουμε και να τους δώσει πίσω ένα κρυπτογραφημένο πράγμα. Αν κάποιος παρακολουθούσε Μια ιστορία των Χριστουγέννων, υπάρχει ένα παράδειγμα του ότι υπάρχουν. Στη συνέχεια, το δεύτερο μέρος της σειράς πρόβλημα είναι Vigenere, η οποία είναι μια πιο προηγμένη τεχνική κρυπτογράφησης. Και έτσι θα πάμε για την κρυπτογράφηση ένα κομμάτι του κειμένου, εκτός αντί με ένα μόνο ακέραιο, είμαστε πραγματικά πρόκειται να κωδικοποιήσει με μια λέξη-κλειδί που ο χρήστης θα μας προσφέρει. Εντάξει, έτσι το πρώτο εργαλείο στην εργαλειοθήκη σήμερα είναι πραγματικά πρόκειται να την ενημέρωση της συσκευής. Στον πίνακα συζήτησης θα δούμε τα πράγματα όπως, "Γιατί δεν το έργο αυτό;" "Γιατί δεν Υποβολή εργασίας 50;" και συχνά η λύση είναι στην πραγματικότητα απλά να ενημερώσετε τη συσκευή σας. Και έτσι αν απλά τρέχει σε ένα παράθυρο τερματικού sudo συσκευή σας yum-y - αυτό είναι μια σημαία λέγοντας ναι, να ενημερώσετε τα πάντα - ενημέρωση, τότε η συσκευή σας θα ενημερωθεί, εάν είναι ανάγκη. Και δεν βλάπτει, αν είστε ήδη στην πιο πρόσφατη έκδοση της συσκευής. Στη συνέχεια, θα σας πω μόνο δεν νέες ενημερώσεις διαθέσιμες και μπορείτε να συνεχίσετε να εργάζεστε μαζί. Αλλά αυτό είναι καλό να εκτελέσει ακόμη και κάθε φορά που ανοίγετε τη συσκευή γιατί είμαστε ακόμα πολύ - Μερικές φορές, αν έρθουμε σε ένα bug - τον καθορισμό αυτό στη συσκευή. Έτσι, βεβαιωθείτε ότι έχετε την πιο πρόσφατη έκδοση της συσκευής και τρέξτε ότι υπάρχει ενημέρωση. Εντάξει. Έτσι, δεδομένου ότι έχουμε να κάνουμε με τα γράμματα και την αλλαγή, κρυπτογράφηση πράγματα, θα πάμε να θέλουν πραγματικά να γίνουν οι καλύτεροι φίλοι με ASCII διάγραμμα μας. Υπάρχουν πολλά σε απευθείας σύνδεση αυτά, αν βρείτε. Ίσως ακόμη και να φτιάξετε το δικό σας. Βασικά, με κάθε γράμμα και κάθε αριθμό και κάθε χαρακτήρα υπάρχει ένας αριθμός που σχετίζεται με αυτά, και γι 'αυτό είναι καλό να δούμε ASCII τιμές τους παράλληλα με την πραγματική επιστολή. Αυτό θα σας βοηθήσει σίγουρα στο σύνολο του προβλήματος. Ένα πράγμα που με βοήθησε πραγματικά σε αυτό το σύνολο το πρόβλημα ήταν να εκτυπώσετε πραγματικά έξω, και καθώς πήγαινα κατευθείαν, θα ήθελα να επιστήσω την πραγματικότητα σε αυτό, γράφουν, "Αν αυτό πρέπει να πάει εκεί, τότε ..." Είδος αντλήσει από αυτό και το σήμα επάνω, γίνει οι καλύτεροι φίλοι με ASCII τραπέζι σας. Στη συνέχεια, έχουμε μερικά άλλα εργαλεία στη διάθεσή μας. Αυτή τη φορά αντί να προωθηθούν πραγματικά το χρήστη για όλες της εισόδου τους θα πάμε να κάνουμε ένα συνδυασμό. Εμείς πάμε για να τους προτρέψει για κάποια είσοδο, αλλά είμαστε επίσης πρόκειται να χρησιμοποιήσετε μόνο τα επιχειρήματα της γραμμής εντολών. Έτσι, όταν τρέξουμε το πρόγραμμά τους, συνήθως λέτε. / Γειά σου, για παράδειγμα, αν το πρόγραμμά σας ήταν hello.c. Αλλά αυτή τη φορά, αντί να λέμε απλώς ότι, μπορούν να βάλουν λόγια, τα επιχειρήματα των υστέρων. Και έτσι θα πάμε να χρησιμοποιήσετε ό, τι περνούν σε μας ως συμβολή τους, καθώς και, έτσι κινείται πέρα ​​από την απλή προτροπή για ακέραιο, αλλά και με τα επιχειρήματα της γραμμής εντολών. Και μετά θα πάμε σε πίνακες και συμβολοσειρές, οι οποίες θα πρέπει να χρησιμοποιούν πολύ επίσης. Εδώ είναι μόνο ένα παράδειγμα από 1 μίνι ASCII διάγραμμα. Όπως είπα, κάθε γράμμα αντιστοιχεί σε έναν αριθμό, και να εξοικειωθείτε έτσι με αυτό. Θα έρθει σε πρακτικό. Και αργότερα, όταν θα αρχίσει να κάνει κάποια ASCIIMath που ασχολούνται με τους αριθμούς - προσθέτοντας, αφαιρώντας τους - τότε σίγουρα καλό να αναφερθώ σε αυτό το διάγραμμα. Τόσο εδώ είναι ένα παράδειγμα κρυπτογράφησης του Καίσαρα - κάτι που μπορεί να έχουν παίξει με. Είναι απλά ένας τροχός. Ουσιαστικά, υπάρχει ένα εξωτερικό αλφάβητο και έπειτα υπάρχει ένα εσωτερικό αλφάβητο. Έτσι, είναι σωστό εδώ ένα παράδειγμα της κρυπτογράφησης του Καίσαρα, αλλά με ένα κλειδί από το 0. Ουσιαστικά, το Α είναι ευθυγραμμισμένη με τα Α, Β είναι ευθυγραμμισμένο με Β, σε όλη τη διαδρομή μέχρι το Ζ. Στη συνέχεια, όμως να πούμε ότι ήθελε ένα κλειδί των 3, για παράδειγμα. Στη συνέχεια θα περιστρέφεται το εσωτερικό τροχό, έτσι ώστε Ένα ευθυγραμμίζεται πλέον με D, κλπ. Και έτσι αυτό είναι ουσιαστικά αυτό που πάμε να κάνουμε. Δεν έχουμε έναν τροχό, αλλά τι θα πάμε να κάνουμε είναι να κάνει το πρόγραμμά μας το είδος της βάρδιας, το αλφάβητο μαζί μας ένα ορισμένο ποσό των αριθμών. Έτσι, όπως είπα και πριν, θα πάμε να ασχολούνται με τα επιχειρήματα της γραμμής εντολών καθώς και να πάρει έναν ακέραιο. Έτσι, ο τρόπος που ένας χρήστης θα τρέξει το πρόγραμμά σας Καίσαρας είναι λέγοντας. / Caesar και μετά εισάγοντας έναν αριθμό μετά από αυτό. Και ο αριθμός αυτός αντιπροσωπεύει το κλειδί, η μετατόπιση, πόσες φορές θα πάμε να περιστρέφεται το εσωτερικό τροχό του Καίσαρα κρυπτογράφησης σας. Και έτσι θα δείτε εδώ ένα παράδειγμα. Αν μπήκαμε από τα γράμματα Α έως L cipher Caesar σε μας, τότε θα είσοδος D μέσω O γιατί αυτό είναι κάθε επιστολή μετατοπίζεται πάνω από 3 φορές, ακριβώς όπως το παράδειγμα του τροχού που σας έδειξα. Έτσι λοιπόν, αν έχετε εισάγει, για παράδειγμα, αυτό είναι CS50! τότε θα κινηθεί επίσης όλα τα γράμματα. Και αυτό είναι ένα σημαντικό πράγμα και στις δύο Καίσαρα και Vigenere είναι ότι θα πάμε για να υπερπηδήσει τα μη-γράμματα. Έτσι, τυχόν κενά, χαρακτήρες, κλπ, τους αριθμούς, θα πάμε να τους κρατήσει ο ίδιος. Είμαστε μόνο πρόκειται να αλλάξει τα γράμματα σε αυτή την περίπτωση. Έτσι, όπως βλέπετε στο τιμόνι, έχουμε μόνο τα γράμματα στη διάθεσή μας, έτσι το μόνο που θέλουν να μετατοπίσουν τα γράμματα και την κρυπτογράφηση των γραμμάτων. Έτσι, το πρώτο πράγμα που πρέπει να κάνετε, είδε ότι η χρήση του Καίσαρα για το πρόβλημα set 2 είναι να τρέξει Καίσαρα και στη συνέχεια να εισαγάγετε έναν αριθμό, όταν το τρέξετε στο τερματικό. Έτσι, αυτό που πρέπει να κάνουμε είναι να πάρει με κάποιον τρόπο αυτό το κλειδί και πρόσβαση σε αυτό. Και έτσι θέλουμε να δούμε κάποιο τρόπο πρόκειται να είναι το δεύτερο όρισμα της γραμμής εντολών. Η πρώτη θα είναι. / Καίσαρα, και η επόμενη θα είναι το κλειδί αριθμό. Έτσι, πριν είχαμε int main (void) για την έναρξη προγραμμάτων C μας. Εμείς πάμε για να φλούδα πίσω ένα στρώμα λίγο και πραγματικά βλέπουμε ότι αντί να περάσει σε κενό με το κύριο έργο μας είμαστε πραγματικά ασχολούνται με 2 παραμέτρους. Έχουμε μια int argc το όνομα και στη συνέχεια μια σειρά από χορδές που ονομάζεται argv. Έτσι argc είναι ένας ακέραιος, και αντιπροσωπεύει τον αριθμό των arguments που περνιούνται στο πρόγραμμα για σας. Και τότε argv είναι στην πραγματικότητα η λίστα των πέρασε τα επιχειρήματα. Όλα τα επιχειρήματα είναι χορδές, και έτσι argv αντιπροσωπεύει μια σειρά, μια λίστα, των χορδών. Ας μιλήσουμε για συστοιχίες λίγο. Οι πίνακες είναι ουσιαστικά μια νέα δομή δεδομένων. Έχουμε ints, έχουμε διπλασιάζεται, έχουμε χορδές, και τώρα έχουμε συστοιχίες. Συστοιχίες είναι δομές δεδομένων που μπορεί να κρατήσει πολλαπλές τιμές του ίδιου τύπου, τόσο ουσιαστικά, μια λίστα με ό, τι είδος θέλετε. Ουσιαστικά, αν θέλετε μια λίστα ακεραίων όλα σε 1 μεταβλητή, τότε θα δημιουργήσει μια νέα μεταβλητή που ήταν σειρά τύπου int. Έτσι συστοιχίες είναι μηδενικό δείκτη, που σημαίνει ότι το πρώτο στοιχείο του πίνακα είναι στο δείκτη 0. Εάν η συστοιχία είναι μήκους 4, όπως σε αυτό το παράδειγμα, τότε το τελευταίο στοιχείο σας θα είναι στον δείκτη 3, η οποία είναι 4 - 1. Έτσι για να δημιουργήσει σειρά, θα κάνει κάτι τέτοιο. Ας υποθέσουμε ότι έχετε ήθελε μια διπλή σειρά. Αυτό ισχύει και για οποιοδήποτε τύπο δεδομένων τύπου, όμως. Έτσι, ας πούμε ότι θέλετε μια διπλή σειρά. Ας πούμε ότι θέλετε να το ονομάσουμε γραμματοκιβώτιο. Ακριβώς όπως θα προετοιμάσει οποιοδήποτε άλλο διπλό, θα σας πω διπλό και στη συνέχεια το όνομα, αλλά αυτή τη φορά βάλαμε τις αγκύλες, και στη συνέχεια ο αριθμός θα υπάρχει το μήκος της συστοιχίας. Σημειώστε ότι σε πίνακες που δεν μπορεί να αλλάξει ποτέ το μήκος, ώστε να έχετε πάντα να ορίσει και να επιλέξετε πόσα τετράγωνα, πόσες τιμές σειρά σας πρόκειται να κρατήσει. Έτσι για να ορίσετε διαφορετικές τιμές σε σειρά σας, εσείς πρόκειται να χρησιμοποιήσετε αυτό το ακόλουθη σύνταξη, όπως βλέπετε στη διαφάνεια. Γραμματοκιβώτιο 0 Μπορείτε να έχουν δείκτη θα οριστεί στο 1,2, γραμματοκιβώτιο 1 σετ δείκτη στο 2,4, κλπ. Έτσι τώρα που έχουμε αξιολόγηση συστοιχίες λίγο, ας πάμε πίσω στο argc και argv. Γνωρίζουμε ότι argv είναι τώρα μια σειρά από χορδές. Έτσι, όταν ένας χρήστης περνάει - λένε ότι τρέχετε ένα πρόγραμμα - λένε. / γεια David Malan, τι το πρόγραμμα θα κάνουμε για εσάς είναι ήδη πραγματικότητα καταλήξει σε ό, τι argc και argv είναι. Έτσι, δεν χρειάζεται να ανησυχείτε γι 'αυτό. Argc σε αυτή την περίπτωση θα είναι 3, επειδή βλέπει 3 ξεχωριστές λέξεις χωρισμένες με κενά. Και έτσι, τότε η σειρά σε αυτό το παράδειγμα, ο πρώτος δείκτης θα ήταν. / Γεια σου, το επόμενο David, η επόμενη Malan. Υπάρχει κάποιος που να δείτε αμέσως ποια είναι η σχέση μεταξύ argv,  η σειρά, και argc είναι; Ναι. Θα μπει σε ότι σε ένα παράδειγμα σε args.c. Ας δούμε αν μπορούμε να επωφεληθούν από τη σχέση μεταξύ του 2. Εδώ μπορείτε να βρείτε ότι στη συσκευή η προεπιλεγμένη εφαρμογή για να ανοίξει. αρχεία c είναι μερικές φορές Emacs. Αλλά θέλουμε να ασχοληθεί με το gedit, έτσι ώστε ό, τι μπορείτε να κάνετε είναι να μπορείτε να κάνετε δεξί κλικ στο αρχείο C σας, πηγαίνετε στο Ιδιότητες, Άνοιγμα με, και στη συνέχεια επιλέξτε το gedit, Ορισμός ως προεπιλογή, και τώρα το πρόγραμμά σας θα πρέπει να ανοίξει το gedit αντί του Emacs. Τέλεια. Έτσι, εδώ έχω ένα πρόγραμμα που θέλετε να εκτυπώσετε από κάθε όρισμα της γραμμής εντολών. Έτσι, ανεξάρτητα από το χρήστη εισόδους, θέλω να επιστρέψουν κατ 'ουσίαν την επιστροφή τους σε μια νέα γραμμή. Έτσι τι είναι μια δομή που μπορούμε να χρησιμοποιήσουμε για να επαναλάβει κάτι πάνω - κάτι που ίσως χρησιμοποιηθούν σε PSET 1 σας; Αν θέλετε να περάσει μέσα από ένα συγκεκριμένο αριθμό από τα πράγματα; >> [Φοιτητής] Για την μέθοδο loop. Για βρόχο. Ακριβώς. Ας αρχίσουμε με το βρόχο for. Έχουμε για int i = 0. Ας ξεκινήσουμε με ένα τυποποιημένο αρχικοποίηση μεταβλητών. Πάω να αφήσει την κατάσταση για ένα σετ και στη συνέχεια να πω i + +, πρόκειται να κάνει τα πράγματα εκεί. Εντάξει. Έτσι, σκέφτεται πίσω στο argv, εάν argv είναι η λίστα των επιχειρημάτων περάσει μέσα στο πρόγραμμα και argc είναι ο αριθμός των επιχειρημάτων στο πλαίσιο του προγράμματος, τότε αυτό σημαίνει ότι argc είναι ουσιαστικά το μήκος του argv, δεξιά, επειδή θα υπάρξουν πολλά ως επιχειρήματα με την αξία του argc. Έτσι, αν θέλουμε να επαναλάβει σε κάθε στοιχείο στο argv, θα πάμε να θέλουν να έχουν πρόσβαση κάθε χρόνο τη μεταβλητή argv μέσα στο συγκεκριμένο δείκτη. Που μπορεί να αναπαρασταθεί με αυτό, έτσι δεν είναι; Αυτή η μεταβλητή εδώ αντιπροσωπεύει τη συγκεκριμένη σειρά σε αυτή την περίπτωση επειδή είναι μια σειρά χορδών - η συγκεκριμένη σειρά σε αυτό το συγκεκριμένο δείκτη. Αυτό που θέλουμε να κάνουμε, σε αυτή την περίπτωση θέλουμε να το εκτυπώσετε, οπότε ας πούμε printf. Και τώρα argv είναι ένα string, έτσι θέλουμε να θέσει αυτό το σύμβολο κράτησης θέσης εκεί. Θέλουμε μια νέα γραμμή μόνο για να φανεί καλό. Έτσι εδώ έχουμε ένα για βρόχο. Δεν έχουμε ακόμα την κατάσταση. Γι 'αυτό και ξεκινά από το 0, και στη συνέχεια, κάθε φορά που πρόκειται να εκτυπώσετε τη δοθείσα συμβολοσειρά σε αυτή τη συγκεκριμένη δείκτη στη συστοιχία. Έτσι, όταν θέλουμε να σταματήσει η εκτύπωση από τα στοιχεία του πίνακα; Όταν τελειώσετε, έτσι δεν είναι; Όταν έχουμε φτάσει στο τέλος του πίνακα. Έτσι, δεν θέλουμε να υπερβαίνει πέρα ​​από το μήκος της συστοιχίας, και ήδη γνωρίζουμε ότι δεν χρειάζεται πραγματικά ενεργά μάθετε ποιο είναι το μήκος του είναι argv επειδή αυτό είναι που μας δόθηκαν, και τι είναι αυτό; Argc. Ακριβώς. Έτσι, θέλουμε να κάνουμε αυτή την διαδικασία argc αριθμός των φορές. Δεν είμαι στο σωστό κατάλογο. Εντάξει. Τώρα ας κάνουμε args. Δεν υπάρχουν σφάλματα, η οποία είναι μεγάλη. Ας τρέξει μόνο args. Τι είναι αυτή η μετάβαση να επιστρέψει σε μας; Είναι ακριβώς πρόκειται να το εκτυπώσετε ξανά. "Θα εισαχθούν args στο πρόγραμμα? Πάω να το δώσει πίσω σε σας." Ας πούμε ότι θέλουμε να πούμε args τότε foo bar. Άρα, λοιπόν, δεν εκτυπώνει πίσω σε μας. Εντάξει; Υπάρχει λοιπόν ένα παράδειγμα για το πώς μπορείτε να χρησιμοποιήσετε το argc και argv γνωρίζοντας ότι argc αντιπροσωπεύει το μήκος του argv. Βεβαιωθείτε ότι δεν έχετε ποτέ με συστοιχίες πρόσβαση με ένα πέρα ​​από το μήκος του πίνακα C γιατί σίγουρα θα φωνάξει σε σας. Θα πάρετε κάτι που ονομάζεται ένα σφάλμα κατάτμησης, η οποία δεν είναι ποτέ διασκέδαση, λέγοντας ουσιαστικά προσπαθείτε να αποκτήσετε πρόσβαση σε κάτι , που δεν υπάρχει, δεν ανήκουν σε σας. Γι 'αυτό φροντίστε, και ειδικά με το μηδέν-ευρετηρίασης, δεν θέλουμε να - Όπως για παράδειγμα, αν έχουμε μια σειρά από 4 μήκους, ότι ο δείκτης σειρά 4 δεν υπάρχει, γιατί ξεκινούν από 0, με μηδενικό δείκτη. Θα γίνει δεύτερη φύση όπως ακριβώς και για βρόχους, όταν αρχίζουμε από το 0. Έτσι, απλά συνεχίστε να το έχουμε κατά νου. Δεν θέλετε να αποκτήσετε πρόσβαση ποτέ το δείκτη ενός πίνακα που είναι πέρα ​​από την προσιτότητά σας. Έτσι, μπορούμε να δούμε τώρα πώς μπορούμε να το είδος της πρόσβασης τα επιχειρήματα της γραμμής εντολών που περνούν μέσα Αλλά όπως είδατε το string, το argv είναι στην πραγματικότητα μια σειρά χορδών. Έτσι, στην πραγματικότητα δεν είναι ένας ακέραιος ακόμη, αλλά σε Καίσαρα θέλουμε να αντιμετωπίσουμε με ακέραιους αριθμούς. Ευτυχώς, υπάρχει μια λειτουργία που δημιουργήθηκε για μας που μπορεί να μετατρέψει πραγματικά ένα string σε ακέραιο. Επίσης, εδώ δεν έχουμε να κάνουμε με παρέμβαση του χρήστη, όπου είμαστε προτρέποντας τους για την είσοδο εδώ για το κλειδί, έτσι ώστε να μπορούμε πραγματικά δεν reprompt και λένε, "Αχ, να μου δώσει ένα άλλο ακέραιο, ας πούμε, αν δεν είναι έγκυρη." Αλλά εμείς δεν πρέπει ακόμα να βεβαιωθείτε για τη σωστή χρήση. Σε Καίσαρα που επιτρέπεται να περάσει σε 1 αριθμό, και έτσι πρέπει να τρέξει. / καίσαρα και τότε θα πρέπει να σας δώσει έναν αριθμό. Έτσι argc πρέπει να είναι ένα ορισμένο αριθμό. Τι αριθμό θα είναι ότι εάν πρέπει να σας περάσει το. / Καίσαρα και στη συνέχεια, ένα κλειδί; Τι είναι το argc; >> [Φοιτητής] 2. Δύο >>. Ακριβώς. Έτσι, θέλετε να βεβαιωθείτε ότι argc είναι 2. Διαφορετικά, μπορείτε ουσιαστικά να αρνηθεί να τρέξει το πρόγραμμα. Το κύριο είναι μια λειτουργία που λέει int main, έτσι τότε είμαστε πάντα σε καλή 0 Επιστροφή πρακτική στο τέλος ενός επιτυχημένου προγράμματος. Έτσι, αν, για παράδειγμα, σας δίνουν 3 επιχειρήματα της γραμμής εντολών αντί για 2 ή να σας δώσει 1, για παράδειγμα, τότε τι θα κάνουμε είναι θα θελήσετε να ελέγξετε για να και στη συνέχεια να επιστρέψετε 1 λένε, όχι, δεν μπορώ να προχωρήσουμε με αυτό το πρόγραμμα. [Φοιτητής] Εκεί δεν μπορεί να είναι ένας χώρος στο κείμενό σας. >> Με συγχωρείτε; [Φοιτητής] δεν μπορεί να υπάρξει ένας χώρος στο κείμενο που προσπαθείτε για την κρυπτογράφηση. Αχ! Όσον αφορά το κείμενο που προσπαθούμε για την κρυπτογράφηση, το οποίο προέρχεται πράγματι αργότερα όταν δίνουμε αυτό το κείμενο. Μέχρι τώρα είμαστε ακριβώς την αποδοχή ως επιχειρήματα εντολή ο πραγματικός αριθμός, η πραγματική αλλαγή για την κρυπτογράφηση του Καίσαρα. [Φοιτητής] Γιατί χρειάζεστε 2, σε αντίθεση με μόλις 1 argc; Υπάρχει σίγουρα 1 αριθμός. Δικαίωμα. Ο λόγος για τον οποίο χρειαζόμαστε 2 για argc αντί του 1 οφείλεται στο γεγονός ότι όταν εκτελείτε ένα πρόγραμμα και να πω. / καίσαρα ή. / γεια σου, που μετράει πραγματικά ως όρισμα γραμμής εντολών. Έτσι, στη συνέχεια, η οποία λαμβάνει ήδη το 1 και έτσι τότε είμαστε εισαγωγή 1 επιπλέον. Έτσι είστε εισαγωγή στην πραγματικότητα μια σειρά στο επιχείρημα της γραμμής εντολών. Τι θέλετε να κάνετε, για Καίσαρα θέλουμε να αντιμετωπίσουμε με έναν ακέραιο αριθμό, ώστε να μπορείτε να χρησιμοποιήσετε αυτή τη λειτουργία atoi. Και βασικά, μπορείτε να το δώσετε σε μια σειρά και στη συνέχεια θα επιστρέψει πίσω έναν ακέραιο αν είναι δυνατόν να κάνει ότι string σε ακέραιο. Τώρα θυμηθείτε, όταν έχουμε να κάνουμε με printf ή GetString, τέτοια πράγματα, που περιλαμβάνουν τις βιβλιοθήκες που είναι ειδικά για εμάς. Έτσι, στην αρχή ξεκινάμε με ένα hash tag πρότυπο I / O,. H, κάτι τέτοιο. Λοιπόν, δεν είναι atoi σε μία από αυτές τις βιβλιοθήκες, οπότε αυτό που έχουμε να κάνουμε είναι να έχουμε να συμπεριληφθεί το δικαίωμα βιβλιοθήκη για αυτό. Έτσι, θυμάμαι πίσω στο Walkthrough 1, όπου συζήτησα το εγχειρίδιο λειτουργίας. Πληκτρολογείτε τον άνθρωπο στο τερματικό σας και στη συνέχεια ακολουθείται από το όνομα της συνάρτησης. Και έτσι που θα φέρει μια ολόκληρη λίστα από τη χρήση του, αλλά καθώς αυτό θα φέρει επάνω το οποίο βιβλιοθήκη που ανήκει. Γι 'αυτό θα αφήσω αυτό να μπορείτε να χρησιμοποιήσετε τη χειροκίνητη λειτουργία με atoi και να καταλάβω ποια βιβλιοθήκη θα πρέπει να περιλαμβάνει να είναι σε θέση να χρησιμοποιήσετε τη λειτουργία atoi. Έτσι, έχουμε το κλειδί και τώρα πρόκειται να πάρει τη μορφή απλού κειμένου, και έτσι που πραγματικά θα είναι είσοδο του χρήστη, όπου σας ζητηθεί. Ασχοληθήκαμε με GetInt και GetFloat, και έτσι στο ίδιο πνεύμα θα πάμε να ασχολούνται με GetString. Αλλά σε αυτή την περίπτωση δεν χρειάζεται να κάνετε καμία do ενώ παράλληλα βρόχους ή να ελέγξει. GetString σίγουρα θα μας δώσει μια σειρά, και θα πάμε για την κρυπτογράφηση ό, τι ο χρήστης μας δίνει. Έτσι, μπορείτε να υποθέσουμε ότι όλα αυτά τα εισαγόμενα χρήστη είναι σωστές χορδές. Μεγάλη. Έτσι, στη συνέχεια, από τη στιγμή που έχεις το κλειδί και αφού έχετε το κείμενο, τώρα τι έχει απομείνει είναι να έχετε την κρυπτογράφηση plaintext. Ακριβώς για να καλύψει γρήγορα πάνω από κορακίστικα, το απλό είναι αυτό που ο χρήστης που δίνει, και το κρυπτογράφημα είναι ό, τι να τους επιστρέψει. Έτσι, χορδές, να είναι σε θέση να περάσει μέσα από πραγματικά επιστολή με επιστολή γιατί πρέπει να στρέψουμε κάθε γράμμα, καταλαβαίνουμε ότι οι χορδές, αν το είδος του φλοιού πλάτη στο στρώμα, βλέπουμε ότι είναι πραγματικά μόνο μια λίστα των χαρακτήρων. Ένα έρχεται μετά το άλλο. Και έτσι μπορούμε να θεωρήσουμε ως χορδές συστοιχίες επειδή είναι πίνακες χαρακτήρων. Έτσι πούμε ότι έχετε μια σειρά κειμένου με το όνομα, και εντός της εν λόγω μεταβλητής κείμενο αποθηκεύεται Αυτό είναι CS50. Στη συνέχεια, το κείμενο στο δείκτη 0 θα είναι ένα κεφαλαίο Τ, ο δείκτης 1 θα είναι h, κλπ. Και στη συνέχεια, με συστοιχίες, στο argc παράδειγμα σε args.c, είδαμε ότι έπρεπε να επαναλάβει για μια σειρά και έτσι θα έπρεπε να επαναλάβει από i = 0 μέχρι το i είναι μικρότερο από το μήκος. Γι 'αυτό και πρέπει με κάποιο τρόπο υπολογίζει τι το μήκος της συμβολοσειράς μας είναι αν θα πάμε να επαναλάβει πάνω του. Ευτυχώς πάλι, υπάρχει μια λειτουργία εκεί για μας, αν και αργότερα το CS50 σίγουρα θα είναι σε θέση να εφαρμόσουν και να φτιάξετε το δικό σας λειτουργία που μπορεί να υπολογίσει το μήκος μιας συμβολοσειράς. Αλλά για τώρα θα πάμε να χρησιμοποιήσετε το μήκος συμβολοσειράς, έτσι strlen. Περνάτε σε μια σειρά, και στη συνέχεια θα σας επιστρέψει έναν int που αντιπροσωπεύει το μήκος των χορδών σας. Ας δούμε ένα παράδειγμα για το πώς μπορεί να είμαστε σε θέση να επαναλάβει σε κάθε χαρακτήρα σε μια σειρά και να κάνει κάτι με αυτό. Αυτό που θέλουμε να κάνουμε είναι να επαναλάβει σε κάθε χαρακτήρα του string, και αυτό που θέλουμε να κάνουμε είναι να εκτυπώσετε ξανά κάθε χαρακτήρα 1 από 1 εκτός προσθέσουμε κάτι δίπλα του. Ας αρχίσουμε με το βρόχο for. Int i = 0. Εμείς πάμε για να αφήσει χώρο για την κατάσταση. Θέλουμε να επαναλάβει μέχρι να φτάσουμε στο τέλος του string, έτσι δεν είναι; Έτσι, τότε ποια είναι η λειτουργία μας δίνει το μήκος του string; [Ακούγεται ανταπόκριση των φοιτητών] Αυτό είναι το μήκος του τα επιχειρήματα της γραμμής εντολών. Αλλά για μια σειρά που θέλετε να χρησιμοποιήσετε μια λειτουργία που μας δίνει το μήκος του string. Έτσι ώστε να είναι μήκους. Και έτσι τότε θα πρέπει να περάσει σε μια σειρά σε αυτό. Πρέπει να ξέρετε τι σειρά που χρειάζεται για να υπολογίσει το μήκος του. Έτσι λοιπόν σε αυτή την περίπτωση έχουμε να κάνουμε με string s. Μεγάλη. Και τότε τι θέλουμε να κάνουμε, ας printf. Τώρα, θέλουμε να ασχοληθεί με τους χαρακτήρες. Θέλουμε να εκτυπώσετε κάθε μεμονωμένο χαρακτήρα. Όταν θέλετε να εκτυπώσετε ένα πλωτήρα, θα πρέπει να χρησιμοποιήσετε το σύμβολο κράτησης θέσης, όπως f%. Με έναν int που θα χρησιμοποιήσει% d. Και έτσι ομοίως, με ένα χαρακτήρα που χρησιμοποιείτε γ% να πω ότι είμαι πρόκειται να εκτυπώσετε ένα χαρακτήρα που είναι αποθηκευμένα μέσα σε μια μεταβλητή. Έχουμε λοιπόν αυτό, και ας προσθέσουμε μια περίοδο και ένα χώρο για αυτό. Ποια είναι χαρακτήρας που χρησιμοποιείτε; Εμείς πάμε για να χρησιμοποιούν ό, τι χαρακτήρας είμαστε στο της σειράς. Έτσι λοιπόν θα πάμε να χρησιμοποιούν κάτι με κορδόνι, αλλά θέλουμε να την πρόσβαση στο συγκεκριμένο χαρακτήρα εκεί. Έτσι, αν μια σειρά είναι απλά ένας πίνακας, τότε πώς έχουμε πρόσβαση στα στοιχεία ενός πίνακα; Έχουμε αυτές τις αγκύλες, και στη συνέχεια βάζουμε το δείκτη εκεί. Έτσι έχουμε αγκύλες. Δείκτης μας σε αυτή την περίπτωση μπορούμε να χρησιμοποιήσουμε απλά i. Ακριβώς. Έτσι, εδώ λέμε θα πάμε να εκτυπώσετε ένα χαρακτήρα ακολουθούμενο από μια τελεία και ένα κενό, και ότι ο χαρακτήρας θα είναι το i-επιστολή σε s σειρά μας. Είμαι ακριβώς πρόκειται να σώσει αυτό. Εντάξει. Τώρα είμαι πρόκειται να τρέξει μήκους. Έτσι, είχαμε μια σειρά που ονομάζεται OMG, και τώρα είναι ακόμα πιο τόνισε. Επίσης, ας πούμε ότι πραγματικά θέλετε να πάρετε μια σειρά από τον χρήστη. Πώς να το κάνουμε αυτό; Πριν, πώς φτάσαμε σε int; Είπαμε GetInt, έτσι δεν είναι; Αλλά αυτό δεν είναι int, οπότε ας GetString. Ας κάνουμε μήκους. Εδώ δεν τίθεται μια συγκεκριμένη ερώτηση. Έτσι, δεν ξέρω. Πάω να βάλω το όνομά μου εδώ και έτσι τότε μπορώ να κάνω ένα από εκείνα τα πράγματα όπου μπορώ να ορίσω μια λέξη για κάθε επιστολή ή κάτι τέτοιο. Cool. Έτσι ώστε να είναι μήκους. Έτσι, είμαστε πίσω στον Καίσαρα. Έχουμε μερικά εργαλεία για το πώς θα επαναλάβει σε μια σειρά, πώς έχουμε πρόσβαση σε κάθε μεμονωμένο στοιχείο. Έτσι, τώρα μπορούμε να επιστρέψουμε στο πρόγραμμα. Όπως ανέφερα και πριν, στον πίνακα ASCII, ο καλύτερος φίλος σας, θα πάμε να δούμε τους αριθμούς που σχετίζονται με κάθε γράμμα. Έτσι, εδώ να πω plaintext μας είναι ότι είμαι ζαλισμένος! Στη συνέχεια, κάθε ένα από αυτούς τους χαρακτήρες θα έχει έναν αριθμό και τιμή ASCII που συνδέονται με αυτήν, ακόμη και η απόστροφος, ακόμη και ο χώρος, ακόμη και το θαυμαστικό, έτσι θα θελήσετε να κρατήσετε αυτό κατά νου. Έτσι λένε βασικά μας ότι ο χρήστης που περιλαμβάνονται στο όρισμα γραμμής εντολών τους είναι 6. Αυτό σημαίνει για το πρώτο γράμμα, το οποίο είναι Ι, το οποίο αντιπροσωπεύεται από 73, θέλετε να επιστρέψετε στην επιστολή τους ό, τι αντιπροσωπεύεται από την τιμή ASCII 73 + 6. Σε αυτή την περίπτωση αυτό θα ήταν 79. Τώρα θέλουμε να πάμε στον επόμενο χαρακτήρα. Έτσι, η επόμενη δείκτης 1 του plaintext θα είναι η απόστροφος. Αλλά να θυμάστε ότι το μόνο που θέλουν για την κρυπτογράφηση των γραμμάτων. Έτσι, θέλουμε να βεβαιωθείτε ότι η απόστροφος παραμένει στην πραγματικότητα το ίδιο, ότι δεν αλλάξουμε από 39 έως 45 είναι οτιδήποτε άλλο. Θέλουμε να το κρατήσει ως μια απόστροφο. Έτσι θέλουμε να θυμόμαστε μόνο για την κρυπτογράφηση των γραμμάτων γιατί θέλουμε όλα τα άλλα σύμβολα για να παραμείνει αμετάβλητο το πρόγραμμα μας. Ένα άλλο πράγμα που θέλουμε είναι να διατηρήσει την κεφαλαιοποίηση. Έτσι, όταν έχεις ένα κεφαλαίο γράμμα, θα πρέπει να παραμείνει ως ένα κεφαλαίο. Πεζά γράμματα πρέπει να μείνουν ως πεζά. Έτσι, μερικές χρήσιμες λειτουργίες για να είναι σε θέση να ασχοληθεί μόνο με κρυπτογράφηση γράμματα και να κρατήσει τη διατήρηση της κεφαλαιοποίησης των πραγμάτων είναι οι λειτουργίες islower isalpha, isupper,. Και έτσι αυτά είναι συναρτήσεις που επιστρέφουν μια τιμή Boolean. Βασικά, αληθής ή ψευδής. Είναι αυτό ένα κεφαλαίο; Είναι αυτό το αλφαριθμητικό; Είναι αυτό μια επιστολή, κατ 'ουσίαν. Έτσι, εδώ είναι 3 παραδείγματα για το πώς θα πρέπει να χρησιμοποιήσετε τη λειτουργία αυτή. Βασικά, μπορείτε να ελέγξετε αν η τιμή που επιστρέφεται σε εσάς με αυτή τη λειτουργία είναι αληθής ή ψευδής βασίζονται στην εν λόγω είσοδο. Είτε δεν encipher κάτι ή κρυπτογραφημένο ή να βεβαιωθείτε ότι είναι κεφαλαία, κλπ. [Φοιτητής] Μπορείτε να εξηγήσετε ακριβώς αυτά λίγο περισσότερο και πώς μπορείτε να χρησιμοποιήσετε; >> Ναι, σίγουρα. Έτσι, αν κοιτάξουμε πίσω, εδώ έχουμε ένα κεφάλαιο Ι, έτσι δεν είναι; Γι 'αυτό και ξέρω ότι πηγαίνει στο O γιατί είναι + 6 Ο. Αλλά θέλουμε να βεβαιωθείτε ότι το O πρόκειται να είναι ένα κεφάλαιο O. Έτσι, βασικά, αυτό είναι το είδος του πρόκειται να αλλάξετε την είσοδο μας. Έτσι, αν είναι κεφαλαία ή δεν θα το είδος του να αλλάξει τον τρόπο που ασχολούμαστε με αυτό. Έτσι λοιπόν, αν χρησιμοποιείτε τη λειτουργία isupper για το συγκεκριμένο δείκτη, έτσι isupper ("I"), που επιστρέφει για να μας αλήθεια, έτσι ξέρουμε ότι είναι ανώτερη. Έτσι, στη συνέχεια, με βάση ότι, αργότερα θα πάμε σε έναν τύπο ότι θα πρέπει να χρησιμοποιούν για να αλλάξει τα πράγματα σε Καίσαρα, έτσι τότε βασικά, υπάρχει μετάβαση να είναι ένα ελαφρώς διαφορετικό τύπο αν είναι κεφαλαία σε αντίθεση με πεζά γράμματα. Κάντε νόημα; Ναι. Μην ανησυχείτε. Μίλησα λίγο σχετικά με την προσθήκη 6, σε ένα γράμμα, το οποίο δεν κάνει αρκετά λογικό εκτός από την περίπτωση που το είδος των καταλάβουμε ότι αυτοί οι χαρακτήρες είναι το είδος του εναλλάξιμα με ακέραιους αριθμούς. Αυτό που κάνουμε εμείς είναι το είδος της χρήσης σιωπηρή χύτευσης. Θα πάμε σε χύτευση λίγο αργότερα για το πού παίρνετε μια τιμή και να το μετατρέψει σε ένα διαφορετικό είδος από ό, τι ήταν αρχικά. Αλλά με αυτό το PSET θα είμαστε σε θέση να το είδος των χαρακτήρων χρησιμοποιούν εναλλακτικά και τους που αντιστοιχούν ακέραιες τιμές. Έτσι, αν ενθυλακώσει απλά ένα χαρακτήρα με μόνο τα μονά εισαγωγικά, τότε θα είστε σε θέση να συνεργαστεί με με ακέραιους αριθμούς, που ασχολούνται με αυτό ως ακέραιος. Έτσι, το κεφάλαιο Γ σχετίζεται με 67. Πεζά στ σχετίζεται με 102. Και πάλι, αν θέλετε να μάθετε τις τιμές αυτές, να δούμε ASCII τραπέζι σας. Οπότε ας πάμε σε μερικά παραδείγματα για το πώς μπορεί να είναι σε θέση να αφαιρέσετε και να προσθέσετε, πώς μπορείτε πραγματικά να λειτουργήσει πραγματικά με αυτούς τους χαρακτήρες, τα χρησιμοποιούν εναλλακτικά. Λέω ότι ASCIIMath πρόκειται να υπολογίσει την προσθήκη ενός χαρακτήρα σε ένα ακέραιο και στη συνέχεια εμφανίζει το προκύπτον χαρακτήρα καθώς και την προκύπτουσα τιμή ASCII. Και έτσι εδώ λέω - we'll ασχολούνται με αυτό το μέρος αργότερα - αλλά ουσιαστικά, λέω ότι ο χρήστης πρέπει να πω ASCIIMath τρέξει μαζί με ένα κλειδί, και λέω ότι το κλειδί θα είναι ο αριθμός με το οποίο θα πάμε για να προσθέσετε αυτό το χαρακτήρα. Έτσι, εδώ παρατηρήσετε ότι επειδή είμαι απαιτητική ένα πλήκτρο, επειδή είμαι απαιτητική ότι από όπου και αν μου δίνετε 1 πράγμα, Το μόνο που θέλω να αποδεχθεί. / Asciimath και ένα κλειδί. Έτσι, Πάω να απαιτήσει ότι argc είναι ίση με 2. Αν δεν είναι, τότε θα πάω να επιστρέψει 1 και το πρόγραμμα θα κλείσει. Γι 'αυτό και λέω το κλειδί δεν πρόκειται να είναι το πρώτο επιχείρημα της γραμμής εντολών, πρόκειται να είναι η δεύτερη, και όπως μπορείτε να δείτε εδώ, Πάω να τη σειρά του ότι σε έναν ακέραιο. Στη συνέχεια, Πάω να ορίσετε ένα χαρακτήρα για να είναι r. Παρατηρήστε ότι ο τύπος της μεταβλητής chr είναι στην πραγματικότητα ένας ακέραιος. Ο τρόπος που είμαι σε θέση να χρησιμοποιήσει το r ως ακέραιος είναι το περικλείει με αυτά τα μονά εισαγωγικά. Έτσι, πίσω στο printf δήλωση μας, όπου έχουμε ένα σύμβολο κράτησης θέσης για το χαρακτήρα και στη συνέχεια, ένα σύμβολο κράτησης θέσης για έναν ακέραιο αριθμό, ο χαρακτήρας αντιπροσωπεύεται από την chr, και ο ακέραιος είναι το κλειδί. Και έτσι στη συνέχεια θα πάμε στο αποτέλεσμα προσθέστε το 2 μαζί. Έτσι θα πάμε για να προσθέσετε ό, τι r + είναι το κλειδί, και στη συνέχεια θα πάμε για να εκτυπώσετε το αποτέλεσμα αυτό. Ας κάνουν asciimath. Είναι μέχρι σήμερα, οπότε ας τρέξει μόνο asciimath. Ω, αλλά δείτε, δεν κάνει τίποτα, γιατί δεν είχαμε πραγματικά να δώσει μια κλειδί. Έτσι, όταν επέστρεψε μόλις 1, κύρια λειτουργία μας, μόλις επέστρεψε πίσω σε μας. Μέχρι τότε ας περάσει σε ένα κλειδί. Κάποιος να μου δώσει έναν αριθμό. >> [Φοιτητής] 4. 4. Εντάξει. Έτσι r αυξήθηκε κατά 4 πρόκειται να μας δώσει v, το οποίο αντιστοιχεί στην τιμή ASCII 118. Άρα, λοιπόν, το είδος του κάνει νόημα ότι - Στην πραγματικότητα, μπορώ να σας ρωτήσω, τι νομίζετε ότι η τιμή ASCII του r είναι αν r + 4 είναι 118; Τότε ναι, r είναι 114. Έτσι, αν ψάχνετε για το ASCII πίνακα, στη συνέχεια, αρκετά βέβαιος, θα δείτε ότι r αντιπροσωπεύεται από 114. Έτσι, τώρα που ξέρουμε ότι μπορούμε να προσθέσουμε και ακέραιοι χαρακτήρες με, αυτό φαίνεται αρκετά απλό. Εμείς απλά θα επαναλάβει πάνω από ένα string όπως είδαμε στο παράδειγμα πριν. Θα ελέγξουμε αν είναι ένα γράμμα. Αν είναι, τότε θα το αλλάξει από ό, τι είναι το κλειδί. Πολύ απλά, εκτός εάν μπορείτε να πάρετε για να σας αρέσει αυτό, θα δείτε ότι z, εκπροσωπούμενη από 122, τότε θα σας δώσει ένα διαφορετικό χαρακτήρα. Είμαστε πραγματικά θέλουν να μείνουν μέσα μας αλφάβητο, έτσι δεν είναι; Πρέπει λοιπόν να καταλάβουμε κάποιο τρόπο το είδος του περιτυλίγματος γύρω. Όταν φτάσετε zed και θέλετε να αυξηθεί κατά έναν ορισμένο αριθμό, δεν θέλετε να πάτε σε ASCII πέρα ​​από το τμήμα αλφάβητο? θέλετε να γυρίσει πίσω σε όλη τη διαδρομή προς Α. Αλλά να έχετε κατά νου είστε διατηρώντας ακόμα την υπόθεση. Έτσι, γνωρίζοντας ότι οι επιστολές δεν μπορούν να γίνουν σύμβολα όπως ακριβώς και τα σύμβολα δεν πρόκειται να αλλάζει επίσης. Στην τελευταία PSET σίγουρα δεν χρειάζεται να, αλλά ήταν μια επιλογή για την εφαρμογή άπληστοι PSET σας με τη χρήση του συντελεστή λειτουργία. Αλλά τώρα είμαστε στην πραγματικότητα θα χρειαστεί να χρησιμοποιήσετε μέτρο, οπότε ας πάμε πάνω από αυτό το λίγο. Ουσιαστικά, όταν έχετε x modulo y, που σας δίνει το υπόλοιπο του x διαιρούμενο με y. Εδώ είναι μερικά παραδείγματα εδώ. Έχουμε 27% 15. Βασικά, όταν αφαιρέσουμε 15 από 27, όπως πολλές φορές είναι δυνατόν χωρίς να πάρει αρνητική τότε θα πάρετε 12 πάνω αριστερά. Έτσι, αυτό είναι το είδος της, όπως στο πλαίσιο μαθηματικά, αλλά πώς μπορούμε να χρησιμοποιήσουμε πραγματικά αυτό; Είναι πρόκειται να είναι χρήσιμα για τύλιξης μας. Γι 'αυτό, ας πούμε ρώτησα όλους σας να χωρίζονται σε 3 ομάδες. Μερικές φορές μπορείτε να το κάνετε αυτό σε ομάδες και κάτι τέτοιο. Πες μου είπε, "Εντάξει, θέλω όλοι σας να χωριστεί σε 3." Πώς θα μπορούσε να το κάνεις αυτό; [Ακούγεται ανταπόκριση των φοιτητών] Ναι, ακριβώς. Μετρήστε off. Εντάξει. Ας κάνουμε πραγματικότητα αυτό. Θέλετε να ξεκινήσετε; [Φοιτητές καταμέτρηση off] 1, 2, 3, 4. Αλλά να θυμάστε ... >> [Φοιτητής] Ω, συγγνώμη. Αυτό είναι ένα πολύ καλό σημείο. Είπατε 4, αλλά πραγματικά θέλουμε να πούμε 1 επειδή θέλουμε μόνο 3 ομάδες. Έτσι λοιπόν, πώς - Όχι, αυτό είναι ένα πολύ καλό παράδειγμα, γιατί τότε πώς μπορεί να σας πει 1; Ποια είναι η σχέση μεταξύ 4 και 1; Λοιπόν, 4 mod 3 είναι 1. Έτσι, αν συνεχιστεί, θα είναι 2. Έτσι έχουμε 1, 2, 3, 1, 2. Και πάλι, είστε πραγματικά το 5ο άτομο. Πώς ξέρεις να πω 2 αντί για 5; Λέτε 5 mod 3 είναι 2. Θέλω να δω πόσες ομάδες των 3 έχουν απομείνει, τότε ποια σειρά am I. Και έτσι στη συνέχεια, αν συνεχιστεί σε όλο το δωμάτιο, τότε θα βλέπαμε ότι είμαστε πάντα εφαρμόζοντας στην πραγματικότητα τη λειτουργία mod για τους εαυτούς μας το είδος της μετράνε μακριά. Αυτό είναι ένα είδος πιο απτό παράδειγμα για το πώς μπορείτε να χρησιμοποιήσετε modulo επειδή είμαι βέβαιος ότι οι περισσότεροι από μας έχουν κατά πάσα πιθανότητα περάσει από αυτή τη διαδικασία όπου είχαμε να υπολογίζει. Οποιεσδήποτε ερωτήσεις σχετικά με modulo; Θα είναι πολύ σημαντικό να κατανοήσουμε τις έννοιες του αυτό, έτσι θέλω να βεβαιωθείτε ότι έχετε κατανοήσει παιδιά. [Φοιτητής] Αν δεν υπάρχει υπόλοιπο, δεν θα σας δώσει τον πραγματικό αριθμό; Εάν ένα από τα πρώτα 3 από αυτούς είχαν κάνει, θα είναι να τους δοθεί αυτό που πραγματικά ήταν, ή θα τους έχουν δώσει [δεν ακούγεται] >> Αυτό είναι μια καλή ερώτηση. Όταν δεν υπάρχει υπόλοιπο για την modulo - έτσι λένε έχετε 6 mod 3 - που σας δίνει πραγματικά πίσω 0. Θα μιλήσουμε γι 'αυτό λίγο αργότερα. Ω ναι, για παράδειγμα, το 3ο άτομο - 3 mod 3 είναι 0, αλλά στην πραγματικότητα είπε 3. Έτσι, αυτό είναι το είδος του σαν ένα εσωτερικό αλιευμάτων, για παράδειγμα, όπως εντάξει, αν το mod είναι 0 τότε Πάω να είναι το 3ο πρόσωπο. Αλλά θα μπει σε είδος για το πώς θα μπορούσαμε να θέλουμε να ασχοληθεί με ό, τι 0 είναι αργότερα. Έτσι τώρα έχουμε κατά κάποιο τρόπο έναν τρόπο χαρτογράφησης της zed στο σωστό γράμμα. Έτσι τώρα έχουμε περάσει από αυτά τα παραδείγματα, έχουμε το είδος του Καίσαρα δούμε πώς θα μπορούσε να λειτουργήσει. Μπορείτε να δείτε τα 2 αλφάβητα και τότε θα δείτε τους μετατόπιση. Ας προσπαθήσουμε και να εκφράσει την άποψη ότι του τύπου. Αυτός ο τύπος είναι πραγματικά που σας έχει δοθεί στο spec, αλλά ας το είδος του εμφάνιση με το τι σημαίνει κάθε μεταβλητή. Τελικό αποτέλεσμα μας θα είναι το ciphertext. Έτσι, αυτό λέει ότι το i-οστό χαρακτήρα του ciphertext πρόκειται να αντιστοιχεί στο i-οστό χαρακτήρα του plaintext. Αυτό είναι λογικό, διότι θέλουμε να είναι πάντα επένδυση αυτά τα πράγματα. Γι 'αυτό πρόκειται να είναι το i-οστό χαρακτήρα του ciphertext συν k, η οποία είναι το κλειδί μας - αυτό έχει νόημα - και τότε θα έχουμε αυτό το mod 26. Θυμηθείτε πίσω όταν είχαμε την zed δεν θέλαμε να μπει στο χαρακτήρα, γι 'αυτό ήθελε να το mod και το είδος του τυλίγονται γύρω από το αλφάβητο. Μετά zed θα πάει στο α, β, γ, δ, μέχρι να φτάσει στο σωστό αριθμό. Έτσι, γνωρίζουμε ότι zed, αν + 6, θα μας δώσει στ επειδή έρχεται μετά zed α, β, γ, δ, ε, στ. Ας θυμηθούμε γνωρίζουμε με βεβαιότητα ότι zed + 6 θα μας δώσει στ. Σε τιμές ASCII, ζ είναι 122 και το f είναι 102. Γι 'αυτό πρέπει να βρούμε κάποιο τρόπο να καταστεί Καίσαρα φόρμουλα μας να μας δώσουν 102 μετά τη λήψη του σε 122. Έτσι, εάν εφαρμόσουμε ακριβώς αυτόν τον τύπο, το («z» + 6) το 26%, που στην πραγματικότητα σας δίνει 24 διότι 122 + 6 είναι 128? 128% 26 σας δίνει 24 υπόλοιπο. Αλλά αυτό δεν σημαίνει ότι πραγματικά στ. Αυτό σίγουρα δεν είναι 102. Αυτό είναι, επίσης, δεν είναι το 6ο γράμμα του αλφαβήτου. Έτσι, προφανώς, πρέπει να έχουμε κάποιο τρόπο μικροαλλαγές αυτό το λίγο. Όσον αφορά την τακτική αλφάβητο, γνωρίζουμε ότι z είναι η 26η γράμμα και f είναι η 6η. Αλλά είμαστε στην επιστήμη των υπολογιστών, έτσι θα πάμε με τον δείκτη σε 0. Έτσι λοιπόν, αντί του z είναι ο αριθμός 26, θα πάμε να πούμε το νούμερο 25 του επειδή το α είναι 0. Έτσι τώρα ας εφαρμόσουμε αυτόν τον τύπο. Έχουμε z εκπροσωπείται από 25 + 6, το οποίο σας δίνει 31. Και 31 mod 26 σας δίνει 5 ως υπόλοιπο. Αυτό είναι τέλειο, γιατί γνωρίζουμε ότι η f είναι η 5η γράμμα του αλφαβήτου. Αλλά δεν είναι ακόμα στ, έτσι δεν είναι; Δεν είναι ακόμα 102. Έτσι λοιπόν για αυτό το PSET, μια πρόκληση που θα πρέπει να προσπαθούν να βρουν τη σχέση μεταξύ μετατροπή μεταξύ αυτών των τιμών ASCII και το αλφαβητικό ευρετήριο. Ουσιαστικά, αυτό που θα θέλετε να το κάνετε, θέλετε να ξεκινήσετε με τις τιμές ASCII, αλλά στη συνέχεια θέλετε να μεταφράσετε κάποιο τρόπο ότι σε ένα αλφαβητικό ευρετήριο στη συνέχεια να υπολογίσει τι επιστολή θα πρέπει να είναι - ουσιαστικά, αυτό που αλφαβητικό ευρετήριο του είναι του χαρακτήρα κρυπτογράφησης - μεταφράσει τότε ότι πίσω στις τιμές ASCII. Έτσι, αν μαστίγιο ASCII τραπέζι σας, στη συνέχεια, δοκιμάστε και να βρούμε τις σχέσεις μεταξύ, ας πούμε, 102 και 5 ή το 122 και 25. Έχουμε πάρει το κλειδί μας από τα επιχειρήματα της γραμμής εντολών, έχουμε πάρει το απλό, έχουμε το κρυπτογραφημένες. Τώρα το μόνο που μας απομένει να κάνουμε είναι να το εκτυπώσετε. Θα μπορούσαμε να το κάνουμε αυτό μια-δυο διαφορετικούς τρόπους. Τι θα μπορούσαμε να κάνουμε είναι στην πραγματικότητα εκτύπωση όσο προχωράμε. Όπως έχουμε επαναλάβει πάνω από τους χαρακτήρες στη σειρά, θα μπορούσαμε απλά να εκτυπώσετε μόνο το δικαίωμα στη συνέχεια, όταν εμείς τον υπολογισμό του. Εναλλακτικά, μπορείτε να αποθηκεύσετε επίσης σε μια σειρά και να έχουν μια σειρά από χαρακτήρες και στο τέλος επαναλάβει πάνω από το σύνολο της διάταξης και να το τυπώσετε έξω. Έτσι, έχετε δύο επιλογές για αυτό. Και να θυμάστε ότι το γ% θα είναι η κράτηση θέσης για την εκτύπωση ενός χαρακτήρα. Έτσι εκεί έχουμε Καίσαρα, και τώρα προχωράμε για να Vigenere, η οποία είναι πολύ παρόμοια με Καίσαρα αλλά μόνο ελαφρώς πιο περίπλοκη. Έτσι, κατ 'ουσίαν, με Vigenere είναι εσείς πρόκειται να πρέπει να περνάει σε μια λέξη-κλειδί. Έτσι, αντί ενός αριθμού, θα πάμε να έχουν ένα string, και έτσι ότι πρόκειται να λειτουργήσει ως λέξη-κλειδί σας. Στη συνέχεια, ως συνήθως, θα πάμε για να πάρετε μια προτροπή για μια σειρά από τον χρήστη κρυπτογράφηση και στη συνέχεια και στη συνέχεια να τους δώσουμε πίσω το ciphertext. Έτσι, όπως είπα, είναι πολύ παρόμοια με τον Καίσαρα, εκτός αντί μετατόπιση από έναν ορισμένο αριθμό, ο αριθμός είναι στην πραγματικότητα πρόκειται να αλλάξει κάθε φορά από χαρακτήρα σε χαρακτήρα. Για να εκπροσωπεί ότι πραγματικός αριθμός να αλλάξει, αυτό είναι αντιπροσωπεύονται από τα γράμματα του πληκτρολογίου. Έτσι, εάν μπείτε σε μια στροφή του α, για παράδειγμα, τότε αυτό θα αντιστοιχεί σε μετατόπιση του 0. Έτσι είναι και πάλι πίσω στο αλφαβητικό ευρετήριο. Τι θα μπορούσε να είναι χρήσιμο αν βλέπουμε ότι είμαστε στην πραγματικότητα που ασχολούνται με τιμές ASCII καθώς και τα γράμματα, καθώς και το αλφαβητικό ευρετήριο, ίσως βρείτε ή να φτιάξετε το δικό σας ASCII πίνακα που δείχνει το αλφαβητικό ευρετήριο από το 0 έως το 25, Α έως το Ζ, και τις τιμές ASCII, έτσι ώστε να μπορείτε να δείτε το είδος της σχέσης και σκιαγραφήσει και να προσπαθήσουμε και να βρούμε κάποια μοτίβα. Ομοίως, αν οι μετατόπιση στο παράδειγμα ορισμένα από f - και αυτό είναι είτε πεζά ή κεφαλαία στ - τότε αυτό θα αντιστοιχεί στο 5. Είμαστε καλά μέχρι στιγμής; Ο τύπος για Vigenere είναι λίγο διαφορετική. Βασικά, μπορείτε να δείτε ότι είναι ακριβώς όπως Καίσαρα, εκτός και όχι μόνο έχουμε k k δείκτη j. Παρατηρήστε ότι δεν είμαστε i χρησιμοποιώντας επειδή ουσιαστικά, το μήκος των λέξεων-κλειδιών δεν είναι κατ 'ανάγκη το μήκος του ciphertext μας. Αυτό θα είναι μια σαφέστερη λίγο όταν βλέπουμε ένα παράδειγμα ότι έχω λίγο αργότερα. Βασικά, αν τρέξετε το πρόγραμμά σας με μια λέξη-κλειδί του ohai, τότε αυτό σημαίνει ότι κάθε φορά, ohai πρόκειται να είναι βάρδια σας. Έτσι, ανάλογα με το ποια είναι η θέση σας είναι στη λέξη-κλειδί σας, πρόκειται να αλλάξει ορισμένα χαρακτήρα σας ciphertext από το εν λόγω ποσό. Και πάλι, όπως ακριβώς και ο Καίσαρας, θέλουμε να διασφαλίσουμε ότι θα διατηρηθεί η κεφαλαιοποίηση των πραγμάτων και εμείς μόνο γράμματα δεν encipher, χαρακτήρες ή κενά. Έτσι κοιτάξουμε πίσω στον Καίσαρα για τις λειτουργίες που μπορεί να έχετε χρησιμοποιήσει, ο τρόπος που θα αποφασίσει πώς να αλλάξει τα πράγματα, και ότι για να εφαρμόσει το πρόγραμμά σας εδώ. Ας χάρτη αυτό. Έχουμε ένα απλό κείμενο που έχουμε πάρει από το χρήστη από GetString Αυτό λέει ... CS50 είναι! Στη συνέχεια, έχουμε μια λέξη-κλειδί του ohai. Τα πρώτα 4 χαρακτήρες είναι αρκετά απλή. Γνωρίζουμε ότι το Τ πρόκειται να μετατοπιστεί από o, h τότε πρόκειται να μετατοπιστεί από h, i πρόκειται να μετατοπιστεί από ένα. Εδώ μπορείτε να δείτε ότι αντιπροσωπεύει 0, έτσι, τότε η τελική τιμή είναι πραγματικά ακριβώς το ίδιο γράμμα όπως και πριν. Στη συνέχεια s μετατοπίζεται από i. Αλλά τότε θα πρέπει αυτές τις περιόδους εδώ. Δεν θέλουμε να κρυπτογράφηση ότι, έτσι, τότε δεν το αλλάζουν με τίποτα και απλά εκτυπώστε την περίοδο αμετάβλητη. [Φοιτητής] Δεν καταλαβαίνω πώς ξέρετε ότι αυτό μετατοπίζεται από - Πού κάνατε - >> Ω, συγγνώμη. Στην κορυφή εδώ μπορείτε να δείτε ότι η γραμμή εντολών ohai επιχείρημα εδώ, που πρόκειται να είναι η λέξη-κλειδί. Και έτσι, βασικά, είστε το ποδήλατο πάνω από τους χαρακτήρες τη λέξη-κλειδί. [Φοιτητής] Έτσι, o πρόκειται να μετατοπίζεται το ίδιο - Έτσι o αντιστοιχεί σε έναν ορισμένο αριθμό στο αλφάβητο. [Φοιτητής] Δεξιά. Αλλά πού μπορείτε να πάρετε το μέρος από CS50; Αχ. Αυτό είναι το GetString όπου είστε όπως, «Δώστε μου ένα string για να κωδικοποιήσουν." [Φοιτητής] Θα πάμε για να σας δώσει αυτό το επιχείρημα για να μετατοπιστεί από και στη συνέχεια θα ζητήσει για την πρώτη σειρά σας. Ναι >>. Έτσι, όταν την εκτέλεση του προγράμματος, από όπου και αν πρόκειται να περιλαμβάνει τη λέξη-κλειδί στα επιχειρήματα της γραμμής εντολών τους, όταν το τρέξετε. Στη συνέχεια, αφού έχετε ελέγξει ότι έχουν πραγματικά δώσει 1 και όχι περισσότερο, όχι λιγότερο, τότε θα πάμε να τους ζητήσει για μια σειρά, ας πούμε, "Δώστε μου ένα string." Έτσι, αυτό είναι όπου σε αυτή την περίπτωση θα έχουμε δώσει αυτό ... CS50 είναι! Έτσι λοιπόν θα πάμε να χρησιμοποιήσετε και ότι χρησιμοποιούν ohai επαναλάβει και πάνω. Σημειώστε ότι εδώ έχουμε πηδήξει πάνω κρυπτογράφηση των περιόδων, αλλά από την άποψη της θέσης μας για ohai, η επόμενη χρησιμοποιήσαμε o. Σε αυτή την περίπτωση είναι λίγο πιο δύσκολο να δούμε γιατί αυτό είναι 4, οπότε ας συνεχίσουμε λίγο. Απλά κολλήσει μαζί μου εδώ. Τότε έχουμε i και δ, τα οποία στη συνέχεια μεταφράστηκε από o και h αντίστοιχα. Στη συνέχεια έχουμε ένα χώρο, έτσι και τότε ξέρουμε ότι δεν πρόκειται για την κρυπτογράφηση των χώρων. Αλλά ειδοποίηση ότι αντί να πηγαίνουν σε ένα σε αυτό το σημείο ακριβώς εδώ, είμαστε κρυπτογράφηση από ένα - δεν ξέρω αν μπορείτε να δείτε ότι - ακριβώς εδώ. Έτσι, δεν είναι όπως εσείς πραγματικά προκαθορισμένη, δηλαδή, o πηγαίνει εδώ, η πηγαίνει εδώ, α πηγαίνει εδώ, ί πηγαίνει εδώ, o, h, α, ι, ο, h, α, ί. Δεν το κάνουμε αυτό. Θα αλλάξει μόνο η θέση σας στην λέξη-κλειδί όταν ξέρετε ότι είστε πραγματικά πρόκειται να κρυπτογραφήσετε ένα πραγματικό γράμμα. Μήπως αυτό το είδος της νόημα; Εντάξει. Έτσι, μόλις μερικές υπενθυμίσεις. Θέλετε να βεβαιωθείτε ότι έχετε μόνο προχωρήσετε στο επόμενο γράμμα στη λέξη-κλειδί σας αν ο χαρακτήρας σας στο plaintext είναι ένα γράμμα. Έτσι λένε ότι είμαστε στο o. Θα παρατηρήσετε ότι ο επόμενος χαρακτήρας, ο δείκτης i του plaintext, είναι ένας αριθμός, για παράδειγμα. Τότε δεν προχωρήσει j, ο δείκτης-κλειδί για μας, μέχρι να φτάσουμε άλλη επιστολή. Και πάλι, μπορείτε επίσης να θέλετε να βεβαιωθείτε ότι έχετε wraparound στην αρχή της λέξης-κλειδιού όταν είστε στο τέλος της. Αν δείτε εδώ είμαστε στο i, το επόμενο πρέπει να είναι o. Έτσι, θέλετε να βρείτε κάποιο τρόπο να είναι σε θέση να wraparound στην αρχή των λέξεων-κλειδιών σας κάθε φορά που θα φτάσετε στο τέλος. Και έτσι πάλι, τι είδους του χειριστή είναι χρήσιμο σε αυτή την περίπτωση για περιτύλιγμα γύρω; Όπως και κατά την καταμέτρηση off παράδειγμα. [Φοιτητής] Το σύμβολο τοις εκατό. >> Ναι, το σύμβολο τοις εκατό, το οποίο είναι modulo. Έτσι modulo θα έρθει σε πρακτικό εδώ όταν θέλετε να τυλίξετε πάνω από το δείκτη ohai σας. Και ακριβώς μια γρήγορη υπόδειξη: Προσπαθήστε να σκεφτείτε περιτυλίγματος πάνω από τη λέξη-κλειδί κάπως σαν την καταμέτρηση μακριά, όπου αν δεν υπάρχει 3 ομάδες, το 4ο πρόσωπο, αριθμός τους είπαν ότι ήταν 4 mod 3, το οποίο ήταν 1. Έτσι δοκιμάστε και σκεφτείτε με αυτόν τον τρόπο. Όπως είδατε στον τύπο, όπου κι αν έχουν ci pi και στη συνέχεια, αλλά στη συνέχεια kj, θέλετε να βεβαιωθείτε ότι μπορείτε να παρακολουθείτε αυτά. Δεν χρειάζεται να καλέσετε το i, δεν χρειάζεται να το ονομάσουμε j, αλλά θέλετε να βεβαιωθείτε ότι μπορείτε να παρακολουθείτε τη θέση ότι είστε σε plaintext σε σας καθώς και τη θέση ότι είστε σε το κλειδί σας επειδή αυτά δεν είναι απαραίτητα πρόκειται να είναι το ίδιο. Όχι μόνο η λέξη-κλειδί - θα μπορούσε να είναι ένα εντελώς διαφορετικό μήκος από plaintext σας. Επίσης, plaintext σας, υπάρχουν οι αριθμοί και χαρακτήρες, γι 'αυτό δεν πρόκειται να ταιριάζουν απόλυτα μαζί. Ναι. [Φοιτητής] Υπάρχει μια λειτουργία για να αλλάξετε την περίπτωση; Μπορείτε να αλλάξετε ένα στο κεφάλαιο Α; >> Ναι, σίγουρα υπάρχει. Μπορείτε να ελέγξετε έξω - Πιστεύω ότι αυτό είναι toupper, όλα 1 λέξη. Αλλά όταν προσπαθείτε να κρυπτογραφημένη τα πράγματα και να διατηρήσουν το κείμενο, Είναι καλύτερο να έχουμε βασικά ξεχωριστές περιπτώσεις. Αν είναι ένα κεφαλαίο, τότε θέλετε να μετατοπιστεί από αυτό επειδή στον τύπο σας, όταν κοιτάς πίσω το πώς θα πρέπει να πάει το είδος του εναλλακτικά μεταξύ του ASCII τρόπο που εκπροσωπούν τους αριθμούς και η πραγματική αλφαβητικό ευρετήριο, θέλουμε να βεβαιωθείτε υπάρχει μετάβαση να είναι κάποιο είδος του σχεδίου που πρόκειται να χρησιμοποιήσετε. Ένα άλλο σημείωμα σχετικά με το σχέδιο, στην πραγματικότητα. Θα πάμε με σίγουρα να ασχολούνται με τους αριθμούς. Προσπαθήστε να μην χρησιμοποιείτε μαγικό αριθμό, το οποίο είναι ένα παράδειγμα του στυλ. Έτσι, ας πούμε ότι θέλετε σε κάθε αλλαγή της ώρας κάτι από θέλαμε - Εντάξει, έτσι υπαινιγμό, μια άλλη αεροτομή είναι όταν πάμε να μεταφέρουμε κάτι από ένα ορισμένο ποσό, προσπαθήστε να μην δηλώνετε ότι από ένα πραγματικό αριθμό αλλά μάλλον προσπαθήσουμε και να δούμε αν μπορείτε να χρησιμοποιήσετε την τιμή ASCII, το οποίο θα το είδος του να έχει περισσότερο νόημα. Ένα άλλο σημείωμα: Επειδή έχουμε να κάνουμε με τύπους, ακόμα κι αν TF θα σας το είδος του σχεδίου γνωρίζουν τι μπορεί να χρησιμοποιείτε, καλύτερα στο είδος σχόλια σας εξηγήσει τη λογική, όπως, "Είμαι χρησιμοποιώντας αυτό το μοτίβο, επειδή ..." και το είδος της να εξηγήσει το σχέδιο συνοπτικά τα σχόλιά σας. [Αυτό ήταν περιδιάβαση 2] Εάν δεν υπάρχουν άλλες ερωτήσεις, τότε θα μείνουμε εδώ για λίγο. Καλή τύχη με PSET σας 2: Crypto και ευχαριστώ που ήρθατε. [Φοιτητής] Σας ευχαριστώ. >> Ευχαριστώ. [Media Αποσυνδεδεμένος intro]