[Powered by Google Translate] DAVID J. MALAN: Muy bien, este es CS50, y es esta la el inicio de la segunda semana. Gracias. Empecemos aquí con una llamada telefónica. Estoy a punto de marcar 617-BUG-CS50. CS50: Este es CS50. Para Boy Shuttle, pulse 1. Para empezar de nuevo, pulse 9. DAVID J. MALAN: Así dijo Chico Shuttle, pulse 1. Así que vamos a presionar 1. CS50: ¿Cuál es su origen? Por quad, pulse 1. Mather, pulse 2. Boylston, pulse 3. Lamont, pulse 4. Mem Hall, pulse 5. Para empezar de nuevo, pulse 0. DAVID J. MALAN: Vamos a presionar 1 para el quad. CS50: Shuttle Siguiente sale en este mismo instante a la 1:10 pm, y luego a las 1:20 pm, 1:30 pm, 1:40 PM. Esto es CS50. DAVID J. MALAN: Así que esta es la voz del CS50. Y es un ejemplo de los tipos de proyectos fin de carrera, por ejemplo, se puede arrancar con los dientes hacia Al final del semestre. Por ejemplo, que existe shuttleboy.cs50.net - en realidad un proyecto que escribí por primera vez después de tomar CS51 cuando yo era estudiante. Y aquí la inspiración era en aquel entonces, lo único que tenía era los horarios de autobuses, transporte impresos y no había noción de ver las cosas en línea. Y, entonces, una especie de paloma en un fin de semana, se vierte a través de la calendario impreso, y portado a un programa de ordenador. En ese momento, el programa de ordenador que pasó a ser escrito en C. Y en realidad corría por Boy traslado escribiendo en un parpadeo rápido como lo hemos estado haciendo hasta ahora. Pero con los años, ha evolucionado hasta convertirse en un instante mensajería bot. Ha evolucionado más recientemente en este sitio web, en un Basado en SMS herramienta, así como en esta herramienta basado en la voz. Y esto es hacer alusión a la clase de cosas que usted puede hacer por sí mismo por el final del semestre. Por ejemplo, existe la versión de SMS Boy traslado ocurre para operar como sigue. Si en su teléfono celular, enviar un mensaje de texto al 41411 y a continuación, enviar el sboy símbolo especial, para el muchacho de traslado, seguido por A y B, donde A es un origen y B es un destino - por ejemplo, Boylston Space Quad - lo que se debe volver en unos pocos segundos es un texto mensaje de Boy traslado diciendo exactamente cuando el próximos autobuses son pocos, desde ese punto Una situación que punto B. Y este es un ejemplo más general de lo que se conoce como mediante una API. Así, por ejemplo, esto aquí es sólo shuttleboy.cs50.net, el real basada en la web encarnación de esta. Pero los datos que subraya esta y otras aplicaciones que CS50 ha desarrollado están todos expuestos a todos aquí en la forma de APIs, interfaces de programación de aplicaciones. Y eso es sólo una forma elegante de decir que la gente que nos gusta en Internet y otros han pasado algún tiempo en la creación software que se puede utilizar con el fin de apoderarse de los datos de nosotros y luego construir sus propias aplicaciones en la parte superior de ese conjunto de datos. Así, por ejemplo, este muchacho de traslado página de la API aquí, que pasa a ser en el manual de CS50, esencialmente documentos cómo usted puede ir sobre la solicitud CS50 servidores de datos. Por ejemplo, si usted está familiarizado con los archivos CSV, comma valores separados, estos son sólo una especie de rápido y sucio Excel-como los archivos. Así que usted puede hacer Boy traslado de todos los datos en toda la casas y sus coordenadas GPS, y obtendrá de nuevo, en esencia, una hoja de cálculo como el que lo cual puede leerse en un programa de su cuenta y luego generar resultados, como el Niño de traslado en sí pasa a estar haciendo. Para los más familiares, representaciones de datos más modernos incluir JSON, notación JavaScript Object. Algo saldrá de nuevo a usted hacia Al final del semestre. Pero de nuevo, esto es sólo una de varias de las API del propio CS50. Y lo más emocionante es ahora, en estos días, Facebook y Twitter y Google y prácticamente todos los sitios web populares hacia fuera no tiene algún tipo de API, lo que significa que si usted lee el documentación en su sitio web, usted se inscribe en un cuenta, usted puede entonces comenzar a escribir software en la parte superior de cualquier herramienta o datos que la empresa no proporciona. Y así, uno de nuestros compañeros docentes propios un par de años atrás escribió una versión para Mac de esto. Así que en el enlace titulado Mac aquí arriba a la izquierda, en realidad se puede descargar un widget de Mac OS que se ejecuta en su propio Mac para hacer el mismo tipo de cosas. Así que es todo sobre la construcción en la parte superior de los conjuntos de datos como estos. Pero más sobre esto hacia el final del semestre. Así que vamos a bucear en rápido real a un error, sólo para tipo de conseguir cosas en calor hoy, y pienso en algunos de los lo vimos la semana pasada. En particular, quiero seguir adelante y levantar, por ejemplo, este ejemplo aquí. Buggy1.c, está disponible en la página web del curso si se había Desea descargarla y meter a tu alrededor. Pero vamos a acercar aquí en este programa bastante corto, y sólo un resumen super-rápido de algunos de los elementos básicos que que realmente van a empezar a limitarse a tomar por sentado. Así las cosas azul, en las líneas 1 a 9, son sólo preguntas de softbol. Así que estos son sólo comentarios. Ellos no tienen un significado funcional. Pero son los comentarios en el sentido de que son las notas que Yo, el ser humano, hecho a mí mismo, para que en la conferencia y después de conferencia, realmente puedo recordar lo que este programa hace sin tener que leer línea por línea y recrear la historia en mi mente. Por otra parte, si se me entregue este programa a otra persona como usted, es mucho más claro para usted, debido a los comentarios de este tipo, lo que el programa está haciendo en realidad, o al menos lo que el programa supone que debe hacer. Si es o no es correcto es harina de otro costal. Ahora, en C, con comentarios de varias líneas, recordemos que en la línea de aquí es el símbolo de la magia, / *. Esto significa que aquí viene el inicio de un comentario. Y nada más importa hasta que llegue al final de terminación, que es * /, lo contrario. Así que el hecho de que tengo 80-algunas estrellas impares desde aquí de izquierda a derecha es en realidad sólo un detalle estético. No tiene ningún significado funcional. Ahora, ¿qué hay de la línea 11? ¿Qué hace esto en términos simples? ¿Qué es eso? AUDIENCIA: Incluye la norma. DAVID J. MALAN: OK, bueno. Por lo tanto, incluye la biblioteca stdio.h. Entonces, ¿qué significa eso? Pues bien, dentro de ese archivo, stdio.h, son un montón de declaraciones de función - es decir, el código que otra persona escribió. Y un ejemplo perfecto de una función que se declara en stdio.h es - que por ahora favorito? Así printf, uno de los más comunes de usar, ciertamente desde el principio, desde que la biblioteca está allí. Si excluyo esa línea de código, Clang va a gritar a mí algo sobre el uso de un símbolo no declarado. Algo no declarado es, probablemente, la palabra clave, porque no nos han informado que el compilador lo ve printf a menos que nos gustaría incluir esa línea. Y más a la Tierra, en realidad, lo que está diciendo es la línea abrir ese archivo, stdio.h, donde quiera que se encuentra en el servidor de disco duro o unidad de disco duro del dispositivo, y copiar y pegar-it ahí mismo en mi archivo, sin mi tener que hacerlo manualmente. Ahora, una vez que lleguemos hasta aquí para principal, en poco tiempo vamos a empezar bromas aparte lo int y lo que es vacío. Pero por ahora, vamos a ver las tres líneas dentro de 15 a 17. Esto aquí afirmo como buggy. Línea 7 en mis comentarios dice: "En caso de imprimir 10 asteriscos, pero no. "¿Por qué esto no se imprimen, de hecho, 10 estrellas de este tipo? AUDIENCIA: [inaudible]. DAVID J. MALAN: Exactamente. Así cuenta de que estamos empezando a contar desde 0. Y esto es en realidad una convención en la programación y ciencias de la computación en general, empezando a contar de 0 en lugar de 1. Y esto realmente sólo se deriva del hecho de que, para ejemplo, cuando teníamos ocho personas en el escenario, cuando nadie levantaba la mano, eran todos los ceros eficaz. Y lo que es sólo una especie de convención ordenador para, por lo tanto, para empezar a contar desde 0. Si ese es el menor número que puede representar en binario. Así que aquí hemos empezado la inicialización i en 0. Hemos establecido i igual a 0. Pero entonces hice este error aquí, diciendo que es menor o igual a 10. Pero si usted piensa que a través de, si empiezo a 0 y luego me voy hasta 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, de hecho voy a imprimir 11 estrellas a la pantalla, porque he subido a e igual a 10. Así que la solución fácil aquí es, entonces, ¿qué? AUDIENCIA: [inaudible]. DAVID J. MALAN: Sólo tienes que cambiar a menos. Si usted realmente desea, usted puede hacer esto. Pero, en general, que está mal visto. Y así empieza a contar desde 0 es sólo algo que debería normalmente se acostumbra. Ahora, ¿qué pasa con toda esta construcción en sí y por sí misma? Esta línea 15 deMarks un bucle for. Así que para no es una función. Es sólo una declaración. Es una construcción de bucle, como vimos en el Scratch. Y tiene tres partes. Observe que no es la primera parte de la izquierda de la coma. Ahí está la parte media entre los dos puntos y comas. Y luego está la parte de la derecha a la derecha del punto y coma segundo. Ahora, la primera de ellas hace qué? AUDIENCIA: [inaudible]. DAVID J. MALAN: Volver allí? ¿Sí? AUDIENCIA: Inicialización. DAVID J. MALAN: Inicialización. Entonces, ¿qué significa esto? Hemos declarado una variable llamada i. Es de tipo int, porque he especificado int i. Y estoy i inicializar con el valor de 0. Entonces, ¿qué esta diciendo realmente? Es efectivamente diciendo a la computadora hey, dame suficiente memoria RAM suficiente, para ajustarse a un número y, a continuación, poner el número 0 en ese bloque de memoria RAM. Y en un aparte, qué tan grande es un int por lo general, al menos dentro del aparato? AUDIENCIA: 32 bit. DAVID J. MALAN: 32 bits. Eso quiere decir que me dan 32 bits, también conocida como 4 bytes, y poner el valor 0 en el mismo, lo cual es bastante fácil porque Simplemente significa poner todos los bits a 0. Así que ahora, la segunda parte aquí es la condición. Y la condición, como su nombre lo indica, es lo que se comprueba una y otra vez y otra vez acerca de si es cierto o falso. Así que esto es sólo decir hacer las siguientes líneas de código - es decir, la línea 16, porque esa es la única sangría debajo - siempre que i es menor que 10. Y después de cada iteración a través de este bucle, haga lo incremento, que en este caso es i + +. Ahora bien, no tiene por qué ser i + +. Podría ser i -. Pero si lo hice, ¿cuál es el comportamiento va siendo de este programa? AUDIENCIA: Va a ser un bucle infinito. DAVID J. MALAN: Va a ser una especie de bucle infinito, a menos que tengamos suerte después negativo 2 millones de dólares o así. Tal vez las cosas se envuelven alrededor, sólo por la naturaleza de lo finito número de bits que se han asignado para un int. Pero es seguro que va a repetir mucho más que 10 y sin duda, más de 11 veces aquí. Y ahora, en un aparte, darse cuenta de que i + + y i - en realidad son sólo azúcar sintáctica. Es sólo la notación abreviada de lo que es un poco más explícitamente escrito como sigue: i = i + 1. Que es idéntica a i + +. Es sólo un poco se ve más bonito que decir i + +. Es más conciso, más legible. Y así, la mayoría de la gente hace en su lugar. Pero esto es funcionalmente idéntica a lo que acabamos de ver. Así que en resumen, la solución rápida aquí es sólo para decir iterar i desde 0 todo el camino hasta menos de 10. Y entonces ciertamente obtendrá 10 estrellas. Así que vamos a probar esto. Déjame abrir la terminal en la parte inferior. Déjame entrar en el directorio que este es pulg Y voy a compilarlo manualmente con Clang por ahora. Y voy a compilar esto como buggy1.c, Enter. Y ahora buggy1, ¿por qué no hay tal archivo o directorio llamado buggy1? AUDIENCIA: [inaudible]. DAVID J. MALAN: Si. Así que es en realidad llamado a.out. Así que si usted acaba de recordar ejecutar Clang, donde Clang es la compilador, y no se especifica el nombre que desea dar a su programa, que va por defecto a a.out. Así que en realidad, si lo hago ls - oops. Y I didn't - el tema negro y blanco algunos de te enfrentaste se ha solucionado. Pero déjame hacer esto. No tenemos a.out en el lado izquierdo hay. Así que tenemos que ejecutar a.out en lugar de buggy1. Así que déjame ir adelante y hacerlo. . / A.out, Intro. Y al parecer no hizo lo que? AUDIENCIA: Guardar. DAVID J. MALAN: Guardar mi archivo. Así que se resuelve fácilmente pulsando S de control, o ir a Archivo, Guardar, como en la mayoría de los programas. Déjame aquí, borrar la pantalla, ejecute de nuevo. Y todavía hay un error. Entonces, ¿qué está pasando - AUDIENCIA: Usted no compila. DAVID J. MALAN: Ah, bueno. Yo no lo compila. Como un idiota, yo estoy mirando el código para ver qué pasa. Así clang buggy1.c, ahora a.out. Y ¡uf, salvada. Así que parece un poco feo porque no hay nueva línea en cualquier parte del programa. Pero, de nuevo, eso es sólo un detalle estético. Y por lo menos si contamos los que fuera, deberíamos 10 Ahora vemos de tales estrellas. Bueno, ¿qué pasa con este segundo calentamiento ejemplo? Así que en buggy2, sostengo que esta versión también se imprimirá 10 estrellas, una por línea. Así que esta vez, tengo un carácter de nueva línea, sólo para hacer las cosas un poco más bonito. Pero en lugar de lo que me pasa es lo siguiente. Así que permítanme hacer buggy2.c clang, Intro. Ahora está de nuevo llamado a.out. Intro. Sólo veo una nueva línea, sólo la nueva línea último que mueve mi sistema a la línea siguiente. Y sin embargo, es claro que yo he estado imprimiendo *, entonces una nueva línea, *, Entonces una nueva línea. Pero ¿cuál es el error aquí? ¿Sí? AUDIENCIA: [inaudible]. DAVID J. MALAN: Exactamente. Así que a diferencia de otros lenguajes, como Python, donde sangría en realidad tiene un significado funcional, en un lenguaje como C - como veremos, PHP, JavaScript - el sangrado es realmente sólo para beneficio de los seres humanos. Así que el hecho de que he sangrado línea 16 y 17 se ve muy bien, pero no tiene ningún significado funcional aquí. Si quiero a las dos líneas se ejecutan como parte de la de bucle, entonces tengo que encerrar entre llaves al hacer esto. Sólo se puede cortar esa esquina y omita las llaves si ¿cuál es el caso? PÚBLICO: Una sola línea. DAVID J. MALAN: Sólo una línea. Así que eso es sólo una especie de un tipo bonito detalle de sintaxis, con lo que que no pierdas el tiempo escribiendo tres líneas, dos de las cuales son llaves, sólo para escribir una sola línea de código. Pero si usted tiene dos o más líneas, en realidad hay que hacer esto. Así que ahora me deja guardar esto. Déjenme seguir adelante y volver a ejecutar Clang. Entonces déjame volver a ejecutar a.out, y ahora los puedo obtener uno por línea. Ahora, de nuevo a.out es una especie de nombre tonto para un programa. ¿Cómo puedo saber en realidad Clang a darme un nombre de archivo eso es más fácil de usar, como buggy2 sí mismo? Un poco más claramente? AUDIENCIA: [inaudible]. DAVID J. MALAN: OK, así que en realidad puede tener el mismo de fácil acceso directo y escribir simplemente hacer buggy2. No se especifica. C en este caso, y pulse Enter. Y lo que hace es hacer que compila buggy2.c para mí por pidiendo Clang para hacerlo. En concreto, se llama Clang, se ejecuta utilizando Clang manera más argumentos de línea de comandos o interruptores de lo que realmente necesitan. Con el tiempo, vamos a volver a lo que todos estos diversos crípticas expresiones con guiones significa. Pero por ahora, eso es sólo me ahorro la molestia de tener que recordar y tener que escribir todos los varias expresiones separadas por guiones. Y la ventaja de que en última instancia es que ahora tengo buggy2. Si yo quiero hacer esto de forma manual, sin embargo, me en su lugar puede hacer esto - clang-o buggy2 y luego buggy2.c. Y del mismo modo que me dará un archivo llamado buggy2. Así que en resumen, Clang es el compilador. Hacer es sólo una herramienta de fácil uso que vamos a utilizar más y más, ya que sólo empieza a simplificar las cosas para nosotros. Y volvemos 0, por último. Por ahora, porque sí, pero vamos a empezar a burlarse de esa parte hoy y el miércoles. ¿Tiene preguntas sobre todo esto? ¿Sí? AUDIENCIA: [inaudible] ls entre comillas allí? DAVID J. MALAN: OK. Cuando ls escritas entre comillas, que me estaba haciendo un poco de magia detrás de las escenas para corregir un error. Se me olvidaba, como lo hemos estado diciendo a muchos de ustedes en la foros de discusión, que se puede hacer - vamos a hacer esto ahora - sudo yum-y update appliance50. ¡Vaya, que eso está bien escrito. Así el aparato es como un sistema operativo. Se está ejecutando el sistema operativo llamado Fedora. Y ahora, debido a mi conexión a Internet lenta, no tengo realmente una manguera. Entonces, ejecutar yum update sudo, como ya te digo que hagas en la conjunto de problemas, esencialmente gusta correr actualizaciones automáticas en Mac OS o Windows. Y la razón de la ejecución de este en el comienzo mismo de la conjunto de problemas se debe a que cuando creamos el aparato, me en mal estado, y accidentalmente introducido todos los programas buscan negro en una pantalla en negro, por lo que usted no los está viendo de forma predeterminada. Pero la última versión del aparato corrige esto. Y voy a arreglar eso durante las vacaciones una vez que tenga Internet conectividad. Así que las citas sólo se esconde mi error, muy discretamente, al parecer. Otras preguntas? ¿Sí? PÚBLICO: ¿De dónde viene hacer vino? [Inaudible] DAVID J. MALAN: Buena pregunta. ¿Dónde hacer vino? Se trata de un programa de Linux que ha existido durante muchos años, mucho antes CS50. Y viene con un sistema operativo como Fedora. No viene de la biblioteca CS50. De hecho, las únicas cosas que vienen de la biblioteca CS50 hasta ahora, lo que hemos visto, son GetString, getInt, todos Obtener los funciones, y la cadena de palabras, y en cierta extensión, la palabra bool. Pero vamos a molestar que aparte cuando nos sumergimos en el CS50 aparato en sí. Así que sí, una pregunta más aquí. PÚBLICO: Cuando usted dijo y luego hacer buggy, ¿cómo funciona el equipo sabe [inaudible]? DAVID J. MALAN: Buena pregunta. Así que cuando usted acaba de hacer ejecutar o hacer buggy1 buggy2, cómo hace saber? Así que por defecto, si escribe buggy1 hacer, hacer looks para una archivo llamado buggy1.c. Y luego ejecuta los comandos Clang apropiadas, así ignorando el fichero de salida por defecto llamado a.out. De hecho, si nos fijamos en lo que hacen, lo que - vamos a salir de esta. Si nos fijamos en lo que hacen en realidad estaba haciendo, hacer buggy2, ya está actualizado. Así que me quite el comando rm, la programa que he escrito antes. Escribiendo Y-E-S para confirmar que desea eliminarlo. Si ahora hacen, observe que en esta línea muy larga, hay esta última cosa que aquí,-o buggy2. Todos cometemos está haciendo es pasar ese argumento, por así decirlo, a Clang, de modo que no tengo que escribirlo yo mismo. Muy bien, así que un par de rápida administrativo anuncios. Así, por secciones, que comenzó oficialmente el próximo Domingo, usted siempre querrá traer, si usted tiene uno, un ordenador portátil. Si usted no tiene una computadora portátil, llegan a mí por dejarme un correo electrónico. Y vamos a averiguar un flujo de trabajo. Lo que generalmente encontrará en el punto es que son parte parte conceptual y práctico. En especial, vamos a usar la sección de preguntas, parte de la semana del conjunto de problemas, caminar a través de algunos de los material conceptual de la conferencia. Y eso es todo en el conjunto de problemas actual. Y también vamos a profundizar en algunas de las actividades con manos, a veces de los cuales se requiere que se presentará, a veces de cuáles no. Por ejemplo, esta primera semana, que están destinados sólo como un ejercicio de calentamiento. Y te darás cuenta de que esos problemas son realmente sólo eso. Están destinados a ser bastante pequeña, pero no necesariamente programas triviales para escribir, que no son necesariamente buenas oportunidades interesantes en sí mismas sino que han de practicar con la sintaxis, con nuevas funciones, en la comodidad de una sección donde usted tiene algunos de sus compañeros de clase presentan como así como el TF. ¿Y qué vamos a hacer con el tiempo es utilizar una herramienta llamada CS50 Spaces, por lo que en lugar de usar el aparato CS50, usted en lugar de ir a una página web en un navegador, donde podrás para escribir código en una ventana del navegador en la sección. Y luego, si te aceptas, tu compañero de enseñanza se puede mostrar sea ​​lo que sea que estás escribiendo en la pantalla en el navegador ventana en la parte delantera de la clase, ya sea anónima o públicamente, para que él o ella puede caminar a través de sus compañeros de clase lo que has hecho bien, lo que no le fue bien. Y de nuevo, puede estar seguro de todo esto puede ser muy bien anónimos. Pero será una buena oportunidad para mucho más interactividad que permite algo así como conferencias. Mientras tanto, vamos a tener estas cosas llamadas súper secciones, que son opcionales, pero están abiertos a todo el mundo en la clase, de modo que usted puede hacer esto de manera más colectiva para establecer un problema. Aquí está el horario. Esto también se publica en la página web en cs50.net. Tenga en cuenta que habrá un pirata informático específico una mañana por la tarde. Y vamos a filmar uno hoy y mañana uno y publicar los en línea dentro de las 24 horas. Así que si usted no puede hacer ninguna de estas ocasiones, a preocuparse. Y de nuevo, el programa está en línea en cs50.net. En términos de seccionamiento sí mismo, usted debió haber recibido un correo electrónico con instrucciones para ir a la página de inicio del curso para encontrar fuera de su sección. Si la vida ha cambiado y necesita cambiar su sección, no es un problema. Regresa a la misma URL, cs50.net/section, singular, y usted llene el formulario similar, para que pueda que nos den sus preferencias. Y vamos a seguir a finales de semana en cuanto a lo que podemos acomodar. La semana pasada, recordamos que hemos propuesto utilizar CS50 Discutir, el curso de herramientas de discusión en clase. Así que tuvimos 40 preguntas que se formularon y respondió durante la conferencia. Así que parece que ha funcionado bien, así que voy a seguir tratando de hacer esto. Si, durante la conferencia, no sólo se sienten cómodos fondos la mano, no es un problema. Ir a cs50.net/discuss, puesto allí, y una de nuestras enseñanzas compañeros o bien contestar electrónicamente o aumentar su mano en su nombre anónima a pedir, en función de la naturaleza de la pregunta. Y en términos de información, por lo general los conjuntos de procesadores será devuelto dentro de una semana. Debido a que toma un poco de tiempo para las secciones de lograr equilibrio, el conjunto de procesadores primero, 0 y 1, será un poco retrasado ya que las cosas se calmen. Pero estad atentos para que en las próximas semanas. Muy bien, así que me puse el grave voz por un momento. Así que este es en realidad un clima interesante para estar teniendo esta discusión, lo que con todas las otras cosas pasando por la misma campus correspondiente. Pero CS50 ciertamente ha tenido su historia de este particular tema, en tanto como todos los años, este curso, para muchos años, ad-juntas aproximadamente el 3% de la clase. Este último año, el 2011, CS50 Ad-Entablado 35 estudiantes. Esto no es, creo, debido a la falta de claridad. Darse cuenta de que en el plan de estudios del curso, hay una página de declaración explicando que las líneas son. Esa misma instrucción se repite en cada uno de los boletines de problemas en la página uno. Así que hablar de esto hoy realmente sólo para hacer personas conscientes de esto. Y hemos intentado cosas diferentes. Y lo que yo pensaba que íbamos a hacer hoy es simplemente tomar un momento para realmente se ven en algunos de los casos pasados ​​que han surgido. En lugar de mantener a estos pequeños secretos sucios que, en realidad señalar lo que han hecho y cómo se ha detectado y realmente lo que la motivación principal es para teniendo esta conversación. Así que dicho esto, la línea esencialmente es esto - por el plan de estudios, de nada, se le anima a hablar con los compañeros de clase. Ese es todo el propósito de contar con estos colaborativo las horas de oficina en Annenberg y personas alentadoras para el final del proyecto para trabajar juntos. Sin embargo, la línea se dibuja cuando llegue el momento de escribir realmente su solución final. Al hablar en Inglés, totalmente bien, hablando en pseudo-código, totalmente bien. Envío por correo electrónico a un compañero de su conjunto de procesadores, permitiendo que se vean más la pantalla como las manos siguen escribiendo, sobre la línea también. Mire al plan de estudios de las líneas particulares. Pero sólo para pintar una imagen de cómo esto es por desgracia un realidad, se dan cuenta de que hay sitios web por ahí que tienen soluciones de esta clase y muchas otras clases. El hecho de que usted o un 3% de ustedes saben que esto existe significa que sabemos que esto existe. El hecho de que hay sitios como este en el que puede pagar a alguien para hacer realidad sus boletines de problemas - se trataba de un caso real que ocurrió el año pasado. Se trata de un sitio web llamado odesk.com. Y Tim era el nombre de la persona que estaba aquí la publicación en Este sitio web y le pidió a alguien que haga su pset 7 en este caso particular. Bueno, es muy odesk.com Google-ble, y estamos muy muy bueno en buscar en Google. Aquí, también, hay sitios - y este es bastante atroz, francamente. [Risas] DAVID J. MALAN: Lo más gracioso de este sitio es que si leer la página Acerca de, hablan de su corporativo servicio de la cultura y cómo es su cliente número uno prioridad, para asegurarse de que sus asignaciones obtener entregada a tiempo. Pero en serio, una vez más, el hecho de que estos sitios existen, nos damos cuenta, también, son conscientes de este tipo de sitios. Y para darle un sentido a lo que constituye por regla general, toma, por lo general no tienen grandes escándalos donde la gente están colaborando en cualquier tipo de forma masiva, sino más bien es estos momentos nocturnos de debilidad, donde usted tiene por lo mucho por hacer, son las 4:00 AM, estás agotado, y piensa a sí mismo, bueno, déjame echar un vistazo a mi compañero de cuarto o código de mi amigo o similares. Y las manifestaciones de esta desgracia involucrar Estudiante A la presentación de algo como esto y presentación de B Estudiante algo como esto, que por cierto, en un ordenador clase de ciencias, es muy fácil para los científicos de la computación para detectar con software. Este es otro paradigma común, donde usted tiene una especie de estado trabajando junto a alguien, tal vez hablando en Inglés, muy bien, pseudocódigo. Pero entonces llega el momento de presentar efectivamente, los conjuntos de procesadores y sólo se intercambia a través de correo electrónico o Dropbox o similares. Sin embargo, en un intento de hacer que sea menos evidente que esta es lo que ha ocurrido, entonces esto es lo que está sometido. Esto, también, no se dispara hasta bien escritos piezas de software que tenemos para detectar realmente este tipo de cosas. Y de hecho lo que hacemos es un software de gestión que compara todos este año las presentaciones contra todo el año pasado presentaciones, contra todo lo que encontramos en la Internet, en contra de todos los sitios web de empleo que hay. Es todo muy automatizado. Y así lo hacemos realmente para ser justos gran al 97% que realmente están trabajando fuera de sus asnos en este y en otros clases y poniendo en todo ese esfuerzo para que el trabajo en última instancia, presentar es el suyo. Y puedo continuar durante mucho tiempo. Estos son sólo un puñado de casos del año pasado. Algunos estudiantes presentaron estos archivos de forma idéntica para pset 2, pset 3, conjunto de procesadores 4, 5 pset, pset 6, pset 9. En este caso, esta prueba era 0 y en el año pasado, donde dos estudiantes presentaron esta frase idéntica entre muchos otros, "La solicitud de tipo -" punto, punto, punto. Así que, incluso en una clase de 600 hicimos detectar este presentado en concursos. Así que en resumen, esto - francamente, no me gusta tener este tipo de conversación - pero esto es realmente un esfuerzo deliberado este año para tratar de reducir ese número. Porque a pesar de que dicen este tipo de cosas cada año, creo que la realidad de haber habitado en él durante unos pocos segundos más de lo normal y en realidad sólo señalando que lo que puede parecer, eh, no es una gran cosa, por lo menos piensen en este momento en particular, tanto para ser justos con ti mismo y de tus compañeros de clase aquí. Así que si alguna vez tiene alguna pregunta en cuanto a donde la línea Es decir, por favor, sólo llegar a mí personalmente. Pero la respuesta es siempre, completamente estresado en el último minuto, dinero en efectivo en un día de retraso. O si es una cuestión de no tener días de retraso, Honestamente, correo electrónico personal. Ya se nos ocurrirá algo. Por favor, no pongas tu tiempo aquí en Harvard en riesgo. Ahora, pensé que debería aligerar el estado de ánimo, por lo que incluido esto como la siguiente diapositiva. [Risas] DAVID J. MALAN: Este sitio web fue genial. De hecho, me puse un poco distraído. No es éste. Y este era increíble. Bueno, por lo que pensar en gatito tarde en la noche cuando haga esas decisiones. Todas las cosas bien, así que de nuevo a más diversión y menos graves, como condiciones. Muy bien, así que hablamos brevemente acerca de estos. Esto es algo que probablemente es bastante familiar de el mundo de Scratch. Y en el mundo de Scratch, tenemos esta necesidad a veces para ir a hacer bifurcaciones en el camino. Cualquiera de hacer esto o aquello o esto otro aquí. Y cuando queremos hacer esto, podemos usar, en C ahora, si esta else. Y entonces aquí tenemos expresiones booleanas. Por ejemplo, las expresiones booleanas aquí, podemos OR juntos, en el sentido de que tenemos esta condición OR esa condición. Podemos y juntos, en el sentido que queremos comprobar esta condición y siempre que. Y aquí tenemos una sentencia switch, algo que no es tan sintácticamente similares a ese tipo de condiciones, pero nos permite hacer el equivalente a if, else if, else if, else si, y similares con sólo enumerar caso por caso por caso por caso. Así que vimos aquellos última vez. Y entonces empezamos a tocar en cosas como bucles. Vimos una de ellas hace un momento. Pero no son estas construcciones de bucles otros. Por ejemplo, este de aquí. Así while (condición), hacer esto una y otra vez. Así que básicamente, lo que parece ser diferente entre este bucle for y el bucle mientras aquí? Este bucle for y este bucle while. ¿Sí? ¿Qué es eso? AUDIENCIA: [inaudible]. DAVID J. MALAN: Good. Así, mientras que en la condición de bucle, hay claramente más sintaxis. Hay una inicialización, hay una actualización. En un bucle while, no sólo por esta condición. Así que parece que es un poco recortada contra el de bucle, lo que significa que si queremos tener variables y queremos tener incremento, en realidad tenemos que hacer esto nosotros mismos. Así que permítanme seguir adelante y abrir gedit. Permítanme cambiar al aparato. Y vamos a hacer un ejemplo pequeño programa que distingue una de ellas de la otra. Y en el fondo de mi mente aquí, debo decir una cosa. Yo específicamente mencionó el nombre Tim. Tim era en realidad alguien que un estudiante trató de encontrar para hacer su tarea para ellos. No teníamos Tim en esa sección en particular. Así dan cuenta, no sea que yo reveló un estudiante, no era un estudiante. Era una persona al azar en Internet haciendo cosas por el año pasado proxy. Así nos encontramos con que, también. Así que en este caso aquí, déjame seguir adelante y abrir un nuevo archivo. Archivo, Nuevo. Esto me da una ficha de aquí. Déjenme seguir adelante y guardarlo como loop.c. Déjame ir y haga clic en Guardar. Y luego aquí, vamos a seguir adelante y comenzar a escribir # Include. Permítanme zoom in Ahora vamos a hacer int main (void). Ahora voy a seguir adelante y hacer for (int i = 0; i < oh, 10; i + +). Y ahora voy a seguir adelante y se imprimen de la estrella que me hicimos antes. Y luego, al final de este programa, sólo vamos a imprimir una nueva línea, sólo para que mi mensaje no se ve todo desordenado. devuelve 0. Parece sintácticamente correcta? Hasta ahora. Así que vamos a ver. Así que permítanme alejar la imagen, entra en mi ventana de terminal. Y déjame seguir adelante y ejecutar bucle, porque me llamó esta Lo loop.c. Así que loop. Parece que compile en Aceptar. Déjame correr bucle, y Enter ahora. Y parece que se han impreso 10 estrellas. Así que vamos a convertir esto en un bucle de tiempo y ver qué tipo de cuestiones que tropezar. Así que en lugar de esto, déjame entrar aquí y decir mientras que i es menos de 10 - me deja tirar del bucle for. OK, así que tenemos un par de problemas ya. Así que el estado es el mismo, pero obviamente estoy perdiendo la inicialización. Me falta el incremento. Entonces, ¿qué debería el compilador probablemente me dirá cuando trato de compilar este programa? ¿Sí? AUDIENCIA: [inaudible]. DAVID J. MALAN: Good. Así que va a decir algo así como no declarado - en este caso, la variable i. Y de hecho, el uso de identificador no declarado i. Y esto está en contraste con lenguajes como PHP y Python y Ruby, con la que algunos de ustedes podrían estar familiarizados, donde se puede sólo tipo de inicio con las variables queramos o no, no tiene que preocuparse de declararlas siempre explícitamente. En C y en lenguajes como Java y C + +, tiene que ser súper explícito. Y si quieres una variable llamada i, lo que tienes que decirme ¿qué tipo de variable que es. Así que vamos a tener que arreglar esto de la siguiente manera. Voy a tener que ir por aquí y escriba int i; por lo tanto, He declarado una variable llamada i. Ahora, me he saltado un paso. He obviamente no se inicia, pero vamos a ver si en ese al tope Clang marcas quejarse. Así que permítanme rehacer este programa. Muy bien, ahora es sólo quejarse por una razón diferente. "La variable 'i' no está inicializada cuando se usa aquí". Muy bien, así eso es bastante explícito. Inicializado sólo significa igualándola a un valor. Y no lo he hecho, así que voy a tratar de igual a 0. Ahora vamos a intentarlo de nuevo y volver a ejecutar Clang. Compilado este momento. Y estoy a punto de ejecutarlo. Pero gran bucle infinito de edad, porque he hecho el inicialización, he hecho la condición, pero nunca he hecho cualquier tipo de incremento. Entonces, ¿cómo puedo hacer la incrementación? Bueno, en un bucle while, se siente como que voy a tener hacerlo dentro del bucle, porque al igual que el primero semana ejemplos de hacer las construcciones de bucles, como con los calcetines y con la auto-escrutinio, que teníamos que hacer algo que al final, como ir a la línea siguiente. ¿Qué pasa si sigo adelante y hacer esto i + + aquí? Vamos a compilar ni siquiera esto. Atrápame ya. ¿Qué pasa aquí? AUDIENCIA: [inaudible]. DAVID J. MALAN: Así que definitivamente no es int. Soy yo. Y las llaves, como antes, sangría no es suficiente. Así que ahora tengo esta construcción. Así, mientras que i es menor que 10, imprima una estrella, entonces me incrementar. Y la forma en que un bucle mientras que las obras es que tan pronto como se pulsa el parte inferior del bucle, que en este caso se ve como la línea 10, que va a volver a la línea 6, en cuyo momento el se le examinará de nuevo. Y si i es todavía inferior a 10, vamos a hacer las líneas 8 y luego 9, entonces vamos a llegar a 10, y volver a 6, una y otra una y otra vez y otra vez, siempre que i es menor que 10. Así que vamos a volver a hacer hacer aquí. Bueno, hemos compilado bien. Permítanme volver a ejecutar el bucle. Y ahora lo que realmente parece que funciona. Así que más y menos aquí? Bueno, hasta ahora no hay en realidad un conjunto de plo - tan lindo. Bueno, eso fue un - ¡ah, eso fue un accidente. Muy bien, así que vamos a ir de nuevo al bucle for. Así que para los bucles son agradables porque son súper explícito. Y aunque son un poco torpe para escribir, es muy potente y le permite hacer varias cosas a la vez. Mientras que los bucles no parecen tener una gran cantidad de valor justo sin embargo, debido a que se siente solo tenemos que hacer más trabajo. Tenemos que poner la inicialización hasta aquí, la Actualiza aquí, y tenemos que recordar que hacer todo eso. Así que vamos a ver en el tiempo que en realidad prestan ciclos while sólo a sí mismos diferentes contextos, diferentes datos estructuras como listas y tablas hash, lo vamos a llegar a mitad del semestre. Pero por ahora, sabemos que hay este tercer tipo conocido como un do- while. Y hemos visto brevemente. Y esto podría ser útil con súper conjunto de procesadores 1. Cada vez que quieres hacer algo y luego comprobar si el usuario cooperó, y si no lo hacían, lo volvería a hacer, un hacer- mientras que el lazo se presta a ese tipo de lógica. Debido a que el orden de arriba a abajo aquí sugiere, Qué significa literalmente hacer esto. Y hacer esto una y otra vez, ¿qué podría ser? Tal vez signifique getInt llamando o GetString y luego comprobando el valor de getInt o GetString y luego gritar al usuario si no han cooperado al pedirles que una y otra vez y otra vez. Si usted quiere hacer algo una vez, a continuación, compruebe alguna condición. Así que vamos a probar esto. Permítanme cambiar esta realidad ahora a un bucle do-while. Y voy a seguir adelante y hacer lo siguiente. Así que haga lo siguiente. Vamos a hacer int i = getInt (), pero primero vamos a decirle al usuario qué hacer. Así que un poco diferente esta vez. "Dame un int". Así que voy a usar printf para eso. Y ahora me voy a ir por aquí, y voy a hacer esto mientras que i es, digamos, mayor que - vamos a ver, i es, digamos, menos de 0, o es i mayor que 10. En otras palabras, quiero un número del 1 al 9, sólo arbitrariamente. Así que estoy utilizando una expresión booleana combinada para asegurarse de que i es menor que 0 o mayor que 10, en la que caso voy a hacer este bucle aquí de nuevo. Así que de nuevo, hacer esto - mientras que i es menor que 0 o i es mayor que 10. Así que ahora vamos a seguir adelante y hacer esto una vez que hayas hecho esto. Vamos a hacer una simple comprobación rápida. printf ("Gracias, i es% d", i). Así que este sencillo programa pide al usuario un int, se asegura de que está dentro de un rango del 1 al 9 inclusive, y agradece al usuario, recordándoles lo que acaban de escribió, así como una prueba de cordura poco. Pero vamos a ver si esto funciona según lo previsto. Déjame ir a la cabeza aquí y volver a ejecutar make bucle. Hmm. "El uso de identificador no declarado 'i'". Eso es extraño. Pensé que resolver eso. Síntoma Mismo código diferente. ¿Sí? AUDIENCIA: [inaudible] en el interior de los dos, tenemos que [Inaudible]. DAVID J. MALAN: Exactamente. Así que este hecho nos lleva a un tema conocido como ámbito de aplicación. Resulta que C, una vez más, lo que realmente te lleva literalmente. Y si haces algo como esto donde se declara un int y luego asignar algún valor, pero lo hace dentro de un par de llaves, lo que C hace es que se supone que sólo quieren que esos 32 bits conocido como i de existir dentro de la contexto de esas llaves, en el contexto de líneas 6 a 9. Así que se declara, y se asigna un valor en la línea 8, pero en cuanto te dan fuera de línea 9 por debajo de la llave de cierre, i ya no está en ámbito de aplicación, por así decirlo. S-C-O-P-E. Ya no es en el contexto adecuado. Así que ahora no hay una i, así que es como si no tuviéramos incluso declaró en absoluto. Entonces, ¿qué es entonces una solución para algo como esto, si el razón es que se declara dentro de las llaves, que aparentemente es malo? He aquí? AUDIENCIA: [inaudible]. DAVID J. MALAN: Si. Así que podemos inicializar exterior. Así que permítanme seguir adelante y eliminar las partes de declaración mediante el cual Puedo especificar el tipo, y déjame hacerlo aquí. Así, en la línea 5, que ahora dice "Dame un int." Llámelo i. Observe que en la línea 9, que no quiero hacer esto, porque yo ya tiene los 32 bits. No quiero pedir a la computadora por un diferentes bits de 32. Quiero usar esos mismos 32 bits. Y ahora porque me está declarada en la línea 5, sigue siendo legítimo para usarlo en la línea 11 y la línea 12. Así que voy a tratar de volver a compilar esto y ver Clang si deja de gritar. hacer lazo. Así que ahora es "la declaración implícita de la función 'GetInt' no es válido en C99. "¿Qué es eso? ¿Sí? AUDIENCIA: [inaudible]. DAVID J. MALAN: Si. Así que ahora que estoy realmente utilizando getInt, esto no es algo que sólo viene con C. Esto viene de CS50. Así que tenemos esto aquí. Y permítanme volver al prompt abajo aquí y volver a ejecutar make. Bueno, por fin. Ahora que hemos resuelto eso y el otro error. Permítanme ahora se ejecutan bucle y ver qué pasa. "Dame un int." Voy a darle 11. Voy a darle -1. Voy a darle foo. Voy a darle 5. Y ahora es en realidad funciona. Sin embargo, el indicador cambia por una razón aquí. ¿Por qué lo dices reintentar una de estas veces, pero me da un int las otras tres veces? ¿Por qué es que el comportamiento diferente? AUDIENCIA: dio una cadena. DAVID J. MALAN: ¿Cómo? AUDIENCIA: Usted le dio una cadena. DAVID J. MALAN: Si. Así que le dio una cadena en este tercer intento, cuando escribí foo. Foo es una cadena. Obviamente no es un int. Y la forma en que CS50 ha implementado getint es que nos no comprobar si algo es menor que 0 o mayor que 10 para ti, porque ¿cómo podemos saber de antemano qué tipo de int quieres? Pero mínimamente pueda comprobar por usted, ¿el usuario por lo menos escriba un número entero? Y si no lo hacían, les gritamos al usuario escribiendo "reintentar" en la la pantalla. Así que ahora tenemos un programa que está bucle. Bien. Ahora, ¿cuál de ellos es el tipo de la construcción mejor? Así que aquí es donde las cosas se ponen un poco desordenado, la hecho de que usted tiene que recordar para declarar una variable aquí si quieres usarlo dentro de algunos llaves y exteriores. Pero incluso si esto le parece un poco críptico al principio mirada, sólo una vez más, recordar la lógica simple. Con el fin de usar nada en C, si se trata de una función o que es una variable, hay que incluir si se trata de una función en alguna biblioteca, o usted tiene que declarar. Pero ahora es necesario tener en cuenta el hecho adicional de que usted lo está declarando en el alcance adecuado. No lo estás poniendo demasiada fuerza en el interior de los paréntesis. Así que déjame en realidad revertir. Si volvemos a nuestro por ejemplo de antes, y me voy para volver a int, int i = 0; i <10, i + +, y yo printf hacer estrellas, como este, y luego paren cerca y ahora printf i es ahora - de acuerdo con la misma lógica, ¿qué pasará cuando trato de compilar este programa? AUDIENCIA: identificador no válido. DAVID J. MALAN: Así que es otro identificador no válido, identificador no declarado. Ahora, la razón es un poco diferente. Obviamente hay ni llaves aquí, pero el mismo idea, la misma historia de alcance se aplica. Si Ud. se ha declarado una variable como yo dentro de un bucle for, incluso si no se ha escrito explícitamente el rizado tirantes, piensa en ellos como mentalmente aún estar allí, en el que caso i es válido sólo dentro del bucle for. No es válida una vez que llegue a la línea siguiente, que a su este caso es ahora 10. Así que sólo unas pocas cuestiones de alcance y similares. Muy bien, alguna pregunta? Muy bien, así que esto es una especie de un pequeño programa trivial, imprimir sólo las estrellas pequeñas. Pero vamos a ver si te acuerdas de esta canción aquí. Esta es una canción increíblemente molesto a los niños a cantar en el autobús escolar y similares. Pero lo bueno de esto es que tiene esta ciclicidad, por lo que es "99 botellas de cerveza en la pared, 99 botellas de cerveza. Tome uno abajo, pase a su alrededor, 98 botellas de cerveza en la pared. "Y entonces la canción se repite el 97, luego 96, luego 95, 94, hasta llegar a 0 si usted realmente tiene que lejos en el autobús. Así que este es un buen programa para ordenar de implemento, porque mi Dios, si pudiera implementar esto con unos pocos líneas de código, se puede escupir las letras enteras a este canción con bastante rapidez. Pero en el camino, podemos empezar a molestar ahora, aparte algunos de estas construcciones básicas de bucle y también ahora introducir funciones que nos escriben, devolver valores que pasa a su alrededor. Pero primero, ¿por qué no seguir adelante y tomar nuestro cinco minutos romper aquí? Y cuando regresemos, vamos a cantar esta canción. De acuerdo, estamos de vuelta. Y cuando digo que ahora vamos a cantar esta canción, me refiero a programación, no verbalmente. Así que aquí tenemos beer1.c, que es una aplicación de la presente canción en particular. Y sólo para que quede claro, para quienes no están familiarizados con lo que esto se parece, déjame ir por delante y hacer beer1, Enter. Ahora voy a correr beer1, y lo que vamos a ver - ¿Cuántas botellas de cerveza habrá? Voy a escribir en el 99, como dice la canción. Intro. Y ahora, si nos desplazamos a través de - oops - si desplazarse a través de todo esto, veremos que esto efectivamente cantar toda la canción. Espera un minuto. Mi barra de desplazamiento es un poco desordenado. Vamos a usar la ventana más grande. Así beer1, 99, ahí vamos. Así que aquí tenemos toda la canción, cantada mucho más rápido mediante la ordenador de lo que podría haber sido por nosotros. Así que notar, sin embargo, la naturaleza cíclica aquí. Dice 99, luego 99, luego "tomar uno abajo, pasar alrededor ", entonces 98. Y ahora lo repite una y otra vez. Así que esto es realmente una oportunidad perfecta para algún tipo de construir un bucle. Tenga en cuenta que yo soy una especie de corte de una esquina aquí. Tenga en cuenta que lo que estoy diciendo "98 botellas de cerveza en la pared, 97 botellas de cerveza en la pared ", y que era tan que cuando lleguemos a una botella de cerveza, no tengo que preocuparse de la gramática Inglés. Pero también podemos arreglar esto con un poco más de un si condición, tal vez. Si este número es singular, seguir adelante y decir "botella", de lo contrario si es plural, por ejemplo "botellas". Pero, por ahora, estoy completamente de corte de la esquina. Así que vamos a ver lo que tenemos aquí. Así que tenemos algunos comentarios en la parte superior. Estoy incluyendo estas dos bibliotecas, hemos sido comúnmente. Y ahora me baje hasta la primera propias líneas de código. La línea 17 inicia principal. Línea 21 y 20 tiene cuántas botellas de cerveza habrá? Y entonces yo llamo getInt. Y ahora tengo un poco de una comprobación de validez. Así que esta es una convención que ahora vamos a empezar a adoptar más rigurosamente comprobar la entrada del usuario. A veces simplemente no quieren que les preguntará de nuevo y una y otra vez. Si el usuario mete la pata y no coopera, está bien. Deje de fumar y no se ocupan de ellos. Y eso es lo que estoy haciendo aquí. Si n es menor que 1, sólo voy a gritar a los usuarios, "Lo siento, eso no tiene sentido." Y luego me voy a arbitrariamente devolverá 1. Así que de nuevo, esto es sólo una convención para acostumbrarse. Por el momento, asumir la fe. Pero hasta ahora, siempre hemos estado regresando 0, porque hemos dicho devolviendo 0 denota qué? AUDIENCIA: Éxito. DAVID J. MALAN: Éxito, eso es todo. Así que ahora que finalmente estamos empezando a pensar en que no son éxitos - en otras palabras, casos de esquina, condiciones de error - ahora tengo un suministro infinito, o por lo menos cuatro mil millones posibles cosas que pueden salir mal en mis programas. Y puedo comenzar a asignar los números individuales. Ahora, por lo general es suficiente para devolver sólo algo distinto de 0. Así que vamos a volver simplemente 1 por ahora. Pero el motivo de la devolución 1 es que tan pronto como regrese 1, ¿sabes qué pasa con el resto del programa? Que se detenga. Eso es todo. Así que el hecho de que me estoy volviendo 1 es eficaz un cortocircuito en la ejecución de este programa, de manera que nada por debajo de la línea 27 se siga ejecutando. Tan pronto como se vuelve principales, que es. Muy bien, así que si el usuario hace cooperar y llegar a la línea 30 porque escrito en un número legítimo, he aquí mi aplicación de esta canción. Así que primero imprima un carácter de nueva línea, sólo por estética. Ahora tengo un bucle for. Y noten que estoy haciendo las cosas un poco de una dirección diferente. Yo no tengo que hacer menos, no tengo que hacer + +. Yo en cambio puedo decir inicializar una variable i e igualarla a n, el número que el usuario escribió en, y luego hacer lo siguiente, por lo que siempre y cuando i es mayor que 0, i - una vez que haya terminado de una iteración de este bucle. Por lo tanto, puede contar con un bucle for también. Ahora, esta es la semana más o menos una cosa ahora, con printf. Así impresión "% d botellas de cerveza en la pared." Imprimir "% d botellas de cerveza. "" Tome uno abajo, pase a su alrededor. "Imprimir "% D botellas de cerveza en la pared." Por lo que es aún% d, pero cuenta de que el argumento de printf está cambiando. Después de la coma, yo tengo, porque quiero decir 99. Después de este coma, yo tengo, porque quiero decir 99. Después de este coma, i have - 1, porque quiero decir 98 en esta primera iteración, y así sucesivamente. Y ahora aquí, sólo tengo un poco de observación poco estúpido. Y luego la línea 42, que devolver 0 por convención, lo que significa que todo está bien. ¿Y qué si me metió la pata? ¿Qué puede un error muy común aquí será? Bueno, ¿y si accidentalmente dicho bien, yo quiero contar a 0, quiero 0 botellas de cerveza en la pared? Por eso digo, i es mayor o igual a 0. ¿Qué va a ser el síntoma que ahora veo si me recompilar beer1 y ejecutarlo? AUDIENCIA: Negativo. DAVID J. MALAN: Sí, va a ser negativo. Este es un error de cierre por una parte, un increíblemente error común de hacer. Que en realidad se remontan a la ventana de terminal y hacerlo aquí, para que podamos ver a la vez. Intro, 99 botellas de cerveza. Cerca, pero fuimos muy ligeramente demasiado lejos. Cantamos la canción demasiado abajo, de manera que ahora golpear el número negativo. Así que no acaba de funcionar. Muy bien, así que fácilmente se puede arreglar volviendo a la manera que una vez fue. Pero, ¿cuáles son algunas oportunidades ahora para mejora? Bueno, déjame abrir beer2.c y baje aquí y echar un mira esta versión. ¿Qué es lo primero que salta a la vista tan diferentes en esta versión aquí? AUDIENCIA: [inaudible]. DAVID J. MALAN: Sí, así que no soy yo, porque se le ocurrió a me sabes qué, yo estoy preguntando al usuario para n, y entonces estoy estableciendo i igual a n, y luego me i cambiando, pero nunca estoy n tocar de nuevo. Entonces, ¿qué diablos era el punto de que la asignación de otros 32 pedacitos llamé sólo para que yo pueda tener una variable diferente? Así que en este caso, en cierto modo me reconoció que innecesario diseño característica. Y ahora voy a decir mientras que n es mayor que 0, vaya adelante e imprimir la misma canción, pasando por una n al printf como la El segundo argumento, y n - 1 como el segundo argumento aquí. Y luego en cada iteración de este bucle, seguir adelante y sólo decrementar n sí mismo. Ahora, funcionalmente, este programa va a ser idénticos. Si escribo en el 99, n comienza a las 99. Yo decremento, reducción, disminución, decremento. Voy a llegar hasta el final con "Una botella de cerveza en la pared, una botella de cerveza. Tome uno abajo, pase a su alrededor. 0 botellas de cerveza en la pared. "Al final, lo hice porque obtener la condición correcta. Es mayor que 0. Yo no cometer este error. Entonces, ¿qué es mejor, una versión o la versión dos? Eso he oído un montón de murmuraciones para dos. ¿Por qué dos? ¿Qué es eso? AUDIENCIA: [inaudible]. DAVID J. MALAN: Oh, está bien. Así que no esté por debajo de 0, pero recuerda, en una versión, la versión correcta original no ir por debajo de 0 tampoco. Así que recuerde que esta es la versión correcta. Así que vamos a por lo menos comparar las dos versiones correctas. ¿Qué es un argumento a favor de la versión dos que, mmm, mejor? ¿Sí? AUDIENCIA: Se utiliza menos espacio. DAVID J. MALAN: Bueno, por lo que ocupa menos espacio, ¿no? Considerando que una versión de 32 bits utilizado para n, y luego otra 32 bits para i. Versión dos sólo utiliza 32 bits para n, de modo que parece ser una ventaja. Otros pensamientos? ¿Alguien quiere argumentar en favor de uno? ¿Sí? AUDIENCIA: Usted tiene que usar la línea adicional de código de n -. DAVID J. MALAN: Bueno, claro. Así que eso es justo. Así que este justo, al menos para mí - Quiero decir, esto realmente se siente un poco más desordenado, el hecho de que No puedo ordenar de encapsular toda mi lógica en un hermosa línea, el bucle for, ya que el bucle for puede. Aquí, como que tengo que virar en este n - al final del bucle, porque es lógicamente necesario. Pero es como que me frota el camino equivocado, simplemente porque parece independiente de la lógica de aquí, aunque, de nuevo, es necesario. Otros pensamientos? ¿Sí? AUDIENCIA: [inaudible]. DAVID J. MALAN: Si. Entonces, ¿qué pasa si en lugar, al final de la canción, quería imprimir de nuevo el nombre de la canción? Al igual que "Gracias por jugar 99 botellas de cerveza", o algo tonto como eso? Pero el punto es, que quería tener acceso al valor original. El hecho de que haya mutado o cambiado en todos los n iteración, por lo que han destruido su valor original significa que no se puede hacer eso al final. Ahora, sin duda, es evidente que no quieren hacer que en este programa. Entonces, ¿quién le importa? Pero eso es un punto muy válido. Y para ser honesto, realmente no hay una derecho de contestar aquí. Los dos son igualmente correctos. Podría estar convencido de cualquier manera. Me gustaría decir que, en general, es un buen principio si pide al usuario un valor y almacena en una variable como n, sólo una especie de cuestión de principios, es probablemente bueno para mantener esa situación. Y todos los datos que desea mutar una y otra vez, sólo dése una copia de esa variable, sólo para que tienen acceso a la original. Usted está gastando más de 32 bits, pero la realidad es esta computadora tiene, como, dos gigabytes de RAM en estos días, y estamos sutilezas más de 32 bits? Realmente no es una gran cosa. E incluso en este dispositivo aquí, con una media de un concierto o de una gigabyte de RAM, 32 bits frente a 64 bits, no es una gran cosa. Ciertamente, hoy en día, va a ser mucho abrumados por el tamaño del programa en sí, que va a ser de varios cientos kilobytes, si no en unos pocos megabytes, en estos días. Preocupaciones tan razonable, no una respuesta correcta. Pero al menos esos son los pensamientos que deben empezar a pasan por tu mente? Debido a que en conjunto de procesadores 0, a pesar de que en realidad sólo se espera corrección, o por lo menos que renuncie a varios bugs es posible que haya encontrado, a medida que avanzamos, el diseño es va a ser otro aspecto clave, tanto de la escritura de código y también evaluar nuestro código. Y así, al menos, dar cree que este tipo de cosas. Y sólo porque algo funciona no quiere decir que sea bueno, no quiere decir que esté bien diseñado. Y esa es una de las cosas que los becarios de docencia e conjuntos de problemas nos ayudará a molestar parte con el tiempo. Bueno, ¿qué pasa, vamos a decir que esta versión aquí? Déjame hacer algo un poco más sexy aquí en un momento. En primer lugar quiero deshacerme de esto. Y ahora vamos a arreglar este problema gramatical. Así pues, en esta versión, quiero fijar la gramática de modo que, en lugar de simplemente decir s entre paréntesis, como "botella" o "botellas" - No quiero cortar esa esquina - También quiero imprimir dinámicamente la palabra "botellas" o "botella", utilizando para ello estos marcadores de posición% s hoy. Así que tengo que comprobar condicional cuál es el valor de i. Y si es 1, lo que quiero decir "botella", y si es algo otra cosa, quiero decir "botellas". Así que vamos a tratar de hacer esto. Así que si i == 1, entonces déjame seguir adelante y declarar - Necesito una cadena, así que voy a hacer la cadena s1, porque es la primera cadena que me importa en este momento. Voy a decir "botella". Y entonces, vamos a ver, la cadena de s2 - y voy a explicar a dónde voy en un momento - "Botellas". Así que recordar que, en esta canción, tenemos que ser capaces de para imprimir las cosas, dos palabras diferentes en potencia. Así que si miramos hacia atrás aquí, note que cuando lleguemos a este ejemplo aquí ", dos botellas de cerveza en la pared, dos botellas de cerveza, tome uno abajo, pásela alrededor ", quiero esta cuarta línea de decir ahora "una botella de cerveza en la pared ". Así que tengo que decidir, es lo que quiero decir" botellas "o "Botella"? Así que voy a decir arbitrariamente, de acuerdo, Voy a declarar ahora una variable llamada s1, cadena uno, que se va a poner enchufado aquí y aquí también, porque estas palabras son siempre idénticos, sólo por el naturaleza de la canción. Y yo voy a llamar s2 cualquier palabra que quiero finalmente aparece aquí abajo. Ahora, literalmente, 99 veces de cada 100, que va a ser el mismo en ambos casos, porque 3 es plural, es 2 plural, 4 es plural. Pero en este caso de la esquina, donde llegamos a 2 y luego 1, o ni siquiera el 1 y luego 0, necesito esta lógica. Así que tengo que pasar algún tiempo en mi código de conseguir ese derecho. Así que si hago esto, si i == 1, entonces s1 igual a "botella" y s2 igual a "botellas", porque esto será para un botella, y esto será para botellas 0. Y aquí, ¿qué representa esto? Para que quede claro. Esto es sólo un comentario. Así que el hecho de que usted puede tener una sola línea comentarios que significa puede comentar su código como este, pero común a otro paradigma, también, es que si usted tiene una frase corta que super- desea ponerse y es simplemente más fácil de leer para poner lo justo al final de la línea de código, puede absolutamente hacer algo como esto. ¿Y ahora qué si lo hago? Porque si no es igual a 1. Así explosión igual a - signo de exclamación se conoce como "bang". Así explosión = 1. Así que si no es igual a 1, ¿qué lugar quieres hacer? Bueno, la primera palabra que quiero ser qué? Así que debe ser una cadena de "botellas" para botellas plurales, y entonces esto va a ser plurales "botellas", así, por ahora. Y vamos a ver si en realidad esto nos lleva a hacia dónde queremos ir. Así que ahora si me desplazo hasta aquí, fíjese que estoy conectando no sólo yo, sino s1. Estoy conectando iy s1. Y a continuación, aquí abajo, estoy menos 1, que es el mismo que antes, pero s2. En otras palabras, quiero que la palabra Inglés a cambios de acuerdo en esta lógica. Ahora, ya hay algunos problemas en este código. ¿Qué se ha roto ya fuera de la puerta aquí? ¿Sí? AUDIENCIA: [inaudible]. DAVID J. MALAN: Exactamente. Así que ya has violado la lección de alcance. Así que he declarado s1 y s2, pero lo he hecho dentro de llaves, lo que significa, sí, este código funcionará hasta hasta que la línea 42, pero tan pronto como llegué a la línea 43, ¿adivinen qué no ya no existe? Bueno, ¿adivinen qué ya no está en el alcance - ni s1 o s2. Así que tenemos que arreglar esto. Así que permítanme eliminar las declaraciones. Y voy a dejar los nombres de las variables y eliminar este aquí y eliminar este aquí. ¿Y en qué líneas deben declarar que realmente estas cosas? AUDIENCIA: [inaudible]. DAVID J. MALAN: Sí, por lo que probablemente hasta aquí, 33-ish. Así cadena s1 y s2 cadena. Y resulta que, no puedo hacer esto. Si usted está declarando dos variables del mismo tipo, usted puede simplemente utilizar una coma y hacer que en C. Todos bien, así que ahora tengo dos variables - s1 y s2. Los estoy asignando valores en estos condiciones aquí, o aquí. Y entonces yo estoy usando abajo. ¿Qué tan bien está esto ahora va a funcionar? Bueno, aún así es un poco buggy, pero vamos a ver por lo menos lo lejos que hemos llegado. Así que déjame ir adelante y hacer beer3. ¿Es esta beer3? Sí, este es beer3. Y ahora déjame seguir adelante y ejecutar beer3. 399 99. Probablemente podamos pasar la mayor parte de ellos. Y aquí abajo, mira eso. "Una botella de cerveza en la pared, una botella de cerveza, tomar uno abajo, pásela alrededor, 0 botellas de cerveza en la pared. " Pero estoy llamando su atención sólo a la mitad de la solución. Un poco fastidiado aquí. Así que parece que los casos de esquina surgen cuando i es igual a lo que dos valores? AUDIENCIA: 2, 1. DAVID J. MALAN: 2 y 1. No 1 y No es 1. Es realmente sólo estas dos últimas estrofas de esta canción. Entonces, ¿qué debo vez quieres hacer? Así que parece haber capturado el caso de que si i es == a 1, a continuación, la primera palabra es "botella", pero la segunda palabra es "botellas". Pero aquí, quiero cambiar esto sea == 2. Y si este es el caso, ¿qué quiero la primera palabra que sea? AUDIENCIA: "Botellas". DAVID J. MALAN: "Botellas", así que para dos botellas. Y entonces aquí esta palabra debe ser - AUDIENCIA: "Botella". DAVID J. MALAN: "Botella", en singular. Muy bien, vamos a reducir, volver por aquí, volver a ejecutar make, vuelva a ejecutar beer3, escriba 99 otra vez. Está bien, "Segmentación fallo (core dumped)". ¿Qué he hecho mal? AUDIENCIA: Usted no tiene un valor de [inaudible]. DAVID J. MALAN: Ah, excelente punto. Muy bien, ¿y qué está mal aquí? Así fallo de segmentación, y estamos realmente va a ver esto unas cuantas veces en el futuro, deliberadamente. Pero por ahora, ¿qué significa esto realmente? Un fallo de segmentación casi siempre significa que usted tiene de alguna manera trataron de acceder a la memoria, la memoria RAM en su ordenador, que no es de su propiedad, que no se han pedido al sistema operativo para. Así que en este caso, darse cuenta de lo que he hecho, que es defectuoso en mi lógica. He asignado s1 y s2 un valor si i es igual a 1. También he hecho que si i es igual a 2. Pero no lo he hecho en el infinito número de otros posibilidades - en particular, 3 o 4 o punto, punto, punto, 99. Así que una solución para esto podría ser sólo vamos a tiene una condición más. Y déjame entrar aquí y decir s1 es igual a - ¿qué debería estar aquí? AUDIENCIA: [inaudible]. DAVID J. MALAN: "Botellas", porque en el caso común, es simplemente lo mismo. Así que equivale Lo dijeron ellos, "botellas". Así que para plural botellas, y luego hasta aquí, para botellas plurales. Bien, ahora quiero volver a mi ventana de terminal, recompile, vuelve a correr. 99. ¡Menos mal. Y vamos a hacer una simple comprobación rápida. Técnicamente, nos gustaría leer todo esto para asegurarse de que si es correcta, pero vamos a ver los menos culpables conocidos. 3 botellas, 2 botellas, 2 botellas, 1 botella, la botella 1, 0 botellas. Parece que nos hemos fijado, al menos, por ahora. Pero el problema aquí es que lo que es un lío terrible dios es sólo para resolver un estúpido de un carácter detalle gramatical. Así que hay una especie de razón que cortar esta esquina anteriormente, debido a que es completamente molesto tener que escribir este código mucho. Pero resulta que no hay manera un poco más elegantes de expresando exactamente lo mismo. Y podemos hacerlo de la siguiente. Permítanme dejar esto en la pantalla por un momento y introducir algo conocido como un operador ternario. Esto es un poco de una sola línea que acaba de decir para hacer que nuestra vive un poco más sexy, según lo prometido. Y yo voy a hacer esto de la siguiente manera. Dame una cadena llamada s1, y me dejó asignar de la siguiente manera. (I == 1)? "Botella", de lo contrario "botellas". String s2 gets (i == 2)? "Botella", de lo contrario "botellas". Entonces ¿cuál es la diferencia? Estas dos líneas de código, a mi juicio, puede reemplazar todo este lío. Así que yo lo llamo un lío, porque es como que me frota la manera equivocada de que es tantas líneas de código. No está mal. No es un mal diseño. Al igual, esto es perfectamente correcto y perfectamente bien. Sin embargo, la codificación se vuelve tedioso si tiene que expresarse así maldito específicamente una y otra vez y otra vez con una simple escenario como este. Así que C tiene algunos atajos, así. Así que esencialmente está diciendo declarar una cadena denominada s1 y o bien asignar este valor o si este valor es i == - lo siento, yo debería decir esto con más claridad. Declarar una variable de s1, asignarle este valor si esto es cierto. De lo contrario, asignar este valor. En otras palabras, esta es una especie de forma de una línea de diciendo que si otra cosa pero haciendo un trabajo a lo largo del camino. Así que si i es 1, entonces adelante y llamar a esta "botella". Y entonces esto otro, lo llaman "botellas". Mientras tanto, el s2, segunda palabra que hay que definir, si i es igual a 2, vamos a establecer s2 a "botella". De lo contrario, ajústelo en "botellas". ¿Y qué esto quiere decir ahora es que puedo pasar por esto y eliminar todos los esas líneas de código. Y cuando digo, un poco ridículo, que es ahora sexy, es más sexy en el género de sentido estilístico. El hecho de que funcionalmente, este código es en realidad va a hacer exactamente lo mismo. Y aunque al principio puede parecer un poco críptico al principio vista, ya que no he visto antes de esta construcción, que había argumentan que es en última instancia, va a ser mucho más fácil de leer y mucho más fácil para nosotros los seres humanos a una especie de entender, porque ahora usted puede leer la código en una sola línea. Todavía es similar en espíritu a la una si, cuando sea condición y entonces esto es lo que hay dentro de si y el este es lo que hay dentro de la persona. Pero podemos hacer esto sólo mucho más elegante. Y si ahora vuelvo a mi terminal, después de haber eliminado todos de las líneas y los reemplazó con sólo los dos, recompilar, re-run botellas de cerveza con el 99, el aviso de que mi gramática es, de hecho, sigue siendo correcta. Así que de nuevo, algo para empezar. 2 botellas de cerveza, una botella de cerveza. Parece correcto. Si. Así que tenemos una solución mucho más sucinta. Así que esto, también, a medida que se sienta más cómodo con C, no necesariamente con el conjunto de procesadores primero o segundo incluso, pero darse cuenta de que estas construcciones nos permiten hacer las cosas cada vez más elegante. Ahora vamos a hacer otra cosa aquí. Déjenme seguir adelante y abrir return1.c. Ahora vamos a empezar a resolver otro problema de una manera que nos permite escribir código más sofisticado. Así que este es un programa pequeño y sencillo cuyo propósito en la vida es para incrementar los valores. Y, de hecho, vamos a dar un paso atrás. Déjame hacer esto manualmente. Déjame hacer incluir y int main (void). Y déjame llamar a este increment.c. ¿Y qué es lo que quiero hacer? Voy a seguir adelante y decir algo como - vamos a llamar a los números de la misma - x int. Así int x obtiene 2; printf x es% d, línea nueva, x. Así que estoy escribiendo rápido, pero tipo de cosas familiares ahora. Entonces voy a hacer x + +. Entonces me voy a imprimir la misma frase de nuevo. Y luego voy a devolver 0 sólo para salir del programa. De acuerdo, este es un programa que incrementos de un número. Se va a inicializar primero algo a 2, y entonces es va a incrementar e imprimirlo de nuevo. Así que vamos a correr incremento, programa increíblemente simple. Pero supongamos ahora que quiero para el cubo de valor, también lo hacen algo un tanto arbitraria. Y yo realmente quiero hacer x obtiene el cubo de la misma. Así que podría utilizar lo que se llama la función pow, pero no lo hago realmente sabe dónde está todavía. Así que voy a hacerlo de la manera pasada de moda. x veces esto es igual a X veces x por x. Así que estoy cubicar el valor, multiplicarlo por sí mismo de nuevo y una y otra vez, para que podamos conseguir el poder de 3 en este caso. Así que ahora los números que debo imprimir debe ser, como veremos aquí - hacer de incremento, por lo que en realidad no es realmente incrementar ya, pero vamos a dejar el nombre por sí solo - 2 y luego 8. Ahora, tenemos el comienzo de una oportunidad para el perfeccionamiento aquí, por lo que esta cosa cubicación de multiplicar un número por sí mismo por sí mismo por sí mismo se siente como esto sólo podría ser útil tener una función, al igual que alguien decidió años atrás - ya sabes, un poco útil si uno de nosotros se sienta y escribe printf para que el resto del mundo puede usarlo, ¿Por qué no nos sentamos a escribir una función llamada cube que hace esto cubicación para nosotros, así que no tiene que manualmente poner en práctica el concepto de cubicar valores aquí? Así, un ejemplo sencillo, pero vamos a seguir adelante y utilizar esto como una oportunidad de escribir nuestra propia función. Así que hasta ahora, sólo hemos utilizado principal, y hemos utilizado otros funciones de las personas, pero no hemos escrito nuestra. Así que aquí vamos. Voy a seguir adelante y escribir una función llamada cube. Y voy a tener que tomar una entrada. Por lo que su aportación va a ser un número entero. Y qué va a hacer? Va a declarar int salida = entrada de tiempos entrada tiempos de entrada. Y luego se va a devolver ese producto. Y entonces tengo que ser específico ahora. Esta función va a devolver un int. Así que aquí es, entonces, cómo le gustaría escribir sus propias funciones. En primer lugar, decidir cuál es el nombre de su función va a ser. Y, en general, algo explicativo es bueno, así que voy yo llaman cubo. Entonces usted tiene que especificar lo que se va a devolver, lo que es su salida va a ser. Y no tenemos muchas opciones todavía. Int, char, float, bool, string. Por ahora, me voy a quedar con un int, porque lo quiero para devolver un entero. Entonces usted tiene que especificar cuáles son sus insumos, si los hay, son. Y si cube toma un argumento, toma algo entre paréntesis, usted tiene que dar ese argumento un nombre para que se le puede llamar algo como lo estamos implementando o escribir esta función, y hay que darle un tipo, que en este caso va a ser int. Así que en resumen, el cubo es una función que toma un entero como entrada y devuelve un entero como salida. Entonces, ¿qué hacer con esa entrada? Pues bien, en la línea 14, declaro una variable de salida se llama, y ​​yo asignarle el valor, Entrada de veces veces de entrada. Y entonces vuelvo salida. Entonces, ¿cómo puedo usar esto entonces? ¿Qué puedo cambiar estos caracteres resaltados en línea 7 sea, ¿te parece? AUDIENCIA: [inaudible]. DAVID J. MALAN: Sí, así cubo de x. Entonces x es una variable, lo que significa que tiene algún valor. Afortunadamente, es de tipo entero. Y debido a que x es un int, eso significa que puedo pasar a cubo. Y a pesar de que estoy reemplazando el valor de x con el valor x de cubo, como ha sido el caso hasta ahora, cada vez que tener signo igual y una línea de código, las cosas en el derecho se ejecuta y luego se asigna a la valor de la izquierda. Así que el orden de las operaciones es como esperaríamos. Así funciona esto? Bueno, déjame bajar aquí. Permítanme abrir mi ventana de terminal. Permítanme hacen incremento, Intro. "Declaración implícita de 'cubo' no es válido en función C99. "Como un aparte, C99 se refiere al lenguaje C, ya que era definido en 1999, que era una actualización sobre la versión de 1989, que es una actualización sobre el original. Así que eso es todo lo que eso significa. Entonces, ¿qué significa que "la declaración implícita de "cubo" función no es válido? "Es justo aquí. Es allí, en la línea 12. AUDIENCIA: [inaudible]. DAVID J. MALAN: ¿Qué es eso? AUDIENCIA: No es antes. DAVID J. MALAN: No es antes. Así que esta es la cosa. C es un poco estúpido, o los compiladores de C son un poco estúpido. Realmente sólo hacer lo que les dicen que hagan. Y, en particular, sólo leer su código de arriba a abajo, de izquierda a derecha. Así que si el compilador, Clang, está leyendo el código, línea 1, se da cuenta de cómo hacer esto. Oh, aquí llega principal. Bueno, déjame seguir adelante y declarar una variable x. Permítanme imprimir algo. Línea 7, ¿qué diablos es el cubo? No es declarada en stdio.h. No viene con C. No tengo ni idea de qué hacer. Y así Clang sólo rescata y se cierra con el mensaje de error. Así que podemos arreglar esto en un par de maneras. Podemos enseñar lo Clang cubo es donde con sólo mover el declaración es. Así que corté y pegué encima de principal. Ahora se dan cuenta que sólo porque principal ya no es primero, es siendo ejecutado por defecto. Principal es principal. Es el nombre de la función por defecto. No importa dónde se encuentra en un archivo. Pero al menos ahora Clang ha visto cubo antes de usarlo. Así que vamos a ver si Clang es más feliz ahora. Haga incremento, sí compilar este momento. Déjame correr incremento. Y, de hecho, parece estar funcionando. Ahora, usted puede llegar a escenarios donde eventualmente no es factible poner todas las funciones por encima de cualquier otra función. Te quedas atascado en este bucle infinito en la realidad, donde este tipo quiere estar aquí, pero este individuo tiene que estar allí. Así que eso no siempre funciona. Así que gracias a Dios, C tiene una solución más elegante. Voy a poner esto donde estaba, sólo porque prefiere, como una cuestión de principio, que siempre lo principal en la parte superior, porque es sólo agradable ver lo que este programa hace por defecto. Y lo que voy a hacer aquí es declarar lo que se llama un prototipo. Voy a volver a declarar mi función cúbica, literalmente, copiar y pegar. En realidad, eso no es literal. Así que, literalmente, copiar y pegar la línea 15 por encima de la línea 6. No importa lo que la línea esta se haya apuntado. Le pasa a estar en la línea 4. Pero tiene que ser antes de principal. Pero note la diferencia. Línea 4 termina con un punto y coma, lo que significa bueno, Clang, toma mi palabra de que existe una función llamado cubo que toma un int y devuelve un int. Pero no voy a decirte lo que es. Sólo sé que me comprometo a decirle el tiempo. Y de hecho, ahora que está bien que se trata a continuación. Así que este es generalmente mejor, porque entonces en la parte superior de su archivo, usted puede recitar de un tirón, de tiro rápido, una línea cada uno, lo que los nombres de sus funciones son, cuál es su las entradas son, cuáles son sus salidas son. Y para ser más claro, la entrada general significa discusión o parámetro, sinónimos. Salida significa valor de retorno, lo que hace mano hacia mí. Así que en este caso que nos ocupa, el cubo se ha declarado en la parte superior, pero define, también conocido como aplicarse, en la parte inferior. Así que ahora vamos a volver aquí y volver a hacer éste. Así que ahora vamos a seguir adelante y volver a ejecutar make, vuelva a ejecutar incremento. Y ahora parece estar funcionando muy bien. Así que ahora podemos seguir adelante y factorizar algo así como la cerveza ejemplo en esta cuarta versión. Así que me baje aquí. Y note que tipo de tomó en serio esta lección ahora. El hecho de que yo estaba cantando la misma estrofa una y otra una y otra vez, la línea de coro en la canción misma, se sintió Como por qué no lo hago factor que en una función? Y de hecho, esta debe ser una de las motivaciones. Además del hecho de que otra persona en el mundo que desee utilizar una función de cubo - esa es una buena razón para factorizar algo y escribir su función personalizada - si hay un trozo de código en su programa que sólo hace sentido conceptual, que tipo de necesidad de darle un nombre - como en este caso, chorus - entonces usted puede escribir de manera similar que como una función separada. Usted no tiene que escribir todo en principal si sólo se siente más limpio para separar y darle un nombre. Así que en este caso aquí, fíjate que tengo un comentario sobre esta función que sólo canta sobre el números especificados de botellas. Nótese aquí que no es necesario llamar a estos cosas de entrada y salida. De hecho, esta vez me acaba de llamar mi entrada B para botella. Y fíjense aquí, nula sugiere qué? Ese coro - AUDIENCIA: No se lo devuelva. DAVID J. MALAN: No se devuelve ningún valor. Y, en efecto, las funciones no tienen que devolver valores. Ellos sólo pueden hacer algo. Ellos pueden tener lo que se denominan efectos secundarios, que en este caso es sólo un montón de impresión en la pantalla. Así que notar que este código aquí, literalmente robó a el ejemplo anterior. La única diferencia es que en lugar de utilizar como mi variable, ahora lo estoy usando b como mi variable. Así que tengo aquí abajo b, b tengo aquí, tengo b menos 1 aquí abajo. Pero el código es exactamente el mismo. Pero a mostrar ahora cómo podemos utilizar esto, déjame ir adelante y cambiar realmente se trata de un bucle for. for (int i = n; i> n; i -). Así que he robado que a partir de nuestro ejemplo anterior. Anteriormente, está en la línea 37, que habría empezado cantando esta canción molesto. Pero en cambio, yo sólo voy a llamar ahora coro de i. Hecho. Así que ahora en cada iteración de este bucle, llamo a este otro función, coro, que se me ocurrió escribir. No fue escrito por alguien más años. Pero coro, por su parte, utiliza printf para imprimir a cabo estas cuatro líneas. Pero el hecho de que estoy llamando a coro una y otra vez en una bucle significa que voy a conseguir, al final, el canción exactamente igual que tengo hasta ahora. Así que en resumen, ahora si miro hacia atrás en mi código, a pesar de que funcionalmente es equivalente cuenta de que es empezando a llegar aún más legible. Yo no sé exactamente cómo getInt se implementa. Francamente, no sé cómo se implementa coro. Pero no me importa. No me importa, porque ahora puedo ordenar de, como ser humano, leer este fondo de arriba. Y debido a que las funciones se denominan de acuerdo con lo que hacer, mi código es cada vez más fácil de leer. Y como nuestros programas de conseguir mucho más complejo - a finales del semestre, se le escribiendo cientos de líneas de código en lenguajes como PHP y JavaScript y similares - usted encontrará que es mucho más fácil que hacer un seguimiento de lo que has hecho. Y cuando empiece a colaborar con amigos o socios o compañeros de trabajo, usted será capaz de escribir mucho más programas masivos de comenzar a hacer ejercicio estos básicos bloques de construcción. Así que con eso dicho, ¿por qué no lo llaman un día? Y nos vemos el miércoles. [Aplausos]