1 00:00:00,000 --> 00:00:10,920 >> [MUSIC PLAYING] 2 00:00:10,920 --> 00:00:14,680 >> DAVID J MALAN: Va bene, bentornato CS50. 3 00:00:14,680 --> 00:00:16,500 Questo è l'inizio di settimana due. 4 00:00:16,500 --> 00:00:18,940 Una parola da un nostro amici del campus - 5 00:00:18,940 --> 00:00:22,620 se siete interessati, possibilmente, sia ora o in un futuro periodo 6 00:00:22,620 --> 00:00:25,670 ancora, una volta più confortevole, insegnamento studenti delle scuole medie un po ' 7 00:00:25,670 --> 00:00:27,680 qualcosa di informatica, fare capo a tale URL. 8 00:00:27,680 --> 00:00:32,360 Essi sono in particolare bisogno in questo momento di insegnanti, in particolare se avete 9 00:00:32,360 --> 00:00:34,700 avuto qualche esposizione alla scienza informatica. 10 00:00:34,700 --> 00:00:38,060 >> Quindi ricorda che l'ultima volta, abbiamo introdotto alcuni tipi di dati in C, e 11 00:00:38,060 --> 00:00:40,590 si può avere iniziato per ottenere la vostra mani sporche con questi finora 12 00:00:40,590 --> 00:00:41,940 nel problema di impostare uno. 13 00:00:41,940 --> 00:00:43,230 E abbiamo avuto un char. 14 00:00:43,230 --> 00:00:49,100 Quindi, in termini un po 'tecnici, cosa è un char come lo conoscete oggi? 15 00:00:49,100 --> 00:00:51,050 >> Quindi è un personaggio, ma ti permette di essere più preciso ora. 16 00:00:51,050 --> 00:00:53,735 Cosa si intende per carattere o individuale char? 17 00:00:53,735 --> 00:00:56,700 18 00:00:56,700 --> 00:00:59,500 Un carattere non numerico - 19 00:00:59,500 --> 00:01:00,670 quindi non necessariamente. 20 00:01:00,670 --> 00:01:04,580 Si scopre che i numeri pari, anche punteggiatura e lettere sono 21 00:01:04,580 --> 00:01:06,980 rappresentato con questi dati tipo conosciuto come un char. 22 00:01:06,980 --> 00:01:09,440 Quindi non è necessariamente alfabetico. 23 00:01:09,440 --> 00:01:11,100 Sì? 24 00:01:11,100 --> 00:01:12,275 >> Quindi è un carattere ASCII. 25 00:01:12,275 --> 00:01:15,510 Quindi, se si pensa di nuovo a settimana pari a zero, quando abbiamo avuto la nostra byte di volontari 26 00:01:15,510 --> 00:01:19,150 venire e sia tenere le mani in alto o non tutti, hanno rappresentato punte. 27 00:01:19,150 --> 00:01:22,450 Ma collettivamente come un gruppo di otto, rappresentavano un byte. 28 00:01:22,450 --> 00:01:26,030 E abbiamo introdotto la nozione di ASCII a quella conferenza, che semplicemente è una 29 00:01:26,030 --> 00:01:28,170 mapping tra i numeri e le lettere. 30 00:01:28,170 --> 00:01:32,010 E utilizza ASCII, come gli umani implicite, otto bit 31 00:01:32,010 --> 00:01:33,660 per rappresentare un carattere. 32 00:01:33,660 --> 00:01:36,890 >> Quindi, di conseguenza, se otto bit possono ogni ripresa su uno dei due valori - 33 00:01:36,890 --> 00:01:38,010 zero o una - 34 00:01:38,010 --> 00:01:40,280 Ciò significa che ci sono due possibilità per questa persona - 35 00:01:40,280 --> 00:01:41,230 zero o una - 36 00:01:41,230 --> 00:01:44,070 due per questa persona, due per questo persona, due per questo. 37 00:01:44,070 --> 00:01:47,450 Quindi, per un totale di due volte due volte due volte due volte due - 38 00:01:47,450 --> 00:01:49,700 così due l'ottavo in totale. 39 00:01:49,700 --> 00:01:54,320 Quindi c'è un numero totale di caratteri 256 possibile che si può 40 00:01:54,320 --> 00:01:55,750 rappresentare con otto bit. 41 00:01:55,750 --> 00:01:59,210 >> Ora, quelli di voi che parlano asiatico lingue potrebbe sapere che non c'è più 42 00:01:59,210 --> 00:02:02,620 personaggi del mondo che solo As e Bs e Cs e Ds. 43 00:02:02,620 --> 00:02:06,130 E infatti, ASCII non sufficiente per molte lingue del mondo. 44 00:02:06,130 --> 00:02:07,760 Ma più su che un'altra volta. 45 00:02:07,760 --> 00:02:11,240 Per ora, sappiate che in C, se si vuole per rappresentare una lettera, un pezzo di 46 00:02:11,240 --> 00:02:15,780 punteggiatura, o semplicemente qualcosa di carattere in natura, usiamo un char. 47 00:02:15,780 --> 00:02:18,240 Ed è un byte o otto bit. 48 00:02:18,240 --> 00:02:19,690 >> Che ne dici di un int? 49 00:02:19,690 --> 00:02:20,780 Beh, un int è un intero. 50 00:02:20,780 --> 00:02:23,175 Quanti bit, se vi ricordate, era un intero genere? 51 00:02:23,175 --> 00:02:25,930 52 00:02:25,930 --> 00:02:27,512 Chiunque richiamo? 53 00:02:27,512 --> 00:02:29,600 Quindi è generalmente 32. 54 00:02:29,600 --> 00:02:32,120 In realtà dipende dal computer che si sta utilizzando. 55 00:02:32,120 --> 00:02:35,770 Ma nel dell'apparecchio ed in molti computer, è 32 bit o quattro 56 00:02:35,770 --> 00:02:37,140 byte - otto volte quattro. 57 00:02:37,140 --> 00:02:39,790 E int sono solo utilizzati per la memorizzazione numeri, sia negativi, 58 00:02:39,790 --> 00:02:41,610 positivo o zero. 59 00:02:41,610 --> 00:02:45,250 >> E se hai 32 bit e hai solo cura di numeri positivi, può 60 00:02:45,250 --> 00:02:48,960 chiunque baseball quanti possibili interi un computer può rappresentare da 61 00:02:48,960 --> 00:02:51,820 zero su up? 62 00:02:51,820 --> 00:02:56,130 Quindi sarebbe due al 32, che è di circa quattro miliardi. 63 00:02:56,130 --> 00:02:59,720 Così queste potenze di due stanno per essere temi ricorrenti in informatica. 64 00:02:59,720 --> 00:03:03,930 Come vedremo, sono abbastanza conveniente per lavorare con anche se non è abbastanza 65 00:03:03,930 --> 00:03:05,790 facile fare i conti nella propria testa. 66 00:03:05,790 --> 00:03:07,000 >> Così diremo circa quattro miliardi. 67 00:03:07,000 --> 00:03:08,620 Ora, un lungo tempo - 68 00:03:08,620 --> 00:03:09,770 è possibile tipo di congettura. 69 00:03:09,770 --> 00:03:10,480 E 'più di un int. 70 00:03:10,480 --> 00:03:12,440 Quanti bit? 71 00:03:12,440 --> 00:03:14,250 Quindi 64 bit o otto byte. 72 00:03:14,250 --> 00:03:17,480 Questo significa solo è possibile rappresentare anche numeri più grandi, più grande positivo o 73 00:03:17,480 --> 00:03:19,160 numeri negativi più grandi. 74 00:03:19,160 --> 00:03:20,060 >> E che dire di galleggiare? 75 00:03:20,060 --> 00:03:22,260 Questo è un punto mobile valore di 32 bit. 76 00:03:22,260 --> 00:03:25,180 Questo è solo un numero reale, qualcosa di con un punto decimale. 77 00:03:25,180 --> 00:03:30,100 Ma se invece bisogno di più posti dopo la virgola o si desidera 78 00:03:30,100 --> 00:03:33,720 rappresentare un numero più grande con alcune frazione dopo di esso, è possibile utilizzare un 79 00:03:33,720 --> 00:03:36,260 doppia, che è di 64 bit. 80 00:03:36,260 --> 00:03:38,240 >> Ma c'è un interessante da asporto qui. 81 00:03:38,240 --> 00:03:42,890 Quindi, se interi sono limitati da 32 bit e anche i lunghi lunghi sono limitati dal 64 82 00:03:42,890 --> 00:03:46,180 bit, quella sorta di elemosina la domanda, cosa succede se si vuole realmente contare 83 00:03:46,180 --> 00:03:48,790 superiore a 4 miliardi di euro per un int? 84 00:03:48,790 --> 00:03:50,330 Beh, basta usare una lunga lunga. 85 00:03:50,330 --> 00:03:54,200 Ma cosa succede se si desidera contare superiore di due per il 64 °, prendere o lasciare? 86 00:03:54,200 --> 00:03:55,810 >> Ora, questo è un numero enorme. 87 00:03:55,810 --> 00:03:59,250 Ma alla fine, in realtà si potrebbe cura di questi tipi di valori, 88 00:03:59,250 --> 00:04:03,070 soprattutto se si utilizza un database e iniziando a raccogliere un sacco 89 00:04:03,070 --> 00:04:06,190 e un sacco di dati e l'assegnazione unica numeri a ogni pezzo di quei dati. 90 00:04:06,190 --> 00:04:07,430 Così abbiamo genere di un problema. 91 00:04:07,430 --> 00:04:10,700 E allo stesso modo, con virgola mobile valori - galleggianti o doppie - 92 00:04:10,700 --> 00:04:14,290 se hai soltanto un numero finito di bit, quanti numeri totali hai potuto 93 00:04:14,290 --> 00:04:16,980 possibilmente rappresentare? 94 00:04:16,980 --> 00:04:19,540 >> Beh, è ​​meno chiaro quando si coinvolgere un punto decimale. 95 00:04:19,540 --> 00:04:20,899 Ma è sicuramente finita. 96 00:04:20,899 --> 00:04:24,390 Se si dispone di un numero finito di bit, un numero finito di esseri umani, una finita 97 00:04:24,390 --> 00:04:27,350 numero di lampadine, sicuramente si può rappresentano solo un numero finito di 98 00:04:27,350 --> 00:04:28,510 valori in virgola mobile. 99 00:04:28,510 --> 00:04:33,170 Ma quanti numeri reali sono loro nel mondo? 100 00:04:33,170 --> 00:04:33,680 C'è un infinito. 101 00:04:33,680 --> 00:04:37,280 Ecco, questo è una specie di problema perché abbiamo non hanno una quantità infinita di 102 00:04:37,280 --> 00:04:39,970 memoria RAM o all'interno dei nostri computer. 103 00:04:39,970 --> 00:04:41,780 Quindi alcune cose difficili possono accadere. 104 00:04:41,780 --> 00:04:43,900 >> Quindi cerchiamo di andare avanti e provare per esprimere questa qui. 105 00:04:43,900 --> 00:04:46,240 Lasciami andare avanti e di aprire gedit. 106 00:04:46,240 --> 00:04:50,360 Ho intenzione di andare avanti e salvare un file chiamato "floats0.c" solo per essere 107 00:04:50,360 --> 00:04:54,630 coerente con un esempio che è disponibile on-line, se si desidera. 108 00:04:54,630 --> 00:04:58,080 E ho intenzione di andare avanti e definirla come segue - 109 00:04:58,080 --> 00:05:01,540 Ho intenzione di andare avanti e dire: int void main, come spesso facciamo. 110 00:05:01,540 --> 00:05:07,190 >> E poi in questo programma, ho intenzione di mi dichiaro un galleggiante, quindi un 32 bit 111 00:05:07,190 --> 00:05:09,700 variabile chiamata f, arbitrariamente. 112 00:05:09,700 --> 00:05:13,910 E poi ho intenzione di conservare in esso Non lo so, un decimo, quindi 0.1. 113 00:05:13,910 --> 00:05:16,590 Quindi ho intenzione di esprimere che come uno diviso per 10, che è perfettamente 114 00:05:16,590 --> 00:05:17,790 legittimo in C. 115 00:05:17,790 --> 00:05:20,460 >> E poi sulla seconda riga, ho semplicemente desiderare di stampare tale valore. 116 00:05:20,460 --> 00:05:22,950 Quindi ricordiamo che possiamo usare il familiare printf. 117 00:05:22,950 --> 00:05:25,420 Non vogliamo usare% i per un int. 118 00:05:25,420 --> 00:05:28,360 Vogliamo usare% f per un galleggiante. 119 00:05:28,360 --> 00:05:33,080 E poi ho intenzione di fare backslash n, vicino citazione, virgola, f, punto e virgola. 120 00:05:33,080 --> 00:05:34,400 >> Quindi, ecco il mio programma. 121 00:05:34,400 --> 00:05:35,820 C'è già un bug. 122 00:05:35,820 --> 00:05:38,640 Fa qualcuno per cui questa cliccato già far notare almeno 123 00:05:38,640 --> 00:05:40,220 un bug che ho fatto? 124 00:05:40,220 --> 00:05:42,470 Sì? 125 00:05:42,470 --> 00:05:42,800 Già. 126 00:05:42,800 --> 00:05:47,860 Ho dimenticato "# include" alla superiore, essi sintomo di cui se cerco di 127 00:05:47,860 --> 00:05:50,490 compilare questo sta andando essere che il compilatore sta per urlare contro di me, 128 00:05:50,490 --> 00:05:52,770 dicendo simbolo indefinito o qualcosa in tal senso. 129 00:05:52,770 --> 00:05:55,360 Non si capisce qualcosa come printf. 130 00:05:55,360 --> 00:05:59,380 >> Quindi ho intenzione di fare "# include ", Salvare il file. 131 00:05:59,380 --> 00:06:00,400 E ora è più in forma. 132 00:06:00,400 --> 00:06:02,690 Ma ho anche intenzione di puntare fuori uno nuovo dettaglio oggi. 133 00:06:02,690 --> 00:06:08,620 Oltre a specificare luogo titolari come%% f i% s, è possibile 134 00:06:08,620 --> 00:06:12,320 talvolta influenzare il comportamento di quel segnaposto. 135 00:06:12,320 --> 00:06:15,540 Ad esempio, nel caso di un galleggiante valore del punto, se voglio solo 136 00:06:15,540 --> 00:06:22,200 per visualizzare un decimale dopo la periodo, posso effettivamente fare 0.1f. 137 00:06:22,200 --> 00:06:26,830 Quindi, in altre parole, io separo la f e il segno di percentuale con la 0.1, basta 138 00:06:26,830 --> 00:06:30,200 raccontando printf, si potrebbe avere un intero gruppo di numeri dopo la virgola 139 00:06:30,200 --> 00:06:30,930 punto per me. 140 00:06:30,930 --> 00:06:32,870 Ma io voglio solo vedere uno di loro. 141 00:06:32,870 --> 00:06:36,280 >> Quindi ho intenzione di andare avanti ora e risparmia questo programma, andare nel mio terminale 142 00:06:36,280 --> 00:06:41,870 finestra, e ho intenzione di andare avanti e il tipo di rendere galleggiante 0, immettere. 143 00:06:41,870 --> 00:06:44,930 Vedo che la linea un po 'criptico che comincerà ad avere più senso, come abbiamo 144 00:06:44,930 --> 00:06:46,900 prendere in giro a parte questa settimana e la prossima. 145 00:06:46,900 --> 00:06:50,480 Ora ho intenzione di andare avanti ed eseguire galleggiante zero. 146 00:06:50,480 --> 00:06:52,020 E, accidenti. 147 00:06:52,020 --> 00:06:54,880 >> Quindi c'è un altro bug qui per qualche motivo. 148 00:06:54,880 --> 00:07:02,490 Sono abbastanza sicuro che un decimo, o uno diviso per 10, non è 0.0. 149 00:07:02,490 --> 00:07:04,590 Forse sto solo cercando non alle cifre sufficienti. 150 00:07:04,590 --> 00:07:08,580 Allora, perché non dico due 0,2 di vedere due decimali invece di uno solo. 151 00:07:08,580 --> 00:07:11,810 Torniamo alla mia finestra del terminale qui e ha colpito un paio di volte per 152 00:07:11,810 --> 00:07:12,840 vedere la mia storia. 153 00:07:12,840 --> 00:07:15,910 Non far galleggiare di nuovo a zero, e poi di nuovo. 154 00:07:15,910 --> 00:07:17,730 E ora entrare. 155 00:07:17,730 --> 00:07:20,000 >> E ora sono abbastanza sicuro che questo è sbagliato. 156 00:07:20,000 --> 00:07:23,030 E potrei fare tre e quattro, e sono probabilmente andando a continuare a vedere zeri. 157 00:07:23,030 --> 00:07:24,880 Allora, dove è il bug? 158 00:07:24,880 --> 00:07:27,910 Una divisa per 10 dovrebbe essere 0.1. 159 00:07:27,910 --> 00:07:30,310 Qualcuno vuole prendere una pugnalata a quello il problema fondamentale è? 160 00:07:30,310 --> 00:07:32,400 Sì? 161 00:07:32,400 --> 00:07:33,420 Sono entrambi numeri interi. 162 00:07:33,420 --> 00:07:33,920 E allora? 163 00:07:33,920 --> 00:07:37,820 Quindi, con una divisa per 10, che è quello che faccio in aritmetica. 164 00:07:37,820 --> 00:07:41,185 E ottengo 0.1. 165 00:07:41,185 --> 00:07:41,660 >> Già. 166 00:07:41,660 --> 00:07:43,240 E così è in effetti tale questione. 167 00:07:43,240 --> 00:07:46,700 Quando si prende un numero intero in un computer e lo si divide per un altro numero intero, 168 00:07:46,700 --> 00:07:50,430 il computer di default sta per si supponga di voler un numero intero. 169 00:07:50,430 --> 00:07:54,620 Il problema se, naturalmente, è 0.1 che non è un numero intero. 170 00:07:54,620 --> 00:07:55,680 Si tratta di un numero reale. 171 00:07:55,680 --> 00:07:59,610 E così quello che il computer fa da di default è solo butta via 172 00:07:59,610 --> 00:08:01,070 tutto dopo il punto decimale. 173 00:08:01,070 --> 00:08:03,380 Non arrotondare o giù di per sé. 174 00:08:03,380 --> 00:08:06,480 Semplicemente butta via tutto dopo il punto decimale. 175 00:08:06,480 --> 00:08:07,430 E ora che ha un senso. 176 00:08:07,430 --> 00:08:09,740 Perché ora siamo chiaramente sinistra con zero. 177 00:08:09,740 --> 00:08:10,250 >> Ma aspettate un minuto. 178 00:08:10,250 --> 00:08:11,840 Io non sto vedendo un int zero. 179 00:08:11,840 --> 00:08:14,910 In realtà sto vedendo 0.00. 180 00:08:14,910 --> 00:08:16,340 Allora, come faccio a conciliare questo momento? 181 00:08:16,340 --> 00:08:22,850 Se uno diviso per 10 è pari a zero, ma sono vedendo 0.00, dove sta diventando 182 00:08:22,850 --> 00:08:24,250 riconvertito in numero reale? 183 00:08:24,250 --> 00:08:25,500 Già. 184 00:08:25,500 --> 00:08:29,850 185 00:08:29,850 --> 00:08:30,630 Esattamente. 186 00:08:30,630 --> 00:08:35,600 >> Quindi qui in linea cinque, quando in realtà ho negozio che 0.1, che è poi 187 00:08:35,600 --> 00:08:39,549 troncato a zero, all'interno di un galleggiante, che è effettivamente equivalente a 188 00:08:39,549 --> 00:08:42,100 riporlo non come un int, ma, anzi, come un galleggiante. 189 00:08:42,100 --> 00:08:46,540 Inoltre, sto quindi utilizzando printf per stampare esplicitamente il numero a due 190 00:08:46,540 --> 00:08:49,740 decimali anche se vi potrebbe in realtà non essere una qualsiasi. 191 00:08:49,740 --> 00:08:51,020 >> Quindi questo tipo di schifo, vero? 192 00:08:51,020 --> 00:08:53,640 A quanto pare non si può fare la matematica, almeno a questo livello di 193 00:08:53,640 --> 00:08:55,600 precisione, in un computer. 194 00:08:55,600 --> 00:08:56,930 Ma sicuramente c'è una soluzione. 195 00:08:56,930 --> 00:09:00,410 Qual è la soluzione più semplice che potrebbe forse fare, anche solo intuitivamente qui per 196 00:09:00,410 --> 00:09:01,130 risolvere questo problema? 197 00:09:01,130 --> 00:09:02,380 Sì? 198 00:09:02,380 --> 00:09:04,700 199 00:09:04,700 --> 00:09:06,574 Girare i numeri interi in - 200 00:09:06,574 --> 00:09:06,976 sì. 201 00:09:06,976 --> 00:09:10,420 Anche se non sono abbastanza sicuro che cosa è realmente accadendo qui, se 202 00:09:10,420 --> 00:09:13,440 ha fondamentalmente a che fare con questi due essere interi, bene, perché non ho 203 00:09:13,440 --> 00:09:18,230 fare quel 10.0, rendendo questo 1.0, salvare il file. 204 00:09:18,230 --> 00:09:20,990 Torniamo verso il fondo e ricompilare. 205 00:09:20,990 --> 00:09:23,030 Permettetemi ora di eseguire di nuovo. 206 00:09:23,030 --> 00:09:23,420 E lì - 207 00:09:23,420 --> 00:09:27,690 ora, io ho la mia decima rappresentate come 0.10. 208 00:09:27,690 --> 00:09:28,420 >> D'accordo. 209 00:09:28,420 --> 00:09:29,220 Così che non è male. 210 00:09:29,220 --> 00:09:31,730 E vorrei sottolineare un altro modo avremmo potuto risolto questo. 211 00:09:31,730 --> 00:09:35,580 Lasciatemi effettivamente rotolare indietro nel tempo a quando abbiamo avuto questo come uno 212 00:09:35,580 --> 00:09:36,680 decimo un momento fa. 213 00:09:36,680 --> 00:09:40,800 E mi permetta di andare avanti e salvare nuovamente il file come un nome di file diverso, solo per 214 00:09:40,800 --> 00:09:41,750 avere un po 'di posto di blocco. 215 00:09:41,750 --> 00:09:43,450 Così che era la versione uno. 216 00:09:43,450 --> 00:09:45,520 E ora lasciami andare avanti e eseguire una versione più. 217 00:09:45,520 --> 00:09:48,540 Chiameremo questa versione due zero indicizzati. 218 00:09:48,540 --> 00:09:51,280 >> E ho intenzione di fare, invece questo - si sa che cosa? 219 00:09:51,280 --> 00:09:54,400 Aggiunta di punti a zero funziona in questo caso. 220 00:09:54,400 --> 00:09:56,060 Ma supponiamo che uno fosse una variabile. 221 00:09:56,060 --> 00:09:57,680 Supposto 10 erano una variabile. 222 00:09:57,680 --> 00:10:00,680 In altre parole, supponiamo che non potevo solo duro-codice 0,0 alla fine 223 00:10:00,680 --> 00:10:02,340 di questa espressione aritmetica. 224 00:10:02,340 --> 00:10:05,820 Beh, posso effettivamente fare qualcosa tra parentesi chiamato fusione. 225 00:10:05,820 --> 00:10:11,920 Posso lanciare quella numero intero da 10 a un galleggiante, e posso esprimere che uno intero in un 226 00:10:11,920 --> 00:10:12,800 galleggiare, come bene. 227 00:10:12,800 --> 00:10:17,190 Poi la matematica che sta per essere fatto effettivamente 1,0 diviso per 10,0, 228 00:10:17,190 --> 00:10:19,250 il cui risultato va in f come prima. 229 00:10:19,250 --> 00:10:26,130 Quindi, se ho ricompilare questo come rendere galleggianti 2, e ora galleggia 2, ottengo lo stesso 230 00:10:26,130 --> 00:10:27,020 rispondere, pure. 231 00:10:27,020 --> 00:10:29,640 >> Quindi questo è un esempio abbastanza artificioso, per risolvere questo problema 232 00:10:29,640 --> 00:10:31,400 introducendo colata. 233 00:10:31,400 --> 00:10:34,410 Ma in generale, la fusione sta per essere una cosa potente, particolarmente per 234 00:10:34,410 --> 00:10:38,180 problema impostare due nel giro di una settimana, quando che si desidera convertire un tipo di dati 235 00:10:38,180 --> 00:10:41,800 un'altra che alla fine della giornata sono rappresentati nello stesso modo. 236 00:10:41,800 --> 00:10:44,970 Alla fine della giornata, ogni singolo cosa di cui abbiamo parlato finora è 237 00:10:44,970 --> 00:10:46,710 solo interi sotto la cappa. 238 00:10:46,710 --> 00:10:48,950 Oppure, se è troppo di basso livello per te, sono solo numeri 239 00:10:48,950 --> 00:10:49,750 sotto la cappa. 240 00:10:49,750 --> 00:10:52,850 Anche i personaggi, ancora una volta, richiamano da settimana a zero, sono numeri 241 00:10:52,850 --> 00:10:53,990 sotto la cappa. 242 00:10:53,990 --> 00:10:57,240 >> Il che vuol dire, siamo in grado di conversione tra vari tipi di numeri se 243 00:10:57,240 --> 00:10:58,060 sono solo bit. 244 00:10:58,060 --> 00:11:01,020 Siamo in grado di convertire tra i numeri e le lettere se sono solo 245 00:11:01,020 --> 00:11:02,580 bit, e viceversa. 246 00:11:02,580 --> 00:11:07,170 E colata in questo modo è un meccanismo in programmazione che consente di forza 247 00:11:07,170 --> 00:11:10,970 cambiare un tipo di dati all'altro. 248 00:11:10,970 --> 00:11:14,570 Purtroppo, questo non è come semplice come avrei voluto. 249 00:11:14,570 --> 00:11:19,220 >> Ho intenzione di tornare in carri allegorici 1, che era il più semplice, più 250 00:11:19,220 --> 00:11:22,830 uno semplice con .0 Aggiunto a ciascuna. 251 00:11:22,830 --> 00:11:25,260 E proprio come un rapido aggiornamento, mi permetta di andare avanti e ricompilare 252 00:11:25,260 --> 00:11:27,670 questo, rendere galleggianti 2 - 253 00:11:27,670 --> 00:11:30,300 Siamo spiacenti, questo è fare i galleggianti 1. 254 00:11:30,300 --> 00:11:32,050 E adesso corriamo galleggianti 1. 255 00:11:32,050 --> 00:11:34,810 E in fondo, notare che ho davvero capito 0.1. 256 00:11:34,810 --> 00:11:36,165 Quindi, problema risolto. 257 00:11:36,165 --> 00:11:37,280 >> Ma non ancora. 258 00:11:37,280 --> 00:11:40,000 Ora sto andando a prendere un po 'curioso, e ho intenzione di tornare nella mia 259 00:11:40,000 --> 00:11:41,620 printf e dire, sai cosa? 260 00:11:41,620 --> 00:11:44,090 Vorrei confermare che questo è davvero un decimo. 261 00:11:44,090 --> 00:11:47,890 E ho intenzione di voler vedere questo a, diciamo, cinque cifre decimali. 262 00:11:47,890 --> 00:11:48,570 Non è un problema. 263 00:11:48,570 --> 00:11:52,020 Cambio il due a cinque, Ho ricompilare con make. 264 00:11:52,020 --> 00:11:53,770 Ho eseguire nuovamente come galleggia 1. 265 00:11:53,770 --> 00:11:54,990 Cercando piuttosto bene. 266 00:11:54,990 --> 00:11:58,570 I miei controlli di integrità potrebbe finire lì, ma Sto diventando un po 'più avventuroso. 267 00:11:58,570 --> 00:12:00,330 Ho intenzione di cambiare 0,5-0,10. 268 00:12:00,330 --> 00:12:03,440 Voglio vedere 10 cifre dopo il decimale. 269 00:12:03,440 --> 00:12:09,060 >> E ho intenzione di andare avanti e ricompilare questo e rieseguire galleggia 1. 270 00:12:09,060 --> 00:12:13,060 I tipi di rammarico dopo aver testato questa ulteriormente perché la mia matematica non è così 271 00:12:13,060 --> 00:12:14,320 Correggere più, a quanto pare. 272 00:12:14,320 --> 00:12:15,630 Ma aspettate un minuto, forse questo è solo un colpo di fortuna. 273 00:12:15,630 --> 00:12:17,810 Forse il computer agisce un po 'strano. 274 00:12:17,810 --> 00:12:21,810 Lasciatemi andare avanti e fare 20 punti decimali e rassicurare me stesso che io so 275 00:12:21,810 --> 00:12:22,540 come fare la matematica. 276 00:12:22,540 --> 00:12:23,460 Io so come programmare. 277 00:12:23,460 --> 00:12:26,960 Fai galleggianti 1, ricompilare e dannazione. 278 00:12:26,960 --> 00:12:31,110 Questo è davvero, davvero sempre lontano dal marchio. 279 00:12:31,110 --> 00:12:32,490 >> Così che cosa sta succedendo qui? 280 00:12:32,490 --> 00:12:36,050 Intuitivamente, in base alle nostre ipotesi precedenza circa la dimensione dei tipi di dati, 281 00:12:36,050 --> 00:12:38,040 ciò che deve accadere qui sotto il cofano? 282 00:12:38,040 --> 00:12:39,290 Sì? 283 00:12:39,290 --> 00:12:43,000 284 00:12:43,000 --> 00:12:43,590 Esattamente. 285 00:12:43,590 --> 00:12:46,480 Se si desidera che questo molta precisione, e che è un diavolo di un sacco di precisione - 286 00:12:46,480 --> 00:12:48,770 20 numeri dopo la virgola. 287 00:12:48,770 --> 00:12:51,990 Non si può forse rappresentare un numero arbitrario a meno che non si dispone di un 288 00:12:51,990 --> 00:12:52,930 numero arbitrario di bit. 289 00:12:52,930 --> 00:12:54,190 Ma non lo facciamo. 290 00:12:54,190 --> 00:12:57,200 Per un galleggiante, abbiamo solo 32 bit. 291 00:12:57,200 --> 00:13:02,260 >> Quindi se 32 bit possono essere permutati solo in un modo - proprio come i nostri uomini sul, palco 292 00:13:02,260 --> 00:13:05,780 mani su o giù - in un numero finito di modi, c'è solo un numero finito 293 00:13:05,780 --> 00:13:08,640 di numeri reali si possono rappresentare con quei bit. 294 00:13:08,640 --> 00:13:10,500 E così il computer alla fine sta andando ad avere per 295 00:13:10,500 --> 00:13:11,730 iniziare a tagliare gli angoli. 296 00:13:11,730 --> 00:13:15,500 Il computer può nascondere quei dettagli da noi per un po 'di tempo. 297 00:13:15,500 --> 00:13:18,880 Ma se cominciamo a frugare i numeri e guardando sempre più lontano alla 298 00:13:18,880 --> 00:13:23,220 trascinamento numeri in numero intero, allora iniziamo a vedere che è 299 00:13:23,220 --> 00:13:26,480 effettivamente approssimare la idea di un decimo. 300 00:13:26,480 --> 00:13:29,860 >> E così si scopre, tragicamente, non c'è un numero infinito di numeri 301 00:13:29,860 --> 00:13:35,060 noi non possiamo rappresentare con precisione in un calcolatore, almeno con una definita 302 00:13:35,060 --> 00:13:38,030 numero di bit, un finito quantità di RAM. 303 00:13:38,030 --> 00:13:41,210 Ora, purtroppo, questo a volte ha conseguenze reali. 304 00:13:41,210 --> 00:13:45,980 Se le persone non apprezzano molto questo o il tipo di danno per scontato il fatto 305 00:13:45,980 --> 00:13:48,310 che il loro computer sarà solo fare ciò che essi dicono di fare e non fare 306 00:13:48,310 --> 00:13:51,430 comprendere questi sottostante Dettagli rappresentanza - 307 00:13:51,430 --> 00:13:55,290 che, francamente, in alcune lingue sono nascosta dall'utente, contrariamente a C - 308 00:13:55,290 --> 00:13:56,500 alcune cose brutte possono accadere. 309 00:13:56,500 --> 00:13:58,650 >> E quello che ho pensato di fare è fare un passo indietro. 310 00:13:58,650 --> 00:14:00,420 E questo è circa video di otto minuti. 311 00:14:00,420 --> 00:14:04,200 E 'andato in onda qualche anno fa, e dà intuizioni in realtà ciò che può andare 312 00:14:04,200 --> 00:14:09,290 male quando si sotto-apprezzare questi tipi di dettagli nella molto fin troppo 313 00:14:09,290 --> 00:14:10,080 mondo reale. 314 00:14:10,080 --> 00:14:12,965 Se potessimo abbassare le luci per alcuni minuti. 315 00:14:12,965 --> 00:14:14,360 >> SPEAKER 1: Torniamo ora a ingegneria 316 00:14:14,360 --> 00:14:17,160 disastri su Modern Marvels. 317 00:14:17,160 --> 00:14:18,680 >> Computer - 318 00:14:18,680 --> 00:14:21,340 tutti abbiamo imparato ad accettare la problemi spesso frustranti 319 00:14:21,340 --> 00:14:23,170 che andare con loro. 320 00:14:23,170 --> 00:14:27,570 Bugs, virus e anomalie nel software sono piccoli prezzi da pagare per il 321 00:14:27,570 --> 00:14:28,960 convenienza. 322 00:14:28,960 --> 00:14:32,040 Ma in high-tech e ad alta velocità programma spaziale militare e 323 00:14:32,040 --> 00:14:38,650 applicazioni, il problema più piccolo può essere ingrandita in disastro. 324 00:14:38,650 --> 00:14:44,480 >> Il 4 giugno del 1996, gli scienziati disposti a lanciare un senza pilota razzo Ariane 5. 325 00:14:44,480 --> 00:14:48,700 Si stava trasportando satelliti scientifici atte a stabilire con precisione come 326 00:14:48,700 --> 00:14:53,250 campo magnetico terrestre interagisce con venti solari. 327 00:14:53,250 --> 00:14:57,540 Il razzo è stato costruito per l'Europa Agenzia spaziale e tolto dalla sua 328 00:14:57,540 --> 00:14:59,906 impianto sulla costa della Guiana francese. 329 00:14:59,906 --> 00:15:03,660 >> JACK GANSSLE: A circa 37 secondi in il volo, hanno notato prima 330 00:15:03,660 --> 00:15:04,910 qualcosa stava andando storto. 331 00:15:04,910 --> 00:15:08,130 Gli ugelli sono orientabili in un modo che davvero non dovrebbe. 332 00:15:08,130 --> 00:15:12,380 Circa 40 secondi dall'inizio del volo, chiaramente il veicolo era in difficoltà. 333 00:15:12,380 --> 00:15:14,400 E questo è quando hanno fatto una decisione di distruggerla. 334 00:15:14,400 --> 00:15:18,520 Il responsabile della sicurezza gamma, con budella tremende, preme il pulsante, 335 00:15:18,520 --> 00:15:23,900 fatto saltare in aria il razzo prima che potesse diventare un pericolo per la sicurezza pubblica. 336 00:15:23,900 --> 00:15:27,810 >> SPEAKER 1: Questo è stato il viaggio inaugurale di Ariane 5, e la sua distruzione 337 00:15:27,810 --> 00:15:32,020 ha avuto luogo a causa di un difetto incorporato nel software del razzo. 338 00:15:32,020 --> 00:15:33,980 >> JACK GANSSLE: Il problema sul Ariane era che c'era un numero 339 00:15:33,980 --> 00:15:36,390 che il termine di 64 bit di esprimere. 340 00:15:36,390 --> 00:15:39,420 E volevano convertire ad un numero a 16 bit. 341 00:15:39,420 --> 00:15:43,130 Si presume che il numero non è mai stato sarà molto grande, che la maggior parte 342 00:15:43,130 --> 00:15:46,810 queste cifre nel 64 bit numero erano zeri. 343 00:15:46,810 --> 00:15:48,270 Si sbagliavano. 344 00:15:48,270 --> 00:15:51,380 >> SPEAKER 1: L'incapacità di un software programma per accettare il tipo di 345 00:15:51,380 --> 00:15:55,350 numero generato da un altro stato alla radice del fallimento. 346 00:15:55,350 --> 00:15:59,970 Lo sviluppo del software era diventato molto costosa parte della nuova tecnologia. 347 00:15:59,970 --> 00:16:03,980 Il razzo Ariane 4, era stato molto successo, tanto del software 348 00:16:03,980 --> 00:16:07,480 creata per era anche utilizzato nel Ariane 5. 349 00:16:07,480 --> 00:16:11,980 >> PHILIP COYLE: Il problema di base è stato che l'Ariane 5 è stato più veloce, 350 00:16:11,980 --> 00:16:13,720 accelerato veloce. 351 00:16:13,720 --> 00:16:17,250 E il software non ha avuto rappresentato per questo. 352 00:16:17,250 --> 00:16:20,770 >> SPEAKER 1: La distruzione del razzo è stato un enorme disastro finanziario, 353 00:16:20,770 --> 00:16:24,200 tutto a causa di un errore di software minuto. 354 00:16:24,200 --> 00:16:27,820 Ma questa non era la prima volta i dati problemi di conversione avevano afflitto moderna 355 00:16:27,820 --> 00:16:30,620 tecnologia dei razzi. 356 00:16:30,620 --> 00:16:34,480 >> JACK GANSSLE: Nel 1991, con l'inizio della prima Guerra del Golfo, il Patriot 357 00:16:34,480 --> 00:16:38,610 missile vive una sorta simile di un problema di conversione numero. 358 00:16:38,610 --> 00:16:44,910 Come risultato, 28 soldati americani erano uccisi e circa 100 altri feriti 359 00:16:44,910 --> 00:16:48,600 quando il Patriot, che avrebbe dovuto per la protezione contro Scuds entranti, 360 00:16:48,600 --> 00:16:51,630 non è riuscito a sparare un missile. 361 00:16:51,630 --> 00:16:55,110 >> SPEAKER 1: Quando l'Iraq invase il Kuwait e L'America ha lanciato Desert Storm in 362 00:16:55,110 --> 00:17:00,570 All'inizio del 1991, batterie di missili Patriot sono stati dispiegati per proteggere l'Arabia Saudita 363 00:17:00,570 --> 00:17:04,760 e Israele da iracheni Scud attacchi missilistici. 364 00:17:04,760 --> 00:17:09,720 Il Patriot è un medio raggio US sistema superficie-aria prodotto da 365 00:17:09,720 --> 00:17:11,569 l'azienda Raytheon. 366 00:17:11,569 --> 00:17:16,410 >> THEODORE Postol: La dimensione del Patriot intercettore si è più o meno 367 00:17:16,410 --> 00:17:17,710 Lungo 20 piedi. 368 00:17:17,710 --> 00:17:20,800 E pesa circa 2000 chili. 369 00:17:20,800 --> 00:17:22,940 E porta una testata di circa - 370 00:17:22,940 --> 00:17:24,905 Penso che sia circa 150 chili. 371 00:17:24,905 --> 00:17:31,030 E la testata stessa è una alto esplosivo che ha 372 00:17:31,030 --> 00:17:33,270 frammenti intorno ad esso. 373 00:17:33,270 --> 00:17:37,490 L'involucro della testata è progettata di agire come pallettoni. 374 00:17:37,490 --> 00:17:40,720 >> SPEAKER 1: I missili vengono effettuate quattro per contenitore e vengono trasportati 375 00:17:40,720 --> 00:17:43,050 da un semirimorchio. 376 00:17:43,050 --> 00:17:47,490 >> PHILIP COYLE: The Patriot antimissile sistema torna a 377 00:17:47,490 --> 00:17:50,710 almeno 20 anni. 378 00:17:50,710 --> 00:17:54,350 È stato originariamente progettato come una difesa missile aria a 379 00:17:54,350 --> 00:17:56,190 abbattere aerei nemici. 380 00:17:56,190 --> 00:18:02,490 Nella prima guerra del Golfo, quando quella guerra è arrivato, l'esercito ha voluto usarlo 381 00:18:02,490 --> 00:18:05,535 di abbattere Scud, non di aeroplani. 382 00:18:05,535 --> 00:18:09,310 La forza aerea irachena non era tanto di un problema. 383 00:18:09,310 --> 00:18:12,450 Ma l'esercito era preoccupato per Scud. 384 00:18:12,450 --> 00:18:15,950 E così hanno cercato di aggiornare il Patriot. 385 00:18:15,950 --> 00:18:18,750 >> SPEAKER 1: Intercettare un missile nemico viaggia a mach cinque era 386 00:18:18,750 --> 00:18:20,890 andando ad essere abbastanza impegnativo. 387 00:18:20,890 --> 00:18:25,590 Ma quando il Patriot è stato ricoverato in servizio, l'esercito non era a conoscenza di un 388 00:18:25,590 --> 00:18:31,710 Modifica iracheno che ha fatto loro Scud quasi impossibile da colpire. 389 00:18:31,710 --> 00:18:35,240 >> THEODORE Postol: Che cosa è successo è il Scuds che erano 390 00:18:35,240 --> 00:18:36,570 in arrivo erano instabili. 391 00:18:36,570 --> 00:18:37,532 Erano vacillando. 392 00:18:37,532 --> 00:18:43,220 La ragione di questo è che gli iracheni, in Per ottenere 600 km su una 393 00:18:43,220 --> 00:18:47,530 Missile 300 chilometri di gamma, ha preso peso fuori dalla testata anteriore. 394 00:18:47,530 --> 00:18:49,290 Hanno fatto la testata più leggera. 395 00:18:49,290 --> 00:18:53,110 Così ora il Patriot sta cercando di venire al Scud. 396 00:18:53,110 --> 00:18:56,470 E la maggior parte del tempo, la stragrande maggioranza del tempo, sarebbe solo 397 00:18:56,470 --> 00:18:58,730 volare dal Scud. 398 00:18:58,730 --> 00:19:01,760 >> SPEAKER 1: Una volta che il sistema Patriot operatori realizzato il Patriot perdere 399 00:19:01,760 --> 00:19:06,690 il suo obiettivo, hanno fatto esplodere i Patriots testata per evitare possibili 400 00:19:06,690 --> 00:19:10,300 perdite se è stato consentito a cadere a terra. 401 00:19:10,300 --> 00:19:14,540 >> THEODORE Postol: Questo era ciò che più la gente ha visto come grandi palle di fuoco nel cielo 402 00:19:14,540 --> 00:19:20,350 e incompreso come intercetta di Scud testate. 403 00:19:20,350 --> 00:19:23,320 >> SPEAKER 1: Anche se in cielo notte Patriots sembrava essere successo 404 00:19:23,320 --> 00:19:27,530 distruggendo Scud, a Dhahran ci potrebbe essere errore circa la sua 405 00:19:27,530 --> 00:19:29,140 prestazioni. 406 00:19:29,140 --> 00:19:34,180 Lì, il sistema radar del Patriot perduto traccia di un Scud in entrata e mai 407 00:19:34,180 --> 00:19:36,380 avviato a causa di un difetto software. 408 00:19:36,380 --> 00:19:39,890 409 00:19:39,890 --> 00:19:42,700 >> Era gli israeliani che per primo ha scoperto che il più il sistema 410 00:19:42,700 --> 00:19:48,020 era in, maggiore è il tempo di discrepanza divenne causa di un orologio 411 00:19:48,020 --> 00:19:50,470 incorporato nel computer del sistema. 412 00:19:50,470 --> 00:19:54,640 >> JACK GANSSLE: Circa due settimane prima della tragedia a Dhahran, gli israeliani 413 00:19:54,640 --> 00:19:58,440 segnalati al Dipartimento della Difesa che il sistema perdeva tempo. 414 00:19:58,440 --> 00:20:01,280 Dopo circa otto ore di funzionamento, hanno notato che il sistema è 415 00:20:01,280 --> 00:20:03,530 diventando notevolmente meno accurato. 416 00:20:03,530 --> 00:20:07,710 Il Dipartimento della Difesa ha risposto raccontando tutte le batterie Patriot 417 00:20:07,710 --> 00:20:10,500 per non lasciare i sistemi per molto tempo. 418 00:20:10,500 --> 00:20:12,430 Non hanno mai detto quello che un tempo era. 419 00:20:12,430 --> 00:20:13,330 Otto ore? 420 00:20:13,330 --> 00:20:13,810 10 ore? 421 00:20:13,810 --> 00:20:14,990 1000 ore? 422 00:20:14,990 --> 00:20:17,150 Nessuno lo sapeva. 423 00:20:17,150 --> 00:20:20,220 >> SPEAKER 1: La batteria di Patriot di stanza presso la caserma a Dhahran 424 00:20:20,220 --> 00:20:24,660 e il suo imperfetto orologio interno era stato su oltre 100 ore di notte di 425 00:20:24,660 --> 00:20:27,470 25 febbraio. 426 00:20:27,470 --> 00:20:31,770 >> JACK GANSSLE: E 'il momento di un tracciato precisione di circa un decimo di secondo. 427 00:20:31,770 --> 00:20:34,480 Ora, un decimo di secondo è un numero interessante perché non può essere 428 00:20:34,480 --> 00:20:39,940 espresso in binario esattamente, il che significa esso non può essere espressa esattamente 429 00:20:39,940 --> 00:20:42,500 qualsiasi computer digitale moderno. 430 00:20:42,500 --> 00:20:46,920 E 'difficile da credere, ma utilizzare questo come esempio. 431 00:20:46,920 --> 00:20:49,000 Prendiamo il numero di un terzo. 432 00:20:49,000 --> 00:20:53,150 Un terzo non può essere espressa in decimale esattamente. 433 00:20:53,150 --> 00:20:57,500 Un terzo è 0.333 andando su di infinito. 434 00:20:57,500 --> 00:21:02,270 Non c'è modo di farlo con precisione assoluta in decimale. 435 00:21:02,270 --> 00:21:05,370 Questo è esattamente lo stesso tipo di problema quello che è successo nel Patriot. 436 00:21:05,370 --> 00:21:09,880 Più lungo è il sistema corse, la peggiore l'errore di tempo è diventato. 437 00:21:09,880 --> 00:21:13,840 >> SPEAKER 1: Dopo 100 ore di funzionamento, l'errore nel tempo è stato solo 438 00:21:13,840 --> 00:21:16,140 circa un terzo di secondo. 439 00:21:16,140 --> 00:21:20,800 Ma in termini di mira un missile viaggia a mach cinque, si è tradotto in 440 00:21:20,800 --> 00:21:24,410 un tracking error di oltre 600 metri. 441 00:21:24,410 --> 00:21:27,670 Sarebbe un errore fatale per i soldati a Dhahran. 442 00:21:27,670 --> 00:21:33,450 >> THEODORE Postol: Quello che è successo è un Scud lancio è stato rilevato da inizio 443 00:21:33,450 --> 00:21:34,280 satelliti di allarme. 444 00:21:34,280 --> 00:21:38,550 E sapevano che stava arrivando la Scud nella loro direzione generale. 445 00:21:38,550 --> 00:21:41,000 Non sapevano da dove venisse. 446 00:21:41,000 --> 00:21:43,900 >> SPEAKER 1: Era ora al radar componente del sistema Patriot 447 00:21:43,900 --> 00:21:48,910 difendendo Dhahran per individuare e mantenere traccia del missile nemico in arrivo. 448 00:21:48,910 --> 00:21:50,580 >> JACK GANSSLE: Il radar era molto intelligente. 449 00:21:50,580 --> 00:21:53,770 Sarebbe effettivamente tracciare la posizione il Scud e quindi prevedere dove 450 00:21:53,770 --> 00:21:57,160 probabilmente sarebbe la prossima volta il radar ha inviato un impulso di fuori. 451 00:21:57,160 --> 00:21:58,870 Che è stato chiamato il cancello di gamma. 452 00:21:58,870 --> 00:22:04,020 >> THEODORE Postol: Poi una volta che il Patriot decide è passato abbastanza tempo per andare 453 00:22:04,020 --> 00:22:09,420 indietro e controllare la posizione successiva per questo oggetto rilevato, si va indietro. 454 00:22:09,420 --> 00:22:14,450 Così, quando si tornò al sbagliata posto, poi vede nessun oggetto. 455 00:22:14,450 --> 00:22:18,200 E decide che non vi era nessun oggetto, era un falso rilevamento, e 456 00:22:18,200 --> 00:22:19,680 scende in pista. 457 00:22:19,680 --> 00:22:22,970 >> SPEAKER 1: Il Scud in arrivo scomparso da schermo radar, e 458 00:22:22,970 --> 00:22:26,050 secondi dopo lo sbatté in caserma. 459 00:22:26,050 --> 00:22:31,950 Il Scud ucciso 28 ed è stato l'ultimo sparato durante la prima guerra del Golfo. 460 00:22:31,950 --> 00:22:37,700 Tragicamente, il software aggiornato è arrivata a Dhahran il giorno seguente. 461 00:22:37,700 --> 00:22:41,800 Il difetto del software era stato fissato, chiusura di un capitolo nella travagliata 462 00:22:41,800 --> 00:22:43,690 storia del missile Patriot. 463 00:22:43,690 --> 00:22:46,780 464 00:22:46,780 --> 00:22:50,710 >> Patriot è in realtà un acronimo per Phased Array tracking 465 00:22:50,710 --> 00:22:51,960 Intercettazione del target. 466 00:22:51,960 --> 00:22:54,650 467 00:22:54,650 --> 00:23:00,840 >> DAVID J MALAN: Bene, quindi un fa riflettere, ad esempio, per essere sicuri. 468 00:23:00,840 --> 00:23:03,430 E per fortuna, si tratta di livello inferiore i bug non sono qualcosa che faremo 469 00:23:03,430 --> 00:23:06,220 in genere hanno di apprezzare, di certo non con alcuni dei nostri 470 00:23:06,220 --> 00:23:07,360 prima dei programmi. 471 00:23:07,360 --> 00:23:10,450 Piuttosto, la maggior parte dei bug che faremo incontro sarà di natura logica, 472 00:23:10,450 --> 00:23:12,900 sintattica in cui la natura codice non funziona bene. 473 00:23:12,900 --> 00:23:14,140 E tu lo sai abbastanza veloce. 474 00:23:14,140 --> 00:23:16,850 >> Ma soprattutto quando si arriva al fine del semestre, che sta per 475 00:23:16,850 --> 00:23:20,620 diventare sempre più di una possibilità di davvero riflettere sulla progettazione 476 00:23:20,620 --> 00:23:22,960 dei vostri programmi e le sottostanti rappresentazione 477 00:23:22,960 --> 00:23:24,520 anche lì dei dati. 478 00:23:24,520 --> 00:23:28,010 Per esempio, si introducono MySQL, che è un motore di database popolari 479 00:23:28,010 --> 00:23:30,850 che è possibile utilizzare con i siti web di memorizzare dati sul back-end. 480 00:23:30,850 --> 00:23:34,630 E si dovrà cominciare a decidere in la fine del semestre non solo ciò 481 00:23:34,630 --> 00:23:38,790 tipi di dati in questo senso da utilizzare ma esattamente il numero di bit da utilizzare, 482 00:23:38,790 --> 00:23:42,740 se non si desidera memorizzare le date come date e orari come i tempi, e anche 483 00:23:42,740 --> 00:23:46,890 cose come quanto grande volete il ID univoci per essere per, diciamo, gli utenti 484 00:23:46,890 --> 00:23:47,680 nel database. 485 00:23:47,680 --> 00:23:51,210 >> Infatti, se alcuni di voi hanno avuto Facebook rappresenta per un bel po 'di tempo, 486 00:23:51,210 --> 00:23:53,680 e si sa come ottenere l'accesso al tuo ID utente - 487 00:23:53,680 --> 00:23:57,930 che a volte appare nella vostra URL del profilo se non hai scelto un 488 00:23:57,930 --> 00:24:02,070 soprannome per l'URL, o se hai 'utilizzato Facebook Graph API, il 489 00:24:02,070 --> 00:24:05,510 a disposizione del pubblico API con cui si possono chiedere di Facebook per i dati grezzi - 490 00:24:05,510 --> 00:24:07,580 si può vedere che cosa il vostro ID numerico. 491 00:24:07,580 --> 00:24:10,880 E alcuni anni fa, Facebook essenzialmente dovuto cambiare da usare 492 00:24:10,880 --> 00:24:15,980 l'equivalente di int all'utilizzo lungo lungo, perché nel corso del tempo, come gli utenti vengono 493 00:24:15,980 --> 00:24:19,780 e andare a creare un sacco di account e conti falsi, anche loro molto facilmente 494 00:24:19,780 --> 00:24:24,630 sono stati in grado di esaurire qualcosa come un 4 miliardi di possibile valore come un int. 495 00:24:24,630 --> 00:24:28,340 >> Quindi più su quei tipi di problemi lungo la strada, pure. 496 00:24:28,340 --> 00:24:30,750 Va bene, così che era colata. 497 00:24:30,750 --> 00:24:31,670 Quello era imprecisione. 498 00:24:31,670 --> 00:24:32,730 Un paio di brevi annunci. 499 00:24:32,730 --> 00:24:35,710 Così sezioni iniziano ufficialmente il prossimo Domenica, Lunedi, Martedì. 500 00:24:35,710 --> 00:24:39,080 Sentirete via e-mail entro questa settimana come per il vostro incarico sezione. 501 00:24:39,080 --> 00:24:42,570 E potrai anche qui a quel punto come per cambiare la sezione se la tua 502 00:24:42,570 --> 00:24:45,660 calendario ora è cambiato o il vostro livello di comfort è cambiata. 503 00:24:45,660 --> 00:24:49,380 Nel frattempo P-set e uno degli hacker si sono dovuto questo Giovedi con la possibilità di 504 00:24:49,380 --> 00:24:52,450 prorogare tale termine per il specifiche al Venerdì 505 00:24:52,450 --> 00:24:53,830 in un modo tipico. 506 00:24:53,830 --> 00:24:57,500 >> Rendetevi conto che incluso con il problema Specifiche set sono le istruzioni su 507 00:24:57,500 --> 00:25:02,770 come utilizzare l'apparecchio CS50, fare, così come alcuni CS50 strumenti specifici 508 00:25:02,770 --> 00:25:06,540 come stile 50, che può fornire con retroazione dinamicamente sulla 509 00:25:06,540 --> 00:25:10,230 qualità del tuo stile di codice e anche controllare 50, che può fornire con 510 00:25:10,230 --> 00:25:13,160 feedback dinamico per il vostro la correttezza del codice. 511 00:25:13,160 --> 00:25:16,850 Perdoniamo che stiamo ancora aggiustando fuori alcuni intoppi con controllo 50. 512 00:25:16,850 --> 00:25:21,490 Alcuni dei tuoi compagni di classe che hanno iniziato la intorno 04:00 il Venerdì sera quando 513 00:25:21,490 --> 00:25:25,130 la spec è salito notato da allora alcuni bug che stiamo lavorando 514 00:25:25,130 --> 00:25:29,010 attraverso, e le scuse per tutti coloro che ha sperimentato frustrazioni inutili. 515 00:25:29,010 --> 00:25:30,340 La colpa è mia. 516 00:25:30,340 --> 00:25:34,080 Ma noi seguiremo sulla CS50 discutere quando che viene risolto. 517 00:25:34,080 --> 00:25:35,700 >> Così una parola sui punteggi stessi. 518 00:25:35,700 --> 00:25:38,990 Quindi sarà una settimana o due prima di iniziare a ottenere un feedback sul set problema 519 00:25:38,990 --> 00:25:40,640 perché voi non avete ancora un compagno di insegnamento. 520 00:25:40,640 --> 00:25:44,510 E anche allora, inizieremo a valutare il problema C imposta prima di 521 00:25:44,510 --> 00:25:46,970 tornare indietro e valutare graffio così che si ottiene più rilevanti 522 00:25:46,970 --> 00:25:48,150 feedback più velocemente. 523 00:25:48,150 --> 00:25:51,870 Ma, in generale, per il programma, CS50 insiemi di problemi vengono valutati lungo l' 524 00:25:51,870 --> 00:25:53,580 dopo quattro assi - 525 00:25:53,580 --> 00:25:55,760 campo di applicazione, la correttezza, il design e lo stile. 526 00:25:55,760 --> 00:25:59,210 >> Ambito di applicazione sta per essere un numero in genere tra zero e cinque che 527 00:25:59,210 --> 00:26:01,830 cattura la quantità di pezzo che si è staccato. 528 00:26:01,830 --> 00:26:03,750 In genere, si desidera che questo sia cinque. 529 00:26:03,750 --> 00:26:05,300 È almeno provato di tutto. 530 00:26:05,300 --> 00:26:09,330 E notate che è un fattore moltiplicativo facendo in modo che solo una parte del 531 00:26:09,330 --> 00:26:12,520 problema insieme non è la strategia migliore. 532 00:26:12,520 --> 00:26:15,610 >> Nel frattempo, più evidente è la importanza della correttezza - 533 00:26:15,610 --> 00:26:18,620 solo è il vostro programma corretto con rispettare le specifiche? 534 00:26:18,620 --> 00:26:21,510 Questo è ponderato volutamente più pesantemente rispetto agli altri due assi di una 535 00:26:21,510 --> 00:26:24,450 fattore tre perché riconosciamo che in genere si sta andando a trascorrere un 536 00:26:24,450 --> 00:26:28,600 molto più tempo a inseguire alcuni bug, ottenere il vostro codice funzioni, allora si 537 00:26:28,600 --> 00:26:31,540 sono i rientri e scegliendo appropriati nomi di variabili e le 538 00:26:31,540 --> 00:26:33,800 simile, pari sull'altra estremità dello spettro di stile. 539 00:26:33,800 --> 00:26:36,160 >> Questo non vuol dire che lo stile non è importante, e noi predichiamo sopra 540 00:26:36,160 --> 00:26:37,920 tempo sia in lezioni frontali e in sezioni. 541 00:26:37,920 --> 00:26:40,520 Stile riferisce all'estetica del codice. 542 00:26:40,520 --> 00:26:43,980 Avete scelto bene con nomi variabili che sono brevi, ma un po ' 543 00:26:43,980 --> 00:26:44,680 descrittivo? 544 00:26:44,680 --> 00:26:47,840 Il vostro codice indentato come si è visto in lezione e in modo coerente 545 00:26:47,840 --> 00:26:49,070 con stile 50? 546 00:26:49,070 --> 00:26:51,220 >> Infine è giusto disegno lì in mezzo. 547 00:26:51,220 --> 00:26:54,090 Il design è il più difficile quello di mettere un dito sul perché è molto più 548 00:26:54,090 --> 00:26:55,000 soggettiva. 549 00:26:55,000 --> 00:26:58,610 Ma è forse il più importante dei i tre assi in termini di pedagogia 550 00:26:58,610 --> 00:27:02,050 valore nel tempo e che questo sarà opportunità l'insegnamento del compagno di 551 00:27:02,050 --> 00:27:04,110 fornirvi un feedback qualitativo. 552 00:27:04,110 --> 00:27:08,100 Infatti, in CS50 anche se noi abbiamo queste formule e punteggi, alla fine 553 00:27:08,100 --> 00:27:11,350 del giorno questi sono molto deliberatamente molto piccoli secchi - valori in virgola 554 00:27:11,350 --> 00:27:13,460 tra zero e tre e zero e cinque. 555 00:27:13,460 --> 00:27:17,800 Noi non cerchiamo di tracciare linee molto grossolane tra le serie problematiche o tra 556 00:27:17,800 --> 00:27:21,490 studenti, ma piuttosto concentrarsi quanto più possiamo su qualitativa, longhand 557 00:27:21,490 --> 00:27:25,490 retroazione, sia dattiloscritta o verbale da il vostro particolare insegnamento compagni, 558 00:27:25,490 --> 00:27:27,050 si arriva a conoscere abbastanza bene. 559 00:27:27,050 --> 00:27:32,340 >> Ma in generale, quelli sono i pesi che i vari assi avranno. 560 00:27:32,340 --> 00:27:35,480 Nel frattempo, anche, vale la pena tenere in dispiace che non si deve presumere che un 561 00:27:35,480 --> 00:27:38,870 tre su cinque è un 60% e quindi circa fallendo. 562 00:27:38,870 --> 00:27:41,410 Tre è volutamente pensata per essere sorta di mezzo alla strada buona. 563 00:27:41,410 --> 00:27:43,480 Se stai ricevendo tre a tre al inizio del semestre, che è 564 00:27:43,480 --> 00:27:46,340 anzi vuole essere un buon posto per iniziare. 565 00:27:46,340 --> 00:27:50,510 Se stai ricevendo due, fiere, c'è sicuramente un po 'di lavoro a pagare un po' di 566 00:27:50,510 --> 00:27:53,250 più attenzione, per sfruttare delle sezioni e delle ore di ufficio. 567 00:27:53,250 --> 00:27:54,590 >> Se stai ricevendo quattro zampe e cinque, grande. 568 00:27:54,590 --> 00:27:57,430 Ma davvero, speriamo di vedere traiettorie tra gli studenti - molto 569 00:27:57,430 --> 00:28:00,575 individualizzato per ogni studente, ma a partire il semestre qui in una sorta di 570 00:28:00,575 --> 00:28:04,100 i due a tre serie, ma che termina qui in 4-5 gamma. 571 00:28:04,100 --> 00:28:05,440 Questo è quello che stiamo realmente cercando. 572 00:28:05,440 --> 00:28:09,590 E noi continuiamo a mente il delta che si esibiscono tra settimana zero e settimana 573 00:28:09,590 --> 00:28:12,170 12 quando sto facendo gradi. 574 00:28:12,170 --> 00:28:16,380 Non importa a noi assolutamente come è giusto all'inizio se il vostro 575 00:28:16,380 --> 00:28:19,330 traiettoria è infatti verso l'alto e forte. 576 00:28:19,330 --> 00:28:24,000 >> Onestà Accademico - così mi permetta di mettere sul mio la voce più grave per un momento. 577 00:28:24,000 --> 00:28:28,510 Quindi, questo corso ha la particolarità di l'invio di più gli studenti di qualsiasi altra 578 00:28:28,510 --> 00:28:30,950 nella storia alla scheda annuncio, credo. 579 00:28:30,950 --> 00:28:34,220 Abbiamo sorta di conteggio perso in questo punto di quanto spesso questo accade. 580 00:28:34,220 --> 00:28:37,090 E questo non perché gli studenti in 50 sono più disonesti di loro 581 00:28:37,090 --> 00:28:38,690 compagni di classe altrove. 582 00:28:38,690 --> 00:28:42,800 Ma si rende conto anche che siamo molto buono a individuare questo genere di cose. 583 00:28:42,800 --> 00:28:45,920 >> E che è il vantaggio che un classe di informatica ha in che 584 00:28:45,920 --> 00:28:49,110 possiamo e facciamo confrontare tutti gli studenti problema di imposta a coppie contro ogni 585 00:28:49,110 --> 00:28:51,470 altre, non solo quest'anno ma tutti gli anni precedenti. 586 00:28:51,470 --> 00:28:55,080 Abbiamo la capacità, come gli studenti di la classe, di Google e di trovare il codice 587 00:28:55,080 --> 00:28:57,440 su siti come github e forum di discussione. 588 00:28:57,440 --> 00:29:00,840 Non ci sono assolutamente le soluzioni ai CS50 di p-imposta galleggianti intorno là. 589 00:29:00,840 --> 00:29:02,710 Ma se riesci a trovarli, siamo in grado di trovarli. 590 00:29:02,710 --> 00:29:07,130 E tutto questo è molto automatizzato e facile e triste per noi trovare. 591 00:29:07,130 --> 00:29:10,990 >> Ma voglio sottolineare, inoltre, che il politica onestà accademica del corso è 592 00:29:10,990 --> 00:29:13,960 molto vuole essere molto l'opposto di quello spirito. 593 00:29:13,960 --> 00:29:17,506 Infatti, quest'anno abbiamo riformulato le cose nel piano di studi per essere tale, dot 594 00:29:17,506 --> 00:29:19,790 punto punto, con più dettagli nel programma. 595 00:29:19,790 --> 00:29:22,860 Ma il tema generale del corso è davvero di essere ragionevole. 596 00:29:22,860 --> 00:29:26,160 Ci rendiamo conto che vi è una significativa quantità di pedagogico 597 00:29:26,160 --> 00:29:30,550 valore a collaborare, in qualche misura, con i compagni di classe, per cui si 598 00:29:30,550 --> 00:29:33,700 due o tre o più sei in piedi a un bordo bianco 599 00:29:33,700 --> 00:29:35,670 lavagna, in modo da parlare, le tue idee - 600 00:29:35,670 --> 00:29:39,480 scrivendo pseudocodice in immagini, Diagrammi che cosa dovrebbe essere, se Mario 601 00:29:39,480 --> 00:29:41,350 eri di scriverlo prima in pseudocodice. 602 00:29:41,350 --> 00:29:43,240 Quale dovrebbe essere l'algoritmo greedy - 603 00:29:43,240 --> 00:29:46,100 come dovrebbe comportarsi per problema di imposta uno? 604 00:29:46,100 --> 00:29:50,440 >> E così rendersi conto che il comportamento che noi incoraggiamo è molto 605 00:29:50,440 --> 00:29:51,470 molto lungo queste linee. 606 00:29:51,470 --> 00:29:53,890 E nel programma, vedrete un mucchio di proiettili sotto un 607 00:29:53,890 --> 00:29:57,740 categoria ragionevole e un non ragionevole categoria che ci aiuta aiutiamo 608 00:29:57,740 --> 00:30:00,740 di avvolgere la vostra mente intorno a dove noi traiamo quella linea. 609 00:30:00,740 --> 00:30:04,340 E, in generale, una regola empirica discreta è che se si sta lottando per risolvere 610 00:30:04,340 --> 00:30:07,990 alcuni bug e il tuo amico o un compagno di classe è seduto accanto a te, è 611 00:30:07,990 --> 00:30:11,530 ragionevole per voi di mostrare lui o lei il codice e dire, ehi, potete aiutare 612 00:30:11,530 --> 00:30:13,700 a capire cosa c'è di sbagliato qui? 613 00:30:13,700 --> 00:30:17,110 >> Noi in genere non abbracciamo il lato opposto. 614 00:30:17,110 --> 00:30:20,730 Non è una risposta corretta per il amico o un compagno di classe qui a dire, oh, 615 00:30:20,730 --> 00:30:22,510 basta guardare la mia e la figura fuori da questo. 616 00:30:22,510 --> 00:30:24,400 Questa è una sorta di irragionevole. 617 00:30:24,400 --> 00:30:27,750 Ma avere qualcun altro, un altro cervello, un altro paio di occhi guardano 618 00:30:27,750 --> 00:30:31,620 lo schermo o leggere il codice e dire, sei sicuro che vuoi 619 00:30:31,620 --> 00:30:32,760 di avere un ciclo qui? 620 00:30:32,760 --> 00:30:34,800 O siete sicuri di voler che punto e virgola qui? 621 00:30:34,800 --> 00:30:37,090 O oh, che messaggio di errore significa questo. 622 00:30:37,090 --> 00:30:39,580 Quelli sono molto ragionevole e comportamenti incoraggiato. 623 00:30:39,580 --> 00:30:44,010 >> I casi in cui stavo alludendo al prima bollire fino a quando gli studenti sono 624 00:30:44,010 --> 00:30:47,350 a tarda notte rendendo scarsa capacità di giudizio decisioni e emailing loro codice di 625 00:30:47,350 --> 00:30:50,130 qualcun altro o solo dicendo, qui, è in Dropbox o 626 00:30:50,130 --> 00:30:51,610 Googling a tarda notte. 627 00:30:51,610 --> 00:30:54,880 E quindi vorrei incoraggiare e prego, se non avete quelli inevitabile 628 00:30:54,880 --> 00:30:58,450 momenti di stress, si sta urtando contro la scadenza, non avete in ritardo 629 00:30:58,450 --> 00:31:01,490 giorno dal momento che è già Venerdì a quel punto, e-mail le teste del corso o 630 00:31:01,490 --> 00:31:02,330 me direttamente. 631 00:31:02,330 --> 00:31:04,790 Dire, ascoltare, sono al mio punto di rottura qui. 632 00:31:04,790 --> 00:31:06,660 Facciamo una conversazione e capirlo. 633 00:31:06,660 --> 00:31:10,400 Ricorrere al web o qualche altro non comportamento ragionevole non è mai la 634 00:31:10,400 --> 00:31:13,070 soluzione, e anche molti dei vostri compagni di classe non sono più qui su 635 00:31:13,070 --> 00:31:15,150 campus a causa di tale scarsa capacità di giudizio. 636 00:31:15,150 --> 00:31:17,840 Ma è molto facile da aggirare quella linea. 637 00:31:17,840 --> 00:31:22,950 >> Ed ecco un po 'di foto per allietare up da Reddit così che ora 638 00:31:22,950 --> 00:31:25,720 tutto sarà OK. 639 00:31:25,720 --> 00:31:30,210 >> Quindi un breve riepilogo, quindi, di dove avevamo lasciato. 640 00:31:30,210 --> 00:31:33,690 Così la scorsa settimana, ricordiamo che introduciamo condizioni, non nella Scratch 641 00:31:33,690 --> 00:31:34,880 ma in C questa volta. 642 00:31:34,880 --> 00:31:38,300 E c'era qualche nuova sintassi, ma davvero non nuove idee per se. 643 00:31:38,300 --> 00:31:42,630 Abbiamo avuto espressioni booleane che potremmo o insieme a due verticali 644 00:31:42,630 --> 00:31:46,490 barre o e massimo e di due e commerciali, dicendo che sia la sinistra 645 00:31:46,490 --> 00:31:49,990 e il diritto deve essere vero per questo da eseguire. 646 00:31:49,990 --> 00:31:53,150 Poi abbiamo avuto interruttori, che abbiamo guardato a breve, ma vi propongo sono davvero 647 00:31:53,150 --> 00:31:56,830 appena sintassi diversa per raggiungere l' stesso tipo di obiettivo se si sa in 648 00:31:56,830 --> 00:31:59,270 anticipo che cosa i vostri casi stanno per essere. 649 00:31:59,270 --> 00:32:00,160 >> Abbiamo preso in loop. 650 00:32:00,160 --> 00:32:03,340 Un ciclo for è forse il più comune, o almeno quello che la gente 651 00:32:03,340 --> 00:32:05,330 tipicamente raggiungere per istinto. 652 00:32:05,330 --> 00:32:08,240 Anche se sembra un po 'criptico, vedrete molti, molti esempi di questo 653 00:32:08,240 --> 00:32:11,590 In poco tempo, come avete già alla fine della scorsa settimana. 654 00:32:11,590 --> 00:32:14,280 Mentre cicli possono simile ottenere la stessa cosa. 655 00:32:14,280 --> 00:32:17,550 Ma se si vuole fare qualsiasi Incremento o aggiornamento di 656 00:32:17,550 --> 00:32:20,230 valori di variabili, si deve farlo più manualmente rispetto alla 657 00:32:20,230 --> 00:32:22,440 per il ciclo prima permette. 658 00:32:22,440 --> 00:32:25,310 E poi c'è il ciclo do-while, che ci permette di fare qualcosa di a 659 00:32:25,310 --> 00:32:28,460 almeno una volta, mentre qualcosa il resto è vero. 660 00:32:28,460 --> 00:32:31,550 E questo è particolarmente buono per programmi o per i giochi in cui si desidera 661 00:32:31,550 --> 00:32:33,810 per richiedere all'utente di qualcosa almeno una volta. 662 00:32:33,810 --> 00:32:37,110 E poi, se lui o lei non collabora, si potrebbe desiderare di farlo 663 00:32:37,110 --> 00:32:38,420 ancora e ancora. 664 00:32:38,420 --> 00:32:41,270 >> Con le variabili, nel frattempo, abbiamo avuto le linee di codice come questo, che potrebbe 665 00:32:41,270 --> 00:32:41,950 essere due linee. 666 00:32:41,950 --> 00:32:44,830 Si potrebbe dichiarare un int chiamato contatore, punto e virgola. 667 00:32:44,830 --> 00:32:47,660 Oppure si può semplicemente dichiarare e definirlo, per così dire. 668 00:32:47,660 --> 00:32:49,950 Dare un valore al tempo stesso. 669 00:32:49,950 --> 00:32:51,890 >> E poi, infine, abbiamo parlato sulle funzioni. 670 00:32:51,890 --> 00:32:54,270 E questo è stato un bel esempio in senso che illustra 671 00:32:54,270 --> 00:32:55,840 due tipi di funzioni. 672 00:32:55,840 --> 00:32:59,030 Uno è GetString (), che, di nuovo, Ottiene una stringa da parte dell'utente. 673 00:32:59,030 --> 00:33:02,040 Ma GetString () è una specie di interessante, misura in cui abbiamo usato, 674 00:33:02,040 --> 00:33:05,620 perché abbiamo sempre usato con qualcosa sul lato sinistro di un 675 00:33:05,620 --> 00:33:06,600 segno di uguale. 676 00:33:06,600 --> 00:33:09,830 Vale a dire che GetString () restituisce un valore. 677 00:33:09,830 --> 00:33:11,970 Si ritorna, ovviamente, di una stringa. 678 00:33:11,970 --> 00:33:15,130 E poi sul lato sinistro, che siamo semplicemente salvare quella stringa all'interno di un 679 00:33:15,130 --> 00:33:16,580 variabile chiamata nome. 680 00:33:16,580 --> 00:33:21,100 >> Questo è diverso, in un certo senso, da printf printf perché, almeno nel nostro 681 00:33:21,100 --> 00:33:23,540 utilizzo qui, non restituisce nulla. 682 00:33:23,540 --> 00:33:24,960 Per inciso, lo fa ritorno qualcosa. 683 00:33:24,960 --> 00:33:26,380 Noi semplicemente non importa quello che è. 684 00:33:26,380 --> 00:33:29,090 Ma ha ciò che è chiamato un effetto collaterale. 685 00:33:29,090 --> 00:33:31,840 E che cosa è che effetto collaterale in ogni caso che abbiamo visto fino ad ora? 686 00:33:31,840 --> 00:33:34,720 Cosa significa printf fare? 687 00:33:34,720 --> 00:33:37,780 Esso stampa qualcosa sullo schermo, display di testo o numeri o qualcosa 688 00:33:37,780 --> 00:33:38,380 sullo schermo. 689 00:33:38,380 --> 00:33:41,170 E questo è solo considerato un effetto collaterale perché non è davvero consegnando 690 00:33:41,170 --> 00:33:41,900 di nuovo a me. 691 00:33:41,900 --> 00:33:44,770 Non è una risposta all'interno di una scatola nera che posso poi 692 00:33:44,770 --> 00:33:46,130 raggiungere in e afferrare. 693 00:33:46,130 --> 00:33:49,160 E 'solo farlo da solo, tanto come Colton è stato collegato a questa 694 00:33:49,160 --> 00:33:52,560 scatola nera la scorsa settimana, e lui in qualche modo magicamente è stato disegnare sulla lavagna 695 00:33:52,560 --> 00:33:54,500 senza di me effettivamente coinvolti. 696 00:33:54,500 --> 00:33:55,560 Questo sarebbe un effetto collaterale. 697 00:33:55,560 --> 00:33:59,100 Ma se in realtà ho dovuto raggiungere nel qui e dire, oh, qui è la stringa 698 00:33:59,100 --> 00:34:02,040 da parte dell'utente, che avrebbe essere un valore di ritorno. 699 00:34:02,040 --> 00:34:05,650 >> E finora abbiamo usato solo le funzioni che altre persone hanno scritto. 700 00:34:05,650 --> 00:34:09,219 Ma possiamo davvero fare queste tipo di cose noi stessi. 701 00:34:09,219 --> 00:34:12,730 Quindi ho intenzione di andare in CS50 apparecchio nuovo. 702 00:34:12,730 --> 00:34:16,020 Permettetemi di chiudere la scheda che abbiamo aveva aperto un momento fa. 703 00:34:16,020 --> 00:34:18,530 E mi permetta di andare avanti e di creare un nuovo file. 704 00:34:18,530 --> 00:34:22,400 E ho intenzione di andare avanti e chiamare questo positive.c. 705 00:34:22,400 --> 00:34:24,770 Quindi voglio fare qualcosa con numeri positivi qui. 706 00:34:24,770 --> 00:34:27,219 Quindi ho intenzione di andare avanti e fare int - 707 00:34:27,219 --> 00:34:28,000 mi dispiace - 708 00:34:28,000 --> 00:34:31,840 # Include. 709 00:34:31,840 --> 00:34:34,280 Non facciamo lo stesso errore come prima. 710 00:34:34,280 --> 00:34:40,020 Int main (), aperto ricci parentesi, chiusa parentesi graffa. 711 00:34:40,020 --> 00:34:41,639 >> E ora voglio fare la seguente. 712 00:34:41,639 --> 00:34:44,600 Voglio scrivere un programma che insiste sul fatto che l'utente dà 713 00:34:44,600 --> 00:34:46,770 me un numero intero positivo. 714 00:34:46,770 --> 00:34:50,969 Quindi non vi è alcuna funzione GetPositiveInt nella biblioteca CS50. 715 00:34:50,969 --> 00:34:52,610 C'è solo GetInt (). 716 00:34:52,610 --> 00:34:55,790 Ma va bene così perché ho la costrutti con cui posso imporre un 717 00:34:55,790 --> 00:34:59,360 poco più vincolo su quel valore. 718 00:34:59,360 --> 00:35:00,990 Avrei potuto fare qualcosa di simile. 719 00:35:00,990 --> 00:35:02,780 >> Quindi, int n - 720 00:35:02,780 --> 00:35:04,920 e se si sta digitando lungo, basta rendersi conto Ho intenzione di tornare indietro e 721 00:35:04,920 --> 00:35:06,430 cambiare alcune cose in un momento - 722 00:35:06,430 --> 00:35:09,960 così int n equivale GetInt (). 723 00:35:09,960 --> 00:35:11,780 E che sta per mettere un int all'interno di n. 724 00:35:11,780 --> 00:35:13,830 E mi permetta di essere un più descrittivo. 725 00:35:13,830 --> 00:35:23,270 Permettetemi di dire una cosa del genere esigo che mi date un numero intero positivo. 726 00:35:23,270 --> 00:35:23,550 >> D'accordo. 727 00:35:23,550 --> 00:35:25,250 Quindi, solo un po 'di istruzioni. 728 00:35:25,250 --> 00:35:26,270 E ora che cosa posso fare? 729 00:35:26,270 --> 00:35:29,840 Beh, so già dalla mia semplice condizioni o rami, proprio come ho 730 00:35:29,840 --> 00:35:36,100 aveva in Scratch, potrei dire qualcosa come se n è minore o uguale a 731 00:35:36,100 --> 00:35:44,460 pari a zero, quindi voglio fare qualcosa piace, che non è positivo. 732 00:35:44,460 --> 00:35:45,560 E poi ho potuto fare - 733 00:35:45,560 --> 00:35:47,310 OK, ma voglio davvero ottenere che int. 734 00:35:47,310 --> 00:35:52,020 Così ho potuto salire qui e potrei genere copia di questa e trattino questo. 735 00:35:52,020 --> 00:35:52,570 E poi, OK. 736 00:35:52,570 --> 00:35:56,990 Quindi se n è minore o uguale a zero farlo. 737 00:35:56,990 --> 00:35:58,900 >> Ora, cosa succede se l'utente non collabora? 738 00:35:58,900 --> 00:36:01,560 Bene, allora io vado a prendere in prestito questo qui. 739 00:36:01,560 --> 00:36:03,130 E poi vado in qui e qui e qui. 740 00:36:03,130 --> 00:36:06,420 Quindi questo non è chiaramente la soluzione, giusto? 741 00:36:06,420 --> 00:36:07,810 Perché non c'è fine in vista. 742 00:36:07,810 --> 00:36:13,100 Se voglio chiedere che l'utente dà me un numero intero positivo, posso 743 00:36:13,100 --> 00:36:14,150 effettivamente ottenere l'int. 744 00:36:14,150 --> 00:36:15,620 Posso quindi verificare che int. 745 00:36:15,620 --> 00:36:18,570 Ma poi voglio controllare di nuovo e controllare di nuovo e controllare di nuovo. 746 00:36:18,570 --> 00:36:21,680 Così, ovviamente, che cosa è il migliore costruire da usare qui? 747 00:36:21,680 --> 00:36:22,840 Va bene, quindi una sorta di loop. 748 00:36:22,840 --> 00:36:25,430 >> Quindi ho intenzione di sbarazzarsi di quasi tutta questa. 749 00:36:25,430 --> 00:36:27,320 E voglio ottenere questo int almeno una volta. 750 00:36:27,320 --> 00:36:28,890 Quindi ho intenzione di dire che fare - 751 00:36:28,890 --> 00:36:32,110 e tornerò alla mentre in un attimo - 752 00:36:32,110 --> 00:36:33,050 ora, che fare? 753 00:36:33,050 --> 00:36:35,860 Io vado a fare int n ottiene GetInt (). 754 00:36:35,860 --> 00:36:36,080 OK. 755 00:36:36,080 --> 00:36:37,250 Così che è abbastanza buono. 756 00:36:37,250 --> 00:36:39,750 E ora quanto spesso fare Io voglio fare questo? 757 00:36:39,750 --> 00:36:45,770 >> Mettiamola la printf all'interno del loop così posso chiedere ancora e ancora, 758 00:36:45,770 --> 00:36:46,740 se necessario. 759 00:36:46,740 --> 00:36:49,720 E che cosa voglio questo mentre la condizione di fare? 760 00:36:49,720 --> 00:36:53,870 Voglio continuare a fare questo mentre ciò che è il caso? 761 00:36:53,870 --> 00:36:54,125 Già. 762 00:36:54,125 --> 00:36:55,390 N è minore o uguale a zero. 763 00:36:55,390 --> 00:36:58,180 Così già, abbiamo significativamente ripulito questo codice su. 764 00:36:58,180 --> 00:37:00,700 Abbiamo preso in prestito un semplice costrutto - il ciclo do-while. 765 00:37:00,700 --> 00:37:04,690 Ho rubato solo le linee più importanti di codice che ho iniziato la copia e 766 00:37:04,690 --> 00:37:05,960 incolla, che non era saggio. 767 00:37:05,960 --> 00:37:09,790 E così ora ho intenzione di incollare effettivamente qui dentro e basta farlo una volta. 768 00:37:09,790 --> 00:37:12,990 >> E ora che cosa voglio fare a alla fine di questo programma? 769 00:37:12,990 --> 00:37:16,810 Mi limiterò a dire qualcosa di semplice come, grazie per il - e 770 00:37:16,810 --> 00:37:18,980 Farò% i per int - 771 00:37:18,980 --> 00:37:23,270 backslash n, virgola, e quindi spina n, punto e virgola. 772 00:37:23,270 --> 00:37:23,910 >> D'accordo. 773 00:37:23,910 --> 00:37:27,290 Quindi vediamo cosa succede ora quando eseguo questo programma. 774 00:37:27,290 --> 00:37:30,600 Ho intenzione di andare avanti e facciamo in positivo. 775 00:37:30,600 --> 00:37:30,880 Dannazione. 776 00:37:30,880 --> 00:37:31,600 A pochi errori. 777 00:37:31,600 --> 00:37:32,960 Quindi, mi permetta di scorrere indietro fino alla prima. 778 00:37:32,960 --> 00:37:34,020 Non lavorare attraverso di loro indietro. 779 00:37:34,020 --> 00:37:37,000 Lavorare attraverso di loro dall'alto in basso per paura che a cascata e solo 780 00:37:37,000 --> 00:37:38,630 una cosa sia sbagliata. 781 00:37:38,630 --> 00:37:42,532 Dichiarazione implicita di funzione GetInt (). 782 00:37:42,532 --> 00:37:43,020 Già. 783 00:37:43,020 --> 00:37:44,420 Così non è stato sufficiente. 784 00:37:44,420 --> 00:37:46,760 I tipi di fatto lo stesso errore, ma un po 'diverso questa volta. 785 00:37:46,760 --> 00:37:51,940 Ho bisogno non solo di includere stdio.h ma anche cs50.h, che comprende la 786 00:37:51,940 --> 00:37:56,770 cosiddette dichiarazioni di ottenere int, che insegnare l'apparecchio, o insegna 787 00:37:56,770 --> 00:37:58,760 C quello GetInt () è. 788 00:37:58,760 --> 00:37:59,550 >> Così mi permetta di salvare nuovamente. 789 00:37:59,550 --> 00:38:02,040 Ho intenzione di ignorare gli altri errori perché sto andando a sperare che siano 790 00:38:02,040 --> 00:38:05,210 in qualche modo legati all'errore Ho già fissato. 791 00:38:05,210 --> 00:38:08,710 Quindi, mi permetta di andare avanti e ricompilare con fare positivo, Invio. 792 00:38:08,710 --> 00:38:09,020 Dannazione. 793 00:38:09,020 --> 00:38:09,985 Tre errori, ancora. 794 00:38:09,985 --> 00:38:12,650 Lasciate scorrere fino al primo. 795 00:38:12,650 --> 00:38:14,320 Inutilizzati n variabili. 796 00:38:14,320 --> 00:38:15,850 Noi non abbiamo visto questo prima. 797 00:38:15,850 --> 00:38:17,200 E anche questo è un po 'criptico. 798 00:38:17,200 --> 00:38:18,850 Questa è l'uscita del compilatore. 799 00:38:18,850 --> 00:38:23,610 E che quella linea evidenziata ci - positive.c :9:13 - 800 00:38:23,610 --> 00:38:28,960 sta dicendo che sta dicendo sulla linea dei nove positive.c, al 13 ° carattere, 801 00:38:28,960 --> 00:38:31,510 Colonna 13, è fatto questo errore. 802 00:38:31,510 --> 00:38:34,230 >> E in particolare, si sta dicendo Mi inutilizzato variabile n. 803 00:38:34,230 --> 00:38:35,790 Quindi cerchiamo di vedere - 804 00:38:35,790 --> 00:38:37,150 linea di nove. 805 00:38:37,150 --> 00:38:40,430 Sto utilizzando n, nel senso che Sto dando un valore. 806 00:38:40,430 --> 00:38:44,200 Ma quello che il compilatore non piace è che non mi sembra di utilizzarlo. 807 00:38:44,200 --> 00:38:45,560 Ma aspetta un attimo, io sto usando. 808 00:38:45,560 --> 00:38:48,170 In linea 11, lo sto usando qui. 809 00:38:48,170 --> 00:38:52,430 Ma se ho scorrere giù ulteriormente a positive.c :11 - 810 00:38:52,430 --> 00:38:56,230 così alla linea 11, carattere 12, la compilatore mi dice, uso di 811 00:38:56,230 --> 00:38:58,670 non dichiarato identificativo n. 812 00:38:58,670 --> 00:39:02,760 >> Significa così non dichiarati che ho non specificato come 813 00:39:02,760 --> 00:39:04,970 variabile con un tipo di dati. 814 00:39:04,970 --> 00:39:05,500 Ma aspettate un minuto. 815 00:39:05,500 --> 00:39:09,150 Ho fatto esattamente questo in linea di nove. 816 00:39:09,150 --> 00:39:11,100 Così qualcuno è davvero confuso qui. 817 00:39:11,100 --> 00:39:14,900 E 'o me o il compilatore perché in linea nove, ancora una volta, sto dichiarando un 818 00:39:14,900 --> 00:39:18,650 int n, e sto assegnando il valore di GetInt () ritorna. 819 00:39:18,650 --> 00:39:22,930 Poi sto usando la variabile n in linea 11 e controllando se il suo valore è minore 820 00:39:22,930 --> 00:39:24,050 o uguale a zero. 821 00:39:24,050 --> 00:39:27,430 Ma a quanto pare questo è cattivo e rotti perché? 822 00:39:27,430 --> 00:39:30,630 823 00:39:30,630 --> 00:39:32,490 Dire di nuovo? 824 00:39:32,490 --> 00:39:35,690 >> Ah, devo dichiarare n prima entrare nel ciclo. 825 00:39:35,690 --> 00:39:36,370 Ma perché? 826 00:39:36,370 --> 00:39:39,830 Voglio dire, abbiamo appena proposto un po 'fa che va bene per dichiarare le variabili 827 00:39:39,830 --> 00:39:43,600 tutto su una riga e poi assegnare loro un certo valore. 828 00:39:43,600 --> 00:39:46,790 Una variabile globale - torniamo di questa idea in un attimo. 829 00:39:46,790 --> 00:39:48,690 Perché vuoi che metta essa all'esterno del ciclo? 830 00:39:48,690 --> 00:40:03,170 831 00:40:03,170 --> 00:40:03,830 È. 832 00:40:03,830 --> 00:40:06,780 Esattamente. 833 00:40:06,780 --> 00:40:09,610 >> Quindi, anche se, in qualche modo controintuitivo, vorrei riassumere. 834 00:40:09,610 --> 00:40:13,510 Quando si dichiara n dentro del blocco fare lì - 835 00:40:13,510 --> 00:40:16,320 specificamente all'interno quelle parentesi graffe - 836 00:40:16,320 --> 00:40:19,210 che la variabile n è ciò che è chiamato un ambito - 837 00:40:19,210 --> 00:40:23,210 estranei al nostro sistema di punteggio nella naturalmente - ma ha una portata che è 838 00:40:23,210 --> 00:40:25,190 limitate alle parentesi graffe. 839 00:40:25,190 --> 00:40:28,460 In altre parole, in genere se si dichiara una variabile all'interno di un insieme di 840 00:40:28,460 --> 00:40:33,370 parentesi graffe, che la variabile esiste solo all'interno di queste parentesi graffe. 841 00:40:33,370 --> 00:40:37,320 Così da questa logica da solo, anche se Ho dichiarato n in linea nove, si 842 00:40:37,320 --> 00:40:41,910 scompare essenzialmente dal campo di applicazione, scompare dalla memoria, per così dire, 843 00:40:41,910 --> 00:40:43,370 per il momento mi ha colpito la linea 11. 844 00:40:43,370 --> 00:40:47,370 Perché la linea 11, purtroppo, è al di fuori di quelle parentesi graffe. 845 00:40:47,370 --> 00:40:51,540 >> Quindi io purtroppo non riesco a risolvere questo problema tornando a quello che ho fatto prima. 846 00:40:51,540 --> 00:40:53,370 Si potrebbe a prima fare questo. 847 00:40:53,370 --> 00:40:56,370 Ma quello che sei ora non facendo ciclicamente? 848 00:40:56,370 --> 00:40:58,260 Lei non è, ovviamente, ottenendo l'int ciclicamente. 849 00:40:58,260 --> 00:41:01,320 Così siamo in grado di lasciare il GetInt (), e noi dovrebbe lasciare la GetInt () all'interno 850 00:41:01,320 --> 00:41:04,420 ciclo perché è quello che vogliamo tormentare l'utente di nuovo e di nuovo. 851 00:41:04,420 --> 00:41:08,660 Ma lo fa basta andare fino alla linea, diciamo, sei. 852 00:41:08,660 --> 00:41:10,150 Int n, punto e virgola. 853 00:41:10,150 --> 00:41:12,990 Non dare un valore ancora perché non solo ancora bisogno di. 854 00:41:12,990 --> 00:41:16,220 >> Ma ora qui, gara - questa sarebbe un errore molto facile. 855 00:41:16,220 --> 00:41:19,440 Io non voglio nascondere il mio precedente dichiarazione di n. 856 00:41:19,440 --> 00:41:22,830 Voglio usare la n che in realtà esiste. 857 00:41:22,830 --> 00:41:25,780 E così ora nella riga 10, Assegno n a valore. 858 00:41:25,780 --> 00:41:28,580 Ma in linea di sei, dichiaro n. 859 00:41:28,580 --> 00:41:32,940 E così posso o non posso fare il utilizzarlo in linea 12 adesso? 860 00:41:32,940 --> 00:41:37,120 Posso perché tra cui ricci parentesi graffe è n dichiarata adesso? 861 00:41:37,120 --> 00:41:38,770 Quello qui sulla linea cinque. 862 00:41:38,770 --> 00:41:40,330 Per uno qui sulla linea 14. 863 00:41:40,330 --> 00:41:49,770 Quindi, se ora io lo zoom indietro, salvare il file, andare eseguire in e eseguire make positivo, 864 00:41:49,770 --> 00:41:50,820 compilato questa volta. 865 00:41:50,820 --> 00:41:51,940 Ecco, questo è già un progresso. 866 00:41:51,940 --> 00:41:53,640 Slash. . / Positivo, Enter. 867 00:41:53,640 --> 00:41:56,060 >> Esigo che mi date un numero intero positivo. 868 00:41:56,060 --> 00:41:57,750 Negativa 1. 869 00:41:57,750 --> 00:41:59,020 Negativo 2. 870 00:41:59,020 --> 00:42:00,680 Negativo 3. 871 00:42:00,680 --> 00:42:01,760 Zero. 872 00:42:01,760 --> 00:42:03,000 Uno. 873 00:42:03,000 --> 00:42:05,130 E grazie per quello che è ciò che è ora stampata. 874 00:42:05,130 --> 00:42:07,400 >> Fammi provare qualcosa di diverso, per curiosità. 875 00:42:07,400 --> 00:42:09,600 Mi viene detto di inserire un numero intero. 876 00:42:09,600 --> 00:42:12,870 Ma cosa succede se io invece digito in agnello? 877 00:42:12,870 --> 00:42:14,460 Quindi, è ora vedere un prompt diverso - 878 00:42:14,460 --> 00:42:15,350 riprovare. 879 00:42:15,350 --> 00:42:17,670 Ma da nessuna parte nel mio codice ho scritto riprovare. 880 00:42:17,670 --> 00:42:22,320 Allora, dove, presumibilmente, è questo tentativo prompt dei venendo da, diresti? 881 00:42:22,320 --> 00:42:23,540 Sì, da GetInt () stessa. 882 00:42:23,540 --> 00:42:26,650 Quindi, una delle cose che lo staff di CS50 fa per voi, almeno in questi primi 883 00:42:26,650 --> 00:42:30,400 settimane, è che abbiamo scritto una certa quantità di controllo di errore per garantire che, se 884 00:42:30,400 --> 00:42:34,260 si chiama GetInt (), vi sarà almeno tornare un int da parte dell'utente. 885 00:42:34,260 --> 00:42:35,460 Non si ottiene una stringa. 886 00:42:35,460 --> 00:42:36,440 Non si ottiene un char. 887 00:42:36,440 --> 00:42:39,660 Non si ottiene qualcosa un'altra cosa. 888 00:42:39,660 --> 00:42:40,510 Otterrete un int. 889 00:42:40,510 --> 00:42:41,890 >> Ora, potrebbe non essere positivo. 890 00:42:41,890 --> 00:42:42,770 Potrebbe non essere negativo. 891 00:42:42,770 --> 00:42:44,550 Non facciamo garanzie intorno a quello. 892 00:42:44,550 --> 00:42:48,960 Ma noi tormentare l'utente a riprovare, riprovare, riprovare fino a quando lui o lei in realtà 893 00:42:48,960 --> 00:42:49,810 collabora. 894 00:42:49,810 --> 00:42:53,085 Allo stesso modo, se faccio 1.23, questo non è un int. 895 00:42:53,085 --> 00:42:58,400 Ma se io digito, per esempio, 50, che mi dà un valore che volevo. 896 00:42:58,400 --> 00:42:59,050 >> D'accordo. 897 00:42:59,050 --> 00:43:01,380 Quindi, non è male. 898 00:43:01,380 --> 00:43:04,780 Tutte le domande su ciò che abbiamo appena fatto? 899 00:43:04,780 --> 00:43:07,930 Il takeaway chiave è, per essere chiari, non tanto il ciclo, che abbiamo visto 900 00:43:07,930 --> 00:43:10,880 prima anche se non abbiamo davvero usato, ma la questione del campo di applicazione, dove 901 00:43:10,880 --> 00:43:17,045 variabili possono essere possono essere utilizzati solo solo entro un certo ambito specificato. 902 00:43:17,045 --> 00:43:19,830 >> Bene, vorrei affrontare il suggerimento hai fatto prima, quella di una 903 00:43:19,830 --> 00:43:20,860 variabile globale. 904 00:43:20,860 --> 00:43:24,880 Per inciso, si scopre che un altro soluzione a questo problema, ma 905 00:43:24,880 --> 00:43:28,880 tipicamente una soluzione corretta o una soluzione mal progettato, è quello 906 00:43:28,880 --> 00:43:31,670 dichiarare la variabile come ciò che è chiamato una variabile globale. 907 00:43:31,670 --> 00:43:34,610 Ora, io sono una specie di violare la mia definizione di portata, perché ci sono 908 00:43:34,610 --> 00:43:37,680 nessuna parentesi graffa al vertice e la parte inferiore di un file. 909 00:43:37,680 --> 00:43:40,190 Ma l'implicazione di tale è che ora in linea a quattro, 910 00:43:40,190 --> 00:43:41,710 n è una variabile globale. 911 00:43:41,710 --> 00:43:44,460 E come dice il nome, è solo accessibile ovunque. 912 00:43:44,460 --> 00:43:45,790 >> Scratch ha in realtà questi. 913 00:43:45,790 --> 00:43:48,650 Se è stato utilizzato una variabile, si potrebbe ricordare si doveva scegliere se è per 914 00:43:48,650 --> 00:43:50,780 questo sprite o per tutti gli sprite. 915 00:43:50,780 --> 00:43:54,270 Beh, tutti gli sprite è solo il più chiaro modo di dire globale. 916 00:43:54,270 --> 00:43:55,520 Sì? 917 00:43:55,520 --> 00:44:09,690 918 00:44:09,690 --> 00:44:10,990 Ah, bella domanda. 919 00:44:10,990 --> 00:44:14,310 >> Quindi, ricordare che nella prima versione del mio codice, quando non correttamente 920 00:44:14,310 --> 00:44:17,700 n dichiarati e definiti in linea nove - 921 00:44:17,700 --> 00:44:19,980 Ho dichiarato come una variabile e ho dato un valore con 922 00:44:19,980 --> 00:44:21,160 l'operatore di assegnazione - 923 00:44:21,160 --> 00:44:22,520 questo mi ha dato due errori. 924 00:44:22,520 --> 00:44:26,560 Uno, il fatto che n non è stato utilizzato, e due, che in linea 11 925 00:44:26,560 --> 00:44:27,770 semplicemente non è stato dichiarato. 926 00:44:27,770 --> 00:44:31,120 Quindi, il primo non l'ho fatto indirizzo al momento. 927 00:44:31,120 --> 00:44:35,130 Non è strettamente un errore di dichiarare una variabile ma non usarlo. 928 00:44:35,130 --> 00:44:38,540 Ma una delle cose che abbiamo fatto in l'apparecchio CS50, volutamente, 929 00:44:38,540 --> 00:44:43,340 pedagogicamente è che abbiamo rimediato la aspettative del compilatore per rendere 930 00:44:43,340 --> 00:44:46,970 Assicurarsi che si sta facendo le cose non solo correttamente, ma in realtà correttamente. 931 00:44:46,970 --> 00:44:51,520 >> Perché se si sta dichiarando una variabile come n e mai usando oppure usando 932 00:44:51,520 --> 00:44:53,700 correttamente, allora che cosa sta facendo lì? 933 00:44:53,700 --> 00:44:55,650 Serve davvero inutile. 934 00:44:55,650 --> 00:44:58,980 Ed è molto facile con il tempo, se si non configurare il proprio computer in 935 00:44:58,980 --> 00:45:01,960 in questo modo, di avere solo codice che ha piccoli resti qui, resti lì. 936 00:45:01,960 --> 00:45:04,390 E poi, mesi dopo, si guarda indietro e siete come, perché è questa linea di 937 00:45:04,390 --> 00:45:05,060 codice di là? 938 00:45:05,060 --> 00:45:07,940 E se non c'è una buona ragione, non beneficiare voi oi vostri colleghi 939 00:45:07,940 --> 00:45:10,650 lungo la strada per avere a inciampare su di esso allora. 940 00:45:10,650 --> 00:45:12,540 >> Per inciso, in cui è che viene? 941 00:45:12,540 --> 00:45:16,410 Beh, ricordo che ogni volta che si compila programma, tutta questa roba è 942 00:45:16,410 --> 00:45:17,380 in fase di stampa. 943 00:45:17,380 --> 00:45:18,350 Così torneremo a questo. 944 00:45:18,350 --> 00:45:22,230 Ma ancora una volta, fare è un programma di utilità che automatizza il processo di compilazione da parte 945 00:45:22,230 --> 00:45:24,830 eseguendo il compilatore effettivo chiamato clang. 946 00:45:24,830 --> 00:45:27,650 Questa cosa, ci vediamo alla fine, ha a che fare con il debug di uno speciale 947 00:45:27,650 --> 00:45:29,060 programma chiamato il debugger. 948 00:45:29,060 --> 00:45:32,150 Questo ha a che fare con l'ottimizzazione codice - più su che in futuro. 949 00:45:32,150 --> 00:45:33,620 Std = c99 - 950 00:45:33,620 --> 00:45:37,870 questo significa solo utilizzare la versione del 1999 C. C è stato in giro ancora più lungo 951 00:45:37,870 --> 00:45:40,830 che, ma hanno fatto qualche bella variazioni 10 più anni fa. 952 00:45:40,830 --> 00:45:42,690 >> Ed ecco quelle rilevanti. 953 00:45:42,690 --> 00:45:45,880 Stiamo dicendo fare tutto ciò che in precedenza sarebbe stato un avvertimento 954 00:45:45,880 --> 00:45:48,560 un errore che impedisce l'allievo da compilare. 955 00:45:48,560 --> 00:45:51,400 E mezzi a parete fanno che per un tutta una serie di cose, non 956 00:45:51,400 --> 00:45:53,060 solo legato a variabili. 957 00:45:53,060 --> 00:45:54,700 E poi mi permetta di scorrimento per alla fine di questa riga. 958 00:45:54,700 --> 00:45:56,430 E anche questo, faremo alla fine tornare. 959 00:45:56,430 --> 00:45:59,040 Questo è ovviamente il nome di il file che sto compilando. 960 00:45:59,040 --> 00:46:02,160 Questo richiama il nome del file Sono uscita come nome 961 00:46:02,160 --> 00:46:04,070 del mio programma eseguibile. 962 00:46:04,070 --> 00:46:08,970 Questo-lcs50 significa solo usare il CS50 biblioteca, e gli eventuali zeri e uno che 963 00:46:08,970 --> 00:46:12,390 il personale ha scritto e compilato in precedenza quest'anno, integrare 964 00:46:12,390 --> 00:46:13,490 li nel mio programma. 965 00:46:13,490 --> 00:46:16,130 >> E qualcuno sa che cosa-lm è? 966 00:46:16,130 --> 00:46:18,150 E 'la libreria matematica, che è proprio lì anche se sei 967 00:46:18,150 --> 00:46:19,320 Non fare alcun matematica. 968 00:46:19,320 --> 00:46:22,620 E 'solo fornito automaticamente a noi da fare. 969 00:46:22,620 --> 00:46:26,540 >> Beh, mi permetta di fare un altro esempio qui aprendo un nuovo file. 970 00:46:26,540 --> 00:46:30,560 E mi permetta di salvare questo uno come string.c. 971 00:46:30,560 --> 00:46:37,980 Si scopre che, come si parla di dati Tipi di oggi, c'è ancora di più 972 00:46:37,980 --> 00:46:40,630 succedendo sotto il cofano di quanto abbiamo visto finora. 973 00:46:40,630 --> 00:46:42,290 Quindi lasciatemi rapidamente fare un rapido programma. 974 00:46:42,290 --> 00:46:44,510 Includi stdio.h. 975 00:46:44,510 --> 00:46:45,730 E mi salverò che. 976 00:46:45,730 --> 00:46:48,110 E sai, mi lasci non faccio il stesso errore di nuovo e di nuovo. 977 00:46:48,110 --> 00:46:50,540 Includi cs50.h. 978 00:46:50,540 --> 00:46:54,870 E mi permetta di andare avanti ora e fare int main (void). 979 00:46:54,870 --> 00:46:58,790 >> E ora voglio semplicemente fare un programma che fa questo - dichiarare una stringa 980 00:46:58,790 --> 00:47:03,610 chiamato s e ottenere una stringa dall'utente. 981 00:47:03,610 --> 00:47:05,820 E mi permetta di fare un po ' istruzioni qui - 982 00:47:05,820 --> 00:47:09,960 per favore mi dia una stringa - così l'utente sa che cosa fare. 983 00:47:09,960 --> 00:47:13,190 E poi qui di seguito questo, Voglio fare la seguente - 984 00:47:13,190 --> 00:47:16,060 per int i ottiene zero. 985 00:47:16,060 --> 00:47:18,580 Anche in questo caso, gli informatici in genere inizia a contare da zero, ma abbiamo potuto 986 00:47:18,580 --> 00:47:20,340 fare che uno se volevamo. 987 00:47:20,340 --> 00:47:27,240 Ora ho intenzione di fare i è inferiore della lunghezza della stringa di s. 988 00:47:27,240 --> 00:47:28,430 Così strlen - 989 00:47:28,430 --> 00:47:29,510 S-T-R-L-E-N - 990 00:47:29,510 --> 00:47:31,650 ancora una volta, è conciso perché è più facile al tipo, anche se è un 991 00:47:31,650 --> 00:47:32,590 po 'criptico. 992 00:47:32,590 --> 00:47:35,290 >> Questa è una funzione che non abbiamo usato prima, ma letteralmente vuol - 993 00:47:35,290 --> 00:47:37,810 tornare a me un numero che rappresenta la lunghezza della stringa 994 00:47:37,810 --> 00:47:38,690 che l'utente ha digitato. 995 00:47:38,690 --> 00:47:41,740 Se avevano scritto a ciao, sarebbe tornare cinque perché c'è cinque 996 00:47:41,740 --> 00:47:42,890 lettere in Ciao. 997 00:47:42,890 --> 00:47:45,390 Poi, a ogni iterazione questo ciclo, i plus plus. 998 00:47:45,390 --> 00:47:49,170 Quindi, di nuovo, uno standard costrutto anche se non siete abbastanza troppo comodo o 999 00:47:49,170 --> 00:47:50,420 familiarità con esso ancora. 1000 00:47:50,420 --> 00:47:53,220 >> Ma ora in poi ogni iterazione di questo ciclo, accorgo di quello che ho intenzione di fare. 1001 00:47:53,220 --> 00:47:56,690 Voglio andare avanti e stampare un singolo carattere - 1002 00:47:56,690 --> 00:47:59,940 in modo% c backslash n su una nuova linea. 1003 00:47:59,940 --> 00:48:00,990 E poi, sai cosa voglio fare? 1004 00:48:00,990 --> 00:48:05,090 Qualunque sia la parola è che l'utente digita in, come ciao, voglio stampare 1005 00:48:05,090 --> 00:48:09,530 H-E-L-L-O, un carattere per riga. 1006 00:48:09,530 --> 00:48:13,080 In altre parole, voglio arrivare alla singoli caratteri in una stringa, 1007 00:48:13,080 --> 00:48:16,770 cui finora una stringa ha appena stata una sequenza di caratteri. 1008 00:48:16,770 --> 00:48:21,690 >> E si scopre che posso fare s, staffa, i, chiudere la parentesi, chiudo 1009 00:48:21,690 --> 00:48:23,580 parentesi, punto e virgola. 1010 00:48:23,580 --> 00:48:25,640 E io devo fare una cosa di più. 1011 00:48:25,640 --> 00:48:30,570 E 'in un file chiamato string.h che strlen è dichiarato. 1012 00:48:30,570 --> 00:48:33,190 Quindi, se voglio usare quella funzione, Ho bisogno di dire al compilatore, 1013 00:48:33,190 --> 00:48:34,450 aspettare di usarlo. 1014 00:48:34,450 --> 00:48:37,040 Ora vorrei andare avanti e fare il programma chiamato stringa. 1015 00:48:37,040 --> 00:48:39,150 Dot, slash, stringa. 1016 00:48:39,150 --> 00:48:40,130 >> Per favore mi dia una stringa. 1017 00:48:40,130 --> 00:48:40,900 Io vado avanti e digita. 1018 00:48:40,900 --> 00:48:43,040 Ciao, in tutte le protezioni, Invio. 1019 00:48:43,040 --> 00:48:47,390 E ora accorgo che ho stampato questa un carattere dopo l'altro. 1020 00:48:47,390 --> 00:48:51,450 Così il nuovo dettaglio qui è che una stringa, al termine della giornata, può essere 1021 00:48:51,450 --> 00:48:54,810 accessibili tramite tale individuo caratteri introducendo la piazza 1022 00:48:54,810 --> 00:48:55,840 notazione staffa. 1023 00:48:55,840 --> 00:48:59,090 E questo perché una stringa sotto la cappa è infatti una sequenza di 1024 00:48:59,090 --> 00:48:59,810 personaggi. 1025 00:48:59,810 --> 00:49:02,010 Ma ciò che è pulito su di loro è nella RAM del computer - 1026 00:49:02,010 --> 00:49:05,300 Mac, PC, qualunque esso sia - sono letteralmente back to back to back - 1027 00:49:05,300 --> 00:49:06,225 H-E-L-L-O - 1028 00:49:06,225 --> 00:49:09,920 a livello individuale, adiacente byte in memoria. 1029 00:49:09,920 --> 00:49:13,210 >> Quindi, se si vuole arrivare al l'ottavo byte, che in questo ciclo sarebbe 1030 00:49:13,210 --> 00:49:16,900 Staffa a zero, una staffa, staffa di due, Staffa di tre, quattro staffa - 1031 00:49:16,900 --> 00:49:18,890 che di Zero indicizzati fino a cinque - 1032 00:49:18,890 --> 00:49:23,330 che vi stampare H-E-L-L-O sulla propria riga. 1033 00:49:23,330 --> 00:49:26,320 >> Ora, come un teaser, lascia che ti mostri il genere di cose che si finirà per essere 1034 00:49:26,320 --> 00:49:31,950 grado di comprendere, almeno con un po 'stretto alla ricerca. 1035 00:49:31,950 --> 00:49:35,610 Per uno, quello che abbiamo incluso in di oggi esempi, se vuoi, è in realtà 1036 00:49:35,610 --> 00:49:38,300 uno dei primissimi evasioni per l'iPhone. 1037 00:49:38,300 --> 00:49:40,800 Jailbreaking significa rottura del telefono in modo da poter effettivamente utilizzare su un 1038 00:49:40,800 --> 00:49:43,380 vettore o installazione diversa il proprio software. 1039 00:49:43,380 --> 00:49:45,660 E si noterà questo sembra completamente criptico, più probabile. 1040 00:49:45,660 --> 00:49:46,520 Ma guarda questo. 1041 00:49:46,520 --> 00:49:50,420 L'iPhone è stato apparentemente rotto con un ciclo for, una condizione if, un altro 1042 00:49:50,420 --> 00:49:52,580 condizioni, un gruppo di funzioni noi non abbiamo visto. 1043 00:49:52,580 --> 00:49:54,230 >> E di nuovo, non sarà in prima vista probabilmente 1044 00:49:54,230 --> 00:49:55,620 capire come questo funziona. 1045 00:49:55,620 --> 00:49:58,940 Ma tutto ciò che noi prendiamo sorta di per scontato nella nostra vita moderna 1046 00:49:58,940 --> 00:50:02,040 effettivamente tende a ridurre anche a qualche di questi fondamenti che abbiamo passato 1047 00:50:02,040 --> 00:50:02,820 guardando. 1048 00:50:02,820 --> 00:50:06,680 Lasciami andare avanti e aprire uno altro programma, holloway.c. 1049 00:50:06,680 --> 00:50:08,970 Quindi anche questo è qualcosa che si non dovrebbe davvero sapere. 1050 00:50:08,970 --> 00:50:12,440 Ancora nessuno del personale o che potevo probabilmente questo numero, cercando in 1051 00:50:12,440 --> 00:50:15,450 perché questo era il codice di qualcuno che è stata presentata a ciò che è 1052 00:50:15,450 --> 00:50:19,630 storicamente conosciuta come offuscato C concorso, in cui si scrive un programma 1053 00:50:19,630 --> 00:50:24,670 che compila ed esegue ma è così dannatamente criptico nessun essere umano può capire che cosa 1054 00:50:24,670 --> 00:50:27,530 sta andando a fare fino a effettivamente eseguirlo. 1055 00:50:27,530 --> 00:50:29,940 >> Quindi, in effetti, se si guarda a questo codice, vedo un interruttore. 1056 00:50:29,940 --> 00:50:30,870 Vedo principale. 1057 00:50:30,870 --> 00:50:33,800 Vedo queste parentesi quadre che implica qualche tipo di un array. 1058 00:50:33,800 --> 00:50:35,970 Qualcuno ha voglia di indovinare che cosa questo programma in realtà 1059 00:50:35,970 --> 00:50:37,220 fa se corro Holloway? 1060 00:50:37,220 --> 00:50:39,940 1061 00:50:39,940 --> 00:50:40,750 Sì. 1062 00:50:40,750 --> 00:50:43,050 OK. 1063 00:50:43,050 --> 00:50:44,690 Ben fatto. 1064 00:50:44,690 --> 00:50:48,090 Quindi solo il personale e non riesco a capire che cosa fanno queste cose. 1065 00:50:48,090 --> 00:50:51,670 >> E ora, infine, mi permetta di andare avanti e di aprire un altro programma. 1066 00:50:51,670 --> 00:50:53,440 Questo uno - 1067 00:50:53,440 --> 00:50:55,550 ancora una volta, faremo il codice sorgente disponibile on-line - questo è solo 1068 00:50:55,550 --> 00:50:57,480 genere di bello da guardare. 1069 00:50:57,480 --> 00:50:59,750 Tutti hanno fatto è premere il barra spaziatrice un bel po '. 1070 00:50:59,750 --> 00:51:01,320 Ma questo è codice reale. 1071 00:51:01,320 --> 00:51:04,790 Quindi, se si pensa che è abbastanza, se noi effettivamente eseguire questo al prompt, 1072 00:51:04,790 --> 00:51:08,970 alla fine si vedrà come siamo potrebbe fare cose come questa. 1073 00:51:08,970 --> 00:51:14,008 >> Quindi vi lasciamo su questa nota e vediamo il Mercoledì. 1074 00:51:14,008 --> 00:51:18,440 >> [MUSIC PLAYING] 1075 00:51:18,440 --> 00:51:23,380 >> SPEAKER 2: Al prossimo CS50, il TFS in scena un ammutinamento. 1076 00:51:23,380 --> 00:51:24,112 >> SPEAKER 3: Eccolo. 1077 00:51:24,112 --> 00:51:25,362 Fatelo! 1078 00:51:25,362 --> 00:51:29,912 1079 00:51:29,912 --> 00:51:32,074 >> [MUSIC PLAYING]