[REPRODUCCIÓN DE MÚSICA] DAVID MALAN: Hola a todos. Esto es supersección de CS50. Secciones asignados no lo hará comenzar otra semana. Y por eso hoy, estoy aquí con-- MARIA: María. DAVID MALAN: --to realidad echar un vistazo a un problema establecer uno, el curso de primeras semanas de material, conseguirle orientado con IDE CS50, un poco de Linux, el sistema operativo que es que se ejecuta en IDE, así como ver algunas de la transición desde cero en C líder hasta un problema establecer uno. Así que sin más preámbulos, en el problema de establecer uno, usted va a ser presenten a CS50 IDE, que es esta programación basada en la web entorno que utilizamos con el fin escribir programas. Ha sido diseñado para parecer muy reminiscencia de un ordenador típico sistema que ejecuta una operación sistema llamado Linux. Pero es en la llamada nube, lo que significa que todos en la clase en realidad puede tener su propia cuenta y usarlo, también. Así que la mayoría de ustedes probablemente nunca han utilizado un entorno Linux antes o tal vez incluso un entorno de línea de comandos. Y una línea de comandos medio ambiente es diferente. Todo es textual. Es todos los comandos de teclado. Y no es pasar el ratón, no hay iconos, sin ventanas de diálogo, no hay menús. Es puramente texto. Así que en un primer momento, que tipo de se siente como un paso hacia atrás en términos de sofisticación. Pero termina siendo mucho más potente, sin duda, para un científico de la computación, en última instancia. Así que vamos a echar un vistazo. Aquí estoy en CS50.io, a través del cual puede iniciar sesión en IDE CS50. Y al igual que en Scratch, hay tres áreas principales a esta pantalla. Así que en el lado de la izquierda, tenemos cuál será el explorador de archivos. Y hay esta carpeta en superior, que es ahora vacío desde que me deshice de todo mi archivos antes supersección. Y ahí es donde vamos guardar archivos de C que escribimos. En la parte superior derecha, tenemos un lugar donde todo nuestro código va a poner por escrito. Y de hecho, si hago clic en este plus, esta se va a dejar que me elijo Nuevo archivo. Y yo que puedo empezar a escribir código C o, Realmente, cualquier número de otros idiomas. Y luego en la parte inferior donde se dice jharvard @ ide50-- y la tuya será decir algo un poco diferente-- lo que se llama esto? Ventana de Terminal. Sí. Por lo tanto la ventana de terminal es la llamada de línea de comandos interfaz a través de la cual se puede interactuar con el sistema operativo subyacente. Y por ahora, vamos a hacer muy poco uso de esto-- acaba de compilar, mirar mensajes de error que vemos, y para ejecutar nuestros programas. Pero en última instancia, vamos hacer mucho más, también. E incluso se puede instalar el software y administrar su espacio de trabajo dentro de CS50 IDE, también. Pero más sobre esto en otro momento. Así que vamos a seguir adelante y escribir un programa muy sencillo solo que pasar por un calentamiento de hello.c, que es quizás el programa más simple podemos escribir. Yo ya he abierto una nueva pestaña. Voy a seguir adelante y decir incluir io.h. estándar Entonces int main (void). Y entonces printf ("hola, mundo" barra invertida n, cerca de cotización, cerrar paréntesis y punto y coma. Correcto. Así que ahora se dio cuenta de mi ventana no tiene título. Así que voy muy rápido subir a Archivo, Guardar. Y es importante que Me llamo no esta "hola". Así que un error muy común, especialmente en un problema conjunto uno, es accidentalmente acaba de llamar a su programa de "agua" o "codiciosos" o "Mario" o "crédito" o similares. Pero en realidad se quiere hacer Seguro que tiene la extensión de archivo porque esta es la única manera de que el compilador y también el editor de código sabe que eres realmente escribir código C. Así que déjame ir adelante y haga clic en Guardar. Y ahora, también, lo que CS50 IDE ha hecho por nosotros es que es también sintaxis resaltado todo. Así que ha hecho todo muy colorido. Y todo el propósito de que no es funcional. Es sólo para dibujar los ojos a la conceptualmente diferentes piezas de este programa. Así que vamos a seguir adelante y compilar esto. Y puedo compilar este en un par de maneras. Y en la semana uno, el manera de la vieja escuela que hicimos estaba literalmente en el "hello.c sonido metálico." comando line-- Y entonces me golpeó Intro. Y nada parece suceder en la ventana de terminal. Pero lo que hizo el cambio en el IDE? Cuando, una vez más, el IDE sólo significa Entorno de desarrollo integrado. Es una forma elegante de decir este desarrollo integrado medio ambiente para el desarrollo de software. Entonces, ¿qué cambió en la interfaz de usuario? ¿Qué notaste eso es diferente, María? MARIA: Me di cuenta de algo bajo la IDE50 carpeta aquí. DAVID MALAN: Sí. Así que aquí, no sólo ¿tenemos "hello.c." También tenemos "a.out", que es clase de nombre tonto para un programa. Pero de hecho, es el nombre predeterminado para un programa cuando usted acaba de compilar el código y no decirle al compilador qué archivo de salida. Así que si quiero correr esto, necesitar decirle al compiler-- o más bien, necesito decirle al espacio de trabajo que desee ejecutar el programa llamado "a.out". Entrar. Y hay "hola, mundo. "Ahora el" ./ ". es realmente importante. A pesar de que normalmente sólo escribir los nombres de comandos, cuando es un programa que tienes por escrito, usted quiere decir "./" porque eso dice explícitamente Linux que desea ejecutar un programa llamado "a.out" que está en esto, en que punto significa este directorio que estoy actualmente en, que pasa a ser llamado espacio de trabajo, "a.out. Porque si simplemente le dije "a.out" Enter, Yo voy a conseguir "a.out comando no encontrado "porque el computer-- porque yo inventé "a.out"; que no vino con la computer-- no sabe dónde buscarlo, a pesar de que es lo correcto bajo mi nariz, por así decirlo. OKAY. Así que podemos cambiar esto a ser "clang -o hola hello.c." Y si pulsa enter, qué programa ¿Esto va a la salida para mí? ¿Cuál es el nombre del archivo? Sí, en la parte trasera. Eso es correcto. "Hola." Así que "hola" va a ser el nombre del programa porque nosotros hemos utilizado la llamada de un argumento de la línea de comandos, que es justo una forma de cambiar el comportamiento de el compilador realidad de salida un nombre de archivo específico. Y de hecho, si el zoom y mirar hacia arriba aquí, ahora tengo no sólo "a.out" y "hello.c", sino también "hola", también. Así que ahora que puedo hacer "./hola," Enter. Y hay "hola, mundo". Pero lastly-- y esto ahora será la convención usamos todo el semestre, typically-- es que también puede simplemente decir "hacer hola." Y, en efecto, está diciendo que es hasta hasta la fecha porque ya existe. Déjame ir por delante y quitar, con el comando rm, tanto "a.out" - y decir "quitar a.out archivo normal?" Eso sólo significa, ¿verdad Seguro que deseas eliminarlo? Voy a decir que sí. Y luego me voy a quitar "hola", pero no "hello.c." Voy a decir "sí" de manera explícita, pero "y" es suficiente, también. Y ahora si me cuenta escriba ls-- que, recuerdo, significa películas-- que enumera todos de los archivos en mi carpeta. Y de hecho, si el zoom y mira arriba a la izquierda, confirma que lo que hay en esta carpeta, incluso aunque ha etiquetado como IDE50 aquí y no del área de trabajo, es sólo "hello.c." Así que ahora aquí, si yo no "hacer hola," Enter, ahora veo un comando mucho más tiempo, sino una más sofisticado de comandos que está pasando para ser útil en las semanas venideras. Y ahora lo que puedo decir "./hola." Así que echemos un rápido recorrido comandos de alguna otra Linux. Entonces, ¿por qué no dar un paso atrás y realmente se ven en C más en general, la transición desde cero a C, y luego concluir con una mirada en el primer problema establecido en C. De acuerdo. Así que voy a seguir adelante y sólo limpia mi espacio de trabajo con Control-L solo para mantener la pantalla limpia. Pero eso no tiene ningún funcional impactar de otro modo. Recordemos que hemos visto algunos comandos ahora. Así que hemos visto sonido metálico, que por lo general usted no tendrá que ejecutar manualmente más. Lugar Usaremos maquillaje. Pero también vimos ls, que muestra una lista de los archivos en mi directorio. Y ahora por qué es allí-- Hay de dos archivos ahora, "hola" y "hello.c." ¿Por qué hay una estrella o un asterisco después de "hola"? ¿Qué significa eso, en base en lo que vimos en la primera semana? ¿Qué piensas? ¿Qué significa la estrella? MARIA: para-- el programa "hola"? DAVID MALAN: "Hola *". Sí. ¿Oh si? Oh, ejecutable. Eso es correcto. Así que eso significa que "hola" es ejecutable. Así que de hecho, es por eso Que puedo hacer "./hola." Correcto. Entonces, ¿qué más puedo hacer aquí? Bueno, resulta que lo que pueda También crear directorios. Así que permítanme seguir adelante y crear, por ejemplo, un directorio "pset1". Y la especificación conjunto de problemas tendrá que hacer exactamente esto, por lo que no tiene que recordar hoy. Pero "pset1 mkdir" parece no tener ningún impacto. Pero, de nuevo, ningún mensaje de error en general es una buena cosa. Así que si escribo "ls" ahora-- ah, ahora Tengo un archivo ejecutable llamado "hola", un archivo C llama "hello.c." Y entonces la barra final, por lo que hablar, significa que este es un directorio. Así que de hecho, ahora quiero abrirlo. Y no me doble clic sobre ella como en una interfaz gráfica de usuario, un entorno gráfico. Yo en cambio digo "pset1 cd." Entrar. Nada interesante parece tener sucedido, excepto mi pequeño símbolo aquí-- ésta es la manera de recordar de Linux conmigo donde yo estoy, así que ¿qué carpeta está abierta. Es sólo que me dice de manera explícita en contraposición a gráficamente. Y si escribo "ls", porque he visto que otra prompt inmediatamente, piensa usted, cuando enumero los contenidos de pset1? MARIA: Probablemente no lo hace tener algo allí. DAVID MALAN: Sí. Así que no lo hemos hecho, obviamente, creado algo allí porque me acabo de crear el directorio. Ahora, si yo quería crear un file-- para ejemplo, podría crear un nuevo archivo. Y entonces yo podría ir a Guardar y guardar como, como, "mario.c" si está haciendo la edición estándar del conjunto de procesadores una. Y luego, como cualquier Mac o PC, simplemente elegir la carpeta "pset1, Guardar. Y ahora el archivo está vacío. Pero vamos a acercar de nuevo por un segundo. Vamos a hacer ls aquí. Ahora vemos "mario.c". Así que hay algunos otros comandos que vale la pena teniendo en cuenta más de tiempo-- claro, o Control-L es lo que tengo estado golpeando; mkdir que hemos visto; rm que hemos visto, también, que es para eliminar o borrar un archivo. Cuidado puedes También-- y si te fijas a tutoriales en línea, podrás rm -rf es una forma muy común de decir eliminar una carpeta que tiene cosas en él. Apenas sea super, super cuidado. -rf significa recursivamente eliminar lo que sea usted está tratando de eliminar y por la fuerza eliminarlo. Así medios recursivo si se trata de una carpeta con una carpeta con una carpeta con una carpeta, eliminar todos ellos. Y la fuerza significa ni siquiera me pregunta sí o no, estoy seguro? Así que es una manera estupenda de peligroso la supresión de un montón de cosas rápidamente. Pero beware-- demasiado a menudo hace un intrépido estudiante borrar accidentalmente, por ejemplo, conjunto de procesadores uno, por ejemplo. MARIA: ¿Y si sólo hacer -r, van para preguntarles sobre cada archivo. DAVID MALAN: ¿Qué es moderadamente molesto. MARIA: Sí. DAVID MALAN: Así que por eso muchos de nosotros, incluido uno mismo, estoy en el hábito de usar -rf. Pero es peligroso. Así que el comprador tenga cuidado. Y luego mv es una especie de Curiosamente llamado. Así que este es el comando de movimiento, que se siente un poco raro porque de hecho se puede utilizar para mover archivos de un lugar a otro. Por ejemplo, supongamos que metí la pata. Supongamos que he creado un nuevo archivo para el conjunto de procesadores. Y yo guardé como "greedy.c." Pero supongamos que accidentalmente guardarlo en IDE50-- así que en mi propio espacio de trabajo y no en pset1. Usted puede ver tanto en la parte superior izquierda. Hay "greedy.c." Y hay algunas soluciones. Así que uno, puedo utilizar el manera fácil de usar súper de tan sólo arrastrar y soltar. Y eso haría realidad solucionar este problema. Pero hoy, que estamos tratando de mirar las formas más arcanos pero poderosas de hacer esto. Así que quiero aprovechar "ls" en pset1. Y yo sólo veo "mario.c." Déjame ir adelante y hacerlo "cd ..". Así CD de nuevo es cambiar directorio. ".." Significa lo que, sin embargo? La última vez que dije "cd pset1 "para entrar en pset1. Así que cuando digo "cd ..", ¿qué estoy haciendo? Hacia atrás. Sí. Así que va a la llamada de los padres. Ir a un nivel superior, al igual que salir de una carpeta. Así Intro. Y de hecho, mira lo que hizo. Me conmovió solo en área de trabajo en su lugar de en pset1, que está en espacio de trabajo. Y ahora si escribo "ls", hay un montón de cosas. En hay "greedy.c". Así que ahora me deja utilizar mv para, literalmente, mover "greedy.c" en pset1. Y por lo que una gran cantidad de comandos de Linux trabajar exactamente como esta. Toman sin argumentos o tomar una argumento o toman dos líneas de comandos argumentos y así sucesivamente. Y en este caso, es haciendo literalmente lo que dice, aunque succinctly-- mover greedy.c en pset1. Entrar. Nada parece suceder. Pero si hago un ls de nuevo, codiciosos se ha ido. Y si lo hago "pset1 cd", Enter, y luego ls nuevo, ahora que está en el lugar correcto. Como acotación al margen, si por algunos reason-- especialmente si usted tiene intermitente conectividad de red o usted está caminando alrededor campus con su tapa del portátil cerrado y luego abrirlo de nuevo y su espacio de trabajo parece un poco fuera de sincronización, no es gran cosa. Sólo recargar su navegador ventana, y lo que debería resync de modo que la mano izquierda explorador de archivos se ve exactamente al igual que la ventana de terminal. No es para preocuparse. En caso de duda, vuelva a cargar la página, por lo que siempre y cuando haya guardado los archivos ya. OKAY. Así mv también se puede utilizar para cambiar el nombre de los ficheros. Y vamos a echar un vistazo a este comando final aquí. Así suppose-- y esto es muy común, también, desde el principio. Algunos estudiantes de vez en cuando crean un archivo llamada, vamos a decir-- lo que es otro? Al igual que "WATER.C." Así que voy a gritar, por ninguna razón, en mayúsculas. Pero este no es el nombre correcto para el archivo aunque sólo sea porque nuestro problema ajustado especificación no te lo dijo para guardar el archivo como todas las tapas "WATER.C." En su lugar, esperamos "water.c" en minúsculas. Y, de hecho, este es problemático porque check50, un programa que vas para reunirse en un problema establecer uno que prueba de forma automática la exactitud de su código va a gritar a usted si no puede encontrar "water.c" en minúsculas. Así que tengo que arreglar esto. Así que muchas maneras diferentes a ello, la primera de ellas sería la de Control y haga clic o haga clic el nombre del archivo y sólo cambia en Cambiar nombre. Totalmente bien para hacerlo. Pero, de nuevo, hoy, vamos a lo hace un poco más de lujo. Vamos a usar mv cambiar "WATER.C" a "water.c." Así que usted puede también utilizar el primer argumento para cambiar su nombre al segundo argumento si el segundo argumento no, está en De hecho, una carpeta o un nombre de directorio. Correcto. Y, por último, un poco trick-- así que estoy en mi directorio de espacio de trabajo en el momento. Si yo quiero entrar en pset uno, Ciertamente puedo escribir "pset1 cd." Pero es tan tedioso para escribir "pset1" o ya los nombres de archivos o nombres de directorio quieto. Así que muy a menudo en Linux, lo que usted puede hacer es empezar a escribir "pse" y simplemente se aburren, presione Tab, y dejar la figura del ordenador hacia fuera para usted. Súper útil para entrar en ese hábito. El único inconveniente es que si tienes varios archivos o carpetas que empiezan con la letra "p" o "ps", es posible que tenga para escribir un poco más antes de que el computadora sabe qué hacer. MARIA: Nos gustan los atajos. DAVID MALAN: Esta voluntad le ahorrará mucho tiempo. Y también, como hemos dicho en la conferencia, que puede desplazarse hacia arriba en la historia, de arriba abajo, encontrar recientemente ejecutada comandos, también. Correcto. Así que ahora, vamos a centrar nuestra atención de nuevo a un programa simple, hola mundo. Así que hemos recopilado esto exactamente. Y ahora ¿por qué no tomamos un vistazo a los tipos de datos y luego la transición de algunos bloques de Scratch correspondiente a C. MARIA: Awesome. Así que ahora que usted ha comenzado escribir programas en C, vamos a empezar a hablar acerca de los tipos de datos y variables. Así que algunos tipos de datos que querría saber a partir de ahora son los que están resaltado en azul. Así que tenemos int primero, que significa entero. Y eso vale enteros, como usted podría tener guessed-- de modo 1, 2, 3, y cualesquiera otros números enteros que usted se pueda imaginar. DAVID MALAN: Y también negativo. MARIA: Y también los negativos, sí. Y 0. Entonces tenemos carrozas, que son números de punto flotante. Así que eso es todos los números reales que tienen puntos decimales. Así 5,0, 5,2, y aún más dígitos después del punto decimal, como bien, y también los negativos. Entonces tenemos carbón, que es un personaje. Así que creo que hablamos esto en la conferencia de hoy. Pero tenemos letras, por ejemplo-- A, B, C-- que se puede almacenar como un char. Pero entonces tenemos mucho más símbolos que pueden almacenarse como un char. Y los que se almacenan como ASCII. Y luego tenemos bool, que son booleanos. Y los evalúan como True o Falso o 1 y 0, respectivamente. DAVID MALAN: Y recordemos que bool proviene de la biblioteca CS50. Así que no es incorporado en C, pero es super útil tener la noción de verdadero y falso. Y a pesar de que podría think-- hecho de la diversión. Un bool técnicamente necesita la cantidad de bits, verdaderamente, para representar Verdadera contra Falsa? ¿Cuántos bits crees lo que se necesita, como máximo? Sí, sólo uno. Así que resulta que C no le pueden dar sólo un poco. La unidad más pequeña de medida que puede obtener es de ocho. Así que es un poco derrochador que eres utilizando un byte completo, o ocho bits, para representar Verdadero o Falso. Pero eso es sólo la forma en que es implementado en C por la biblioteca CS50. MARIA: Y entonces los que estamos No vamos a hablar de la forma más amplia derecho ahora-- doble, eso es para carrozas más grandes. Larga largo y corto también son para los números enteros. DAVID MALAN: En efecto. En la edición pirata de pset uno, realmente usamos mucho, mucho. Sin embargo, para la edición estándar, no debería ser necesario. MARIA: Cool. OKAY. Así operators-- usted debería ser probablemente está familiarizado con la mayor parte de estos. Además, +; sustracción, -. Para la multiplicación, tenemos el *. Así que no es la X que solemos utilizar. División, tenemos la barra invertida. Y modulo es nuestro último operador que vamos a hablar en este momento. Es un operador que nos permite tomar el resto de una división. Así que si tenemos 4% 2, 4 dividido por 2 es 2 con un resto de 0. Así que 4% 2 es 0. 4% 3 es 1. 4% 5 es 4, lo que podría haber imaginado. Y recuerde al utilizar todos estos operadores utilizar las reglas PEMDAS. DAVID MALAN: Así que para ser claros, si hacer 4% 2, ¿por qué es que 0, exactamente? MARIA: Debido a 4 dividido por 2 es 2 con un resto de 0. Así módulo nos da esa resto como en comparación con el resultado de la división. DAVID MALAN: Y, en efecto, lo que encontraremos útil? para decir que en algunos problemas eso no es necesariamente uno, si usted quiere tener la efecto de restringir a ti mismo para un rango de números como 0 a través de algo, puede utilizar módulo para envolver antes que como el 2000000000 o el valor de 4 mil millones que que hemos hablado en la conferencia. MARIA: Sí. E incluso en "codiciosos" que podría. DAVID MALAN: Sí, en problema configurado uno, también. MARIA: Sí, muy bien. DAVID MALAN: Buen toque. MARIA: Lo siento. Boolean expressions-- lo para los operadores booleanos, vamos a hablar de todo de estos que usted ve aquí. Así que ahora mismo, tenemos dos signos de igual enumeran para iguales. Así que estos son para la comparación. Hasta ahora, sólo hemos visto un solo signo igual. Fue entonces cuando le asignamos un valor a una variable. Así que si hemos visto int n = 5, a continuación, hemos asignado 5 a la variable n. Pero si queremos usar == para comparación, se puede comprobar si n == 5. Y si n == 5, entonces eso es cierto. Así que los operadores booleanos nos permite, básicamente, para evaluar Boolean expresiones de verdadero o falso. Así que no equals-- tenemos la signo de exclamación y los iguales. Así también podríamos comprobar si n no es igual a lo 5-- n! = 5. Menor que, menor que o igual a, mayor que, mayor que o igual a, y luego tenemos la lógica Y ya la lógica OR. Y los que nos permiten evaluar múltiples expresiones booleanas juntos venir básicamente juntos como una sola expresión booleana conjunto. Así que si queremos encontrar un número, por ejemplo, que es mayor que 5 pero menos de 15 al mismo tiempo, nos gustaría utilizar el operador lógico AND para ver si n es mayor que 5 && n menos de 15. DAVID MALAN: Y aquí, también, es muy fácil desde el principio para accidentalmente utilizar un solo signo o una sola barra vertical. Y espero que el compilador gritarte porque en realidad tener un significado muy diferente. Para los curiosos, son utilizado para operaciones bit a bit, operando en bits individuales. Pero sí quiero el par de ellos aquí. Y muy importante es que primero, el signo igual, que es el operador de igualdad como en comparación con el operador de asignación. MARIA: Y la barra vertical es situado entre el Eliminar y Retorno. DAVID MALAN: Sí. En un teclado típico de Estados Unidos. MARIA: Sí. Así que vamos a entrar de lleno en sentencias condicionales. En Scratch, usted tiene ya se ha visto, probablemente, si las declaraciones que le permiten comprobar si algo es cierto, entonces hacer algo más. Así que usted puede ser que haya querido para comprobar si tu sprite es tocando alguna otra sprites o el borde de la pantalla. Y entonces usted puede ser que haya querido terminar el juego o hacer otra cosa. Así que la sintaxis para que es "si (condición)." Así que si tu sprite está tocando algo, entonces no está dentro de las llaves. Entonces tenemos if-else. Else nos permite hacer algo Si la condición de que comprobar si en un principio no es cierto. Así que si el sprite toca el fronteriza hacer esto, más haga algo más. Así que de lo contrario hacer algo más. Entonces tenemos un pequeño ejemplo para esto. Así que si (military_time <12), que querer printf "¡Buenos días!" Else vamos a printf "Buenas noches!" Ejemplo básico. DAVID MALAN: Good. MARIA: Cool. Así que ahora tenemos sentencias switch. Cambie declaraciones en general puede nos permiten hacer un montón de lo mismo que acabamos de hablar acerca de si las declaraciones. Por ejemplo, ahora mismo tenemos la forma general de la sentencia switch que permite que tomemos una variable llamada n y compararlo con una gran cantidad de diferentes valores, que aquí estamos han llamado Constant1, constant2. Es posible que tengamos mucho más. Y los que son llamados casos. Así que si tenemos un interruptor statement-- y esta obra sólo para integers-- tenemos una variable en este caso que es n. Si la variable n es igual a Constant1, nos ejecutará algún fragmento de código o algo que queremos hacer. Y entonces podríamos romper. Así que la ruptura significa que la sentencia switch se detendrá la ejecución si n es igual a Constant1, y luego el programa continuará. Se saldrá fuera de la cambiar declaración y que va a seguir haciendo otra cosa. Sin embargo, si n no es igual Constant1, entonces el caso de constant2 se comprobará. Así que si n es igual constant2, ese otro se ejecutará fragmento de código. Y luego se va a romper si eso es igual a ella. Y luego podemos tener También-- no necesariamente, aunque-- un caso por defecto, que sucederá si n no es igual a cualquiera de los casos que usted ha enumerado. Y en el caso por defecto, también no necesitan un descanso necesariamente porque la sentencia switch conocerá que necesita para terminar después del default caso si ese es el caso. DAVID MALAN: Pero estilísticamente, siempre nos ponemos en allí. MARIA: Sí. DAVID MALAN: Sí. Así que sobre todo cuando empiezan, especialmente si entre los menos cómoda, lo haría personalmente simplemente recomiendan seguir con las FI e IFS-vigilara y si-else-if vigilara y así sucesivamente si solamente porque son un poco más sencillo. Esta es una buena optimización, o a veces incluso estéticamente hace que el código sea más legible. Y de hecho, probablemente mitad del semestre vamos a ver un problema set donde sólo se ve mejor y más fácil de leer para los humanos mediante el uso de una sentencia switch. Pero no te preocupes aferrándose a esta demasiado pronto. MARIA: Sí. Si usted tiene un montón de sentencias if, simplemente no podría ser muy legible. Puede que no sea muy rápido para que usted vaya a través de él. Así que cambiar declaraciones pueden ser muy útil, también. Y también, no remember-- no hacer se olvide de poner las pausas en ese país. DAVID MALAN: No recuerda esto. MARIA: Porque entonces usted podría caer a través de un caso a otro. Así que digamos que el caso Constant1 no tienen una sentencia break en el mismo. Entonces podríamos caer a través de constant2 caso dentro. Y nosotros no queremos hacer eso si que ya hemos alcanzado caso Constant1 y es igual a n. Así, por ejemplo, si tenemos una variable n que contiene un número de clase, y queremos ver lo que clase es-- si n es igual a 50, vamos a imprimir "CS50 es Introducción a las Ciencias de la Computación I. " Entonces vamos a romper. Y eso es. Si, sin embargo, n es igual a 51, vamos imprimir "CS51 es Introducción de Ciencias de la Computación II ". Entonces, de nuevo, vamos a romper. Sin embargo, si a continuación, ponemos 124, 61, cualquier otro número que usted podría pensar, o programa no va reconocer que. Así que va a decir: "Lo siento, estoy no está familiarizado con esa clase ". Y se va a romper. DAVID MALAN: Así que realmente puede ver el if, else if, else idea aquí. Es simplemente diferente sintaxis para expresando la misma idea exacta. MARIA: Exactamente. Ahora tenemos nuestros operadores ternarios. Así que los operadores ternarios tienen de tres parts-- una condición, algo que hacer si que la condición es verdadera, y luego algo que hacer si esa condición es falsa. Como puede ver, básicamente, la sintaxis de eso aquí. Tenemos el signo de interrogación, y entonces el-- ¿qué es lo que llamamos esto? DAVID MALAN: El colon. MARIA: Colón. Gracias. Lo lamento. Así que echemos un vistazo a nuestro ejemplo de ver si podemos dar sentido a esto-- class_num == 50. Así que aquí vemos nuestro operador booleano == que compara la class_num variables a 50. Tiendas Así class_num un entero. Y si ese entero es igual a 50, entonces estamos va a almacenar "David Malan" en el interior del profesor cadena. Si el número de clases no igual a 50, "No está David Malan" va a ser el profesor. DAVID MALAN: Gracias. Y así parece equivalente a qué, usted diría, a primera vista? MARIA: A mí me parece como if-else declaraciones. DAVID MALAN: Sí. Y de hecho, esto es una especie de un bonito un trazador de líneas, por así decirlo, para la aplicación de exactamente la lógica de if-else pero hacerlo todo en un solo paso. MARIA: Exactamente. Sí. Declaraciones Así que si-más podría ocupan mucho espacio. Puede ser que sean demasiado largos para algo tan simple como esto. Así esto puede ser muy sucinta y muy agradable. Así que ahora vamos a mirar la ejecución de algo una y otra vez, lo que la comprobación para una condicionar varias veces y luego continuar a hacer algo mientras que la condición es verdadera. Así que esto nos lleva muy bien en ciclos while. A la izquierda, tenemos nuestro primer bucle while. Así, mientras que algo es verdad, hacer algo una y otra vez. Así que asegúrese de darse cuenta de que nuestra condición que aquí se valida en la parte superior. Mientras que con nuestra segunda loop-- llamamos que un do-while loop-- hacemos algo, a continuación, comprobamos por una condición. Y si esa condición sigue siendo cierto, volvemos y hacemos la cosa de nuevo. Así que la principal diferencia es donde la condición se comprueba. Y el código no puede ser nunca ejecutada si la condición no es cierto con el bucle while. Mientras que con el do-while lazo, tenemos el código que siempre se ejecuta al menos una vez. Y a continuación, mientras que la condición sigue siendo cierto, podemos volver atrás y repetir de nuevo en el interior. Entonces, ¿por qué crees que usaríamos un do-while en un bucle while? Correcto. Así que si queremos pedir al usuario de algún tipo de entrada, si queremos pedirles de entrar en su nombre, queremos al menos pedirles una vez. Y si entran ese nombre, no estamos va a pedir de nuevo porque ya la conocemos. Pero si no entran su nombre, o si entrar en algo que es obviamente no es un nombre, todavía queremos continuar preguntándoles por su nombre. DAVID MALAN: Y en la conferencia que tuvo uno así con el conseguir int positivo ejemplo, donde no hay nada que comprobar en primer lugar porque no tiene aun conseguido un int. Así que queremos hacer esto-- conseguir un int del user-- a continuación, comprobar que, tal vez, una y otra y otra vez. MARIA: Exactamente. Para loops-- Aceptar. Para bucles pueden permitir que hagamos casi exactamente lo mismo, también. De hecho, es exactamente lo mismo. Así que no hay nada que que puede hacer con los bucles que no sería capaz de que ver con ciclos while. Pero para los bucles puede parecer un poco poco más complicado sintácticamente porque tienen tres partes dentro de lo que fue antes sólo el condiciones, con bucles de tiempo. Así que la primera parte que el mar, la más a la izquierda, tenemos "int enanos = 0." Así que aquí es donde nos inicializar nuestra variable. Entonces tenemos un punto y coma y "enanos <7." Así que aquí es donde fuera condición que realmente es. Así que eso es lo que tendríamos poner sólo en el tiempo loop-- "mientras que los enanos <7." Aquí, que va en el medio de nuestro bucle for. Así que "dwaves <7." Y luego la última parte es "enanos ++" que es donde nos actualizamos nuestra variable. Así que lo importante es darse cuenta de que este va a ir a través de este bucle siete veces y ejecutar siete veces. Así que tenemos de siete enanos, y son todos va a decir: "Yo estoy aquí para ayudarle, Blanca Nieves " porque están listos para ayudar a Blancanieves. Con bucles while, que habrían hecho la inicialización y la actualización no dentro de la condición, de nuevo, pero ya sea antes o dentro del bucle while para asegurarse de que nosotros-- porque siempre necesitamos esas partes. Así que para asegurarse de que tenemos ellos, nos lo hemos todavía les añadido en adelante, no dentro de los paréntesis. DAVID MALAN: Y por lo que parece como-- en la conferencia, por ejemplo, Yo casi siempre uso, como, iy n y las variables bastante aburridas. Parece que se puede utilizar más ingeniosamente llamado las variables, también. MARIA: Sí, en realidad es muy agradable utilizar variables un poco más descriptivos debido sobre todo si alguien más es la lectura de su code-- tal vez usted es alumno o si usted está colaborando con alguien-- usted quiere asegurarse de que Entiendes lo que estás haciendo. OKAY. Así que esto es algo muy funky-- bucle for dentro de un bucle for. No sé si nos hemos visto esto antes. Probablemente no. Pero en realidad podemos tener esto-- así bucles en lugar de bucles. Así que, ¿alguien quiere caminar tal vez mí a través de lo que está pasando aquí? DAVID MALAN: voy a tomar una puñalada. MARIA: Cool. DAVID MALAN: OK. Así, spoiler-- queremos imprimir el material que está en la esquina inferior derecha allí. MARIA: Correcto. Sí, sí. DAVID MALAN: Así que acabamos de puesto que la producción de la muestra allí. Así que puedo deducir de la bucle superior que eres iterar sobre las filas bucle más externo, por así decirlo. Y estás iterar sobre columnas con el bucle más interior. Y de manera intuitiva, esta debe de esperar tiene sentido porque por naturaleza de todos los programas que hemos visto antes, printf, que es el función que estamos usando, en última instancia, tiene la capacidad de imprimir cosas esencialmente línea por línea. Al igual que, una vez que haya emitidos una nueva línea, hay sin doblar la espalda y la impresión de algo mayor en la pantalla, por lo menos no usar printf como este. Y así, en ese sentido, se hace sentido de que el bucle más externo debe referirse a las filas porque para cada fila dada, usted va a querer imprimir XXXXX, y luego pasar a la siguiente fila, XXXXX. Así filas son lo primero. Y luego dentro de cada fila, imprimir columnas. Si se trató de hacerlo de la contrario, es probable que no lo haría salir como piensa. MARIA: Sí. No podíamos volver a la fila anterior con printf. DAVID MALAN: ¿Y qué es interesante por charla de hoy sobre el alcance, en realidad, es que la fila es un int eso es declarado en el bucle superior. Pero nótese que aún es dentro de, por así decirlo, las llaves que inmediatamente seguir, a pesar de que no es técnicamente dentro de esas llaves. Así fila está en el ámbito de la totalidad del fragmento de código, tanto dentro del ciclo for exterior y en el interior del interior de bucle. Pero por el contrario, donde es la columna en su alcance? La columna variable? Sí, sólo en el bucle interior. Y eso está bien, porque no accedemos fuera de sus llaves. Todo lo que hacemos es imprimir un nuevo línea al final allí. Así que, de hecho, está bien. Así que esto tiene el efecto, parece que, de hacer las tres filas y cuatro columnas. MARIA: Correcto. Así que primero vamos a través de nuestra primera fila. Y justo en nuestra primera fila, nosotros hacemos el cuatro columnas dentro de la primera fila. Así que imprimimos a cabo cuatro de X. Y luego podemos salir del bucle for, ya ya hemos imprimimos cuatro de X. Y imprimimos una nueva línea. Y luego vamos a través de la mismo proceso para dos filas más para hacer un total de tres. DAVID MALAN: Y vale la pena señalar que es simplemente un artefacto de la fuente, el hecho que la salida de la muestra parece mucho más alto, como si aún hay más filas que columnas. Pero es sólo porque el X es más alto que ancho. Eso es todo lo que está pasando allí, más el espacio en blanco entre líneas. MARIA: Correcto. Guay. DAVID MALAN: De acuerdo. Así que una mirada rápida a un problema establece una, tomar alguna pregunta, y luego levantar la sesión? Correcto. Así que en el problema fijó uno, hay de tres principales desafíos, en última instancia. Pero primero, usted encontrará que el problema establecido especificación, al igual que con muchos el conjuntos de procesadores de este otoño, va a caminar a a través de algunos ejercicios de calentamiento, que señalar algunos recursos que puede o no han visto ya. Por ejemplo, CS50 tiene un conjunto de pantalones cortos, que son videos cortos, no a diferencia de esto, pero que son specific-- mismo tema tal vez cinco minutos, 10 minutos de duración sobre los bucles o en condiciones o en algoritmos o posterior en más temas avanzados, también. Y por lo general, integramos aquellos en el problema juegos para que los estudiantes tener un recurso con el cual para revisar el material que podría tener ya surgido en conferencia o sección. Pero de esta manera es más centrado y mucho más a su alcance. También tendemos a incrustar en el problema establece cosas llamadas tutoriales. Así que casi todos los ejemplos que hago en la conferencia, en el escenario aquí, también se han disparado en la cámara en avanzar en una más lenta, un recorrido íntimo por mí en mi portátil de ese código, línea por línea de manera que en la clase, a menudo voy leerlo a través de algo o alguien se intercalar con una responder a una pregunta. Pero no se hunde necesariamente por todos en la audiencia. Así encontrarás código tutoriales para la mayoría de los ejemplos lo que hacemos aquí en la conferencia para que puede caminar a través de él a su propio ritmo y rebobinado o avance rápido o omitir por completo, si lo desea. Hay a menudo algunos preguntas de calentamiento que pedirle que ordenar de reforzar este material y asegúrese de que usted es cómodo antes de continuar con el resto del conjunto de procesadores. Y luego, por supuesto, está el propio conjunto de procesadores. Y una de las cosas que deliberadamente hacerlo en CS50 es casi todos sin interés o intelectualmente interesante paso mecánico que es posible que tenga que hacer está casi siempre muy bien documentado. En el transcurso del plazo, vamos a empezar a hacer preguntas más retóricos como recordar cómo hacer esto o aquello? Pero, en general, usted encontrará que los conjuntos de problemas le consiguen a través de la mecánica de modo que algo los interesantes, retos intelectuales son en última instancia, de izquierda a que el estudiante. Con eso dicho, Zamyla, a los que mantienen refiriéndose hoy en conferencia, es uno de nuestro personal de toda la vida miembro de que también tiene tutoriales en problemas específicos PSet como mario y codicioso, aunque no regar este año. Y es en los Tutoriales que a menudo ofrece algunos consejos y trucos para la forma de proceder, no diciendo que exactamente qué hacer, pero rather-- como una condición, si Voluntad-- que le da al menos un par de ideas para que le toca a usted, en última instancia, para decidir cómo acercarse a ellos. MARIA: como especie de alto nivel comprensión de la lógica de lo le pedimos que hacer. DAVID MALAN: Exactamente. Y, de hecho, de Zamyla tutoriales están destinados para responder a la frecuencia pregunta de dónde hago empecé, especialmente cuando estos largos especificaciones están un poco desalentador dado todo el texto y las imágenes que tienen en ellos. Así water.c, encontrará después de que usted la ha completado, en realidad es relativamente sencillo. Absolutamente son un manojo de ustedes va a golpear sus cabezas contra la pared tratando averiguar por qué no es la compilación o por qué no está funcionando correctamente. Pero una vez que haya terminado con ella y una vez que haya pasado algún tiempo luchando con cualquier de los errores que pueda tener, usted encontrará que es un programa muy corto. Se puede hacer en tan sólo unos pocos líneas de código, la mayoría de los cuales que hemos visto aquí en la conferencia ya, si que se monten los bloques de construcción adecuadas. Y como le sugerimos aquí, va a pedir especificar cuántos minutos alguien está tomando una ducha en el campus. Especificamos en el problema ajustar la tasa de flujo de agua en, como, una ducha de bajo flujo cabeza, al igual que el clip de Seinfeld vimos ayer o la misma opuesto. Y luego sólo tienes para hacer un poco de matemáticas, realmente-- aritmética utilizando C para contar nosotros cómo muchos, aproximadamente, botellas de agua es que equivale a si somos tomando una ducha n minutos. Ahora, en mario.c, esto va para ser un programa ligeramente más largo. Todavía no va a estar tanto tiempo. A sólo unas pocas líneas más largas que water.c. Pero va a ser la oportunidad para recrear la antigua escuela Mario pirámide de Super Mario Hermanos o algún seguimiento. No va a parecer más bonita o tan colorido como que uno allí. Sólo vamos a utilizar pequeños hashtags como el que tenemos aquí en la pantalla el uso de texto ASCII. Pero va a aproximar la misma idea. Y va a ser un ejercicio que a primera vista parece bastante justo simple-- imprimir una sencilla pirámide. Pero hay un par de características aquí que son interesantes. Observe que el borde más a la derecha de la pirámide en realidad tiene la anchura de dos. Así que hay de dos iguales columnas de altura, los cuales hace que se requiere un poco de poco de pensamiento para hacer Seguro que consigue que toda la razón, ya que en lugar de sólo un ángulo perfectamente línea. Así que eso es un poco de un caso esquina pero coincide con el juego real. Y también es no evidente a primera vista cómo imprimir el espacio en blanco. Así que cuando me veo en el muestra de salida aquí-- y también en el que spec-- tipo de parece a un rectángulo, sino una diagonal de la rectángulo ha sido cortado, y es sólo espacios en blanco, por así decirlo. Y así una frecuencia hechas pregunta aquí es siempre bueno, ¿cómo me muevo los hashtags a la derecha? O cómo puedo imprimir los espacios en blanco? Y en realidad es más fácil que la mayoría de los estudiantes piensan. ¿Correcto? Usted puede aproximar visualmente con sólo golpear la barra espaciadora una o dos veces o tres veces. Y así, a pesar de que con printf casi siempre imprimir una cuerda o un int o una palabra como "hola, mundo "o una serie de palabras, también puede simplemente imprimir cita, espacio, fin de la cita. Y eso realmente dar que un espacio en blanco allí. Así que tenlo en cuenta y no pensar demasiado esto. Usted realmente tiene que decidir fila por fila por fila, no muy diferente de su ejemplo, un momento hace, ¿cuántos de los columnas deben ser espacios en blanco y cuántos de ellos debe ser hashtags. Tomará un poco de tiempo, pero es en última instancia, un rompecabezas de la lógica de clases. MARIA: Sí. Pero la lógica de ir fila por fila va a ser muy útil en este caso. DAVID MALAN: Sí. Creo que el código de ejemplo que gave-- aun aunque no era un programa completo. Usted todavía necesita int y principal y sin efecto y #include stdio.h, una gran cantidad de las cosas de la conferencia. Pero los bloques de construcción parecen estar allí. Y luego, por último, es algo un poco más algorítmica. Así que resulta que cada vez que ir a CVS o cualquier tienda de conveniencia y alguien te da en la facturas cajero o monedas como el cambio, resulta que ellos, los seres humanos, si o no lo sepan o no, probablemente están utilizando lo que hay llamado un algoritmo codicioso, por el que si que se le debe, por ejemplo, $ 21 en cambio, porque por alguna razón usted compró algo muy barato con una gran factura al CVS, que sería muy molesto si la cajero le dio 21 habitaciones individuales o, peor sin embargo, una gran cantidad de monedas. Más bien, lo que una persona razonable es probablemente va a hacer es que van para tomar un $ 20 y luego un proyecto de ley de $ 1, y que entregar sólo dos proyectos de ley en ese caso. MARIA: ¿Así que estamos tratando de minimizar el cambio que se dan de nuevo a usted. DAVID MALAN: Exactamente. Y mismo acuerdo con las monedas, también. Si usted le debe, por ejemplo, $ 0,50, esperemos que no quieres 50 centavos. En su lugar, quiere de dos cuartas partes, por ejemplo. Ahora bien, esto hace suponer que el cajero tiene basta de toda denominación que él o ella puede ser que desee darle. Pero nosotros permitimos que asumas tanto en el problema. Y el objetivo, en última instancia, es implementar en código C un algoritmo codicioso. Así se permite que el usuario para escribir en la cantidad cambiar él o ella se le debe con dólares y centavos, una especie de punto flotante valor probable. Y entonces usted tiene que hacer los cálculos y averiguar algorítmicamente, bueno, cuántas monedas puedo dar que mínimamente para darle exactamente esa cantidad de cambio. Pero no va a ser un algunas partes difíciles aquí, ¿verdad? Al igual que está el conjunto tema imprecisión. MARIA: Exactamente. Así que el punto flotante valores tienen imprecisión. ¿Acaso hablamos de esto en la conferencia de hoy? DAVID MALAN: Hicimos el la última vez en la conferencia. Hablamos de imprecisión. Y usted no quiere engañar al usuario de la cantidad de cambio que él o ella se le debe. Y así el tutorial, en la especificación de conjunto de problemas, reflexionar, en última instancia, en cuanto a cómo se puede mitigar los imprecisión errores, potencialmente. Es evitable, sin duda, por las entradas de las que estamos hablando. Y, de hecho, pennies-- tal vez vamos a aplazar a Zamyla, Creo que, para los trucos allí. Así que, finalmente, encontrará una la progresión de los problemas de esta semana, el primero de los cuales es bastante pequeña, a continuación, medio, y luego un poco más grande. Pero todos ellos utilizar el edificio cuadras de la semana pasada, de esta supersección, problema especificación establecida lo pone en innumerables recursos. Pero aún así, si es que lo que lucha, especialmente entre los menos cómodos sin conocimientos previos, llegado a las horas de oficina el lunes y martes y Miercoles y jueves. Ir a CS50 Hable a través de la página web de la asignatura, a través de la cual puedes chatear con el personal y los compañeros de clase. Pero en última instancia, creo que el mejor consejo es simplemente empezar temprano. No es el tipo de clase que debe iniciar conjuntos de procesadores el miércoles noche, o peor noche del jueves. MARIA: Mi mejor consejo es haber comenzado el lunes. DAVID MALAN: Lunes. Así que si usted no ha comenzado ya-- no. Pero incluso si no el lunes, luego el martes. Cuanto antes mejor. Y esa es la razón por la Por supuesto tiene tantos días de retraso es para darle un poco de un presión psicológica para empezar antes, pero todavía deja cosas resbalen cuando las cosas toman más tiempo de lo esperado. MARIA: ¿Y usted quiere hacer uso de horario de oficina lo más que puede, también. DAVID MALAN: ¿Alguna pregunta? Correcto. Bueno, ¿por qué no levantar la sesión aquí?