Edutin Academy
Problema: Viejos Amigos Mejora los problemas antiguos ( hello.c , Fahrenheit.c , pennies.c )
$ ./hello Milo Hello, Milo! $ ./fahrenheit 0 F: 32.0 $ ./pennies 28 1 $2684354.55
Bien Distribuido He aquí algunas buenas noticias para ti: ya has visto casi todo de lo que vamos a hablar en este problema una vez. Vamos a volver a visitar tres programas antiguos y reescribirlos para que, en lugar de recibir entradas del usuario mientras el programa está en ejecución, acepten entradas del usuario en la línea de comandos, incluso antes de que el programa se ejecute. Comencemos abriendo el CS50 IDE y luego escribiendo update50 en la ventana del terminal para asegurarse de que su espacio de trabajo está actualizado. Luego, navega a tu directorio programming
cd ~/workspace/programming
Edutin Academy
Tu terminal debería verse como esto: ~/workspace/programming $
Para asegurarnos de que todo el mundo está en igualdad de condiciones mientras resuelve este problema, estarás descargando algún "código de distribución" (también conocido como "distro"), escrito por nosotros, y le hará modificaciones. Por supuesto, eres bienvenido a usar el código que escribiste para un problema anterior (¡si funcionaba!) y volver a trabajar para este problema, pero si has tenido problemas con los problemas que vamos a re-implementar esta vez, debes saber que de lo contrario te proporcionaremos un código totalmente funcional. Todo lo que tiene que hacer es cambiar la forma en que el usuario introduce los datos. Descarga una distribución del problema en ZIP dentro de tu ambiente de trabajo (con el comando llamado wget ), escribe:
wget https://cdn.cs50.net/ap/2018/problems/friends/friends. zip Deberías ver alguna salida seguido de: 'friends.zip' saved Confirma que de hecho has descargado friends.zip ejecutando:
ls luego ejecuta unzip friends.zip
Edutin Academy
para descomprimir el archivo. Si luego ejecutas ls de nuevo, deberías ver que tienes un nuevo directorio descomprimido llamado friends , luego procede a ejecutarlo cd friends seguido de ls ¡y de hecho deberías ver algunos viejos amigos! fahrenheit.c
hello.c
pennies.c
¡Que bien verlos de nuevo!
Argumentos en la Línea de Comandos Si por casualidad ves el char * (y te confundes), en los videos, debes saber por ahora que el carácter char * significa simplemente string . ¡Pero más sobre eso pronto!
¡Hola de nuevo! En Hola se te pidió que escribieras un programa que simplemente imprimiera el mensaje hello, world\n en la pantalla cuando se ejecute. No es demasiado arriesgado extender este programa para saludar a una
Edutin Academy
persona específica pidiéndole al usuario que escriba un nombre, por lo que el programa se comporta de esta manera. ~/workspace/programming/friends $ ./hello Your name: Zamyla hello, Zamyla De hecho, la distribución que descargó contiene un archivo, hello.c , con exactamente este comportamiento. Lo que queremos, sin embargo, es un programa que tenga este comportamiento en su lugar: ~/workspace/programming/friends $ ./hello Zamyla hello, Zamyla ¿Ves la ligera diferencia? En lugar de solicitar al usuario información después de que el programa haya comenzado a ejecutarse, recopilamos la información deseada del usuario antes de que se ejecute el programa, y luego usamos esa información una vez que el programa se ha iniciado. ¿Cómo lo hacemos? Recordemos que nuestros programas son capaces de conocer información sobre lo que el usuario escribió en la línea de comandos modificando la forma en que escribimos el inicio de nuestra función main . En lugar de int main(void) si comenzamos main escribiendo
int main(int argc, string argv[])
Edutin Academy
entonces tenemos acceso a dos variables especiales que podemos usar dentro de main . La primera es argc , que es una variable entera que nos dice cuántas cosas escribió el usuario en la línea de comandos, y la segunda es argv , que es un arreglo de cadenas que representan exactamente lo que el usuario escribió. Sabiendo esto, y a partir de la información en el video de Christopher, ¿puede ahora modificar hello.c para que imprima el nombre proporcionado en la línea de comandos, en lugar de recolectar un string del usuario después de que el programa se haya iniciado? Una arruga más. ¿Cómo se asegura de que el usuario le haya proporcionado un argumento adicional (y sólo uno) para que pueda imprimirlo? Bueno, recuerda que eso es lo que nuestro nuevo amigo argc puede hacer por nosotros. Si el usuario no proporciona un argumento en la línea de comandos, lo mejor es terminar el programa y hacer que lo intente de nuevo. Una manera de lograr esto podría ser tenerlo cerca de la parte superior de nuestro código: if (argc != 2) { printf("Usage: ./hello \n"); return 1; } ¿Observa lo que esto logra? Comprobamos para asegurarnos de que el usuario ha proporcionado el número adecuado de argumentos en la línea de comandos (2). Si no, le decimos al usuario cómo debería ejecutar el programa, y luego le return 1; , que es nuestra forma de indicar que nuestro programa ha terminado de ejecutarse, pero no con éxito. Usamos valores de retorno distintos de cero de main , también conocidos como códigos de salida, para informar al sistema de que algo salió mal.
Edutin Academy
Probando Correctitud Si desea comprobar la corrección de su programa con check50 , puede ejecutar el siguiente comando. check50 cs50/problems/2018/ap/friends/hello
Estilo style50 hello.c
¡Fahrenheit de nuevo! En Fahrenheit se le pidió que escribiera un programa que le pidiera al usuario una temperatura en grados Celsius (la cual le proporcionaron a través de get_float ) y que luego imprimiera la temperatura equivalente en la escala Fahrenheit. ~/workspace/programming/friends $ ./fahrenheit C: 0 F: 32.0 En fahrenheit.c encontrará una versión completa del código que se le encargó escribir en ese problema. Convierta ese programa para que acepte la temperatura Celsius desde la línea de comandos.
Edutin Academy
~/workspace/programming/friends $ ./fahrenheit 0 F: 32.0 Sin embargo, hay una trampa. El hecho de que el usuario escriba un número real en la solicitud no significa que su entrada se almacenará automáticamente en un float . En realidad, se almacenará como una cadena que por casualidad parece un float ; después de todo, ¿recuerda el tipo de datos de argv ? ¡Es un arreglo donde cada elemento es un string ! Por lo tanto, tendrá que convertir ese string en un float real. Por suerte, una función, atof , existe exactamente para ese propósito! He aquí cómo podría usarlo: float celsius = atof(argv[1]); Fíjate, esta vez, hemos declarado celsius como un float real para que puedas hacer algo de aritmética con él. Por cierto, puede asumir que el usuario sólo escribirá números reales en la línea de comandos. Dado que atof se declara en stdlib.h , querrá #include ese archivo al comienzo de su código. Y anteriormente, al igual que con hello.c , querrá asegurarse de que el usuario proporciona exactamente el número correcto de argumentos de línea de comandos a su programa antes de hacer cualquier cálculo, devolviendo 1 en caso de que no lo haga.
Edutin Academy
Probando Correctitud Si desea comprobar la corrección de su programa con check50 , puede ejecutar el siguiente comando. check50 cs50/problems/2018/ap/friends/fahrenheit
Estilo style50 fahrenheit.c
¡Pennies de nuevo! En Pennies se te pidió que escribieras un programa que demostrara el poder de la exponencialidad mostrando cuánto dinero tendrías si una persona te diera “x” peniques en un día en particular, y luego duplicaras la cantidad que te daban todos los días durante un período de “y” días. ~/workspace/programming/friends $ ./pennies Days in month: 31 Pennies on first day: 1 $21474836.47 Como es de esperar, nos gustaría que el programa funcionara de la siguiente manera.
Edutin Academy
~/workspace/programming/friends $ ./pennies 31 1 $21474836.47 Observe algunas diferencias con este programa con respecto a los dos anteriores. ¿Cuántos argumentos de línea de comandos acepta este? Asegúrese de modificar la verificación contra argc . Y también sabemos que en stdlib.h junto a la función atof existe otra, atoi , que convierte un string en un int de la misma manera que atof convierte una string en un float . Por cierto, puedes asumir que el usuario sólo escribirá números enteros en la línea de comandos; ¡no es necesario que te anticipes a un usuario corrupto esta vez!
Probando Correctitud Si desea comprobar la corrección de su programa con check50 , puede ejecutar el siguiente comando. check50 cs50/problems/2018/ap/friends/pennies
Estilo style50 pennies.c
Edutin Academy
Honestidad Académica La filosofía de este curso sobre la honestidad académica es mejor mencionada como “sé razonable”. El curso reconoce que la interacción con los compañeros de clases y otros puede facilitar el dominio del material del curso. Sin embargo, aquí recordamos una línea entre conseguir ayuda de otro y presentar el trabajo de alguien más. Esta política caracteriza ambos lados de esa línea. La esencia de todo el trabajo que envía a este curso debe ser propia. La colaboración sobre los problemas no está permitida (a menos que se mencione explícitamente) excepto hasta el punto de que puedas pedir ayuda a tus compañeros u otros, siempre y cuando esa ayuda no se reduzca a que el otro haga el trabajo por ti. Generalmente hablando, cuando pides ayuda, puedes mostrar tu propio código o escribirlo, pero no deberías ver el de los demás, mientras que usted y ellos respeten estas políticas y otras restricciones. La colaboración en quices y tesis está totalmente prohibida. La colaboración en el proyecto final está permitida hasta el punto que se especifique. Debajo están las reglas prácticas que caracterizan los actos que el curso considera razonables y no razonables. Si duda en cuanto si un acto es razonable, no lo haga hasta que solicite y reciba la aprobación por escrito de su instructor. Si una violación de esta política es sospechada y confirmada, su instructor se reserva el derecho de imponer sanciones sobre cualquier resultado disciplinario que podría incluir la pérdida del trabajo enviado o del curso en sí.
Edutin Academy
Razonable • • • •
• • • • • •
Comunicarse con compañeros de clase acerca de problemas en Ingles (u algún otro idioma hablado). Debatir el material de curso con otros con la finalidad de entenderlo mejor. Ayudar a un compañero a identificar un bug en su código, viendo, compilando o corriendo su código, incluso en su propio computador. Incorporando un fragmento de código que se encuentre online o en cualquier lugar, dentro de su código, previsto que esos fragmentos no son en si la solución a los problemas asignados y que se cite el origen del fragmento de código. Revisar quices de años pasados, exámenes y soluciones. Enviar o mostrar código que le ha escrito a alguien, posiblemente a un compañero, entonces eso podría ayudarlo a identificar y arreglar un bug. Compartiendo fragmentos de código, sus propias soluciones a problemas en línea así otros podrían ayudarle a identificar y arreglar un bug u otro inconveniente. Utilizando la web o cualquier otro lugar por instrucciones más allá del curso mismo, para referencias, y para soluciones por dificultades técnicas, pero no para soluciones completas a problemas o para su propio proyecto final. Exponer soluciones a problemas con otros usando diagramas o pseudocódigo, pero no el código actual. Trabajar (e incluso pagarle) a un tutor para ayudarte con el curso, aclarando que el tutor no haga el trabajo por usted.
Edutin Academy
No razonable • • • • • • • •
Acceder a las soluciones de algún problema antes de presentar la suya. Preguntarle a un compañero de clases para ver su solución al problema antes de presentar la suya. Descompilar o desensamblar las soluciones a los problemas. Fallar al citar (como con comentarios) el origen del código, escritura o técnicas que usted descubrió fuera del curso e integrarlas a su propio trabajo incluso mientras respeta esta política y otras restricciones. Dando o mostrando a un compañero la solución a un problema cuando él o ella, y no usted, fue quien tuvo problemas al resolverlo. Viendo el trabajo de otra persona durante un examen o quiz. Pagando u ofreciendo pagarle a alguien por un trabajo que usted debe presentar como (o en parte) suyo. Ofreciendo y haciendo disponible las soluciones de un problema a personas que podrían tomar el curso en el futuro.
•
Buscar, solicitar o ver las respuestas de un quiz antes de tomarlo.
•
Buscar o solicitar soluciones completas a problemas en línea o en otro lugar.
•
Dividiendo la carga de trabajo para resolver un problema y combinar su trabajo. (A menos que esté autorizado explícitamente por el problema mismo).
•
Presentando (después de una posible modificación) el trabajo de otra persona más allá de los fragmentos permitidos.
•
Presentando el mismo o un trabajo similar a este curso que usted ha presentado o presentará en otro lugar.
•
Utilizando recursos durante el quiz más allá de los que están explícitamente permitidos en las instrucciones del quiz.
•
Viendo otra solución del problema y basar su propia solución en esta.
Edutin Academy
Evaluación Su trabajo en este conjunto de problemas se evaluará principalmente en tres ejes.
Exactitud ¿Hasta qué punto su código es consistente con nuestras especificaciones y libre de errores?
Diseño ¿Hasta qué punto está bien escrito su código (es decir, de manera clara, eficiente, elegante y / o lógica)?
Estilo ¿Hasta qué punto es legible su código (es decir, comentado y sangrado con las variables adecuadamente nombradas)?
Para obtener una calificación aprobatoria en este curso, todos los estudiantes deben enviar todos los problemas asignados, a menos que el profesor otorgue una excepción por escrito.
Este documento hace parte de la obra “CS50's AP® Computer Science Principles” por Harvard University, disponible bajo licencia Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0). “CS50's AP® Computer Science Principles” licencia Attribution-NonCommercialShareAlike 4.0 International (CC BY-NC-SA 4.0) modificado y adaptado por Edutin Academy.