El objetivo de este post es mostrar en líneas generales las bases de lo que es la programación y la lógica. La idea es que sirva de introducción al mundo de la programación para aquellas personas que quieran meterse y también para repaso de mis alumnos. Para esto voy a usar un programa llamado PSeInt, en el cuál podemos programar y compilar nuestros programas escribiéndolos en español y de una manera bastante coloquial y entendible. No es mi idea meterme (por ahora), en tecnicismos ni nada por el estilo. Voy a ondar los temas de la manera más general posible, mostrando sólo lo intrínsecamente necesario para que puedan desarrollar un programa básico y que después ustedes decidan si les interesa seguir aprendiendo.

01 – INTRODUCCIÓN A LA PROGRAMACIÓN

NOTA:

Your Content Goes Here

Antes que nada, para trabajar a la par, en el PSeInt ir a “Configuración” => “Opciones del lenguaje” y el elegir la opción que dice: “DaVinci”.

Se podrían decir muchas cosas acerca de la lógica de la programación, resolución de problemas, de la programación en sí misma, etc. Voy a tratar de saltear toda la introducción pesada e ir directamente a la acción, ya que cuando yo aprendí no necesité toda esa teoría de entrada, sino que lo que me facilitó el camino, aparte del hecho de que me gustaba mucho la programación, fue practicar y intentar programar cualquier tipo de cosa que se me ocurría.

Creo que lo único que necesitan saber para empezar son cosas sencillas:

  • Los programas ejecutan instrucciones PASO A PASO, línea tras línea, una debajo de la otra.
  • Para almacenar información necesitamos crear pequeños espacios de memoria.
  • Podemos hacer que tome un camino u otro dependiendo de CONDICIONES.
  • Pueden repetir una o varias líneas de código MIENTRAS una condición sea cumplida.

El resto de cosas se pueden aprender literalmente a la pasada, a medida que se van metiendo en el tema. Bien… Vamos a empezar.

02 – CONOCIENDO EL COMPILADOR

El compilador es la herramienta que vamos a usar para programar nuestras aplicaciones. Se encarga de transformar esto:

 

En esto:

O sea que de manera más corta, se encarga de crear la parte ejecutable de nuestro programa. Esto en la gran mayoría de los compiladores se puede hacer con una tecla, como por ejemplo, en el caso de PSeInt: F9.

 

03 – DECLARACIÓN DE VARIABLES

Podríamos empezar con la pregunta ¿Qué carajos es una variable?

Básicamente es un espacio en la memoria para guardar la información que necesitemos, ya sea un número, un texto, o un valor cualquiera sea.

 

Tener en cuenta que las palabras “Proceso” y “FinProceso” ya vienen creadas con el programa al crear un archivo nuevo. Básicamente son los comandos que indican dónde inicia y dónde termina el programa respectivamente.

Con respecto a la línea 2, lo que se está haciendo con esto es crear un espacio en la memoria para guardar SOLAMENTE números enteros, y le estamos poniendo un nombre a ESE espacio, llamado “num1”. Siempre es recomendable que las variables que se crean tengan un nombre descriptivo acorde a lo que se va a guardar en ellas. Por ejemplo, si se va a guardar el puntaje del usuario, quizás se debería llamar “puntaje” o “score”.

Algo importante de esto es que no se le puede poner cualquier nombre. Esto es más que nada porque hay algunos nombres que el programa podría confundir con otro tipo de cosas, como por ejemplo otra instrucción. Entonces… Nombres que NO son válidos serían:

  • NO puede empezar con un número.
  • NO puede llamarse igual que una palabra reservada, por ejemplo “Proceso“.
  • NO puede empezar con un caracter que no sea una letra, a menos que este caracter sea “_” (guión bajo).

Cada TIPO de variable sirve para guardar distintos tipos de cosas, ya sean números enteros, números con coma, texto, o incluso datos más complejos como a un personaje, un escenario, etc. Lo que cambia es que CADA TIPO necesitas más o menos memoria. Por eso no sería conveniente hacer cosas como crear una variable numérica grande para guardar todo tipo de datos, y sólo usarla para la vida de un personaje.

04 – SENTENCIAS INICIALES

Vamos a aprender algunas sentencias iniciales antes de programar nuestra primera aplicación. Todo lenguaje tiene comandos, sentencias, procesos, como quieran decirlo, que básicamente son instrucciones ya predefinidas que cumplen una tarea determinada.

Las primeras dos que vamos a ver se llaman “Escribir” y “Leer”. Ambas, como la gran mayoría de los comandos, reciben algún “parámetro”. Los parámetros son datos que uno le da a cada instrucción como para que se haga algo con él. Por ejemplo, si querémos escribir algo en la pantalla, usaremos el comando “Escribir” y le pasaremos por parámetro “qué cosa” vamos a escribir.

Cada lenguaje tiene su propia manera de pasar estos parámetros. En el caso de PSeInt es utilizando un espacio. O sea:

 

Noten que el texto lo estamos poniendo entre comillas. Esto es porque todas las cadenas de texto van entre comillas. Si no las ponemos, el programa piensa que estamos refiriéndonos a nombres y/o comandos del lenguaje, y podría tirar errores. Es importante tener esto en cuenta, ya que los errores que puede tirar de no hacerlo pueden no ser muy claros. Pero si tenemos en cuenta el por qué los tira vamos a tener bastante más idea de cómo corregirlo.

La otra sentencia que vamos a ver es “Leer”. Esta sentencia lo que hace es detener la ejecución del programa y esperar a que el usuario ingrese un valor. Dicho valor lo va a guardar en la variable que usemos como parámetro. En este caso, vamos a necesitar tener creada al menos una variable, que será la que usemos como parámetro del comando “Leer”. Por ejemplo:

 

En este caso, nuestro programa se detendrá en la línea 3 hasta que el usuario ingrese un valor y presione ENTER. El comando “Leer” nos pide el nombre de una variable porque es ahí en donde va a poner el valor que el usuario ingrese. Hay que tener en cuenta que si el usuario ingresa un número con coma, por ejemplo 1.5, no se va a poder guardar en la variable porque la misma es ENTERA y no REAL. Muchos lenguajes pueden o bien omitir la parte con coma o tirar un error.

Podríamos hacer un pequeño agregado al programa anterior para que sea más claro al usuario, como escribir un texto que indique qué se le está pidiendo:

 

Con esto nuestro programa ahora es un poco más claro. Noten que dejé un espacio en blanco entre la declaración de la variable y el siguiente comando. Esto es sólo para que quede más prolijo, no tiene nada que ver con el lenguaje en sí.

 

05 – PONIENDO VALORES A NUESTRAS VARIABLES

Siempre que vayamos a hacer algún juego/programa vamos a necesitar ponerle un valor a nuestras variables, en lugar de dejar que el usuario lo haga (como vimos en el ejemplo del comando “Leer“). Para esos casos, vamos a usar algo llamado “OPERADOR”. Hay muchos tipos de operadores, cada uno con una función específica. Vamos a empezar usando el operador “=” (igual), que sirve para guardar un dato en una variable. Veamos un ejemplo:

 

 

En este ejemplo lo que hicimos fue guardar el número 5 dentro de la variable num1. Podríamos decir con esto que el operador “=” GUARDA lo que yo ponga a su derecha en lo que yo ponga a su izquierda (o sea, el 5 dentro de num1). Si yo lo quisiera hacer al revés (o sea 5 = num1), el programa tiraría error, ya que no puede escribir la variable num1 dentro del número 5.

En general, los operadores requieren dos partes para operar, una a su izquierda y otra a su derecha. Tal es el caso de los operadores matemáticos como suma, resta, multiplicación y división (+, -, *, / respectivamente). Ahora… ¿Cómo hacemos para usarlos? De la misma manera que el operador igual, sólo que hay un pequeño detalle a tener en cuenta.

 

El programa tiene un “pequeño” problema. Y es que la computadora va a llegar a la línea 4 y… ¿Qué va a hacer? Efectivamente va a sumar pero… Va a hacer algo que USTEDES deberán recordar siempre.

 

“El programa hará SIEMPRE lo que LE DIGAMOS QUE HAGA pero raras veces LO QUE QUERAMOS QUE HAGA”.

Esta frase los debería acompañar durante el resto de sus vidas, y a medida que pase el tiempo se van a dar cuenta por qué.

Volviendo al ejemplo anterior, lo que pasa acá es que, como les dije, el programa va a llegar a esa línea y va a sumar, efectivamente, pero… NO VA A HACER NADA CON EL RESULTADO DE ESA SUMA. Esto es porque al hacerlo, jamás le dijimos que haga algo, como guardarlo en una variable, así que simplemente hace la cuenta matemática y… DESHECHA, literalmente, el resultado. Así que, además de decirle que haga la cuenta, también hay que aclararle que guarde el valor, ya que nuestros primeros programas van a ser muy estúpidos. Entonces, quedaría así:

 

En este caso, estamos usando una variable adicional para guardar el resultado. Pero también se le puede asignar A LA MISMA variable. Esto se usa mucho, cuando quiero ir “acumulando” valores dentro de una variable, ya sea para sumar puntaje o contar las veces que pasó algo. Dejo el ejemplo, pero más adelante, mediante ejercicios, voy a intentar que se familiaricen más.

 

Lo mismo aplica para cualquiera de los otros operadores mencionados. De esta manera, y hasta ahora, ya saben cómo crear un programa, crear variables, asignarles valores e interactuar con el usuario. Les dejo a continuación un par de ejercicios. Hay algunas cosillas que no les dije cómo hacerlas, así que en base a pruebas y errores espero que utilizando la lógica encuentren cómo resolverlas. Esto es porque en la GRAN mayoría de las situaciones, los problemas los van a resolver así: “con intuición”. Así que… ¡DESARROLLENLA!

  1. Crear un programa que pida un número al usuario y le muestre el doble de dicho número.
  2. Crear un programa que pida dos números al usuario, los sume entre sí y muestre el resultado al usuario.
  3. Crear un programa que pida tres números al usuario y muestre el promedio de los mismos.

06 – CONDICIONALES

¡ACLARACIÓN!

Hasta acá, y con cada bloque que enseñemos, se va a tomar en cuenta que cada persona leyendo esto, y cada parte, entendió completamente lo anterior. Esto es porque en cada paso que demos siempre vamos a utilizar TODO lo aprendido hasta el momento. Así que recomiendo que no se avance hasta no estar seguro de haber aprendido el paso anterior. 

Aclarado lo anterior, lo que vamos a ver ahora son las estructuras condicionales que hacen que nuestros programas tomen un camino u otro, dependiendo de algo puntual. Veamos un ejemplo de un caso en el cual se necesitaría esto:

 

En el programa anterior lo que se hace es pedir dos números al usuario y dividirlos entre sí. La pregunta es: ¿Qué pasaría si el usuario ingresa 0 en el segundo número?

Y con esto tenemos el primero problema. Lo que pasaría es que el programa se rompería y tiraría un error diciéndo: “No se puede dividir por 0”. Este es uno de los tipos de errores que suele romper el programa, así que habría que evitarlo. Para hacerlo, vamos a usar las estructuras condicionales. Una de ellas es “Si-Entonces”.

 

Entonces, de esta manera, SOLAMENTE ejecutará el bloque de código que pudismos entre el “Si” y el “FinSi” si la condición dada se cumple (o sea, si el resultado es VERDADERO).

Quizás se pregunten entre otras cosas cómo funciona esto del VERDADERO y FALSO. Bien… ¿Recuerdan los operadores matemáticos +, -, *, /? Bueno, esto funciona de la misma manera, con la diferencia de que en lugar de devolver un número, devuelve VERDADERO o FALSO. Esto sirve para varias cosas, y resulta que CASUALMENTE la estructura condicional “Si-Entonces” necesita uno de esos dos valores, para saber si ejecuta o no el bloque de código encerrado entre “Si-FinSi”.

Estos operadores se llaman “Operadores Lógicos”. Vamos a ver a continuación algunos de ellos.

  • ==   Comprueba si la izquierda y la derecha son iguales.
  • !=    Comprueba si la izquierda y la derecha son distintas.
  • <     Comprueba si la izquierda es MENOR que la derecha.
  • >     Comprueba si la izquierda es MAYOR que la derecha.
  • <=   Comprueba si la izquierda es MENOR O IGUAL que la derecha.
  • >=   Comprueba si la izquierda es MAYOR O IGUAL que la derecha.

 

¿Pueden reconocer cuál usamos en el último ejemplo y por qué?

 

Para complementar la estructura “Si-Entonces” está la sentencia “Sino”. Esta sólo puede usarse con una estructura “Si-Entonces” y lo que hace es ejecutar un bloque de código “Sino” se cumple el bloque donde se puso la condición. Siguiendo el ejemplo anterior quedaría así:

 

Esta parte viene a cubrir la necesidad de ejecutar una línea de código u otra dependiendo de si una condición dada se cumple o no. Es útil cuando no queremos volver a tipear otro “Si-Entonces” para preguntar lo opuesto a lo anterior. Les dejo un par de ejercicios para practicar:

  1. Crear un programa que pida dos números, saque el promedio de los mismos y si el resultado es mayor o igual a 4 mostrar el resultado, sino mostrar un mensaje que diga: “El promedio es muy bajo.”.
  2. Crear un programa que pida el ingreso de 3 números y luego muestre un mensaje indicando si los 3 son menores a -1 o si no lo son. El programa SOLAMENTE debe mostrar UN mensaje que diga: “Los 3 son menores a -1” o “Alguno o los 3 no lo son”.

CONECTORES LÓGICOS

Muchas veces vamos a tener la necesidad de antes de entrar a un bloque Si-Entonces haya que chequear dos o más condiciones. Por ejemplo, la condición para que un usuario gane en un juego podría ser que “haya derrotado a todos los enemigos” o “haya llegado al final del nivel”. Otro ejemplo podría ser con respecto a los disparos, cuyas condiciones serían “que el personaje esté vivo” y “que el personaje tenga munición”.

Ambos ejemplos anteriores plantean el uso de dos tipos de conectores lógicos que son el “OR” (ó)  y el “AND” (y), respectivamente. Lo que se hace es utilizarlos de la misma manera en la que usaríamos los operadores + y – pero en lugar de devolver un número, devuelve un valor lógico (o sea, VERDADERO o FALSO). Para ello, necesita que tanto el valor de la izquierda, como el de la derecha, sean valores lógicos también. Voy a usar un ejemplo comparándolo con una suma:

El operador se simboliza con “||”.

SUMA: número + número = número => 10 + 12 = 22.
OR: lógico || lógico = lógico => VERDADERO || FALSO = VERDADERO.

También se podrían combinar con los otros operadores:

(4 < 5) || (10 == 12)

Lo pongo entre paréntesis para que quede claro el órden de la resolución. Primero resolvería ambos paréntesis, haciendo que quede en un (VERDADERO) || (FALSO), y luego resuelve la cuenta final, la cual daría VERDADERO, ya que al menos uno de los dos valores lo es.

Acá viene una de las piedras fundamentales de estos operadores.

OR: Sólo devuelve FALSO si ambos valores a sus lados son FALSOS.
AND: Sólo devuelve VERDADERO si ambos valores a sus lados son VERDADEROS.

Veamos un ejemplo más de la vida real:

OR: Si aprobás el primer parcial o aprobás el segundo, entonces pasas la materia.
AND: Si aprobás el primer parcial y aprobás el segundo, entonces pasas la materia.

La pregunta para ustedes sería: ¿Qué condiciones deben darse en cada caso para pasar la materia?

Ahora pasemos todo a OR y AND:

OR: Si aprobás el primer parcial OR aprobás el segundo, entonces pasas la materia.
AND: Si aprobás el primer parcial AND aprobás el segundo, entonces pasas la materia.

¿Se entiende un poco mejor?

Ahora imaginen que cada respuesta positiva es un “VERDADERO” y cada negativa es un “FALSO”. O sea, reemplacen los términos de la izquierda y la derecha de cada operador, por valores que definan si APROBARON (VERDADERO) y otro que indique si DESAPROBARON (FALSO).

Bien… Veamos un ejemplo en el sistema de código que venimos usando hasta el momento.

  • En el ejemplo de arriba va a entrar cuando AL MENOS UNA de las dos condiciones sea VERDADERAS.

  • En el ejemplo de abajo va a entrar SOLAMENTE cuando AMBAS CONDICIONES sean VERDADERAS.

Veamos un par de ejercicios:

  1. Ingrese dos números, si el primero es mayor que el segundo o el segundo es igual a 0 imprima en pantalla el mensaje “al menos un número de los ingresados es válido” y si los valores no son válidos imprima el siguiente mensaje “los valores ingresados no son válidos”.
  2. Ingrese un número, si es mayor a 45, menor a 500 y no es el 84 imprima en pantalla el siguiente mensaje “El número ingresado es valido”, sino imprima en pantalla el mensaje “el valor ingresado no es válido”.
  3. Ingrese un número, si es menor a 45 y mayor a 30 o el número es el 99 o el 15 imprima en pantalla el siguiente mensaje “El número ingresado es válido” sino imprima en pantalla el siguiente mensaje “el valor ingresado no es válido”.

BUCLES (MIENTRAS)

Y llegamos a los bucles… Creo que la definición no hace mucha falta, pero podría explicarse con una imagen:

 

Básicamente es un bloque de código que se ejecuta una, y otra, y otra, y ooooootra vez, MIENTRAS una condición de VERDADERO. Hay varios tipos de bucles, pero básicamente la lógica es la misma en todos. En este caso, el bucle MIENTRAS se escribe de la siguiente forma:

 

Luego de ejecutar todo el bloque de código que tiene dentro, este bucle irá a la línea del comienzo y evaluará de nuevo la condición. Si dicha condición da VERDADERA, ejecutará nuevamente el código dentro y volverá a hacer la misma pregunta MIENTRAS el resultado siga siendo VERDADERO.

El ejemplo de código anterior genera un bucle infinito. Al no romperse en ningún momento la condición el código queda atrapado y vuelve a empezar una y otra vez. Siempre deberíamos asegurarnos que se pueda salir de cada bucle en algún momento, más que nada para evitar que nuestros programas cuelguen haciendo una y otra vez lo mismo sin ningún sentido.

A continuación se muestra un ejemplo sobre cómo podría nuestro bucle cortarse en algún momento: 

 

Ahora sí, este bucle se ejecutaría (¿cuántas veces?), y luego terminaría.

En líneas generales, los bucles sirven para evitar tener que escribir varias veces las mismas líneas de código. En lugar de eso nos permite sistematizar dicha tarea y hacer más expandible nuestro código. Un ejemplo muy útil es cuando querémos seguir pidiendo el ingreso de un dato MIENTRAS este sea inválido. Eso haría que el usuario tenga que escribirlo una y otra vez mientras lo siga ingresando mal.

Bueno… No hay mucho más que se pueda decir de este bucle… Por ahora. Vamos a los ejercicios.

  1. Hacer un programa que pida dos números y los divida entre sí. Recordar que la división por 0 produce un error en el programa, así que no debería hacer la cuenta hasta que el segundo valor ingresado sea distinto de 0.
  2. Hacer un programa que pida números indefinidamente, y cuando se presione “-1” mostrar cuál es el menor de todos los números ingresados.

BUCLES (PARA)

El bucle “PARA” es un tipo de bucle muy similar al anterior. La diferencia radica en que este tipo de bucle se usa cuando sabemos cuántas veces queremos repetir un bloque de código. Por ejemplo, cuando querémos pedir exactamente 10 números a un usuario. El funcionamiento base es igual, pero la creación del bucle es un tanto diferente. Veamos el pseudocódigo:

 

En este ejemplo, este texto saldría 11 veces. ¿Por qué? Porque empieza en 0 y se repite HASTA llegar a 10 inclusive. Como se puede ver, el mismo bucle va a aumentar el valor de la variable “contador” hasta que llegue al valor especificado. Luego de eso, sale del bucle y continúa con el resto del código que venga.

En términos generales, este bucle no tiene demasiadas vueltas. La cosa es: Si entendieron cómo funcionaba el MIENTRAS, el bucle PARA funciona de manera casi idéntica. La variación que tiene es que específicamente le decimos que va a terminar en el último valor. El funcionamiento técnico y real no es exactamente ese, pero si aprenden a usarlo de esta manera, cuando lo usen en un lenguaje de programación real las diferencias van a ser tan mínimas que lo van a aprender enseguida.

Les dejo unos ejercicios con este bucle e intenten resolverlos para ver lo que les digo.

 

  1. Hacer un programa que pida 10 números y luego muestre el promedio de los mismos.
  2. Hacer un programa primero pregunte cuántos números va a ingresar el usuario. Luego los pida uno por uno y al final indique cuál es el número más chico ingresado.

Bueno… Eso es todo lo que necesitan saber (para empezar), acerca de la lógica de la programación. Es un mundo bastante amplio, y un camino de ida nada más. No recomiendo meterse en el mundo del desarrollo de aplicaciones sin saber al menos los componentes básicos del tema, ya que sólo van a encontrar frustraciones. Es como querer tener una charla en francés con alguien sin haber hablado nunca el idioma.

Espero que les sirva. Cualquier duda o consulta pueden hacerla en los comentarios.