SPEAKER 1: Va bene. Bentornato. Questa è la settimana Due di CS50, e abbiamo finora state usando funzioni ma gran parte di loro dato per scontato. Abbiamo usato printf che ha il effetto collaterale di stampa le cose sullo schermo. Abbiamo utilizzato get-int, ottenere galleggiare. Ma cosa succede se si vuole realmente creare le proprie funzioni, alcuni dei si potrebbe avere già iniziato a fare per il Problem Set One, anche se non strettamente necessario? Bene, andiamo avanti e rivisitare quella problema del solo chiedendo all'utente di il loro nome e la stampa qualcosa sul schermo, ma cercare di scomporre alcune della comunanza che abbiamo visto nel nostro codice finora. Quindi con questo voglio dire quanto segue. Ho intenzione di andare avanti e creare un nuovo programma, basta chiamare esso ciao.c come al solito. Ho intenzione di andare avanti e dare a me stesso includere io.h standard al top. Ho intenzione di dare anche io preventivamente la libreria CS50 in modo che Io non vengo sgridato dal compilatore. E ora ho intenzione di andare avanti e dichiarare int main, vuoto. E poi qui dentro, questo è dove voglio per cominciare a esternalizzare la funzionalità di qualche altra funzione che io stesso sono intenzione di scrivere, ma che non attualmente esistono. Per esempio, supponiamo che volevo scrivere una funzione che mi permette di stampare ciao, virgola e poi il nome di qualche utente. Piuttosto che continuare a fare printf ciao,% s, non sarebbe bello se c'erano solo una funzione chiamata Non printf ma il nome di stampa? Quindi, in altre parole, voglio essere in grado di scrivere un programma che fa un po ' qualcosa di simile a questo. In primo luogo, ho intenzione di dire la tua printf nome, inducendo in tal modo all'utente di mi dia il suo nome, e poi io sono intenzione di utilizzare le s stringa familiari a dichiarare una stringa. Dammi una variabile di tipo stringa, chiamano s, e conservare in che il risultato della chiamata ottenere stringa. Ma ora nelle scorse settimane, avrei un po 'noiosamente fatto ciao,% s / n. E in altre parole, che abbiamo visto questa esempio un mucchio di volte, ed è un esempio banale, perché c'è solo un riga di codice in modo che non è davvero un grosso problema per continuare a digitare di nuovo. Ma supponiamo che questa riga di codice in realtà stavano diventando un peso, e non è una riga di codice, ma è 10 righe di codice un paio di settimane da oggi, e si sta solo stancando di copia e incolla o ridigitare lo stesso codice. Non sarebbe bello invece di fare printf ciao,% s, e così via, Non sarebbe bello se ci fosse solo una funzione chiamata nome di stampa che prende un argomento - in altre parole, ci vuole ingresso - e poi virgola. In modo che la funzione, non è vero sarebbe bello se che esiste? Allora non avrei dovuto preoccuparsi cosa printf è, ciò che% s e tutti queste complessità che sono non tutto ciò che interessante. Sono utili. Così il nome di stampa, purtroppo, non è stato inventato un po 'di più 40 anni fa. Nessuno ha pensato di scriverlo. Ma questo è il bello di avere un linguaggio di programmazione, come in Scratch è possibile definire blocchi personalizzati, in modo da in C e la maggior parte qualsiasi lingua, vero definire la propria funzionalità, può di definire le proprie funzioni. Così, anche se otteniamo principale automaticamente e gratuitamente, possiamo dichiarare nostre funzioni. Quindi ho intenzione di fare un po 'di spazio qui fino in alto, e ho intenzione di dichiarare la mia propria funzione che sta andando a guardare un po 'strano all'inizio, ma verremo di nuovo a questo non molto. Ho intenzione di dire nulla, in tal modo indica che questa funzione fa qualcosa, ha un effetto collaterale, ma non restituisce qualcosa a me in stesso modo in cui ottenere int o ottenere stringa stessa fa. E ho intenzione di dare a questa funzione un nome del nome di stampa, e ho intenzione di specificare che questo ragazzo sta andando a prendere una stringa, e ho intenzione di chiamare quel nome di stringa. Potrei chiamare tutto quello che voglio, ma io voglio che il mio codice per essere auto-documentazione. In altre parole, se uno di voi dovesse aprire il file e leggerlo, si potrebbe sorta di dedurre dal nome che ingresso che ruolo che dovrebbe svolgere. E ora sotto quello, ho intenzione di aprire parentesi graffa e chiusa parentesi graffa, e così notato ho seguito lo stesso modello su quattro linee attraverso sette come Ho seguito per una buona settimana più ora tra, diciamo, le linee e le nove 14 che compongono principale. In altre parole, stampare il nome è un'altra funzione. Ora, il compilatore non ha intenzione di conoscere per chiamare automaticamente questa cosa perché ho letteralmente appena inventato, ma si sa ancora a chiamare principale automaticamente, e poi, naturalmente in linea 13, che io chiamo la mia funzione. E perché ho dichiarato che la funzione sulla linea quattro prima principale, questo sta per insegnare il compilatore quello preventivo, chiuse virgolette, "nome di stampa" significa e cosa si dovrebbe fare. Quindi, io sono sorta di dargli una nuova abitudine bloccare nel contesto di, diciamo, Scratch. Così qui, posso mettere che molto comune o il motivo ricorrente di codice Continuo iscritto in classe, printf Ciao% s,% s / n ", - quello che voglio mettere qui? S? Quindi voglio mettere il nome in questo contesto. Quindi notare un po 'di una dicotomia qui. Perché io dichiaro la mia funzione e io ho un po 'arbitrariamente chiamato si stampa il nome, e perché ho specificati in parentesi che questo funzione prende un argomento, il tipo di che è una stringa - quindi è una parola o una frase o qualcosa del genere - e Chiamo quel nome argomento, che significa l'unica variabile che è in campo di applicazione, per così dire, è il nome. S esiste solo tra ciò che due parentesi graffe, naturalmente? Beh in realtà, proprio come la linea 10 attraverso 14, così proprio come il Lunedi non può usare S, ma quello che posso fare è passare S in nome di stampa. Stampa nome così succede per dare un alias, un sinonimo, un soprannome, chiamandolo nome, e ora utilizzarlo in questa linea. Così ora mi permetta di salvare questo, ridurre. Lasciatemi andare avanti e fare ciao. Sembra buono. Non sputare eventuali errori. . / Ciao Invio. Qual è il mio nome? David. E ciao Davide. Quindi, non è tutto così eccitante, ma basta pensare adesso. Si dispone ora di quello stesso ingrediente come abbiamo fatto in Scratch per fare le nostre funzioni. Ma c'è un po 'di Gotcha. Suppongo che non avevo proprio pensato questo attraverso e io in realtà senza davvero pensarci scritto che la funzione di quaggiù. Si sente perfettamente ragionevole. In Scratch non vi è alcuna nozione di posizione nei vostri script. Si potrebbe mettere uno qui, uno qui, uno qui, e potrebbe iniziare a guardare un po 'disordinato, se non lo fai stenderlo ordinatamente, ma non lo fa importa dove fisicamente gli script erano sullo schermo. Purtroppo in C - e questa è la differenza linguaggi come Java e Python e altri che si potrebbe avere familiarità con - purtroppo in C, per non importa, perché vedere che cosa sta succederà adesso. La funzione di default che sta succedendo eseguire è, naturalmente, principale. Principale è andare a chiamare il nome di stampa su linea otto, ma purtroppo, il compilatore non sa nemmeno che nome di stampa esiste fino a quando si arriva alla linea 11, che purtroppo è sarà troppo tardi. Quindi facciamolo fare ciao. E ora maledetti, due errori generati. Così ora mi permetta di scorrere verso l'alto per il molto in primo luogo, come si dovrebbe sempre fare, e conto che sta urlando a me, "Dichiarazione implicita di funzione stampare il nome. " Così abbiamo visto questo messaggio prima, dichiarazione implicita di funzione. Quando abbiamo visto che tipo di errore? Quando non ho incluso una biblioteca. Se ho dimenticato cs50.h e vorrei avere sgridato per ottenere stringa o ottenere int. Ma in questo caso, questa funzione di stampa nome non è in una libreria, giusto? E 'letteralmente in questo file, in modo da ciò che è veramente il problema? Beh, purtroppo in C, ti porta così incredibilmente letteralmente che se si desiderare una funzione chiamata nome di stampa esiste, hai per implementare che la funzione in cima della vostra codice in modo che sia accessibile ad abbassare funzioni, ma, francamente, che diventa sciatta molto rapidamente. Personalmente, mi piace mettere principale prima perché poi è molto chiaro che cosa questo programma fa al primo sguardo. E in più, è possibile ottenere in angolo strano casi in cui se x vuole chiamare y ma y potrebbe chiamare x, basta fisicamente non si può effettivamente mettere una sopra l'altro. Ma si scopre in C, possiamo risolvere questo molto semplice. Ho intenzione di mettere un po 'di spazio qui, e sto solo andando a preventivamente, anche se un po ' ridondante, andando ad insegnare il compilatore che esiste una funzione chiamò il nome di stampa, ci vuole una stringa, e ho intenzione di chiamare il suo nome e virgola. Quindi questo ora in linea a quattro, che abbiamo non hanno visto prima, è una dichiarazione di un nome di funzione di stampa, ma è solo una promessa che questa funzione eventualmente definire, eventualmente essere attuato. Questo ora posso lasciare da solo perché ora questa è la definizione, la implementazione, una sorta di ultimo miglio di applicazione del presente particolare funzione. Quindi francamente che è stupido, è fastidioso, ma questo è il modo è C, ed è perché ti prende molto alla lettera e, come un computer francamente dovrebbe, solo fa esattamente quello che gli si dice di fare, e in modo che l'ordinamento è importante. Modo da tenere a mente e di nuovo, inizia a notare la ricorrenza di modelli. Le probabilità sono che sarà, se non si dispone di già, inizia a incontrare i messaggi come questo, che a prima vista sembrano completamente criptico, ma se si inizia alla ricerca di queste parole chiave, come "Dichiarazione implicita", parlare di un funzione in questo caso - e francamente, è a volte anche ottenere un po 'di verde simbolo carota che ti dice dove il problema probabilmente è - si può iniziare a lavorare il vostro senso attraverso ancora i messaggi di errore non visto. Tutte le domande su come scrivere le propria funzione in questo modo? Facciamo qualcosa che è un po 'più convincente. Invece di fare solo qualcosa che ha un effetto collaterale di stampa, lasciami andare avanti e salvare un nuovo file, e faremo chiamare questo positive.c, anche se è sarà un po 'diverso rispetto l'ultima volta. E questa volta, voglio re-implementare esempio positive.C della scorsa volta, che è costringere l'utente a dare me un numero intero positivo. Ma ho dovuto usare ottenere int ultima volta. Non sarebbe stato bello se ci fosse una funzione chiamata ottenere int positivo che ho potuto solo affidare questo pezzo di funzionalità? Quindi la differenza qui è faremo implementare ottenere int positivo, ma a differenza di Nome di stampa che ha avuto un effetto collaterale - è non ha prodotto qualcosa a me come un numero o una stringa - get int positivo è, ovviamente, sta per ritorno, si spera, un int positivo. Quindi cerchiamo di fare questo. Includi cs50.h, Include di serie io.h. Int. void main. E ora qui, ho intenzione di andare avanti e diciamo int, chiamano n, è uguale ottenere int positivo. E proprio come ottenere int esiste già perché il personale ha scritto, io vado di assumere per il momento che ottiene int positivo esiste, e ora sto andando di andare avanti e dire printf, grazie per l'% i / n ", n. Così ora se compilo questo programma, che cosa che sta per accadere nel mio terminale finestra nella parte inferiore dello schermo? Ho intenzione di ottenere che probabilmente stesso errore di prima. Quindi proviamo questo. Fai positivo. E ancora, dichiarazione implicita di funzione, ottenere int positivo. Così siamo in grado di risolvere questo in un paio di modi. Ho intenzione di fare cose semplici e poco mettere la mia dichiarazione su qui e ottenere int positivo. Ho bisogno della cosiddetta firma. La firma si riferisce solo per l'estetica del prima riga del programma. Così che cosa dovrebbe ottenere positivi int di ritorno? Quindi un int. Intendo idealmente, sarebbe tornare qualcosa come int positivo, ma che non esiste. Noi non abbiamo visto che tra i nostri dati tipi, quindi abbiamo a che fare con la fatto di avere ben pochi tipi di dati con cui lavorare. Ma siamo in grado di restituire un int e basta fiducia che sarà positivo. E 'intenzione di essere chiamato ottenere int positivo. E ora come circa i suoi argomenti? Ci vuole alcun input? Ha bisogno di alcun input? Quindi non ha bisogno di sapere in niente anticipo. Ricevi stringa non, ottiene int non lo fa. Printf fa - ha bisogno di avere un po 'di Ingresso passò in esso - e il nome di stampa necessari alcuni input, ma ottenere int positivo non lo fa. Quindi ho intenzione di esplicito raccontare il vuoto compilatore. Void è l'assenza di qualsiasi altra cosa. Quindi nulla significa nulla sta dentro di tali parentesi, virgola. E adesso in fondo il mio file - e ancora una volta, Sono solo tipo di anal qui mettendo principale nella parte superiore, che è buona pratica, perché in questo modo, in qualsiasi momento voi o qualcun altro apre il file, il funzionalità è proprio lì. È possibile immergersi in da zero. Così ora ho intenzione di duplicare questo, ottenere int vuoto positivo, ma non sono andando a colpire un punto e virgola ora. Ho intenzione di aprire parentesi graffe, e ora ho bisogno di prendere in prestito alcune idee da Lunedi. Quindi, come si ricorderà, abbiamo fatto qualcosa come eseguire le seguenti operazioni mentre una cosa era vera. E che cosa ho fatto? Ho fatto qualcosa di simile a dare me un numero intero positivo, po 'di un prompt. Potrei usare le parole che voglio. E poi ho usato quello? Int. n è uguale a ottenere int, Senza argomenti ad esso. E notare la differenza. Quando si chiama una funzione, quando si utilizza una funzione, non è messo in vuoto. Tu fai solo che quando si dichiara una funzione, insegnando il compilatore che cosa si dovrebbe aspettare. Quindi non c'è bisogno di mettere nulla lì da soli. E ora che cosa era la mia condizione? Ebbene, n non è uguale a positivo, ma questo è solo pseudo-codice. Così come esprimo questo modo più pulito? Così minore o uguale a zero. Quindi, di nuovo, nota che si può fare minore o uguale a. Anche se è due separati simboli, è possibile farlo su la tastiera in quanto tale. Ma c'è ancora un bug che Ho sbagliato l'ultima volta troppo. Devo dichiarare - esattamente. Devo dichiarare n fuori del ciclo. Quindi ho bisogno di mettere n fino qui, e non mi voglia di ri-dichiarare in qui perché ho una nuova variabile. Voglio solo assegnare un valore a qui. E ora non ho ancora finito qui. Permettetemi di andare avanti di me stesso e fingo ho finito. Fai positivo, ed ora c'è un nuovo errore. Controllo a fine- funzione non void. Quindi nuovo messaggio di errore, ma se tipo di prendere in giro a parte ciascuna delle parole, probabilmente accenna a ciò che è sbagliato. Controllare. Mezzi di controllo solo per l'ordine di operazioni in un programma. Il computer è in controllo e qualcosa è andato storto. Così raggiunge la fine del una funzione non nulla. Che funzione è apparentemente riferendo? Quale funzione è non-vuoto? Così ottenere int positivo, e un po ' confusione in quel pozzo, è una specie di vuoto. Ha una specificazione del vuoto per la sua argomenti, ma la sua produzione sta per essere di tipo n. Così la parola a sinistra è il tipo cosiddetto ritorno. La parola all'interno ecco le argomentazioni zero o più che una funzione prende. Quindi, che cosa devo fare? A questo punto del mio codice, riga 21 dove il prompt lampeggiante ora è, io avere un int positiva all'interno della variabile chiamata n. Come faccio a dare di nuovo al principale? Letteralmente. Rientro n virgola. Così come Colton tornato un pezzo di carta con una risposta a me facendo cadere quel pezzo di carta nel piccolo nero scatola sul tavolo, per farlo in codice, è letteralmente basta scrivere, tornare n, ed è come se fossero Colton porgendomi qualcosa fisica. In questo caso, ciò che sta accadendo è ottenere int positivo sta per riconsegnare ciò che è presumibilmente un positivo numero intero a chi? Da dove viene quel valore a finire? Che finisce in questa variabile, n, e poi si procede con la linea di nove. Quindi, in altre parole, al fine di operazioni, questo programma si avvia esecuzione, e il compilatore realizza, oh, si desidera che la biblioteca? Lasciami andare afferrare qualunque cosa c'è dentro che. Oh, vuoi la libreria IO standard? Lasciami andare afferrare qualunque cosa c'è dentro che. Che cosa fa il compilatore a dire a se stesso quando colpisce la linea a quattro? Oh, hai promesso di attuare il funzione chiamata ottenere positivo, ma torneremo a quella dopo, qualcosa del genere. Int. void main significa solo qui è il coraggio del mio programma. Linea sette è solo una parentesi graffa. Linea otto sta dicendo a sinistra, danno me 32 bit per un numero intero, la chiamano n. Sul lato destro, e ' dicendo ottenere int positivo. Ora Facciamo una pausa quella storia perché ora Non tengo in movimento il mio cursore verso il basso. Il mio cursore ora va giù qui perché ora ottenere int positivo esegue. Int n è dichiarata. Effettuare le seguenti operazioni. Printf mi dà un numero intero positivo. Prendi un int da parte dell'utente, conservarla in n, e magari farlo ancora e ancora. Questo ciclo significa che questo codice potrebbe eseguire su e giù come questo di nuovo e ancora, ma quando l'utente finalmente collabora e mi dà un positivo int, mi ha colpito la linea 21, a questo punto il numero viene restituito, e quale devo sottolineare adesso? Nove. Controllo, per così dire, ritorna alla linea nove. Questa è la linea che è ora in carica. Ecco, questo è quello che sta accadendo tutto questa volta sotto la cappa, ma quando abbiamo funzioni utilizzate come printf o persino ottenere stringa che qualcun altro ha scritto per voi, il controllo era stato consegnato off a qualcun altro la linea di codice per linea per linea. E 'solo che non poteva vederla e abbiamo non poteva davvero rappresentare in questo programma perché è in qualche altra file sul disco rigido a nostra insaputa. Quindi cerchiamo di fatto compilare ed eseguire questo momento. Fai positivo. Compilare, questo è il progresso. . / Positivo. Dammi un numero intero positivo. Cerchiamo di essere difficile. Negativa 1. Zero. Diamogli 50. Grazie per il 50, e così il controllo ora è tornato. Tutte le domande, poi, su quello? Sì? [Incomprensibile]. Dire di nuovo. Ah, bella domanda. Quindi, si potrebbe notare un parallelo che Sono una specie di taglio di un angolo su. In linea 12, che sto dicendo, ottenere int positivo restituisce un int, ma da quello stesso logica, ora ovvio che in linea sei, sto dicendo che ritorna principali un int, ma cosa abbiamo mai avuto in uno qualsiasi dei nostri programmi? Non abbiamo mai avuto menzione di questo ritorno parola chiave. Così si scopre che in C, almeno la versione di esso che stiamo usando realizzato nel 1999, tecnicamente, questo è accade per voi automaticamente. Ogni volta che si implementa un programma e si implementare una funzione chiamata main, che la funzione restituisce zero default se non si dice altrimenti, e zero è solo una convenzione. Il mondo restituisce zero in tal modo indicando che tutto va bene, efficacemente lasciandoci con quattro miliardi possibili cose che potrebbero andare sbagliato in modo che se torniamo uno, che potrebbe significare un codice che indica questa cosa è andato storto. Potremmo tornare due, il che significa quest'altra cosa è andato storto. Potremmo tornare quattro miliardi, che significa quest'altra cosa è andato storto. E se ora si pensa proprio PC o Mac, si potrebbe ricordare che a volte si ottiene messaggi d'errore criptici dal software che si sta utilizzando, e talvolta ha un umano descrizione di facile, ma c'è Spesso un codice o un numero sullo schermo? Se questo non viene a mente, basta tenere d'occhio per esso. Questo è in genere quello che questi i codici si riferiscono. Sono inclusi in Microsoft Word e altri programmi in modo che se si compila una bug report con la società, è possibile dite loro, oh, ho ottenuto il numero di errore 45. E alcuni indietro programmatore presso l'azienda può osservare che nel suo codice e dire, oh, ecco perché ho fatto questo bug ed è per questo che l'utente ottenuto questo messaggio. Ma, francamente, è solo un po ' distrazione e un po 'noioso per concludere che, almeno sulla nostra primi programmi, quindi abbiamo stato omettendo di esso. Ma tutto questo tempo ogni uno dei vostri funzioni di principale ha segretamente avuto questa linea aggiunta automaticamente per voi dal compilatore, solo per convenzione a risparmiare un po 'di tempo. [Incomprensibile]. Non è necessario includerlo nel principale. Questo va bene. Si ha bisogno di comprendere che se si dovesse implementazione di una funzione come questa. In caso contrario, l'appartamento funzione fuori non avrebbe funzionato. Ma nella principale, non è necessario. In una settimana o due, inizieremo ottenere in quella abitudine una volta vogliamo iniziare significare errori. Davvero buona domanda. Pausa verbale così veloce a dire che questo Venerdì, non saremo pranzando di per sé, ma saremo a cena con alcuni degli studenti e del personale. Se vuoi unirti a noi, si sentono libero di andare a cs50.net/rsvp. 06:00 questo Venerdì. Lo spazio è, come sempre, limitato, ma ti continuare a fare questi su un quasi base settimanale se lo spazio esaurisce questa settimana. Quindi il colpo di scena che abbiamo lasciato su Lunedi è stato che le stringhe possono effettivamente essere indicizzato in, che solo voi significa può ottenere con il primo carattere, il secondo carattere, il terzo carattere e così via, perché è possibile effettivamente pensare a una stringa, come ciao, come in questo caso cinque lettere all'interno delle caselle. E si può ottenere in ciascuna di quelle scatole con quello che sintassi abbiamo introdurre il Lunedi? Quelle parentesi quadre sulla tastiera. Che appena significava andare in posizione zero. Si comincia a contare da zero, quindi staffa pari a zero significa h, una staffa significa e, e così via. E così per tutto il tempo in cui siamo stati utilizzando stringhe e digitando "ciao" e il "mondo" e altre cose su lo schermo, è stato memorizzato in scatole come questa. E prendere una supposizione. Che cosa significa ogni casella rappresenta fisicamente all'interno del vostro computer? [Incomprensibile]. Siamo spiacenti? Personaggi. Quindi un personaggio, sicuramente nel caso di stringhe, e un carattere è solo otto bit o un byte. Quindi probabilmente sono almeno vagamente a conoscenza del fatto che il vostro computer dispone di memoria. Ha due tipi di memoria, almeno. Uno è il disco rigido in cui si salva roba in modo permanente, e questo è tipicamente grande in modo da poter avere i filmati e musica e così via. Poi hai un altro tipo di memoria chiamato RAM, R-A-M, Accesso Casuale Memoria, e questo è il tipo di memoria che viene utilizzato quando il computer è esecuzione, ma se si perde il potere o il vostro batteria muore, tutto ciò che è memorizzato nella RAM scompare se si perde potenza tutto perché non è persistente. In genere si hanno, in questi giorni, una concerto di esso, due concerti, forse più. E la testa di RAM è che è molto più molto, molto più veloce rispetto ai dischi rigidi o anche drives allo stato solido in questi giorni, ma è in genere più costoso così hai meno di esso. Quindi la conversazione di oggi si riferisce in realtà in RAM, che tipo di memoria che esiste solo finché c'è potere essere alimentato nel computer. Così, quando si digita in H-E-L-L-O, immettere il la tastiera, la H sta andando in uno byte di RAM, la E sta andando in altro byte di RAM, come è il resto della parola. Quindi, ricordiamo quello che siamo stati in grado per fare l'ultima volta è stato questo. Lasciami andare avanti e aprire il file che abbiamo chiamato string.c, e ricordiamo che sembrava un po ' qualcosa di simile a questo. Lasciatemi effettivamente rotolare indietro e cambiare è esattamente quello che sembrava, lunghezza della stringa di s. Quindi, guardare il programma qui. Includiamo la libreria CS50 così che possiamo usare ottenere stringa. Includiamo io.h di serie in modo che possiamo usare printf. Perché abbiamo includiamo string.h? Questo era nuovo il Lunedi. Così abbiamo voluto lunghezza della stringa. Str. Lung. Le persone hanno deciso anni fa, cerchiamo di essere solo succinta. Invece di chiamarla "la lunghezza della stringa," chiamiamolo "str Lung" e lasciare che il figura mondo che fuori, e così che è ciò che si ottiene l'accesso a con string.h. Questo è familiare. Questo è familiare. Questo è familiare. Questo è un po nuovo. In linea 22 - e ci torneremo per questo, ma per ora sapere - e si sa solo questo da avere leggere la documentazione o se si sapeva già C - ottenere stringa a volte può rovinare. Se l'utente è davvero contraddittorio o poco collaborativo e lui o lei semplicemente non digitare nulla sulla tastiera o Tipi di tanto alla tastiera che travolge la memoria del computer, in teoria, ottenere stringa potrebbe tornare qualcosa di diverso da un stringa di caratteri. Si potrebbe restituire un valore speciale chiamato NULL in tutte le protezioni, N-U-L-L, e questo è solo un cosiddetto valore sentinella. E 'un valore speciale che indica qualcosa di brutto è accaduto in questo caso. È l'assenza di una stringa. Così NULL sto controllando per semplicemente in modo che, per farla breve, str Lung e altre funzioni che vengono con C, se si aspettano una stringa ma li passano l'assenza di una stringa, se si passa li NULL, il computer o il programma sarà solo crash a titolo definitivo. Esso si bloccherà. Sarà vomitare qualche messaggio di errore. Accadranno brutte cose. Così, anche se questo è ancora non ben definiti - questo renderà più senso in una settimana o due - in linea 22, questo è solo un esempio di controllo degli errori difensivi auto nel caso in cui una volta su un milione di qualcosa va male, a Almeno il mio programma non vada in crash. Quindi, se s non è uguale a qualcosa di brutto, Ho questo ciclo for, e questo è stato dove abbiamo fatto altro che nuovo pezzo di sintassi. Ho un ciclo for iterazione da zero fino alla lunghezza di s. E poi qui, ero una stampa fuori s Staffa i, ma perché ho usato% c tutti un improvviso invece di% s anche se s è una stringa? E 'un personaggio, giusto? S è una stringa, ma s staffa qualcosa, s staffa i dove i è pari a zero o uno o due, questo è un individuo carattere della stringa, e quindi per che, ha bisogno printf di essere informato che è davvero un personaggio di aspettarsi. E poi ricordare, che cosa ha fatto questo programma effettivamente fare? Stampato fuori in colonne. Sì, esattamente. E 'appena stampato la parola che digito una colonna, un carattere per riga. Quindi vediamo di nuovo. Quindi, fare stringa. Compilato OK. . / String. Permettetemi di digitare in H-E-L-L-O, INVIO, anzi ho capito, uno per riga. Quindi, mi permetta di fare una ottimizzazione qui. Se ci pensate, soprattutto se avete già programmato in precedenza, non c'è probabilmente una inefficienza in linea 24. In altre parole, non è necessariamente il miglior design. Semplice, almeno una volta ricordare quello str Lung è, ma è facendo qualcosa di stupido potenzialmente. Cosa potrebbe essere? [Incomprensibile]. Esattamente. Sta controllando la lunghezza s ogni volta anche se H-E-L-L-O sta andando sempre ad essere di cinque caratteri. Ogni volta con questo ciclo, il cinque non sta cambiando. Potrei essere incrementando i, ma ciò è la lunghezza di s su ogni iterazione di questo ciclo? Sono le cinque, è cinque, è cinque, e tuttavia sono comunque chiedo questo interrogare ancora e ancora e ancora. Ora, francamente, il computer è così dannatamente veloce, nessuno sta andando a notare un differenza in questo caso, ma questi tipi delle decisioni di progettazione poveri possono iniziare a sommare se il compilatore stesso non tentare di risolvere questo per voi che ma in genere non sarebbe, a almeno nell'apparecchio. Quindi ho intenzione di farlo. Ho intenzione di aggiungere una virgola dopo la mia prima variabile, i. Ho intenzione di darmi un altro variabile, definendolo n, semplicemente convenzione per i numeri, e poi io sono andando ad assegnare n il valore di stringa lunghezza di s. E poi ho intenzione di cambiare la mia condizione di essere ciò? Ho intenzione di cambiare la mia condizione a quando i è minore di n. Così ora, quante volte sono io controllando la lunghezza di s? Una volta, ma è OK per controllare i contro n nuovo e di nuovo perché adesso quelli I valori non sono effettivamente cambiando. Ora per ora, è sufficiente sapere che ogni volta che si chiamare una funzione, c'è un po 'di spese generali, non abbastanza per scoraggiare davvero da sempre con le funzioni, ma certamente quando c'è una riga di codice così - e le linee otterrà più interessante fra non molto - dove c'è l'opportunità di pensare, se io digitare il codice, il numero di volte si è eseguito? Potrai iniziare a vedere nel tempo la prestazioni dei vostri programmi possono davvero cambiare. In effetti, uno dei problemi che abbiamo imposta fatto negli anni passati coinvolge attuazione, come forse ricorderete da settimana a zero, un correttore ortografico, ma un correttore ortografico che è progettato per supportare un dizionario di 150.000, più parole che gli diamo ragazzi. Si dovrebbe scrivere il codice che carica quelle parole nella RAM, perciò in scatole come abbiamo visto sullo schermo un momento fa, e quindi il più velocemente possibile, è necessario essere in grado di rispondere a una questione della forma, è questa parola errata? È questa parola errata? È questa parola errata? E in qualcosa di simile quello che abbiamo fatto negli anni passati si trasformò in, anche se su un opt-in via facoltativa, una concorrenza di sorta, per cui il studenti che usano il meno RAM e meno tempo, un minor numero di cicli di CPU, finiscono per zampillante per la parte superiore di un piccolo leader board o classifica che abbiamo messo su homepage del corso, come abbiamo fatto negli anni passati. Quindi, di nuovo, del tutto facoltativa, ma questo parla alle opportunità progettuali che sono davanti una volta che iniziamo costruzione in cima a alcuni di questi elementi di base. Quindi, mi permetta di tornare in questo schema per solo un momento e rivelare un po ' qualcosa di più. Questa in effetti è una stringa, e abbiamo preso vantaggio di un paio di librerie, io.h standard che ha - Printf. Printf, tra le altre cose. cs50.h, che ha ottenere int e ottenere stringa e così via, string.h, che avuto str Lung. Ma si scopre non c'è ancora un altro. Francamente, ci sono un sacco di intestazione file che dichiarano funzioni per le biblioteche, ma questo è ctype.h in realtà sta per essere un po ' vantaggioso perché sto andando di andare avanti e applicare uno altro programma qui. Lasciami andare avanti e di aprire qualcosa Ho scritto in anticipo chiamato capitalize.c, e prendiamo un'occhiata a come funziona. Si noti che sto usando, in questa versione di esso, tre file familiari. Si noti che in linea di 18, sono ottenendo una riga di testo. Bando nella linea 21, sto sostenendo che il seguente codice sta per capitalizzare s, qualunque sia l'utente ha digitato a, e come sto facendo questo? Beh, io sto prendendo - lezione imparata da ultima volta - Sto dichiarando i e n e l'iterazione nel corso dei caratteri della stringa. E allora che cosa è questo blocco di codice nella riga 24 alla 27 facendo in parole povere? Lettera minuscola indietro. Esattamente. Se s Staffa i - quindi se l'i-esimo carattere di s, che è una specifica char nella stringa, è maggiore di o pari a un minuscolo e - ricordare che doppia e commerciale significare e - e lo stesso carattere, s staffa i, è inferiore o uguale a z minuscola, che significa che è una A o una B o una C o punto, punto, punto o una z, il che significa è minuscolo. Cosa voglio fare in questo caso? Beh, posso fare questo in qualche modo cripticamente, ma cerchiamo di prendere in giro questa parte. Io vado a chiamare printf, stampe% c perché voglio ristampare questo carattere sullo schermo. Sto andando poi a prendere s staffa i, il i-esimo carattere in s, e allora perché sto facendo questo piccolo trucco, Un minuscolo un capitale negativo? Che cosa è che andare a dare me, in generale? [Incomprensibile]. Esattamente. Io non mi ricordo - era 65 per i capitali A. non mi interessa davvero ricordare ciò che è un minuscolo, ma non importa. Il computer sa. Così dicendo, minuscolo un meno maiuscola, è strano di essere sottraendo un carattere da un altro, ma quali sono i caratteri sotto il cofano? Sono solo numeri. Quindi, qualsiasi cosa questi numeri sono, lasciare che il computer lo ricordo piuttosto che me l'umano. Così minuscolo un capitale negativo A è andando a darmi una differenza. Capita di essere 32, e che sarebbe il caso di minuscole b e capitale B e così via. Rimane costante, per fortuna. Così sto dicendo in sostanza, prendere la lettera minuscola, sottrarre off che standard differenza, e che effettivamente cambia s staffa i da minuscolo, naturalmente, maiuscolo, senza che io davvero dover pensare circa o ricordare, che cosa erano quelle numeri abbiamo parlato quando l'otto volontari salirono sul palco? Ora, nel frattempo, nel resto, se non è una lettera minuscola, come determinato da linea 24, basta stamparlo. Voglio solo toccare la personaggi che erano in realtà originariamente minuscolo. Quindi cerchiamo di vedere questo. Fai capitalizzare. Compilato, OK. . / Capitalizzare. E mi permetta di digitare in H-E-L-L-O in minuscolo, Enter. E notare che esso è convertito in maiuscolo. Mi permetta di fare questo nuovo con una parola diversa. Che ne dici di D-A-V-I-D con il primo D capitalizzati come nome tipicamente è? Invio. Si noti che è ancora corretta. E 'appena emesso quel primo D invariata via che altro costrutto. Quindi, tenere a mente, quindi, un paio di cose qui. Uno, se vi capitasse di voler controllare due condizioni in una sola volta, è possibile e li insieme come avevamo previsto. È possibile confrontare i caratteri in questo modo e trattare efficacemente i caratteri come numeri, ma, francamente, questo è così dannatamente criptico Non riuscirò mai a ricordare come a venire con questo da zero senza ragionare attraverso di essa per molto un po 'di tempo. Non sarebbe stato bello se qualcuno fuori ci ha scritto una funzione chiamata è inferiori che potesse rispondere per me vero o falso, questo personaggio è minuscolo? Beh per fortuna, chi ha scritto ctype.h ha fatto esattamente questo. Lasciami andare qui e aggiungo ctype per c tipi, e ora lasciami andare qui e riscrivi questa riga come segue. Quindi, se si chiama è più basso, rivendico, s Staffa di i, allora ho intenzione di cancellare queste due linee del tutto. Così ora qualcun altro, spero, ha scritto una funzione chiamata è più basso, e E 'venuto fuori che hanno fatto e hanno dichiarato all'interno di ctype.h. E ora ho intenzione di lasciare la linea 27 da solo, ho intenzione di lasciare la linea 31 solo, ma notato quanto ho inasprito il mio codice. E 'ora più pulito. E 'meno difficile da guardare attraverso perché ora la funzione, inoltre, è così meravigliosamente chiamato semplicemente fa quello che dice. Così ora ho intenzione di salvare questo. Io vado a diminuire. E proprio come in Scratch si potrebbe avere Booleani, valori booleani vero o falso, è esattamente ciò che è inferiori, effettivamente resi. Permettetemi di ricompilazione. Lasciatemi re-run. E ora proviamo di nuovo, H-E-L-L-O, Invio. Questo è abbastanza buono. E provare di nuovo, assicurarsi che io non avvitare qualcosa. Che è in maiuscolo pure. Ma questo non è sufficiente perché il altra cosa che non riuscirò mai a ricordare a meno io lavoro attraverso di essa davvero attenzione, diciamo, la carta è questa maledetta linea. Non sarebbe bello se ci fossero una funzione chiamata al superiore? Ebbene si scopre là fuori è in ctype.h pure. Ho intenzione di andare avanti e digitare - lasciatemi portare quella linea di fondo. Al posto di questo qui, mi lascia andare avanti e dire, sostituire il% c il risultato della chiamata di questa funzione per superiore sulla i-esimo carattere di s. E ora la cosa si fa notare un po 'di equilibrio. Devo tenere traccia del numero di parentesi che ho aperto e chiuso. Così ora è ancora più pulito. Ora questo programma è sempre meglio e meglio progettato probabilmente perché è molto, molto di più leggibile, ma non c'è da lasciare che sia corretta. Fai capitalizzare. . / Capitalizzare. H-E-L-L-O. Corriamo ancora una volta, D-A-V-I-D. OK, quindi siamo ancora in buona forma. Ma ora al superiore. Propongo che ci sia ancora una raffinatezza potremmo fare sarebbe veramente bello, che potrebbe davvero stringere su questo codice e davvero ci danno cinque su cinque per progettazione, per esempio. Quanto sarebbe bello per sbarazzarsi di? Beh, guarda come dannatamente lungo questo blocco di il codice è solo per fare qualcosa di semplice. Ora, come un a parte, come si potrebbe avere visto in sezione eccellente lo scorso fine settimana, non è strettamente necessario il parentesi graffe quando vi è solo un riga di codice, anche se abbiamo proposto mantenendoli in modo che rende molto più chiaro, come in forma di U di Scratch blocchi, cosa c'è dentro del ramo. Ma non sarebbe bello se al superiore, una volta dato il suo input, lo ha trasformato in maiuscolo, se non lo è, e che cosa sarebbe essere meraviglioso nel caso opposto, se è già in maiuscolo? Basta passare attraverso e lasciarlo solo. Così forse lo fa. Ho potuto provare e spero solo che lo fa, ma mi ha lasciato introdurre un'altra cosa. Invece di usare questo terminale integrato finestra qui sotto, si ricordi che questa icona quadrato nero ti dà una finestra di terminale più grande che posso riempirlo schermo se voglio? Così si scopre che sono una sorta di strano chiamato, ma non c'è queste cose chiamate pagine di manuale, le pagine man, l'uomo in breve, e posso accedervi da digitando man - cosa devo digitare? L'uomo di superiore. E ora notare se esiste una funzione all'interno del computer, in questo caso l'apparecchio, che è solo il sistema operativo Linux, sta andando di darmi un insieme un po 'criptico di uscita, ma troverete il tempo che sempre è formattato praticamente la stesso modo si inizia ad abituarsi ad esso. Si noti in alto a superiore, e apparentemente la stessa documentazione per abbassare. Chi ha scritto che stava tagliando alcuni angoli e mettere tutto in una pagina. Scopo Queste cose 'in vita è di convertire un lettera al superiore o minuscole. Si noti che sotto Sinossi, la pagina man mi sta insegnando che lima ho di includere per utilizzare questa cosa. Mi sta dando le firme per questi funzioni, sia di loro, anche se siamo in questo momento solo cura di uno. Ecco ora una descrizione. Per superiore converte la lettera c in maiuscolo, se possibile. Ancora non è che istruttivo, ma lasciatemi ora guardare sotto il valore di ritorno, la cosa quello è restituito. Pertanto il valore restituito è quello del lettera o c convertita se il conversione non era possibile. Che cosa è c? Il carattere originale. Il carattere originale e sappiamo che da, nuovamente, andando fino al sinossi, e chi ha scritto questo funzione appena deciso che l'ingresso al di superiore e di più basso è solo arbitrariamente sta per essere chiamato c. Avrebbero potuto chiamato più nulla che vogliono, ma hanno conservato semplice come c. Così mi sono consultato la pagina di manuale. Questa frase mi rassicura che se non è una lettera minuscola, è andando a darmi appena tornato C, che è perfetto, che significa che posso eliminare la mia condizione else. Quindi, mi permetta di tornare a gedit, e ora vorrei solo fare questo. Io vado a copiare il mio printf. Ho intenzione di andare avanti e di diritto interno il ciclo di stampa che fuori, e ottenere liberarsi di tutto questo ora, se costrutto. Non era una cattiva idea, ed è stato molto molto corretta e coerente con tutto quello che abbiamo predicato, ma proprio non è necessario. Non appena vi rendete conto qualche libreria funzione esiste che qualcun altro scritto, o forse hai scritto altrove in il file, si può utilizzare e realmente iniziare a stringere il codice. E quando dico le cose come buono stile, il fatto che questa persona denominata funzionare al superiore, o in precedenza è inferiore è meravigliosamente utile perché sono molto descrittivo. Lei non vorrebbe chiamare le funzioni x ed y, z, che hanno molto, molto meno significato. Qualsiasi problema che la serie dei miglioramenti? Quindi, è sufficiente dire uno dei takeaway è anche come il tuo problema set - forse problema proposto uno, ma certamente P impostare due e poi, anche quando sono corretti non necessariamente significa che sono perfette solo ancora o particolarmente ben progettato. Questo è l'altro asse di cominciare a pensare. Quindi questa era una stringa all'interno del vostro memoria del computer, ma se avete un intero gruppo di personaggi come H-E-L-L-O all'interno di RAM, e supponiamo che nel vostro programma di chiamare ottenere stringa più volte tale che si chiami ottenere stringa una volta, allora si chiamare ottenere nuovamente stringa. Ebbene, che cosa sta per avvenire nel corso del tempo? In altre parole, se si dispone di una linea di codice, anche se fuori dal contesto, come stringa s ottiene - Facciamolo. String name uguale ottenere stringa. Quindi supponiamo che la linea di codice è destinato chiedere all'utente per il suo nome. Questa successiva riga di codice è destinato a chiedere l'utente per la sua scuola, e questa riga successiva, e così via. Supponiamo continuiamo a chiedere l'utente e per un'altra un'altra e un'altra stringa. Hanno intenzione di rimanere in memoria allo stesso tempo. Uno non ha intenzione di massacrare l'altro. La scuola non è sovrascrivere l'altra. Ma dove fare tutto finire in memoria? Beh, se cominciamo a disegnare sullo schermo, che possiamo usare questa cosa qui come una lavagna, se questo nero rettangolo rappresenta il mio computer di memoria, ho intenzione di iniziare arbitrariamente dividendolo in piccoli quadrati, ciascuno dei quali rappresenta un byte di memoria. Francamente, se si dispone di un gigabyte di RAM in questi giorni, si dispone di un miliardo di byte della memoria del computer, in modo da un miliardo di questi quadrati. Quindi, è sufficiente dire, questo in realtà non è in scala. Ma potremmo continuare disegno tutti questi chiaramente non in scala piazze, e questo rappresenta collettivamente la memoria del mio computer. Ora dobbiamo solo fare punti, puntini, puntini. Quindi, in altre parole, quando ormai il prompt utente con la stringa get di darmi una stringa, che cosa succede? Se l'utente digita in "ciao", che finisce in H-E-L-L-O. Ma supponiamo che il poi tipi di utente in - in realtà, io non avrei dovuto fare ciao perché stiamo chiedendo loro per i loro nomi. Quindi torniamo se posso fare questo. Quindi, se io tipo in D-A-V-I-D per il mio nome, ma ricordare che la seconda riga del codice è stato ottenere nuovamente stringa per ottenere la loro scuola. Dove è la parola che l'utente tipi di intenzione di andare dopo? Beh, forse sta per andare in H-A-R-V-A-R-D. Così, anche se ho disegnato come due file, questo è solo un mucchio di byte nel vostro RAM del computer. C'è un problema ora, perché ora se io sono utilizzando RAM in questo molto ragionevole ma una sorta di modo ingenuo, cosa si può Non pare distinguere? Dove si comincia e dove finisce, giusto? Sono tipo di sfocatura insieme. Così si scopre il computer non fare questo. Lasciatemi in realtà scorrere indietro nel tempo un pochi personaggi, e invece di Harvard andare subito dopo il nome dell'utente, l'utente ottiene in realtà, dietro le scene, un carattere speciale inserito dal informatico per lui o lei. / 0, altrimenti noto come il carattere NUL fastidiosamente chiamato N-U-L, non N-U-L-L, ma si scrive come / 0. E 'solo che tutti i bit a zero è un marker di tra la prima parola che dell'utente digitato e la seconda. Così Harvard in realtà ora finisce come questa sequenza di caratteri e un altro / 0. Quindi, in altre parole, avendo questi valori sentinella, otto a zero contigui bit, è ora possibile iniziare a distinguere un personaggio da un altro. Quindi tutto questo tempo ciò che è stato "ciao" è in realtà "ciao" con un / 0, e Nel frattempo, ci potrebbe benissimo essere un po 'più di RAM all'interno del computer. Lasciami fare un'altra cosa adesso. Si scopre che tutte queste piazze abbiamo disegno, che sono, sì, stringhe, ma più in generale, queste cose sono array. Un array è solo un pezzo di memoria questo è back to back to back to back, e in genere si utilizza un array per mezzo di questa notazione parentesi quadra. Quindi andiamo a vedere questi un bel po ' nel corso del tempo, ma mi permetta di andare avanti e di aprire, chiamiamolo età. E notare che cosa possiamo fare con questi stessi trucchi, un po ' po 'di più la sintassi qui. Quindi, in linea di 17 di questo programma - in realtà, mi permetta di eseguire il programma di prima così possiamo vedere che cosa questa cosa fa. Fammi chiamare le età a compilare questo programma. . / Età. Quante persone ci sono nella stanza? Chiamatela tre. Età della prima persona? 18, 19, e 20. Ed ora un po 'ridicolo, ho appena hanno fatto un programma che invecchia quelli tre persone. Quindi c'è chiaramente una opportunità per alcuni aritmetica divertimento qui. Per fortuna, la matematica è corretta. 18 è andato a 19, 19 è andato a 20 e così via. Ma che cosa è veramente destinata a essere illustrativo ecco come stiamo memorizzazione età quei tre delle persone. Permettetemi di ingrandire in ciò che è succedendo qui. Quindi, in primo luogo, queste prime righe dovrebbero essere sempre abbastanza familiare. Sto solo chiedendo all'utente il numero di persone nella stanza. Poi sto usando ottenere int e da fare, mentre a farlo ancora e ancora e ancora. Abbiamo visto che il modello precedente, ma linea 27 è nuovo e in realtà abbastanza utile, e diventerà sempre più utile. Si noti che ciò che è diverso in linea 27 è che mi sembra essere la dichiarazione di un int chiamati epoche, ma aspetta. Non sono solo le età int. C'è queste parentesi quadre, all'interno del quale è n. Così la staffa n in questo contesto, non interno di un printf qui ma in questa sola linea 27, questa linea è dicendo, me n interi danno, ciascuno dei quali è di tipo int. Quindi questo è un secchio, per così dire, di, in questo caso, tre interi indietro back to back in modo che io effettivamente avere tre variabili. L'alternativa, per essere chiaro, sarebbe questo. Se volevo il primo dello studente età, potrei farlo. Se volevo il secondo dello studente età che potrei farlo. Se volevo del terzo studente età, potrei farlo. E Dio non voglia che abbiamo bisogno tutti di età in questa stanza - Voglio dire, questo è un diavolo di un sacco di copia, incollare ancora e ancora e ancora. E in più una volta che compilo questo programma, se un altro studente cammina sopra fuori di quella porta, ora il mio numero delle variabili è corretta. Quindi cosa c'è di bello di un array è come appena si inizia a sentire te stesso copia e incolla, le probabilità sono che è non è l'approccio migliore. Una matrice è dinamica potenzialmente. Non so in anticipo quante persone stanno per essere nella stanza, ma so ho bisogno n di loro, e io capire n quando sarà il momento. Questa riga di codice ora significa, dammi un pezzo di memoria che assomiglia a questo dove il numero di caselle nella schermata è interamente dipendente da n che l'utente ha digitato dentro Così ora il resto di questo programma è in realtà abbastanza simile a quello che abbiamo appena fatto con i personaggi. Notate che ho un ciclo for partenza in linea 30. Quindi, subito dopo ho la matrice, io iterare da y è uguale a zero su un massimo di n. Ho solo questo istruttivo printf messaggio solo dicendo, mi danno l'età di persona #% i, quindi il numero uno, numero due, numero tre. E perché l'ho fatto? Francamente, gli esseri umani preferiscono contare da uno su un massimo, mentre gli informatici, zero su su. gli informatici non stanno andando a utilizzare questo tipo di programma, quindi siamo intenzione di iniziare solo contando a uno come persone normali. E ora, in linea 33, notare il lieve pezzo diverso di sintassi. L'i-esimo età in quella variabile di tipo serie sta per arrivare un int. E ora, infine, questo è solo aritmetica quaggiù. Ho deciso in un ciclo separato di rivendicare qualche tempo passa, ed ora in questa ciclo separato, queste linee eseguire. Un anno da ora, persona sarò io anni, a meno di notare questo non è il variabile i. Questo è ora% i per int. E notate come primo segnaposto, ho collegare i più 1, per cui contiamo come un persona normale. E poi per il valore della loro età, per i anni, prendo le età staffa i - e perché ci faccio più uno qui? Hanno appena invecchiati. E 'la mia stupida scelta dei programmi. Hanno appena di età compresa tra un anno. Potrei digitare qualsiasi numero che Io in realtà non ci voglio. Così che cosa è in realtà tutti la rilevanza qui? Bene, lasciate che in realtà scorrere indietro qui e dipingere un quadro di quello che ci aspetta. Che cosa faremo con il nostro prossimo Problema due set è dilettarsi nel mondo della crittografia. Quindi questa è una stringa di caratteri, quindi un sequenza di caratteri multipli, e ciò dice questo? Non è nella versione online delle diapositive. Quindi io sostengo che questo è uguale a questa, un stupido Annuncio di molti anni fa, che potrebbe effettivamente ricordare una delle sue origini. Quindi questo è un esempio di crittografia o crittografia. Si scopre che se si vuole effettivamente inviare informazioni o condividere informazioni con qualcuno in modo sicuro, come un messaggio come questo, è possibile rimescolare le lettere. Ma, in genere, le parole sono Non a caso strapazzate. Stanno permutati in un modo o modificate in qualche modo, in modo che - oops. Questo è uno spoiler divertente per la prossima volta. Così si può mappare ciò che è apparentemente O a B. Si noti che le linee fino capitalizzazione-saggio. Apparentemente r diventa e. Apparentemente F-H-E-R diventa S-U-R-E. Così si scopre che c'è una mappatura, e in questo caso c'è un abbastanza stupido mappatura se qualcuno ha capito? Questo è qualcosa che si chiama Rot 13, Ruota 13. E 'la più stupida di crittografia meccanismi perché letteralmente appena aggiunge 13 ad ogni una delle lettere, stupido, nel senso che se si avere un po 'di tempo libero per le mani e una matita, o semplicemente pensi che attraverso nella tua testa, si potrebbe provare tutti i possibili arrivi - uno, due, tre, punto, punto, punto, 25 a soli ruotare l'intero alfabeto, e alla fine, capirai ciò che questo messaggio sia. Quindi, se hai fatto qualcosa di simile in scuola di grado passando messaggi al vostro migliore amico, se il grado di scuola insegnante semplicemente leggere attraverso il messaggio e bruta costretto la soluzione, si potrebbe avere ottenuto una risposta per questo. Ora, naturalmente, nel mondo reale, crittografia è più sofisticato. Si tratta di un frammento di testo da un sistema di computer che dispone di nomi utente e le password, come quasi tutti i nostri fanno, e questo è ciò che la tua password potrebbe guarda come se memorizzati sul disco guidare, ma in forma criptata. Questo non è solo una rotazione di lettere, A è B e B è C. Questo è molto più sofisticato, ma utilizza ciò che è generalmente conosciuto come chiave segreta crittografia. Questa immagine racconta il seguente storia con alcune icone. Sulla sinistra, abbiamo ciò che chiameremo testo normale. Nel mondo della crittografia, pianura testo è solo il messaggio originale scritto in inglese o francese o qualsiasi lingua. Se si desidera crittografare, noi passeremo ma pittoricamente attraverso un lucchetto, in modo qualche tipo di algoritmo di, qualche funzione o programma che qualcuno ha scritto che rimescola le lettere si spera complicatedly più di una semplice aggiunta di 13 a ciascuno di essi. Che cosa si ottiene da questo processo nel centro vi è chiamato testo cifrato. Quindi una specie di parola sexy. Significa solo che è il criptato versione del testo. E solo se si ha lo stesso segreto, 13 o meno 13, si è in grado di decifrare un messaggio simile. Quindi, in Problema Set Due, tra le cose farete se nella Hacker Edition, sarà necessario scrivere il codice per rompere queste password, cercando di capire quello che erano e come sono stati crittografato, anche se facciamo dare un po ' di guida lungo la strada. Nella Standard Edition, introduciamo un paio di cifre, la crittografia meccanismi, uno chiamato Cesare, uno chiamato Vigenère, che sono ancora cifrari a rotazione dove A diventa qualcosa, B diventa qualcosa, ma quello che dovete fare a livello di codice perché ci sarà davvero un segreto chiave coinvolto che è tipicamente un numero o una parola chiave che solo l' mittente e il destinatario di questi messaggi dovrebbero capire. Ora, questo ha in realtà incarnazioni nel mondo reale. Questo, per esempio, è poco orfano Anello decodificatore segreto di Annie, e si può effettivamente realizzare questi cifrari a rotazione - A diventa qualcosa, B diventa qualcosa - con un paio di ruote, quello esterno, uno sull'interno tale che se si ruota il volante o l'anello, si può effettivamente allineare il lettere con lettere diverse, ottenendo un codice segreto. E così come il colpo di scena per oggi, quello che ho pensato di fare un po 'di ritorno al passato che se si accende la TV il 24 dicembre, è possibile guardare la film fino alla nausea per 24 ore di fila. Ma per oggi, io apro qui e ci danno solo due minuti di un pedagogicamente rilevante storia di Natale con un omino di nome Ralphie. [RIPRODUZIONE VIDEO] -Sia noto a tutti quanti che Ralph Parker è nominato membro del Orphan Annie Piccolo segreto cerchio e il diritto di tutti gli onori e benefici NONCHÉ. -Firmato, Little Orphan Annie. Controfirmato, Pierre Andre in inchiostro. Onori e benefici già all'età di nove anni. [GRIDA ALLA RADIO] Vieni, andiamo avanti con lui. Non ho bisogno di tutto ciò che il jazz su contrabbandieri e pirati. -Senti domani sera per la concludendo l'avventura del nero nave dei pirati. Ora, è il momento per il segreto di Annie Messaggio per voi membri del cerchio segreto. Ricordate, ragazzi. Solo i membri di Secret Circle di Annie in grado di decodificare un messaggio segreto di Annie. Ricordate, Annie dipende da te. Impostare le spine di B2. Ecco il messaggio. 12, 11, 2 - -Io sono nel mio primo incontro segreto. -25, 14, 11, 18, 16 - -Pierre era in grande stasera voce. Potrei dire che il messaggio di questa sera era davvero importante. -3, 25. Questo è un messaggio da Annie se stessa. Ricordate, non dirlo a nessuno. -90 Secondi dopo, io sono in unica camera nella casa dove un bambino di nove anni potrebbe sedersi in privacy e decodifica. Aha, B. sono andato a quello successivo. E. La prima parola è "essere". S. Si è ora in arrivo più facile. U. 25. Quello è R. -Dai, Ralphie. Devo andare. -Torno subito giù, ma '. Gee Whiz. -T. O. Assicurarsi di. Essere sicuri di che cosa? Qual è stato Little Orphan Annie cercando di dire? Essere sicuri di che cosa? -Ralphie, Randy ha avuto modo di andare. Vi prego di venire fuori? -Va bene, mamma. Vengo subito fuori. -Mi stavo avvicinando ad ora. La tensione era terribile. Che cosa è stato? Il destino del pianeta può in bilico. -Ralphie, devo andare di Randy. -Torno subito fuori per gridare forte. -Ci siamo quasi. Le mie dita volavano. La mia mente era una trappola d'acciaio. Ogni poro vibrava. E 'stato quasi chiaro. Sì, sì, sì, sì, sì. -Assicuratevi di bere il vostro Ovaltine. Ovaltine? Un commerciale scadente? Figlio di una cagna. [FINE RIPRODUZIONE VIDEO] SPEAKER 1: Questo è CS50, e che sarà Problema due set. Ci vediamo la prossima settimana. SPEAKER 2: Alla prossima CS50, questo accade. SPEAKER 1: Così un argomento che non abbiamo guardato finora è quella di puntatori a funzione. Ora, un puntatore a funzione è solo l'indirizzo di un pubblico funzione, ma molto simile - figlio di un -