[GIOCO MUSICA] DAVID J. MALAN: Va bene. Questo è CS50, e questo è la fine della settimana 2. Così oggi, stiamo andando per continuare il nostro sguardo a come noi rappresentiamo le cose sotto il hood-- allontanamento da numeri come interi e valori in virgola mobile e concentrandosi sulle stringhe e programmi in definitiva più interessanti. Ma ci sarà anche uno sguardo a un paio di dominio specifico problems-- il primo dei quali sarà essere coinvolto crittografia, l'arte di scrambling informazioni, in cui vedete qui sopra è una foto di Radio Orphan Annie anello decoder segreto da ieri. Questo è in realtà forma molto primitiva e la forma di bambino di cryptopgraphy per cui questo anello ha due disks-- uno interno ed uno esterno. E ruotando uno di quelli, si possono essenzialmente allineare lettere come A a Z con altre lettere come B attraverso A. In altre parole, si può letteralmente ruotare l'alfabeto, venendo in tal modo con una mappatura da lettere alle lettere in modo che, se si ha voluto inviare un messaggio segreto a qualcuno come Annie, si potrebbe scrivere il vostro messaggio e quindi ruotare le lettere, per cui, se si intendono di dire "A", è invece dici "B", Vuoi dire "B" tu invece dici "C" - o qualcosa di un po 'più intelligente di che-- e quindi, in ultima analisi, fintanto che Annie ha questo decoder anello, lei può decodificare il messaggio. Ora, si può ricordare, infatti, che questo è stato utilizzato in un famoso film che gioca fino alla nausea durante il periodo natalizio. Diamo uno sguardo qui. Ralphie PARKER: "Che si tratti di noto a tutti in sintesi che Ralph Parker è nominato un membro di Little Orphan Annie Segreto Circle e il diritto di tutti i onori e benefici che si verificano ad essa. " Ralphie PARKER (narrante): Firmato Little Orphan Annie. Controfirmato, Pierre Andre! In inchiostro. Onori e benefici, già all'età di nove anni. [GIOCO MUSICA] [CHATTER RADIO] Ralphie PARKER: Andiamo. Andiamo avanti con lui. Non ho bisogno di tutto ciò che il jazz sui contrabbandieri e pirati. RADIO ANNUNCIATORE: Ascoltare domani notte per l'avventura conclusiva di The Pirate Ship nero. Ora, è il momento per Annie Messaggio segreto per voi soci del Secret Circle. Ricordate bambini, solo i membri di Annie Secret Circle in grado di decodificare il messaggio segreto di Annie. Ricordate, Annie dipende da te. Impostare i perni per B-2. Ecco il message-- 12, 11, 2-- Ralphie PARKER (narrante): I Sono nel mio primo incontro segreto. RADIO ANNUNCIATORE: -25, 14, 11, 18, 16-- Ralphie PARKER (narrante): Oh, Pierre era in grande stasera voce. Potrei dire che stasera di messaggio era veramente importante. RADIO ANNUNCIATORE: --3, 25. Questo è un messaggio da Annie se stessa. Ricordate, non dirlo a nessuno. [ANSIMARE] Ralphie PARKER (narrante): Novanta secondi dopo, io sono nell'unica camera casa dove un bambino di nove anni poteva sedersi nel rispetto della privacy e decodifica. Ah. "B." [Ridacchia] Ralphie PARKER (narrante): Sono andato al successivo. "E." La prima parola è "essere". Sì! Veniva più facile ora. "U." [Ridacchia] RANDY PARKER: Aw, andiamo, Ralphie. Devo andare! Ralphie PARKER: Torno giù, Ma. Caspita. "T." "O." "Essere sicuri a. "" Assicuratevi di "che cosa? Qual è stato Little Orphan Annie cercando di dire? "Assicuratevi di" che cosa? MADRE: Ralphie, Randy ha avuto modo di andare. Vi prego di venire fuori? Ralphie PARKER: Va bene, mamma! Torno fuori! Ralphie PARKER (narrante): Mi stavo avvicinando ora. La tensione era terribile. Che cosa è stato? Il destino del pianeta può in bilico. MADRE: Ralphie, Randy deve andare! Ralphie PARKER: Torno fuori, per gridare forte! Ralphie PARKER (RACCONTO): Ci siamo quasi! Le mie dita volavano! La mia mente era una trappola d'acciaio. Ogni poro vibrava. Era quasi chiaro! Sì! Sì! Sì! Sì! Ralphie PARKER: "Essere sicuri bere il tuo Ovaltine. " Ovaltine? Uno spot scadente? [GIOCO MUSICA] Ralphie PARKER: Figlio di una cagna. [Ride] DAVID J. MALAN: In modo che poi è uno sguardo a ciò che la crittografia può essere per un questo-- bere da ieri. Quindi un annuncio veloce. Se siete liberi questo Venerdì alle 13:15 e sarebbe vuole unirsi a noi per CS50 pranzo, testa a questo URL qui. Primo arrivato, primo servire come al solito. Ma col tempo, faremo in modo che la maggior parte chiunque desideri partecipare può programmare-saggio. Quindi stringhe. Abbiamo Zamyla-- quali ora che hai incontrato più probabile nel Problema Set 1-- cui nome è scritto così. E supponiamo che avete digitato il suo nome in un programma per computer che è usando qualcosa come getString. Per recuperare questi tasti, come andiamo su che rappresenta un stringa, una parola, un paragrafo, o più lettere come questi qui? Abbiamo parlato l'ultima volta su interi e problemi che nascono con integer overflow e valori in virgola mobile e problemi che sorgere all'interno di precisione. Con corde, abbiamo almeno avere un po 'più di flessibilità perché strings-- solo nel reale world-- può essere una lunghezza piuttosto arbitraria. Piuttosto breve, piuttosto lunga. Ma anche allora, stiamo andando a scoprire che i computer possono a volte esaurire la memoria e nemmeno memorizzare una stringa abbastanza grande. Ma per ora, cominciamo da visualizzare una stringa come qualcosa in queste caselle Qui. Quindi sei tali scatole, ciascuna delle quali rappresenta un carattere o "char". Quindi ricorda che "char" - c-h-a-r-- è uno dei tipi di dati incorporati in C. E ciò che è bello è che si può utilizzare quella sorta di come un blocco di costruzione, un pezzo di puzzle, se si vuole, per formare un più grande tipo di dati che continueremo chiamare una "stringa". Ora, ciò che è utile di pensare di cose come le stringhe in questo modo? Beh, si scopre che possiamo in realtà sfruttare questa struttura per accedere realmente singoli caratteri in un modo abbastanza semplice. Ho intenzione di andare avanti e creare un file chiamato "stringzero.c," ma si può chiamare qualunque cosa vuoi. E sul sito del corso è già questo esempio in anticipo, quindi non c'è bisogno di digitare tutto. E ho intenzione di andare avanti e prima fare int void main. E nel giro di pochi giorni, inizieremo a prendere in giro a parte quello vuoto è qui, perché è int accanto alla principale, e così via. Ma per ora, continuiamo per copiare incollare questo. Ho intenzione di dichiarare una stringa denominata s. E ho intenzione di tornare da GetString qualunque sia l'utente a. Ciò sta andando essere un semplice programma, senza istruzioni, Sto solo andando a ciecamente si aspetta che l'utente conosce cosa fare per mantenere le cose semplici. E ora ho intenzione di avere un ciclo for. E dentro del mio ciclo for sono andando ad avere int mi viene zero. E i è, ancora una volta, solo una convenzione, una variabile indice per il conteggio, ma potrei chiamare questo quello che voglio. Io vado a fare i è meno than-- bene Il nome di Zamyla è lungo sei lettere. Quindi ho intenzione di duro codice che lì per ora. E poi i ++. E ora all'interno di questi ricci bretelle ho intenzione di fare printf, e voglio stampare una carattere alla volta. Quindi ho intenzione di usare% c per forse la prima volta. E poi voglio stampare ogni carattere sulla propria riga. Quindi ho intenzione di mettere un poco backslash n lì. Chiudi preventivo. E ora voglio fare qualcosa qui. Voglio stampare il lettera specifica nella stringa, s, come sto iterazione da zero fino a sei. In altre parole, voglio stampare il personaggio-esimo di s. Ora come posso fare questo? Beh, proprio come le scatole di questa rappresentazione qui, tipo di, evocare la nozione di boxe lettere a, si può fare allo stesso modo che sintatticamente in C semplicemente specificando, Voglio stampare i di-esimo carattere. Usando le parentesi quadre sulla tastiera del computer che su una tastiera americana sono generalmente sopra il vostro tasto di ritorno. Quindi questo non è giusto ma, come avrete notato. Ma ho intenzione di specie di ciecamente andare avanti qui. E ho intenzione di fare effettuare stringa 0. Ma prima di fare questo, vediamo se ci non può anticipare alcuni errori comuni. È questo andare per compilare? No, mi manca un sacco di cose. Librerie ho sentito. Quindi, quale intestazione file potrei desiderare di aggiungere qui? Già. PUBBLICO: è necessario I / O standard [incomprensibile] DAVID J. MALAN: Eccellente. Quindi ho bisogno di I / O standard. Per quello scopo Voglio I / O standard? Per printf. Quindi includere stdio.h. E si propone, inoltre, che includo la biblioteca CS50 per quale motivo? Per avere le stringhe. Quindi vedremo cosa La biblioteca di CS50 sta facendo per creare questa nozione di una stringa. Ma per ora, si può solo pensare di come un tipo di dati effettivo. In modo che sembra essere un po 'ripulito. E ora ho intenzione di andare avanti e anzi fare rendere stringa 0. Compilato. Quindi questo è un bene. Così ./string0 farmi ingrandire in modo che possiamo vedere più da vicino cosa sta succedendo. Invio. Z-A-M-Y-L-A entrare. E abbiamo stampato al nome di Zamyla. Così che è abbastanza buono. Così ora andiamo avanti e eseguire di nuovo questo programma, e digitare i nome completo di Daven. Sorpresa, sorpresa. Invio. Hmm. Non abbiamo stampato Daven di pieno nome correttamente. Ora questo dovrebbe essere ovvio in Retrospect a causa di ciò, sorta di, decisione di progettazione stupida? Sì, ho hardcoded l' sei dentro il mio ciclo for. Ora l'ho fatto solo perché Sapevo che il nome di Zamyla stava per essere sei lettere. Ma sicuramente questo non è una soluzione generale. Così si scopre che possiamo dinamicamente calcolare la lunghezza di una stringa chiamando una funzione chiamata strlen. Ancora una volta, volutamente sinteticamente denominato semplicemente per rendere più conveniente per digitare. Ma questo è sinonimo di ottenere la lunghezza di una stringa. Ho intenzione di tornare nel mio terminale finestra e ri-eseguire il compilatore. Ma è inveire contro di me. Implicitamente dichiarando funzione di libreria strlen con tipo unsigned int const-- Mi sono perso. Completamente. Quindi, tanto più che il vostro occhi cominciano a smalto su con i messaggi di errore di questo tipo, messa a fuoco onestamente le prime parole. Sappiamo che il problema è in linea 8, come indicato qui. Ed è in stringa-0.c. Implicitamente dichiarando funzione di libreria strlen. In modo che è generalmente sta per essere un modello di messaggi di errore. Implicitamente dichiarando qualcosa. Così, in breve, quello che ho mi sembrava di hanno fatto per quanto riguarda la linea 8, qui. Quale potrebbe essere la soluzione sia ancora se non hai mai usato strlen te stesso? PUBBLICO: Parte di una libreria diversa? DAVID J. MALAN: Part di una libreria diversa. Così si è dichiarato, per così dire. È menzionato in qualche file diverso stdio.h e CS50.h. Ora, dove si è definito? Per essere onesti, hai a poco conoscere questo fuori dalla parte superiore della testa, o voi di Google e scoprire. Oppure so, ho aperto nella CS50 Appliance il programma terminale, che è solo il grande, versione a schermo intero di che cosa c'è nella parte inferiore della finestra di gedit. E si scopre che c'è un comando allo stesso modo succinto, chiamato uomo di manuale, dove se si digita il nome di una funzione e premere Invio, si otterrà indietro piuttosto documentazione arcano. E 'solo testo che in genere sembra un po 'qualcosa di simile. E 'un po' opprimente a prima vista. Ma francamente ho intenzione di lasciate che i miei occhi vitrei e concentrarsi solo sulla parte Mi interessa per il momento. Che è questo. Che sembra strutturalmente simile qualcosa che ho familiarità con. Infatti la pagina man, così di parlare, vi dirà in quale file di intestazione di una funzione come strlen è definito. Quindi ho intenzione di tornare indietro a gedit. E ho intenzione di andare avanti e aggiungere qui # include e salvare il file. Ho intenzione di cancellare lo schermo con Controllo L Se siete stati chiedendo. E ho intenzione di fare rieseguire string.0, compila questo momento. ./string.0 Zamyla. Che sembrava funzionare Lasciami andare avanti ed eseguire nuovamente con Davenport. Invio. E che, troppo, sembrava funzionare. Così possiamo fare un po 'meglio di questo, però, possiamo cominciare a cose ordinate appena un po '. E ho intenzione di realtà introdurre un'altra cosa adesso. Ho intenzione di andare avanti e salvare questo in un file diverso. E ho intenzione di chiamare questo file string1.c solo per essere coerente con il codice sarete in grado di trovare on-line. E concentriamoci in su esattamente lo stesso codice. Si scopre che ho stato tipo di presa per scontato il fatto che il mio computer portatile, e, a sua volta, l'apparecchio CS50 ha un sacco di memoria, un sacco di RAM, un sacco di byte di spazio in cui è possibile memorizzare le stringhe. Ma la realtà, se ho digitato lungo abbastanza, e abbastanza battiture, Ho potuto in teoria tipo in più caratteri che il mio computer ha fisicamente memoria per. E questo è problematico. Proprio come un int può solo Numero di così alta, in teoria, è possibile stipare solo tanti personaggi nella RAM del computer o Random Access Memory. Così avrei fatto meglio anticipare questo problema, anche anche se potrebbe essere un raro caso angolo, per così dire. Non accade spesso, potrebbe accadere. E se succede e non mi anticipare e programma per esso, il mio programma potrebbe fare chissà che cosa. Congelare, appendere, riavvio, qualunque sia. Qualcosa anticipato potrebbe accadere. Così che cosa ho intenzione di fare ora, d'ora in poi veramente, è prima che io mai alla cieca utilizzare una variabile come s che è stato assegnato il valore di ritorno di qualche altra funzione come getString, Io vado a fare in modo che il suo valore è valido. Quindi so solo dopo aver letto Documentazione di CS50 per getString, che alla fine ti segnaliamo voi a, che getString restituisce un simbolo speciale chiamato NULL, N-U-L-L in ciascuno tappi, se qualcosa va storto. Così normale, restituisce una stringa. Ma per il resto se restituisce N-U-L-L-- avremo finalmente a vedere che cosa realmente means-- che i soli mezzi successo qualcosa di brutto. Ora, questo significa, molto simile a Scratch, Posso controllare una condizione qui in C, se s non è uguale NULL. Quindi, se non avete visto questo prima, questo significa solo che non è uguale. Quindi è l'opposto di uguali uguali, che, ricordiamo, è diverso da sola è uguale, che è l'assegnazione. Quindi, se s non è uguale NULL, solo allora fare Voglio eseguire queste righe di codice. Quindi, in altre parole, prima mi tuffo in ciecamente e iniziare l'iterazione oltre s, e trattandolo come se fosse una sequenza di personaggi, ho intenzione di controllare in primo luogo, aspetta un attimo, è s sicuramente non pari a questo valore speciale, NULL? Perché se lo è, le cose brutte possono accadere. E per ora, supporre che le cose cattive accade significa che il programma va in crash, e non si può necessariamente recuperare. Quindi, francamente, sembra più brutto. è una specie di confusione ora di uno sguardo. Ma questo diventerà più familiare in breve tempo. Ma ho intenzione di proporre ora un altro miglioramento. Questo è un miglioramento alla correttezza. Il mio programma è ora più corretto, perché nel raro caso in cui non basta la memoria esiste, io gestirlo, e mi limiterò a fare nulla. Io almeno non andrà in crash. Ma facciamo una versione finale qui. E un file chiamato string2.c. Io vado a incollare che stesso codice solo per un attimo, e ho intenzione di mettere in evidenza questo linea, 11, qui, solo per un momento. Ora la realtà è che i compilatori intelligenti come Clang potrebbe risolvere questo problema per noi dietro le quinte senza che noi mai sapere. Ma pensiamo a questo fondamentalmente come un disegno problematico. Questa linea di codice è, naturalmente, dicendo: inizializzare una variabile i per 0. Questo è abbastanza semplice. E ciò che di nuovo è questo dichiarazione, qui, i ++, facendo? Abbiamo visto prima, ma abbiamo in realtà non parlarne. PUBBLICO: Incrementare i. DAVID J. MALAN: Incrementare i. Quindi su ogni iterazione attraverso questo ciclo, ogni ciclo, si sta incrementando i per uno. Così diventa più grande, e più grande, e più grande fino a quando il ciclo termina. Come si termina? Beh, c'è questo mezzo condizione che abbiamo usato prima. Hai visto e in procedure dettagliate nel set P. Ma che cosa è questo detto? Eseguire il seguente ciclo in modo fino a quando i è inferiore a quello che? PUBBLICO: La lunghezza della stringa. DAVID J. MALAN: L' lunghezza della stringa. Così si traduce abbastanza pulito a inglese in questo senso. Ora il problema è che ogni volta che scorrere questo ciclo in teoria, Sto chiedendo a questa domanda. Sono io inferiore alla lunghezza della stringa di s? Sono io inferiore alla lunghezza della stringa di s? Ora è che cambiando ad ogni iterazione? È. A causa della ++. Così ogni iterazione i è sempre più grande. Ma è s sempre più grande, o più piccolo, o cambiare del tutto? No. Quindi, in termini di progettazione, uno degli assi lungo il quale si cerca di valutare il codice nella classe, questo si sente un po 'stupido. Come si è letteralmente, su ogni iterazione di questo ciclo chiedere il stessa domanda di nuovo maledetto, e ancora, e ancora, e letteralmente non è mai sta per cambiare. Almeno se io non sto toccando s e cercando di modificare il contenuto di s. Così posso fare un po 'meglio di questo. E che cosa ho intenzione di fare non è dichiarare solo i variabile, ma una seconda variabile io arbitrariamente, ma convenzionalmente, chiamarlo n. Assegnare n pari alla lunghezza della stringa di s. E poi qui, ho intenzione di fare un po 'di ottimizzazione intelligente, così parlare, che alla fine della giornata non più corrette o non meno corretto è rispetto a prima. Ma si tratta di un design migliore. Nel fatto che sto usando meno tempo, meno cicli di CPU, in modo di parlare, di rispondere allo stesso domanda, ma solo una volta. Hai domande su quella generale principio di miglioramento, dire, l'efficienza di un programma? Sì? PUBBLICO: Perché voi utilizzare il [incomprensibile]? DAVID J. MALAN: Bella domanda. Quindi perché abbiamo messo la ++ sulla fine di I anziché all'inizio del i? In questo caso, si ha alcun impatto funzionale. E in generale, tendo a utilizzare l'operatore postfix in modo che sia un po 'più chiaro a quando l'operazione sta accadendo. Per chi non conosce, c'è un altro dichiarazioni con le quali si potrebbe fare ++ i. Questi sono funzionalmente equivalente in questo caso perché non c'è niente altro intorno a quel Incremento. Ma si può venire su con casi e linee di codice in cui questo fa la differenza. Quindi in generale, noi non facciamo anche parlare di questo. Perché, francamente, rende il codice più sexy, e una sorta di impermeabile, e un minor numero di caratteri. Ma la realtà è che è molto più difficile, Credo che, anche per me per avvolgere la mia mente intorno ad esso a volte, l'ordine delle operazioni. Così come a parte, se si davvero non mi piace questo, anche se questo è una specie di sexy guarda, si può anche fare i + = 1, che è la versione più brutta della stessa idea per postfix Incremento. Lo dico e vi dovrebbe rendere il divertimento di esso, ma si arriva a vedere il codice come qualcosa di bello in poco tempo. [Risate] DAVID J. MALAN: Giusto? Già. Domanda nel mezzo. PUBBLICO: Avete bisogno di dire int n? DAVID J. MALAN: Tu fai non c'è bisogno di dire int n. Quindi perché abbiamo già detto int, non c'è bisogno di dirlo di nuovo. Il problema è che n deve lo stesso tipo di dati come i. Ecco, questo è solo una comodità qui. Già. PUBBLICO: Si può andare oltre il Staffa di carattere di stampa s i di nuovo? DAVID J. MALAN: Assolutamente. Così% c, ricordare da ultimo tempo, è solo un segnaposto. Significa mettere un char qui. barra retroversa n, ovviamente, solo significa mettere una interruzione di linea qui. In modo che lascia solo, ora, questo pezzo di nuova sintassi. E questo è letteralmente dicendo, afferrare la stringa chiamato s e andare a prendere la sua -esimo carattere, per così dire. E io continuo a dire personaggio-esimo perché ad ogni iterazione di questo ciclo è come se noi stampiamo out, prima staffa s 0, come programmatore potrebbe dire. Poi s staffa 1, quindi s staffa 2, poi 3, poi 4. Ma naturalmente si tratta di una variabile, così ho appena esprimo con i. Chiave, però, è quello di realizzare, soprattutto se non hai stato acclimating a questo mondo di programmazione, dove tutti sembrano contare da zero, devo iniziare il conteggio da zero ora. Poiché le stringhe, primo carattere, il z in Zamyla è nel bene e nel male andando a vivere nella posizione numero zero. Va bene, così mi permetta di portare ci torna qui per Zamyla e vedere cosa sta realmente accadendo sul sotto la cappa. Quindi c'è questa nozione di tipo colata. Si potrebbe avere effettivamente giocato con questo già, forse per l'hacker edizione di P impostato uno. Ma il tipo di colata si riferisce solo al capacità in C e alcune altre lingue convertire un tipo di dati all'altro. Ora, come potremmo vedere questo abbastanza semplicemente? Quindi questo, richiamo, è l'inizio dell'alfabeto inglese. E il contesto, ricordare, da come una settimana fa è ASCII. Il codice standard americano per Information Interchange. Che è solo un veramente lungo cammino di dire una mappatura da lettere di numeri, e dai numeri alle lettere. Quindi da A a M qui, dot dot dot, linee con, richiamo, il numero decimale 65 in su. E non abbiamo parlato su questo in modo esplicito, ma sicuramente c'è simile numeri per le lettere minuscole. E in effetti, ci sono. Il mondo ha deciso alcuni anni fa, che un po ', a minuscola, sta per essere 97. E poco b sta al 98, e così via. E per qualsiasi altro tasto la tastiera, non c'è sarà un modello simile di bit. O equivalentemente, un numero decimale. Quindi la questione a portata di mano, allora, è come possiamo effettivamente vedere questo sotto il cofano? Quindi ho intenzione di andare oltre a gedit nuovo. E piuttosto che di tipo questo uno da zero, Ho intenzione di andare avanti e basta aprire qualcosa dal codice di oggi chiamato ASCII zero. E ASCII pari a zero assomiglia a questo. Quindi cerchiamo di avvolgere le nostre menti intorno a questo. Quindi, prima, ho commentato il codice, che è bello. Perché è letteralmente dirmi cosa aspettarsi, visualizzare una mappatura per le lettere maiuscole. Ora io non so bene che cosa dire con questo, quindi cerchiamo di dedurre. In inglese, forse un po 'techie inglese, Che cosa significa la linea 18 appaiono di fare per noi? Basta linea 18. Che cosa sta inducendo? Che sta andando a dare il via qui? PUBBLICO: Un loop. DAVID J. MALAN: Un loop. E quante volte è che andare a iterare? PUBBLICO: [interponendo VOICES] sei volte. DAVID J. MALAN: Non sei volte. PUBBLICO: 26 volte. DAVID J. MALAN: 26 volte. Sì, mi dispiace. 26 volte. Perché? Beh, è ​​un po 'strano, ma Ho iniziato a contare da 65. Che è strano, ma non è sbagliato. Non è male per dire. E sto facendo che solo perché, per questo esempio, Sto tipo di anticipare che il capitale A era di 65. Ora, questo non è il più elegante modo per fare questo, per tipo di codice duro valori esoterici che nessuno è mai aspettato da ricordare. Ma per ora, accorgo che sono facendo questo attraverso 65 più 26. Perché a quanto pare io non voglio nemmeno per fare aritmetica nella mia testa. Quindi io lascerò il compilatore farlo. Ma poi in ogni ciclo, ogni iterazione del ciclo, sto incrementando i. Così ora questo sembra un po 'criptico. Ma dovremmo avere l'edificio di base blocchi con cui capire questo. % C è solo un segnaposto per un carattere. % I è un segnaposto per un int. E si scopre che utilizzando questo nuova sintassi, questa parentesi, così parlare, quindi un tipo di dati all'interno di una parentesi, Posso forzare il compilatore a trattare i non è un numero intero, ma come un char. In tal modo mi mostra il carattere equivalente di quel numero. Ora qui, questo codice è praticamente identico. Volevo solo fare Super esplicito il fatto che sto iniziando a 97, che è minuscolo a. Su attraverso 26 più lettere. E sto doing-- di nuovo, colata ho, per così dire. O tipo colata ho, per così dire. Da un int a char. Così, il risultato finale sarà, francamente, informazioni che già conosciamo. Io vado a fare ascii-0 non dot-- dot c. Avviso, probabilmente fatto che errore come ho appena fatto accidentale. Fai ascii-0. Ora ho intenzione di fare ./ascii-0. Io lo zoom in, e purtroppo sta andando a scorrere fuori dallo schermo. Ma vediamo un intero grafico in cui una mappa a 97, le mappe b a 98, e se noi scorriamo ulteriormente A, naturalmente, mappe di 65. Quindi questo è solo per dire che quello che abbiamo predicato, c'è questa equivalenza, è infatti il ​​caso nella realtà. Quindi una rapida modifica di questo. Lasciatemi apro ascii-1.c. E notare questo intelligente, tipo di, chiarificazione di questo. Questo è ascii-1.c, e notare questa cosa pazzesca. E questo diventa veramente al cuore di ciò che i computer stanno facendo. Anche se noi umani sarebbe Non contare in termini di letters-- Non mi metto a pensare, tutto bene poi un b, e usare quelli per contare oggetti fisici. Si può certamente dire che voglio inizializzare qualche variabile chiamata C-- ma ho potuto chiamare questo anything-- così c è inizializzato al capitale A. Perché alla fine della giornata, il computer non importa quello che stai memorizzazione, si preoccupa solo di come si desidera per presentare tali informazioni. Come si desidera che il computer interpretare quel modello di bit? Quindi questo non è qualcosa che sarebbe generalmente consiglio facendo. E 'davvero solo un esempio per comunicare che si può assolutamente inizializzare un intero in un char. Poiché sotto l' cofano di un char, naturalmente, è solo un numero da 0 a 255. Così si può certamente metterlo all'interno di un int. E che anche questo dimostra è che noi può convertire da una tipo ad un altro, qui, in ultima analisi, la stampa la stessa cosa. E in effetti, questo mi risolverà online-- aveva lo scopo di dire questo, di nuovo, qui. Lasciatemi Ripuliamolo on-line, e faremo vedere in un walkthrough on-line, se necessario, ciò che si intendeva lì. Ok. Così ora ultimo esempio che coinvolge A e B e poi ci prendere le cose su una tacca. Quindi, con A e B e c di a capitalizzazione e l'equivalenza della stessa, cerchiamo di dare un'occhiata a questo esempio, qui. Un altro esempio di codice. Ci apriamo uno che è già fatto, così abbiamo non c'è bisogno di digitare tutti fuori da zero. E notare in anticipo stiamo usando testata multipla file, tra i quali è il nostro nuovo amico, string.h. Ora questo sembra, in un primo momento sguardo, un po 'criptico. Ma vediamo se non possiamo ragionare attraverso quello che sta succedendo qui. Prima ottengo una stringa da parte dell'utente, e ho messo quella stringa in una variabile chiamato s. Copia incolla da prima. In linea 22, sono apparentemente facendo esattamente quello che Ho fatto un momento fa, sto iterando sopra i caratteri in s. E i nuovi trucchi qui stanno usando lunghezza della stringa, l'ottimizzazione minore di memorizzare la lunghezza della stringa n, piuttosto che chiamare strlen di nuovo, e ancora, e ancora. E proprio controllando che i è minore di n. Ora qui, le cose si fanno un po 'interessante. Ma è solo una domanda di questa stessa nuova idea. Ciò che in inglese fa Staffa s Io rappresento? PUBBLICO: Conteggio ogni carattere [incomprensibile]. DAVID J. MALAN: Conteggio ogni personaggio. E ancora più succintamente, Staffa s rappresento cosa? Diresti. Non per metterti in loco qui. PUBBLICO: Well-- DAVID J. MALAN: Quindi, se la parola è-- se la stringa è Zamyla, che starts-- PUBBLICO: --potete trattare con i personaggi separately-- DAVID J. MALAN: Good. Esattamente. La notazione parentesi quadra consente per accedere a ogni personaggio singolarmente, così s staffa 0 sta per essere il primo carattere della stringa. staffa s 1 sta per essere il secondo, e così via. Quindi la domanda che mi sto chiedendo, qui, in questa condizione è ciò? Il personaggio-esimo di s maggiore o uguale a minuscoli un? E che cosa significa questo, qui, con i doppi e commerciali? PUBBLICO (INSIEME): And. DAVID J. MALAN: And. E 'solo equivalente a questa. E non è una parola chiave in C, si deve uso, fastidiosamente, commerciale e commerciale. E questo, al contrario, sta chiedendo è s-esimo di carattere inferiori o uguali in minuscolo z? E ancora, ecco dove comprensione sottostante attuazione di un computer di senso. Si noti che, anche se ho il dot dot dot laggiù, assomiglia a alla z in minuscolo sono tutti i valori contigui fino da 97 in su. E stessa cosa per le maiuscole a partire dalle 65. Così il takeaway, poi, è che in inglese, come descriveresti quale linea 24 sta facendo? Sì? PUBBLICO: Il 24 è il controllo per vedere se ogni personaggio è un minuscolo. DAVID J. MALAN: E 'verificare se ogni carattere è una lettera minuscola. Così, anche più succintamente, è il -esimo carattere di s minuscola? Questo è tutto quello che siamo esprimendo qui logicamente, un po 'criptico, ma in ultima analisi, piuttosto semplicemente. E 's di-esimo carattere minuscolo? Se è così, e qui è dove le cose ottenere un po 'la mente di flessione solo per un momento, in caso affermativo, andare avanti e stampare un carattere. Quindi questo è solo un segnaposto, ma quale personaggio? Perché sto facendo s staffa i meno questa espressione qui? Beh notare il modello qui. I numeri reali non contano tanto. Ma si noti che il 97 è quanto lontano da 65? PUBBLICO: 32. DAVID J. MALAN: 32. Quanto lontano è 98 da 66? PUBBLICO: 32. DAVID J. MALAN: Piccolo c da grande C? 32. Quindi c'è 32 luppolo da una lettera ad un altro. Quindi francamente, potevo semplificare questo a quello. Ma poi mi sono un po 'difficile codifica questo basso livello di comprensione che nessun lettore è mai andando a capire. Quindi ho intenzione di generalizzare come, mi conoscere le lettere minuscole sono più grandi. So che le lettere maiuscole sono valori più piccoli, ironicamente. Ma questo è effettivamente equivalente dicendo sottrarre 32 da s staffa i. Così, nel contesto di queste lettere, se la lettera sembra essere una, minuscolo una, e sottraggo 32, che effetto ha a che, matematicamente, in un minuscolo? PUBBLICO: Capitalizes-- DAVID J. MALAN: maiuscolo esso. E in effetti, questo è il motivo per cui il nostro programma si chiama capitalizzare zero. Questo programma sia capitalizza una lettera, dopo aver verificato se è infatti una lettera minuscola. In caso contrario, in linea 30, che cosa devo fare se non è una lettera minuscola che sono guardando in un particolare iterazione del ciclo. Basta stamparlo. Quindi non cambia roba che non è nemmeno in minuscolo. Limitare a voi stessi di poco, grazie ad un po 'di z. Ora questo è abbastanza arcano. Ma alla fine della giornata, questo è il modo in cui, un tempo, dovuto implementare le cose. Se io invece aprire capitalizzare uno, oh grazie a dio. C'è una funzione chiamato a superiore che possono fare tutto ciò che abbiamo appena fatto ad un livello abbastanza basso. Ora per tomaia è interessante perché si è dichiarata in un file, e si sa solo questo controllando la documentazione, o viene detto, per esempio, in classe, dove esiste, in un file chiamato ctype.h. Quindi questo è un altro nuovo nostro amico. E fa esattamente superiore ciò che suggerisce il suo nome. È possibile passare in, come argomento, tra queste parentesi, qualche personaggio. Ho intenzione di passare nel carattere i-esimo di s utilizzando la nostra nuova notazione di fantasia coinvolgendo parentesi quadre. E prendere una supposizione, che cosa è il ritorno valore superiore a quanto pare andare di essere? Una lettera maiuscola. Una lettera maiuscola. Quindi, se mi passa in minuscolo una, si spera, da definizione di superiore, sta andando a restituire un maiuscolo A. In caso contrario, se non è una lettera minuscola in primo luogo, ho appena stamparlo. E infatti, notare il secondo amico qui. Non solo per superiore esiste, ma è inferiore, risponde in realtà a questa domanda per me. Ora, chi ha scritto queste cose, 10s di anni fa, sai una cosa? Implementato per superiore ed è abbassare utilizzando il codice come questo. Ma ancora una volta, in linea con questa idea di astrazione di distanza, sorta di, livello inferiore dettagli di implementazione. E in piedi sulle spalle di persone che è venuto prima di noi, utilizzando le funzioni come a superiore e inferiore è, che abbastanza meravigliosamente sono ben chiamato per dire quello che fanno, è un meraviglioso paradigma di adottare. Ora, si scopre che se leggo la pagina man di, diciamo, di superiore, Imparo qualcosa di diverso. Così l'uomo ToUpper. E 'un po' opprimente. Ma notate, ecco che menzione di il file di intestazione che dovrei usare. Per inciso, perché questo è fuorviante, la funzione usa int invece di caratteri per motivi di controllo degli errori. Ma noi forse arriviamo torna che in futuro. Ma si noti, qui, ai convertiti superiori la lettera c in maiuscolo, se possibile. Ecco, questo è abbastanza semplice. E ora cerchiamo di essere un po 'più specifico. Diamo un'occhiata alla parte del Pagina uomo sotto il valore di ritorno. Il valore restituito è che della lettera convertito. Oppure C, se la conversione non era possibile, dove c è l'ingresso originale. Che so da qui, da l'argomento di superiore. Allora, qual è il takeaway di questo? Il valore restituito è che della lettera convertito, o c, la lettera originale, se la conversione non era possibile. Quello che il miglioramento può pertanto fare il disegno del mio codice? Sì? PUBBLICO: È possibile rimuovere l'altro. DAVID J. MALAN: posso rimuovere l'istruzione else, e non solo l'istruzione else. PUBBLICO: È possibile rimuovere [incomprensibile]. DAVID J. MALAN: posso rimuovere l'intera forcella in mezzo alla strada, se il resto del tutto. Così in effetti, mi permetta di aprire la versione finale di questo, capitalizzare-2 e notare quanto, se si, sexy, il codice ora sta ottenendo, in che ho ridotto da alcuni sette o giù di linee a solo quattro, la funzionalità che intendevo semplicemente chiamando al superiore, passando s staffa i, e la stampa fuori, con il segnaposto% c, quel particolare personaggio. Ora forse, c'è un bug, o almeno il rischio di un bug, in questo programma. Quindi, solo per tornare per un asporto precedente, che cosa devo fare, probabilmente, anche in questo programma per renderlo più robusto, in modo che non c'è modo si può bloccarsi, anche nei rari casi? PUBBLICO: Assicurarsi che non è NULL. DAVID J. MALAN: Assicurarsi che non è NULL. Quindi, veramente, per fare questo super corretta, dovrei fare qualcosa di simile, se s non è NULL, allora andare avanti ed eseguire queste righe di codice, che Posso allora trattino così, e poi mettere nel mio vicino parentesi graffa. Così buono legatura insieme dei due idee. Sì? PUBBLICO: Potresti utilizzare fare un ciclo while, invece? DAVID J. MALAN: Could Faccio un ciclo Do While? PUBBLICO: --potete vuole fare in modo che in realtà [incomprensibile]. DAVID J. MALAN: Could si utilizza un do po? Risposta breve, no. Perché si sta per introdurre un altro caso d'angolo. Se la stringa è di lunghezza zero. Se, per esempio, ho appena colpito Inserire, senza mai digitare Zamyla. Io vado a portata di mano indietro un effettivo stringa, come vedremo alla fine vediamo, che ha zero caratteri. E 'ancora una stringa, è solo super-breve. Ma se si utilizza un do po, si sta andando a cieca provare a fare qualcosa con rispetto a quella stringa, e nulla sarà lì. PUBBLICO: Bene, se avete fatto fare [incomprensibile] mentre s-- DAVID J. MALAN: Oh, vedo, continuo ottenendo una stringa dall'utente. Così breve risposta, si potrebbe, e mantenere pestering li per offrirti una stringa che è sufficientemente breve da stare in memoria. Assolutamente. Ho scelto di non. Se non mi danno la stringa che voglio, sto smettere, sto rinunciando. Ma assolutamente, a tal fine, si potrebbe assolutamente fare. Così file di intestazione della biblioteca che ora siamo a conoscenza sono questi, qui. I / O standard, CS50.h, string.h, ctype.h, e ci sono, infatti, gli altri. Alcuni di voi hanno scoperto la libreria matematica in math.h. Ma lasciate che vi presento, ora, a questa risorsa che il personale CS50, Davin, e Rob, e Gabe particolare hanno messo insieme. Che presto collegherà su sito web del corso. Si chiama riferimento CS50. Che solo per darvi una rapida gusto di esso, funziona come segue. Lasciami andare a reference.cs50.net. Vedrete sulla mano sinistra lato un elenco schiacciante di funzioni che vengono con c. Ma se mi preoccupo, per il momento, su qualcosa come strlen, Posso scrivere lì. Filtra l'elenco a proprio quello che mi interessa. Ho intenzione di fare clic su di esso. E ora a sinistra, vedrai quello che ci auguriamo è un più semplice, umano spiegazione amichevole di come questa funzione. Restituisce la lunghezza di una stringa. Ecco una sinossi, ecco come si utilizzare in termini di file di intestazione, e in termini di ciò che la funzione sembra che in termini di argomenti. E poi qui, i rendimenti la lunghezza di una stringa. Ma per quelli di voi più comodo, si può effettivamente fare clic su più comodi, e il contenuto di questa pagina, ora, cambierà essere i valori di default di ciò che si ottiene utilizzando la pagina man. In altre parole, CS50 riferimento è una semplificazione delle pagine man da parte del personale, per gli studenti. In particolare, quelli meno confortevole e in mezzo, in modo che si non c'è bisogno di cercare di avvolgere la tua mente intorno, francamente, una sintassi abbastanza criptica e la documentazione qualche volta. Quindi, tenere a mente nei giorni a venire. Così qui, ancora una volta, è un Zamyla. Facciamo fare una domanda che è un po 'più umano accessibili. Grazie a Chang, che è stato stampa più elefanti senza sosta per giorni scorsi. Abbiamo l'opportunità di dare almeno uno di loro via. Se siamo riusciti a ottenere un solo volontario di venire su un massimo di disegnare sullo schermo. Che ne dici di questo? Andiamo su. Come ti chiami? ALEX: Alex. DAVID J. MALAN: Alex. Bene. Alex, vieni su. Stiamo per vedere il tuo scrittura a mano sullo schermo qui. Va bene, piacere di conoscerti. ALEX: Nice si incontrano voi. DAVID J. MALAN: Va bene. Così, super semplice esercizio. Bar non è elevato a ottenere un elefante di oggi. Stai giocando il ruolo di getString. E ho intenzione di dire solo te la stringa che hai ottenuto. E supponiamo che tu, getString, sono stati chiamati. E l'umano, come me, ha digitato Zamyla, Z-A-M-Y-L-A. Basta andare avanti e scrivere Zamyla sul schermo come se si è ottenuto che e memorizzati da qualche parte nella memoria. Lasciando spazio per quello che sarà numerosi altri words-- che è OK, andare avanti. [Risate] Così Zamyla, eccellente. Così ora supponiamo che tu, getString, sono chiamati di nuovo. E dunque, vi fornisco, in tastiera, con un altro nome, Belinda. Bene. E ora la prossima volta getString è chiamato, digito qualcosa come Gabe, G-A-B-E. Si sta davvero prendendo a cuore la memoria ad accesso casuale. Qual è il disegno tutto completamente casuale. Ok. [Risate] ALEX: Scusate la mia scrittura è male. DAVID J. MALAN: No, va bene. E per quanto riguarda Rob, R-O-B. Ok. Buona. Quindi non ho anticipare che ci si tipo di lay cose in questo modo. Ma siamo in grado di fare questo lavoro. Così come hai fatto a posa questi caratteri in memoria? In altre parole, se pensiamo questa schermata nera rettangolare a rappresentare una RAM, o la memoria del computer. E ricordare che la RAM è solo un sacco di byte, e byte sono un sacco di bit. E bit sono in qualche modo attuato, generalmente con una qualche forma di elettricità in hardware. Ecco, questo è una sorta di stratificazione abbiamo parlato e ora può dare per scontato. Come avete fatto su decidere dove scrivere Rob contro Gabe contro Belinda contro Zamyla? ALEX: Ho appena fatto nel ordina che mi hai detto. DAVID J. MALAN: E questo è vero. Ma cosa governato dove si mettono Il nome di Belinda e il nome di Gabe? ALEX: Niente? DAVID J. MALAN: [ride] Così che funziona, va bene. Così i computer sono poco più ordinato di quello. E così quando siamo implement-- stare lì solo per un moment-- quando abbiamo effettivamente implementare qualcosa di simile getString in un computer, Zamyla potrebbe essere disposta praticamente come hai fatto sullo schermo, lì. E ciò che è fondamentale notare qui, quello che Alex ha fatto, è c'è una specie di demarcazione tra ognuna di queste parole, giusto? Non hai scritto Z-A-M-Y-L-A-B-E-L-I-N-D-A-G-A-B-- in altre parole, c'è una specie di demarcazione che sembra essere, sorta di, spaziatura casuale tra queste diverse parole. Ma questo è un bene, perché noi umani può ora visualizzare che questi sono quattro diverse stringhe. Non è solo una sequenza di un sacco di personaggi. Quindi un computer, poi, nel frattempo, potrebbe prendere una stringa come Zamyla, mettere ciascuna di queste lettere all'interno di un byte di memoria. Ma questo numero è molto più grande, naturalmente, di sei caratteri. C'è un sacco di RAM. E così d'ora in poi, questo griglia di scatole sta andando per rappresentare quello che Alex appena ha fatto qui sullo schermo. E ora, Alex, siamo in grado di offrire una blu o un elefante arancione da Chang. ALEX: Io prendo un elefante blu. DAVID J. MALAN: Un elefante blu. Quindi un grande applauso, se potessimo, per Alex qui. [Applausi] ALEX: Grazie. DAVID J. MALAN: Grazie. Quindi l'asporto è che, anche se l' modello tipo di cambiato nel corso del tempo, qui sul bordo, c'era questo demarcazione tra le varie stringhe che Alex ha per noi. Ora i computer, francamente, potrebbe fare la stessa cosa. Potrebbero tipo di plop stringhe ovunque nella RAM. Fino qui, qui, qui, qui. Potevano fare esattamente questo. Ma, naturalmente, questo è probabilmente non la migliore pianificazione. Giusto? Se ho continuato a chiedere a Alex ottenere i nomi, probabilmente aveva mettere un po 'più giù qui, forse fino qui, qui, qui, alla fine qui. Ma con un po 'più di pianificazione, di certo, potremmo porre le cose in modo più pulito. E in effetti, questo è ciò che un computer fa. Ma il problema è che se la stringa successiva ottengo dopo Zamyla è qualcosa come il Belinda, proporre dove potremmo scrivere il lettera b rispetto a questa griglia? Dove vorresti andare? Alla destra del una, sotto la z, sotto l'una? Quale sarebbe il vostro primo istinto è? PUBBLICO: Sotto la z. DAVID J. MALAN: Così sotto la z. E questo è abbastanza semplice, giusto? E 'una specie di pulito, è quello che facciamo su una tastiera quando colpiamo Enter, o una e-mail quando si effettua un elenco puntato delle cose. Ma la realtà è che i computer cercare di essere più efficienti, e stipare certamente tanto i dati in RAM possibile, in modo da non sprecare alcun byte. In modo che tu non sprecare qualsiasi bene immobile dello schermo. E il problema, però, è che se abbiamo letteralmente messo la lettera b dopo una, come faremo a sapere dove il nome di Zamyla finisce e il nome di Belinda inizia? Così gli esseri umani appena proposto, bene, premere il tasto Invio, in sostanza. Metti giù di sotto. O anche, come ha fatto Alex, basta iniziare a scrivere il nome successivo di sotto del precedente, e sotto quello, e poi sotto quella. Questo è un segnale visivo. I computer hanno un altro stimolo visivo, ma è un po 'più succinta. E 'questo carattere funky. Barra rovesciata 0, che è forse ricorda backslash n, e così via, adesso. Le sequenze di escape speciali. Barra rovesciata 0 è il modo di che rappresenta otto a zero i bit in una riga. 0000 0000. Il modo di esprimere che non è colpire il numero zero sulla tastiera, perché in realtà che è un carattere ASCII. Sembra un numero, ma è in realtà un numero decimale che rappresenta la circolare glifo, il carattere circolare. Nel frattempo, backslash zero significa, letteralmente mettere otto a zero byte qui per me. Quindi questo è un po 'arbitraria. Potremmo abbiamo usato alcun modello di bit, ma il mondo deciso alcuni anni fa che rappresentare la fine di una stringa in memoria, basta mettere un sacco di zeri. Perché possiamo rilevare che. Ora che significa che nessuna lettera del alfabeto può essere rappresentato con zeri. Ma va bene, abbiamo già visto che stiamo usando 65 su un massimo di 97 su un massimo. Non abbiamo avuto nessuna parte vicino a tutti zeri. Così Belinda nella memoria di un computer è in realtà sta per andare qui. Ho disegnato in giallo solo per attirare la nostra attenzione. E notate, anche, questo è del tutto arbitraria. Ho disegnato come una griglia. Come, la RAM è solo un oggetto fisico. Esso non deve necessariamente righe e colonne, per sé. Ha appena ricevuto un sacco di byte implementato in hardware in qualche modo. Ma se dopo Belinda I digitato il nome di Gabe, ha intenzione di finire qui in memoria, e se ho digitato in nome di Daven, per esempio, ha intenzione di finire qui. E posso continuare a scrivere anche più nomi. Purtroppo, se cerco di scrivi un super nome lungo, Potrei finalmente esaurito la memoria. In questo caso, è getString andando a restituire NULL, come abbiamo detto. Ma per fortuna, almeno in questo visiva qui, non siamo riusciti a tanto. Ora, ciò che è bello è che questo idea generale di trattare le cose come essere in scatole è rappresentativo di una caratteristica di C e un sacco di lingue, conosciuto come un array. Una matrice è un altro tipo di dati. Si tratta di una struttura di dati, se si vuole. Struttura nel senso di veramente, tipo, guardando come una scatola, almeno con l'occhio della mente. Una matrice è un contiguo sequenza dei tipi di dati identici, back to back to back to back. Quindi una stringa, in altre parole, è un array di caratteri. Un array di caratteri. Ma si scopre che si può avere array di mazzi di cose. In realtà, possiamo mettere anche numeri in un array. Così la forma in cui stiamo per cominciare dichiarando questi dati struttura nota come matrice sta anche andando a utilizzare le parentesi quadre. Ma queste parentesi quadre stanno per hanno un significato diverso in questo contesto. E vediamo come segue. Supponiamo che ho aperto un nuovo file qui. E io Salva come ages.c. E io salverò questo nella mia cartella qui. E ora ho intenzione di andare avanti e iniziare a digitare qualcosa come includere CS50.h, includere stdio.h, int void main. E poi dentro di qui, voglio di avere prima un int chiamato età. E ho intenzione di usarla per ottenere un int da parte dell'utente per la sua età. Ma questo programma è pensato per essere utilizzato da più persone, per qualsiasi contesto. Ho una linea di persone. Tutti loro hanno di digitare nella loro età per magari un po ', non so, la concorrenza, o evento che sono arrivati ​​per. Così la prossima persona, mi bisogno di un'altra variabile. Perché se faccio e basta età ottiene getInt, che è andare a clobber, o sovrascrivere l'età della persona precedente. Così non va bene. Quindi il mio primo istinto potrebbe essere, oh, va bene, se voglio ottenere più persone di ages-- chiamiamolo questo age1, int age2 ottiene int, int Age3 ottiene getInt. E ora ho intenzione di usare codice pseudocodice qui. Fare qualcosa con quei numeri. Lasceremo per un altro giorno quello che stiamo facendo lì, perché abbiamo solo la cura per il momento su age1, age2, Age3. Purtroppo, una volta che compilare questo programma e metterlo davanti a utenti effettivi, qual è il fondamentalmente cattiva progettazione decisione mi sembra di aver fatto? Sì? PUBBLICO: [incomprensibile] DAVID J. MALAN: Sì, Non ho nemmeno provato di capire come molte età posso realmente importa? Se ho meno di tre persone qui, e quindi meno di tre secoli, Sto ancora aspettando ciecamente tre. Dio non voglia quattro persone appaiono. Il mio programma semplicemente non sarà nemmeno li supporta. E così questo, lunga storia Insomma, non è una buona abitudine. Giusto? Mi è stato essenzialmente la copia e incollando il codice e solo tweaking i nomi delle variabili. E, mio ​​Dio, se tu avessi, non tre età, ma 10, o 100, o anche 6.500 studenti, per esempio. Questo non sta per essere particolarmente codice elegante, o sostenibile. Stai andando ad avere per riscrivere il programma ogni volta il tuo numero di persone modifiche. Quindi, per fortuna, nel nostro attuale file di ages.c per oggi, noi abbiamo una soluzione più intelligente. In primo luogo, ho intenzione di prendere in prestito il Costruiamo abbiamo usato un paio di volte, questa do while, al fine di ottenere il numero di persone nella stanza. Sto solo andando a tormentare l'utente, di nuovo e ancora, fino a che non mi dà un valore di n che è un numero intero positivo. Avrei potuto usare, ultimo tempo di get int positivo. Ma noi non abbiamo che per davvero, così sono andato avanti e ri implementato questa idea. Ora qui, questo è il nuovo trucco. In linea 27, come i commenti in linea 26 suggerisce, dichiarare un array in cui per memorizzare l'età di tutti. Quindi, se si vuole ottenere, non un int, non due interi, ma un sacco di int. In particolare n interi, erano n potrebbe essere tre, potrebbe essere 100, potrebbe essere 1.000. La sintassi, molto semplicemente, è quello di per esempio, che tipo di dati vuoi? Che cosa si desidera chiamare che pezzo di memoria? Che cosa si desidera chiamare la griglia che assomiglia a questo pittoricamente? E tra parentesi qui, tu dici quanto grande volete che la matrice sia. E così prima, quando ho detto il sintassi è un po 'diverso qui, stiamo ancora usando le parentesi quadre, ma quando sto dichiarando un array, il numero interno del parentesi quadre mezzi quanto grande volete la matrice sia. Al contrario, quando usavamo s staffa ho un momento fa, s, una stringa, è infatti un array di caratteri, ma quando non stai dichiarazione di una variabile, come con questa parola chiave qui, si sta semplicemente ricevendo un indice specifico, una determinata elemento di tale matrice. Una volta che sappiamo che, il resto di questo è semplice. Se nuovo Sto andando prima di stampare qual è l'età della persona numero i. Dove posso solo dire il numero uno persona, persona numero due, numero tre persone. E sto solo facendo aritmetica, in modo che le persone normali come, contiamo da uno per questo programma, e non da zero. Poi chiamo getint, ma devo conservare la risposta in epoche staffa I. Quale è l'età-esimo nella matrice. Così, mentre l'ultima volta eravamo trattando queste scatole come caratteri per il nome del Zamyla, e altri. Ora, queste scatole rappresentano 32 bit, o quattro byte in cui possiamo memorizzare un int, int, int. Tutto ciò, ancora una volta, sono lo stesso tipo di dati. Ora faccio qualcosa di stupido, come passa il tempo, basta per giustificare la scrittura di questo programma. E poi qui, ho di nuovo iterate sopra la matrice dire un anno da oggi, persona numero uno volontà essere qualcosa anni. E per capire che math-- Voglio dire, questo non è molto complicato arithmetic-- Ho solo aggiungere uno alla loro età. Giusto per dimostrare, ancora una volta, questo. Proprio come posso indice in una stringa, s, così posso indice in un array di età, come quella lì. Allora, dove sta questo sarà prendere noi? Quindi vedremo, in ultima analisi, un poche cose nei giorni a venire. Uno, tutto questo tempo, in cui scrivere i propri programmi, come Mario, avidi, di credito. Sei stato a digitare il nome di il programma e premendo invio. E poi avere un input dell'utente. Con getString, getInt, getLongLong, o simili. Ma si scopre che supporta C qualcosa che si chiama riga di comando argomenti, che sta per farci effettivamente arrivare a parole digitati, al prompt lampeggiante, dopo il nome del vostro programma. Così, nei giorni a venire, è potrebbe digitare qualcosa come Cesare, o ./caesar numero 13, da allora in poi. Vedremo come funziona. Poiché infatti, in problema impostare due, noi siamo andando a presentarvi per un po 'di qualcosa ricorda Ralphie di sfidare precedente di cartografia. L'arte di scrambling informazioni. Questo, infatti, è molto ricorda di quello che ha fatto Ralphie. Questo è un esempio di una crittografia algoritmo chiamato rot13, R-O-T 13. Il che significa semplicemente ruotare il lettere dell'alfabeto 13 posti. E se lo fai, vedrai adesso ciò che è, forse, una frase familiare. Ma il modo in cui stiamo andando a utilizzare questo, in definitiva, è più generale. In P impostare due, in edizione standard, ti implementa un paio di cifre, uno chiamato Cesare, uno chiamato Vigenere. Entrambi sono rotazionale cifre, in che in qualche modo si trasformare una lettera in una lettera diversa. E Cesare è super semplice. Si aggiunge uno, si aggiungono 13, o un numero fino a 26. Vigenere fa che su una base per lettera. Così Vigenère, come si vedrà nelle specifiche, è più sicuro. Ma alla fine della giornata quello sarete implementando e P impostare due, è quella chiave che si utilizza sia per la crittografia e la decrittografia. Con riferimento al processo di tornitura testo normale, qualche messaggio originale, in testo cypher, che è qualcosa criptato. E poi decifrare nuovamente. Nell'edizione hacker, nel frattempo, sarete con il compito di qualcosa di simile in spirito, dove vi daremo un file, da una tipica Linux, o Mac, o Unix computer chiamato etsy password, che contiene un intero mazzo di nomi utente e password. E le password sono tutti stato criptato, o hash, per così dire, più propriamente come si vedrà nelle specifiche. E l'edizione di hacker sfiderà con l'assunzione di un ingresso come questo, e screpolature della password. Cioè, cercare di capire ciò che il password di umana realtà. Perché, in effetti, le password sono generalmente non memorizzato in chiaro, e password generale dovrebbe essere difficile da indovinare. Questo non è spesso il caso. E quello che ho pensato di fare è Concludo con un paio di minuti sguardo particolarmente scarsa scelta delle password da un film si potrebbe ricordare con affetto. E se non, dovreste affittare. [RIPRODUZIONE VIDEO] -Casco, Si demonio, cosa sta succedendo? Cosa stai facendo per mia figlia? Mi -Permit di introdurre il giovane e brillante chirurgo plastico, Dottor Phillip Schlotkin. Il lavoro più grande uomo naso in tutto l'universo e Beverly Hills. -La Tua altezza. Lavoro -Nose? Non capisco. Ha già avuto un lavoro di naso. Era il suo dolce 16 presenti. No, non è quello che pensi. E 'molto, molto peggio. Se non mi dai l' combinazione allo scudo aria, medico Schlotkin darà al vostro figlia di eseguire il suo vecchio naso. - [Rantoli] Nooooooooooooo. Dove l'hai preso? -Tutti Destra. Ti dirò, ti dirò. No, papà, no. Non si deve. -Sei Destra mia cara. Mi mancherà il tuo nuovo naso. Ma non voglio dire loro la combinazione non importa quale. -Molto Bene. Medico Schlotkin, fare il vostro peggiore. Piacere -My. -NO! Aspetta, aspetta. Te lo dico. Te lo dico. -I Sapeva che avrebbe funzionato. Va bene, dare a me. -Il Combinazione è uno. -Un. -Un. -Due. -Due. -Due. -Tre. -Tre. -Tre. -Quattro. -Quattro. -Quattro. -Cinque. -Cinque. -Cinque. -Allora La combinazione è uno, due, tre, quattro, cinque. Questa è la combinazione più stupida Ho mai sentito in vita mia. Questo è il genere di cosa che un idiota avrebbe avuto sui suoi bagagli. Si -Grazie, vostra altezza. [CLICK REMOTE] -Cosa Hai fatto? -I Spento il muro. No, non l'hai fatto, è spento tutto il film. Deve aver -I premuto il pulsante sbagliato. Be ', rimetterlo su! Mettere il filmato su! Sì, signore! Sì, signore. -Andiamo, Arnold. Vieni, Gretchen. Naturalmente sapete io devono fatturare per questo. Be '? Ha funzionato? Dov'è il re? -It Lavorato, signore, abbiamo hanno la combinazione. -Grande. Ora possiamo prendere ogni ultimo respiro di aria fresca dal pianeta Druidia. Qual è la combinazione? -Una, Due, tre, quattro, cinque. -Una, Due, tre, quattro, cinque? Sě. -Che È incredibile. Ho avuto la stessa combinazione sul mio bagaglio. Preparare Spaceball 1 per partenza immediata. Sì, signore. -E Cambiare il combinazione sul mio bagaglio. [PORTA CHIUSURA SOUND] [CLINK PORTE COLPISCE CASCO] -Ahh. [FINE RIPRODUZIONE VIDEO] DAVID J. MALAN: Questo è tutto per CS50, ci vediamo la prossima settimana. NARRATORE: E ora, Profondo Pensieri, di Daven Farnham. Daven FARNHAM: Codifica in C è molto più difficile di quanto Scratch. printf, Scratch era una bugia. [SOUNDBITE RISATA]