1 00:00:00,000 --> 00:00:09,572 2 00:00:09,572 --> 00:00:12,030 ROB Bowden: Ola, eu son Rob Bowden, e imos falar sobre quiz0. 3 00:00:12,030 --> 00:00:13,280 4 00:00:13,280 --> 00:00:14,545 >> Entón, primeira pregunta. 5 00:00:14,545 --> 00:00:17,750 Esta é a pregunta que necesitas para codificar o número 6 00:00:17,750 --> 00:00:21,270 127 nos bulbos binarios. 7 00:00:21,270 --> 00:00:23,550 Se quixese, podería facer a conversión regular 8 00:00:23,550 --> 00:00:25,950 de bi-- ou, de decimal a binario. 9 00:00:25,950 --> 00:00:28,300 Pero iso probablemente vai para ter unha morea de tempo. 10 00:00:28,300 --> 00:00:31,750 Quero dicir, pode descubrir que, OK, un está alí, 2 está aí, 11 00:00:31,750 --> 00:00:33,650 4 está aí, 8 está aí. 12 00:00:33,650 --> 00:00:39,280 Xeito máis doado, é de 128 127 menos un. 13 00:00:39,280 --> 00:00:42,013 Esta lámpada máis á esquerda é o 128 bits. 14 00:00:42,013 --> 00:00:43,490 15 00:00:43,490 --> 00:00:47,860 Así, 127 é realmente só todo das outras lámpadas, 16 00:00:47,860 --> 00:00:51,420 xa que é o máis á esquerda lámpada menos 1. 17 00:00:51,420 --> 00:00:52,800 Isto é todo para esta pregunta. 18 00:00:52,800 --> 00:00:54,060 >> Pregunta dun. 19 00:00:54,060 --> 00:00:56,710 Así, con 3 bits que poida representan 8 valores distintos. 20 00:00:56,710 --> 00:01:01,000 Por que, entón, é de 7 a maior non-negativo enteiro decimal pode representar? 21 00:01:01,000 --> 00:01:04,050 Ben, se só podemos representan 8 valores distintos, 22 00:01:04,050 --> 00:01:07,430 entón o que nós imos ser representando é de 0 a 7. 23 00:01:07,430 --> 00:01:08,745 0 leva-se un dos valores. 24 00:01:08,745 --> 00:01:09,980 25 00:01:09,980 --> 00:01:11,190 >> Pregunta dous. 26 00:01:11,190 --> 00:01:14,610 Con n bits, cantas distinta valores que poden representar? 27 00:01:14,610 --> 00:01:19,080 Así, con n bits, ten 2 os valores posibles para cada bit. 28 00:01:19,080 --> 00:01:22,300 Polo tanto, temos dous valores posibles para o primeiro bit, dous valores posibles 29 00:01:22,300 --> 00:01:24,450 para a segunda, 2 posible para o terceiro. 30 00:01:24,450 --> 00:01:28,730 E de xeito que é 2 veces 2 veces 2, e en definitiva, a resposta é de 2 a n. 31 00:01:28,730 --> 00:01:30,010 32 00:01:30,010 --> 00:01:31,100 >> Pregunta tres. 33 00:01:31,100 --> 00:01:33,450 Que é 0x50 en binario? 34 00:01:33,450 --> 00:01:39,490 Entón lembre de que ten un hexadecimal moi conversión simple de binario. 35 00:01:39,490 --> 00:01:43,180 Entón aquí, nós só necesitamos mirar para a 5 e a 0 de forma independente. 36 00:01:43,180 --> 00:01:45,110 Entón, cal é 5 en binario? 37 00:01:45,110 --> 00:01:48,400 0101, que é o 1 bit eo bit 4. 38 00:01:48,400 --> 00:01:49,900 Cal é 0 en binario? 39 00:01:49,900 --> 00:01:50,520 Non complicado. 40 00:01:50,520 --> 00:01:52,180 0000. 41 00:01:52,180 --> 00:01:54,970 Entón, só tes que poñer-los xuntos, e que é o número total de binario. 42 00:01:54,970 --> 00:01:57,640 01.010.000. 43 00:01:57,640 --> 00:02:00,439 E se quixese podería despegar que máis á esquerda cero. 44 00:02:00,439 --> 00:02:01,105 É irrelevante. 45 00:02:01,105 --> 00:02:02,920 46 00:02:02,920 --> 00:02:05,733 >> Entón, en alternativa, o que é 0x50 en decimal? 47 00:02:05,733 --> 00:02:08,649 Se quixese, ten could-- se está máis cómodo co binario, 48 00:02:08,649 --> 00:02:11,340 podería tomar esta resposta binaria e convertelo en decimal. 49 00:02:11,340 --> 00:02:13,870 Ou podemos só recordar que hexadecimal. 50 00:02:13,870 --> 00:02:21,140 Así que 0 é o 0 º lugar, e a 5 é, no 16 para o primeiro lugar. 51 00:02:21,140 --> 00:02:25,990 Entón, aquí temos 5 veces 16 a en primeiro lugar, ademais de 16 0 veces para a cero, 52 00:02:25,990 --> 00:02:27,520 é 80. 53 00:02:27,520 --> 00:02:29,710 E se mirou para o título para a pregunta, 54 00:02:29,710 --> 00:02:32,920 era CS 80, que era unha especie de Consello para a resposta a este problema. 55 00:02:32,920 --> 00:02:34,460 56 00:02:34,460 --> 00:02:35,420 >> Pregunta cinco. 57 00:02:35,420 --> 00:02:40,320 Temos este guión cero, o que é repetindo 4 veces manteiga de cacahuete marmelada. 58 00:02:40,320 --> 00:02:42,800 Así como nós agora o código que en C? 59 00:02:42,800 --> 00:02:47,730 Ben, temos aqui-- a parte en negra é a única parte que tiña de aplicar. 60 00:02:47,730 --> 00:02:51,950 Polo tanto, temos un 4 loop que é looping 4 veces, -ing printf Peanut Butter Jelly, 61 00:02:51,950 --> 00:02:53,910 coa nova liña que o problema pide. 62 00:02:53,910 --> 00:02:55,250 63 00:02:55,250 --> 00:02:57,490 >> Pregunta seis, outro problema do risco. 64 00:02:57,490 --> 00:03:00,210 Vemos que estamos en un loop para sempre. 65 00:03:00,210 --> 00:03:05,000 Estamos dicindo que a variable i e logo, incrementando i por un. 66 00:03:05,000 --> 00:03:09,580 Agora queremos facelo en C. Hai múltiples formas que poderiamos ter feito isto. 67 00:03:09,580 --> 00:03:12,840 Aquí pasou para codificar o para sempre como un lazo while (true). 68 00:03:12,840 --> 00:03:16,600 Así, declaramos a variable i, só como tivemos i variable no scratch. 69 00:03:16,600 --> 00:03:21,950 Declare a variable i, e para sempre while (true), nós dicimos que a variable i. 70 00:03:21,950 --> 00:03:25,260 Entón printf% i-- ou podería usar% d. 71 00:03:25,260 --> 00:03:27,985 Dicimos que variable e entón incrementa-lo, i ++. 72 00:03:27,985 --> 00:03:29,560 73 00:03:29,560 --> 00:03:30,830 >> Pregunta sete. 74 00:03:30,830 --> 00:03:35,560 Agora, queremos facer algo moi semellante Mario punto c do problema definido. 75 00:03:35,560 --> 00:03:39,110 Queremos imprimir estas hashtags, queremos imprimir un cinco 76 00:03:39,110 --> 00:03:40,700 por tres rectángulo destes hashes. 77 00:03:40,700 --> 00:03:41,770 78 00:03:41,770 --> 00:03:43,162 Entón, como é que imos facer isto? 79 00:03:43,162 --> 00:03:45,370 Ben, nós dámoslle un todo chea de código, e só 80 00:03:45,370 --> 00:03:47,560 ten que cubrir a función de reixa de impresión. 81 00:03:47,560 --> 00:03:49,540 >> Entón, o que PrintGrid parece? 82 00:03:49,540 --> 00:03:51,480 Ben, vostede é pasado o anchura e altura. 83 00:03:51,480 --> 00:03:53,520 Polo tanto, temos un exterior 4 loop, que é looping 84 00:03:53,520 --> 00:03:57,650 ao longo de todas as liñas do presente reixa que queremos imprimir. 85 00:03:57,650 --> 00:04:01,250 Entón temos a 4 circuíto inter-nested, esa é a impresión sobre cada columna. 86 00:04:01,250 --> 00:04:06,210 Así, para cada liña, nós imprimir para cada columna, un único hash. 87 00:04:06,210 --> 00:04:10,045 Entón, ao final da liña que imprime un soa liña nova para ir á seguinte liña. 88 00:04:10,045 --> 00:04:11,420 E iso por toda a rede. 89 00:04:11,420 --> 00:04:12,810 90 00:04:12,810 --> 00:04:13,675 >> Pregunta oito. 91 00:04:13,675 --> 00:04:17,170 Unha función como PrintGrid dise ter un efecto colateral, pero non un retorno 92 00:04:17,170 --> 00:04:17,670 valor. 93 00:04:17,670 --> 00:04:19,209 Explique a distinción. 94 00:04:19,209 --> 00:04:23,080 Entón, iso depende de ti lembrar o que é un efecto colateral é. 95 00:04:23,080 --> 00:04:25,180 Ben, un retorno value-- sabemos PrintGrid non 96 00:04:25,180 --> 00:04:28,180 ten valor de retorno, xa que aquí se di baleiro. 97 00:04:28,180 --> 00:04:31,150 Entón, todo o que volve void realmente non retorna nada. 98 00:04:31,150 --> 00:04:32,200 99 00:04:32,200 --> 00:04:33,620 Entón, cal é o efecto colateral? 100 00:04:33,620 --> 00:04:36,620 Ben, un efecto colateral é algo que tipo de persistir 101 00:04:36,620 --> 00:04:39,500 despois do remate da función que non era só retornou, 102 00:04:39,500 --> 00:04:41,340 e non foi só a partir dos insumos. 103 00:04:41,340 --> 00:04:44,970 >> Así, por exemplo, podemos cambiar unha variable global. 104 00:04:44,970 --> 00:04:46,590 Iso sería un efecto colateral. 105 00:04:46,590 --> 00:04:49,000 Neste caso particular, unha efectos secundarios moi importante 106 00:04:49,000 --> 00:04:51,070 está imprimindo en pantalla. 107 00:04:51,070 --> 00:04:53,110 Así que é un efecto colateral PrintGrid que ten. 108 00:04:53,110 --> 00:04:54,980 Nós imprimir estas cousas para a pantalla. 109 00:04:54,980 --> 00:04:56,370 E pode pensar que como efectos secundarios, 110 00:04:56,370 --> 00:04:58,690 xa que é algo que persiste tras esa función remata. 111 00:04:58,690 --> 00:05:01,481 Isto é algo fóra do alcance desta función que, en definitiva 112 00:05:01,481 --> 00:05:03,380 está a ser alterado, o contido da pantalla. 113 00:05:03,380 --> 00:05:05,200 114 00:05:05,200 --> 00:05:05,839 >> Pregunta nove. 115 00:05:05,839 --> 00:05:07,880 Considero o programa a continuación, para que os números de liña 116 00:05:07,880 --> 00:05:09,740 foron engadidos para a causa da discusión. 117 00:05:09,740 --> 00:05:13,480 Polo tanto, neste programa estamos só chamando GetString, almacenando-o 118 00:05:13,480 --> 00:05:16,220 Nesta variable s, e despois imprimir esta variable s. 119 00:05:16,220 --> 00:05:16,720 Está ben. 120 00:05:16,720 --> 00:05:19,090 Así, explicar por que unha liña está presente. 121 00:05:19,090 --> 00:05:20,920 #include CS50 punto h. 122 00:05:20,920 --> 00:05:23,820 Por que necesitamos de #include CS50 dot h? 123 00:05:23,820 --> 00:05:26,180 Ben, nós estamos chamando a Función GetString, 124 00:05:26,180 --> 00:05:28,840 e GetString defínese na biblioteca CS50. 125 00:05:28,840 --> 00:05:31,600 Entón, se non tivésemos #include CS50 punto h, 126 00:05:31,600 --> 00:05:35,760 teriamos que declaración implícita do erro da función GetString 127 00:05:35,760 --> 00:05:36,840 do compilador. 128 00:05:36,840 --> 00:05:40,110 Entón, necesitamos incluír o library-- necesitamos incluír o arquivo de cabeceira, 129 00:05:40,110 --> 00:05:42,870 ou o compilador non vai recoñecer que hai GetString. 130 00:05:42,870 --> 00:05:44,380 131 00:05:44,380 --> 00:05:46,140 >> Explique por que a liña dous está presente. 132 00:05:46,140 --> 00:05:47,890 Así estándar dot h io. 133 00:05:47,890 --> 00:05:50,430 É exactamente o mesmo como o problema anterior, 134 00:05:50,430 --> 00:05:53,310 excepto no canto de xestionar GetString, estamos falando printf. 135 00:05:53,310 --> 00:05:56,654 Entón, se nós non dixemos que necesitamos para incluír estándar io punto h, 136 00:05:56,654 --> 00:05:58,820 entón non sería capaz para utilizar a función printf, 137 00:05:58,820 --> 00:06:00,653 xa que o compilador non saber sobre el. 138 00:06:00,653 --> 00:06:01,750 139 00:06:01,750 --> 00:06:05,260 >> Para entendermos que o que é o significado de anular en liña de catro? 140 00:06:05,260 --> 00:06:08,010 Polo tanto, temos aquí int main (void). 141 00:06:08,010 --> 00:06:10,600 Isto é só dicindo que nós non están a recibir calquera liña de comandos 142 00:06:10,600 --> 00:06:12,280 argumentos para inicio. 143 00:06:12,280 --> 00:06:17,390 Lembre que poderiamos dicir int principais soportes int argc argv corda. 144 00:06:17,390 --> 00:06:20,400 Entón aquí só dicir baleiro de dicir que están ignorando os argumentos de liña de ordes. 145 00:06:20,400 --> 00:06:21,840 146 00:06:21,840 --> 00:06:25,225 >> Explique, no que se refire á memoria, exactamente o que GetString en liña seis retorno. 147 00:06:25,225 --> 00:06:27,040 148 00:06:27,040 --> 00:06:31,640 GetString está retornando dun bloque de memoria, unha matriz de caracteres. 149 00:06:31,640 --> 00:06:34,870 É realmente de volver punteiro para o primeiro carácter. 150 00:06:34,870 --> 00:06:37,170 Lembre que unha cadea é unha estrela de char. 151 00:06:37,170 --> 00:06:41,360 Así, s é un punteiro para o primeiro personaxe en calquera que sexa a secuencia é 152 00:06:41,360 --> 00:06:43,510 que o usuario inseriu no teclado. 153 00:06:43,510 --> 00:06:47,070 E que a memoria pasa a ser malloced, para que a memoria está no heap. 154 00:06:47,070 --> 00:06:49,080 155 00:06:49,080 --> 00:06:50,450 >> Pregunta 13. 156 00:06:50,450 --> 00:06:51,960 Considero o programa a continuación. 157 00:06:51,960 --> 00:06:55,579 Entón, todo isto programa está facendo é printf-ing 1 dividido por 10. 158 00:06:55,579 --> 00:06:57,370 Entón, cando compilado e executado, este programa 159 00:06:57,370 --> 00:07:01,170 saídas 0.0, a pesar de 1 dividido por 10 é de 0,1. 160 00:07:01,170 --> 00:07:02,970 Entón por que é 0.0? 161 00:07:02,970 --> 00:07:05,510 Ben, iso é porque da división enteira. 162 00:07:05,510 --> 00:07:08,580 Así, é un número enteiro de 1, 10 é un número enteiro. 163 00:07:08,580 --> 00:07:11,980 Entón, 1 dividido por 10, todo é tratado como números enteiros, 164 00:07:11,980 --> 00:07:16,380 e no C, cando facemos a división enteira, nós truncar calquera punto decimal. 165 00:07:16,380 --> 00:07:19,590 Entón, 1 dividido por 10 é 0, e entón nós estamos intentando 166 00:07:19,590 --> 00:07:24,410 para imprimir que, como unha boia, de xeito cero, impreso como un float é de 0,0. 167 00:07:24,410 --> 00:07:27,400 E é por iso que temos 0,0. 168 00:07:27,400 --> 00:07:28,940 >> Considero o programa a continuación. 169 00:07:28,940 --> 00:07:31,280 Agora estamos imprimindo 0.1. 170 00:07:31,280 --> 00:07:34,280 Polo tanto, non hai división de enteiros, estamos só a impresión de 0,1, 171 00:07:34,280 --> 00:07:37,100 pero estamos de imprimir lo 28 casas decimais. 172 00:07:37,100 --> 00:07:41,810 E temos esa 0,1000, un grupo enteiro de ceros, 5 5 5, bla bla bla. 173 00:07:41,810 --> 00:07:45,495 Polo tanto, a cuestión aquí é por iso que o fai imprimir que, no canto de exactamente 0.1? 174 00:07:45,495 --> 00:07:46,620 175 00:07:46,620 --> 00:07:49,640 >> Así, a razón é aquí agora punto flotante imprecisión. 176 00:07:49,640 --> 00:07:53,410 Lembre que un float é de só 32 bits. 177 00:07:53,410 --> 00:07:57,540 Por iso, só pode representar un número finito de valores de punto flotante cos 32 178 00:07:57,540 --> 00:07:58,560 Bits. 179 00:07:58,560 --> 00:08:01,760 Así, hai, en última instancia infinitamente moitos valores de punto flotante, 180 00:08:01,760 --> 00:08:04,940 e hai infinitamente moitos flotante valores puntuais en entre 0 e 1, 181 00:08:04,940 --> 00:08:07,860 e estamos obviamente poder representan aínda máis valores que iso. 182 00:08:07,860 --> 00:08:13,230 Entón temos que facer sacrificios para poder representar a maioría dos valores. 183 00:08:13,230 --> 00:08:16,960 >> Así, un valor como 0,1, aparentemente non é seguro que exactamente. 184 00:08:16,960 --> 00:08:22,500 Entón, en vez de representar 0,1 nós facemos o mellor que podemos representar este 0.100000 5 5 185 00:08:22,500 --> 00:08:23,260 5. 186 00:08:23,260 --> 00:08:26,306 E iso é moi preto, pero para unha serie de aplicacións 187 00:08:26,306 --> 00:08:28,430 ten que preocuparse punto flotante imprecisión, 188 00:08:28,430 --> 00:08:30,930 porque simplemente non pode representar todos os puntos flotantes exactamente. 189 00:08:30,930 --> 00:08:32,500 190 00:08:32,500 --> 00:08:33,380 >> Pregunta 15. 191 00:08:33,380 --> 00:08:34,679 Considero o código de abaixo. 192 00:08:34,679 --> 00:08:36,630 Estamos só a impresión 1 máis 1. 193 00:08:36,630 --> 00:08:38,289 Polo tanto, non hai ningún truco aquí. 194 00:08:38,289 --> 00:08:41,780 1 máis 1 avalía a 2, e entón nós estamos imprimindo iso. 195 00:08:41,780 --> 00:08:42,789 Isto só imprime 2. 196 00:08:42,789 --> 00:08:43,850 197 00:08:43,850 --> 00:08:44,700 >> Pregunta 16. 198 00:08:44,700 --> 00:08:49,450 Agora estamos imprimindo o carácter 1 máis o carácter 1. 199 00:08:49,450 --> 00:08:52,110 Entón, por que iso non fai imprimir o mesmo? 200 00:08:52,110 --> 00:08:57,680 Ben, o personaxe 1 máis o carácter 1, o personaxe ten un valor ASCII 49. 201 00:08:57,680 --> 00:09:04,840 Entón, iso realmente está dicindo 49 máis 49, e en definitiva, que vai imprimir 98. 202 00:09:04,840 --> 00:09:06,130 Polo tanto, este non imprime 2. 203 00:09:06,130 --> 00:09:08,070 204 00:09:08,070 --> 00:09:09,271 >> Pregunta 17. 205 00:09:09,271 --> 00:09:11,520 Completar a implantación de impar baixo de tal xeito 206 00:09:11,520 --> 00:09:14,615 que a función devolve true se n é estraño e falso se n é par. 207 00:09:14,615 --> 00:09:16,710 208 00:09:16,710 --> 00:09:19,330 Esta é unha gran propósito ao operador mod. 209 00:09:19,330 --> 00:09:24,530 Entón, tomamos noso argumento n, se n mod 2 é igual a 1, así 210 00:09:24,530 --> 00:09:28,030 é dicir que n dividido por 2 tiña un resto. 211 00:09:28,030 --> 00:09:33,270 Se n dividido por 2 tiña un remanente, que significa que n é impar, entón volvemos verdade. 212 00:09:33,270 --> 00:09:34,910 Outra cousa que volver falso. 213 00:09:34,910 --> 00:09:39,070 Tamén podería ter feito n mod 2 é igual a cero, voltar falso, senón retornar certo. 214 00:09:39,070 --> 00:09:41,600 215 00:09:41,600 --> 00:09:43,640 >> Considere a función recursiva continuación. 216 00:09:43,640 --> 00:09:46,920 Así, se n é inferior ou igual a 1, de regreso 1, 217 00:09:46,920 --> 00:09:50,430 else return n veces f de n menos un. 218 00:09:50,430 --> 00:09:52,556 Entón, cal é esa función? 219 00:09:52,556 --> 00:09:54,305 Ben, este é só o función factorial. 220 00:09:54,305 --> 00:09:55,410 221 00:09:55,410 --> 00:09:57,405 Isto está moi ben representado como n factorial. 222 00:09:57,405 --> 00:09:58,720 223 00:09:58,720 --> 00:10:02,310 >> Así cuestión 19 agora, queremos asumir esta función recursiva. 224 00:10:02,310 --> 00:10:04,530 Queremos facelo interactivo. 225 00:10:04,530 --> 00:10:05,874 Entón, como imos facelo? 226 00:10:05,874 --> 00:10:07,790 Ben para o persoal solución, e de novo hai 227 00:10:07,790 --> 00:10:11,090 varias formas que podería facer que, comezamos con este producto int 228 00:10:11,090 --> 00:10:11,812 é igual a 1. 229 00:10:11,812 --> 00:10:13,520 E ao longo deste loop for, imos 230 00:10:13,520 --> 00:10:17,590 multiplicarse produto para finalmente acabar co factorial completo. 231 00:10:17,590 --> 00:10:21,870 Así, para int i é igual a 2, i é inferior ou igual a n, i ++. 232 00:10:21,870 --> 00:10:24,130 >> Podes estar se pregunta por que eu é igual a 2. 233 00:10:24,130 --> 00:10:28,380 Ben, lembre que aquí temos que facer que o noso caso base é correcto. 234 00:10:28,380 --> 00:10:32,180 Así, se n é menor ou igual 1, nós estamos só retornando unha. 235 00:10:32,180 --> 00:10:34,830 Entón, aquí, comezan a i é igual a 2. 236 00:10:34,830 --> 00:10:39,090 Ben, se eu fose un, entón as-- ou se n fose 1, entón o loop 237 00:10:39,090 --> 00:10:40,600 non sería executado en todo. 238 00:10:40,600 --> 00:10:43,190 E así teriamos só produto de retorno, que é 1. 239 00:10:43,190 --> 00:10:45,920 Do mesmo xeito, se n fose nada menos que 1-- 240 00:10:45,920 --> 00:10:49,290 se fose 0, 1 negativo, whatever-- aínda estariamos volvendo 1, 241 00:10:49,290 --> 00:10:52,260 que é o que o versión recursiva está facendo. 242 00:10:52,260 --> 00:10:54,660 >> Agora, se n é maior que 1, entón nós imos 243 00:10:54,660 --> 00:10:56,550 facer polo menos un iteración deste circuíto. 244 00:10:56,550 --> 00:11:00,630 Entón, digamos que n é 5, entón nós estamos fará veces de produtos é igual a 2. 245 00:11:00,630 --> 00:11:02,165 Polo tanto, agora o produto é 2. 246 00:11:02,165 --> 00:11:04,040 Agora nós imos facer é igual a 3 veces produtos. 247 00:11:04,040 --> 00:11:04,690 Agora é 6. 248 00:11:04,690 --> 00:11:07,500 Produto veces é igual a 4, agora é 24. 249 00:11:07,500 --> 00:11:10,420 Produto é igual a 5 veces, agora é de 120. 250 00:11:10,420 --> 00:11:16,730 Entón, en definitiva, estamos volvendo 120, que é correctamente 5 factorial. 251 00:11:16,730 --> 00:11:17,510 >> Pregunta 20. 252 00:11:17,510 --> 00:11:22,480 Este é aquel en que ten que cubrir nesta táboa con calquera algoritmo, 253 00:11:22,480 --> 00:11:25,735 algo que xa vimos, que encaixa nestes prazo algorítmica 254 00:11:25,735 --> 00:11:28,060 veces estes tempos de execución asintótica. 255 00:11:28,060 --> 00:11:33,270 Entón, o que é un algoritmo que omega é de 1, pero gran O de n? 256 00:11:33,270 --> 00:11:35,970 Polo tanto, non podería ser infinitamente moitas respostas aquí. 257 00:11:35,970 --> 00:11:39,790 O que vimos, probablemente, máis frecuentemente é só busca lineal. 258 00:11:39,790 --> 00:11:42,050 >> Así, no mellor dos casos escenario, o elemento que estamos 259 00:11:42,050 --> 00:11:44,050 buscando está no inicio da lista 260 00:11:44,050 --> 00:11:47,400 e así en omega de 1 pasos, o primeiro que comprobar, 261 00:11:47,400 --> 00:11:49,740 nós só retornar inmediatamente que atopamos o elemento. 262 00:11:49,740 --> 00:11:52,189 No peor dos casos, o produto é, ao final, 263 00:11:52,189 --> 00:11:53,730 ou o elemento non está na lista de todo. 264 00:11:53,730 --> 00:11:56,700 Entón, temos que buscar toda a lista, todo n 265 00:11:56,700 --> 00:11:58,480 elementos, e é por iso que é o de n. 266 00:11:58,480 --> 00:11:59,670 267 00:11:59,670 --> 00:12:04,880 >> Polo tanto, agora é algo que é á vez omega de log n n, e gran O de n log n. 268 00:12:04,880 --> 00:12:08,650 Ben, a cousa máis relevante nós vimos aquí é merge sort. 269 00:12:08,650 --> 00:12:12,950 Entón, merge sort, lembre, é, en definitiva teta 270 00:12:12,950 --> 00:12:16,920 de n log n, onde teta defínese se ambos omega e gran O son os mesmos. 271 00:12:16,920 --> 00:12:17,580 Ambos n log n. 272 00:12:17,580 --> 00:12:18,690 273 00:12:18,690 --> 00:12:21,970 >> Que é algo que é omega de n, e O de n ao cadrado? 274 00:12:21,970 --> 00:12:23,990 Ben, unha vez máis hai varias respostas posibles. 275 00:12:23,990 --> 00:12:26,440 Aquí pasar a dicir bubble sort. 276 00:12:26,440 --> 00:12:28,840 Ordenación por inserción tamén funcionaría aquí. 277 00:12:28,840 --> 00:12:31,400 Lembre que bubble sort ten que optimización, onde, 278 00:12:31,400 --> 00:12:34,630 se vostede é capaz de obter toda a lista 279 00:12:34,630 --> 00:12:37,402 sen necesidade de facer calquera swaps, entón, ben, 280 00:12:37,402 --> 00:12:40,110 podemos volver inmediatamente que a lista foi clasificada para comezar. 281 00:12:40,110 --> 00:12:43,185 Así, no mellor dos casos, é só omega de n. 282 00:12:43,185 --> 00:12:45,960 Se non é só un ben lista para comezar con ordenados, 283 00:12:45,960 --> 00:12:48,270 entón temos O de n ao cadrado swaps. 284 00:12:48,270 --> 00:12:49,330 285 00:12:49,330 --> 00:12:55,610 E, finalmente, temos a selección especie para n ao cadrado, ambos omega e gran O. 286 00:12:55,610 --> 00:12:56,850 >> Pregunta 21. 287 00:12:56,850 --> 00:12:58,870 O que hai de integer overflow? 288 00:12:58,870 --> 00:13:02,160 Ben de novo, semellante á anterior, temos só un número finito de anacos 289 00:13:02,160 --> 00:13:04,255 para representar un número enteiro, Entón, talvez 32 bits. 290 00:13:04,255 --> 00:13:06,300 291 00:13:06,300 --> 00:13:09,180 Imos dicir que temos un completo asinado. 292 00:13:09,180 --> 00:13:12,800 Logo, en definitiva, a maior número positivo que pode representar 293 00:13:12,800 --> 00:13:15,910 é de 2 a 31 menos 1. 294 00:13:15,910 --> 00:13:19,370 Entón o que ocorre se intentamos entón incrementar ese número enteiro? 295 00:13:19,370 --> 00:13:25,320 Ben, nós estamos indo a ir de 2 a 31 menos 1, todo o camiño para negativa 2 296 00:13:25,320 --> 00:13:26,490 a 31. 297 00:13:26,490 --> 00:13:29,470 Polo tanto, este é integer overflow cando manter o incremento, 298 00:13:29,470 --> 00:13:32,330 e, finalmente, non se pode máis alto e el só 299 00:13:32,330 --> 00:13:34,520 implica toda a maneira para tras en torno a un valor negativo. 300 00:13:34,520 --> 00:13:35,850 301 00:13:35,850 --> 00:13:37,779 >> Que tal un buffer overflow? 302 00:13:37,779 --> 00:13:39,820 Así, un tapón de overflow-- lembre que é un buffer. 303 00:13:39,820 --> 00:13:41,000 É só unha peza de memoria. 304 00:13:41,000 --> 00:13:43,350 Algo así como unha matriz é un buffer. 305 00:13:43,350 --> 00:13:46,120 Entón, un buffer overflow é cando intenta acceder á memoria 306 00:13:46,120 --> 00:13:47,880 ademais do final do array. 307 00:13:47,880 --> 00:13:50,410 Entón, se ten un matriz de tamaño 5 e 308 00:13:50,410 --> 00:13:53,700 tentar acceder ao soporte de matriz 5 ou 6 soporte ou apoio 7, 309 00:13:53,700 --> 00:13:56,610 ou algo alén do final, ou mesmo nada 310 00:13:56,610 --> 00:14:00,790 soporte de matriz below-- negativo 1-- todos estes son estourido de buffer. 311 00:14:00,790 --> 00:14:02,810 Está tocando memoria en malos camiños. 312 00:14:02,810 --> 00:14:04,090 313 00:14:04,090 --> 00:14:04,730 >> Pregunta 23. 314 00:14:04,730 --> 00:14:05,760 315 00:14:05,760 --> 00:14:09,100 Entón, nun presente que precisa para aplicar strlen. 316 00:14:09,100 --> 00:14:11,630 E nós lles dicimos que pode asumir s non será nulo, 317 00:14:11,630 --> 00:14:13,790 así que non ten que facer calquera comprobación para nulo. 318 00:14:13,790 --> 00:14:16,190 E hai moitas maneiras podería ter feito isto. 319 00:14:16,190 --> 00:14:18,440 Aquí só tomar o simple. 320 00:14:18,440 --> 00:14:21,780 Comezamos cun contador, n. n é contar cantos caracteres existen. 321 00:14:21,780 --> 00:14:25,560 Entón, imos comezar con 0, e entón nós iterado sobre a lista enteira. 322 00:14:25,560 --> 00:14:29,092 >> S é igual a 0 soporte da carácter terminador nulo? 323 00:14:29,092 --> 00:14:31,425 Lembre que estamos a buscar o carácter terminador nulo 324 00:14:31,425 --> 00:14:33,360 para determinar canto tempo a nosa cadea é. 325 00:14:33,360 --> 00:14:35,890 Isto vai acabar calquera secuencia correspondente. 326 00:14:35,890 --> 00:14:39,400 Entón é s soporte 0 igual ao terminador nulo? 327 00:14:39,400 --> 00:14:42,850 Se non é, entón imos mirar s franxa 1, s 2 soporte. 328 00:14:42,850 --> 00:14:45,050 Seguimos ata que atopar o terminador nulo. 329 00:14:45,050 --> 00:14:48,580 Xa que atopamos, entón n contén a lonxitude total da cadea, 330 00:14:48,580 --> 00:14:49,942 e podemos voltar só iso. 331 00:14:49,942 --> 00:14:51,180 332 00:14:51,180 --> 00:14:51,865 >> Pregunta 24. 333 00:14:51,865 --> 00:14:53,010 334 00:14:53,010 --> 00:14:56,050 Polo tanto, este é aquel en que Ten que facer o trade off. 335 00:14:56,050 --> 00:14:59,810 Entón, unha cousa é boa nun xeito, pero de que xeito é malo? 336 00:14:59,810 --> 00:15:02,980 Entón, aquí, merge sort tende a ser máis rápido bubble sort. 337 00:15:02,980 --> 00:15:06,530 Dito isso-- ben, non varias respostas aquí. 338 00:15:06,530 --> 00:15:12,930 Pero o principal é que bubble sort é omega de n para unha lista ordenada. 339 00:15:12,930 --> 00:15:14,950 >> Lembre que a táboa que acabamos de ver antes. 340 00:15:14,950 --> 00:15:17,600 Entón burbulla clasifica omega de n, o mellor escenario 341 00:15:17,600 --> 00:15:20,010 é que é capaz de ir un pouco máis lista xa, determinar 342 00:15:20,010 --> 00:15:22,270 hey iso xa é clasificadas e retorno. 343 00:15:22,270 --> 00:15:25,960 Merge sort, non importa o que fai, é omega de log n n. 344 00:15:25,960 --> 00:15:29,200 Así, por lista ordenada, burbulla tipo será máis rápido. 345 00:15:29,200 --> 00:15:30,870 346 00:15:30,870 --> 00:15:32,430 >> Agora que sobre listas ligadas? 347 00:15:32,430 --> 00:15:36,070 Así, unha lista ligada pode medrar e encoller para caber tantos elementos como sexa necesario. 348 00:15:36,070 --> 00:15:38,489 Dito así que-- normalmente a comparación directa 349 00:15:38,489 --> 00:15:40,280 será un conectado lista con un array. 350 00:15:40,280 --> 00:15:41,600 351 00:15:41,600 --> 00:15:44,050 Así, aínda que as matrices poden facilmente aumentar e diminuír 352 00:15:44,050 --> 00:15:47,130 para caber tantos elementos que corresponda, unha lista ligada 353 00:15:47,130 --> 00:15:49,600 en comparación con un un array-- matriz ten acceso aleatorio. 354 00:15:49,600 --> 00:15:52,960 Podemos índice en calquera nomeadamente elemento da matriz. 355 00:15:52,960 --> 00:15:56,430 >> Así, para unha lista ligada, non podemos só tes que ir ata o quinto elemento, 356 00:15:56,430 --> 00:16:00,260 temos que percorrer desde o inicio ata chegar ao quinto elemento. 357 00:16:00,260 --> 00:16:03,990 E iso vai impedir de facer algo como busca binaria. 358 00:16:03,990 --> 00:16:08,150 Falando de busca binaria, busca binaria tende a ser máis rápido que a procura lineal. 359 00:16:08,150 --> 00:16:11,120 Dito que-- así, unha cousa posible 360 00:16:11,120 --> 00:16:13,380 é que non pode facer binario buscar en listas ligadas, 361 00:16:13,380 --> 00:16:14,730 só se pode facelo en arrays. 362 00:16:14,730 --> 00:16:18,030 Pero, probablemente, máis importante aínda, non pode facer busca binaria 363 00:16:18,030 --> 00:16:20,690 nunha matriz que non está clasificada. 364 00:16:20,690 --> 00:16:23,990 Upfront pode ter para clasificar a matriz, e só entón pode 365 00:16:23,990 --> 00:16:25,370 fai a procura binaria. 366 00:16:25,370 --> 00:16:27,660 Polo tanto, se a súa cousa non é ordenada, para comezar, 367 00:16:27,660 --> 00:16:29,250 logo busca lineal pode ser máis rápido. 368 00:16:29,250 --> 00:16:30,620 369 00:16:30,620 --> 00:16:31,740 >> Pregunta 27. 370 00:16:31,740 --> 00:16:34,770 Por iso, considero o programa a continuación, que será o próximo foto. 371 00:16:34,770 --> 00:16:37,790 E este é o único onde estamos Vai querer declarar explicitamente 372 00:16:37,790 --> 00:16:39,980 os valores para varias variables. 373 00:16:39,980 --> 00:16:41,990 Entón, imos ollar para iso. 374 00:16:41,990 --> 00:16:43,160 >> Entón liña un. 375 00:16:43,160 --> 00:16:45,457 Temos int x é igual a 1. 376 00:16:45,457 --> 00:16:47,040 Esa é a única cousa que pasou. 377 00:16:47,040 --> 00:16:50,440 Así, na liña dun vemos na nosa táboa, que y, a, b, e son todos tmp 378 00:16:50,440 --> 00:16:51,540 apaguei. 379 00:16:51,540 --> 00:16:52,280 Entón, o que é x? 380 00:16:52,280 --> 00:16:53,860 Ben, nós só configure-lo igual a 1. 381 00:16:53,860 --> 00:16:55,020 382 00:16:55,020 --> 00:16:58,770 E despois a liña dous, ben, vemos que y defínese como 2, 383 00:16:58,770 --> 00:17:00,550 e a táboa xa está cuberto para nós. 384 00:17:00,550 --> 00:17:03,040 Así, x é 1 e y é 2. 385 00:17:03,040 --> 00:17:05,890 >> Agora, a liña de tres, estamos agora dentro da función de intercambio. 386 00:17:05,890 --> 00:17:07,560 O que nós pasamos para intercambiar? 387 00:17:07,560 --> 00:17:11,609 Pasamos comercial x para un e comercial y de b. 388 00:17:11,609 --> 00:17:15,160 Onde o problema anteriormente afirmou que a dirección de x 389 00:17:15,160 --> 00:17:17,520 é 0x10, e a dirección de y é 0x14. 390 00:17:17,520 --> 00:17:18,970 391 00:17:18,970 --> 00:17:21,909 Así, a e b son iguais aos 0x10 e 0x14, respectivamente. 392 00:17:21,909 --> 00:17:23,670 393 00:17:23,670 --> 00:17:26,250 >> Agora a liña de tres, que son xe y? 394 00:17:26,250 --> 00:17:28,554 Ben, nada cambiou preto de x e y neste punto. 395 00:17:28,554 --> 00:17:30,470 Aínda que sexan dentro dun marco de pila principal, 396 00:17:30,470 --> 00:17:32,469 eles aínda teñen o mesmo valores que facían antes. 397 00:17:32,469 --> 00:17:34,030 Non modificou ningunha memoria. 398 00:17:34,030 --> 00:17:35,710 Así, x é 1, y é 2. 399 00:17:35,710 --> 00:17:36,550 400 00:17:36,550 --> 00:17:37,050 Todo correcto. 401 00:17:37,050 --> 00:17:40,300 Entón, agora nós dixemos int tmp igual para protagonizar un. 402 00:17:40,300 --> 00:17:44,410 Así, na liña de catro, todo é o mesmo, excepto para tmp. 403 00:17:44,410 --> 00:17:47,130 Non cambiamos os valores de calquera cousa, excepto para tmp. 404 00:17:47,130 --> 00:17:49,230 Estamos creando tmp igual para protagonizar un. 405 00:17:49,230 --> 00:17:50,620 ¿Que é unha estrela? 406 00:17:50,620 --> 00:17:56,240 Ben, algúns puntos de x, Entón protagonizar un vai x igual, o que é un. 407 00:17:56,240 --> 00:18:00,080 Entón, todo se copia abaixo, e tmp defínese como 1. 408 00:18:00,080 --> 00:18:01,110 >> Agora, a seguinte liña. 409 00:18:01,110 --> 00:18:03,380 Estrela un é igual a estrela b. 410 00:18:03,380 --> 00:18:10,000 Entón por liña five-- ben de novo, todo é o mesmo, só que quere unha estrela é. 411 00:18:10,000 --> 00:18:10,830 ¿Que é unha estrela? 412 00:18:10,830 --> 00:18:13,720 Ben, nós só dixemos estrela é un x. 413 00:18:13,720 --> 00:18:16,400 Entón, nós estamos cambiando x a igual estrela b. 414 00:18:16,400 --> 00:18:18,960 ¿Que é a estrela b? y. b apunta y. 415 00:18:18,960 --> 00:18:21,030 Así estrela b é y. 416 00:18:21,030 --> 00:18:25,140 Entón, nós estamos definindo x igual a y, e todo o resto é o mesmo. 417 00:18:25,140 --> 00:18:29,130 Así, podemos ver na seguinte liña que x é agora 2, eo resto son só copiados abaixo. 418 00:18:29,130 --> 00:18:31,120 >> Agora, na seguinte liña, estrela b é igual tmp. 419 00:18:31,120 --> 00:18:34,740 Ben, nós só dixemos estrela b é y, por iso, estamos definindo y igual a tmp. 420 00:18:34,740 --> 00:18:37,450 Todo o resto é o mesmo, polo tanto, todo é copiado para abaixo. 421 00:18:37,450 --> 00:18:42,050 Estamos definindo y igual a tmp, que é un, e todo o resto é o mesmo. 422 00:18:42,050 --> 00:18:43,210 >> Agora, por fin, a liña sete. 423 00:18:43,210 --> 00:18:44,700 Estamos de volta na función principal. 424 00:18:44,700 --> 00:18:46,350 Estamos detrás de intercambio está rematado. 425 00:18:46,350 --> 00:18:48,972 Perdemos a, b, e tmp, pero en definitiva, 426 00:18:48,972 --> 00:18:51,180 non modificar os valores de nada neste momento, 427 00:18:51,180 --> 00:18:52,800 nós só copiar x e y abaixo. 428 00:18:52,800 --> 00:18:56,490 E vemos que x e y son 1 e 2 agora, en vez de 1 e 2. 429 00:18:56,490 --> 00:18:58,160 O intercambio ten executado correctamente. 430 00:18:58,160 --> 00:18:59,500 431 00:18:59,500 --> 00:19:00,105 >> Pregunta 28. 432 00:19:00,105 --> 00:19:01,226 433 00:19:01,226 --> 00:19:03,100 Supoña que atopa as mensaxes de erro 434 00:19:03,100 --> 00:19:06,790 a continuación, durante o horario de expediente o próximo ano, como CA ou TF. 435 00:19:06,790 --> 00:19:08,930 Aconsellar como corrixir cada un destes erros. 436 00:19:08,930 --> 00:19:11,160 Referencia, de xeito indefinido para GetString. 437 00:19:11,160 --> 00:19:12,540 Por que se pode ver iso? 438 00:19:12,540 --> 00:19:15,380 Ben, se un alumno está a usar GetString no seu código, 439 00:19:15,380 --> 00:19:20,310 eles correctamente hash incluído CS50 dot h para incluír a biblioteca CS50. 440 00:19:20,310 --> 00:19:22,380 >> Ben, o que eles fan Debe corrixir este erro? 441 00:19:22,380 --> 00:19:26,810 Precisan facer unha lcs50 trazo no liña de comandos cando se está compilando. 442 00:19:26,810 --> 00:19:29,501 Entón, se eles non pasan clang lcs50 trazo, son 443 00:19:29,501 --> 00:19:32,000 non terá o real código que aplica GetString. 444 00:19:32,000 --> 00:19:33,190 445 00:19:33,190 --> 00:19:34,170 >> Pregunta 29. 446 00:19:34,170 --> 00:19:36,190 Implicitamente declarando función da biblioteca strlen. 447 00:19:36,190 --> 00:19:37,550 448 00:19:37,550 --> 00:19:40,360 Ben, iso agora, eles non teñen feito o hash correcto incluír. 449 00:19:40,360 --> 00:19:41,440 450 00:19:41,440 --> 00:19:45,410 Neste caso particular, o ficheiro de cabeceira precisan incluír é string punto h, 451 00:19:45,410 --> 00:19:48,710 e incluíndo secuencia punto h, agora o student-- agora o compilador 452 00:19:48,710 --> 00:19:51,750 ten acceso ao declaracións de strlen, 453 00:19:51,750 --> 00:19:54,120 e el sabe que o seu código Está a utilizar strlen correctamente. 454 00:19:54,120 --> 00:19:55,380 455 00:19:55,380 --> 00:19:56,580 >> Pregunta 30. 456 00:19:56,580 --> 00:20:00,240 Máis conversións por cento que argumentos de datos. 457 00:20:00,240 --> 00:20:01,540 Entón, o que é iso? 458 00:20:01,540 --> 00:20:06,470 Bo lembrar que estes cento signs-- como son relevantes para printf. 459 00:20:06,470 --> 00:20:08,890 Así, en printf podemos percent-- podemos imprimir algo 460 00:20:08,890 --> 00:20:11,380 como por cento i barra invertida n. 461 00:20:11,380 --> 00:20:15,310 Ou podemos imprimir como i por cento, espazo, i por cento, espazo, i por cento. 462 00:20:15,310 --> 00:20:18,950 Así, para cada un destes sinais de porcentaxe, necesitamos 463 00:20:18,950 --> 00:20:21,560 pasar unha variable ao final do printf. 464 00:20:21,560 --> 00:20:26,980 >> Entón, se nós dicimos paren printf cento i barra invertida paren n próximos, 465 00:20:26,980 --> 00:20:30,270 ben, dicimos que estamos vai imprimir un número enteiro, 466 00:20:30,270 --> 00:20:33,970 pero entón non pasar printf un número enteiro de realmente imprimir. 467 00:20:33,970 --> 00:20:37,182 Entón aquí máis por cento conversións que argumentos datos? 468 00:20:37,182 --> 00:20:39,390 Isto é dicir que temos unha morea de porcentaxes, 469 00:20:39,390 --> 00:20:42,445 e non temos variables suficientes para realmente cubrir estes porcentuais. 470 00:20:42,445 --> 00:20:44,850 471 00:20:44,850 --> 00:20:50,010 >> E, a continuación, en definitiva, á pregunta 31, definitivamente perdeu 40 bytes nun bloques. 472 00:20:50,010 --> 00:20:52,350 Polo tanto, este é un erro Valgrind. 473 00:20:52,350 --> 00:20:54,720 Isto quere dicir que nalgún lugar no seu código, 474 00:20:54,720 --> 00:20:59,010 ten unha asignación que é de 40 bytes grande para que malloced 40 bytes, 475 00:20:59,010 --> 00:21:00,515 e nunca liberou-o. 476 00:21:00,515 --> 00:21:02,480 477 00:21:02,480 --> 00:21:05,140 O máis probable é que só precisa atopar algún escape de memoria, 478 00:21:05,140 --> 00:21:07,650 e descubrir que precisa liberar este bloque de memoria. 479 00:21:07,650 --> 00:21:08,780 480 00:21:08,780 --> 00:21:11,910 >> E pregunta 32, write válido de tamaño 4. 481 00:21:11,910 --> 00:21:13,250 De novo este é un erro Valgrind. 482 00:21:13,250 --> 00:21:15,440 Isto non ten que ver con perdas de memoria agora. 483 00:21:15,440 --> 00:21:20,750 É dicir, a maioría likely-- quero dicir, é algún tipo de dereitos de memoria incorrectos. 484 00:21:20,750 --> 00:21:23,270 E probablemente iso é algún tipo de buffer overflow. 485 00:21:23,270 --> 00:21:26,560 Onde ten unha matriz, quizais unha matriz de enteiros, e imos 486 00:21:26,560 --> 00:21:30,115 din que é de tamaño 5, e tentar tocar soporte matriz 5. 487 00:21:30,115 --> 00:21:34,150 Entón, se tentar escribir para que valor, que non é unha peza de memoria 488 00:21:34,150 --> 00:21:37,440 que realmente ten acceso e así que está indo para obter ese erro, 489 00:21:37,440 --> 00:21:39,272 dicindo gravación válido de tamaño 4. 490 00:21:39,272 --> 00:21:42,480 Valgrind vai recoñecer que é intentando tocar de memoria de forma inadecuada. 491 00:21:42,480 --> 00:21:43,980 >> E iso por quiz0. 492 00:21:43,980 --> 00:21:47,065 Estou Rob Bowden, e este é CS50. 493 00:21:47,065 --> 00:21:51,104