[RIPRODUZIONE DI BRANI MUSICALI] DAVID MALAN: Ciao a tutti. Questo è il supersection di CS50. Sezioni assegnati non sarà partire per un'altra settimana. E così oggi, sono qui with-- MARIA: Maria. DAVID MALAN: --to realtà dare un'occhiata al problema impostare uno, il corso del prime settimane di materiale, farti orientato con CS50 IDE, un po ' di Linux, il sistema operativo che è esecuzione su IDE, nonché guardare alcune delle transizione da zero a C leader fino a un problema impostare. Quindi, senza ulteriori indugi, in problema impostare una, si sta andando ad essere introdotto per CS50 IDE, che è questa programmazione web-based ambiente che usiamo per scrivere programmi. E 'stato progettato per apparire molto ricorda un tipico computer sistema che esegue un operativo sistema chiamato Linux. Ma è nella cosiddetta nuvola, il che significa tutti in classe può effettivamente avere la sua conto proprio e usarlo, pure. Così la maggior parte di voi probabilmente non hanno mai usato un ambiente Linux prima o forse anche un ambiente a riga di comando. E una riga di comando ambiente è diverso. E 'tutto testuale. E 'tutto i comandi della tastiera. E non è mousing, nessuna icona, senza finestre di dialogo, nessun menu. E 'puramente testo. Così in un primo momento, che tipo di si sente come un passo indietro in termini di sofisticazione. Ma finisce per essere un sacco più potente, certamente, per uno scienziato informatico, in ultima analisi. Quindi, diamo uno sguardo. Eccomi a CS50.io, attraverso la quale è possibile accedere al CS50 IDE. E proprio come in Scratch, c'è tre aree principali di questa schermata. Così sul lato sinistro, abbiamo quale sarà il browser di file. E c'è questa cartella in superiore, che è in questo momento vuoto da quando mi sono liberato di tutti i miei file prima supersection. Ed è qui che faremo salvare i file C che scriviamo. In alto a destra, abbiamo un posto dove tutto il nostro codice sta per ottenere scritta. E in effetti, se clicco questo plus, questo sta per farmi scegliere Nuovo File. E qui posso iniziare a scrivere codice C o, davvero, qualsiasi numero di altre lingue. E quindi nella parte inferiore dove dice jharvard @ ide50-- e la tua volontà dire qualcosa di un po different-- cosa si chiama? Finestra Terminale. Già. Così la finestra del terminale è la cosiddetta linea di comando interfaccia tramite la quale è possibile interagire con il sistema operativo sottostante. E per ora, stiamo andando a fare molto poco uso di questo-- solo per la compilazione, a guardare i messaggi di errore che vediamo, e di eseguire i nostri programmi. Ma alla fine, stiamo andando a fare molto di più, pure. E si può anche installare il software e gestire il vostro spazio di lavoro all'interno CS50 IDE, pure. Ma più che un'altra volta. Quindi cerchiamo di andare avanti e scrivere un programma molto semplice basta di passare attraverso un warm-up di hello.c, che è forse il programma più semplice si può scrivere. Ho già aperto una nuova scheda. Ho intenzione di andare avanti e dire includere io.h. norma Poi int main (void). E poi printf ("ciao, mondo" backslash n, vicino citazione, chiudere parentesi e virgola. Tutto ok. Così ora si noti la mia finestra è senza titolo. Così sto andando molto rapidamente per salire su File, Salva. Ed è importante che Io chiamo questo non "ciao". Quindi un errore molto comune, soprattutto in problema dell'insieme uno, è di chiamare accidentalmente solo il tuo programma di "acqua" o "avidi" o "Mario" o "credito" o simili. Ma si vuole realmente fare Assicuratevi di avere l'estensione del file perché questo è l'unico modo che il compilatore e anche l'editor di codice sa che sei in realtà la scrittura di codice C. Così mi permetta di andare avanti e fare clic su Salva. E ora, anche, che cosa CS50 IDE ha fatto per noi è è anche sintassi evidenziata tutto. Così è fatto tutto molto colorato. E l'intero scopo di che non è funzionale. E 'solo per attirare gli occhi per la concettualmente diversi pezzi di questo programma. Quindi cerchiamo di andare avanti e compilare questo. E posso compilare questo in un paio di modi. E nella prima settimana, il modo vecchia scuola abbiamo fatto era letteralmente al "hello.c clang." Comando line-- E poi mi ha colpito Invio. E nulla sembra accadere nella finestra del terminale. Ma che cosa ha fatto cambiare nell'IDE? Dove, ancora una volta, IDE significa solo Ambiente di sviluppo integrato. E 'un modo elegante per dire questo sviluppo integrato ambiente per lo sviluppo di software. Allora, cosa è cambiato nell'interfaccia utente? Che cosa avete notato è diverso, Maria? MARIA: ho notato una cosa sotto il IDE50 cartella qui. DAVID MALAN: Sì. Così qui, non solo dobbiamo "hello.c." Abbiamo anche "a.out", che è razza di nome muto per un programma. Ma in effetti, è il nome predefinito di un programma quando si compila il codice basta e non dire al compilatore quale file di output. Quindi, se voglio correre questo, bisogno di dire la compiler-- o meglio, ho bisogno di dire l'area di lavoro che ho desidera eseguire il programma chiamato "a.out". Invio. E c'è "ciao, "ora il" ./ "mondo.. in realtà è importante. Anche se di solito abbiamo solo scrivere i nomi dei comandi, quando si tratta di un programma che hai scritta, si vuole dire "./" perché che racconta esplicitamente Linux che si desidera eseguire un programma chiamato "a.out" che è in questo, dove puntino significa che questo elenco che sono attualmente in, che risulta essere chiamato spazio di lavoro, "a.out. Perché se ho appena detto "a.out," Enter, Ho intenzione di ottenere "a.out comando non trovato "perché la computer-- perché ho inventato "a.out;" non è venuto con il computer-- non sa dove cercarlo, anche se è giusto sotto il naso, per così dire. OK. Così abbiamo potuto cambiare questo a essere "clang -o ciao hello.c." E se premi invio, quale programma è questa intenzione di uscita per me? Qual è il nome del file? Sì, in parte posteriore. Giusto. "Ciao." Quindi, "ciao" sta per essere il nome del programma perché abbiamo usato un cosiddetto argomento della riga di comando, che è solo un modo di cambiare il comportamento il compilatore effettivamente uscita un nome file specifico. E in effetti, se io lo zoom fuori e cercare qui, ora ho solo "a.out" e "ciao.c", ma anche "ciao", così. Così ora posso fare "./hello," Enter. E c'è "ciao, mondo". Ma lastly-- e questo sarà ora la convenzione usiamo tutta la semestre, typically-- è che si può anche semplicemente dire "fare ciao." E in effetti, sta dicendo che è in su fino ad oggi perché esiste già. Lasciami andare avanti e rimuovere, con il comando rm, entrambi "a.out" - e dire "togliere regolare a.out file?" Ciò significa che solo, sei tu sicuri di voler cancellare? Io vado a dire di sì. E poi ho intenzione di togliere "ciao", ma non "hello.c." Sto per dire "sì" in modo esplicito, ma "y" è sufficiente, come bene. E ora notare se io tipo ls-- che, ricordo, significa list-- elenca tutto dei file nella mia cartella. E in effetti, se io lo zoom fuori e guardare in alto a sinistra, conferma che ciò che è in questa cartella, anche anche se è etichettato come IDE50 qui e non di lavoro, è solo "hello.c." Così ora qui, se io fare "fare ciao," Enter, ora vedo un comando molto più lungo, ma un più sofisticato di comando che sta succedendo per essere utile nelle settimane a venire. E ora posso dire "./ciao." Quindi facciamo un rapido giro comandi di qualche altro Linux. Allora perché non facciamo un passo indietro ed effettivamente guardare C più in generale, la transizione da zero a C, e poi concludere con uno sguardo al primo problema ambientato in C. Va bene. Quindi ho intenzione di andare avanti e appena pulito il mio spazio di lavoro con Control-L solo per mantenere lo schermo pulito. Ma che non ha funzionale impatto altrimenti. Ricordiamo che abbiamo visto alcuni comandi ora. Così abbiamo visto clang, che in genere si non dovranno eseguire più manualmente. Ti invece fanno uso. Ma abbiamo anche visto ls, che mostra un elenco dei file nella mia directory. E ora perché è there-- c'è due file ora, "ciao" e "hello.c." Perché c'è una stella o un asterisco dopo "ciao"? Cosa significano che, in base su quello che abbiamo visto nella prima settimana? Cosa ne pensi? Che cosa significa la stella? MARIA: For-- il programma "ciao"? DAVID MALAN: "Ciao *". Già. O si? Oh, eseguibile. Giusto. Quindi questo significa che "ciao" è eseguibile. Così infatti, ecco perché Posso fare "./ciao." Tutto ok. Allora, cosa altro posso fare qui? Beh, si scopre che posso creare anche le directory. Quindi lasciami andare avanti e creare, per esempio, una directory "pset1". E la specifica problema set vi farà fare esattamente questo, quindi non c'è bisogno di ricordare oggi. Ma "mkdir pset1" sembra avere alcun impatto. Ma ancora una volta, nessun messaggio di errore è generalmente una buona cosa. Quindi, se digito "ls" now-- ah, ora Ho un file eseguibile denominato "ciao", un file C denominato "hello.c." E poi la barra finale, in modo da parlare, significa che si tratta di una directory. Così in effetti, ora voglio aprirlo. E non fare doppio clic su di esso come in una GUI, un ambiente grafico. Io invece dico "cd pset1". Invio. Niente di interessante sembra avere successo tranne il mio piccolo prompt qui-- questo è il modo di ricordare di Linux me dove sono io, così che cosa cartella è aperta. E 'solo che mi dice in modo esplicito al contrario di grafica. E se digito "ls", perche 'vedo un altro Sollecita subito, pensi, quando ho elencare il contenuto della pset1? MARIA: Probabilmente no avere nulla in là. DAVID MALAN: Sì. Allora noi non abbiamo, ovviamente, creato nulla in là perché ho appena creato la directory. Ora, se ho voluto creare una file-- per esempio, ho potuto creare un nuovo file. E poi potrei andare a Salva e salvarlo come, come, "mario.c" se si sta facendo l'edizione standard di pset uno. E poi, come qualsiasi Mac o PC, semplicemente scegliere il pset1 cartella ", Salva. E ora il file è vuoto. Ma andiamo zoom di nuovo per un secondo. Facciamo ls qui. Ora vediamo "mario.c". Quindi c'è un paio di altri comandi che sono la pena tenere a mente sulla tempo-- chiaro, o Control-L è quello che ho stato colpito; mkdir abbiamo visto; rm abbiamo visto, così, che è per la rimozione o l'eliminazione di un file. Attenzione è possibile also-- e se si guarda a tutorial online, potrai rm -rf è un modo molto comune di dire eliminare una cartella che ha roba in esso. Basta essere super, super attento. -rf significa ricorsivamente cancellare qualunque essa sia si sta cercando di eliminare e con forza eliminarlo. Quindi mezzi ricorsiva se si tratta di una cartella con una cartella con una cartella con una cartella, eliminare tutti loro. E significa forzatamente fare nemmeno chiedere a me sì o no, sono io sicuro? Quindi è un modo super pericoloso l'eliminazione di un sacco di roba in fretta. Ma beware-- troppo spesso fa un intrepido studente accidentalmente eliminare, ad esempio, pset uno, per esempio. MARIA: E se solo fare -r, che stanno andando per chiedere loro di ogni singolo file. DAVID MALAN: Qual è moderatamente fastidioso. MARIA: Sì. DAVID MALAN: Ecco perché molti di noi, se stesso compreso, Sono l'abitudine di usare rf. Ma è pericoloso. Così il compratore si guarda. E poi è una specie di mv interessante di nome. Quindi questo è il comando di spostamento, che si sente un po 'strano perché si può infatti utilizzare per spostare file da un posto all'altro. Ad esempio, supponiamo che ho incasinato. Supponiamo che ho creato un nuovo file per il pset. E ho salvato come "greedy.c." Ma supponiamo che ho accidentalmente salvarlo in IDE50-- così nel mio lavoro per sé e non in pset1. Si può vedere quanto in alto a sinistra. C'è "greedy.c." E ci sono alcune soluzioni. Quindi si, posso usare il modo facile da usare eccellente di appena drag & drop. E che sarebbe in realtà risolvere questo problema. Ma oggi, stiamo cercando di guardare modi più arcani ma potenti di fare questo. Così mi permetta di prendere "ls" in pset1. E vedo solo "mario.c." Lasciami andare avanti e fare "cd ..". Quindi ancora una volta è la directory del CD cambiamento. ".." Significa che cosa, però? L'ultima volta che ho detto "cd pset1 "per andare in pset1. Così, quando dico "cd ..", che cosa sto facendo? Indietro. Già. Così sta andando il cosiddetto genitore. Andare ad un livello superiore, come uscendo da una cartella. Così Invio. E infatti, guarda quello che ha fatto. Mi ha commosso solo nello spazio di lavoro, invece di in pset1, che è in lavoro. E ora, se digito "ls", c'è un sacco di roba. In c'è "greedy.c". Così ora mi ha lasciato usare mv letteralmente spostare "greedy.c" in pset1. E così un sacco di comandi Linux lavorare esattamente come questo. Prendono senza argomenti o prendono uno argomento o prendono due riga di comando argomenti e così via. E in questo caso, è letteralmente fare quello si dice, anche se succinctly-- spostare greedy.c in pset1. Invio. Nulla sembra accadere. Ma se lo faccio di nuovo un ls, avido è andato. E se lo faccio "cd pset1", Enter, e poi ls di nuovo, ora è nel posto giusto. Per inciso, se per alcuni reason-- soprattutto se avete intermittente la connettività di rete o si sta camminando in giro campus con il coperchio del portatile chiuso e poi aprirlo di nuovo e il vostro spazio di lavoro sembra un po 'fuori sincrono, un grosso problema. Basta caricare il tuo browser finestra, e dovrebbe risincronizzazione in modo che con la mano sinistra file browser appare esattamente come la finestra del terminale. Da non preoccuparsi. In caso di dubbio, ricaricare la pagina, così fino a quando hai salvato i file già. OK. Così mv può essere utilizzato anche per rinominare i file. E diamo uno sguardo a questo comando finale qui. Così suppose-- e questo è eccellente comuni, troppo, presto. Alcuni studenti di tanto in tanto creare un file chiamato, diamo say-- qual è un altro? Come "WATER.C." Quindi mi limiterò a gridare, per senza motivo, in tutte le protezioni. Ma questo non è il corretto nome per il file se non altro perché il nostro problema impostato specifica non l'ha detto per salvare il file come tutte le protezioni "WATER.C." Invece, ci aspettiamo "water.c" in minuscolo. E, infatti, questo è problematico perché check50, un programma che si sta andando per rispondere a problemi impostare uno che verifica automaticamente la correttezza del codice sta per urlare a voi se non è possibile trovare "water.c" in lettere minuscole. Quindi ho bisogno di risolvere questo problema. Tanti modi diversi per tale scopo, il primo dei quali sarebbe quello di Control-clic o clic destro il nome del file e basta cambiare Rinomina. Tutto bene per farlo. Ma ancora una volta, oggi, diamo fare un po 'di fantasia. Usiamo mv cambiare "WATER.C" a "water.c." Così si può utilizzare anche il primo argomento per rinominare al secondo argomento Se il secondo argomento non è in Infatti, una cartella o un nome di directory. Tutto ok. E, infine, un po 'trick-- quindi sono in mia directory di lavoro in questo momento. Se voglio entrare in pset uno, Posso certamente digitare "cd pset1". Ma è così noioso digitare "pset1" o più nomi di file o nomi di directory ancora. Quindi molto spesso in Linux, cosa si può fare è iniziare a digitare "pse" e appena annoiarsi, premere Tab, e lasciare la figura del computer fuori per voi. Super disponibile a entrare in quella abitudine. L'unico problema è se avete più file o cartelle a partire con la lettera "p" o "ps", si potrebbe avere digitare un paio di più prima che il computer sa cosa fare. MARIA: Ci piace scorciatoie. DAVID MALAN: questa volontà risparmiare così tanto tempo. E anche, come abbiamo detto in conferenza, è può scorrere verso l'alto nella storia, su e giù, per trovare recente esecuzione comandi, pure. Tutto ok. Così ora, diamo la nostra attenzione indietro di un semplice programma, ciao mondo. Così abbiamo compilato esattamente questo. E ora perché non ci prendiamo uno sguardo ai tipi di dati e poi la transizione da un po 'di corrispondenti blocchi Scratch a C. MARIA: Awesome. Quindi, ora che hai iniziato scrittura di programmi in C, stiamo per iniziare a parlare sui tipi di dati e variabili. Così alcuni tipi di dati che si vorrebbe sapere da adesso sono quelli che sono evidenziato in blu. Così abbiamo int prima, che sta per intero. E questo vale interi, come si potrebbe avere guessed-- così 1, 2, 3, e tutti gli altri interi che si può pensare. DAVID MALAN: E anche negativo. MARIA: E anche quelli negativi, sì. E 0. Poi abbiamo carri allegorici, che sono numeri floating point. Ecco, questo è tutti i numeri reali che hanno punti decimali. Così 5.0, 5.2, e ancor più le cifre dopo la virgola, così, e anche quelli negativi. Poi abbiamo char che è un personaggio. Quindi penso che abbiamo parlato di questo in conferenza oggi. Ma abbiamo le lettere, per example-- A, B, C-- che può essere memorizzato come un char. Ma poi abbiamo un sacco più simboli che possono essere immagazzinate come un char. E quelli vengono memorizzate come ASCII. E poi abbiamo bool, quali sono booleani. E quelli restituiscono true o False o 1 e 0, rispettivamente. DAVID MALAN: E ricordare che bool proviene dalla biblioteca CS50. Quindi non è costruito in C, ma è super utile per avere la nozione di vero e falso. E anche se si potrebbe think-- fatto divertente. Un bool bisogno tecnicamente quanti bit, veramente, per rappresentare Vero contro Falso? Quanti bit pensi si avrebbe bisogno, al massimo? Sì, solo uno. Così si scopre che C Non si può fare solo un po '. La più piccola unità di misura si può ottenere è otto. Quindi è un po 'uno spreco che siete utilizzando un intero byte o otto bit, per rappresentare Vero o Falso. Ma questo è solo il modo in cui è implementato in C dalla biblioteca CS50. MARIA: E poi quelli che siamo non andare a parlare nel modo più ampio destra now-- doppio, quello è per i galleggianti più grandi. Lungo lungo e corto sono anche per gli interi. DAVID MALAN: In effetti. In hacker, edizione di pset uno, che usiamo molto lungo. Ma per l'edizione standard, non dovrebbe essere necessario. MARIA: Freddo. OK. Così operators-- si dovrebbe essere probabilmente familiarità con la maggior parte di questi. Inoltre, +; sottrazione, -. Per la moltiplicazione, abbiamo la *. Quindi non la X che usiamo di solito. Divisione, abbiamo la barra rovesciata. E modulo è il nostro ultimo operatore ci accingiamo a parlare in questo momento. È un operatore che ci permette di prendere il resto di una divisione. Quindi, se abbiamo 4% 2, 4 diviso da 2 è 2 con un residuo di 0. Quindi 4% 2 è 0. 4% 3 è 1. 4% 5 è 4, come si potrebbe immaginare. E ricordate quando si utilizzano tutti questi ai gestori di utilizzare le regole PEMDAS. DAVID MALAN: Quindi, per essere chiari, se si fare 4% 2, perché è quello 0, esattamente? MARIA: Perché 4 diviso 2 è 2 con il resto di 0. Così modulo che ci dà resto come opposto al risultato della divisione. DAVID MALAN: E in effetti, che cosa troveremo questo utile per è che in alcuni problemi che non è necessariamente uno, se si vuole avere la effetto di restringere te ad un intervallo di numeri come 0 a qualcosa, è possibile utilizzare modulo per avvolgere prima di quanto come 2 miliardi o il valore di 4 miliardi di dollari che di cui abbiamo parlato in conferenza. MARIA: Sì. E anche in "greedy" potremmo. DAVID MALAN: Sì, in problema impostato uno, pure. MARIA: Sì, bello. DAVID MALAN: buon suggerimento. MARIA: Siamo spiacenti. Booleano expressions-- così per gli operatori booleani, ci accingiamo a parlare di tutto di questi che vedete qui. Quindi in questo momento, abbiamo due segni di uguale incluso eguali. Così quelli sono per il confronto. Finora abbiamo visto solo un segno di uguale. Questo è quando si assegna un valore di una variabile. Quindi, se abbiamo visto int n = 5, allora abbiamo assegnato 5 alla variabile n. Ma se vogliamo usare == per confronto, siamo in grado di controllare se n == 5. E se n == 5, allora è vero. Operatori booleani così ci permettono, in fondo, per valutare booleano espressioni true o false. Quindi non abbiamo la equals-- punto esclamativo e uguali. Così potremmo anche controllare se n non è uguale 5-- così n! = 5. Meno di, minore o uguale a, maggiore di, maggiore o uguale a, e poi abbiamo la logica E e la logica OR. E quelli permettono di valutare molteplici espressioni booleane insieme a venire fondamentalmente insieme come una intera espressione booleana. Quindi, se vogliamo trovare un numero, dire, cioè superiore a 5 ma inferiore a 15 Allo stesso tempo, useremmo l' operatore logico AND per vedere se n è maggiore di 5 && n inferiore a 15. DAVID MALAN: E qui, troppo, è davvero facile presto per sbaglio utilizzare solo un singolo commerciale o una singola barra verticale. E si spera il compilatore urlare contro di voi, perché in realtà hanno un significato molto diverso. Per i curiosi, sono utilizzato per operazioni bit per bit, operano sui singoli bit. Ma si desidera la coppia di loro qui. E super importante è che primo, il segno di uguale, che è l'operatore di uguaglianza come contrasto con l'operatore di assegnazione. MARIA: E la barra verticale è situato tra il Cancella e ritorno. DAVID MALAN: Sì. In una tipica tastiera americana. MARIA: Sì. Quindi cerchiamo di saltare a destra in istruzioni condizionali. In Scratch, hai già visto, probabilmente, se le dichiarazioni che consentono di controllare se qualcosa è vero, allora fare qualcosa di diverso. Così si potrebbe avere voluto per verificare se il vostro sprite è toccando un altro sprite o il bordo dello schermo. E allora si potrebbe avere voluto terminare il gioco o fare qualcos'altro. Così la sintassi per tale è "if (condizione)." Quindi, se il vostro sprite sta toccando qualcosa, poi non è all'interno delle parentesi graffe. Poi abbiamo if-else. Altrimenti ci permette di fare qualcosa se la condizione che verificare in principio non è vero. Quindi, se lo sprite sta toccando il confine farlo, altrimenti fare qualcosa di diverso. Così altrimenti fare qualcosa di diverso. Poi abbiamo un breve esempio di questo. Quindi, se (military_time <12), si vogliono printf "Buongiorno!" Altrimenti andremo a printf "Buona sera!" Esempio di base. DAVID MALAN: Good. MARIA: Freddo. Così ora abbiamo istruzioni switch. Passare le dichiarazioni in generale possa ci permettono di fare un sacco della stessa cosa che abbiamo appena parlato circa con if. Ad esempio, in questo momento abbiamo la forma generale l'istruzione switch che ci permette di prendere una variabile chiamata n e confrontarlo con un sacco di valori diversi, che qui hanno chiamato Constant1, constant2. Possiamo avere molto di più. E quelli sono chiamati casi. Quindi, se abbiamo un interruttore statement-- e questo funziona solo per integers-- abbiamo variabile in questo caso che è n. Se la variabile n è pari a Constant1, abbiamo eseguirà alcuni frammento di codice o qualcosa che vogliamo fare. E poi ci sarebbe rompere. Così la pausa significa che l'istruzione switch si fermerà l'esecuzione se n è pari a Constant1, e allora il vostro programma continuerà. Sarà uscire dal passare dichiarazione e che sarà continuare a fare qualcosa di diverso. Se, tuttavia, n non è uguale Constant1, quindi caso per constant2 saranno controllati. Quindi, se n è uguale a constant2, che altro frammento di codice verrà eseguito. E poi romperà se questo è uguale ad esso. E allora possiamo avere also-- non necessariamente, though-- un caso di default, che accadrà se n non è uguale uno dei casi che hai elencato. E nel caso di default, abbiamo anche non hanno bisogno di una pausa necessariamente perché l'istruzione switch saprà che ha bisogno di terminare dopo il default caso se questo è il caso. DAVID MALAN: Ma stilisticamente, abbiamo sempre messo in là. MARIA: Sì. DAVID MALAN: Sì. Così, soprattutto quando si inizia, soprattutto se tra i meno comodo, vorrei personalmente solo raccomandare bastone con i se e IFS-elses e if-else-if-elses e così via se solo perché sono un po ' più semplice. Questa è una bella ottimizzazione, o a volte anche esteticamente rende il codice più leggibile. Ed infatti, probabilmente di metà semestre vedremo un problema set dove solo un aspetto migliore e più facile da leggere per gli esseri umani utilizzando un'istruzione switch. Ma non preoccuparti aggrappato a questo troppo presto. MARIA: Sì. Se si dispone di un sacco di istruzioni if, potrebbe non solo essere molto leggibile. Potrebbe non essere molto veloce per voi di passare attraverso di essa. Quindi passare dichiarazioni possono essere molto utile, pure. E anche, non remember-- non fare dimenticate di mettere le interruzioni in là. DAVID MALAN: Non ricordare questo. MARIA: Perché allora si potrebbe cadere attraverso da un caso all'altro. Quindi diciamo che caso Constant1 non ha avuto un istruzione break in esso. Poi potremmo cadere attraverso caso constant2 dentro. E noi non vogliamo farlo se abbiamo già raggiunto caso Constant1 ed è pari a n. Così, per esempio, se abbiamo una variabile n che contiene un numero di classe, e vogliamo vedere che cosa classe è-- se n è uguale a 50, stiamo andando a stampare "CS50 è Introduzione alla Informatica I. " Poi andremo a rompere. E questo è tutto. Se, invece, n è uguale a 51, stiamo andando stampare "CS51 è Introduzione di Informatica II. " Poi, ancora una volta, stiamo andando a rompere. Tuttavia, se poi mettiamo 124, 61, qualsiasi altro numero che si potrebbe pensare, o il programma non sta andando riconoscere che. Così sta andando a dire: "Mi dispiace, io sono non hanno familiarità con quella classe. " E sta andando a rompere. DAVID MALAN: Così si può veramente vedere il se, altrimenti se, altrimenti idea qui. E 'solo la sintassi diversa per esprimono la stessa idea. MARIA: Esattamente. Ora abbiamo i nostri operatori ternari. Così gli operatori ternari hanno tre parts-- una condizione, qualcosa da fare se tale condizione è vera, e poi qualcosa da fare se tale condizione è falsa. Quindi, vedete, in fondo, la sintassi di questo qui. Abbiamo il punto interrogativo, e poi the-- quello che chiamiamo questo? DAVID MALAN: Il colon. MARIA: Colon. Grazie. Scusate. Quindi diamo un'occhiata al nostro esempio per vedere se siamo in grado di dare un senso a questo-- class_num == 50. Quindi qui vediamo il nostro operatore booleano == che confronta il class_num variabile 50. Negozi in modo class_num un intero. E se questo intero pari al 50, poi siamo andando a memorizzare "David Malan" all'interno del professore stringa. Se il numero di classe non lo fa uguale a 50, "Non David Malan" sta per essere il professore. DAVID MALAN: Grazie. E così questo sembra equivalente a quello che, diresti, a prima vista? MARIA: A me sembra come se-else. DAVID MALAN: Sì. E in effetti, questo è una specie di una bella uno di linea, per così dire, di applicazione esattamente la logica di if-else ma facendo tutto in un solo passaggio. MARIA: Esattamente. Già. Quindi, se-else potrebbe prendere un sacco di spazio. Potrebbero essere troppo lungo per qualcosa di semplice come questo. Quindi questo può essere molto succinta e molto bello. Così ora stiamo andando in guardando l'esecuzione di nuovo e di nuovo qualcosa, quindi il controllo per un condizionare più volte e poi continuare a fare qualcosa mentre quella condizione è vera. Quindi questo ci porta piacevolmente in loop mentre. A sinistra, abbiamo il nostro primo ciclo while. Così, mentre qualcosa è vero, fare ancora e ancora qualcosa. Quindi assicuratevi di notare che il nostro condizioni qui viene convalidato in alto. Considerando che, con il nostro secondo loop-- chiamiamo che un do-while loop-- facciamo qualcosa, allora controlliamo per una condizione. E se tale condizione continua ad essere vero, torniamo indietro e fare la cosa di nuovo. La differenza principale è dove la condizione viene verificata per. Il codice può mai essere eseguito se la condizione non è vero con il ciclo while. Mentre con il do-while cappio, abbiamo il codice che viene sempre eseguito almeno una volta. E poi mentre la condizione continua ad essere vero, siamo in grado di tornare indietro e scorrere di nuovo dentro. Allora perché pensi che useremmo un do-while nel corso di un ciclo while? Destra. Quindi, se vogliamo indurre il utente per una sorta di ingresso, se vogliamo chiedere loro di inserire il proprio nome, vogliamo chiedere almeno una volta. E se non entrano quel nome, non siamo andando a chiedere loro di nuovo perché abbiamo già conosciamo. Ma se non entrano il loro nome, o se si inserire qualcosa che è ovviamente non è un nome, abbiamo ancora voglia di continuare chiedendo loro su per il loro nome. DAVID MALAN: E in conferenza abbiamo avuto una in questo modo con il int ottenere positivo ad esempio, dove non c'è niente da verificare in primo luogo perché non avete anche ottenuto un int. Così vogliamo fare questo-- ottenere un int dalla user-- quindi controllare, forse, ancora e ancora e ancora. MARIA: Esattamente. Per loops-- OK. Per cicli possono permetterci di fare quasi la stessa identica cosa, pure. In realtà è la stessa identica cosa. Quindi non c'è niente che si può fare con i cicli for che non sarebbe in grado a che fare con i loop mentre. Ma per i cicli possono sembrare un po ' po 'più complicato sintatticamente perché hanno tre parti all'interno di quello che era prima solo il condizioni con loop mentre. Quindi la prima parte che si mare, più a sinistra, abbiamo "int nani = 0" Quindi questo è dove siamo inizializzare la nostra variabile. Poi abbiamo un punto e virgola e "nani <7." Quindi questo è dove fuori condizione è in realtà. In modo che è quello che avremmo mettere solo nel mentre loop-- "mentre nani <7." Qui, che va nella bel mezzo del nostro ciclo for. Quindi, "dwaves <7." E poi la nostra ultima parte è "nani ++," che è dove noi aggiorniamo il nostro variabile. Quindi la cosa importante da realizzare è che questo sta per passare attraverso questo ciclo for sette volte ed eseguire sette volte. Così abbiamo sette nani, e sono tutti per dire, "Sono qui per aiutarvi, Biancaneve " perché sono pronti per aiutare Biancaneve. Con cicli while, avremmo fatto l'inizializzazione e l'aggiornamento non dentro la condizione, di nuovo, ma prima o all'interno di while fare in modo che we-- perché abbiamo sempre bisogno di quelle parti. Quindi, per fare in modo che abbiamo loro, ci sarebbe stato ancora li aggiunto su, non solo all'interno delle parentesi. DAVID MALAN: E così sembra like-- nella conferenza, per esempio, Ho quasi sempre utilizzare, come, ie n variabili e piuttosto noioso. Sembra che è possibile utilizzare più abilmente chiamato variabili, anche. MARIA: Sì, è davvero molto bello utilizzare le variabili un po 'più descrittivo perché soprattutto se qualcun altro è leggendo il tuo code-- forse sei grader o se si sta collaborando con somebody-- si vuole fare in modo che essi capire quello che stai facendo. OK. Quindi questo è qualcosa di molto funky-- per il ciclo all'interno di un ciclo for. Non so se abbiamo visto prima. Probabilmente no. Ma possiamo effettivamente avere questo-- così loop invece di loop. Così qualcuno vuole camminare forse me attraverso quello che sta succedendo qui? DAVID MALAN: Mi prendo una pugnalata. MARIA: Freddo. DAVID MALAN: OK. Così, spoiler-- vogliamo stampare la roba che è nell'angolo in basso a destra Là. MARIA: Giusto. Si si. DAVID MALAN: per questo abbiamo solo mettere che esempio di output lì. Così posso dedurre dalla più in alto ciclo che sei iterare sopra le righe le ciclo più esterno, per così dire. E stai iterare su colonne con il ciclo più interno. E intuitivo, questo spetti spera senso perché per natura ogni programma che abbiamo visto prima, printf, che è il funzione che stiamo usando, in ultima analisi, ha la possibilità di stampare roba sostanzialmente fuori riga per riga. Come, una volta che hai emesso una nuova linea, non c'è nessun raddoppio indietro e qualcosa di stampa alto nello schermo, almeno non usare printf come questo. E così a questo proposito, si fa senso che il ciclo più esterno dovrebbe riferirsi alle righe perché per ogni riga data, si sta andando a voler stampare XXXXX, e poi passare alla riga successiva, XXXXX. Così righe vengono prima. E poi all'interno di ogni fila, di stampare le colonne. Se si è tentato di farlo nel di fronte, probabilmente non sarebbe venire fuori come si intende. MARIA: Sì. Non potevamo tornare a la riga precedente con printf. DAVID MALAN: E che cosa è interessante per chat di oggi di portata, in realtà, è che la riga è un int che è dichiarato nel ciclo più in alto. Ma si noti che è ancora all'interno di, per così dire, le parentesi graffe che seguire immediatamente, anche se non è tecnicamente all'interno di tali parentesi graffe. Così fila è portata per la totalità del frammento di codice, sia all'interno del ciclo for esterno e all'interno del ciclo for interno. Ma al contrario, dove è la colonna di portata? La colonna variabile? Sì, solo nel ciclo all'interno. E va bene perché non accediamo al di fuori delle sue parentesi graffe. Tutto quello che facciamo è di stampare un nuovo riga alla fine molto lì. Così che in realtà è OK. Quindi questo ha l'effetto, sembra che, di fare tre righe e quattro colonne. MARIA: Giusto. Quindi, prima passiamo attraverso la nostra prima fila. E proprio nella nostra prima fila, facciamo il quattro colonne all'interno della prima riga. Quindi noi stampiamo quattro X di. E poi possiamo uscire dal ciclo for, dal momento che abbiamo già stampati quattro X di. E stampiamo una nuova linea. E poi andiamo attraverso il stesso processo per altre due righe , per un totale di tre. DAVID MALAN: E vale la pena notare che sia solo un prodotto del tipo di carattere, il fatto che l'output di esempio sembrano così molto più alto, come se non c'è più righe di colonne. Ma è solo perché il X è più alto che largo. Questo è tutto quello che sta accadendo lì, più lo spazio bianco tra le righe. MARIA: Giusto. Raffreddare. DAVID MALAN: Va bene. Così un rapido sguardo a un problema impostato, prendere tutte le domande, e poi aggiornare? Tutto ok. Quindi, in un problema di set, ci sono tre le sfide principali, in ultima analisi. Ma prima, troverete che il problema impostato specifica, come con molti la pset questo autunno, sta andando a camminare attraverso alcuni esercizi di riscaldamento, puntare su alcune risorse che si può o può non hanno visto già. Ad esempio, CS50 dispone di una suite di cortometraggi, che sono brevi video, non dissimile, ma che sono specific-- molto argomento forse cinque minuti, 10 minuti di lunghezza su loop o su condizioni o su algoritmi o in seguito di più argomenti avanzati, pure. E generalmente incorporiamo quelli nel problema set modo che gli studenti una risorsa con cui di rivedere il materiale che potrebbe avere già venire a lezione o sezione. Ma in questo modo è più mirato e più a portata di mano. Tendiamo anche a incorporare nel problema imposta cose chiamate procedure dettagliate. Quindi, quasi tutti gli esempi che faccio in conferenza, in scena qui, abbiamo anche hanno sparato sulla macchina fotografica in promuovere una più lenta, una guida più intima da me su il mio portatile di quel codice, riga per riga in modo tale che in classe, faremo spesso sfogliare qualcosa o qualcuno si interject con un rispondere ad una domanda. Ma non necessariamente affondare in per tutto il pubblico. In modo da trovare il codice procedure dettagliate per la maggior parte degli esempi che facciamo qui a lezione in modo che si può camminare attraverso di essa al proprio ritmo e riavvolgere o avanzare velocemente o saltare del tutto, se volete. C'è spesso un paio di domande warm-up che vi chiedo di ordinare di rafforzare questo materiale e assicurarsi che si sta comodi prima si procede con il resto del pset. E poi, naturalmente, c'è il pset stesso. E una delle cose siamo molto deliberatamente fare in CS50 è quasi ogni interessante o intellettualmente poco interessante passo meccanico che si potrebbe avere a che fare è quasi sempre molto ben documentato. Nel corso del termine, faremo iniziare a porre domande più retoriche come ricordarsi come fare questo o quello? Ma in generale, troverete che gli insiemi di problemi si ottiene attraverso la meccanica di qualcosa in modo che interessanti, sfide intellettuali sono in ultima analisi a sinistra per voi studente. Detto questo, Zamyla, ai quali siamo tenuto oggi mi riferisco a lezione, è uno dei nostri personale di lunga data membro che detiene anche procedure dettagliate sui problemi specifici pset come Mario e avido, anche se non l'acqua di quest'anno. Ed è a quelli walkthroughs che spesso offre alcuni suggerimenti e trucchi per come procedere, non ti dice esattamente che cosa fare, ma rather-- come una condizione, se si will-- dando almeno paio di idee in modo che sia a voi, in ultima analisi, decidere come avvicinarsi a loro. MARIA: come una sorta di alto livello comprensione della logica di ciò noi vi stiamo chiedendo di fare. DAVID MALAN: Esattamente. E, infatti, di Zamyla procedure dettagliate sono destinate per rispondere alla frequente domanda posta da dove faccio Ho cominciato, soprattutto quando questi lunghi specifiche sono un po 'scoraggiante dato tutto il testo e le immagini che hanno in loro. Così water.c, troverete dopo aver completato esso, è in realtà relativamente semplice. Assolutamente sono un mucchio di andare a battere voi la testa contro il muro cercando di capire perché non è la compilazione o perché non è in esecuzione in modo corretto. Ma una volta che il gioco è fatto con esso e una volta che hai trascorso qualche tempo a lottare con qualsiasi dei bug che si potrebbe avere, troverete che è un breve programma. Si può fare in pochi linee di codice, molti dei quali che abbiamo visto qui in conferenza già, se si assemblano i mattoni giusti. E come si consiglia qui, sta andando a chiedere di specificare quanti minuti qualcuno sta facendo la doccia nel campus. Specifichiamo nel problema impostare la velocità di flusso di acqua in, come, una doccia a basso flusso testa, proprio come la clip Seinfeld abbiamo visto ieri o sul loro opposto. E poi avete appena per fare un po 'di matematica, really-- aritmetica utilizzando C per raccontare noi quanti, circa, bottiglie d'acqua è che equivale a se siamo prendendo una doccia n minuti. Ora, in mario.c, questo sta andando essere un programma leggermente più lungo. Non è ancora in corso per essere così a lungo. Solo poche righe più lunghe di water.c. Ma sarà occasione per ricreare la vecchia scuola Mario piramide di Super Mario Fratelli o alcuni di follow-on. Non sta andando a guardare come più bella o colorata come quella lì. Stiamo solo andando a utilizzare piccoli hashtags come abbiamo qui sullo schermo usando il testo ASCII. Ma sarà approssimare la stessa idea. E sta andando essere un esercitare che a prima vista sembra abbastanza simple-- solo stampare una semplice piramide. Ma ci sono un paio di caratteristiche qui che sono interessanti. Si noti che il bordo di destra la piramide ha in realtà due di larghezza. Quindi ci sono due uguali colonne di altezza, che lo rende richiedono un po ' po 'di pensiero per fare Assicurati di ottenere che esattamente a destra, come rispetto a solo un perfettamente angolato linea. Ecco, questo è un po 'un caso d'angolo ma corrisponde al gioco vero e proprio. Ed è anche non-ovvio a prima sguardo come stampare lo spazio bianco. Così, quando guardo il esempio di output qui-- ed è anche in essa spec-- tipo di assomiglia un rettangolo, ma una diagonale della rettangolo è stato tagliato fuori, ed è solo spazi bianchi, per così dire. E così un frequenti domanda qui è sempre, beh, Come faccio a spostare i hashtag sulla destra? O come faccio a stampare gli spazi vuoti? Ed è effettivamente più facile rispetto alla maggior parte degli studenti pensano. Destra? Si può approssimare visivamente da solo premendo la barra spaziatrice una o due volte o tre volte. E così, anche se con printf abbiamo quasi stampare sempre una stringa o un int o una parola come "ciao, mondo "o una serie di parole di, si può anche semplicemente stampare citazione, spazio, unquote. E che in realtà dare un spazio bianco lì. Modo da tenere a mente e Non pensare troppo questo. È davvero necessario decidere riga per riga per riga, non dissimile tuo esempio un poco fa, come molti di quelli colonne devono essere spazi bianchi e quanti di loro dovrebbero essere hashtag. Ci vorrà un po 'di tempo, ma è in ultima analisi, un puzzle di logica di sorta. MARIA: Sì. Ma la logica di andare riga per riga sta per essere molto utile qui. DAVID MALAN: Sì. Credo che il codice di esempio si gave-- anche se non era un programma completo. Hai ancora bisogno di int e principale e stdio.h vuoto e #include, un sacco di roba da lezione. Ma i mattoni sembrano essere lì. E poi, infine è qualcosa un po 'più algoritmico. Così si scopre che ogni volta che andare in CVS o qualsiasi negozio di alimentari e qualcuno ti porge al bollette cassiere o monete come il cambiamento, si scopre che essi, gli esseri umani, anche se non lo sappiano o no, sono probabilmente utilizzando ciò che è chiamato un algoritmo greedy, per cui se si sta dovuto, dire, $ 21 nel cambiamento perché per qualche motivo hai comprato qualcosa di molto costoso con un grande conto alla CVS, sarebbe davvero fastidioso se la cassiere ti ha dato di 21 camere singole o, peggio tuttavia, un sacco di monete. Piuttosto, ciò che una persona ragionevole è probabilmente intenzione di fare è che stanno andando per afferrare un $ 20 e poi a $ 1-fattura, e voi mano solo due fatture in quel caso. MARIA: Così stanno cercando di ridurre al minimo il cambiamento che danno di nuovo voi. DAVID MALAN: Esattamente. E lo stesso accordo con le monete, pure. Se stai dovuto, dire, $ 0,50, speriamo che non si vuole 50 centesimi. Voi invece volete due quartieri, per esempio. Ora, questo non assumere che il cassiere ha abbastanza di ogni denominazione che lui o lei potrebbe voler dare voi. Ma noi consentiamo di assumere tanto nel problema. E l'obiettivo, infine, è quello implementare in codice C un algoritmo greedy. Così l'utente è autorizzato digitare quanto cambiare lui o lei è dovuto con dollari e centesimi, una specie di virgola mobile valore probabilmente. E poi si deve fare due conti e capire algoritmicamente, beh, quante monete posso dare si minimamente per darvi esattamente quella quantità di cambiamento. Ma ci sara 'un poche parti difficili qui, giusto? Come se ci fosse tutto problema imprecisioni. MARIA: Esattamente. Punto in modo floating valori hanno imprecisioni. Abbiamo parlato di questo in conferenza oggi? DAVID MALAN: Abbiamo fatto il l'ultima volta a lezione. Abbiamo parlato di imprecisioni. E tu non vuoi ingannare l'utente di quanto il cambiamento che lui o lei è dovuto. E così la procedura dettagliata, in la specifica problema set, dare qualche pensiero, in ultima analisi, da come è possibile attenuare quelli imprecisione errori, potenzialmente. E 'evitabile, certamente, per gli ingressi di cui stiamo parlando. E, infatti, pennies-- forse ci rimandiamo a Zamyla, Credo che, per i trucchi lì. Quindi in ultima analisi, si trova un progressione dei problemi di questa settimana, il primo dei quali è piuttosto piccolo, poi mezzo, poi un po 'più grande. Ma tutti utilizzare l'edificio isolati da questa settimana passata, da questo supersection, prescrizioni di problema ti mette a innumerevoli risorse. Ma ancora, se non del tutto in difficoltà, soprattutto tra quelli meno confortevole con precedenti conoscenze, venire a orario d'ufficio il Lunedi e Martedì e Mercoledì e Giovedi. Vai a CS50 discutere via il sito web del corso, tramite il quale è possibile chattare con il personale e compagni di classe. Ma alla fine, penso che il miglior consiglio è solo iniziare presto. Non è il tipo di classe che si dovrebbe essere pset di partenza il Mercoledì notte, o peggio notte di Giovedi. MARIA: Il mio miglior consiglio è di aver iniziato da Lunedi. DAVID MALAN: Lunedi. Quindi, se non avete iniziato already-- no. Ma anche se non Lunedi, quindi Martedì. Prima è meglio è. E questo è il motivo per il Naturalmente ha tanti giorni di ritardo è per darvi un po 'di un pressione psicologica iniziare prima, ma ancora lasciare le cose scivolare quando le cose prendono più tempo quello che ti aspetta. MARIA: E si vuole fare uso di orari d'ufficio per quanto è possibile, anche. DAVID MALAN: Tutte le domande? Tutto ok. Beh, perché non aggiornare qui?