[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]