Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tipos de datos
Muchos lenguajes utilizan lo que se denomina “tipado estático” (statically typed). Esto
significa que al momento de declarar variables y constantes, deberemos siempre indicar el
tipo de dato asociado, esencialmente para una mejor gestión de los recursos de memoria
disponibles. Por ejemplo en C/C++, si deseamos utilizar una variable para operar con un
número entero, la declaramos como:
Como cualquier variable, podremos modificar su valor en todo momento, pero si intentamos
asignar un valor que no se corresponde con el tipo de dato, como por ejemplo vr01 = 15.5, el
compilador no lo permitirá, arrojando un error de tipos.
Por supuesto existen otros tipos de datos, por ejemplo para manejar cadenas de texto o
diferentes tipos numéricos, pero en esencia el concepto a recordar es el mencionado en el
primer párrafo: en los lenguajes de tipado estático, siempre deberemos indicar el tipo de
dato al momento de declarar una variable.
Otros lenguajes de alto nivel, como el caso característico de Python, no tienen este
requerimiento, por ejemplo:
nroEnt = 5
print(nroEnt)
imprimirá el valor 5, y
nroDec = 5.1
print(nroDec)
Estas son 3 de las operaciones más básicas que podemos realizar sobre datos. Esto no
significa que no sean utilizadas, muy por el contrario, siempre encontraremos este tipo de
instrucciones en todos los códigos, por más sencillos o complejos que sean.
Sumador
v1 = 10
v2 = 20
v3 = v1 + v2
En este caso hemos declarado 3 variables: v1 y v2 tienen los valores 10 y 20, v3 no ha sido
declarada de forma fija, sino que depende de los valores de v1 y v2, por ende en este
ejemplo, v3 tiene el valor actual de 30.
Contador
Como bien lo anticipa su nombre, un contador tiene como objetivo básico contar, por lo cual
se suele utilizar dentro de algún tipo de ciclo, comenzando en 0 e incrementando su valor en
1 cada vez que se cumple un recorrido (o loop) del ciclo, aunque lógicamente podría iniciar
en otro valor que no fuese 0. En pseudocódigo, podemos tener un ejemplo como:
Inicio
Declarar contador = 0
Abrir ciclo indefinido
contador = contador + 1
Si contador = 10 entonces
salir del ciclo
Cierra Si
Cierra ciclo
Imprimir contador
En este caso declaramos una variable llamada contador, que comienza con el valor 0.
Un ciclo, como veremos más adelante, es esencialmente un bloque que repite las
instrucciones contenidas dentro, con contador = contador + 1, estamos incrementando el
valor de la variable contador en 1 cada vez que el ciclo pasa por allí.
Con la condición debajo, si observamos que contador llega al valor 10, simplemente salimos
del ciclo, con lo cual al imprimir debajo contador, imprimirá el valor 10.
Acumulador
Inicio
Declarar acu1 = 0
Declarar nro = 0
Abrir ciclo de 1 a 5
Pedir nro al usuario
acu1 = acu1 + nro
Cierra ciclo
Aquí lo que hacemos es solicitar 5 números al usuario, por supuesto no podemos saber de
antemano cuáles serán los números ingresados, sí podríamos restringir las entradas (por
ejemplo no permitiendo números negativos, o con decimales).
acu1 inicia en 0, pero en cada ciclo se le suma el valor de nro, que es el número ingresado
por el usuario.
De esta forma, si el usuario ingresa por ejemplo los números 16 3 3 1 y 20, la progresión del
valor de la variable acu1 sería:
- antes del ciclo: 0
- 1er ciclo: 16
- 2do ciclo: 19
- 3er ciclo: 22
- 4to ciclo: 23
- 5to ciclo: 43
Sin dudas se encuentran también entre los elementos esenciales en cualquier código. En la
gran mayoría de los proyectos, llegará el momento en el que necesitaremos repetir la
ejecución de un paquete de instrucciones constantemente, o una determinada cantidad de
veces, y allí requeriremos de algún tipo de ciclo para poder hacerlo. Básicamente un ciclo
contendrá una lista de instrucciones, las ejecutará en orden y al llegar a la última, retornará
a la primera para repetir.
Un ciclo indefinido tiene una esencia similar, pero puede “cortarse” en cualquier momento si
se da una determinada situación contemplada dentro del paquete de instrucciones que
repite, por ejemplo el pulsado de un botón. En el primer caso (infinito), el paquete se repetirá
mientras el programa se mantenga en ejecución; en este caso también lo hará, pero tan
pronto como el botón sea presionado, se interrumpirá y saldrá del ciclo.
Por último, un ciclo finito es simplemente aquel que se repite una cantidad prefijada de
veces, por ejemplo si deseamos solicitar 10 números al usuario, realizaremos un ciclo que
se repetirá obviamente solo 10 veces, y contendrá internamente el paquete de instrucciones
que permita ingresar un número y procesarlo.
Los comandos más habituales para realizar ciclos en los diferentes lenguajes, son for(),
while(), loop(), do loop() o do while(). Veamos un ejemplo en Python:
Esta es una forma tradicional de repetir comandos una determinada cantidad de veces, en
este caso se imprimirán los números 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. Si deseáramos comenzar
desde el 1 e incluir el 10, cambiaríamos por
Cómo podríamos modificar este código para imprimir solo el valor final de la sumatoria entre
1 y 10? (55).
Estructuras de Control. Sentencias condicionales.
Volviendo al ejemplo sencillo anterior, de imprimir mediante un ciclo los números del 1 al 10,
vamos a modificarlo ahora para imprimir solo los pares. Podremos aprovechar la misma
base de código, pero tendremos que incorporar una condición que nos permita evaluar si el
número actual es par o impar, para “decidir” si debemos imprimirlo o no. Entonces:
Previamente la línea print(ciclo) se ubicaba directamente dentro del for(), es decir, era
ejecutada cada vez que el ciclo pasaba por allí. En este caso se ubica dentro de una
condición, por lo tanto en cada ciclo esa condición es evaluada -y solo si es verdadera- es
ejecutado el print().
El ciclo for() seguirá ejecutándose 10 veces (range(1, 11)), la condición if() será evaluada 10
veces, pero la instrucción print() solo será ejecutada cuando la condición devuelva un
resultado verdadero, y devolverá verdadero únicamente cuando ciclo % 2 sea 0.
Cómo podríamos modificar la condición para imprimir pero solo los impares?.
Así como podemos ejecutar un determinado paquete de instrucciones sólo si se cumple una
condición, es muy habitual tener la necesidad de ejecutar determinadas cosas al cumplirse,
y otras al no cumplirse. Si por ejemplo deseamos imprimir para cada número entre 1 y 10 si
es par o impar, podemos utilizar:
Veremos un detalle de operadores para tener una mejor referencia, y retomaremos luego
con otro ejemplo para ver esta situación.
Operadores aritméticos
Los operadores aritméticos son los que estamos más habituados a observar cotidianamente,
por su utilización en Matemática. Obviamente son también fundamentales al momento de
escribir código. Tenemos entonces:
● +: suma
● -: resta
● *: multiplicación
● /: división
Y otros como
● //: división entera
● %: módulo (resto de la división)
● **: exponencial (número elevado a la potencia)
Los primeros 4 no requieren demasiada presentación, son los que aplicamos habitualmente
desde pequeña edad para distintas operaciones sobre números. El orden de prioridades es
el que hemos aprendido desde chicos en Matemática, es decir, si en una operación tenemos
sumas o restas, y multiplicaciones o divisiones:
● Primero se ejecutan multiplicaciones y divisiones.
● Luego sumas y restas.
calculo = 8 / 2 + 4 * 3
calculo = 4 + 12
calculo = 16
calculo = 20 - 3 + 17
calculo = 17 + 17
calculo = 34
Operadores relacionales
Los operadores relacionales esencialmente son símbolos que nos permiten comparar
valores. Ya hemos utilizado uno de ellos en los ejemplos de arriba, al escribir:
if (ciclo % 2 == 0)
(si la división por 2 de ciclo es igual a 0)
Con ellos podemos armar de forma sencilla diferentes tipos de condiciones. Supongamos
que recibido un número, deseamos evaluar si es negativo, positivo o cero:
numero = 20
if (numero == 0):
print(“es cero”)
elif (numero > 0):
print(“es positivo”)
else:
print(“es negativo”)
Utilizamos el operador ==, de la misma forma que los ejemplos anteriores, pero ahora
aplicamos además el operador >, para determinar si el número es positivo.
Operadores lógicos
En complemento con los operadores relacionales, aparecen los operadores lógicos, que nos
permiten “encadenar” diferentes condiciones para ser evaluadas en conjunto, siguiendo la
lógica Booleana. La principal ventaja de esta situación es lograr un código más limpio y
organizado.
Podemos ver el resultado de las salidas en las 3 compuertas básicas (OR, AND y NOT):
Compuerta OR
E1 E2 S
0 0 0
0 1 1
1 0 1
1 1 1
Compuerta AND
E1 E2 S
0 0 0
0 1 0
1 0 0
1 1 1
Compuerta NOT
E S
0 1
1 0
numero = 500
if(numero == 0):
print(“Es 0”)
elif(numero < 0):
print(“Es negativo”)
else:
if(numero > 1000):
print(“Es positivo y mayor a 1000”)
else:
print(“Es positivo pero no mayor a 1000”)
En este ejemplo tenemos una “anidación” de condiciones (unas dentro de otras); un primer
if() para determinar si el número es 0, negativo o positivo, y un segundo if() dentro de la
condición de positivo, para saber si es mayor a 1000 o no.
numero = -120
if(numero == 0):
print(“Es cero”)
elif(numero < 0):
print(“Es negativo”)
elif(numero > 0 and numero > 1000):
print(“Es positivo y mayor a 1000”)
else:
print(“Es positivo pero no mayor a 1000”)
Ahora obtendremos la misma funcionalidad, pero sin “anidar” ningún if(), manteniendo un
solo nivel con 4 posibles situaciones:
- Si el número es 0, será verdadera la primer situación, sino
- Si el número es < 0, será verdadera la segunda, sino
- Si el número es > 0 y además > 1000, será verdadera la tercera, sino
- Si el número no es 0, ni tampoco < 0, ni tampoco > 0 y a 1000, entonces la única
situación restante es que sea > 0 pero no a 1000, por esa causa la última opción solo
utiliza un else:, no es necesario en ese caso volver a revisar condiciones, si no se ha
validado ninguna de las 3 primeras, forzosamente el número será positivo pero no
mayor a 1000.
Como este ejemplo, existen otros, el operador != (distinto a), se utiliza de la misma forma en
Python o C/C++, pero puede expresarse distinto en otros lenguajes, por ejemplo con el
símbolo <>.
No obstante, como podemos ver, la estructura básica de la condición se mantiene, salvo
detalles de sintaxis y el símbolo empleado para el operador, por lo cual bastará con estar
atento según sea el lenguaje utilizado y aplicar los símbolos correspondientes. De no
hacerlo, el compilador o el intérprete según el caso, generarán un error.
Expresiones
Muchas veces, cuando tenemos necesidad de trabajar con condiciones complejas, el código
puede volverse más incómodo de leer. Cuando asignamos variables, no estamos limitados a
asignar solamente valores específicos, podemos también asignar expresiones que se
resolverán en tiempo de ejecución, dando a la variable el valor correspondiente. Por
ejemplo, en la situación de arriba, donde colocamos la condición:
Como vemos, la expresión que antes se encontraba dentro de la condición (if), ahora está
asignada a una variable, y esta variable es la que se verifica en la condición. Este
mecanismo de expresiones no se emplea de forma constante en la práctica, pero en
algunos casos puede resultar de mucha utilidad para “limpiar” el código y permitir visualizar
con más claridad las condiciones.