[Powered by Google Translate] [Soluzione - Problem Set 2] [Zamyla Chan - Harvard University] [Questo è CS50. CS50.TV] Bene. Ciao a tutti, e benvenuti a Walkthrough 2. In primo luogo, voglio congratularmi con voi per la finitura pset 1. So che avrebbe potuto essere un po 'difficile per alcuni di voi, avrebbe potuto essere il vostro primo computer programma che hai scritto, ma solo ricordare che alla fine di questo, quando si guarda indietro alla fine del semestre, ti aspetto a pset 1 e ti dice: "Ehi, ho potuto farlo in 5 minuti." Così conoscono e si fidano che alla fine di questo avrai sicuramente trovare pset uno molto semplice. Ma per ora si tratta di un risultato enorme, e complimenti per la sempre fatto. Ora, anche una breve nota prima di entrare nella carne della procedura dettagliata. Voglio solo fare una breve nota che a volte non hanno abbastanza tempo durante le procedure dettagliate di passare attraverso ogni singolo aspetto di fare il problema proposto e un po 'solo forse concentrarsi su 1 o 2 tipi di implementazioni, modi che si possa fare ciò. Ma questo non vuol dire che si è proibito di farlo in un altro modo. Ci sono spesso, come con l'informatica, molti modi di fare le cose, e così sicuramente sentire liberi di utilizzare un diverso tipo di soluzione che forse ho presentato. [Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. Una sezione di domande - 1. Caesar - 2. Vigenere] Bene. Così problema set 2: Crypto è un divertimento uno. Anche in questo caso, con ogni pset si inizia con una sezione di domande che sta per essere condotta nelle sezioni con il tuo compagno di insegnamento assegnato. Non abbiamo intenzione di passare attraverso questi oltre la procedura dettagliata, ma che sicuramente vi aiuteranno a completare il pset. Quindi la prima parte del set problema è Cesare. E così in Cesare qualcuno si passa una chiave con un numero intero, e si crittografare una stringa di testo che essi forniscono e li restituire una cosa criptata. Se qualcuno osservò Una storia di Natale, c'è un esempio di che. Poi la seconda parte del set problema è Vigenere, che è una tecnica di codifica più avanzata. E così stiamo per cifrare un testo, solo che invece con appena un singolo intero, stiamo effettivamente andando a codificarlo con una parola chiave che l'utente ci fornirà. Ok, quindi il primo strumento nella casella degli strumenti di oggi è in realtà sta per essere l'aggiornamento del dispositivo. Sul forum di discussione avremmo visto cose del tipo: "Perché non è questo lavoro?" "Perché non presenta 50 lavori?" e spesso la soluzione è in realtà solo per aggiornare il vostro apparecchio. E quindi se hai appena eseguito in una finestra di terminale nel vostro apparecchio sudo yum-y - che è una bandiera dire sì, aggiornare tutto - update, allora il vostro apparecchio verrà aggiornato se necessario. E non fa male se sei già alla versione più recente del prodotto. Poi sarà solo dire no nuovi aggiornamenti disponibili e si può continuare a lavorare insieme. Ma questo è un bene per l'esecuzione anche ogni volta che si apre l'apparecchio perché siamo ancora molto - a volte se si entra in un bug - fissandola nell'apparecchio. Quindi assicuratevi di avere la versione più recente della macchina ed eseguire tale aggiornamento lì. Bene. Quindi, dal momento abbiamo a che fare con le lettere e la modifica, cifratura cose, stiamo andando a voler davvero diventare la migliore amica di nostra tabella ASCII. Ci sono numerosi quelli on-line, se si trova. Forse anche fare il vostro proprio. In sostanza, con ogni lettera e ogni numero e ogni carattere vi è un numero ad essi associati, e quindi è bello vedere i loro valori ASCII a fianco la lettera vera e propria. Che sicuramente vi aiuterà nel set problema. Una cosa che veramente mi ha aiutato in questo set problema era effettivamente stampare, e mentre stava attraversando, vorrei davvero disegnare su di esso, scrivere, "Se questo deve andare a lì, poi ..." Tipo di disegnare su di esso e segnare in su, diventano migliori amici con la tua tabella ASCII. Poi ci sono pochi altri strumenti a nostra disposizione. Questa volta invece di effettivamente chiedere conferma all'utente per tutto il loro ingresso stiamo andando a fare una combinazione. Stiamo andando a richiedere loro un certo input, ma stiamo anche andando a utilizzare solo gli argomenti della riga di comando. Così, quando corrono il loro programma, di solito si dice. / Ciao, per esempio, se il programma è stato hello.c. Ma questa volta, invece di dire semplicemente quello, possono mettere le parole, gli argomenti in seguito. E così abbiamo intenzione di utilizzare tutto quello che passano a noi come loro contributo pure, così commovente oltre la semplice richiesta di conferma per intero, ma anche utilizzando gli argomenti della riga di comando. E poi andremo in un array e stringhe, che verranno utilizzati in un sacco di bene. Ecco solo un esempio di 1 grafico mini ASCII. Come ho detto, ogni lettera corrisponde ad un numero, e così familiarizzare con questo. Essa sarà utile. E più tardi, quando si inizia a fare un po 'di ASCIIMath che fare con i numeri - aggiungendo, sottraendo loro - quindi sicuramente buona per fare riferimento a questa tabella. Quindi, ecco un esempio di un cifrario di Cesare - qualcosa che potrebbe essere giocato con. E 'solo una ruota. Essenzialmente, c'è un alfabeto esterno e quindi vi è un alfabeto interna. Quindi, in questo caso è un esempio di cifrario di Cesare, ma con una chiave di 0. Essenzialmente, A è allineato con A, B è allineato con B, fino a Z. Ma poi dire che volevamo una chiave di 3, per esempio. Poi ci sarebbe ruotare la ruota interna in modo che A si allinea ora con D, ecc E così questo è essenzialmente quello che stiamo per fare. Noi non abbiamo una ruota, ma quello che abbiamo intenzione di fare è rendere il nostro programma tipo di spostare l'alfabeto con noi una certa quantità di numeri. Quindi, come ho detto prima, stiamo andando a che fare con gli argomenti della riga di comando così come ottenere un numero intero. Quindi il modo che un utente esegue il programma Cesare dicendo. / Caesar e poi inserendo un numero dopo. E quel numero rappresenta la chiave, lo spostamento, quante volte si sta andando ad essere in rotazione la ruota interna del cifrario di Cesare. E così che vedete qui un esempio. Se siamo entrati le lettere da A a L nella nostra cifrario di Cesare, allora sarebbe ingresso D per il punto O, perché questo è ogni lettera spostato più di 3 volte, proprio come l'esempio della ruota che vi ho mostrato. Allora se avete inserito, per esempio, questo è CS50! allora sarebbe anche possibile spostare tutte le lettere. E questa è una cosa importante sia Cesare e Vigenère è che stiamo andando a saltare tutte le non-lettere. Quindi, gli eventuali spazi, caratteri, ecc, numeri, stiamo andando a tenerli lo stesso. Stiamo solo andando a spostare le lettere in questo caso. Quindi, come si vede nella ruota, abbiamo solo le lettere a nostra disposizione, quindi vogliamo solo spostare le lettere e crittografare le lettere. Quindi la prima cosa da fare, si è visto che l'utilizzo di Cesare nel problem set 2 è quello di eseguire Cesare e quindi immettere un numero quando lo si esegue nel terminale. Quindi quello che dobbiamo fare è quello di ottenere in qualche modo la chiave e accedervi. E quindi vogliamo vedere in qualche modo sarà il secondo argomento della riga di comando. Il primo sarà. / Caesar, e il prossimo sarà il numero di chiave. Quindi, prima abbiamo avuto int main (void) per avviare i nostri programmi in C. Stiamo andando a staccare un livello un po ' ed effettivamente vedere che invece di passare nel vuoto per la nostra funzione principale stiamo effettivamente fare con 2 parametri. Abbiamo chiamato un int argc e quindi un array di stringhe chiamato argv. Quindi argc è un numero intero, e rappresenta il numero di argomenti passati al programma. E poi argv è in realtà l'elenco degli argomenti passati. Tutti gli argomenti sono stringhe, e quindi argv rappresenta un array, una lista, di stringhe. Parliamo di array un po '. Gli array sono essenzialmente una nuova struttura di dati. Ci sono interi, abbiamo doppie, abbiamo corde, e ora abbiamo gli array. Array sono strutture di dati che può contenere più valori dello stesso tipo, Quindi, in sostanza, un elenco di qualsiasi tipo che si desidera. In sostanza, se si vuole una lista di interi tutti in 1 variabile, allora è necessario creare una nuova variabile che è stata di tipo array int. Quindi, gli array sono indice a base zero, il che significa che il primo elemento della matrice è in corrispondenza dell'indice 0. Se la matrice è di lunghezza 4, come in questo esempio, allora la ultimo elemento sarebbe all'indice 3, che è 4 - 1. Quindi, per creare un array, si potrebbe fare qualcosa di simile. Diciamo che voleva una doppia matrice. Questo vale per qualsiasi tipo di tipo di dati, però. Quindi dici che vuoi una doppia matrice. Dire che si desidera chiamare cassetta postale. Proprio come si dovrebbe inizializzare qualsiasi altra doppia, si direbbe doppio e poi il nome, ma questa volta abbiamo messo le parentesi quadre, e quindi il numero ci sarà la lunghezza della matrice. Si noti che in matrici non si può mai modificare la lunghezza, modo da avere sempre di definire e scegliere il numero di scatole, quantità di valori l'array sta per tenere. Quindi, per impostare valori differenti nella propria matrice, hai intenzione di usare questa sintassi seguente, come si vede nella diapositiva. Hai 0 indice casella di posta sarà impostato a 1,2, casella di posta indice 1 set a 2.4, ecc Quindi, ora che abbiamo esaminato array un po ', torniamo a argc e argv. Sappiamo che argv è un array di stringhe. Così, quando un utente passa - dicono che sta eseguendo un programma - dicono. / ciao David Malan, quello che il programma farà per voi è in realtà già venire con quello che argc e argv sono. Quindi non c'è bisogno di preoccuparsi di questo. Argc in questo caso sarebbe 3 perché vede tre parole distinte separate da spazi. E così allora la matrice in questo caso, il primo indice sarebbe. / Ciao, il prossimo David, il prossimo Malan. Qualcuno vedere subito quale sia il rapporto tra argv,  l'array, e argc è? Gia '. Ci arriveremo in che in un esempio in args.c. Vediamo se siamo in grado di sfruttare la relazione tra il 2. Qui si potrebbe scoprire che nell'apparecchio l'applicazione predefinita per aprire i file. c è a volte Emacs. Ma noi vogliamo fare con gedit, quindi cosa si può fare è che si può fare clic destro sul file C, andate su Proprietà, Apri con, quindi scegliere gedit, Imposta come predefinito, e ora il programma dovrebbe aprire in gedit invece di Emacs. Perfetto. Così qui Ho un programma che voglio stampare ogni argomento della riga di comando. Quindi, qualunque sia l'utente immette, voglio essenzialmente tornare a loro su una nuova linea. Così che cosa è una struttura che possiamo utilizzare per iterare su una cosa - qualcosa che probabilmente utilizzato nel pset 1? Se si desidera passare attraverso un determinato numero di cose? >> [Studente] ciclo For. Per il ciclo. Esattamente. Quindi partiamo con il ciclo for. Abbiamo per int i = 0. Diciamo solo iniziare con una variabile di inizializzazione standard. Ho intenzione di lasciare la condizione per un set e poi dire i + +, andando a fare le cose lì. Bene. Quindi, ripensando a argv, se argv è la lista di argomenti passati al programma e argc è il numero di argomenti del programma, allora ciò significa che argc è essenzialmente la lunghezza di argv, destra, perché ci saranno molti come argomenti come il valore di argc. Quindi, se si vuole eseguire iterazioni su ogni elemento di argv, stiamo andando a voler ogni volta accedere alla variabile in argv in corrispondenza dell'indice specificato. Che può essere rappresentato con questo, giusto? Questa variabile qui rappresenta la stringa particolare in questo caso perché è una matrice di stringhe - la stringa particolare in quel determinato indice. Quello che vogliamo fare, in questo caso vogliamo stamparlo, quindi diciamo printf. E ora argv è una stringa, quindi vogliamo mettere quella segnaposto lì. Vogliamo una nuova linea solo per farlo sembrare buono. Quindi qui abbiamo un ciclo di. Non abbiamo la condizione ancora. Così i inizia a 0, e poi ogni volta che sta per stampare la stringa data in quel particolare indice nella matrice. Così, quando vogliamo smettere di stampare elementi della matrice? Quando abbiamo finito, giusto? Quando abbiamo raggiunto la fine della matrice. Quindi non vogliamo superare oltre la lunghezza della matrice, e sappiamo già che non è necessario in realtà attivamente scoprire che la lunghezza di argv è perché è dato a noi, e che cosa è questo? Argc. Esattamente. Così vogliamo fare questo numero argc processo di volte. Io non sono nella directory giusta. Bene. Ora facciamo args. Nessun errore, che è grande. Così facciamo solo argomenti esec. Che cosa è questo andare per tornare a noi? E 'solo andando a stampare di nuovo. "È immesso args nel programma, io vado a dare di nuovo a voi." Quindi diciamo che vogliamo dire args allora foo bar. Così allora esso stampa di nuovo a noi. Va bene? Quindi c'è un esempio di come si può usare argc e argv sapendo che argc rappresenta la lunghezza di argv. Assicurarsi di non fare mai con accesso array uno oltre la lunghezza della matrice perché C sarà sicuramente gridare contro di voi. Otterrete qualcosa chiamato un errore di segmentazione, che non è mai divertente, in pratica dicendo che sta cercando di accedere a qualcosa che non esiste, non appartiene a voi. Quindi assicuratevi, e soprattutto con lo zero-indicizzazione, noi non vogliamo - Come per esempio, se abbiamo un array di lunghezza 4, che indice di matrice 4 non esiste, perché si parte da 0, a indice zero. Essa diventerà una seconda natura, proprio come per i cicli quando si iniziano da 0. Quindi, solo tenere a mente. Se non si desidera accedere sempre l'indice di un array che è oltre la vostra portata. Così possiamo vedere ora come possiamo tipo di accesso gli argomenti della riga di comando che vengono passati trovi Ma come avete visto la stringa, il argv è in realtà un array di stringhe. Quindi in realtà non è un numero intero ancora, ma in Cesare vogliamo fare con numeri interi. Per fortuna, c'è una funzione creata per noi che può effettivamente convertire una stringa in un intero. Anche qui non abbiamo a che fare con l'input dell'utente in cui li stiamo spingendo per l'ingresso qui per la chiave, quindi non possiamo effettivamente reprompt e dire, "Oh, dammi un altro numero intero, ad esempio, se non è valido." Ma abbiamo ancora bisogno di controllare per l'utilizzo corretto. In Cesare sono solo permesso di passare in 1 numero, e quindi devono eseguire. / Cesare e poi devono dare un numero. Quindi argc deve essere un certo numero. Quale numero si tratterebbe se devono passare voi il. / Cesare e poi una chiave? Che cosa è argc? >> [Studente] 2. Due >>. Esattamente. Così si vuole fare in modo che argc è 2. In caso contrario, che, fondamentalmente, si rifiutano di eseguire il programma. In main è una funzione che dice int main, così poi abbiamo sempre in 0 buone prassi di ritorno al termine di un programma di successo. Quindi se, per esempio, ti danno 3 argomenti della riga di comando invece di 2 o dare 1, per esempio, allora quello che faremo è si vorrà verificare la presenza di tale e poi restituire 1 dire, no, non è possibile procedere con questo programma. [Studente] Non ci può essere uno spazio nel testo. >> Mi scusi? [Studente] Non ci può essere uno spazio nel testo che si sta cercando di crittografare. Ah! Per quanto riguarda il testo che stiamo cercando di crittografare, che proviene in realtà più tardi quando diamo il testo. Per ora siamo solo accettare come argomenti del comando il numero effettivo, lo spostamento effettivo per la crittografia Cesare. [Studente] Perché avete bisogno di 2 invece di solo 1 argc? C'è sicuramente 1 numero. Giusto. Il motivo per cui abbiamo bisogno di 2 per argc invece di 1 perché quando si esegue un programma e dire. / Cesare o. / ciao, che conta in realtà come argomento della riga di comando. E allora che prende già in 1 e così poi stiamo inserendo 1 extra. Quindi stai inserendo in realtà una stringa della riga di comando. Che cosa si vuole fare, per Cesare che vogliamo fare con un numero intero, in modo da poter utilizzare questa funzione atoi. E in fondo, si passa in una stringa e poi si ritorna indietro un intero se è possibile fare la stringa in un intero. Ora ricordo che quando abbiamo a che fare con le cose printf o GetString, del genere, includiamo le librerie specifiche per noi. Così all'inizio si comincia con un hash tag standard di I / O,. H, qualcosa del genere. Beh, atoi non è in una di queste librerie, quindi quello che dobbiamo fare è che dobbiamo includere la libreria giusta per questo. Quindi richiamare indietro Procedura dettagliata 1, dove ho discusso la funzione manuale. Si digita l'uomo nel vostro terminale e poi seguito dal nome di una funzione. E così che si apre una lista completa del suo uso, ma bene, si apre la libreria che appartiene a. Quindi lascio a voi per utilizzare la funzione manuale con atoi e capire quale libreria è necessario includere per poter utilizzare la funzione atoi. Quindi abbiamo la chiave e ora si tratta di ottenere il testo in chiaro, e così che in realtà sta per essere l'input dell'utente in cui si richiede. Abbiamo trattato con GetInt e getFloat, e quindi con lo stesso spirito stiamo andando a che fare con GetString. Ma in questo caso non abbiamo bisogno di fare qualsiasi do while o while per controllare. GetString sicuramente ci darà una stringa, e stiamo andando a crittografare ciò che l'utente ci dà. Così si può supporre che tutte queste stringhe utente immessi siano corretti. Grande. Allora una volta che hai la chiave e una volta che hai il testo, ora quello che rimane è che bisogna cifrare il testo in chiaro. Giusto per coprire rapidamente sul linguaggio, il testo in chiaro è ciò che l'utente ti dà, e il testo cifrato è quello che si torna a loro. Così stringhe, per essere in grado di passare attraverso effettivamente lettera per lettera perché dobbiamo spostare ogni lettera, abbiamo capito che le stringhe, se abbiamo tipo staccare la strato, si vede che sono solo davvero un elenco di caratteri. Uno viene dopo l'altra. E così siamo in grado di trattare le stringhe come array, poiché sono array di caratteri. Allora supponiamo di avere una stringa denominata di testo, e all'interno di tale testo variabile viene memorizzata Questo è CS50. Poi il testo in corrispondenza dell'indice 0 sarebbe una T maiuscola, indice 1 sarebbe h, ecc E poi con gli array, nell'esempio argc in args.c, abbiamo visto che abbiamo dovuto scorrere un array e quindi abbiamo dovuto scorrere i = da 0 fino i è inferiore alla lunghezza. Quindi abbiamo bisogno di un modo di capire quale sia la lunghezza della nostra stringa è se andiamo a scorrere su di esso. Per fortuna ancora una volta, c'è una funzione lì per noi, anche se più tardi nel CS50 sarete sicuramente in grado di implementare e rendere la propria funzione che può calcolare la lunghezza di una stringa. Ma per ora stiamo andando a utilizzare la lunghezza della stringa, così strlen. Si passa in una stringa, e poi si ritorna un int che rappresenta la lunghezza della stringa. Vediamo un esempio di come potremmo essere in grado di eseguire iterazioni su ogni carattere in una stringa e fare qualcosa con quello. Quello che vogliamo fare è iterare su ogni carattere della stringa, e quello che vogliamo fare è che ogni carattere stampa indietro 1 di 1 tranne che aggiungere qualcosa accanto ad essa. Quindi partiamo con il ciclo for. Int i = 0. Stiamo per lasciare spazio per la condizione. Vogliamo ripetere fino a raggiungere la fine della stringa, giusto? E allora quale funzione ci dà la lunghezza della stringa? [Risposta degli studenti incomprensibile] Questa è la lunghezza degli argomenti della riga di comando. Ma per una stringa che vogliamo utilizzare una funzione che ci dà la lunghezza della stringa. Ecco, questo è la lunghezza della stringa. E così poi si deve passare una stringa ad esso. Si ha bisogno di sapere la stringa di cui ha bisogno per calcolare la lunghezza di. E allora, in questo caso abbiamo a che fare con la stringa s. Grande. E allora cosa vogliamo fare, cerchiamo di printf. Ora, vogliamo affrontare con i caratteri. Vogliamo stampare ogni singolo carattere. Quando si desidera stampare un galleggiante, è necessario utilizzare il segnaposto come% f. Con un int si usa% d. E così allo stesso modo, con un carattere% c si utilizza per dire ho intenzione di essere la stampa di un carattere che viene memorizzato all'interno di una variabile. Quindi abbiamo questo, e andiamo ad aggiungere un punto e uno spazio ad esso. Quale personaggio stiamo usando? Stiamo per essere utilizzando qualsiasi personaggio che ci siamo della stringa. Allora abbiamo intenzione di utilizzare qualcosa con lo spago, ma vogliamo essere l'accesso il carattere certo lì. Quindi, se una stringa è solo un array, allora come possiamo accedere agli elementi di array? Abbiamo le parentesi quadre, e poi abbiamo messo l'indice in là. Quindi abbiamo parentesi quadre. Il nostro indice in questo caso si può semplicemente utilizzare i. Esattamente. Quindi qui stiamo dicendo che sta andando ad essere la stampa di un carattere seguito da un punto e uno spazio, e quel personaggio sta per essere la lettera i-esimo nella nostra stringa s. Sto solo andando a salvare questo. Va bene. Ora sto andando a correre la lunghezza della stringa. Così abbiamo avuto una stringa denominata OMG, e ora è sottolineato ancora di più. Allo stesso modo, diciamo che in realtà vuole ottenere una stringa da parte dell'utente. Come possiamo fare questo? Prima, come siamo arrivati ​​un int? Abbiamo detto GetInt, giusto? Ma questo non è di tipo int, quindi cerchiamo di GetString. Facciamo in modo che la lunghezza della stringa. Qui non hai inserito una richiesta specifica. Quindi non lo so. Ho intenzione di mettere il mio nome qui e così poi posso fare una di quelle cose dove ho assegnare una parola per ogni lettera o qualcosa del genere. Cool. Ecco, questo è la lunghezza della stringa. Così siamo tornati a Cesare. Abbiamo un paio di strumenti su come possiamo iterare su una stringa, il modo in cui accedere a ciascun singolo elemento. Così ora possiamo tornare al programma. Come ho detto prima, nella tabella ASCII, il tuo migliore amico, si sta andando a vedere i numeri che sono associati con ogni lettera. Ecco quindi dire che il nostro testo in chiaro è che io sono stordito! Poi ognuno di questi caratteri avrà un numero e valore ASCII associato, anche l'apostrofo, anche lo spazio, anche il punto esclamativo, quindi ti consigliamo di tenere a mente. Quindi dire che la nostra chiave che l'utente incluso nel loro argomentazione linea di comando è 6. Questo significa che per la prima lettera, che è, che è rappresentato da 73, si desidera tornare a loro tutto ciò che lettera è rappresentato dal valore ASCII di 73 + 6. In questo caso sarebbe 79. Ora vogliamo andare al carattere successivo. Così la prossima indice 1 del testo in chiaro sarebbe l'apostrofo. Ma ricordate vogliamo solo per cifrare le lettere. Quindi vogliamo fare in modo che l'apostrofo rimane in realtà lo stesso, che non cambia da 39 a 45 è tutto ciò. Vogliamo tenerlo come un apostrofo. Così vogliamo ricordare per cifrare solo le lettere perché vogliamo che tutti gli altri simboli rimanere invariato nel nostro programma. Un'altra cosa che vogliamo è quello di preservare la capitalizzazione. Così, quando si ha una lettera maiuscola, dovrebbe rimanere come maiuscolo. Lowercases dovrebbe rimanere in minuscolo. Quindi, alcune funzioni utili per essere in grado di affrontare solo lettere cifratura mantenere e preservare la capitalizzazione delle cose sia le funzioni islower isalpha, isupper,. E così queste sono funzioni che restituiscono un valore booleano. In sostanza, vero o falso. Si tratta di un maiuscolo? E `la alfanumerico? Si tratta di una lettera, in sostanza. Così qui sono 3 esempi di come si usa tale funzione. In sostanza, si potrebbe verificare se il valore restituito da tale funzione è vera o falsa sulla base di tale ingresso. O fare qualcosa di non cifrare o cifrare esso o fare in modo che sia maiuscolo, ecc [Studente] Si può solo spiegare quelli un po 'di più e come si utilizzano? >> Si ', di sicuro. Quindi, se ci guardiamo indietro, qui abbiamo un capitale che, giusto? Così sappiamo che va a O perché ho + 6 è O. Ma noi vogliamo fare in modo che che O sta per essere una capitale O. Quindi, fondamentalmente, che è una specie di andare a cambiare il nostro contributo. Quindi, se è maiuscolo o no tipo di cambiare il modo in cui abbiamo a che fare con esso. Allora, se si utilizza la funzione isupper su quel particolare indice, così isupper ("I"), che restituisce true per noi, quindi sappiamo che è superiore. Quindi in base a questo, poi andremo in una formula che ti verrà utilizzato per spostare le cose a Cesare, così poi in fondo, ci sarà una formula leggermente diversa se si tratta di lettere maiuscole al contrario in minuscolo. Ha senso? Gia '. Nessun problema. Ho parlato un po 'di aggiungere 6 a una lettera, che non ha molto senso tranne quando abbiamo tipo di capire che questi personaggi sono un po 'intercambiabili con numeri interi. Quello che facciamo noi è una specie di fusione uso implicito. Andremo in fusione un po 'più avanti dove si prende un valore e si trasformano in un diverso tipo di quanto non lo era in origine. Ma con questo pset saremo in grado di utilizzare in modo intercambiabile tipo di caratteri ed i loro corrispondenti valori interi. Quindi, se è sufficiente racchiudere un personaggio con solo le virgolette singole, allora sarete in grado di lavorare con con numeri interi, trattandola come un numero intero. Così il capitale C riferisce a 67. F minuscola si riferisce a 102. Anche in questo caso, se si vuole conoscere questi valori, guarda la tua tabella ASCII. Quindi cerchiamo di andare in alcuni esempi di come si potrebbe essere in grado di sottrarre e aggiungere, come si può effettivamente veramente lavorare con questi personaggi, sono intercambiabili. Dico che ASCIIMath sta per calcolare l'aggiunta di un carattere per un intero e quindi visualizza il carattere risultante così come il valore risultante ASCII. Ed ecco che sto dicendo - we'll accordo con questa parte in seguito - ma in fondo, sto dicendo che l'utente dovrebbe dire ASCIIMath correre lungo con una chiave, e io sto dicendo che la chiave sta per essere il numero con la quale abbiamo intenzione di aggiungere questo personaggio. Così qui notare che dato che sto chiedendo una chiave, dal momento che sto chiedendo che mi stanno dando 1 cosa, Voglio solo accettare. / Asciimath e una chiave. Quindi ho intenzione di chiedere che argc è pari a 2. Se non lo è, quindi ho intenzione di restituire 1 e il programma si chiude. Così sto dicendo che la chiave non sta andando essere il primo argomento della riga di comando, sta andando essere il secondo, e come potete vedere qui, Ho intenzione di trasformarla in un numero intero. Poi ho intenzione di impostare un carattere per essere r. Si noti che il tipo della variabile chr è in realtà un intero. Il modo in cui sono in grado di utilizzare r come un intero è intrappolandolo con le virgolette singole. Ma torniamo al nostro printf dove abbiamo un segnaposto per un carattere e poi un segnaposto per un numero intero, il carattere è rappresentato dalla CHR, e l'intero è la chiave. E così poi abbiamo intenzione di aggiungere in seguito il 2 insieme. Quindi stiamo andando ad aggiungere r + qualunque sia la chiave è, e poi andremo a stampare il risultato di questo. Quindi cerchiamo di fare asciimath. E 'aggiornato, quindi cerchiamo di appena eseguito asciimath. Oh, ma vedi, non fa nulla, perché non abbiamo in realtà dare una chiave. Così, quando è appena tornato 1, la nostra funzione principale, è appena tornato di nuovo a noi. Allora passiamo in una chiave. Qualcuno mi dia un numero. >> [Studente] 4. 4. Va bene. Così r un incremento del 4 sta per darci v, che corrisponde al valore ASCII di 118. Allora che tipo di senso che - In realtà, posso chiederti, cosa ne pensa il valore ASCII di r è se r + 4 è il 118? Quindi sì, r è 114. Quindi, se si guarda la tabella ASCII poi, di sicuro, vedrai che r è rappresentata da 114. Quindi, ora che sappiamo che possiamo aggiungere interi a personaggi, questo sembra abbastanza semplice. Stiamo solo andando a scorrere una stringa come abbiamo visto in un esempio prima. Ci verificare se si tratta di una lettera. Se lo è, allora noi lo spostamento con qualsiasi la chiave è. Abbastanza semplice, tranne quando si arriva a come questo, si vede che z, rappresentato da 122, poi vuoi dare un carattere diverso. In realtà vuole rimanere all'interno della nostra alfabeto, giusto? Quindi abbiamo bisogno di capire il modo di tipo di avvolgimento intorno. Quando si raggiunge zed e si vuole aumentare di un certo numero, non si vuole andare al di là nella sezione alfabeto ASCII; si vuole avvolgere indietro fino ad A. Ma tenete a mente che stai conserva ancora il caso. Quindi, sapendo che le lettere non possono diventare simboli proprio come simboli non saranno cambiando. Nel pset ultimo sicuramente non ha bisogno di, ma l'opzione era quella di implementare il pset avido utilizzando la funzione modulo. Ma ora stiamo effettivamente andando ad avere bisogno di utilizzare modulo, quindi cerchiamo di basta andare su questo un po '. In sostanza, quando si ha x modulo y, che ti dà il resto di x diviso per y. Ecco alcuni esempi qui. Abbiamo il 27% 15. Fondamentalmente, quando si sottrae 15 da 27 come numero di volte possibile senza ottenere negativo quindi si ottiene 12 sinistra sopra. Ecco, questo è un po 'come nel contesto matematica, ma come possiamo effettivamente utilizzare questo? E 'intenzione di essere utile per la nostra vestaglia. Per questo, diciamo solo che ho chiesto a tutti voi di dividere in 3 gruppi. A volte si esegue questa operazione in gruppo e qualcosa del genere. Dire ho detto: "Ok, voglio che tutti voi di essere diviso in 3." In che modo hai fatto? [Risposta degli studenti incomprensibile] Sì, esattamente. Contare. Va bene. Facciamo darsi da fare. Vuoi cominciare? [Studenti contando] 1, 2, 3, 4. Ma ricorda ... >> [Studente] Oh, mi dispiace. Questo è un punto davvero buona. Hai detto 4, ma in realtà voglio che tu dica 1 perché vogliamo solo 3 gruppi. Allora, come - No, questo è un esempio molto buono, perché allora come potrebbe dire 1? Qual è il rapporto tra il 4 e 1? Beh, 4 mod 3 è 1. Quindi, se si continua, si sarebbe 2. Così abbiamo 1, 2, 3, 1, 2. Anche in questo caso, si è in realtà la 5 ° persona. Come fai a sapere dire 2 invece di 5? Tu dici 5 mod 3 è 2. Voglio vedere quanti gruppi di 3 sono rimasti, poi che ordine sono io E così se poi abbiamo proseguito lungo tutta la stanza, allora si vedrebbe che siamo sempre di applicare la funzione mod a noi stessi contare tipo di off. Questo è un genere più di esempio tangibile di come è possibile utilizzare modulo perché sono sicuro che molti di noi hanno probabilmente vissuto quel processo dove abbiamo dovuto contare fuori. Hai domande su modulo? Sarà molto importante capire i concetti di questo, quindi voglio fare in modo che voi ragazzi capire. [Studente] Se non c'è resto, non ti dà il numero effettivo? Se uno dei primi 3 di loro aveva fatto, avrebbe dato loro ciò che in realtà erano, o sarebbe dato loro [incomprensibile] >> E 'una buona domanda. Quando non c'è resto per il modulo - in modo che si dispone di 6 mod 3 - che dà effettivamente si torna 0. Noi parleremo un po 'più tardi. Oh sì, per esempio, la 3 ª persona - 3 mod 3 è 0, ma in realtà ha detto 3. Ecco, questo è un po 'come un fermo interno, per esempio, come va bene, se il mod è a 0, poi ho intenzione di essere la 3 ° persona. Ma ci arriveremo in genere di come potremmo avere a che fare con ciò che 0 è tardi. Così ora abbiamo in qualche modo hanno un modo di mappatura del Zed alla lettera destra. Quindi, ora che abbiamo passato questi esempi, che tipo di vedere come Cesare potrebbe funzionare. Vedete i 2 alfabeti e poi li vedi spostamento. Quindi cerchiamo di esprimere che in termini di formula. Questa formula è in realtà dato a voi nelle specifiche, ma cerchiamo di tipo di sguardo attraverso ciò che ogni variabile significa. Il risultato finale sarà il testo cifrato. Quindi, questo dice che il carattere i-esimo del testo cifrato sta per corrispondere al carattere esimo del testo in chiaro. Questo ha senso perché vogliamo essere sempre in fila queste cose. Quindi sarà il carattere i-esimo del testo cifrato più k, che è la nostra chiave - che abbia un senso - e poi abbiamo questo mod 26. Ricordate indietro quando abbiamo avuto la zed non volevamo entrare nel personaggio, così abbiamo deciso di mod che e tipo di avvolgono l'alfabeto. Dopo zed si dovrebbe andare ad a, b, c, d, fino a che non ha ottenuto il giusto numero. Così sappiamo che zed, se + 6, ci darebbe f perché dopo zed arriva a, b, c, d, e, f. Quindi ricordiamoci che sappiamo per certo che Zed + 6 sta per darci f. In valori ASCII, z è 122 e f è di 102. Quindi dobbiamo trovare il modo di rendere la nostra formula di Cesare ci danno 102 dopo aver preso in 122. Quindi, se abbiamo appena applicare questa formula, il ('z' + 6)% 26, che dà effettivamente voi 24 perché 122 + 6 è 128, 128% 26 vi dà 24 resto. Ma questo non vuol dire f. Questo non è assolutamente 102. Non è anche la lettera 6 ° dell'alfabeto. Così, ovviamente, abbiamo bisogno di avere un modo di impostare questo un po '. In termini dell'alfabeto regolare, sappiamo che z è la lettera f è 26 e il sesto. Ma siamo in informatica, quindi stiamo andando a indice a 0. Allora, invece di z è il numero 26, che andremo a dire che è il numero 25 perché a è 0. Ora cerchiamo di applicare questa formula. Abbiamo z rappresentato da 25 + 6, che vi dà 31. E 31 mod 26 ti dà 5 come un resto. E 'perfetto perché sappiamo che f è la 5 ° lettera dell'alfabeto. Ma ancora non è f, giusto? E ancora non è 102. E allora per questo pset, una sfida sarà cercare di scoprire il rapporto tra la conversione tra questi valori ASCII e l'indice alfabetico. In sostanza, quello che si vorrà fare, si vuole iniziare con i valori ASCII, ma poi si desidera tradurre in qualche modo che in un indice alfabetico quindi calcolare che cosa lettera che dovrebbe essere - in fondo, qual è il suo indice alfabetico è del personaggio cifrario - poi tradurre che torna ai valori ASCII. Quindi, se tirate fuori il vostro tabella ASCII, quindi cercare di trovare le relazioni tra, diciamo, 102 e 5 o il 122 e 25. Abbiamo ottenuto la nostra chiave di argomenti della riga di comando, abbiamo ottenuto il testo in chiaro, l'abbiamo cifrato. Ora non ci resta da fare è stamparlo. Potremmo fare questo un paio di modi diversi. Che cosa si potrebbe fare è in realtà la stampa come andiamo avanti. Come scorrere i caratteri della stringa, potremmo semplicemente stampare a destra e poi quando calcolarla. In alternativa, è possibile anche memorizzare in un array e hanno una serie di caratteri e alla fine scorrere tale matrice intera e stamparlo. In modo da avere un paio di opzioni per questo. E ricordate che% c sarà il segnaposto per la stampa di un carattere. Così ci abbiamo Cesare, e ora si passa alla Vigenère, che è molto simile a Cesare ma solo leggermente più complessa. Quindi, in sostanza, con Vigenère sta si sta andando a passare in una parola chiave. Così, invece di un numero, si sta andando ad avere una stringa, e così che sta andando ad agire come la parola chiave. Poi, come al solito, si sta andando per ottenere un prompt per una stringa da parte dell'utente e poi cifrare e poi dare loro la schiena testo cifrato. Così come ho detto, è molto simile a Cesare, solo che invece di spostare da un certo numero, il numero è in realtà sta per cambiare ogni volta da un personaggio all'altro. Per rappresentare il numero effettivo di spostare, è rappresentato dalle lettere tastiera. Quindi, se si entra in uno spostamento di, per esempio, allora, che corrisponde ad uno spostamento di 0. Quindi è ancora una volta torna all'indice alfabetico. Ciò che potrebbe essere utile se si sta vedendo che siamo in realtà in gioco valori ASCII nonché le lettere, nonché l'indice alfabetico, magari trovare o fare il vostro tavolo ASCII che mostra l'indice alfabetico di 0 a 25, dalla a alla z, e i valori ASCII in modo da poter vedere il tipo di rapporto e disegnare fuori e cercare di trovare alcuni modelli. Allo stesso modo, se si stavano spostando su istanza certo da f - e questo è sia f minuscolo o maiuscolo - allora che corrisponderebbe a 5. Siamo a posto fino ad ora? La formula per Vigenère è un po 'diverso. In pratica, si vede che è proprio come Cesare, salvo invece di k abbiamo indice k j. Si noti che non stiamo usando i perché essenzialmente, la lunghezza della parola chiave non è necessariamente la lunghezza del nostro testo cifrato. Questo sarà un po 'più chiaro quando vediamo un esempio che ho un po' più avanti. In sostanza, se si esegue il programma con una parola chiave di ohai, poi che significa che ogni volta, ohai sarà il tuo turno. Quindi, a seconda in quale posizione ci si trova la parola chiave, si sta andando a spostare il tuo personaggio certo testo cifrato in misura corrispondente. Ancora una volta, proprio come Cesare, si vuole fare in modo che noi preserviamo la capitalizzazione delle cose e solo le lettere, non cifrare i caratteri o spazi. Quindi, guardare indietro a Cesare sulle funzioni che si possono avere utilizzato, il modo in cui avete deciso come spostare le cose, e che si applicano al programma qui. Quindi cerchiamo di mappare questo fuori. Abbiamo un testo in chiaro che abbiamo ottenuto da parte dell'utente da GetString dicendo questo ... è CS50! Poi abbiamo una parola chiave di ohai. I primi 4 caratteri sono abbastanza semplici. Sappiamo che T sta per essere spostato da O, allora h sta per essere spostato da h, i sta per essere spostato da un. Qui si vede che a rappresenta 0, così allora il valore finale è in realtà solo la lettera stessa di prima. Allora s è spostata di i. Ma poi ci sono questi periodi qui. Non vogliamo che per cifrare, e allora non lo cambia da niente e solo stampare il periodo invariato. [Studente] Non capisco come fai a sapere che questo è spostato da - Dove hai - >> Oh, mi dispiace. Nella parte superiore qui si vede che la linea di comando ohai argomento qui, che sta per essere la parola chiave. E così in fondo, sei in bicicletta sui caratteri della parola chiave. [Studente] Quindi o sta per essere lo spostamento lo stesso - Quindi o corrisponde a un certo numero dell'alfabeto. [Studente] destro. Ma dove hai preso il CS50 parte da? Oh. Ecco in GetString dove siete come, "Dammi una stringa da codificare." [Studente] Stanno andando a darvi tale argomento per cambiare di e poi ti chiederà la prima stringa. Sì >>. Così, quando si esegue il programma, che stanno andando a includere la parola chiave negli argomenti della riga di comando loro quando si esegue. Poi, una volta che hai verificato che in realtà ti hanno dato 1 e non di più, non di meno, allora si sta andando per indurre le vittime di una stringa, ad esempio, "Dammi una stringa." Ecco dove, in questo caso hanno dato questo ... è CS50! Allora avete intenzione di usare questo e utilizzare ohai e scorrere. Si noti che qui abbiamo saltato la crittografia dei periodi, ma in termini di nostra posizione per ohai, la prossima abbiamo usato o. In questo caso è un po 'più difficile da vedere perché è 4, quindi cerchiamo di continuare un po '. Basta restare con me qui. Poi abbiamo i e s, che vengono poi tradotto da O e H rispettivamente. Poi abbiamo uno spazio, e così poi sappiamo che non stiamo andando a cifrare gli spazi. Ma si noti che invece di andare a una in questo luogo proprio qui, siamo la crittografia da un - non so se si può vedere che - proprio qui. Quindi non è come in realtà predeterminata, per esempio, o qui va, h va qui, una va qui, i va qui, o, h, a, i, o, h, a, i. Non farlo. Basta spostare la vostra posizione nella parola chiave quando si sa che si sta effettivamente intenzione di crittografia una lettera vera e propria. Fa che tipo di senso? Va bene. Quindi solo alcuni promemoria. Si vuole fare in modo che solo passare alla lettera successiva la parola chiave se il carattere in chiaro è una lettera. Quindi dire che siamo al o. Notiamo che il carattere successivo, l'indice i del testo in chiaro, è un numero, per esempio. Quindi noi non avanzare j, l'indice per la nostra parola chiave, fino a raggiungere un'altra lettera. Anche in questo caso, anche voi volete fare in modo che si avvolgenti all'inizio della parola chiave quando sei alla fine di esso. Se vedi qui siamo in i, il prossimo deve essere o. Così si vuole trovare un modo di essere in grado di avvolgente all'inizio della parola chiave ogni volta che si raggiunge la fine. E così ancora una volta, che tipo di operatore è utile in questo caso per il confezionamento in giro? Come nel conteggio off esempio. [Studente] Il segno di percentuale. >> Si ', il segno di percentuale, che è modulo. Così modulo sarà utile qui quando si vuole avvolgere il vostro indice ohai. E solo un rapido accenno: Provate a pensare di avvolgere sulla parola chiave un po 'come la bassa conta, dove se ci sono 3 gruppi, la 4 ° persona, il loro numero, che hanno detto che era 4 mod 3, che è stato di 1. Quindi, cercare di pensare in questo modo. Come si è visto nella formula, ovunque ci sia e poi ci pi ma poi kj, si vuole fare in modo che a tenere traccia di quelli. Non c'è bisogno di chiamare i, non è necessario chiamare j, ma si vuole fare in modo che a tenere traccia della posizione che ci sei in chiaro così come la posizione che ci sei la parola chiave perché quelli non sono necessariamente sarà lo stesso. Non solo la parola chiave - potrebbe essere una lunghezza completamente diverso da quello del testo in chiaro. Inoltre, il testo in chiaro, ci sono numeri e caratteri, quindi non sta andando per abbinare perfettamente insieme. Sì. [Studente] C'è una funzione per modificare le maiuscole? Si può cambiare un a maiuscola? >> Si, c'è sicuramente. È possibile controllare - Credo che sia toupper, tutti 1 parola. Ma quando si sta cercando di cifrare le cose e conservare il testo, è meglio avere fondamentalmente casi distinti. Se si tratta di una A maiuscola, poi si vuole passare da questo perché nella formula, quando si guarda indietro come dobbiamo tipo di go intercambiabile tra il modo ASCII di rappresentare i numeri e l'indice alfabetico reale, si vuole fare in modo ci sarà un qualche tipo di modello che si sta andando ad utilizzare. Un'altra nota sul modello, in realtà. Stai andando a sicuramente a che fare con i numeri. Cercate di non usare i numeri magici, che è un esempio di stile. Quindi dici che vuoi ogni volta che qualcosa turno di desideri - Ok, quindi suggerimento, un altro spoiler è quando si sta andando ad essere qualcosa di spostamento di una certa quantità, cercate di non rappresentare che da parte di un numero reale ma piuttosto provare e vedere se è possibile utilizzare il valore ASCII, che tipo di più senso. Un'altra nota: perché abbiamo a che fare con le formule, anche se il TF tipo di sapere quale schema si potrebbero utilizzare, meglio al vostro genere di commenti spiegare la logica, come, "Io sto usando questo modello perché ..." e tipo di spiegare il modello in modo succinto i tuoi commenti. [Questa era procedura dettagliata 2] Se non ci sono altre domande, quindi mi limiterò a stare qui per un po '. Buona fortuna con il tuo pset 2: Crypto e grazie per essere venuti. [Studente] Grazie. Grazie >>. [Intro media offline]