ROB: Va bene. Benvenuti alla prima sezione. Sono Rob. JOSEPH: Sono Giuseppe. ROB: Così ci immergeremo a destra dentro La prima cosa di cui parlare è l'apparecchio. Così si spera la maggior parte di voi hanno scaricato già. Ma potete vedere le istruzioni a cs50.net/appliance. Oh dio, ora sono consapevole. Sento ancora esso. JOSEPH: Wow, suona come è disorientato. ROB: Così alcune persone hanno avuto problemi con esso, quindi non aspettare fino a l'ultimo minuto del problema impostato su cercare di risolvere l'apparecchio e scoprire che non funziona. JOSEPH: E se qualcosa è che non funziona e avete bisogno di aiuto, si può andare a cs50.net/discussion dove siamo un forum in cui si possono inviare le vostre domande. E ci arriveremo a loro alla fine. ROB: Va bene. Quindi questo è ciò che il Appliance assomiglia. Anche in questo caso, è solo una completamente separato sistema operativo in esecuzione all'interno qualunque sistema operativo si sono in esecuzione sul vostro computer portatile. E le cose principali che si utilizzeranno sono gedit. Quindi speriamo che questo ha già diventare un sito familiare. Il terminale. E si può anche eseguire Chrome all'interno del Appliance. Ci sono stati un paio di persone che hanno segnalato internet non lavorare in Appliance. E alcuni di loro hanno appena assunto che non si suppone che sia internet in Appliance. Ma sì, ci dovrebbe essere Internet. Lo dirò adesso, ma non lo fa significa veramente nulla. Se internet non funziona, questo è ciò che si tende ad avere bisogno a correre per risolvere il problema. Se si hanno problemi di internet, non ricordarlo, basta postare su Spiega, e diremo, eseguire tale. Ma internet dovrebbe funzionare. Quindi l'unica altra cosa - sì, niente il resto è davvero rilevante. Ma io volevo solo far notare che - vedi in questo angolo in basso a destra. Così ciascuno dei vostri elettrodomestici dovrebbero avere un indirizzo IP. E più tardi nel semestre, questo IP Indirizzo diventerà più rilevante quando stai lavorando sul web p-set, perché sarete in grado di accedere alla il sito si sta lavorando dal Chrome locale utilizzando l'indirizzo IP. Ma quello che mi piace utilizzare l'indirizzo IP - e non c'è bisogno di fare questo, io vogliono solo farlo notare - è qui. Quindi questa è una finestra terminale il mio Mac, questo non è in Apparecchio a tutti. E si può cercare ciò che questo comando fa. Ma ho intenzione di SSH direttamente al mio Appliance. Non so quale sia la IP. JOSEPH: 168 - 168.224.1.0. ROB: Così una volta ho fatto con questo, accedere Ora, fondamentalmente, questo è identico a un finestra di terminale nel mio Appliance. Così ho praticamente mai effettivamente lavorato all'interno dell'apparecchio stesso. Ho sempre ho in esecuzione in background minimizzato e SSHed in esso. Il problema con questo è che non sta andando essere in grado di utilizzare gedit facilmente direttamente da questa. Ma se si vuole essere un vero e proprio fresco hacker, allora si dovrebbe abituarsi ad una riga di comando editor di testo in ogni caso. Così Vim e Emacs e Nano, tutti questi sono diverse alternative. Nano tende ad essere il più facile. E penso che non ha evidenziazione della sintassi. Oh, no, lo fa totalmente. Così si può utilizzare Nano, perché che uno è abbastanza facile. Vedete tutti questi comandi nella parte inferiore. Questo piccolo simbolo carota. Se non avete visto prima, ti probabilmente vedrete un sacco momento. Significa generalmente la carota controllo, come il fondo a sinistra della tastiera carattere di controllo. Così qui mi sta dicendo qui - oh, non è tagliato fuori se lo zoom dentro Quindi controllo, X è come Sto per uscire. E si dice che posso colpire Y Sì, per il risparmio, N per No. Ecco, questo è Nano. Vim e Emacs tendono ad essere leggermente più complicato e travolgente. Ma si può abitua ad esso, e allora vi piacerà. Ecco, questo è quello. JOSEPH: Non c'è bisogno di farlo. ROB: Già. Siete liberi di usare gedit per l' resto del semestre. Quindi tutte le domande di elettrodomestici connessi? O avete qualche idea su cos'altro deve essere parlato in merito l'apparecchio? Sì. SPEAKER 1: Quando si SSHed nella vostra cosa, è stato il Crimson password? ROB: Già. La password per praticamente tutto nel Appliance sta andando per essere Crimson. SPEAKER 2: Installare come un vero e proprio IDE sull'apparecchio, funzionerà? ROB: Io immagino Eclipse ha un Versione di Fedora, in questo caso, sì, si può fare. Probabilmente non è davvero la pena. SPEAKER 2: OK. Quindi è probabilmente più facile se volevo utilizzare Eclipse, basta usare il nativo e poi caricarle - ROB: Oh, che è anche probabilmente più facile. Ma è possibile farlo funzionare all'interno del Appliance. JOSEPH: E per la macchina fotografica, la domanda era, si può installare un altro IDE interna del dispositivo? ROB: Eclipse essere un esempio di un IDE. Tutte le altre domande Appliance? Bene. Così noi ora passare alla riga di comando cose di interfaccia-correlati, così CLI. E ancora, sto solo andando a lavorare in qui, perché questa è identica a lavorando all'interno di una finestra di terminale all'interno del Appliance. Come sta il font cercando? Che è abbastanza grande? Bene. Quindi ci sono un sacco di comandi che si dovrebbe ottenere abbastanza utilizzato per tutto il semestre. Il grande due per la navigazione sono ls lista i file in questa directory, e cd, in modo da cambiare la directory. Così posso cambiare per desktop e poi un modello molto comune è cd per un directory e immediatamente ls Cosa c'è nella directory. La gente a volte non si rendono conto che il completamento Tab è una cosa. Cd Così come, vh, e poi mi ha colpito Tab. Non ho quasi mai digito su l'intera cosa. E poi se continuo a prenderla Tab ancora una volta, sarà automaticamente iniziare l'elenco per me. Così posso cd vhosts, host locale. E questo è solo andando - nel caso in cui non avete sentito il termine prima, directory è solo un'altra parola per la cartella. Così ora se vedete - cerchiamo di portare quella verso l'alto. Così ora se vedete tra parentesi, è vedere la tilde poco, barra, vhost, slash, host locale. Così la tilde, che si riferisce alla mia home directory. Si tratta di una directory sei quando si SSH dentro E 'la directory che sei quando si apre un terminale. E 'dove si inizia. E quindi sono dentro la mia home directory, e io sono all'interno del vhost directory all'interno della mia home directory. E poi sono all'interno del locale ospiterà directory all'interno di questo. Così alcune altre cose utili con cd - o anche, in generale, così dot sempre si riferisce alla directory corrente. Cd, dot è un comando piuttosto inutile. Ma questo sta cambiando la directory corrente. Uno più utile in termini di cd è dot, dot, che è basta andare su una directory. E notare che queste - Voglio dire alias, ma questi simboli, dot, e dot, dot, quelli di lavoro per praticamente qualsiasi comando sei andando a pensare di correre. Così come il cd è probabilmente dove sarai utilizzando le più, ma questi non sono cose che proprio cd capisce. È praticamente qualcosa l'intero riga di comando capisce. Un sacco di programmi capire dot e dot, dot. Così gli altri utili - cd, dash. Così che sta per portarmi al ultima directory che ero dentro Così a volte farò qualcosa di simile, oh, sto lavorando qui. E vedo qualche errore con qualcosa, e Vado a indagare è andando a una directory a caso da qualche parte. E non so se sarà lasciami in là. Sarà. Allora io faccio quello che voglio in questa directory. Blah, blah, blah, blah, blah. E mi sono detto, va bene, voglio per tornare a dove mi trovavo. cd, cruscotto, e mi porta a destra indietro. Quindi ho intenzione di buttare un sacco di questi a voi oggi. Non mi aspetto di memorizzare tutti loro. E 'una specie di sufficiente sapere che esistono. E poi quando siete come, hmm, voglio tornare al directory che ero solo a, oh, aspetta, qualcosa di simile esiste. Non dovete digitare solo in ancora una volta l'intera directory. JOSEPH: E alla fine vi sarà solo usarli più e più volte, e essa diventerà memoria muscolare. ROB: Già. Quindi, come ho detto prima, che la tilde è la vostra directory home. Così posso cd, tilde. Ma non ho nemmeno bisogno di farlo se ho appena - Tornerò alla directory in modo non è un esempio inutile. Ma se io faccio solo cd, che è anche l' stessa, andare alla mia home directory. Faccio Command, K. JOSEPH: È anche possibile digitare chiaro, il parola, e dovrebbe cancellarlo. ROB: E penso anche di controllo, L fa anche. Così un sacco di modi diversi. Penso che ci siano alcune differenze dove chiaro e Controllo, L sarà solo davvero spingere verso l'alto e Posso ancora scorrere indietro. Comando, K distrugge letteralmente tutto, e si non può scorrere indietro. Per lo meno, questo è come funziona in iTerm2. Io non so come le altre cose - oh. Con sshing, quindi se siete su Windows, si sta andando ad avere per scaricare PuTTY al fine di SSH quando Windows non avere come uno strumento integrato in SSH. Da Mac, si può solo SSH direttamente da una finestra di terminale. OK. Domande? Con ls, quindi qualcosa per abituarsi a con la maggior parte di questi comandi è - bene, lo farò uno. Ls, dash, l. Così trattino, l è quello che stiamo andando per chiamare un flag per ls. E molti di questi comandi hanno bandiere che è possibile passare a loro. Quindi, in questo caso, dash, l è una bandiera che dice di darmi una completa elenco di tutte le informazioni di questi file. Così vediamo qui che il tavolo era modificato il 30 luglio alle 00:54. Download è stato modificato al 6 settembre. Queste sono le dimensioni attuali e byte di queste directory. Non devi capire tutto questo. Questa roba sulla sinistra, questi drwx di, che diventerà molto più rilevante più tardi, quando si ha a che fare con - che ha a che fare con chi ha i permessi guardare a questi file. E così, se tu non fossi l'unico utente su questo computer, si sarebbe in grado di per esempio, OK, dovrei essere l'unico permesso di guardare a questo file o sono andando per permettere a tutti di guardare a questo file. Così qualcuno sul mio computer può guardare a questo file. Io non so nemmeno cosa questa - che cosa fa questo? JOSEPH: Io non sono molto sicuro, in realtà. ROB: Non ne ho idea. JOSEPH: Ma se non si sa, c'è un comando utile che è possibile utilizzare per dirti cosa significa l'uscita. E se si digita l'uomo prima del comando - così M-A-N. ROB: Uomo. Così l'uomo è un altro che è molto utile. E l'uomo, ls. Così le pagine man, hanno entrambi comandi che si sta andando ad essere con nella riga di comando, e hanno anche funzioni che saranno rilevanti con C. Così si può l'uomo - e ho ignorato 3. Ma man 3 printf sta per portare la versione C della printf. Ma se io faccio solo uomo printf, questo è andando a portare il comando printf che accade nella riga di comando. Così l'uomo, ls. Le pagine man possono essere abbastanza travolgente. Qui, però, vedrete questo annuncio di tutti questi flag che ls capisce. Quindi, se andiamo a precipitare, l, e - Sto solo andando a buttare questo a voi. Ma per la ricerca, si vuole alla prima colpire la questione marchio o il pulsante di barra. Quindi tagliare. E poi posso cercare per quello che voglio. Quindi ho intenzione di tagliare per il cruscotto, l. Ed eccolo lì. Quindi, utilizzare un formato di elenco lungo. Questo non mi aiuta a capire che cosa quella colonna particolare significato, ma io assumere da qualche parte qui si spiegherebbe così. Quindi, utilizzare le pagine man di un comando che non si capisce immediatamente. Sono abbastanza sicuro che si può anche l'uomo, l'uomo. Un'interfaccia alla linea manuali di riferimento. Ah, un'ultima uno che è forse un po ' rilevanti è LS, cruscotto, a. Quindi notare se io faccio solo ls, Ottengo questi cinque file. Se faccio ls Dash, una, io ottenere molto di più file. Quindi la cosa in comune tra tutti questi nuovi file è il punto in anticipo. Così la convenzione è che un file che inizia con un punto è nascosto. Quindi non si vuole vedere che file, Non vuole avere pasticciare con profilo directory. E 'solo quando si chiede esplicitamente, tutto bene, LS, dash, una, mi mostra. La A sta per tutti i file, compresi quelli nascosti. Così alcuni altri comandi. Oh, domande a quel punto? Sì. SPEAKER 3: Quando si esegue ls, una, qual è il punto, dot? ROB: Oh. Quindi questo è quello che stavo parlando. E 'la stessa cosa, dove Posso scrivere un cd, dot, dot. Tecnicamente, quindi, punto e dot, dot sono file che esistono in ogni singola directory dove il file dot riferisce alla directory corrente. Quindi, se ho cd, puntino, sto solo andando rimanere nella directory. E dot, dot fa sempre riferimento al precedente directory di livello superiore. Quindi se vado in ceppi e LS, cruscotto, al, Vedrò dot, dot. cd per dot, dot mi porta alla directory precedente. Già. OK. Così un altro abbastanza importante comando rm. Ecco, questo è quello che stiamo andando da utilizzare per rimuovere. E lasciatemi fatto fare un altro primo comando. Così mkdir. Mkdir è come si può creare directory. E creerò una directory temporanea e vai in quella directory temporanea. E come previsto, è vuota. Ma se io ls, Dash, una, ho ancora dot e dot, dot, dot perché si riferisce a la directory corrente. E dot, dot si riferisce al directory precedente. E quelli saranno sempre esisterà, non importa la directory in cui ti trovi E questo è un completamente inutile comando, ma tocco. Sto solo usando, perché è un modo semplice per creare file. Quindi toccare una Toccare b, toccare c è solo andando a creare tre file chiamati a, B e C che sono completamente vuoti. Quindi il punto di me creando quelli nella primo posto è solo così che rm è come possiamo rimuoverlo. Quindi rm, a. Sta andando a chiedere a me, rimuovere regolare un file vuoto? E allora io dico sì. Quindi, se io so per certo che voglio cancellare quel file senza dover essere richiesto, rimuovere regolarmente file vuoto?, allora rm, cruscotto, f sta per essere il bandiera che dice, forzare il rimuovere senza anche a me spingendo, oh, sei sicuri di voler cancellare il file? Sì, ne sono sicuro. Così rm, dash, fb sarà solo farlo senza chiedere. Quindi cerchiamo di fare qualche altra directory. mkdir, tmp2, cd, tmp2, toccare un tocco b. OK. Così ora voglio rimuovere tmp2 come una directory. Tmp2 così rm. Non è possibile rimuovere tmp2, questa è una directory. Quindi il problema qui è che rm non lavorare immediatamente su directory. E 'pensato solo per i file come file non-directory. E allora cosa possiamo fare ecco rm, cruscotto, r. Che sta per ricorsivo, che potrebbe non significa nulla per voi ancora. Ma quando si arriva a ricorsione, vorrà dire di più. Così rm, dash, r, tmp2 sta per ricorsivamente andare in quella directory. Quindi si scende nella directory tmp2? Sì, andiamo in quella. Vogliamo rimuovere tmp2 / a? Sì. Vogliamo rimuovere tmp2 / b? Sì. Ora vogliamo eliminare il tmp2 directory? Sì. E così ora la directory e tutto dentro di esso è stato rimosso. Vi è tecnicamente un rmdir comando che è possibile utilizzare per rimuovere directory, ma esso funziona solo sulla directory vuote comunque. E vedere che, diciamo solo fare di nuovo mkdir, tmp2. Tmp2, toccare una. OK. Quindi, se provo a rimuoverlo dirtmp2, sarà dire, directory non vuota. Così ho praticamente mai usato la rimozione comando dir in ogni caso, perché rm, dash, r lavorerà su directory vuote e le directory non vuote. E anche se io non voglio avere a passare attraverso questo intero processo di scendendo nella directory e rimozione di ogni singolo file, rm, dash, rf, tmp2. E ora non c'è più. Qualcosa da stare attenti in merito è rm, cruscotto, rf. E mi spaventa anche di tipo IT, perché se mi sbaglio premere Invio o qualcosa del genere. Così rm, dash, rf, tilde sarebbe, senza me spingendo, la f non chiede me, rimuoverà automaticamente tutta la mia home directory e tutto in esso. Quindi si potrebbe pensare che sia una cosa stupida da fare. E bene, è. Ma può accadere molto facilmente incidente se, per esempio, ho voluto rimuovere la mia barra, directory vhost. E proprio nella digitazione veloce, Ho accidentalmente faccio. Che rimuovere ricorsivamente sia la mia home directory e la directory vhost in questa directory particolare, che solo succede a non esistere in questo momento. Ma questo sarebbe ancora rimuovere tutta la mia home directory. Almeno non avendo un f, mi avrebbe chiesto prima. E sarei come, oh, no, non vogliono farlo. Ma la gente, Slash, tra cui io tendo ad entrare nel abitudine di sempre rf-ing. Anche i file regolari che posso solo rm, c, tendo a solo rm, dash, rf, c. Basta essere attenti quando sei rf-ing. SPEAKER 4: Cosa C fare? ROB: C è sto parlando di quel file C in questa directory, che rm, c. JOSEPH: E più pericolosamente, se si utilizza una stella, si riferisce a tutto a la directory. Quindi quello che normalmente tendo a fare è io Vado in una directory e voglio rimuovere tutti i file in là. Così rm, dash, rf, stella. ROB: Già. Rm, dash, rf, stella. JOSEPH: E se non stai attento quale directory siete in - Non ero in temperatura, ma ero accidentalmente nella mia home directory, poi mi tolgo tutto nella mia home directory. E in realtà ho fatto prima, e Credo che tu abbia fatto questo prima o Jay ha fatto prima. ROB: Ho rimosso accidentalmente - in modo da ignorare che il comando per un po '. JOSEPH: Non divertente. ROB: Quindi nella directory bin barra è un gruppo di file binari, dove ci sarà essere quelli familiari come clang. Beh, clang e praticamente tutti questi cose che sto correndo al comando linea sono in questa directory bin barra. JOSEPH: come ls è qui. ROB: Così puntino, tagliare, LS sarebbero elencare questa directory. JOSEPH: Rm è anche in questa directory. ROB: Ho accidentalmente RM, rf-ed bin, che rimosso qualsiasi comando che potevo forse mai desiderare. Che poi ho appena reinstallare un nuova Appliance in quel punto. JOSEPH: Quindi, essere molto attenti quando si utilizza questo comando. AUDIENCE: [incomprensibile]? ROB: sì. Questa è anche una cattiva abitudine per entrare. Se notate, ora sono - bene, non si nota, ma il mio zoom-in può forse. Quindi sono ora root @ apparecchio. Così jharvard è l'utente che vogliamo di essere sempre in uso. Root è l'utente che disponga dell'autorizzazione di fare assolutamente nulla. Così notato quando sono jharvard, se cerco di cd - cos'è una directory? Oh, la radice è un buon esempio. Così cd, radice. Permesso negato. Perché se guardiamo a questo annuncio - e ancora, non c'è bisogno di tutto capire questo. Ma questi tre trattini stanno dicendo che non lasciare nessun altro utente in questa directory. E la directory succede a essere di proprietà di root. Quindi il fatto che io sono jharvard e non uno che non è root è consentito in questa directory, il che significa che sono sta per ottenere il permesso negato quando ho cercare di cd in esso. Così, quando sono root, ho il permesso di fare assolutamente nulla, compreso eliminare i file essenziali per l'apparecchio e distruggere l'intera cosa. Quindi è una cattiva abitudine per entrare semplicemente passeggiare intorno alla vostra sistema operativo come root. Io faccio comunque. Domande? E io esco radice, rimango come jharvard. OK. I comandi più rilevanti. Quindi, tornando nel nostro temp, l' comando mv sta per muoversi. È possibile spostare un file. Ora vogliamo chiamarlo b, così ora si chiama b. O forse vogliamo spostare b su una directory. Così ora vuoto di questa directory. Tornerò alla mia home directory, e vediamo che b è qui, perché l' home directory è una directory dal la directory che b era stato dentro C'è anche cp. Così cp è copiare la sezione super, dot, il testo. Posso chiamarla s, punto, il testo. Ora abbiamo sia la sezione super, dot, il testo, e s, punto, il testo. Questo funziona anche su directory. I rf-ed un singolo file. Così cp - bene, prima proviamo cp, tmp, tmp2. Quindi, omettendo directory tmp. Così simile a RM, il comportamento predefinito è quello di non lavorare sulle directory. E ancora, simile a RM, il default comportamento - bene, a farla funzionare con le directory è un trattino-r di distanza. Quindi copiare ricorsivamente la temperatura directory in tmp2. E così ora abbiamo sia tmp e tmp2, e che non è che utile in quanto tmp era vuoto, in primo luogo. Tmp2. Ora cerchiamo di copiare tmp in tmp2. E vediamo che tmp2 ha anche il file una, perché la directory e tutto all'interno di tale directory è stato copiato. E che può essere in qualche modo utile Se, per esempio si sta lavorando il problema di impostare uno - o addirittura, insiemi di problemi successivi sono ancora più importante, perché ci sarà un intero gruppo di file e cose. Ma vuoi solo, per una frazione di secondo, sei come, va bene, io sono andando a provare qualcosa di diverso. Vorrei solo copiare tutta la mia pset1 Elenco di backup in modo che se pset1 Mi finire avvitamento cose, posso tornare nella mia directory di backup. Ci sono modi più appropriati di versioning backup del codice, ma questo è sempre un modo rapido per fare solo Assicurarsi di avere una copia di qualcosa che si sta per modificare. Così eco è anche un comando one-off che tipo di sillily sarà solo stampare riga di comando esattamente ciò che si voleva fare eco. Quindi echo hi. Dobbiamo solo stampiamo hi. Echo ciao mondo. Ti Stampiamo ciao mondo. Che entra in uso quando si iniziare combinando i comandi. E ancora, non aspettatevi di tutto comprendere questo ancora, ma è qualcosa da vedere. E poi se siete usare Google per gli esempi o ti rendi conto che vuoi fare qualcosa, può essere utile. Quindi cerchiamo di, ad esempio, così LS, cruscotto, l. Così qui vedo l'uscita di LS, cruscotto, l. E io dico, OK, voglio memorizzare che in un file. Tutto di questa uscita qui, voglio mettere in un file separato. Così questo piccolo simbolo di maggiore è quello che stiamo andando a chiamare. Noi stiamo reindirizzando l' output in un file. Chiamiamo il file bla, perché è quello che io tendo a chiamare sempre. Così ora vediamo che abbiamo un presentare blah proprio qui. E se lo apro, mi vedrò che è esattamente l'output del comando che ho appena eseguito. E allo stesso modo, è possibile - se questo era output in un file, questo è ottenere input da un file. Che cosa è un comando che ho - JOSEPH: Penso che si possa utilizzare meno o più, probabilmente. ROB: Ma come circa poco meno blah? Non lo so. Se si entra in questo scenario, come c'è pset che è utile per. JOSEPH: È possibile reindirizzare in eco. Tubo il file in eco per vederlo. ROB: E 'pipe. JOSEPH: Mi dispiace. ROB: Va bene. Quindi questo è output in un file. Questa è ottenere il testo dal file e consegnarla al programma. E vedrete anche questo ragazzo. Quindi questo è una specie di fare entrambe le cose contemporaneamente. E in realtà, io presento due nuovi comandi solo per fare uso di esso. La storia è un comando a portata di mano che è solo andando a stampare un elenco di qualsiasi cosa io abbia mai eseguito una riga di comando. Così vediamo qui tutto quello che ho stato in esecuzione tutto questo tempo. Un sacco di LS di. E un altro comando utile è grep che il suo scopo è quello di verificare oltre testo alla ricerca di modelli, bene, alla ricerca di quello che vogliono cercare. E così un utilizzo pratico: ecco, diciamo vogliamo afferrare la storia. E voglio cercare i comandi dove io - che cosa è un un utile cercare? JOSEPH: [incomprensibile]? ROB: O Diamo un'occhiata a tutti tocca, per qualsiasi motivo. Quindi questo è quello che sarà simile. E non c'è bisogno di tutto capire che. Ma l'idea è qui, la storia sta dando la stessa uscita che ha fatto qui dove è stampare l'intera storia di tutto ciò che ho mai eseguito. Stiamo passando poi che - così invece di stamparlo allo schermo, vogliamo passare che al comando grep, che è alla ricerca di tutte le istanze della parola tatto. E così utilizzando questa combinazione di storia strumenti e grep, posso vedere, OK, ecco tutti i comandi che io abbia mai correre, ed ecco uno piuttosto comune. Siamo in fondo. Ed è anche darmi il comando Ho appena corse che ha avuto il Parola tocco in esso. Ma il tubo è una cosa molto utile per combinare più programmi. E in realtà, è una scorciatoia per let me la storia di output su file bla, e mi permetta di Grep utilizzando il file blah come quello che voglio guardare oltre. Così il tubo è solo una scorciatoia per questi due comandi. Sì. SPEAKER 4: [incomprensibile]? ROB: sì. Che cosa è - Oh. Testiamo. Così gatto, cane, pesce. Quindi voglio grep. Dash, r, ancora una volta, sta per essere ricorsivamente, quindi voglio scendere giù tutte le directory. Voglio grep ricorsivamente per tutti - e fatemi temporaneamente ottenere questo fuori strada. Mi Ignora. OK. Quindi voglio grep temporaneamente tutte le istanze della parola pesce. Ed ecco quello che sto facendo è grep ricorsivo per la parola pesce. E stella significa più di tutti questi file in questa directory. E così mi ha dato una Autorizzazione negata, perché non è consentito leggere che particolare file. Ma ha trovato il pesce nel file, test. Potrei anche dire, in particolare, ho solo vuole guardare nel file blah, in qual caso non troverà nulla. Voglio solo guardare nel file, test. Si troverà di pesce. Questo è un comando molto utile sapere in generale. Ci sono alcune alternative a grep che si suppone essere più PROGRAMMATORE cordiale, ma io tendo a cadere ancora indietro grep. Domande? OK. Ci sono altri comandi? Oh. Solo un one-off quello che ho sempre trovare ad essere divertente è cal. Così notare quando mi trovo in questa bella modalità a schermo intero, non ho cima come barra degli strumenti o nulla. So Cal mi dà solo un bel po ' calendario che è giusto ormai tagliato fuori, suppongo. Ma bel po 'di comando. JOSEPH: E '[incomprensibile]. Altri comandi che si potrebbero avere visto comprendono clang e fare. Andremo su di loro in dettaglio più avanti. Ma se hai lavorato su il PSET, si dovrebbe essere familiarità con quelli. ROB: Va bene. Domande on line cose di comando? Bene. Quindi passiamo a qualche Stuff C-correlati. Variabili matematica. OK. Quindi, proprio come avevamo matematica in Scratch, è anche possibile utilizzare la matematica in C. Prima di arrivare a questo tutto, così variabili. Ricordate che ogni volta che si dichiara una variabile come int x o float y, si devono dare digitare prima il nome della variabile. Così tipi che abbiamo visto finora sono int, float, double, lunga lunga, che mi non realtà non sappiamo se abbiamo visto che finora. Ci sono alcune altre. Abbiamo vediamo char. C'è insomma, che è come se fosse il opposto del lungo tempo in cui è più piccolo di un numero intero. Abbiamo anche visto stringa. Così che cosa c'è di speciale stringa? Perché dovrei dire che è non proprio come int? SPEAKER 4: non esiste realmente. ROB: Già. Quindi l'unico motivo per cui abbiamo stringa è perché quando si fa hash, includere cs50.h. E vedremo esempi di questo più tardi - oh, che non gestisce molto bene - dove cs50.h sta facendo qualcosa lungo le linee di tipo def, char stella, stringa. E così che sta dicendo che noi non sappiamo nemmeno sa che cosa una stella char è ancora. Ma questo sta dicendo che vogliamo stringa. Qualsiasi luogo che hai utilizzato stringa, avrebbe potuto usare char stelle, che in realtà è un tipo che esiste nel linguaggio C. Ma ci arriveremo. Oh, e va a destra indietro. Neat. Quindi, stessa cosa con bool dove vero e falso. Questo non è davvero un tipo built-in in C. Invece, è solo, questo ha il valore zero? Poi ci limiteremo a considerare che sia falso. Questo ha il valore - bene, questo ha alcuna valore che non è zero? Poi ci consideriamo vero. Così uno è vero, due è vero, qualcosa di diverso da zero è vero. Così quelli sono quelli. Domande sulle variabili che dichiarano e tipi di variabili e tutto quello che? Già. SPEAKER 4: Per lungo tempo, nel libro, si diceva che doveva essere long long int. Ma sarà solo lungo lungo lavoro? ROB: Quindi questi modificatori di tipo. Così int x. Quindi possiamo anche dire unsigned int x. Possiamo dire short int x. Possiamo dire long long int x. Ma praticamente qualsiasi di quelle cose che appena detto, unsigned int, short int, long long int, è possibile sbarazzarsi di int e sarà solo supporre che volevi dire int. Quindi senza segno x, il che significa semplicemente - si sa come di solito con un int, si può dire che x è uguale negativa 3? Con un unsigned int, non si può. JOSEPH: E ancora, per la fotocamera, l' domanda era: qual è la differenza tra long long int e proprio lungo tempo? ROB: Già. Quindi io quasi mai scrivere long long int. Vorrei scrivere molto lungo. JOSEPH: Tutte le domande? ROB: OK. Così stupido piccolo promemoria di quello Funziona dichiariamo una variabile e inizializzare la variabile e dichiarare un altro variabile e inizializzare il tutto in un solo passo. Così la dichiarazione della variabile e la variabile di inizializzazione non hanno a ma può essere sulla stessa linea. Così abbiamo gli operatori matematiche standard che siete abituati a - più, meno, dividere, orari. C'è anche modulo, che vedremo. Non vi è, almeno in C, una potenza integrato elevamento a potenza operatore caret. Beh, c'è un operatore di accento circonflesso, ma non è potere. JOSEPH: Ma non è l'elevamento a potenza, Sì. ROB: Non utilizzare l'accento circonflesso supporre che significa come il quadrato o qualsiasi altra cosa. Quindi alcune cose da tenere a mente sulla divisione. Starò. Così ha dichiarato la risposta di inizializzazione. Quindi stiamo dicendo risposta galleggiante uguale a 1 diviso 10. Stampa risposta a due cifre decimali. E questo è il genere di cosa che mi sarebbe l'uomo printf per capire che che diamine vuol%, puntino, 2f dire? E questo significa solo, bene, ignorando la 0.2. E%, f è quello che usiamo per la stampa a galleggiare. Il 0.2 sta dicendo, stampa float con due decimali. Quindi questo programma ha un bug, e si potrebbe hanno visto questo prima in qualche previo corso di CS. Ma che cosa è che bug? SPEAKER 5: Zero. ROB: Già. Così, quando diciamo, la risposta è uguale 1 diviso 10, vogliamo l' rispondere 0.1. Ma 1 diviso 10, 1 è un intero, 10 è un numero intero. E così quando facciamo un intero diviso per un numero intero, stiamo per tornare un numero intero. Così 1 diviso 10 è 0,1. Dal momento che deve darci un numero intero, è solo andando a buttare via che decimale e dire che la risposta è 0. E così quando stampiamo rispondere qui, sta andando a stampare 0.00. JOSEPH: E proprio come una nota, in realtà getta via ciò che è dopo l' punto decimale. Quindi, se invece avessi 6 diviso per 10, si potrebbe pensare che darebbe 0.6 e poi si sarebbe arrotondare a 1. Ma in realtà, cosa succede quando si digita attività è che scende ciò che è dopo il punto decimale. Così 0.6 non diventa 0. ROB: Già. E diremo troncato per questo. Così ogni volta che lanci ad un int, decimale viene troncato. Così la correzione per questo - non c'è in realtà due. E ho intenzione di farlo secondo, perché questa è una soluzione molto più semplice. Quindi una soluzione è usare carri allegorici nella divisione. E davvero, devi solo fare uno di loro un galleggiante. Ma è un po 'più chiaro solo fare entrambi galleggianti. Così 1.0 diviso per 10,0 è che divide due galleggianti. Quindi la risposta finirà per essere un galleggiante, e così si farà stampare correttamente 0.10 qui. Qualcosa che non funziona così bene a tale proposito è, beh, certo, è stato facile abbastanza per convertire 1 ad un galleggiare rendendo 1.0. Ma cosa succede se invece abbiamo avuto due numeri interi come int x è uguale a 1 e int y è uguale a 10, e poi volevamo Per fare x diviso y? Quindi non è facile da solo fare X.0 o qualcosa del genere. Così la correzione di tale sta lanciando. Così colata è un modo in C per convertire da un tipo variabile a un'altra. Così qui, uno è un numero intero. E mettendo questo galleggiante davanti si, stiamo gettando uno ad un galleggiante. E così questo convertirà la 1 a 1,0. E questo verrà convertito il 10 a 10.0. E poi le cose si comportano in modo simile al versione precedente abbiamo appena mostrato dove, come previsto, otteniamo 0,10 e si metterà a stampare quello. E possiamo farlo con variabili, troppo. Quindi possiamo dire, float x diviso per float y. JOSEPH: Tutte le domande? ROB: Così, proprio come in matematica normale, abbiamo precedenza degli operatori. Quindi, in classe di matematica, è molto più probabile chiamarlo ordine delle operazioni. Qui, il termine ufficiale è precedenza degli operatori. Ma la precedenza degli operatori, o la maggior parte operatori, è come ci si aspetterebbe. Quindi, proprio come in matematica, 2 volte 10 è andando ad essere raggruppati più strettamente di questo 10 diviso 2 e poi 2. L'ordine delle operazioni, lo farà 2 tempi 10, 10 diviso 2, e poi lo farà 20 più 5 più 2. Quindi è come previsto, ed è possibile utilizzare parentesi per raggruppare espressioni. Non è possibile utilizzare le parentesi quadre alle espressioni di gruppo. Sì? SPEAKER 5: Potrebbe effettivamente basta andare indietro di un secondo? Si può lanciare un int in una stringa? ROB: Quindi, in C, si può lanciare qualsiasi cosa si vuole tutto quello che vuoi. Questo non significa che sia una buona cosa da fare. Così, quando lanci un int a una stringa, che significa - e ci arriveremo in questo molto più a fondo - JOSEPH: Molto più tardi. ROB: io non voglio dire molto più tardi, così ho provato a cambiare la mia frase. Arriveremo in molto più a fondo più tardi dove davvero quando si ha un variabile stringa - quindi una stringa può essere arbitrariamente lungo, giusto? E stiamo dicendo che un int è quattro byte e lungo tempo di otto byte e un galleggiante è di quattro byte. Quindi una stringa, proprio come un int, ha solo un certo numero di byte da esso. E che sarà di quattro byte. Ma una stringa può essere abbastanza arbitrariamente lungo, giusto? Ciao Quindi mondo già, se è 10 personaggi o qualsiasi altra cosa, che è già andando ad essere sopra i 4 byte Posso inserire in una stringa. E così come le stringhe funzionano veramente è che essi sono dove in memoria che stringa viene mantenuta. E così qui, quando dico stringa x uguale ciao mondo, all'interno di x è solo dicendo, oh, ciao mondo viene memorizzato in questo luogo particolare in memoria. Quindi, se proviamo a lanciare un numero intero a un stringa, quindi stiamo cercando di interpretare una parte casuale di memoria come una stringa. E che rompe quasi sempre le cose. JOSEPH: Ma se questo confonde tu, noi tratteremo esso più in profondità in seguito. ROB: Già. Questo è dove stai andando per entrare in puntatori. E questo è un pezzo significativo di due settimane di questo corso. SPEAKER 6: Funziona come gli oggetti in altre lingue o non proprio? ROB: Quindi, in altre lingue, oggetti sarebbe rappresentato mediante puntatori. Non è la stessa cosa, però. Qualche idea? JOSEPH: No. Senza pensieri. ROB: OK. JOSEPH: Avanti. ROB: Basta andare con quello. Bene. Così modulo. Proprio come abbiamo più, meno, dividersi e moltiplicarsi. Così modulo è quello che si può non hanno mai visto prima. E dice semplicemente, dare me il resto. Quindi il 55% 10. Il resto di fare 55 diviso da 10 sarebbe 5. Quindi 55% 10 è 5. E il 3% 5 sarebbe 3. 8% 8 sarà 0. 16% 15 sarà 1. JOSEPH: Una cosa da notare con questo, troppo, è che potrebbe non funzionare come previsto se si utilizza un numero negativo. Così negativo 5% 4, alcune persone potrebbe pensare che è - cosa pensereste negativo 5% 4 sarebbe? SPEAKER 5: One. JOSEPH: Così alcune persone dicono una, alcune persone dicono uno negativo. Ma ciò - ROB: Io non avrei nemmeno disse uno di quelli. JOSEPH: Due, mi dispiace. Alcune persone dicono - ROB: Three. JOSEPH: Three? ROB: Negativo - quello che era il - negativo cinque - JOSEPH: Tre, tre, tre. Scusi. Perché con modulo, in genere, quando hai visto altrove, di solito significa restituire un numero positivo, giusto? ROB: Così, quando diciamo in matematica, 10% di, essi tendono a voler dare - se noi mod da 10, allora ci aspettiamo di ottenere un numero compreso tra 0 e 9. In qui, che non è il caso che si otterrà i numeri negativi restituiti. JOSEPH: così negativo 5% 4 sarebbe negativa 1. ROB: Ma è raro che sei mod-ing numeri negativi per cominciare. Saltare questo. JOSEPH: Già. ROB: Meh. OK. Quindi un'ultima cosa da sottolineare in merito galleggianti è che è un comportamento pericoloso, ma galleggianti non sono un esatto di rappresentanza. Quindi, tornando al byte di nuovo, ricordare che un int è sempre quattro byte e un galleggiante è sempre quattro byte. Quindi l'esempio di Lucas è abbastanza buono. Quindi, pensare di 1 diviso per 3. Così 0,3333333. Se ho solo 32 bit, come si può Immagazzino 0.33333 esattamente? E forse, per qualsiasi ragione, si dice, tutto bene, beh, diciamo solo che che questo particolare 1011001, LET'S solo dire che dovrebbe essere 0,333333. Beh, hai solo un numero finito di i bit, quindi è impossibile rappresentare ogni singola virgola mobile valore dato solo 32 bit. Beh, è ​​impossibile rappresentare qualsiasi valore in virgola mobile dato infinito - bene, dato un qualsiasi numero finito di bit. Quindi il problema qui è, bene, quando abbiamo usato per la stampa a due cifre decimali, abbiamo avuto modo corretto ottiene la risposta 0.10. Ma sotto il cofano, è davvero essere immagazzinato il più vicino possibile 0.10 come quei bit può rappresentare. È questa la diapositiva successiva? O non è vero? JOSEPH: Sì, è così. ROB: Blegh, blegh. JOSEPH: Sì, si può solo tirare le note un po '. ROB: Sto solo andando per ingrandire in sull'ultimo su questo. Oh mio Dio, questo è [incomprensibile]. Così quel numero. Questo è ciò che verrà stampata se corriamo quel programma. E notate che non è proprio un grande affare se stiamo preoccuparsi solo come 2-3 decimali. Come abbiamo solo inizialmente stampato 0,10, ed è per questo che abbiamo visto nulla di male. Ma una volta che cominciamo entrare nel esatto, il numero esatto che è rappresentare, vediamo che non può esattamente rappresentare 0.1. E parte del problema qui è come, tutto bene, va bene, ma, beh, in primo luogo, che cosa se abbiamo cercato di fare, la risposta è uguale uguale a 0,1? È che andando a restituire true o false? E quindi è difficile da dire. Penso che in realtà potrebbe restituire true. Sarà in primo luogo - Non lo so. La risposta è ancora una volta si inizia a trattare con valori a virgola mobile, è abbastanza tanto che non dovrebbe usare l'uguaglianza A causa di questa imprecisione. E per tutto quello che sai, è la centesima decimale che l' virgola mobile non ha potuto per gestire correttamente. E così la parità sarà solo riuscire anche se il numero - se tu fossi stato utilizzando i numeri esatti, i numeri dovrebbero stato esattamente lo stesso. È nel corso di 50 come calcoli utilizzando questi galleggiante valori del punto, l'errore può costruire su e su e su, e le cose solo ottenere sbagliato. JOSEPH: E ci sono stati davvero esempi famosi di questo avvenimento. Come ingegneri della NASA hanno ottenuto questo sbagliate, causando razzi per esplodere in l'aria dopo che sono stati lanciati. E un sacco di problemi come questo. Quindi, sì. SPEAKER 6: Quando dici 0.3 f, Non mi tronca il resto? Oppure è arrotondare alto o in basso? ROB: Sarà printf intorno ad esso? JOSEPH: Credo che tronca printf. ROB: OK. Quindi possiamo analogicamente andare in senso opposto direzione di questo, dove, in questo caso, più vicino potrebbe rappresentare 0.1 è stato con questo numero. Il più vicino potrebbe essere in grado di rappresentare 0.2 è in senso opposto direzione, 0,199999996356 o qualcosa del genere. Quindi, se siamo andati in quella direzione cose, poi printf 0.3 f sarebbero tornati 1.99 invece di 2.00. JOSEPH: E io non sono del tutto sicuro su questo. Si potrebbe desiderare di scrivere un piccolo, piccolo programma per verificare proprio questo. ROB: Però, quello che siamo certi è che se si è tentato di lanciare quella di un int, e colata di un int sta per indurlo a troncare il decimale, se si tenta di lanciare 1.9999999 ad un int, otterrete 1. E così si dovrebbe in genere utilizzare il Funzione rotonda nella libreria matematica. Domande? OK. JOSEPH: Quindi passare alle condizioni ed espressioni booleane. Quindi avete visto questi prima. E in realtà, mi permetta di assicurarsi il mio computer nel formato proprio qui. Spazio. Siamo spiacenti, stiamo andando ad avere a che fare un po 'con cutoff ai bordi. Ma sì, voi ragazzi avete visto prima in Scratch. Quindi questo qui è espressione che è utilizzato in un'istruzione condizionale. Così rispondere maggiore di zero volontà dirvi vero o falso. E questi sono davvero importanti, perché ci permettono di introdurre logica nel nostro codice. Così, per esempio, questo è un programma scritto in Scratch che chiede all'utente per un numero intero e dice loro se il numero intero che ti hanno dato è stata una numero positivo o negativo. E la conversione qui per vedere è prima di stampare la dichiarazione, dammi un numero intero. E poi si chiede loro per un numero intero. E quindi si utilizza la logica condizionale su qui per verificare se quel numero era in realtà maggiore di zero oppure no. Quindi qui abbiamo una espressione booleana interno di un condizionale If. C'è qualche domanda? Ci sono domande a riguardo? OK. Quindi c'è più di una semplice superiore, naturalmente. È possibile costruire espressioni booleane utilizzando la maggior parte dei tipi di cose che si potrebbe pensare in matematica. Quindi superiore. Questo dovrebbe essere un meno. Scusi. E la spaziatura. ROB: Dio non voglia si lascia. JOSEPH: Va bene. Quindi maggiore di, minore di, maggiore di, o uguale a, minore o uguale a. Usiamo doppio uguale per verificare uguaglianza, perché unico è uguale mezzi assegnazione, giusto? Sì. E poi possiamo anche non uguale per con punto esclamativo, è uguale. E questo simbolo punto esclamativo può anche essere esteso in modo che se si vuole invertire qualsiasi tipo di booleana espressione, si può fare. Quindi questo valuterà true solo se la risposta è meno o uguale a zero. Hai domande su questo? OK. Così si può anche combinare queste espressioni utilizzando logiche And e logico Or. Quindi questo è solo il simbolo E, che dovrebbe essere Shift, 7. E questo è il simbolo pipe, che è non una minuscola L. E 'quello che è di destra sopra il vostro tasto Invio. Quindi si utilizzano due di questi a simboleggiare logico E la logica Or. Quindi questo sarà solo restituisce true se la risposta è uno, due, tre, o quattro. E questo sarà solo restituisce true se la risposta è oltre che su entrambi i lati. Quindi non è uno, due, tre, o quattro. E il modo in cui si usa che in un'espressione - ROB: o zero o un cinque. JOSEPH: Zero o un cinque. Scusi. Sì, sì, sì. OK. E qui ora, allo stesso modo si avrebbe usato questa espressione, una più piccola lato espressione di un caso condizionale dichiarazione, si potrebbe anche utilizzare il Allo stesso modo, semplicemente inserendolo all'interno di le parentesi dell'istruzione If. Quindi questo printf solo fuoco se la risposta è uno, due, tre, o quattro. Tutte le domande di combinare espressioni? Quindi c'è un altro condizionale costrutto che chiamiamo un If / Else. Quindi, fondamentalmente, ciò significa che ora, OK, se qualcosa che volevo controllare non era vero, poi andare al Else e eseguire l'altra azione. Quindi, in questo caso particolare, ho chiesto l'utente per un numero intero. È il numero intero maggiore di zero? Sì? Bene, allora hanno scelto un numero positivo. Se no, allora deve avere stato negativo o uno zero. Quindi hai scelto un numero negativo o uno zero in questo caso. Sì. O uno zero. E poi abbiamo anche If / Else, Se e Else. Quindi questo ci permette di eseguire una sequenza di cose solo se i primi sicuro. Quindi, in questo caso, ora stiamo facendo l'ultimo si sceglie zero. Quindi, se non scelto un positivo, né un numero negativo, allora essi devono aver raccolto zero. Così va proprio in fondo alla catena come questo. Così un esempio di come un Se è diverso da - Se un / Else è diverso da solo una sequenza di Ifs. E questa è una domanda comune che la gente chiede è, bene, se ottenete come un 95 in CS50, che cosa sarà questo programma che si dice? SPEAKER 5: Hai un A. JOSEPH: sì. Hai ogni singolo uno di quelli di destra. Hai una A, hai una B, è ottenuto un C e D, giusto? Quindi, tutti questi ottenere valutato in ordine. Così, mentre un 95 è maggiore di 90, è anche maggiore di 80, è anche superiore a 70, ed è anche maggiore di 60. Quindi hai tutti questi gradi. E presumo si farebbe vogliono solo la A. Il modo per rimediare è quello di sostituire quelli con Else / Se s '. Quindi, in questo scenario, si vede che 95 è superiore a 90, e poi lo fa Non valutare il resto delle dichiarazioni. Hai domande su questo? Quindi c'è un altro tipo condizionale struttura che abbiamo qui che noi chiamare un'istruzione switch. Quindi questo consente di controllare praticamente quale sia il valore di un numero mettete nella istruzione switch è. Quindi, in questo scenario, stiamo passando su n, e noi stiamo dicendo, oh, se n è uno, quindi stampare questa affermazione. E poi pausa, il che significa che l'uscita fuori l'istruzione switch. Se non fosse stato uno, allora, bene, basta infine controllare tutti quei casi. E così controlla se è uno o due o tre, e la stampa di conseguenza. E che cosa questa parola chiave predefinita qui mezzi è se non entrano alcuna di quelli, poi dire non valido. Quindi diciamo che chiedo n e l'utente mi dà quattro. Beh, corrisponde a nessuno di questi casi, per far stampare ciò che c'è nella sezione di default. Sì, in discussione? SPEAKER 5: Si può utilizzare booleano espressioni anziché uno, due, o tre? JOSEPH: Quindi la domanda è: si può usare Espressioni booleane invece di uno, due e tre? E in C, ti credo non può farlo. Ma in altre lingue, che si potrebbe incontrare al fine semestre come JavaScript, è possibile. Beh, si dovrebbe calcolare primo tale valore e quindi utilizzare nel passare dichiarazione. Sì? ROB: Quindi una parte del beneficio dello switch dichiarazioni si pensa di se avete fatto questo come If / Else, così come se n è uguale equivale a uno o qualsiasi altra cosa. Else / Se n è uguale uguale a due, a prescindere. Else / Se n è uguale uguale a tre. Così il modo in cui il programma si porrebbe è altrove sarebbe sequenza andare giù quella lista e controllare, è n uno? Nope. E 'n due? Nope. È n tre? Già. Fate questo. Mentre con istruzioni switch, è effettivamente in grado di compilarlo per essere veramente veloce. E non appena si dice interruttore, dice, va bene, n è due, io sono immediatamente intenzione di saltare a dove Dovrei avviare l'esecuzione. Io non vado a controllare in primo luogo, n è uno, è n due? Si può subito iniziare a fare che cosa dovrebbe fare. E a causa di ciò, non può prendere condizioni booleane. Altrimenti avrebbe dovuto fare l' sequenziale, come, va bene, è n maggiore di zero? Else è n maggiore di 10 o qualsiasi altra cosa. JOSEPH: In questo caso, se si è utilizzato If / Else, se del, quindi l'interruttore sarebbe eseguire circa tre volte più veloce rispetto al caso / altro, se. Possiamo organizzare l'interruttore in tale un modo che non ci spezziamo dopo ciascuno dei casi. Quindi, in questo caso, sto partizionamento del numeri che abbiamo scelto in uno e due non essendo un numero elevato e tre è un numero alto. Quindi, in questo caso, se n è uno o due, colpirà il caso e allora sarà cadere attraverso, perché non c'è nessuna rottura. E finirà qui. Quindi, se prendiamo uno, farà il printf e poi rompere in modo che nessuno dei questa viene eseguita. E naturalmente, se entrano in tre o qualcosa d'altro, allora salterà quelli che non ci vanno, e eseguirà invece l' corrispondente linea. Ci sono domande a riguardo? Sì? SPEAKER 4: Desideri ottenere un errore se si ha avuto una pausa dopo caso uno ma non ha avuto qualcosa che lo facesse? JOSEPH: Quindi la domanda è: sarebbe si ottiene un errore se si dispone di una pausa dopo maiuscole uno, ma non c'è niente da fare? E la risposta è no. Non sarà effettivamente un errore. Sì, mm hmm. Così come una sorta di piccolo cambiamento qui, Ho intenzione di mettere un printf qui. Whoops. Quindi, che cosa sarebbe questa la stampa se Ho messo uno come input? Già. Si direbbe che non ci voleva un numero alto due volte, giusto? Perché avrebbe colpito quel primo caso, non sarebbe rompere, e sarebbe caduta attraverso al secondo caso. Hai domande su questo? ROB: Hai avuto un'altra domanda? JOSEPH: OK, raffreddare. Bene. Quindi c'è qualcosa che chiamiamo operatore ternario che è fondamentalmente un sintassi alternativa a fare Se poi Else. E ti permette di fare tutto in una sola riga. Quindi, in questo particolare programma, Sto chiedendo all'utente di n. E se n è maggiore di 100, dico loro hanno scelto un numero alto. Altrimenti dico loro che scelto un numero basso. Così possiamo usare questa sintassi molto lungo, stringa, S, e quindi verificare se n è maggiore di 100 e assegnare di conseguenza. Ma possiamo rendere questo molto più conciso utilizzando questa sintassi operatore ternario che coinvolge una domanda segno e due punti. Quindi, il punto interrogativo è essenzialmente fare una domanda, giusto? ROB: Forse zoom su quella. JOSEPH: sì. Buon punto. Quindi questo è l'operatore ternario. Mi chiedo prima la domanda, n è maggiore di 100? Se lo è, allora eseguo la prima parte prima dei due punti. Se non lo è, allora eseguo l' seconda parte dopo i due punti. Quindi, se n è maggiore di 100, poi raccoglie e mette alto che nella stringa s. Se n è inferiore a 100, raccoglie basso e poi la mette nella stringa s. In modo che si condensare questo grande pezzo giù in solo che una sola riga. SPEAKER 5: Che è popolare? JOSEPH: Sì, è abbastanza popolare per cose dove in sostanza si desidera do un incarico basa su una sorta di condizione. E in questo caso, abbiamo cercato ad assegnare un valore alla stringa s. Non è così - Credo che non mi preferisco negli altri casi. Ma è particolarmente utile per questo incarico. ROB: Questo è un modello abbastanza comune dove avete qualche variabile stai per dire, se qualcosa, impostare questa variabile per un valore, altrimenti, impostare questa variabile per un altro valore. E questo è lo scenario dove utilizzare un ternario. JOSEPH: E stai risparmiando un sacco di linee, giusto? E rende solo il codice discutibilmente un po 'più leggibile. Sì, in discussione? SPEAKER 6: Per un ternario, potresti andare, stringa s eguali s, punto interrogativo? E allora si potrebbe avere, ad esempio, cinque diverse opzioni. E a seconda di ciò che il numero di n è stato, vuoi scegliere uno di quelli? JOSEPH: Quindi la domanda è: esiste un sorta di sintassi dove si può fare stringa s è uguale a n, e quindi avere più di due opzioni dopo che il punto interrogativo? E una risposta semplice è no, non c'è davvero un buon modo per farlo se non Vuoi nido ternario multipla operatori all'interno di ogni altro. Si potrebbe fare come n maggiore di 100, punto interrogativo, e poi un altro operatore ternario, n maggiore di 50, punto interrogativo, e nidificano in questo modo. Ma in questo scenario, il codice è ottenendo genere di illeggibile e disordinato, e potrebbe essere meglio andare solo per un'istruzione If / Else a quel punto. ROB: E anche, come nota a margine, PHP implementa in modo errato il ternario operatore tale che ternari nidificati non anche lavorare come dovrebbero. JOSEPH: Già. Così diventa un po 'di confusione, soprattutto quando si va a lingue diverse. ROB: E 'abbastanza confuso che le lingue sono sbagliato su di esso. JOSEPH: Quindi, in realtà, giusto per chiarire, sa a tutti ciò che % S fa qui? Hai domande su questo? Credo che solo per la fotocamera, l'% s fondamentalmente ci permette di mettere un segnaposto per una stringa. E poi, alla fine, si precisa che la variabile vogliamo mettere in questo supporto posto è s. Quindi, che prende fondamentalmente s e mette in qui. E poi stamperà, hai scelto un alto o scelto un numero basso. OK. Quindi loop consentono di eseguire le cose con movimenti circolari, giusto? Si potrebbe avere incontrato questo Scratch in forma di loop per sempre o Ripeti Fino a quando o Ripeti una particolare numero di volte. Allora, perché questo è un bene per noi? Beh, in C, diciamo che abbiamo questa canzone implementato in Scratch che canta, questa è la canzone che non finisce mai. Si va solo avanti e avanti e per sempre e per sempre. Beh, non si può davvero fare un programma che ha un numero infinito di printf dichiarazioni in esso, giusto? Quindi, in questo particolare scenario, in un modo che si potrebbe fare questo lavoro e per farlo stampare sempre è invece utilizzare un ciclo While. Quindi un ciclo While esegue ciò che è nel corpo delle due bretelle che appartiene ad esso sulla base di ciò la condizione è. Quindi in questo esempio particolare prima, se vogliamo stampare questa per sempre, ciò che potremmo fare? Beh, certo, giusto? Quindi questo tipo di combina l'idea di qualche espressione booleana con un ciclo. E abbiamo imparato a conoscere booleano espressioni precedenti. Così ogni volta che la condizione all'interno di Mentre che rimane vero, questo ciclo verrà eseguito su e su e su. E in questo caso, se abbiamo appena forniamo essa con il vero, questo provoca un infinito ciclo che stampa la canzone su e su e come noi desideravamo prima, senza avere un programma che ha un infinito numero di istruzioni printf, che è non possibile. Quindi più convincente, però, è possibile utilizzare questo con un variabile ed una condizione. Quindi diciamo che vogliamo ripetere l' frase, totalmente Loopy, 10 volte. Che cosa si può fare con un ciclo While è è possibile innanzitutto inizializzare un contatore variabile all'esterno del Mentre ciclo a 10. E poi in fondo, ogni volta che si va attraverso il ciclo While, si stampa l'istruzione e quindi si riduce il variabile contatore fino alla fine, a un certo punto, una volta che sottraiamo ho abbastanza volte, 1 da I abbastanza volte - e giusto per chiarire, io meno meno significa che è uguale a I meno 1. Che fondamentalmente mi porterà verso il punto dove una volta mi ha colpito zero, questo condizione non è più vera e quindi esce dal ciclo. Così totalmente Loopy stampa solo 10 volte. Hai domande su un ciclo While? OK. Quindi c'è un modo in cui possiamo fare quello che abbiamo appena ha fatto in modo più conciso ciò che noi chiamiamo un ciclo For. Quindi un ciclo For costituito da un inizializzazione, condizione, e un aggiornamento, proprio come avevamo prima in questo ciclo While. Quindi diamo un'occhiata. In questo ciclo While, abbiamo avuto un inizializzazione, poi abbiamo avuto una condizione che abbiamo controllato. E poi abbiamo avuto un aggiornamento un passo in alto. Con un ciclo For, questo richiede fondamentalmente queste tre cose e lo condensa giù in una riga. Quindi la prima cosa che si fa nel Per loop è l'inizializzazione. E poi si fa un punto e virgola, e poi fate la condizione, che è io maggiore di zero va là, e poi la fase di aggiornamento. Così questa viene effettuata a fine del corpo del ciclo. Quindi, questi due programmi sono sostanzialmente equivalente. Tutte le domande? Così che cosa è una differenza tra questi due? Chiunque può farlo notare? Potrebbe essere un po 'sottile. E 'solo una differenza molto piccola. Sì? SPEAKER 5: non sarebbe in grado di utilizzare la variabile I all'esterno del ciclo For [Incomprensibile]? JOSEPH: Esattamente. Quindi questo è qualcosa che arriveremo a più tardi chiamato portata variabile. Ma in sostanza, questo int vite I al di fuori di questo ciclo While. Quindi, una volta che questo ciclo While è fatto esecuzione, sarò in grado di utilizzare successivamente ho sul nel programma. Considerando che con questo ciclo for, questo int I è ambito interno di questo ciclo For. E poiché è all'interno di questa porzione del ciclo For, che inizia le parentesi e finisce con la parentesi graffa laggiù. Tutto ciò che è dichiarata all'interno di qui non può essere utilizzato al di fuori. Quindi, se io cerco di usare io fuori, sarà dimmi, simbolo sommerso. E in sostanza, non vorrei essere in grado di usarlo. ROB: E così, 10 anni fa, in letteralmente tutti i casi, le parentesi graffe sono quello che hai usato per determinare l'ambito di una variabile. Così in là, INT uguale a 10 è dichiarata all'interno di questa set di parentesi graffe. E così poi fino a quando si tenta di utilizzare I prima di questa parentesi graffa, va bene. Si potrebbe vedere quando si digita fare, si vedi cruscotto, plancia, std, pari, C99. Così che è una versione successiva di C che GCC ha implementato che dà anche questa scorciatoia. Quindi questo consente di non essere consentito in C. E si può capire perché, perché questa int Mi è al di fuori di questa parentesi graffa ma è ancora considerato nella portata di queste parentesi graffe. Ma questa è una cosa molto comoda, e quindi è una buona estensione. JOSEPH: Tutte le domande? OK. Allora, cosa c'è di più utile è che a volte si vuole una sorta di dinamismo il ciclo, giusto? Tu non vuoi solo necessariamente stampare totalmente Loopy tutto il tempo, voglia di contare da 10 o qualcosa del genere. E così è possibile utilizzare la variabile contatore all'interno di tale ciclo pure. E in questo caso, questo programma solo conta alla rovescia da 10 fino in fondo. E che cosa non stampa? Essa non stampa nulla, destra, perché quando - Sì, anche non stampa 11. Quindi non stampa nulla, perché quando Mi è zero, ricordo, valuta la condizione prima di metterlo in per eseguire il corpo del ciclo. E quando mi è zero, questo è falso, così non stampare il conto alla rovescia zero, esso stampa appena fuori conteggio giù 10 tutta la strada fino a 1. Se abbiamo effettivamente volevamo stampare zero, allora avremmo messo un segno di uguale dopo questo segno di maggiore. OK. Quindi un modo per farlo convalida dell'input, che è quando si chiede all'utente di fare qualcosa, si vuole fare in modo che seguire le vostre istruzioni, è quello di utilizzare il ciclo While, giusto? Quindi, in questo caso particolare, sto chiedendo per un numero positivo e quindi sono in attesa di input. E poi ho controllato Mentre l'ingresso è minore di zero, tenerli a chiedere. Quindi, fintanto che mi danno un numero che non è positivo, continuare a chiedere, continuare a chiedere, continuare a chiedere. Ma che è una sorta di strano su questo? O che cosa non sembra ottimale su questa struttura proprio qui? Chiunque? Sì? SPEAKER 6: Si sta ripetendo l'istruzione due volte. JOSEPH: Giusto. Quindi abbiamo due istruzioni printf qui, giusto? Quindi c'è un modo abbiamo potuto ottenere questo basta fino a uno che avrebbe fatto la nostra codice più facile da leggere e un po 'più pulito. E allora non avremmo dovuto hanno Ottieni due volte pure. E un modo è possibile fare questo è utilizzando un ciclo Do-While. E un ciclo Do-While è fondamentalmente un differente forma di un ciclo While dove tutto ciò che è all'interno delle parentesi graffe viene eseguito almeno una volta. Quindi qui, dichiaro, int ingresso, esterno prima. E poi ho appena detto, fare questo istruzione mentre l'ingresso è minore di zero. Così colpisce il Do primo. Sarà sempre eseguire questo almeno una volta, in modo che sempre chiedere all'utente per ingresso almeno una volta. E poi si valuta che l'ingresso, e si va avanti in un cerchio. Sì, in discussione? SPEAKER 6: C'è un modo per farlo [Incomprensibile] tipi, come se dici, GetString, e qualcuno [incomprensibile] c'è un modo per [incomprensibile] JOSEPH: Quindi la domanda è: esiste un modo per farlo convalida dell'input se l'utente non mette nella giusta tipo di variabile? Quindi, se chiediamo un int e ci danno invece una stringa. E nelle funzioni che implementiamo per voi, GetInt, GetString in tutti quelle funzioni, che in realtà già fare questo tipo di input tipo di base validazione sotto il cofano. Quindi, se si sta utilizzando le funzioni che abbiamo ti ha dato, in realtà non è necessario. Ma se si vuole guardare più in che modo si può effettivamente fare questo, si può guardare sotto il cofano il file I/O-- non depositare, le funzioni di I / O standard come una lettura da standard input e standard output. E si può ottenere un senso migliore di come si potrebbe fare. ROB: Un problema, però, è specificamente con l'esempio che Detto questo, ci si aspetta una stringa ed entro un int. Come vorresti dire la differenza tra intenzionalmente vogliono il stringa 123 contro voler int 123? Così stringa, è praticamente non c'è convalida, è solo quello che immesso si interpreta come una stringa. Int è più facile, perché non importa l' ingresso si prende da parte dell'utente, si sono tenendo sempre una stringa. E così quella corda si può quindi controllare, sono tutti questi le cifre in realtà numeriche? JOSEPH: OK. Hai domande su un ciclo Do-While? ROB: Oh, e questo è anche - tornare a portata, un po 'comune errore sta cercando di utilizzare alcuni locali variabile da questa Do-While ciclo all'interno di questa condizione. E in realtà, se solo siamo sbarazzati di questo e disse, int ingresso è uguale GetInt, poi il compilatore urlare a noi, perché ingresso non esiste al di fuori del campo di applicazione queste parentesi graffe. JOSEPH: Ed è per questo che bisogno di questa formazione qui. OK. Così si può anche uscire da un ciclo presto se si vuole. Quindi questo è un modo diverso di attuazione di quello che abbiamo appena implementato. E invece di utilizzare la condizione all'interno delle parentesi, stiamo usando un Se dichiarazione all'interno del corpo del ciclo Do-While. E in fondo, quando l'ingresso è finalmente maggiore di zero, ci sarà uscire dal loop. E così andremo tutti fino a qui. E si può vedere che questo sarebbe probabilmente preferibile in questo scenario, perché è un po ' po 'più pulito e un po' po 'più facile da leggere. Considerando che questo è una sorta di disporre di linee aggiuntive in esso. E 'solo un po' più brutta, Credo che, in un certo senso. Sì, in discussione? SPEAKER 4: si romperà ottenere solo fuori di una serie di parentesi graffe? JOSEPH: Giusto. Quindi la domanda è si romperà solo si ottiene da un loop? E la risposta è sì. Quindi, se avete cicli for nidificati, per esempio, se ho Per int io uguale a 0 fino alle 10 e poi per int J è uguale a 0 fino alle 10, se rompo fuori interiore loop, io ancora andare all'anello esterno. Così terrò eseguire l' operazioni all'esterno. Hai domande su questo? Sì? SPEAKER 5: Ma rompere solo le funzioni di parentesi graffe, non per altro dichiarazioni? [Incomprensibile] JOSEPH: Quindi la domanda è si romperà funzione solo per i cicli in contrapposizione a altre dichiarazioni come se? E sì, questo è il caso, perché si sta rottura di un ciclo, a destra, in un senso. ROB: Nella stragrande maggioranza dei casi, è questo è il tipo di Se qualcosa, poi pausa. Quindi non c'è bisogno di rompere applicare a il caso che sta avvolgendo intorno ad esso. E inoltre, questo non è molto di un ciclo, ma ricordate che gli interruttori sono anche scoppiata di da interruzioni. Abbiamo visto pause utilizzati con interruttori prima. JOSEPH: E potete anche usarli nei cicli while e for loop. Tutte le domande? OK. Così la prossima up è funzioni. Così si potrebbe aver usato uno di questi BYOB blocchi nel progetto Scratch. E questo permette fondamentalmente di definire un set di le istruzioni da seguire. E quello che voglio dire con questo è pensiamoci torna alla matematica, diritto, algebra. Hai ciò che noi chiamiamo una funzione di x, qualche variabile, e diciamo che questo funzione f di x è uguale x più 5. Così si può pensare di f di x come questo nero casella che prende 15 in poi produce 20. Quindi, più in generale, una funzione è qualcosa che prende alcuni ingressi e poi produce alcune uscite. E perché sono funzioni bene? Sono buoni per una serie di motivi. Così fa qualcuno vuole prendere una pugnalata a quale organizzazione significa? In termini di Perché funzioni sono utili? Sì? SPEAKER 4: Rende il vostro codice più leggibile. JOSEPH: Giusto. Così una delle cose è fa il codice più leggibile, giusto? Invece di avere come int x è uguale x volte x volte x, posso avere cubo di x, che è più leggibile e più comprensibile ad un lettore. L'organizzazione è anche in termini di suddividendo il codice in gestibile porzioni, in modo che invece di cercare di implementare tutto questo in una sezione lungo in principale, è possibile una sorta di dividerlo in come, OK, scriviamo una funzione al cubo qualcosa, scriviamo un funzione di piazza qualcosa. In questo modo è possibile dividerlo in minuscolo, piccole parti che si possono affrontare invece di cercare di affrontare un grosso problema tutto in una volta. ROB: O anche piccole, piccole parti che voi e il partner può affrontare. JOSEPH: Già. ROB: Così, invece di due stai cercando di impiantare una funzionare allo stesso tempo. JOSEPH: Semplificazione. Chiunque vuole prendere una congettura? Sì? SPEAKER 5: Più ripetizione. JOSEPH: Giusto. Quindi, una cosa che si può fare con semplificazione è che è una sorta di on le stesse linee riutilizzabilità è che Una volta ho scritto una funzione cubo, posso basta usare che più e più e più volte di nuovo nel mio programma invece di digitare x volte x volte x sopra e più e più volte. E semplificazione anche qui solo significa che rende il codice sorta di facile eseguire il debug di una volta si divide questo in su in funzioni. Perché allora si può localizzare dove i vostri problemi di sorta sono. Tutte le domande? Quindi, un'altra idea è l'astrazione, giusto? Questa scatola nera. Come si fa a sapere cosa fa GetInt per ricevere input da parte dell'utente? Non abbiamo davvero detto che, giusto? Tutto quello che vi abbiamo detto è GetInt fa esattamente quello che dice lo fa. Quindi, anche se noi non diciamo come funziona, si sa ancora. Quindi, in questo caso particolare, è una funzione quadrupla che fa cose diverse per un ingresso per produrre un output. E si può quadruplicare il numero moltiplicandolo per quattro. Oppure si può ciò che noi chiamiamo bit spostarlo per due. E vedremo questa un po 'più tardi. E non c'è bisogno di sapere come questo funzione effettivamente funziona fintanto che funziona come indicato. Così, sotto il cofano, potrei essere come, ritorno orari di ingresso otto diviso per due. E non si sa, giusto? Tutto quello che devi sapere è si fa quello che dice. Ecco, questo è la cosa più utile su astrazione. E un'altra cosa è una sorta di questa idea di localizzare il codice per un particolare sezione. Quindi, se avete un problema, non è necessario deve andare tutto il codice cercando per risolvere dove fosse il problema. Quindi, in questo caso, ho implementato cubo sbagliato. Ho pensato cubo è stato moltiplicando per tre. Quindi, in questo caso, si tratta di un programma che appena ha moltiplicando per tre ovunque. E c'è un altro programma che ha cubo di factoring fuori in una funzione. E così ora se voglio risolvere il mio errore qui, devo sistemare ogni singola riga di codice in questo programma. Considerando che, d'altra parte, se uso l' funzione, ho solo bisogno di cambiare cosa c'era di sbagliato in un unico luogo. Quindi, in informatica, si chiamare ingressi e uscite. Gli ingressi sono denominati parametri o argomenti, e le uscite sono chiamati restituire valori. E vedremo come questo ci aiuta a risolvere di definire una funzione in un secondo. Quindi questa è una definizione di funzione per la cubatura. Così richiede un input, e poi restituisce che numero di volte si tre volte. Quindi cerchiamo di scomposizione. Quindi abbiamo una intestazione di funzione, che consiste essenzialmente di tre cose. Così abbiamo i parametri, che sono, come ho detto prima, l' Ingressi in questa funzione. E poi diamo la funzione di un nome. In questo caso, si chiama cubo. E poi specifichiamo che tipo del valore di ritorno è. Quindi, in questo caso, la mia funzione cubo prende in un numero intero ed è anche restituisce un numero intero. Quindi, se mi passate in due, due è un numero intero, ritorna otto a me, che è un numero intero. Quindi tornare parametri nome del tipo. Domande su questo? E poi il valore di ritorno è in realtà specificato alla fine dicendo ritorno e poi tornare a prescindere contiene il valore di ritorno. Quindi, in questo caso, se mettiamo tutto insieme, una funzione prende in parametri, si chiama qualcosa, e restituisce qualcosa che è del tipo che noi diciamo che sarebbe stato. Tutte le domande? Così come usiamo una funzione? Ebbene, scriviamo una funzione e poi usiamo nel nostro programma, giusto? Così ho chiamato cubo, e allora posso usare cubo. Ma ciò che è importante notare è che le questioni di ordine. Se ho cubo di seguito principale, è andando a correre in cubo. E a questo punto, non c'è niente chiamato cubo nel programma, ed è solo andando a essere come, ho idea di cosa cubo è. Così vi dirà, implicita dichiarazione di funzione. Questo è l'errore che si presenta. E così in questo caso, cubo è inferiore principale, quindi non sta andando a sapere. SPEAKER 5: Così principale è di solito l'ultima funzione definita? JOSEPH: Quindi la domanda è, è il principale solito l'ultima cosa che avresti definito? E nessuno. È perché noi di solito piace principale per essere al top, giusto? Perché questa è la prima cosa che vuole aprire il programmatore del programma per vedere. E così come possiamo risolvere questo problema di noi voler principale di essere in alto, ma l' funzioni che vogliamo, noi li vogliono al di sotto principale ancora in grado di utilizzare loro all'interno della principale? Beh, usiamo quello che noi chiamiamo un prototipo di funzione. Così che cosa un prototipo di funzione essenzialmente si è in primo luogo prende ciò che la firma o l'intestazione funzione di ciò che vogliamo implementare giù qui, e abbiamo messo a all'inizio di un programma. Quindi, in questo caso, diciamo che, beh, più avanti nel nostro programma, stiamo andando per fare una promessa per implementare questo funzione chiamata int cubo, che prende un valore intero. Così ora, perché è al di sopra principale, principale, sta andando a dire, oh, bene, più avanti nel programma, che sta per essere c'è modo che io possa fare riferimento ad esso, quindi mi basta lasciare che si completi per ora. E quindi nella parte inferiore, implementiamo cubo. E poi principale sarà solo dire, bene, ordinerà di collegamento questi due simboli insieme. E vedremo che cosa significa seguito. E così saprà che questo è il funzione di cubo che dovrebbe utilizzare. ROB: Il [incomprensibile] di voler principale in basso o top, ho visto entrambi. Ci sono cose che proprio come mettere principale in basso. Ma una volta che un progetto diventa particolarmente grande, di solito principale è in una archiviare tutto suo. E a quel punto, come il int linea cube sarebbe - all'interno di stdio.h sono un mucchio di linee proprio come quella int linea di ingresso cubo int. E così quei prototipi sono cose che tendono a mettere in file di intestazione, a che punto, non importa. Beh, non importa. Quelli vanno sempre al top. E se principale non è un file tutto suo, non dovete preoccuparvi di mettere singoli prototipi di funzione nel file. JOSEPH: E ci arriveremo un po ' po 'più tardi, quando Rob comincia a parlare sulla compilazione. E così c'è anche una differenza tra il parametro e l'argomento. E il parametro è proprio quello chiamiamo questi ingressi quando definiamo la funzione. E noi lo chiamiamo un argomento quando abbiamo effettivamente passare alla funzione. Quindi, in questo caso, si tratta di un parametro, come abbiamo detto prima. E quando abbiamo effettivamente usiamo laggiù, cubo di x, allora X è di per sé ciò che noi chiamiamo un argomento alla funzione cubo. ROB: Quindi gli argomenti del parametro sono - c'è questa distinzione, molto confusa intercambiabile. A questo punto, per me, è come uno di quelle parole che quando la vedo in selvaggio, non posso fare a meno subito questione se lo si utilizza in contesto corretto, perché il la differenza è abbastanza sottile che basta ognuno tende - Ho quasi sempre dico argomento indipendentemente da quello che voglio dire. Giuseppe e funzioni sono anche utili per quello che noi chiamiamo effetti collaterali. Quindi, una funzione può prendere nessun ingresso, e può anche produrre nessuna uscita. Quindi, in questo caso particolare, io sono definire una subroutine che non ha valore di ritorno. E al fine di specificare che, usiamo ciò che noi chiamiamo un vuoto qui. E così l'effetto collaterale di questa funzione è che la stampa solo roba out alla pagina. In realtà non si assume alcuna ingressi, e non è così effettivamente produrre qualsiasi uscita. Ma questo potrebbe essere utile nel senso se si vuole, ad esempio, eseguire il debug qualcosa nel programma, se volete per scrivere un po subroutine che stampa fuori, diciamo, il contenuto di memoria o qualcosa del genere. E così questi effetti collaterali sono a volte utile di fuori del contesto di proprio come ingressi e uscite. Tutte le domande? E per finire questo particolare segmento, cosa fa questo programma? Ti darò ragazzi un paio di secondi per leggere attraverso di essa. A un livello molto elementare, quello che vogliamo dire è che scambia x e y, giusto? Così come molti di voi effettivamente pensare questa cambierà xey? Alzi la mano. Nessuno. OK. Chi pensa che lo farà Non scambiare x e y? E la somma di che era non l'intera stanza. Così alcune persone non sono sicuro. OK. Questo è ragionevole. Quindi cerchiamo di passare attraverso ciò che accade quando si chiama in realtà in primo luogo funzioni Per rispondere a questa domanda. Quindi questo è ciò che la memoria sorta di simile. Questo è un po 'come un modello semplificato di ciò che la memoria sembra quando si esegue un programma. Quindi c'è qualcosa che si chiama lo stack qui e qualcosa chiamato heap. E questi crescono verso mezzo di memoria. Quindi, in questo caso particolare, quando si chiama una funzione, viene messo in pila. E quindi ciò che è contenuto in tale funzione rimane in ciò che noi chiamiamo stack frame della funzione. E così, per ottenere una bella visualizzazione di questo, let's - per esempio, abbiamo avuto la programma principale precedenza. E dentro di principale, abbiamo chiamato cubo. Quindi principale sarebbe prima andare in pila cornice, perché è la prima funzione che si chiama. E poi, quando cubo viene chiamato all'interno di principale, viene messo in cima principale all'interno della memoria. Quindi, ciò che noterete è che cubo ha i suoi parametri e la sua propri locali. Così, quando si passa effettivamente qualcosa da una funzione, i parametri che ottiene sono copie di quello che era passato dalla principale. E per una sorta di spiegare questo, cerchiamo di a piedi attraverso un programma. Così abbiamo la pila, questo è solo la porzione stack. E quello che facciamo è per prima cosa inizializziamo x ed y di uno e due. Così abbiamo queste piccole scatole. Sono seduto in stack principale inquadrare sullo stack. Essi contengono uno e due. Ora chiamiamo swap. Quello che succede è passiamo x e y in swap e di swap crea le proprie copie di tali variabili da utilizzare all'interno del suo stack frame. Così ora là, abbiamo una, che contiene il valore che aveva x e b, che contiene il valore che y avevano. Quindi uno, due. E si noterà che questa è separata da xey all'interno del principale. Così ora creiamo un temporaneo variabile per contenere un. Abbiamo impostato una uguale a b, quindi modifiche da uno a due. E poi abbiamo fissato b uguale di temperatura, che è uno. E poi adesso usciamo fuori di questa funzione. Quando si esce dalla funzione, l' stack frame viene estratto dallo stack. Noi lo chiamiamo spingere. Si preme uno stack frame nello stack e se si pop dallo stack. E così quello che succede è tutto ciò che sia in quello stack frame sorta di appena va in fiamme. E in modo tale che non esiste più. Ma cosa notiamo? Non abbiamo mai realmente cambiato il valori di x ed y, giusto? Così quelli soggiornato locale principale. E passando le cose in swap, ci in realtà mai cambiato quei valori. E che cosa chiamiamo questo? Noi chiamiamo questo passaggio per valore. Quindi, in C, quando si passa le cose in funzioni, li passa dal valore e fa una copia di loro per la funzione da utilizzare. E impareremo qualcosa chiamato passando per riferimento futuro, ma che è un modo per risolvere questo problema. Ma noi non preoccuparsi che fino a tardi. ROB: E in realtà, quel termine, passando per riferimento, quindi C non ha nemmeno passando per riferimento. C è esclusivamente di passaggio per valore. Non importa quello che fai, sei sempre passando una copia di qualcosa. E 'solo che, come ho accennato una sorta di che prima con puntatori e che una stringa è in realtà solo quattro byte che punta a un posto nella memoria. Beh, se ho questa stringa ed è mi dice che è dove la stringa - bene, se ho questo puntatore a questo collocare nella memoria, allora posso passare un copia di tale puntatore a una funzione, e che la funzione sa ancora dove memoria è. Quindi entrambi questi indicatori siano rivolte nello stesso posto in memoria, e è così che stiamo andando potere modificare cose oltre l' stack frame corrente. JOSEPH: Vuoi fare la compilazione? ROB: No, è 05:30. JOSEPH: OK. E '5:30. OK. Quindi ci occuperemo di compilazione Credo che in la sezione successiva, o la vostra sezione Leader in quel punto. E - ROB: Tutte le domande? JOSEPH: Tutte le domande? Sì? SPEAKER 5: Utilizzo di stringhe da CS50, qualsiasi funzioni che vogliamo utilizzare per quelli, che sarà come funzioni C. CS50 non è andato in e fatto alcun ulteriore. ROB: Corretto. Qualsiasi della C come [incomprensibile], è avrebbe usato quelle sulle nostre corde. JOSEPH: E un'ultima cosa che voglio menzione è che abbiamo una guida di stile per questa classe. ROB: Oh, sì. JOSEPH: Quindi, se siete arrivati ​​da un sfondo di programmazione prima, potrebbero avere alcune convenzioni quando si sta scrivendo il codice come mettere parentesi sulla stessa linea o particolari modi di rientro o nominare le variabili. In questa classe, vogliamo seguire un Guida stile specifico solo perché, bene, se si va fuori e lavorare in industria, si sta andando ad essere previsto seguire la guida di stile del società in cui si va a. Come per esempio, Facebook penso ha una particolare specie di denominazione convenzione. E ci sono differenze tra cammello variabili involucro e come separandoli con sottolineatura. E anche, credo, soprattutto, come per esempio, il rientro, giusto? Noi parentesi graffe cominciamo dove la condizione è, e sono sulla riga successiva. E abbiamo anche messo tra parentesi graffe in anche se è solo una linea. E un sacco di volte, ci sono modi per farlo dove è possibile lasciare questi tutori fuori se si tratta di una sola riga sotto l'istruzione If. Ma in questa classe, vogliamo seguire un Guida stile specifico solo così si ottiene utilizzato per questo genere di cose. ROB: Sì, e Style 50 sta per far rispettare questa guida di stile, e siamo intenzione di utilizzare Style 50 al grado codice. Quindi rende le cose più facili per noi e speriamo non dovrebbe fare cose che molto peggio per voi dato l' stile standardizzato non dovrebbe essere così irrealistico. JOSEPH: E infine, per trovare lo stile guida, passare a manual.cs50.net/style. E sì. SPEAKER 4: Avete intenzione di far rispettare eventuali caratteri per riga? ROB: sì. JOSEPH: Mi dispiace, ragazzi. ROB: E 'come uno di unici. A questo punto, io sono OK con 120. Sto bene con dire 120 caratteri per riga. Capisco che ci sia un limite. Penso che 80 è così piccolo, ma stiamo farla rispettare. JOSEPH: Personalmente, penso che con C, 80 caratteri è più OK. Una volta che si avvia sempre di altri linguaggi come JavaScript e PHP, non così ragionevole limitare solo a 80 caratteri. OK. Beh, quella era la sezione eccellente. Qualcuno vuole caramelle? SPEAKER 4: Sì.