pseudocodigo programacion libros fundamentos ejercicios ejemplos diseño conceptos basicos algoritmos algorithm language-agnostic theory

algorithm - programacion - pseudocodigo



Programación básica/conceptos algorítmicos (23)

Estoy a punto de comenzar (con otros programadores) un club de programación y algoritmos en mi escuela secundaria. El lenguaje de elección es C ++: disculpa por eso, no puedo cambiar esto. Podemos suponer que los estudiantes tienen poca o ninguna experiencia en los temas antes mencionados.

¿Cuáles crees que son los conceptos más básicos en los que debería enfocarme?

Sé que enseñar algo que ya es obvio para mí no es una tarea fácil. Me doy cuenta de que la primera reunión debe recibir una atención extrema, para no asustar a los estudiantes, por eso les pregunto.

Editar: Noté que probablemente la principal diferencia entre programadores y principiantes es la "forma de pensar del programador", quiero decir, conceptualizar problemas como, ya sabes, algoritmos. Sé que es solo una cuestión de práctica, pero ¿conoces algún tipo de ejercicios / conceptos / cosas que puedan estimular el desarrollo en esta área?


Rompiéndolo

Para mí, lo que es único acerca de la programación es la necesidad de dividir las tareas en pasos lo suficientemente pequeños para la computadora . Esto varía según el idioma, pero el hecho de que tenga que escribir un "ciclo de bucle" para contar hasta 100 requiere acostumbrarse.

El enfoque "de arriba hacia abajo" puede ayudar con este concepto. Empiezas creando una función maestra para tu programa, como

filterItemsByCriteria();

No tiene idea de cómo funcionará, por lo que lo divide en más pasos:

(Nota: no sé C ++, este es solo un ejemplo genérico)

filterItemsByCritera() { makeCriteriaList(); lookAtItems(); removeNonMatchingItems(); }

Luego rompes cada uno de ellos más abajo. Muy pronto puede definir todos los pequeños pasos que lleva hacer su lista de criterios, etc. Cuando todas las pequeñas funciones funcionan, la más grande funcionará.

Es como el juego de los niños donde siguen preguntando "¿por qué?" después de todo lo que dices, excepto que tienes que seguir preguntando "¿cómo?"


  1. Explica la historia de "Huevos fritos". Pregúntele al auditorio qué harían para hacerse huevos fritos. Hágales notar el paso en el que piensan. Probablemente recibirá menos de 5 pasos de algoritmo. Luego explíqueles cuántos pasos deben anotarse si queremos enseñar a una computadora a freír huevos. Algo como:

1) Go to the Fridge 2) Open the fridge door 3) Search for eggs 4) If there are no eggs - go to the shop to buy eggs ( this is another function ;) ) 5) If there are eggs - calculate how many do you need to fry 6) Close the fridge door 7) e.t.c. :)

  1. Comience con los conceptos básicos de la semántica de sintaxis C, etc., y en paralelo con eso explique los algoritmos básicos como sort de burbuja.
  2. Después de que el auditorio esté familiarizado con la programación estructurada (esto podría tomar varias semanas o meses, dependiendo de la frecuencia con la que haga las lecciones), puede avanzar a C ++ y OOP.

¡Gracias por tus respuestas!

¿Y cómo les enseñarías a resolver problemas?

Conozco a un grupo de estudiantes que conocen la sintaxis de C ++ y algunos algoritmos básicos, pero no pueden aplicar el conocimiento que conocen cuando resuelven problemas reales: no conocen el enfoque, la forma de transcribir sus pensamientos en un conjunto de pasos estrictos. No hablo de enfoques de "alto nivel" como programación dinámica, codiciosos, etc., sino de una mentalidad algorítmica básica.

Supongo que es solo por el pobre proceso de aprendizaje que estaban atravesando. En otras ciencias, las matemáticas, por ejemplo, son realmente brillantes.


¡Saludos!

Creo que te vas mucho por delante forzando un idioma específico y trabajando en temas específicos y un plan de estudios. Parece que tú (y algunos de los que respondieron) confunden "aconsejar a un club de programación" con "liderar una clase de programación". . Son cosas muy diferentes.

Reuniría al grupo, y el grupo debería decidir qué quieren salir exactamente del club. En esencia, haga una "carta" para el club. Entonces (y solo entonces) puede hacer determinaciones como el idioma / plataforma preferida, la frecuencia con la que se reunirá, lo que sucederá en las reuniones, etc.

Puede resultar que el mejor enfoque sea una "encuesta", donde se exploran diferentes idiomas / plataformas. O puede resultar que el mejor enfoque sea uno "tópico", donde haya cambios de tema (como un club de lectura) de forma regular (este mes es punteros, el mes que viene es clasificación, el siguiente es recursividad, etc.) y luego se producen ejemplos y discusiones en varios idiomas.

Como comentario adicional, consideraría una orientación "agnóstica del idioma" para el club. Aliente a los niños a explorar diferentes idiomas y plataformas.

¡Buena suerte y buen trabajo!


Alguien mencionado anteriormente, "hacer que la programación sea divertida". Hoy es interesante que las personas no aprendan por el bien de aprender. La mayoría de la gente quiere gratificación instantánea .

Enseñe un poco de lógica usando la Programación. Esto ayuda con (y es) la resolución de problemas. La clase que tengo en mi cabeza son juegos de adivinanzas.

  • Pídales que hagan un programa que adivine un número entre 0 y 100.
  • Pídales que hagan un clon del gato negro ... Lo he hecho en básico :-(

Haga las instrucciones en papel.


Bueno, es un club de programación, ¡así que debería ser DIVERTIDO! Así que me gustaría sumergirme en la experiencia de inmediato. Comience por explicar qué es un método main () y luego pídales a los alumnos que escriban un hello world program. Mejore gradualmente el programa hello world para que tenga funciones e imprima las entradas del usuario.

Yo diría que no entres al algoritmo demasiado rápido para principiantes, déjalos jugar primero con C ++.


Comience por hacerles comprender un problema como, por ejemplo, la clasificación. Esto es muy básico y deberían poder relacionarse bastante rápido. Una vez que ven el problema, preséntenles las herramientas / solución para resolverlo.

Recuerdo cómo se sintió la primera vez que mostré un ejemplo de merge-sort. Podría seguir todos los pasos, pero ¿para qué demonios estaba? Haga entonces anhelar una solución a un problema y ellos entenderán la herramienta y la solución mucho mejor.


El contenido de la programación C ++ de Deitel & Deitel es una introducción decente, y los ejercicios propuestos al final de cada capítulo son buenos problemas con los juguetes.

Básicamente, estás hablando de: - estructuras de control - funciones - matrices - punteros y cadenas

Es posible que desee hacer un seguimiento con una introducción al STL ("ok, ahora que lo hemos hecho de la manera difícil ... aquí hay una opción más simple")


El hecho de que esté familiarizado con los algoritmos no significa que pueda implementarlos y solo porque pueda programar no significa que pueda implementar un algoritmo.

Comience de forma simple con cada tema (siga la programación por separado de los algoritmos de diseño). Una vez que tienen un control sobre cada uno, lentamente comienza a juntar los dos conceptos.


El seudocódigo debería ser el primero.

Editar: Si son principiantes de programación total, entonces yo haría la primera mitad solo de programación. Una vez que llegas a un nivel en el que hablar sobre algoritmos tendría sentido, entonces el pseudocódigo es realmente importante para meterse debajo de las uñas.


En cuanto al lenguaje de elección, felicidades, encontrarás que C ++ es muy rico al hacerte pensar en atajos matemáticos y en millones de formas de hacer que tu código tenga un mejor rendimiento (o implementar patrones extravagantes).

A la pregunta: cuando comencé a programar, siempre intentaba dividir un problema de la vida real en varios pasos y luego, a medida que veía la similitud entre las tareas o los datos que transformaban, siempre intentaba encontrar una manera más perezosa, fácil y Impleméntalo.

La elegancia vino después al aprender patrones y algoritmos reales.


Guau. C ++ es uno de los peores idiomas posibles para empezar, en términos de la cantidad de basura no relacionada que necesita para que todo funcione (Java sería un poco peor, supongo).

Cuando se enseña a los principiantes en un entorno pesado, es habitual comenzar con "aquí hay un sencillo programa en C. Vamos a discutir qué es toda esta mierda en la parte superior del archivo para más adelante, pero por ahora, concéntrese en las líneas entre '' int main (void) ''y la declaración'' return '', que es donde se realiza todo el trabajo útil ".

Una vez que haya pasado ese punto, los conceptos básicos a cubrir incluyen las estructuras básicas de datos (matrices, listas enlazadas, árboles y diccionarios) y los algoritmos básicos (clasificación, búsqueda, etc.).


Haga que su club aprenda a programar realmente en cualquier idioma mediante la enseñanza de los conceptos de construcción de software. En lugar de quedarse sin comprar una docena de licencias para Visual Studio, haga que los estudiantes utilicen compiladores, creen sistemas, archivos fuente, objetos y bibliotecas para convertir su código C en programas. Siento que esto es realmente el comienzo y, de hecho, les da poder a estos niños para que entiendan cómo hacer software en cualquier plataforma, sin muletas que a muchas instituciones educativas les gusta confiar.


IMO, Big-O es uno de los conceptos más importantes para que los programadores principiantes aprendan.


Intentaría trabajar con un subconjunto C y no tratar de comenzar con las cosas OO. Eso puede ser introducido después de que entiendan algunos de los conceptos básicos.


Listas enlazadas: una pregunta de entrevista clásica, y por buenas razones.


Tener un concurso de depuración. Proporcione ejemplos de código que incluyan un error. Haga un concurso para ver quién puede encontrar más o más rápido.

Hay un excelente libro, Cómo no programar en C ++, que podría usar para comenzar.

Siempre aprendes mejor de los errores y prefiero aprender de los demás.

También permitirá que aquellos con poca experiencia aprendan con el código, incluso si el código casi funciona.


comience con un simple programa "hola mundo". Esto introduce fundamentos tales como variables, escritura en un flujo y flujo de programa.

A continuación, agregue complejidad a partir de allí (listas vinculadas, archivo io, obtener la entrada del usuario, etc.).

La razón por la que digo comienza con hola mundo es porque el niño verá un programa en ejecución realmente rápido. Es un feedback casi inmediato, ya que habrán escrito un programa en ejecución desde el principio.


¡Haz que la programación sea divertida!

Las posibles cosas para hablar serían las Competencias de Programación que su club podría tener o podría ingresar localmente. Competí en competencias de programación en el nivel de la Universidad (ACM) y sé de hecho que también las tienen en niveles más bajos.

Ese tipo de eventos realmente pueden sacar un poco de espíritu competitivo y acercar a los miembros del club.

Las cosas no siempre tienen que ser sobre programación tampoco. Tal vez sugiera tener una fiesta LAN donde juegue juegos, discuta programación, etc. también podría ser una buena idea.

En términos de temas reales para repasar que están relacionados con programación / algoritmo, sugeriría como grupo intentar algunos de estos problemas de programación en este concurso de competencia de programación " Desafíos de programación ": Amazon Link

Comienzan con problemas de programación bastante básicos y avanzan lentamente en problemas que requieren varias estructuras de datos como:

  • Stacks
  • Colas
  • Diccionarios
  • Árboles
  • Etc

La mayoría de los problemas se dan en C ++.

Eventualmente, progresan a problemas más avanzados que involucran Graph Traversal y los populares algoritmos Graph ( Dijkstra''s , etc.), problemas Combinatrics, etc. Cada problema es divertido y se da en un formato pequeño de "historia". Sin embargo, ten en cuenta que algunos de estos son muy difíciles.

Edit: Pizza and Soda nunca hace daño cuando se trata de hacer que la gente se presente a las reuniones de tu club. Nuestro club de ACM tiene pizza en cada reunión (una vez al mes). Aunque la mayoría de nosotros todavía aparecería, es un buen rompehielos. Especialmente para nuevos clubes o miembros.


Hank: ¿Big O? ¿Quieres decirles a los programadores principiantes que su código es de O (n ^ 2) y el tuyo es de n log n?


Pude ver algunas maneras diferentes de tomar esto:

1) Bloques básicos de programación básica. ¿Qué son los enunciados condicionales, por ejemplo, switch y if / else? ¿Qué son los enunciados de repetición, por ejemplo, para y while loops? ¿Cómo los combinamos para que un programa sea la secuencia de pasos que queremos? Puede tomar algo tan fácil como sumar una factura de compra o convertir temperaturas o distancias de métricas a imperiales o viceversa. ¿Cuáles son los tipos de variables básicas como una cadena, entero o doble? También aquí podría tener Álgebra Booleana para una idea avanzada o posiblemente enseñar cómo hacer aritmética en la base 2 o 16, lo que algunas personas pueden encontrar fácil y otras encontrar difícil.

2) Algorítmicamente, ¿qué son bloques de construcción similares? La ordenación es un tema bastante simple que puede ser ampliamente discutido y analizado para tratar de descubrir cómo hacer esto más rápido que simplemente intercambiando elementos que parecen estar fuera de lugar si aprendes el Bubblesort, que es la forma más cerebral de hacer.

3) Elementos de compilación y tiempo de ejecución. ¿Qué es una pila de llamadas? ¿Qué es un montón? ¿Cómo se maneja la memoria para ejecutar un programa, por ejemplo, las piezas de código y las piezas de datos? ¿Cómo abrimos y manipulamos archivos? ¿Qué es compilar y vincular? ¿Qué son hacer archivos? Algo de esto es simple, pero también puede ser revelador solo para ver cómo funcionan las cosas, que puede ser lo que el club cubre la mayor parte del tiempo.

Estos próximos 2 son un poco más desafiantes pero podrían ser divertidos:

4) Discutir varias ideas detrás de algoritmos tales como: 1) Dividir y conquistar, 2) Programación dinámica, 3) Fuerza bruta, 4) Creación de una estructura de datos, 5) Reducir un problema a uno similar ya resuelto, por ejemplo, los números de Fibonacci es un problema recursivo clásico para darles a los programadores principiantes, y 6) La idea de ser "codicioso", como en un ejemplo de cambio si usted estaba en un país donde las denominaciones de monedas eran a, b y c. También podría entrar en algunos ejemplos de teoría de gráficos como un árbol de extensión de peso mínimo si desea algo un tanto exótico, o los vendedores ambulantes de algo que puede ser fácil de describir, pero un dolor para resolver.

5) Funciones matemáticas ¿Cómo programarías un factorial, que es el producto de todos los números del 1 al n? ¿Cómo calcularías las sumas de varias series aritméticas o geométricas? O calcule el número de Combinaciones o Permutaciones de r elementos de un conjunto de n? Dado un conjunto de puntos, aproxima el polinomio que cumple este requisito, por ejemplo, en un plano bidimensional llamado x e y, puedes dar 2 puntos y hacer que la gente sepa qué es la pendiente e interceptar y si has resuelto pares de ecuaciones lineales ya.

6) Listas que pueden implementarse utilizando listas y matrices vinculadas. ¿Cuál es mejor para varios casos? ¿Cómo se implementan funciones básicas como insertar, eliminar, buscar y ordenar?

7) Resumen de estructuras de datos. ¿Qué son stacks y colas? ¿Cómo construyes y pruebas las clases?

8) Punteros. Esto solo lleva a una gran cantidad de temas como cómo asignar / desasignar memoria, ¿qué es una pérdida de memoria?

Esas son mis sugerencias para varios puntos de partida. Creo que comenzar una discusión puede llevar a algunos lugares interesantes si puedes juntar a algunas personas que no les importa hablar sobre el mismo tema semana tras semana en algunos casos, ya que la clasificación puede ser un gran tema para cubrir bien si quieres obtener en los puntos más finos de las cosas.


Ustedes podrían construir el proyecto TinyPIM desde " C ++ Standard Library from Scratch " y luego, cuando esté funcionando, comenzar a diseñar sus propias extensiones.


Además de las respuestas a esta pregunta , hay ciertos temas importantes que cubrir. Aquí hay un ejemplo de cómo puedes estructurar las lecciones.

Primera lección: terminología y sintaxis

Terminología a cubrir: variable, operador, ciclo (iteración), método, palabra reservada, tipo de datos, clase

Sintaxis para cubrir: asignación, operación, if / then / else, for loop, while loop, select, input / output

Segunda lección: construcción básica del algoritmo

Cubre algunos algoritmos simples, que implican algo de entrada, tal vez un ciclo for o while.

Tercera lección: Temas más avanzados del algoritmo

Esto es para cosas como la recursión, la manipulación de la matriz y las matemáticas de nivel superior. No tiene que entrar en temas demasiado complejos, sino introducir suficiente complejidad para ser útil en un proyecto real.

Lección final: proyecto grupal

Haga un proyecto en el que los grupos puedan participar.

Estas no tienen que ser lecciones de un solo día. Puede distribuir los temas en varios días.