>> [RIPRODUZIONE DI BRANI MUSICALI]
>> SPEAKER 1: Questo è CS50 e questo è l'inizio di due settimane.
Quindi, cerchiamo di tuffarsi in qualcosa cioè buggy, per così dire.
Così, qui è CS50 IDE e ho tirato su in anticipo questo screen-- maledetto
esso.
Spoiler alert.
Tutto ok.
Ho tirato su questa schermata qui, che ha un programma molto semplice.
Se ci spostiamo verso il basso, la maggior parte di questo è solo commenti,
ma qui in linee 13 attraverso 17 abbiamo un programma.
>> E 'sintatticamente valida, il che significa che se Compilo esso, sarà compilare ed eseguire,
ma è bacato.
Questo programma sostiene nei commenti sulla parte superiore che dovrebbe stampare 10 stelle,
ma non è così.
E sulla base della sua esperienza, o che presto saranno esperienza con C,
si può logicamente discernere perché questo è, infatti, buggy?
Sì?
Pubblico: Si va da zero a 10.
Ecco 11 iterazioni.
SPEAKER 1: Sì.
Così, sta andando da zero attraverso e pari a 10,
che naturalmente è di 11 iterazioni.
Così, sta andando a stampa, infatti, 11 stelle.
Quindi, la convenzione informatica nella maggior parte dei linguaggi di programmazione
è, infatti, solo iniziare a contare da zero,
ma contare fino a, ma non attraverso la valore che effettivamente interessano.
>> Ora, questa è una cosa che prende un po 'per abituarsi
e anche Scratch, progettato come è per i non programmatori o non del computer
scienziati e per i bambini in gran parte, è stato progettato per avere
si inizia a contare in genere a uno.
E questo è bene.
È assolutamente possibile iniziare a contare in uno se questo è più comodo.
E contare fino a 10 e attraverso, ma vi renderete conto in particolare questa settimana
e al di là che proprio così molte cose in programmazione
supporre che 0 è la prima cifra con la quale si contano,
che si sta andando a trovare più facile solo per entrare in questa abitudine di partenza
da zero e contando fino al valore vi preoccupate per questo momento dalla
ottenere andare.
>> Quindi, che è fisso.
Abbiamo cambiato la minore o pari a poco meno di.
Diamo uno sguardo a un secondo esempio qui.
>> Quindi, questo programma anche sostiene nel suo commenta sulla parte superiore che dovrebbe stampare
dieci stelle, ma non è così.
Qual è il bug qui?
>> Così, Cosa-- e mi dispiace, cerchiamo di essere chiari.
10 stelle.
Uno per linea, ma non è così.
Così, infatti, lasciami andare avanti e compilare questo perché è un po 'meno
chiaro sulla base di tale descrizione.
Lasciami andare nella nostra directory di origine.
Fai buggy una barra puntino, un buggy.
OK, vedo 11 stelle, che è ancora problematico,
ma sono anche tutto in una sola riga.
Qual è il problema qui?
Già.
PUBBLICO: [incomprensibile].
SPEAKER 1: Sì.
Quindi questa è una sottigliezza che si può Ricordo facendomi breve cenno.
Anche se tutto sembra piuttosto, ed è ben rientrato,
e che tipo di aspetto Scratch-like in quella linea 16 e 17 sono,
infatti, rientrato sotto quel ciclo for.
Questo è immateriale.
Il computer non lo fa conoscere o vedere lo spazio bianco.
Lo spazio bianco è solo per noi esseri umani, stilisticamente.
Il computer non sapere quando si ha parentesi graffe, che sarebbe, in effetti,
risolvere questo problema.
>> Quindi, se ci siamo andati in e esplicitamente messo in queste parentesi graffe
che sarebbe risolvere questo problema rendendo chiaro al compilatore
che io in realtà voglio eseguire due linee di codice di nuovo,
e ancora, e ancora.
Ma qual è la spiegazione fondamentale?
Destra?
Non abbiamo bisogno strettamente ricci bretelle tutto il tempo,
anche se è probabilmente meglio pratica per entrare in quella abitudine comunque
pur aggiungendo due caratteri al codice. perché?
>> PUBBLICO: [incomprensibile]?
SPEAKER 1: Sì così che è un'altra soluzione del tutto.
Destra?
Soprattutto se a prima vista non lo fai veramente apprezzare ciò che sta succedendo.
Beh, sicuramente potremmo solo fare due cose alla volta
e solo evitare completamente il problema.
E va bene, ma ora, per scopi di oggi, cosa
è la spiegazione per il bug?
Perché erano tutte quelle stelle in una linea?
Sì?
>> PUBBLICO: Sembra che se si dispone di una riga di codice,
lo si può fare senza di quelli.
SPEAKER 1: Esattamente.
Questa è solo una convenzione umana.
Gente si rende conto che si tratta di un po 'fastidioso o noioso
di mettere le parentesi graffe tutto del tempo se tutto quello che volete fare
è eseguire una riga di codice.
Quindi, gli esseri umani hanno deciso alcuni tempo fa, che va bene.
Se vuoi mettere tutti i tuoi ciclo il solo che una linea come questa,
va bene con il singolo virgola alla fine.
Ma si può fare solo una di queste linea senza le parentesi graffe.
>> Così, quando guida di stile CS50 come si punta a,
vedrai che generalmente è buona abitudine
per entrare in questo finché non si è abbastanza comodo randagismo
da questo tipo di convenzioni e fare le proprie cose.
Finché sei sé coerente.
E parleremo di più lo stile un po 'più tardi oggi.
>> Quindi, mi apro un altro programma.
Naturalmente, dovremmo fissare tale 10 pure.
Lasciami andare avanti e scrivere un vero e proprio programma rapido che chiamerò,
diciamo, ciclo dot C. Quindi, cappio dot C. E in loop punto C che ho intenzione di avere,
includere I / O standard dot H int void main.
E ora facciamo solo fare, infatti, un ciclo.
Quindi, 4 int mi viene a zero.
I è meno rispetto, ad esempio, 50.
I più, più.
E poi qui facciamo andare avanti e fare stampare F.
E poi voglio stampare I e una nuova linea, punto e virgola.
>> E questo dovrebbe stampare tutto il numeri da zero fino a 50?
Qualche testa annuisce.
Qualche nn.
Qual è il bug già?
Qual è il facile errore che ho fatto?
Già.
>> PUBBLICO: [incomprensibile].
SPEAKER 1: Sì.
Quindi, anche se sembra come questo è quello che intendo,
Ricordo che mi è anche solo un carattere ASCII.
>> Quindi, se io dico, stampa "io"
Sta letteralmente andando stampare I. Quindi, se io
vogliono plug-in un segnaposto valore che realmente bisogno di fare questo
e poi plug-in valore di I dinamicamente.
Altrimenti Sto solo andando a ottenere 50 I del sullo schermo.
>> Quindi, lasciami andare avanti e fare questo ciclo, eseguirlo,
e, anzi, abbiamo tutti la strada attraverso 49.
E se ho scorrere indietro nel tempo vedo il numero zero all'inizio.
>> Beh, e se io tipo di vite su?
Che cosa succede se faccio questo?
Solo perché non sto pensando.
Che cosa è questo programma.
Una volta re compilato ed eseguito, intenzione di fare logicamente?
>> PUBBLICO: Niente.
>> SPEAKER 1: Niente.
Come mai?
>> PUBBLICO: I è progettato per lo zero.
Così, la condizione è falsa.
SPEAKER 1: Sì, esattamente.
Tutto il codice è corretto, sintatticamente.
Questo compilerà, questo codice verrà eseguito, ma non è
intenzione di fare qualcosa di utile perché io ho inizializzare a zero.
Abbiamo poi controlliamo, è che io superiore a 50?
Ovviamente, no, non lo è.
Così il ciclo non viene eseguito affatto.
>> Che cosa se facciamo qualcosa un po 'più spericolata?
Allora, che cosa se facciamo come int mi viene a zero.
E ora mi ha lasciato usare il tempo cappio, che era un'altra condizione.
E mentre dico, mentre mi è più grande di o uguale a zero, e quindi in qui
andare avanti e salvare il file, fare loop.
E sto per eseguirlo.
Che cosa sono io che vado a vedere questo tempo con un ciclo while?
Già.
>> PUBBLICO: Un ciclo infinito?
>> SPEAKER 1: Un ciclo infinito?
Sì, e perché?
PUBBLICO: Perché è sempre zero.
SPEAKER 1: Sì.
Quindi, io viene inizializzato a zero.
Certo che è sempre più grande o uguale a 0 come risultato.
Così, sto solo andando a vedere questo infinitamente.
E ora, questo è venuto una volta o due volte alla testa del corso.
Cosa succede quando si avere un loop infinito?
>> PUBBLICO: Controllo C.
SPEAKER 1: Sì.
Così Controllo C alla fine risponderà.
Purtroppo, abbiamo stampato fuori milioni e milioni di zeri già
e quindi il computer ha tipo di avuto davanti a me.
Così, sta andando a ignorare me per un po '.
Ma se hai appena colpito di controllo C alcuni volte sulla tastiera Mac o PC,
infine va, infatti, terminare.
E se no, vi mostreremo alcuni tecniche prima lungo dove si
può effettivamente forzatamente uccidere i programmi, molto simile a Windows e Mac OS,
in caso di necessità.
Ma proviamo qualcosa di diverso.
Facciamo in realtà incremento I. Is questo ancora in corso di essere infinito?
Lasciami correre questo.
E ora è possibile tipo di vedere cosa succede.
Anche questo è un ciclo infinito.
Ma questo è un po 'una domanda trabocchetto.
È questa intenzione di stampare i numeri per sempre?
>> PUBBLICO: No.
SPEAKER 1: No.
Perché?
Ho sentito alcune nn qui.
Someone-- Già.
PUBBLICO: Non avete abbastanza bit per mantenere realmente accadendo.
SPEAKER 1: Va bene.
Quindi io non ho abbastanza bit per andare avanti.
Allora, che cosa succederà?
E 'solo andando a smettere?
>> PUBBLICO: Ad un certo punto si chiuderà the--
SPEAKER 1: Sarà chiusa il ciclo verso il basso, ma perché?
Che cosa succederà al fine dei suoi confini?
Sì?
PUBBLICO: Sarà ciclo torna a numeri negativi.
SPEAKER 1: per i numeri negativi, o se eravamo solo trattando positivo,
a zero almeno.
Quindi sì, assolutamente.
Ricordiamo che abbiamo visto la scorsa volta che se si incrementare le vostre punte una volta di troppo,
e lì Forè trabocco la capacità di int
o qualunque sia il tipo di dati è, sei andare per avvolgere, probabilmente,
due numeri negativi.
O se avete specifica che il vostro gamma dovrebbe essere solo positivo,
che si può fare, ma non abbiamo ancora visto che,
si potrebbe finire almeno torna a zero.
Anche se, in realtà sì.
In questo caso, negativo numeri, nel qual caso
il loop sta per terminare perché non è, infatti,
maggiore o uguale a zero se esso è negativo.
>> Così, purtroppo, come lungo avremmo dovuto aspettare?
In questo momento stiamo facendo cosa, 2 milioni-ish?
Siamo come 2 miliardi, stiamo andando a dover aspettare
fino a quando si può effettivamente vedere questo sintomo.
Ma vediamo un po 'più veloce, maybe-- vediamo se possiamo interrompere.
Avanti.
Anche i menu appaiono lentamente.
Tutto ok.
Quindi, noi torneremo a che tra non molto.
E 'una buona tempo-- dannazione, cuccioli.
>> E 'un buon momento per alcuni annunci.
Quindi, se ti avrebbe fatto piacere di impegnarsi in YHack,
che è un evento essendo sponsorizzato da nostri amici a Yale.
E, infatti, alcune corso di TF a Yale sono coinvolti con questo.
YHack è un'organizzazione internazionale Hack-a-thon ospitato da e tenuto
a Yale, che riunisce 1.500 come hacker mentalità e creativi tutti
il mondo.
Se questo è di interesse, date un'occhiata qui.
Se questo è troppo breve sulla schermo, dare un'occhiata a diapositive di oggi
per l'URL per yhack.org.
Quindi, anche alcune brevi annunci.
Così, ufficialmente sezioni inizieranno la prossima settimana sia qui e New Haven.
Tenete a mente sarai sempre un e-mail entro la fine settimana più probabile.
Ci vuole molto tempo per CS50 alla sezione,
dato tutte le persone nel classe e tutti muoversi.
E tutte le Fellows Insegnamento ' orari sono anche ancora consolidando,
ma rimanete sintonizzati per una e-mail e, se necessario essere, è possibile ri-sezione ci sarà dopo.
>> Study.cs50.net.
Quindi, anche se si è un partecipante costante a sezioni, rendersi conto che quasi tutti
delle risorse che usiamo nelle sezioni sono a disposizione del pubblico presso CS50
Studiare in questo URL qui.
Quindi, se avessi mai desideri ri recensione materiale da parte, o leggere avanti,
o non si può fare qualche settimana, rendersi conto che le diapositive di esempio,
e problemi, e le definizioni, e più sono tutti lì.
>> Orario di ricevimento riprendere oggi, e domani, e Mercoledì,
Giovedi e controllare il corso del sito web per la pianificazione.
>> Ed anche, ora lanciando oggi è CS50 discutere.
Quindi, se e quando avete domande per l'altro o per il personale del corso,
e sono generalmente lavorando su qualche problema proposto,
rendi conto che non si necessariamente devono rivolgersi al umana successivo.
Se non c'è nessuno lì, è possibile entrare in contatto con noi e compagni di classe
online tramite CS50 Discutere.
Così, questo è un discussione bordo per il corso,
e rendersi conto che questo è forse il migliore
punto di partenza quando si ha domande quando al di fuori degli orari di ufficio
in particolare.
>> Pranzo al sacco si avvierà anche questa settimana.
A Fire and Ice [Incomprensibile] a New Haven.
Date un'occhiata al corso di sito per RSVP.
Primo arrivato, primo servito per questo.
Se non si ottiene in questa settimana faremo questi la maggior parte ogni Venerdì
durante il periodo.
>> OK, e ora una parola sulla classificazione.
In particolare, come si entra problema impostare uno, che è uscito questa settimana,
e problema impostare due e da allora in poi.
Come facciamo a valutare serie P e la valutazione della qualità della stessa?
Quindi, è quattro assi che usiamo nella CS50, e sono questi quattro qui.
>> Campo di applicazione, che cattura su una numerica base quanta del set P
avete affrontato.
E 'corrisponde approssimativamente con sforzo, ed è il nostro modo di catturare
Hai provato la metà della P set, tutto l'insieme P.
Si tratta di un compito facile per ottenere perfetta punteggi se si fa, infatti,
provare ogni aspetto della serie P.
Quindi, tenere a mente.
>> La correttezza è esattamente questo.
Il vostro lavoro codice come la specifica e come soluzione del campione il personale '
suggeriscono che il codice deve, infatti, lavorare.
Controllare 50, se non l'hai incontrata tuttavia, è in P impostare una specifica
e la volontà generale dare sì / no risposte
come se il codice è corretto.
Almeno per quanto stiamo andando valutarlo sulla base dei test
che si corre all'interno di tale programma.
>> Il design è molto più soggettivo.
Questo è il modo in cui è scritto il codice.
E questo è qualcosa che si arriva meglio a passare del tempo,
ed è qualcosa che faremo fornire più feedback qualitativo su.
E in base alla progettazione potrei significa prima di tempo si
potrebbe essere tentato in qualche P set di fare qualcosa loopingly,
ma per avere forse tre, o quattro, o cinque cicli anteriori nidificati o mentre annidato
loop.
Questo dovrebbe avvenire in generale iniziare a fare rabbrividire
e sarebbe generalmente progettazione male considerato.
E si inizia a vedere in classe e di classe buoni modi di fare le cose,
cattivi modi di fare le cose che potrebbero essere tutti corretti, ma non
necessariamente ben progettato.
Come scrivere un saggio.
Potreste essere in grado di mettere le parole su un Pagina che sono grammaticalmente corretta,
ma il saggio o il Tesi sono in è solo
completamente incoerenti o poco convincente.
E così che potrebbe essere l'analogo mondo scritto di progettazione buona o cattiva.
>> E lo stile, troppo, è abbastanza soggettivo.
Ma almeno ci aspettiamo coerenza.
Questo è il modo piuttosto è il vostro codice.
Sono cose ben rientrati?
Sono le variabili così dette / Sono tutti dei tuoi parentesi e parentesi graffe
allineato come dovrebbero essere?
Abbiamo una guida di stile CS50 come il problema insieme si punta a.
Quelli più confortevole sono benvenuto ad allontanarsi da quel
fino a quando si sono auto coerente.
E anche questo è una lezione ci rafforziamo nella sezione.
Quindi, se tutto questo era un po ' veloce, realizzare il set di P e le sezioni
andrà più in profondità in breve tempo.
>> Ma in generale abbiamo molto paio di secchi per CS50.
I punteggi sono generalmente su scala da uno a tre, o uno a cinque.
Siamo literally-- e non posso dire questo abbastanza nella prima settimana.
Tre è buono.
Così, anche se, sì, tre su di cinque normalmente, matematicamente,
potrebbe essere un 60 percento o meno come un D.
Tre è, infatti, buona.
E, in effetti, ci aspettiamo la maggior parte degli studenti della classe
per iniziare la termine intorno gruppi di due, o tre, o quattro.
Probabilmente non così tante cinque.
Non troppe quelle.
Ma in generale per iniziare a sweet spot che nella curva
in modo che il passare del tempo, c'è in realtà spazio per,
e le opportunità per la progressione superiore.
Quindi, per favore non equiparare a tre con il 60%.
E 'molto più astratto di quello.
La formula con cui calcoliamo gradi è la seguente ponderazione.
Correttezza vale di più.
Design è la pena un po 'meno.
Stile vale un po 'meno.
E questo in genere cattura la quantità di tempo
che va in ricevendo ogni di questi assi giusto.
Lo stile è super facile, dovrebbe essere super veloce,
ma è un semplice vizio a diventare pigri circa.
Correttezza potrebbe prendere si maggior parte del tempo.
Inseguire alcuni potrebbero bug prendere quell'ora in più o più,
e così, il punteggio in ultima analisi, che cattura.
E così, ora una parola più grave.
Dal momento che ha il CS50 distinzione, per una migliore
e nel male, di essere forse meglio conoscere
con i temi della accademico onestà che la maggior parte qualsiasi altro corso.
E in effetti, è a mia conoscenza che inviamo più studenti, purtroppo,
a fini disciplinari ogni anno in seguito. Così,
nell'interesse della piena divulgazione, parliamo brevemente
su ciò che accade nella CS50, e ciò che si può fare, e quello che si può essere consapevoli di.
>> Quindi, qui dal 2007, quando Ho ereditato il corso,
è il numero di casi annuncio consiglio.
Ad Board è disciplinare di Harvard corpo, o ora il Honor Counsel,
a quali casi si riferiscono quando studenti fanno qualcosa che il corso di
programma considera irragionevole.
Non c'è nessun modello reale qui, direi.
Si oscilla sopra la anni ma generalmente
questo è il numero di casi che si riferiscono.
Il numero di studenti che sono coinvolti?
Anche Esso varia.
In genere, l'anno scorso per esempio, 29 studenti di Harvard
Ad fosse imbarcato, per così dire.
29 di loro studenti in corso, Due di loro studenti precedenti,
che stavano collaborando in qualche modo indesiderato.
E poi in termini di percentuale, di solito è circa il 3%
della classe che, purtroppo, rende questo tipo di decisioni.
>> Così, lo scorso anno è stata del 3,5% del corpo studentesco di CS50
che era Ad imbarcato, per così dire.
>> Allora, che cosa significa tutto ciò?
E che cosa effettivamente fare?
>> Così, per completezza di informazione, si assolutamente, come gli informatici,
avere strumenti software a nostra disposizione ed è molto facile per noi, in tutta onestà,
che di altri compagni di classe che non sono attraversare queste linee di attraversare confrontare
ogni presentazione di quest'anno contro ogni presentazione per gli ultimi otto anni.
Software fa questo.
E alla fine è occhi umani che decidono
o meno di sottoporre alcuni importanza per l'ulteriore aggiudicazione,
ma software aiuta certamente.
E questo, francamente, è per questo che penso abbiamo così gran numero di CS50.
Non è perché CS50 studenti o studenti CS più
generalmente sono meno onesti di tutti gli altri studenti,
è solo che abbiamo la strumenti e le tecniche
con cui prendere questo primo passaggio.
>> Ma noi tenere d'occhio su tutte queste cose
così, ancora una volta, nell'interesse della riconoscendo il lavoro che è stato messo
in da un super maggioranza della classe.
E la politica del corso sull'onestà accademico,
anche se è un po 'di punti lungo con un gruppo di proiettili
che sono si spera abbastanza leggibile, è davvero non si riducono ad essere ragionevole.
E la migliore regola empirica che offriamo all'interno del programma
è questo, l'essenza di tutto il lavoro che si
presentare a questo corso deve essere il vostro.
E infatti, in quasi tutti quelli Nei casi di cui per l'azione disciplinare
è stato a causa di qualche studente tarda notte tipicamente girò il suo codice
sopra a titolo definitivo per un compagno di classe, che poi lo ha adottato
nella sua interezza o significativamente stessa.
>> Ma in realtà, questo è OK.
E infatti, presso l'ufficio ore, i fogli di carta
sei stato consegnato se siete venuti da ufficio ore la scorsa settimana incoraggia tanto.
Sei assolutamente ha accolto con favore e incoraggiato
per discutere di insiemi di problemi con i compagni.
Per aiutare l'un l'altro quando inciampo.
Ma in generale la regola generale dovrebbe essere questo, "quando si sta chiedendo aiuto,
è possibile mostrare il proprio codice agli altri, ma non si può visualizzare la loro. "
Quindi, in altre parole, se sono alle prese con alcune serie P
e mi sono seduto lì in sala da pranzo, o in biblioteca,
o in aula cercando di trovare qualche difetto,
Posso certamente mostrare il mio codice sul mio schermo
per la persona seduta accanto a me, sicuramente il personale,
ma anche un compagno di classe.
Ma se la soluzione che mio compagno di classe offre è, oh,
qui basta dare un'occhiata a ciò che L'ho fatto, che attraversa la linea.
>> E oserei dire che è generalmente una cosa ragionevole per la maggior parte delle persone
di individuare facilmente la linea di.
E così, vedi il programma per maggiori dettagli.
E ora uno dei più aspetti controversi
di CS50 programma che ho pensato io avrebbe parlato al termine qui
è la cosiddetta clausola di rimpianto.
Quindi, ecco tutta la stampa fine.
Ma in generale abbiamo visto negli ultimi 8 anni e più
che, in effetti, quasi tutti CS50 di i casi di disonestà accademica
sono stati il ​​risultato di appena povero il processo decisionale a tarda notte.
Il risultato di stress, il risultato di mancanza di alimentazione, la mancanza di sonno,
troppi set P, troppi scadenze, troppi impegni.
Lo stress costruire in 02:00, 03:00 AM, 4:00, con una scadenza incombente.
La maggior parte degli studenti in questi casi hanno appena fatto decisioni sbagliate
che potrebbero molto bene rimpiangere il mattina successiva se non minuti più tardi,
ma fino all'anno scorso non c'era valvola di rilascio che questi studenti potrebbero
in realtà aprono per affrontare realmente il problema di petto, senza timore di essere
avviato dal collegio del tutto.
>> E, in effetti, abbiamo introdotto questa clausola rammarico l'anno scorso,
che dice che se entro 72 ore, tre giorni,
di attraversare qualche linea fissato nel programma
ti presenti per uno dei corsi di testa e avremo una chiacchierata su di esso.
Ci sono ancora essere qualche risultato, contrariamente a ciò che è
stato riferito al contrario.
C'è ancora qualche risultato che è azionabile dal corso,
generalmente azzeramento una serie P o prendendo qualche altra azione,
ma ci sarà, infatti, gestire noi stessi e non
vedere più in alto fosse il risultato potrebbe essere molto più gravi.
E, in effetti, di condividere ciò che è accaduto lo scorso anno, negli otto anni, e ora
nove anni, di insegnamento questo corso e dopo armeggiare con diverse manopole,
girando varie manopole negli ultimi diversi anni sul onestà accademica,
e vedendo per i dati non apparente impatto, anche di interventi di questo tipo,
questo è stato senza dubbio la cosa migliore abbiamo introdotto pedagogicamente
in otto anni insieme queste linee in CS50.
>> 19 studenti si fecero avanti sotto questo punto l'anno scorso.
Abbiamo preso alcuna azione per sette di questi studenti,
determinare che erano inutilmente preoccupato.
Non avevano, infatti, attraversato una linea, ma
era una buona chiacchierata di avere comunque.
Abbiamo azzerati 11 dei punteggi che sono state presentate.
E in un caso abbiamo chiesto un studente a fare un problema set.
Ma più interessante, onestamente, con questi 19 chat,
che era molto più di quanto mi dovrebbe avere, ciascuna di esse
10 minuti per forse un ora lungo, portato anche
alla luce una serie di questioni in materia di problemi familiari, problemi di amico,
problemi di salute mentale che poi fidanzati,
con la benedizione dello studente, residente decano, o con gli amici, o qualsiasi altro numero
di risorse di supporto.
In modo che questo è stato di gran lunga uno dei migliori usi del nostro tempo
e uno dei migliori interventi.
>> Detto questo, non aveva ingresso sul tasso di individuazione
di disonestà accademica, più in generale.
E oserei dire, questo sottogruppo di studenti dello scorso anno
era un demografica che ci precedentemente mai identificato prima
e non aveva mai legato prima.
E così, questi erano meravigliose storie di successo
anche se sono stati portati alla luce in meno di condizioni ottimali.
Quindi, tenere questo in mente come si fanno, forse,
qualche decisione sbagliata te a tarda notte,
che si ricorre così lungo come lo studente in quella situazione
possedere e farsi avanti in modo che possiamo avere questo tipo di chat ed affrontarla
in un modo che è educativo, e poi possiamo mettere dietro di noi il giorno successivo.
>> Quindi, senza ulteriori indugi, prendere il bordo al largo di questa conversazione,
il motivo per cui i cuccioli sono in su è solo per rompere il ghiaccio per un istante.
E purtroppo, sono tutti sonno, ma quello che doveva accadere qui
era tutto doveva di soggezione e tipo di relax
dopo quella molto pesante conversazione.
Ma a quanto pare ho messo i cuccioli a dormire.
Ma se si va a CS50 di cuccioli sito oblique,
è possibile vederli tutto il giorno.
In particolare forse 02:00, o 3:00, o 4:00 di notte
per vedere un sollievo dallo stress po 'là.
In modo che SLASH cuccioli.
Tutto ok.
Non era così divertente?
OK.
Quindi, tornando a qualche calcolatore scienza, se posso.
>> Quindi, ricordare che l'ultima volta abbiamo iniziato non guardare solo a principale, che
era la funzione predefinita, il cui bandiera verde cliccato equivalente,
ma abbiamo anche iniziato brevemente scrivendo alcune delle nostre funzioni.
E finora nessuna di queste funzioni sono stati particolarmente grandi o carnoso.
Otterrete in quelli più grandi funzioni probabilmente, P set 2, P set 3,
sicuramente P impostato 4 e successivi.
In questo momento la maggior parte dei vostri programmi, se non tutti, sicuramente per P
set 1 può essere fatto interamente in principale.
Se il programma è solo cinque linee, 10 linee,
lungo anche 20 linee, perfettamente ragionevole di scriverlo
tutto in principale e non a complicare il codice, ma quello che stiamo facendo oggi
e poi sta cercando di anche introdurre alcune tecniche di progettazione buone
in modo che il tuo codice ottiene più complicato e come i problemi
si vuole risolvere ottenere di più e più interessante che hai, una sorta di,
gli strumenti nella vostra cassetta degli attrezzi con cui per progettare buone soluzioni a quelle.
>> Quindi, diamo un rapido sguardo indietro a l'applicazione dalla mia ultima settimana, che
era funzioni zero virgola C. E notare che, molto semplicemente,
sembra che questo con due funzioni, principale e il nome di stampa.
E ripensando o forse reverse engineering oggi,
quello che era la motivazione per l'introduzione una funzione in linea 28 chiamata,
nome di stampa?
O che cosa era questo un esempio di a termini di un principio o da asporto,
se tu volessi.
Alcuni mormora.
Che cosa?
>> Sì decomposizione così funzionale è una specie di modo elegante per dire,
scomporre il vostro programma nelle sue parti costituenti
e quindi utilizzare quelle parti per assemblare un intero.
Quindi, anche questo è solo tipo di già un boccone,
ma questo è forse anche un esempio migliore di qualcosa
appena chiamato astrazione.
Destra?
Astrazione sta per essere uno dei temi ricorrenti in CS50
e anche informatica più in generale poiché è
una tecnica con la quale è possibile risolvere problemi in modo più efficace perché si
può scrivere soluzioni più intuitivo e in un modo che scale
ed è comprensibile da altre persone.
Cosa voglio dire con questo?
>> Quindi, forse è molto più leggibile per guardare un programma come questo,
Super Short anche se è.
Quando si vede sulla linea 22 che non c'è una funzione chiamata, il nome di stampa.
Solo che il nome dice quello che fa.
Tale funzione prende apparentemente ingresso tra le sue parentesi,
e lo fa a quanto pare qualcosa, stampa presumibilmente il nome.
E così, anche se siamo assolutamente potrebbe avere
fatto quello che abbiamo fatto una settimana fa, che è stato basta prendere questa riga effettiva di codice,
sbarazzarsi di questo, e ottenere liberarsi di questo insieme,
noi sorta di astratte via la nozione di stampa di un nome.
Non mi importa se si sta utilizzando stampa def.
Non mi importa se si dispone di un S per cento e una barra rovesciata N. Questi
sono dettagli incredibilmente arcani.
Quello che mi interessa come programmatore sta stampando un nome.
E così, quale modo migliore per farlo che chiamando una funzione, nome di stampa?
E così, quella era una delle motivazioni per fare qualcosa di simile.
Rendere il codice più leggibile, più riutilizzabile, e anche auto descrittivo.
Ora, diamo un'occhiata un altro esempio,
che era uno funzioni, che abbiamo dovuto qui.
>> Quindi, questo è forse ancora più interessante perché, in questo caso,
Io non voglio solo ottenere un int.
Voglio ottenere un int positivo.
E si scopre per ottenere un positivo int devi fare un po 'di noia.
Destra?
Non è una semplice una linea chiamare come il nome di stampa è stato,
che è certamente meno convincente.
>> Per ottenere un int positivo, logically-- mi permetta di scorrere verso il basso per nascondere questo.
Cosa devi fare?
Come tutti gli strumenti che hanno al momento sono
cose come stampa def da standard Biblioteca e anche dalla biblioteca CS50
abbiamo Get Int, e Get Float, Get Long Long, Get String,
ma l'unico, Germane, in questo momento è Get Int.
Quindi, se l'unico strumento che avete nella vostra cassetta degli attrezzi è Get Int,
come andiamo circa l'attuazione esso per ottenere int positivo?
>> PUBBLICO: Creare un registro e verificare se l'ingresso che hanno dato
è stato positivo o meno.
>> SPEAKER 1: Perfetto.
Esattamente.
Un altro strumento che abbiamo nel nostro cassetta degli attrezzi da una o due settimane fa
è solo il costrutto iterativo.
E così, sì, se si usa un po ' loop, o un ciclo Do While, o anteriore
anello probabilmente potremmo ottenere via con qualsiasi di quelli in qualche forma.
Siamo in grado di implementare il concetto di get int positivo da solo utilizzando Get Int,
e poi continuate a chiamarlo di nuovo e mantenere importunare l'utente
fino a quando lui o lei in realtà ci dà quello che vogliamo.
>> E così ora, questo estrazione di processo
di ottenere un int positivo in una funzione denominata
Ottenere Positivo Int è un po 'più irresistibile perché guardare a questo.
Questi sono come 10 più linee di codice che
sono necessari per avere un int positivo, e io non mi interessa come lo fai.
Tutto quello che importa è che si può farlo, e così ho
nascosti tutti questi dettagli dietro un funzione chiamata Get positivo int che,
anzi, ha questo do while.
>> E vedere la settimana scorsa per la sintassi lì, ma dichiara semplicemente N,
e stampa il istruzioni per l'utente.
Si chiama Get Int e poi controlla nuovo questa condizione, e di nuovo,
e di nuovo fino a quando l'utente collabora.
>> Così ora, un paio di controlli di integrità.
Per coloro che forse familiare con un po 'di programmazione,
perché è dichiarata N, perchè creo N al di fuori del ciclo Do While?
Perché è sulla linea 29 e non su come 33, per esempio.
>> PUBBLICO: Perché quando si dichiararla fuori, tipo
di più, il più grande scope--
>> SPEAKER 1: Good.
>> PUBBLICO: --e se si dichiara all'interno del ciclo, [incomprensibile]
perché non sa a questo proposito.
SPEAKER 1: Esattamente.
Se posso simplify-- si tratta di un problema di portata.
E la portata si riferisce al contesto in che esiste una variabile o è utilizzabile.
E la bella regola generale è che generalmente quando si dichiara o si crea
una variabile si può utilizzare solo all'interno dei più vicini abbracciare parentesi graffe.
Che cosa significa?
Se io, invece, annullare questa e vado con qualcosa che si sente un po 'più semplice.
Destra?
>> Linea 32 sembra proprio pulito a me ora.
Sto facendo entrambe le cose una volta e poi assegnando
la mano destra alla mano sinistra.
Il problema ora basato su tale definizione del campo di applicazione
è che N può essere utilizzato in linee 31 e 32 all'interno di questo ciclo,
ma dove in tale definizione può non essere utilizzato?
In linea che cosa?
Già.
>> PUBBLICO: 35.
>> SPEAKER 1: 35.
Sicuramente non 35.
E anche dove altro?
PUBBLICO: 34.
SPEAKER 1: Anche 34 è problematico perché è
al di fuori delle parentesi graffe.
E così in effetti, vediamo cosa succede.
Destra?
Questo potrebbe sembrare un po ' intuitivo o non potrebbe,
ma vediamo che cosa il compilatore ha da dire quando
andiamo nella directory sorgente di oggi.
Far funzionare uno.
Dio mio.
Beh, ho finalmente finito che, tra l'altro.
Tutto ok.
E qual è il problema qui?
Molto arcano da guardare.
Ma ecco cosa ho typed-- far funzionare uno.
Ecco cosa fare indotta, che è in realtà
usando il compilatore clang con alcune di quelle bandiere
che vedremo di nuovo in poco tempo.
E ancora, sempre guardare al primo errore,
perché potrebbe semplicemente avere una cascata effetto senza senso su altre linee.
>> Quindi, che cosa questo significa è che il problema è in funzione 1.c.
E 'sulla linea 32.
Ed è a colonna, o un carattere, 13.
Così, quando il vostro editor di testo che possono aiutare a identificare dove il problema è.
Quindi, se ho scorrere verso l'alto, che cosa è la linea 32?
Questo è infatti questo uno che è già evidenziato
n variabile destra qui-- inutilizzato.
Ma non è inutilizzato.
Io sto usando.
Ma il compilatore del confuse, perché esiste solo all'interno di questo campo di applicazione.
E quindi non posso usarlo qui.
Non posso usare qui.
E il compilatore, quindi, non interessa nemmeno che sto cercando.
Sembra essere inutilizzato nel suo ambito attuale.
>> Così possiamo ampliare il campo facendo esattamente quello che abbiamo iniziato with-- int n.
E anche se non è così guardare elegante, forse,
e noi stiamo prendendo una linea supplementare qui, ora è portata ovunque.
Quindi cerchiamo di riprovare.
Quindi, far funzionare uno.
Bello.
E ora, se io se corro funzione uno, diamogli negativo 10,
negativo 1, 0, 1, e in effetti funziona.
>> Quindi c'è un'altra soluzione qui.
Sai cosa?
Cosa devo fare se sto veramente lottando con questo?
Non so dove la n Dovrebbe andare.
Sai cosa?
Sto solo andando a mettere tutto il modo nella parte superiore del mio file qui.
Cosa sarebbe questo fare, cosa ne pensi?
Sì?
>> PUBBLICO: [incomprensibile].
SPEAKER 1: Sì.
Così ho fatto che globale, per così dire.
Se si dispone di una variabile che è al di fuori tutte le funzioni che è consentito,
e il codice dovrebbe compilare, e n sarà ora accessibile non solo in get
int positivo, ma anche in cui main-- è un po 'preoccupante perché c'è
già una n in principale, in modo più on che in un moment--
ma questo sarebbe considerato cattivo design.
Tutto ok.
Se si deve ricorrere a qualcosa di simile, oh, io sarò
appena messo qui perché il codice sembra compilare
non è generalmente la migliore pratica.
Piuttosto si desidera scegliere la più stretta possibile campo di applicazione
per le variabili, il che significherebbe andare con il nostro progetto iniziale, che
è proprio qui.
>> Ora, come un a parte, se aveste un identico nome variabile qui,
il modo in cui c avrebbe gestito questo-- anche se questo non accadrà troppo often--
è che questo è ancora perfettamente bene qui.
Ma questa definizione di n in linea 22 sarà ombra quello globale.
Quindi questo lavorerà all'interno principale, e quello globale
sarà effettivamente applicabile quando sei in ottenere int positivo, ma più su quello
un'altra volta, ma solo per i curiosi.
>> Così, in breve, possiamo risolvere questo problema qui.
Ora diamo tease oltre altri due pezzi prima di guardare uno ultima riga di codice
in questo programma.
Ottenere int positivo.
Sul lato sinistro la sua parola è la parola int.
Che cosa significano ne pensi?
Finora abbiamo visto per lo più vuoto.
Sì?
>> PUBBLICO: E 'il tipo di variabile che si sta chiedendo.
>> SPEAKER 1: Sì E 'il tipo di, mi permetta Non dire variabile, ma il tipo di valore
che sto chiedendo indietro per.
E in effetti, questo è intuitivo qui, si spera.
Destra?
Se si vuole ottenere un int positivo, che cosa è che si
desidera che il function-- come il nostro volontari della scorsa settimana
a portata di mano si torna un pezzo di carta con un int su di esso?
E così abbiamo specificato che il tipo cosiddetto ritorno di questa funzione
è ottenere int positivo.
Se non volevamo a restituire nulla, si dice nulla.
Se si desidera per tornare una stringa, si dice corda.
Se si desidera per tornare un galleggiante, dici galleggiante.
Ma l'unico che si applica qui logicamente, perché sto utilizzando get int,
anche se sto limitando a valori positivi, è quello di restituire un int.
>> Quindi al contrario, che cosa vuol dire che c'è un vuoto tra parentesi?
Che cosa le parentesi generalmente definire?
Sì?
>> PUBBLICO: significa che la funzione del in realtà non ottenerlo.
>> SPEAKER 1: significa che la funzione del in realtà non ottenere ciò?
>> PUBBLICO: Un ingresso.
>> SPEAKER 1: Un ingresso, qualunque.
Così in effetti, se la parentesi qui si specifica nulla,
questo significa solo che non voglio alcun input.
Mi occuperò del problema me stesso.
E in effetti, non c'è bisogno di dire ottenere qualcosa int positivo.
Basta dire, arriva int positivo, e che la funzione si spegne e fare la sua cosa.
>> Ma c'è stato un piccolo trucco ho giocato qui tutto questo tempo
per assicurarsi che questo codice venga compilato.
Si noti che int-- ottenere positivo int void-- è sulla linea 27.
Ma per qualche motivo apparentemente strano è anche qui sulla linea 16.
E per buona misura Ripeto questo quindi è perfettamente identica.
E ho detto prototipo con un piccolo commento di una sola riga.
Cosa succede se elimino che, E ora eseguire nuovamente fare la funzione 1, entrare.
Ops.
Apetta un minuto.
Dov'è il mio conto?
Eh?
Stand-by.
Far funzionare 1.
Ci siamo.
OK.
Non aveva salvato correttamente.
Quindi, penso che ci sia un po ' bug qui dove io non sono
vedere il nome della scheda al momento.
Così che cosa sta succedendo qui?
Dichiarazione implicita di funzione ottenere int positivo è valido in C99.
Così confondendo di nuovo.
Così che cosa è questo indicativo di?
Beh, si scopre che C è abbastanza stupido.
Beh, è ​​la programmazione lingua, o meglio, il compilatore è.
Si sa solo quello che hai insegnato, ed è solo
andando a sapere qualcosa se hai insegnato prima.
In altre parole, principale, al momento, sono
cercando di chiamare una funzione chiamato get int positivo.
Ma il compilatore non sta andando notare che ottenere int positivo
esiste fino a quando la linea 26.
E così quello che il compilatore non è solo errori non appena si arriva alla linea 17,
dicendo dichiarazione implicita di ottenere int positivo, che
è solo un modo elegante per dire, non lo faccio sa cosa ottenere int positivo è ancora.
>> Altri linguaggi come Java e Python e Ruby potrebbe guardare avanti.
C non lo fa.
E così il modo in cui fissiamo questo è uno dei due modi.
Uno dei due, se il problema è che ottengono int positivo non è stato mai visto prima,
bene, vorrei solo spostarlo verso l'alto.
Che sarebbe risolvere il problema.
Ma in generale, è considerato tecnica migliore
per mettere la vostra funzione principale per lo superiore, in modo che un essere umano a leggere il codice
sa cosa fa il programma, perché principale non è sepolto tutto
il modo in basso o in mezzo.
E 'in cima.
In modo che non si sente l'ideale.
E si può effettivamente ottenere in situazioni in cui
se chiamate uno di funzione un'altra, che richiama un altro,
si può ottenere in un problema in cui nessuno dei due può andare sopra l'altra, logicamente.
Non è solo possibile.
>> E così il modo di lavorare intorno a questo è quello di prendere solo
la firma della funzione, per così speak-- la prima linea dove è declared--
e basta copiare, incollarlo al top, ma non con braces-- ricci
solo con un punto e virgola.
E 'come un piccolo suggerimento di quello che verrà.
Ed infatti, tutto questo tempo in cui ho visto cose come io.h norma
e cs50.h, analogamente, in quei punti h file ci sono altri prototipi.
E vedremo che tra non molto.
>> Così, in breve, quando si dispone di un programma in un file con funzioni multiple
oltre principale, è quasi sempre voglia di dichiararli
solo a titolo di loro prima linea, seguito da una virgola,
in cima del file.
Che era un sacco tutto in una volta.
Qualsiasi domanda?
Tutto ok.
>> Quindi cerchiamo di andare avanti allora a qualcosa come la tosse.
Oh.
Come raccordo.
Tutto ok.
Tosse.
Così qui è una c realizzazione di un programma
abbiamo fatto l'altro giorno in Gratta e Vinci che molto semplicemente
dice tosse, tosse, tosse.
Tutto ok.
E qualcuno ha detto un paio di giorni fa, che non c'è
un modo di pulire questo codice già.
Tutto ok?
Non appena si sta copiando e incollando probabilmente cattivo design.
Almeno una volta si arriva a quattro o cinque o 20 colpi di tosse, si sente cattiva pratica.
Dobbiamo solo continuare la copia, incolla.
Qual è la soluzione più ovvia per la pulizia di questo programma su?
>> PUBBLICO: Loop.
>> SPEAKER 1: Sì.
Quindi, utilizzare un ciclo.
E possiamo usare un ciclo for, un po ' loop, qualsiasi numero di approcci.
E in effetti, questo è ciò che facciamo in versione uno qui.
Ho invece riscritto nella versione uno di cough.c
essere solo tosse all'interno di un ciclo for.
Va bene, ma c'è un possibilità ora di tipo di avvio
per la progettazione di questo un po 'più come la lezione che ha insegnato un momento fa,
che è questo-- supporre che volevo per creare una funzione denominata tosse,
prendiamo in considerazione solo per un attimo che cosa è andare a guardare come.
Quindi, se voglio qualcosa a tossire, ho solo bisogno
per usare la stampa f all'interno della funzione.
E in effetti lo sono.
Ed infatti, tutto questo tempo, ogni volta che sei
la stampa a qualcosa lo schermo, un programmatore
chiamerebbe che un effetto collaterale.
Non è porgendomi indietro qualcuno un valore.
E 'me prendendo qualche azione che potrebbe essere visivamente evidente.
Ma questa funzione tosse, fa ritorno nulla sulla base della sua prima linea?
No, perché il suo tipo di ritorno è nullo, il che significa che solo
non mi sta consegnando nulla in cambio.
Si potrebbe fare qualcosa visivamente, ma è non mi consegna
eseguire un pezzo di carta come la settimana scorsa.
>> Ha bisogno di alcun input?
No.
E così è vuoto anche qui.
Così anche questo è una specie di over-engineering di questo problema.
Destra?
Ho fatto il programma più complessi, più righe di codice,
Non ho fatto alcun più funzionale, ma questo
sarebbe un trampolino di lancio, forse, per una più ampia
contesto con il codice più complicato.
Ma che dire di questo?
Cosa ho done-- solo guardando questo senza guardare il commento
in cima alla quale hanno file-- Io fondamentalmente fatto qui con la mia tosse
implementazione che è diverso?
Sì, a schiena?
>> PUBBLICO: Make it in modo da poter hanno un carattere spegnere.
SPEAKER 1: Sì.
Quindi, questo si sente una specie di piacevole.
Destra?
E 'come l'aggiunta di una funzionalità per la vostra programma o la funzione, in questo caso.
Restituisce ancora niente.
Si può avere un effetto collaterale visivo, perché sta chiamando stampa f.
Ma ora ho parametrizzata la funzione, che
significa che hai specificato preso Ingresso di tipo int e chiamarlo n,
ma ho potuto chiamare tutto quello che voglio.
In realtà, potrebbe essere solo volte per essere ancora più esplicito.
E poi ho potuto solo cambiare questo qui.
Ma il punto è che questo è come io creare una funzione che prende in ingresso.
E se vi ricordate flipping attraverso forse in linea in uno
dei walk-through, il quarto e l'esempio tosse finale,
si noterà qui che ho generalizzate il mio codice tipo further-- di astratto
ulteriormente.
Come la tosse e starnuti, entrambi sono su come dire qualcosa o fare
certo tipo di suono.
Salva sarebbe la corrispondente blocco Scratch.
E così quello che ho fatto in questa versione, che possiamo solo sguardo a,
è tosse è proprio come dire, [TOSSE], tosse, e nel frattempo, starnuti è
come dire, [ACHOO].
E così ho generalizzato l'attuazione di quelli
ormai attuazione questa funzione generica,
dire che è interessante per scopi di oggi
solo perché ancora non ha un tipo di ritorno.
Ma quanti ingressi ha?
PUBBLICO: Due.
SPEAKER 1: Due.
E così, se si vuole prendere a due argomenti,
basta separarli con una virgola.
E se si vuole poi chiamare tale funzione,
noterà che hai appena chiamare per esempio, citazione, unquote,
per il primo argomento, comune n, per il secondo argomento.
Così ancora una volta, non ci resta che ora il blocchi in modo che possiamo realmente
attuare alcune delle nostre funzioni.
Tutto ok.
Tutte le domande su queste?
>> Così ora cerchiamo di buccia di nuovo uno strato in caso affermativo.
E l'obiettivo, in ultima analisi, è problema insieme della prossima settimana
sta per essere su cryptogrophy-- l'arte di scrambling informazioni.
E in particolare, le informazioni vi farà crittografare o decrittografare
sta per essere testo.
E così questo tipo di inviti la domanda oggi come bene,
cosa sta succedendo sotto il cofano con testo ASCII al di là di settimana a zero,
e come possiamo realmente iniziare a manipolare?
Così qui è il nome di Zamyla.
E il testo, che potrebbe essere immesso in come la funzione di stringa get.
E da adesso, quando si vede un stringa come questo-- Z-A-M-Y-L-A--
cominciare a pensare ad esso come se ogni di questi caratteri è in una scatola di sua
proprio.
E infatti, in una settimana o giù di lì è tempo, ciascuna di queste scatole
sta per rappresentare in modo molto specifico un blocco di memory-- un morso di memoria.
Quindi ciascuna di queste lettere, infine, rappresenterà 8 bit.
E noi realmente vedere cosa sta succedendo in sotto la cappa nel mio computer.
>> Ma perché non è sufficiente solo a guardare Zamyla
attraverso questa lente, per cui ciascuno di queste lettere è nella sua scatola.
E abbastanza bene in C che possiamo accedere a ciascuna di queste caselle direttamente.
Quindi, se si vuole ottenere la prima lettera del suo nome, super facile in C.
Se si desidera ottenere l'ultimo lettera, super facile pure
con un pezzo di nuova sintassi.
>> Quindi ho intenzione di andare avanti in CS50 IDE e aprire la stringa zero virgola C.
E in questo esempio qui, ci sono un paio di cose nuove da fare.
Così in prima linea 19, abbiamo visto questa stringa get before--.
Così come un controllo di integrità rapido, se qualcuno potesse offrire verbalmente
La spiegazione di un laico di cosa sta succedendo in linea 19.
Come appena tradurre questo in Inglese che un compagno di stanza, non in CS50
potrebbe capire.
Già.
>> AUDIENCE: Avere l'utente immette un stringa e riporlo in un s variabile.
SPEAKER 1: Good.
Avere l'input dell'utente una stringa e conservarla in un s variabile.
È fantastico.
Così sulla destra, lato, che noi chiamiamo stringa di ottenere.
Che restituisce un valore che non ha ottenuto assegnati
da destra a sinistra lato in una chiamata s variabile che è
progettato per memorizzare una stringa.
Esattamente.
>> Così ora la linea 22, per il commento in linea 21,
stampa, ovviamente, che stringa un carattere per riga.
Ma come?
Quindi prima di tutto, si inizializza I 0.
E allora come si arriva a la fine del nome di Zamyla?
Ebbene, alla fine Il nome di Zamyla, ho potuto
digitare manualmente l'ultimo carattere di il suo nome in qualche modo, o il numero di esso.
Destra?
Se torniamo qui-- Z-A-M-L-- Y-L-A-- così ho potuto digitare.
Qual è l'indice di L'ultima lettera di Zamyla?
Se questa è la 0-- parlare come un programmer-- 0, 1, 2, 3, 4, 5,
Io heard-- così infatti, l'ultima lettera in nome di Zamyla è il sesto,
ma se contiamo da 0, che sta per essere il numero 5.
Modo da tenere a mente qui.
>> Si scopre c'è una funzione in C chiamato strlen, e di nuovo nel corso della giornata
e fino ad oggi ancora, un sacco di programmatori
scegliere di sincronizzare i nomi per loro funzioni che suonano come le parole
che stanno cercando di dire.
Così strlen è lunghezza della stringa.
E così quello che sarebbe lunghezza della stringa di S ritorno quando Zamyla è l'ingresso?
>> PUBBLICO: Five.
>> SPEAKER 1: Z-A-M-Y-L. Six.
Destra?
Qual è la lunghezza del nome di Zamyla?
Destra?
E proprio in realtà, sei lettere.
Destra?
E così che cosa significa questo per il nostro ciclo?
Stiamo per andare da 0 fino a sei, che
sta per darci cinque iterazioni.
Cosa facciamo ad ogni iterazione?
Beh, per cento C, qualcuno indovinato l'altro giorno,
significa un segnaposto per che cosa?
>> PUBBLICO: Char.
SPEAKER 1: Solo un char.
Così un singolo character-- non più personaggi come una stringa.
E allora ecco la nuova linea che abbiamo stampare.
E allora ecco la nuova sintassi.
Se si desidera stampare l'i-esimo carattere nella stringa S, per così dire,
si può semplicemente dire la il nome della stringa S,
e quindi aprire parentesi quadra, e poi chiuse parentesi quadra, con un i
la metà.
Ed è una specie di piacevole in questo che tipo di sembra una piazza
proprio come le piazze in cui Zamyla di Esistono caratteri su quella foto lì.
>> Quindi, se ho effettivamente eseguito questo Ora, vediamo cosa succede.
Fai la stringa 0 puntino barra stringa di 0, e poi io sono
andando a digitare il nome di Zamyla.
Non c'è nessuna richiesta, perché non ho utilizzare stampa f, ma va bene.
So solo che cosa fare.
E in effetti, esso stampa Il nome di Zamyla, uno per riga.
>> Ora cerchiamo di essere un po 'avventato.
Supponiamo che non sapevo su strlen e ho pensato,
tutto bene, nessuno ha intenzione di avere un il nome più grande di come 50 caratteri.
Andiamo avanti e ricompilare questo ed eseguire di nuovo, e poi digitare Zamyla
nuovo.
Logicamente, qual è la programma di andare a provare a stampare?
Z-A-M-Y-L-A poi come 45 byte sconosciuti della memoria.
E infatti, ci torneremo a questa idea di memoria.
Ma logicamente, se Il nome di Zamyla è così a lungo,
come illustrato in figura qui, quello che stiamo dicendo
è tenere la stampa, tenere la stampa, tenere stampa, tenere la stampa, tenere la stampa,
fino al carattere 50, che chissà cosa succederà.
Quindi cerchiamo di realtà un'occhiata.
Proviamo quindi a digitare in Zamyla.
Interessante.
Siamo stati fortunati.
Solo un sacco di spazio bianco.
Oh.
C'è un carattere funky.
Sembra un po 'come una domanda strana contrassegnare lì, ma non c'è il nome di Zamyla.
Andiamo davvero temerario.
Che ne dici di stampiamo 500 blocchi verso l'ignoto?
Andiamo avanti e fare questo come bene e poi re-run.
E andiamo a schermo intero, perché abbiamo bisogno di vedere più spazio.
Zamyla.
Ha ottenuto di nuovo fortunato.
>> Osiamo ottenere più spericolata?
Andiamo più spericolati.
50.000 caratteri.
Questo non è più sicuramente una buona idea.
Tutto ok.
Fai la stringa di 0.
Questa sarà la nostra ultima demo.
Zamyla.
Ugh.
OK.
Quindi la mia memoria è veramente vuoto in questo momento, che è in realtà tipo di comodo.
Quello che sto cercando di ottenere a-- tutto bene.
E ora sto solo andando a prendere avventato.
500.000.
A tutto schermo di Make-- lasciarlo.
Invio.
Zamyla.
Ci siamo.
Non ho idea di che cosa è, ma suona male.
Tutto ok.
E infatti, presto, se siete tra i pochi fortunati in orario di ufficio
e in problema impostare uno, potrebbe benissimo verificarsi questo.
Segmentation fault fa effettivamente hanno un significato ben definito.
Significa qualche tipo di errore relativa ad un segmento di memoria.
E in termini profani, vuol dire ci siamo toccati
memory-- abbiamo usato RAM nel mio computer che non avrei avuto accesso.
Ed è quello che è sia potente e anche pericoloso
su C è che in realtà avere accesso illimitato
alla totalità della memoria del programma o byte o RAM, più specificamente.
>> Così, anche se il nome di Zamyla è lunga solo sei caratteri,
Posso ancora andare da nessuna parte in memoria voglio.
E per inciso, se hai mai letto qualche articolo
nel corso degli anni su alcuni server o qualche programma
ottenendo incrinato o hacked che è approfittato di qualcosa
chiamato un buffer overflow exploit che faremo in realtà
parlare in poche settimane, che è generalmente si riferisce in qualche modo ingannare
un computer in andando bene oltre i confini della memoria
che dovrebbe avere, e trovare qualcosa di succoso
in che memory-- un la password, forse, un modo
di aggirare qualche numero di serie controllare, o semplicemente generalmente in grado
per ingannare il computer è in esecuzione codice che non era destinato.
Ma torniamo a realtà per un attimo
dove questo programma era realizzato con strlen,
e di introdurre una cosa qui.
Cosa c'è di nuovo in mezzo a queste prime tre righe?
>> Così stringa puntino h.
Si scopre c'è questa libreria chiamata String Dot H, o la Biblioteca String,
il cui file di intestazione, per così dire, è la stringa puntino h che mi dà
l'accesso a questa funzione strlen.
Se Tralascio che, il compilatore è andando a urlare contro di me in qualche forma.
Ma sai cosa?
Ora andiamo davvero sfumata.
In linea 22, c'è qualcosa tipo di inefficient-- mal progettato,
arguably-- su questa riga di codice.
Pensate a come sono implementati per-ciclo
e quali misure accada di nuovo e di nuovo e again-- l'inizializzazione,
la condizione, il codice che Viene eseguito, quindi l'incremento
o la modifica, la condizione, allora il codice, la modifica, quindi
la condizione, allora il codice, quindi il cambiamento, e così via.
Così che cosa potrebbe essere un po ' preoccupante o mal fatto qui?
Sì, in blu.
PUBBLICO: strlen è chiamato molte, molte volte.
SPEAKER 1: Sì.
Così si chiama strlen molte volte, ma ciò che è
la lunghezza del nome di Zamyla il prima esecuzione del ciclo?
>> PUBBLICO: Six.
>> SPEAKER 1: Six.
Bene, che cosa è la lunghezza del suo nome la seconda volta che il codice viene eseguito?
>> PUBBLICO: Six.
>> SPEAKER 1: Va bene.
E 'ancora sei.
Destra?
Il nome di Zarla non ha cambiato, anche se sto cercando
a solo una parte delle lettere nel suo nome.
E così il fatto che io sono effettivamente questa domanda, che cosa è
la lunghezza di Zamyla, qual è la lunghezza di Zamyla, qual è la lunghezza di Zamyla,
sei volte separati, o sette addirittura, è solo stupido,
perché è immutabile quella risposta.
E così quello che potrebbe effettivamente fare è questo-- nella stringa uno
Ho una versione leggermente meglio qui.
There-- stringa whoops-- due ho una versione leggermente meglio in cui
Faccio questo-- invece di inizializzare i per 0, I anche con una virgola
dichiarare una seconda variabile chiamata n-- Non devo dire ancora una volta int.
Io non dovrebbe, in effetti.
Ma dico n.
E poi ho inizializzare n a la strlen di n, in modo che ora
Quante volte strlen vengono eseguiti in totale?
Solo una volta.
E così questo è ciò che intendiamo in precedenza su una migliore progettazione.
In realtà una volta che il codice è corretto, andando avanti e pensare attraverso,
sono io usando il meno memoria o pochi secondi
o millisecondi di tempo di computer come possibile implementare qualche problema?
E io vado a scorrere e basta citare
che c'è questa menzione di null in questa versione,
ma ci torneremo a che tra non molto.
Perché per ora, diamo un'occhiata dove questo sta per portare noi.
Così uno, si scopre che Ora che abbiamo la capacità
a vedere i singoli caratteri, possiamo sfruttare qualcosa
dalla settimana 0 che era molto arcano e sorta di interessante al momento.
Ma ora, e soprattutto quando ci arrivare alla crittografia in una settimana,
che sta per essere abbastanza potente.
Risulta che con alcuni int e galleggianti dati types--
e caratteri e stringhe e altro things-- alcuni di loro
può essere facilmente convertito in un altro.
>> Per esempio, quando abbiamo parlato su ASCII po 'di tempo qui è ago--
la lettere maiuscole A attraverso M, punto, punto,
dot-- abbiamo detto che c'è una mappatura tra queste lettere e numeri.
Ed in effetti, vale per le lettere minuscole pure.
Minuscole a è 97, il capitale è un 65.
E c'è un numero in ASCII, che è proprio questa mappatura
Sistema per tutte quelle altre lettere.
Che cosa significa?
Beh, ho intenzione di andare avanti e aperto up reale rapidamente qualcosa chiamato
ASCII 0, la maggior parte dei quali è commenti.
E di nuovo on-line si può sempre sguardo attraverso i commenti.
>> E dare un'occhiata cosa questo sta andando a fare.
Quindi ha un funzione principale.
Ho hard-coded i numeri solo per ora, perché so quello che sto facendo.
So quello che voglio vedere qui.
E ho inizializzato I 65.
E sto contando su attraverso 26 lettere totali.
E che cosa farò a stampare una riga alla volta
se si può interpretare questo ha evidenziato la linea?
Che cosa viene stampato?
Già.
>> PUBBLICO: Stai andando stampare la lettera
corrisponde alla mappa del Valore lettera e valore intero?
SPEAKER 1: Esattamente.
Ho intenzione di stampare la lettera corrispondente al valore intero,
e viceversa, come segue.
Beh questo, qualcuno ha detto in precedenza, è solo un segnaposto per un carattere.
Lo è ancora.
Questo, naturalmente, è un segnaposto per non int-- una nuova riga.
E ora notare, il mio primo valore che Sono di collegare per quel segnaposto
è non solo io che sto dicendo, tra parentesi, char I,
che il carattere parentesi è dice al compilatore, trattare io
non come quello che è, che è un numero.
Trattarlo come un personaggio vero e proprio.
Considerando che il secondo valore che sto collegando dentro-- I-- dovrebbe essere solo un numero.
>> Quindi, se compilo questo program-- quindi questo è rendere ASCII 0,
dot barra ASCII 0-- ottengo solo questo piccolo pratico grafico che
mi mostra tutti i possibili mappature senza dover pensare che
attraverso o capirlo da solo.
E sto anche stampare, notare le lettere minuscole,
perché poche righe dopo, io anche stampare questa mappatura
pure, che è solo per dire che una volta capito
cosa sta succedendo sotto il cofano, si può
convertire automaticamente avanti e indietro.
E in effetti, se qualcuno di voi mai fatto questo in grado di scuola
o sentito parlare di qualcuno prendendo miticamente una nota
e passando al suo o il suo amico in classe,
ma il strapazzate lettere di come A diventa B,
e B diventa C, o qualcosa del genere più complicato di così, beh,
come andreste circa attuazione che come un bambino?
Beh, è ​​solo tipo di sapere A diventa B, B diventa C,
ma matematicamente, cosa stava facendo quel ragazzo?
Cosa stavi aggiungendo a ogni lettera?
Effettivamente, 1.
>> Così, quando si cambia A a B, che è un po 'come cambiare 65-66,
il che significa matematicamente solo aggiungere 1.
E così, se si dovesse implementare che poco tecnica ingannevole
per il vostro insegnante in codice, potrebbe fare esattamente questo basta
aggiungendo una sola lettera insieme.
Così in poco tempo, siamo andando a vedere come noi
possono usufruire di quella effettivamente scramble realmente e decodificare
informazioni.
Nel frattempo, sappiamo che abbiamo iniziato di introdurre un paio di altre biblioteche
qui-- la stringa uno oggi.
E un sito molto utile spera che troverete
si chiama reference.cs50.net, che il corpo docente hanno messo insieme,
in modo che se si desidera cercare opere come strlen,
si può iniziare a digitare il nome della funzione,
clicca strlen lì, e poi una spiegazione meno confortevole
sta per apparire.
O se volete il funzionario Spiegazione basata su Linux,
è possibile fare clic più comodo in alto a destra, e
presenterà le stesse informazioni, ma in termini più complessi.
Questa è una risorsa utile per in realtà sa tutto ciò che fa.
>> La prossima volta che andremo a dare un'occhiata a Ovaltine
e di più, e presentarci al mondo della crittografia.
Prima di allora, vedremo più tardi questa settimana.
E ora, Colton Ogden.
Ci vediamo mercoledì.
>> [RIPRODUZIONE DI BRANI MUSICALI]
>> SPEAKER 1: Che [BLEEP] stai facendo?
>> SPEAKER 1: sto mangiando il mio dolce?
Come si mangia?
Con le mani?
>> [RIPRODUZIONE DI BRANI MUSICALI]