Enseñar C ++ a estudiantes de secundaria por primera vez: ¿dónde trazar la línea?


35

Estaré asesorando a un equipo de estudiantes de secundaria para la PRIMERA Competencia de Robótica, la mayoría de los equipos aquí desarrollan [su software de robot usando C ++. Para muchos de los estudiantes del equipo, esta será su primera introducción a la programación. No hubiera elegido C ++ para enseñar programación a estudiantes de secundaria (por ejemplo, Python o Javascript habría sido más fácil), pero la elección está establecida.

Quiero enseñarles C ++ adecuado (es decir, evitar un dialecto mixto C / C ++, es decir C +) pero tampoco quiero asustarlos con una complejidad innecesaria. Para esa materia:

  • ¿Debo comenzar a usar STL desde el primer día? vectoro simplemente seguir con las matrices estándar? Las matrices son más fáciles de introducir, pero los errores de puntero pueden ser más difíciles de detectar.
  • Para E / S, ¿debería seguir cout, etc. o cree printfque sería más fácil de aprender?
  • ¿Hay algún recurso en línea para C ++ que sea adecuado para estudiantes jóvenes?

¡Gracias!

EDITAR : Gracias por tantas excelentes respuestas. Además de C ++ acelerado , que es sugerido por muchas personas, he encontrado que C ++ para todos es un texto excelente.


52
¡Oh Dios, por favor, no le enseñes a nadie javascript como primer idioma!
SoapBox

26
@SoapBox: en lugar de qué? Creo que Javascript es excelente como primer idioma. Puede hacer cosas interesantes con unas pocas líneas de código, no hay compiladores de aprendizaje generales e IDE de inicio, etc., es fácil de probar y depurar, y es compatible con la programación funcional y OO. ¿Que podría ser mejor?
Kevin Cline

77
¿Por qué dice que las matrices son más fáciles de introducir? Creo que los vectores son mucho más intuitivos para los recién llegados, ya que no tienes que pensar en punteros ni nada complejo como ese.
Casey Patton el

19
Si estás enseñando C ++ a estudiantes de secundaria, entonces ya has cruzado la línea.
tylerl

77
La alternativa a la enseñanza de C ++ no es COBOL.
jhocking

Respuestas:


40

Creo que debería comenzar con los tipos de datos que el lenguaje ha incorporado, como matrices y punteros, y cuando sus estudiantes los comprendan, pase a clases y OO, luego el STL.

La razón es que puede enseñar a las personas a comprender las matrices sin comprender mucho más que las variables y la arquitectura de la computadora subyacente, pero no puede enseñarles a comprender vectorsin enseñarles primero las clases. Si usa el STL desde el principio, sus estudiantes tendrán que vivir sin tener ni idea de cómo vectorfunciona exactamente. Y luego, cuando llegues a ese punto, no tendrán una comprensión suficiente de punteros y matrices y cosas que obtienes de hacer cosas como escribir tu propia clase de vectores, escribir tu propia clase de lista vinculada, etc. que será necesario para apreciar y explotar sus características. Me molesta cuando los estudiantes dicen "¿qué es eso?" y los maestros dicen "simplemente ignóralo, lo aprenderás más tarde".

Y como Demian señaló en los comentarios, descifrar los mensajes relativamente crípticos que recibe de los errores de plantilla es significativamente más difícil que comprender los errores que puede obtener de matrices / construcciones que no son de plantilla.

No siento lo mismo por couty printf. Ninguno de los dos tiene un nivel más bajo que el otro, excepto que coutusa sobrecarga del operador.

Esto puede parecer estúpido, pero soy absolutamente fanático de que la gente entienda los componentes básicos de todo antes de pasar a las abstracciones. No debe usar punteros inteligentes hasta que sea competente con punteros sin procesar, sin vectores antes de las matrices, ese tipo de cosas.

A menudo digo esto, pero lo diré de nuevo: es mejor enseñar a los estudiantes la división larga primero y luego dejar que usen una calculadora que dejar que usen una calculadora y luego enseñarles la división larga después.

En cuanto a los libros para enseñar a los principiantes, vea la lista maestra de buenos libros de C ++ .


44
En realidad, yo era de la misma opinión, pero miré el libro Teaching C ++ de Strousrup ( stroustrup.com/Programming ) y él defiende explícitamente el uso de vectorover arrays. Estoy desgarrado
recipriversexclusion

44
@recipriversexclusion: Solo digo lo obvio, pero el Sr. Stroustrup está lejos de ser un estudiante de secundaria;)
Demian Brecht

14
DIOS MIO. ¿Cómo puede alguien pensar que manipular manualmente las matrices asignadas dinámicamente podría ser la ruta "más fácil primero" a C ++, cuando hay std::stringy std::vector? ¿Son los programadores de 32 C los que votan? He estado enseñando C ++ durante una década, a principiantes de programación, a estudiantes que tuvieron un año de Java y a profesionales de programación. Yo uso std::stringy std::vectordesde el primer día. Son fáciles de usar, sin importar sus entrañas. (¿No rehuirías enseñar la secuencia de VB porque es demasiado compleja por dentro?)
sbi

18
Aquí está tu voto negativo. No tiene que aprender a construir una casa para disfrutar de los beneficios de vivir en una casa. No tiene que poder escribir std::vectorpara poder usarlo. Y las clases son una parte extremadamente básica de C ++. Lo que no es básico es depurar todos los errores que van a obtener utilizando matrices y punteros nativos.
DeadMG

66
@DeadMG: La metáfora de la casa no funciona. En una casa, una vez que se construye la base, nunca más tendrá que pensar en ello. Sigues construyendo todo lo demás. En C ++, en el instante en que ve la newpalabra clave, vuelve a la memoria de gestión de memoria. Y muchas veces las bibliotecas piden punteros y usted debe preguntarse, "¿eso va a tomar posesión? ¿O todavía necesito limpiarlo?". Fundación mi pie. Más como un clavo o calafateo o algo así.
Chris Eberle

38

Esta es mi propia experiencia. Tómelo por lo que sea que valga.

Mirando hacia atrás cuando comencé a programar, realmente desearía haber aprendido sobre memoria primero . No, no es emocionante. Te hará deslumbrar. Pero es un concepto ridículamente fácil de enseñar. Simplemente muestre una tabla 1-D y haga que pasen por algunos ejercicios mentales:

Lección 1:
Esto es 10 bytes de memoria. Esta es la letra "a" que se pone en el número de celda 3. "a" es el valor y 3 es la dirección. ¿De acuerdo? Este es el número 3 puesto en la celda 5. Su valor es 3 y su dirección es 5. Ahora, ¿qué puede significar el número 3? Bueno, podría ser solo un número 3, o podría ser una referencia a la dirección 3. Al igual que 1 podría ser un número o un código de país. Es solo un número, todo depende de cómo lo tratemos.

Lección 2:
Aprendamos a contar en binario. Vamos a contar hasta 10 usando el conteo binario de dedos. Interesante no? ¿Ves que eso solo necesitaba 4 dedos? Entonces decimos que solo se necesitan 4 bits (1/2 celda). ¿Qué es lo más alto que puede contar por un lado (la respuesta es 31). ¿Qué tal 2 manos (la respuesta es 1023). Explica cómo más bits significa rangos de números más altos. Recuérdeles que una celda de memoria es de 8 bits. Pregunte qué sucede cuando un número necesita más de 8 bits. ¿Cómo pondrían un número de varios bytes en la memoria (de forma lógica)? Presénteles caracteres, cortos, enteros y largos.

Lección 3:
Aquí hay un programa que escribí en C ++. Utiliza enteros de 32 bits. Y esto aquí también es un número. Pero este es un número utilizado para señalar. Al usar este pequeño asterisco, prometemos que el número se usará para señalar. Y así es como lo apuntamos al primer número. El pequeño signo representa el valor para nosotros. Aseado ¿eh?

etcétera Una vez que tienes memoria básica baja, todo lo demás es pastel. Son los estudiantes pobres quienes asumen que el compilador está haciendo algo mágico (o que nunca tienen que pensar en el manejo de la memoria) quienes tienden a tener más dificultades. Y C ++ enturbia las aguas porque algunas cosas se limpian automáticamente (es decir, un vector normal) mientras que otras no (es decir, un vector asignado usando "nuevo"). Y ni siquiera me hagas comenzar con las cadenas (char * vs. std :: string - intenta explicarlo sin conocimiento del puntero).

No sé a qué plataforma se dirigirá su competencia de robots, pero si se trata de un entorno de memoria limitada, las habilidades de gestión de la memoria son cruciales.

EDITAR

Una vez que les haya enseñado los fundamentos, entonces sí, digo que vaya C ++ hasta el final. Técnicamente son solo bibliotecas diferentes, pero sí, no tiene sentido confundirlas con más de un paradigma. Dales herramientas C ++ (que incluyen punteros y matrices).


Esa es una respuesta bien puesta. Creo que el problema es que puedes enseñar eso, pero muchos niños (yo era uno que luchó al principio con los conceptos de puntero / memoria debido a la falta de interés) simplemente lo desconectarán, porque no es divertido, aunque es un conocimiento necesario para programar con éxito en C ++.
Keith Layne

3
Sí, no hay discusión aquí. Por la misma razón, los niños ignoran las matemáticas y la geografía. Solo más tarde se dan cuenta de que deberían haber estado prestando atención. Estoy bastante seguro de que ese problema en particular aún no se ha resuelto.
Chris Eberle

+1. Recuerdo haber reunido mi comprensión de cómo funcionaba la memoria bastante tiempo después de que me presentaron a C ++. Sin embargo, no creo que pudiera haberlo entendido por adelantado (no en ningún sentido práctico, como cómo se representan los valores).
Cameron el

+1, esto es lo que intentaba decir, pero mejor. Al entrenar mecánicos, deben entender el motor antes de que los conviertas en expertos en conducción.
Seth Carnegie

Sí, voy y vengo sobre si los principiantes pueden comprender esto o no. Es TAN ridículamente fácil (y de repente te encuentras diciendo "wow, las computadoras son máquinas profundamente estúpidas, ¿no es así?"), Sin embargo, requiere que presten atención y se aferren a la promesa de cosas más emocionantes por venir. No ver el "panorama general" hace que el enfoque general sea un poco entumecedor.
Chris Eberle

31

¿Debo comenzar a usar STL desde el primer día? vector o simplemente seguir con matrices estándar? Las matrices son más fáciles de introducir, pero los errores de puntero pueden ser más difíciles de detectar.

definitivamente entrar directamente en el uso de tipos de biblioteca estándar. a std::stringo std::vectores lo que deberían usar a menudo y (la gran mayoría de las implementaciones de) estos tipos ofrecen alguna forma de detección de errores y manejo de errores, al tiempo que abstraen muchas de las complejidades de los estudiantes.

puede pasar una buena cantidad de tiempo enseñando a los estudiantes cómo está estructurada la memoria y cómo administrar la memoria (estilo C), o puede ir directamente al trabajo utilizando los tipos idiomáticos del lenguaje y luego explicar los detalles de implementación si es necesario (y cuando tienen un mejor comprensión de qué es una matriz y dónde se usan).

La sintaxis de std::vector(crear / leer / escribir) no es mucho más complicada que la de una matriz C. en comparación, la gestión manual de la memoria y todos los errores comunes que los nuevos alumnos cometen con las matrices C son mucho más difíciles de aprender, enseñar y usar.

Para E / S, ¿debería seguir con cout, etc. o cree que printf sería más fácil de aprender?

cout. personalmente, creo que coutes más fácil de aprender. quizás lo más importante, debe elegir coutporque es más seguro, versátil y le permite definir cómo se imprime un objeto, lo que significa que ya tiene funcionalidades integradas y seguridad de tipos utilizando algunos tipos de biblioteca estándar. por último, que acaba de terminar con los programas mixtos cuando se da cuenta de que también pueden necesitar para aprender cout, además de printf.

de hecho, creo que deberías leer Accelerated C ++, de Koenig y Moo, y posiblemente usarlo como instrucción (respondiendo la pregunta 3 indirectamente). en el libro, se presentan std::coutjusto antes return(página 3), y guardan punteros y matrices hasta el capítulo 10. Si pudiera copiar y pegar el prefacio de ese libro como respuesta a su pregunta, lo haría. (nota: te recomiendo que lo leas por la perspectiva de enseñar c ++).

Editar aquí es el prefacio

¿Hay algún recurso en línea para C ++ que sea adecuado para estudiantes jóvenes?

Si no desea utilizar C ++ acelerado (que asume algunos antecedentes con la programación en general), entonces tal vez le gustaría el pensamiento de Eckel en C ++ . No lo he leído, pero es un texto de introducción de C ++ distribuido libremente.


1
+1 ... y LOL'd duro en "introducen std :: cout justo antes de regresar (página 3)" tengo que echar un vistazo a eso :)
Felix Dombek

1
@Felix y directamente antes std::coutde la presentación, se introducen llaves =) (es una simple disección del omnipresente "Hello, World")
justin

1
Apoyo de todo corazón la recomendación del libro de Koenig y Moo. Se dirige a la enseñanza tanto de C ++ como de programación. El Pensamiento de Bruce Eckle en C ++ está dirigido principalmente a enseñar C ++ a aquellos con experiencia previa en un lenguaje de procedimiento (como C o Basic).
Stephen C. Steel

11

Una cosa a tener en cuenta es que en el código FIRST típico, las estructuras de datos de cualquier forma (estructuras, clases, matrices, vectores, listas) juegan un papel muy pequeño. Por lo general, maneja una cantidad muy pequeña de datos del sensor y la usa para decidir una cantidad muy pequeña de movimientos del actuador.

Pero lo que juega un papel importante y puede ser muy difícil de entender son todas las diferentes formas de control que tienen lugar.

Así que puse mucho énfasis en el control. Comience con lo básico: if, for, while. Haga que practiquen mucho eso. Haz que los conozcan bien ...

... pero luego se vuelve más difícil. Cualquier código de robot de tamaño moderado finalmente llega a algunos patrones de control más complicados:

  • Gran bucle "principal", que lo llama todo

  • Máquinas de estado (se muestran mucho)

  • Guardar valores anteriores / ejecutar contador (como para PID)

Estos son difíciles de entender para los principiantes. Pensar en cómo un programa se mueve a través de un código como este es confuso, es posible que no se dé cuenta ahora, pero lo es. Les dará a sus estudiantes muchos más problemas que el idioma en sí.

Además, ¡buena suerte! Espero que la temporada vaya bien.


2
+1; Este no es un entorno de escritorio normal, sino un código real incrustado. Las máquinas de estado son mucho más importantes que std :: vector vs arrays.
MSalters

8
  • ¿Debo comenzar a usar STL desde el primer día? vectoro simplemente seguir con las matrices estándar? Las matrices son más fáciles de introducir, pero los errores de puntero pueden ser más difíciles de detectar.

El problema con las matrices es que cualquier cosa, excepto ejemplos simples de libros de texto, requerirán matrices de tamaño dinámico, y en el momento en que necesite matrices de tamaño dinámico, std::vectores mucho más fácil. Además, la única forma de manejar de forma segura las matrices de tamaño dinámico es envolverlas en su propia clase, lo que sería una std::vectorestafa pobre .
Contrariamente a la creencia inexplicablemente popular, los estudiantes pueden usar características que requieren la implementación de mecanismos complejos sin saber cómo implementar esas bestias por sí mismos. Como he dicho en un comentario: ni siquiera pensarías en considerar no enseñar cadenas en otros idiomas, solo porque su implementación es compleja, ¿verdad?

  • Para E / S, ¿debería seguir cout, etc. o cree printfque sería más fácil de aprender?

¿Por qué un conjunto de convenciones de cadenas de formato arcaico que hacen que su programa explote en el techo en el momento en que algo sale mal (que sucede en el momento en que cambia un typedefencabezado aparentemente no relacionado) sería preferible a la seguridad de tipo std::cout?

  • ¿Hay algún recurso en línea para C ++ que sea adecuado para estudiantes jóvenes?

La mayoría de los recursos de C ++, en línea o no, son malos. Y no estoy hablando de usar fuentes o lenguaje difíciles de leer. Estoy hablando de errores de hechos evidentemente obvios. Hay muy pocos recursos buenos de C ++, en su mayoría una o dos docenas de libros . El único que conozco está en línea es Thinking in C ++ de Bruce Eckel .


Durante una década, he enseñado C ++ a estudiantes con antecedentes muy diferentes utilizando C ++ Acelerado de Koenig / Moo como base. Mi curso ha cambiado mucho en esa década, ahora no está cerca del libro, excepto por el principio subyacente: usar los modismos modernos, correctos y seguros desde el principio. No enseñe a sus alumnos cómo manipular manualmente la memoria, solo para que luego desaprendan eso a favor de expresiones idiomáticas más seguras. Como puede ver en algunas de las respuestas proporcionadas aquí, esto no funciona: aquellos que alguna vez aprendieron las formas manuales primero rara vez entenderán la ventaja de usar expresiones idiomáticas modernas y seguras.


7

Si desea enseñar C ++, comenzaría directamente con las construcciones de C ++ como vector y cout, en lugar del subconjunto de C como printf.


7

¿Debo comenzar a usar STL desde el primer día ...?

Sí. El uso de matrices nativas en C ++ es propenso a errores y simplemente es una mala práctica el 99% del tiempo.

Para E / S, ¿debo seguir con cout, etc.?

Sí.

¿Hay algún recurso en línea para C ++ que sea adecuado para estudiantes jóvenes?

No son tan jóvenes. Aprender a programar no requiere sabiduría, solo motivación y una mente abierta. No puedo pensar en nada de lo que se haya enseñado en los últimos dos años de la escuela secundaria que pueda preparar mejor a un estudiante para aprender a programar. ¿Has mirado el pensamiento de Bruce Eckel en C ++ ? Está disponible para descarga gratuita y muy bien revisado. Evite el popular pero horrible C ++: Cómo programar y todos los libros de Sam's Teach Yourself C ++ ...


5

Me enseñaron C ++ en la escuela secundaria como primer lenguaje de programación, aunque era más como "C +", ahora que lo mencionas; solíamos coutescribir texto en la consola y los archivos, pero también algunas funciones C ( getch()era mi favorito).

Creo que la forma más efectiva (y posiblemente divertida) de enseñar los conceptos básicos es usar un plan de estudios orientado a objetivos: comenzar mostrando cómo generar cosas, luego ingresar el teclado, luego E / S de archivos simples, etc. Progresar a un texto simple. juego basado (o el equivalente en robótica). Luego, cuando preguntan: "¿Cómo hago X?", Puedes desglosar X en términos de ejemplos que ya han visto, por ejemplo, "Primero tendrás que obtener la entrada del usuario como lo hicimos en Z, luego ..."(obviamente no es tan fácil en la práctica, ya que X es probable que sea algo que necesitan un conocimiento adicional con el fin de hacerlo, por ejemplo, 'gráficos en 3D', pero aún se podía explicar cómo sería trabajar en un alto nivel camino).

Los ejemplos que les muestres comenzarán como magia copiada en recuadro negro, cuyos misterios se descifran a medida que las piezas del rompecabezas de programación se descifran lentamente. Por ejemplo, sus alumnos aprenderán los conceptos básicos de ifs con bastante rapidez, pero probablemente no se darán cuenta de que una expresión booleana no se limita exclusivamente al uso dentro de una ifcondición (que conduce al if (blah) return true; else return false;código clásico ).

Las sutilezas de si elige una matriz o un vector como contenedor parecerán irrelevantes para los estudiantes al principio. Un vector / matriz simplemente será una forma de tener muchas variables como una variable, accesible a través de un índice. Cíñete a uno donde puedas. Los punteros no se entenderán hasta más tarde tampoco. Eso no quiere decir que no debas explicar las cosas; solo que no puedes explicar todo de una vez, y las cosas que explicas no serán completamente absorbidas. Los humanos aprenden orgánicamente, no linealmente. ¡Lo había estado usando coutdurante un par de años antes de entender correctamente qué era la sobrecarga del operador!

Ah, y no tengas miedo a la repetición. "Esto es como el programa Hello World que hicimos. ¿Recuerdas cómo escribimos el texto en la consola?" (no ...) "Hagámoslo de nuevo solo para asegurarnos". ... y hacer preguntas! Mantenga a los estudiantes interesados ​​con ejemplos divertidos y mucha interacción.

C ++ es un lenguaje complejo, y no importa lo que haga, una cantidad significativa de esa complejidad (y la del oficio de programación en general) se perderá en sus estudiantes. Todo lo que les muestres será nuevo para ellos; la mayor parte no se hundirá en un nivel profundo de comprensión (al menos, no de inmediato). Cómo funciona la memoria, cómo interactúan los componentes de una PC, cuáles son la pila y el montón, los punteros, las clases, incluso los bucles y las cadenas if-else no serán entendidas adecuadamente por la mayoría. ¡Esto esta bien! No es necesario que se entiendan para usarlos: se puede escribir una increíble cantidad de programas geniales con funciones súper feas de 1000 líneas con ifs redundantes quíntuples y 43 variables con nombres similares x_2r. Lo importante es que los estudiantes están constantemente aprendiendo y mejorando. Las cajas negras están bien siempre que se vuelvan transparentes (o al menos gris translúcido) a la larga. Al final del curso, es posible que no sepan qué son los patrones de diseño, pero deberían poder volver a mirar los programas que escribieron en las primeras semanas y encogerse por su código. Deben entender con un nivel de detalle significativo cómo funciona realmente el primer programa que escribieron (mientras que cuando lo escribieron no tenían idea). Pero no lo sabrán todo ... todavía .


5

He tomado un montón de clases de programación en mi vida desde la escuela secundaria hasta la universidad. Puedo decir que realmente no aprendí demasiado de mi primera clase de c ++ aparte de cómo imprimir cosas en una secuencia.

Mi consejo, como joven estudiante, que solo en los últimos años ha tenido un verdadero trabajo como desarrollador, es que no les haga tonterías. Dígales lo que están haciendo y cómo funciona hasta el nivel del sistema operativo (no es necesario entrar en comp eng IMO).

Creo que enseñarles C es una mejor manera de hacerlo (casi siempre se compilará como C ++, como saben). Enseñándoles qué es realmente el terminal, cómo interactúa su programa con él, que una cadena es una matriz de caracteres terminados con un \ 0 en la memoria, qué es malloc y cómo C ++ lo abstrae, cómo se almacenan un char y un int en la memoria , ect ... Estas cosas son las que hacen que alguien realmente sepa cómo resolver un problema cuando lo encuentra en desarrollo.

No puedo enfatizar la importancia de dejar que los niños programen y estar allí principalmente para responder preguntas. En mi experiencia, aprendes un idioma al usarlo. Los libros y las lecciones pueden ser útiles y son necesarios para comenzar, pero al final, les doy un archivo C / C ++ y digo: Este es un ejemplo de X, me gustaría que hicieras Y (que se puede hacer pirateando X). Muéstreles cómo usar las páginas man (si están usando * NIX) o muéstreles cplusplus.com y permítales explorar las bibliotecas estándar para resolver las cosas por su cuenta.

TL; DR Deje que los niños se enseñen solos. Esté allí para proporcionar estructura y responder preguntas.

También: ¡Las listas enlazadas son la verdad!


4

No les está enseñando a programar de manera general, les está enseñando una especie de programación integrada usando Robots y demás. Si entendí correctamente.

Primero, creo que deberías verificar qué bibliotecas vas a usar y qué necesitas.

Si tiene una biblioteca de C para usar o un C-like con muchos punteros y matrices de C, entonces creo que necesitaría una forma de enseñarles cómo usarla o por qué la usa.

Pero, puede mostrarles algunos códigos simples para que comiencen con cadenas y vectores, así es como funciona C ++. Eso no significa que no puedas enseñarles consejos.

Tal vez debería dejar en claro las diferencias entre el C ++ de bajo nivel (que se parece a C) y el C ++ de alto nivel con el STL. Una de las cosas más difíciles en C ++ para principiantes es ver qué es C, qué es C ++ y cuáles son las diferentes API del sistema.

Como el objetivo aquí no es aprender programación general sino participar en una competencia de robots, había orientado la enseñanza de esta manera.


2

Comencé a enseñar a los estudiantes C ++ a fines del año pasado y este verano también para nuestro equipo FIRST Robotics.

Estamos utilizando la programación de Stroustrup : principios y práctica con C ++ . He encontrado que el libro es accesible, legible y bien organizado. Hemos tenido a unos 6 estudiantes leyendo los capítulos por su cuenta. Estoy allí para ayudarlos con terminología y preguntas. Hacen todos los ejercicios del libro.

Hice que los estudiantes trabajaran hasta el capítulo 14. Omitir los capítulos en las transmisiones (no es útil para la programación FRC). A través del capítulo 14 es útil porque reciben una introducción a las subclases. Sin embargo, probablemente necesiten ir más lejos en el libro para comprender mejor los constructores y destructores relacionados con las subclases.

No subestimes a tus alumnos. Los estudiantes están felices de tener el libro, leer, aprender y hacer los ejercicios; y esto fue durante el verano en su propio tiempo! Hay muchos estudiantes que no entienden. Deberían pasar a otra cosa; No todos entienden la programación.

La barrera más grande no es el idioma o el libro; Es el entorno de desarrollo. Visual Studio Express puede ser desalentador para los usuarios nuevos. Puede ser valioso para ayudar a los estudiantes a enfocarse en la programación en lugar del entorno. Sin embargo, aprender el entorno es valioso ya que los programadores pasan mucho tiempo adaptándose a los nuevos sistemas de desarrollo.

Buena suerte.


+1: La mejor respuesta con diferencia. Excelente elección de libro de texto. Felicidades por tu éxito.
Kevin Cline

1

Dices que quieres enseñarles C ++ pero no enseñarles ninguna construcción de C, pero la mayoría de las construcciones de programación que necesitarán saber primero son comunes a todos los lenguajes y las versiones de C ++ tienen sus raíces en C:

  1. Así es como se hace un programa [int main (..) {return 0; }]. Ofrezca una descripción general básica del entorno de programación que desea que prueben también. Necesitarán saber cómo hacer un proyecto y realmente compilarlo / ejecutarlo.

  2. Esta es una variable. Las variables pueden almacenar datos (int, char, float, etc.).

  3. Cadenas (las de C ++ son más fáciles de usar con cin).

  4. Así es como se leen y escriben datos (cin, cout). "Hola,% s!"

  5. Condicionales (las computadoras necesitan tomar decisiones).

  6. Bucles (las computadoras son buenas para hacer lo mismo una y otra vez). Mostrar while y for loops.

Eso debería tomar alrededor de dos lecciones de una hora cada una. Asegúrese de preparar un conjunto conciso de notas a las que puedan referirse en el componente práctico. No estás tratando de hacerlos programadores brillantes, así que da ejemplos de cómo leer desde la consola, crear estructuras y todo lo que tendrían que hacer. Utilice solo funciones compatibles con el idioma, no bibliotecas de utilidades personalizadas. Solo los confundirás más.

Desde el principio, lidere con el ejemplo y muéstreles ejemplos de código bien diseñado. Las sangrías deben ser correctas, arriostradas y paréntesis consistentes en el estilo con el que se sienta más cómodo. Los nombres de las variables deben ser significativos. Si muestra slop como ejemplo, aprenderán que slop es aceptable. Es un mal punto de partida. Subraye la importancia de corregir la sangría: descubrí que cuando el lote que enseñé sangraba su código de manera consistente, podían ver más fácilmente dónde iban mal. Eso se debía a que la mayoría de sus errores eran un alcance incorrecto para las operaciones (poner operaciones en bucles / condicionales que no estaban destinados a ser, o lo contrario).

Luego pasar al trabajo práctico. La mejor manera de aprender algo es romperlo y descubrir por qué. Deberá asegurarse de que tengan un entorno fácil de usar para compilar su código. Documéntelo con capturas de pantalla en sus folletos.

Un buen ejemplo que me ayudó a entender algunos de los conceptos fue construir una máquina de Coca-Cola:

  • Salida de un menú de artículos y precios (almacenar el menú era una matriz de una estructura definida por el usuario. Podría ser una clase en C ++). Su salida requirió un bucle.
  • Leer en la selección del usuario.
  • Pídale dinero al usuario. Podrían ingresar la denominación de la moneda en centavos (1, 5, 10, 20, 50, 100, 200 en Aus). Ignorar denominaciones desconocidas. Si bien el usuario no ha ingresado suficiente dinero, siga preguntando (bucles).
  • Calcule el cambio requerido (división del módulo), dando el menor número de monedas. Imprime el resultado en la pantalla.
  • Espera al próximo usuario.

Después de eso, puede pasar a construcciones de C ++; no quieres sumergirte demasiado antes de que al menos puedan hacer un programa básico.

Y, sobre todo, tenga mucho tiempo libre y paciencia para dedicar a las preguntas. Habrá muchos, y la mayoría de ellos te harán estremecer porque son tan triviales que la respuesta es obvia para ti.


1

Creo que no debería enseñar cosas desde el punto de vista de C ++ ("C ++ hello world"), sino desde el punto de vista del dominio del problema, en este caso, la robótica. Entonces, tu hola mundo estaría parpadeando o conduciendo un motor.

Por supuesto, podría / debería descomponer cada pequeña tarea de robótica en un subconjunto de acciones de C ++ cada vez más significativas conceptualmente, que involucran tipos, funciones y operaciones de E / S.

En cuanto a mí, no soy un programador profesional e intenté aprender Java, C ++ y Python. Realmente comencé a lograr algo (Python) cuando tenía problemas reales (simples) que resolver. Eso me llevó al grano, evitando la atención excesiva a los detalles de implementación incidentales del lenguaje en sí.

Por lo tanto, le aconsejaría: no lea el manual de un idioma, sino que aprenda a hacer las cosas con el idioma que elija. Eso es lo que mantiene a la gente motivada, creo.


0

Enseñaría estricto C ++. ¿Sabes cómo cuando escribes printf y lo das a pequeños parámetros o al tipo incorrecto sucede algo extraño? y si usas punteros inválidos, ¿pueden ocurrir cosas malas? NO ENSEÑES ESO

Desde el primer día, enseñaría cómo usar referencias, STL y diría que PERDIÓ MARCAS por usar punteros. Tampoco enseñe punteros inteligentes. La única vez que noto que uso punteros es cuando hago GUI y los objetos (como un cuadro de imagen) deben existir y ser una imagen válida o nula. Para la programación de la consola, no he usado punteros (inteligentes o sin formato) en mucho tiempo.

En resumen, no les enseñe nada que pueda causarles problemas. Enseñe iostreams, estructuras, dígales que también pierden marcas en la conversión tipográfica y no intente enseñar diseño. No quieres que nadie se convierta en un profesional experimentado


0

No es una serie de conferencias en C ++, pero COMP1917 de Richard Buckland es una serie de conferencias excelentemente realizada sobre programación en C (seguida de COMP1927 , estructuras de datos).

En mi opinión, C ++ es demasiada complejidad para los nuevos estudiantes, pero C es mucho más simple y proporciona una buena base en la programación de sistemas que los nuevos programadores de C ++ carecen con demasiada frecuencia.


0

Comenzaría con trozos significativos de código repetitivo, los ayudaría a "hacer algo genial" con la programación de inmediato y perfeccionaría su comprensión de cómo funcionan las cosas con el tiempo. No necesitan apreciar o comprender todas las complejidades de C ++ para hacer que un LED parpadee. Solo necesitan saber "si pones este código allí, hará que el LED parpadee". Y luego "oye, hablemos de lo que es un bucle ahora, si escribes un bucle, puedes hacer que el LED parpadee 50 veces sin tener que escribir 50 líneas de código, ¿no es genial?" Ahora hablemos de condicionales, cuando el usuario presiona el botón A en la caja de control, queremos activar la neumática para levantar una bandera, así es como agregaríamos código para hacerlo. O si el interruptor 2 de nuestra caja de control se activa, activamos el motor de perforación en reversa en lugar de avanzar.

Si mantienes las cosas enfocadas en enseñarles "lo suficiente" para resolver los problemas que les interesan, las cosas serán mucho menos abrumadoras y más accesibles. Si están realmente interesados ​​y quieren comprender las complejidades, probablemente regresarán y leerán un libro completo sobre programación o tomarán un curso de escuela de verano en el JC local.

Haga una lista de las "cosas que quieren poder controlar" en su robot y convierta cada una en una lección ... ¿qué es lo menos que necesitan saber para ...?

  • hacer algo de "aspecto genial" si un interruptor está en una configuración particular?
  • ¿Le dice a una válvula neumática que abra o cierre (por ejemplo: un accesorio de agarre)?
  • ¿Encender y apagar los motores de perforación (para la transmisión)?
  • hacer que el robot cambie de dirección si se activa un sensor de detección de obstáculos?
  • hacer que el robot cambie entre los modos de tracción de 2 ruedas frente a 4
  • ajustar la sensibilidad del joystick?
  • etc.

Me apegaría a enseñar las construcciones que son más infalibles, como enseñaría cout sobre printf, porque los especificadores de formato son muy fáciles de mezclar y un especificador incorrecto es a menudo una receta automática para bloquear su programa. Del mismo modo, el vector ofusca algunas de las complejidades de la gestión de la memoria. No se preocupe por cada detalle sobre cómo funcionan las cosas, o qué es la biblioteca STL, solo lo menos que necesitan saber para lograr X (lo que podría requerir el uso de una estructura de datos de la biblioteca STL, por ejemplo)


0

Use Cómo programar C ++ de Deitel y Deitel. EXCELENTE libro de texto en mi opinión.

Parece que estás tratando de enseñar a los principiantes cómo programar y luego hacer que programen en algún nivel avanzado al mismo tiempo. Si desea darles un poco de mono, vea fragmentos de codificación de mono sin comprender que está condenado al fracaso.

Manténgase alejado de STL para una clase de principiante.

Si ya tiene una solución de codificación para su robot, o una IDEA MUY BUENA de cómo se verá, entonces quizás pueda "asignar" las lecciones del libro de texto a las tareas de codificación del robot. Pero deje que el libro de texto impulse el aprendizaje.

Si alimentas a la fuerza la codificación, dándoles a los estudiantes lecciones muy limitadas y exposición al idioma, entonces creo que a medida que el océano de código que escribes se hace más y más grande, será como haber aprendido a remar y te ahogarás porque nadas REAL es requerido.

No se trata de "¿deberían aprender cout o printf?" Se trata de aprender lo suficiente como para tener una idea de cómo escribir código para resolver tareas de programación de robots.

Si se tratara de una tarea de lectura, ¿cuáles serían los resultados si lo único que supieran fueran oraciones simples de sujeto-verbo y solo se requerirá la mitad del vocabulario que SABES ?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.