[RIPRODUZIONE DI BRANI MUSICALI] David J. MALAN: Va bene. Questo è CS50 e questo è l'inizio della Settimana 2. E vi ricordate che oltre la ultime due settimane, abbiamo introdotto calcolatore scienza e, a sua volta, programmazione. E abbiamo iniziato la storia per mezzo di Scratch, che linguaggio grafico dal MIT Media Lab. E poi, più recentemente, la scorsa settimana, abbiamo fatto noi introdurre un higher-- un lingua di livello inferiore noto come C, qualcosa che è puramente testuale. E, in effetti, l'ultima volta che abbiamo esplorato in tale contesto una serie di concetti. Questo, richiamo, era molto primo programma abbiamo guardato. E questo programma, molto semplicemente, stampa fuori, "ciao, mondo". Ma c'è così tanto magia apparente in corso. C'è questo #include con queste parentesi angolari. C'è int. C'è (void). C'è parentesi, parentesi graffe, punto e virgola, e molto altro ancora. E così, ricordare che abbiamo introdotto Scratch in modo da poter, idealmente, a vedere oltre che la sintassi, la roba che non è davvero tutto ciò che intellettualmente interessante, ma nella fase iniziale è, assolutamente, un po 'complicato per avvolgere la mente intorno. E, infatti, uno dei più comuni le cose presto in una classe di programmazione, soprattutto per quelli meno comodo, è quello di ottenere frustrati dalla e scattato da certa sintattica errori, per non parlare di errori logici. E così tra i nostri obiettivi Oggi, in realtà, la volontà essere quello di equipaggiare con un po ' tecniche di problem solving per come per risolvere meglio i problemi stessi sotto forma di debug. E vi ricordate, inoltre, che il ambiente che abbiamo introdotto ultima volta che è stato chiamato CS50 IDE. Questo è un software web-based che permette di programmare in the cloud, per così dire, mantenendo tutti i tuoi file insieme, come abbiamo di nuovo sarà oggi. E ricordare che noi rivisitato questi argomenti qui, fra loro funzioni, e loop, e variabili, e le espressioni booleane, e condizioni. E in realtà un po 'di più che abbiamo tradotto dal mondo di Scratch nel mondo di C. Ma l'edificio fondamentale blocchi, per così dire, erano in realtà ancora lo stesso della scorsa settimana. In realtà, abbiamo davvero avuto solo un pezzo di puzzle diverso, se si vuole. Invece di che viola salvare blocco, noi invece aveva printf, che è questa funzione in C che consente di stampare qualcosa e formattarla sullo schermo. Abbiamo introdotto il CS50 Biblioteca, dove si hanno ora a vostra disposizione get_char, e get_int, e get_string, e alcune altre funzioni come bene, tramite il quale è possibile ottenere in ingresso dalla propria tastiera dell'utente. E abbiamo anche preso uno sguardo alle cose come these- bool, e char, e doppio, galleggiante, int, string long_long. E ci sono anche altri tipi di dati in C. In altre parole, quando si dichiara una variabile per memorizzare un certo valore, o quando si implementa una funzione che restituisce un valore, è possibile specificare quali tipo di valore che è. È una stringa, come un sequenza di caratteri? È un numero, come un intero? Si tratta di una virgola mobile il valore, o simili? Quindi, in C, a differenza di Scratch, abbiamo effettivamente ha cominciato a specificare il tipo di dati eravamo di ritorno o utilizzando. Ma, naturalmente, abbiamo anche incontrato alcuni limiti fondamentali dell'informatica. Ed in particolare, questo linguaggio C, richiamo che abbiamo preso uno sguardo integer overflow, la realtà che se avete solo un quantità limitata di memoria o, in particolare, un numero finito di bit, si può contare così in alto solo. E così abbiamo guardato questo esempio qui quale un contatore in un aeroplano,, in realtà, se in esecuzione abbastanza a lungo sarebbe traboccare e tradursi in un software un errore potenziale fisico. Abbiamo anche guardato galleggiante punto di imprecisione, la realtà che con solo un numero finito di bit, se è 32 o 64, è possibile specificare solo tanti numeri dopo un punto decimale, dopo di che si cominciare ad ottenere impreciso. Così, per esempio, un terzo nel mondo qui, nel nostro mondo umano, quello che sappiamo è solo un numero infinito di 3 secondi dopo il punto decimale. Ma un computer non può necessariamente rappresentare un numero infinito di numeri se si consente solo un po ' quantità limitata di informazioni. Quindi non solo abbiamo si dotare con maggiore potenza in termini di come si potrebbe esprimersi a una tastiera in termini di programmazione, abbiamo anche limitato ciò che si può effettivamente fare. E in effetti, gli insetti e gli errori possono derivare da questi tipi di problemi. E infatti, tra i temi di oggi stanno per essere argomenti come il debug e in realtà guardando sotto il cofano il modo in cui sono state introdotte le cose la scorsa settimana sono in realtà costituiti in modo che è meglio comprendere sia le funzionalità di e i limiti di una lingua come C. E infatti, ci sbucciamo gli strati dei più semplici di struttura dati, qualcosa chiamato un array, che Scratch capita di chiamare una "lista". E 'un po' diverso in quel contesto. E poi ci sarà anche introdurre uno dei primo dei nostri problemi specifici del dominio in CS50, il mondo del la crittografia, l'arte di scrambling o in cifratura informazioni in modo che è possibile inviare messaggi segreti e decodificare messaggi segreti tra due persone, A e B. Quindi, prima di transizione a quel nuovo mondo, cerchiamo di equipaggiare con un po ' le tecniche con cui è possibile eliminare o ridurre almeno alcuni delle frustrazioni che probabilmente avete incontrato durante la scorsa settimana da solo. In effetti, di fronte a voi sono such-- alcuni dei i primi problemi in C. E le probabilità sono, se siete come me, la prima volta si tenta di digitare un programma, anche se si pensa logicamente il programma è piuttosto semplice, si potrebbe benissimo colpito un muro, e il compilatore non ha intenzione di collaborare. Fare o Clang non sta andando per fare in realtà la vostra offerta. E perché sarebbe? Bene, diamo uno sguardo a, forse, un semplice programma. Ho intenzione di andare avanti e salvare questo in un file volutamente chiamato buggy0.c, perché so che a essere viziata in anticipo. Ma potrei non si rendono conto che se questo è il primo o secondo o terzo programma che sto facendo in realtà me stesso. Quindi ho intenzione di andare avanti e tipo out, int main (void). E poi all'interno delle mie parentesi graffe, un molto familiare ( "ciao, world-- backslash, n ") - e un punto e virgola. Ho salvato il file. Ora ho intenzione di andare verso il basso alla mia finestra di terminale e tipo make buggy0, perché, di nuovo, il nome del file di oggi è buggy0.c. Così scrivo fare buggy0, Invio. E, oh, caspita, ricordare dall'ultima volta che nessun messaggio di errore è una buona cosa. Quindi nessuna uscita è una buona cosa. Ma qui ho chiaramente un numero di errori. Quindi la prima linea di uscita dopo aver digitato fare buggy0, richiamo, è uscita piuttosto verboso di Clang. Sotto il cofano, CS50 IDE è configurato di utilizzare tutta una serie di opzioni con questo compilatore in modo che non si dispone di pensare a loro. E questo è tutto ciò che prima linea mezzi che inizia con Clang. Ma dopo che, i problemi cominciare a fare la loro comparsa. Buggy0.c sulla linea 3, carattere 5, vi è un grande errore rossa. Cos'è quello? dichiarando implicitamente funzione di libreria printf con tipo int (const char *, ...) [-Werror]. Voglio dire, è molto rapidamente diventa molto arcane. E certamente, a prima sguardo, non ci aspetto che tu capisca la elementi di quel messaggio. E così una delle lezioni per oggi sta andando essere per cercare di notare modelli, o cose simili, per gli errori si potrebbe avere incontrato in passato. Quindi cerchiamo di prendere in giro a parte solo quelle parole che sembrano familiari. Il grande, rosso errore è chiaramente simbolico di qualcosa che è sbagliato. implicitamente dichiarando funzione printf biblioteca. Quindi, anche se non ho ben capito cosa dichiarando implicitamente funzione di libreria mezzi, il problema sicuramente si riferisce a printf in qualche modo. E la fonte di tale questione ha a che fare con dichiararla. Dichiarare una funzione è menzionare per la prima volta. E abbiamo usato la terminologia della scorsa settimana di dichiarare il prototipo di una funzione, sia con una linea nella parte superiore del vostro file o in un cosiddetto file di intestazione. E in che file di fatto che diciamo la settimana scorsa che printf è citazione, unquote, ha dichiarato? In quale file è il suo prototipo? Quindi, se vi ricordate, la prima cosa che ho digitato, quasi tutti i programmi scorso tempo-- e accidentalmente un momento fa ha iniziato digitando myself-- era questo uno qui-- hash-- #include