Sunteți pe pagina 1din 29

Conceptos Básicos de Programación 1

1. INTRODUCCIÓN A LAS COMPUTADORAS


Computadora: Dispositivo electrónico que toma datos del usuario, los procesa y los convierte
en información útil para cumplir con un propósito específico. Esta información puede ser visualizada
según la necesidad o puede ser almacenada para el futuro.

1.1 COMPONENTES BÁSICOS DE UNA COMPUTADORA


En una computadora se distinguen principalmente dos aspectos:

HARDWARE, el soporte físico, no modificable (placas, circuitos integrados, chips,


módulos, cables, etc.), es decir la “maquinaria”.

SOFTWARE, el conjunto de programas que se ejecutan en la computadora, grosso


modo divididos en:

• Software del sistema o sistema operativo, el conjunto de programas


necesarios para que la computadora tenga capacidad de trabajar
(funcionamiento de la pantalla, del teclado, movimientos del ratón, etc.).
Ejemplos de sistemas operativos son Windows, Linux, Android, MAC OS.

• Software de aplicación que son los programas que maneja el usuario


(tratamiento de textos, hojas de cálculo, bases de datos, etc). Aunque
actualmente se utiliza el término “aplicaciones” para referirse al software
o los programas de una computadora.

El modelo básico de las computadoras actuales se atribuye a Von Neuman1. Consta


principalmente de la unidad central de proceso, la memoria y los dispositivos de
entrada/salida, conectados entre sí como se muestra de forma esquemática en el
diagrama mostrado en la Figura 1.1.
Conceptos Básicos de Programación 2

1.2 UNIDAD CENTRAL DE PROCESO (CPU)


Unidad central de proceso o CPU (Central Process Unit) es el “cerebro” de la
computadora: ejecuta las instrucciones de los programas y controla el funcionamiento
de los distintos componentes de la computadora. Suele estar integrada en un chip
denominado microprocesador. Los dos componentes más importantes de la CPU son:

La unidad de control o CU (Control Unit), dirige y coordina la mayoría de las


operaciones de la computadora. Interpreta cada instrucción enviada por un
programa e inicia la acción apropiada para realizar esa instrucción. Para cada
instrucción, la unidad de control repite un grupo de cuatro operaciones básicas, que
constituye lo que se llama ciclo de instrucción:

1. Leer (“fetch”) - es el proceso de obtener una instrucción de un programa o


datos de la memoria.

2. Decodificar (“decode”) - es el proceso de traducir la instrucción en comandos


que la computadora pueda ejecutar.

3. Ejecutar (“execute”) - es el proceso de llevar a cabo los comandos.

4. Escribir (“writeback”) - es el proceso de almacenar el resultado del paso de


ejecución, “escribiéndolo” en la memoria.

La unidad aritmético-lógica o ALU (Arithmetic Logic Unit), que realiza las


operaciones elementales que constituyen el programa (sumar, multiplicar,
comparar, etc).

La velocidad de un procesador se suele medir en hercios (Hz): número de operaciones por


segundo que puede realizar.
Conceptos Básicos de Programación 3

1 Megahercio (Mz) = 106 operaciones/segundo


1 Gigahercio (Gz) = 109 operaciones/segundo

1.3 MEMORIA
Son los componentes de hardware en los que se almacena la información procesada por la
computadora. Generalmente, se distinguen entre la memoria central y la memoria
secundaria (véase más adelante).

La principal característica de las memorias es su:

Capacidad: indica la cantidad de datos que puede almacenar. Se mide en bits bit
(binary unit), o múltiplos del bit. Los bits suelen agruparse de ocho en ocho: 1 byte=
8 bits. Las unidades de almacenamiento están recogidas en la Tabla 1.1.

1.3.1 MEMORIA CENTRAL


Memoria central o principal, también conocida como Memoria RAM (Random Acces
Memory), (memoria de acceso aleatorio), almacena tanto la secuencia de instrucciones
del programa o programas que se esté ejecutando en cada momento como los datos que
este o estos necesitan o generen. Su contenido es volátil, es decir, se borra al apagar la
computadora. La denominación Acceso Aleatorio es antigua y se comenzó a utilizar para
diferenciarla de otro tipo de memoria (cintas magnéticas) que era de acceso secuencial:
para acceder a un dato había que recorrer todos los anteriores.

La memoria central es un circuito que se puede imaginar como una enorme tabla que
almacena información en cada una de sus celdas o posiciones de memoria (véase Figura
1.2).
Conceptos Básicos de Programación 4

Cada celda es una agrupación de bytes que se denomina palabra. Dependiendo de la


computadora, existen palabras de 4 bytes (32 bits), 8 bytes (64 bits). Las palabras están
numeradas correlativamente, comenzando desde 0. El número de una palabra es la
dirección de esa palabra. La información almacenada en una palabra es su contenido.

1.3.2 MEMORIA ROM


Memoria ROM (Read Only Memory), (memoria de sólo lectura). Es permanente, esto es, no
se borra al apagar la computadora y no se puede alterar (o se puede hacer difícilmente).
Almacena códigos de programa grabados en fábrica necesarios para el funcionamiento de
la computadora, como por ejemplo, la secuencia de instrucciones que hay que ejecutar
cuando se enciende la computadora (BIOS: Basic Input/Output System; POST: Power On Self
Test).

1.3.3 MEMORIA CACHÉ


Con el objetivo de que el procesador pueda obtener los datos de la memoria central más
rápidamente, la mayoría de los procesadores usan un tipo especial de memoria llamada
memoria caché o RAM caché (pequeña y de acceso muy rápido). En ella, además se
almacenan los datos más recientes y las instrucciones inminentes.

1.3.4 MEMORIA SECUNDARIA


Como hemos mencionado, toda la información en la memoria central es a ccesible
directamente en un tiempo muy corto; por ello dicha memoria es cara.
Conceptos Básicos de Programación 5

Memoria secundaria es una memoria más barata donde, a cambio de mayores tiempos
de acceso, se puede conservar gran cantidad de información (disco duro, CD (Compact Disk),
DVD (Digital Versatile Disk), memoria flash, etc). En ella se almacena todo lo que la unidad
central de procesos (véase la Sección 1.2) no necesita urgentemente. La principal
característica de este tipo de memorias es que su contenido no se pierde al apagar la
computadora.

1.4 DISPOSITIVOS DE ENTRADA/SALIDA


Dispositivos de entrada/salida son todos los componentes de hardware anexos que
permiten la comunicación entre la computadora y el usuario. Los dispositivos de
entrada son, por ejemplo, teclados, ratones, lectores de discos, micrófonos, etc. Los
dispositivos de salida son, por ejemplo, monitores, impresoras, etc.

1.5 SISTEMA OPERATIVO


El sistema operativo es el software que permite al usuario la utilización eficiente de
los recursos de una computadora. Ejemplos de sistemas operativos son WINDOWS,
Mac OS, UNIX, Linux, Android. Se compone de un paquete integrado de programas de
dos tipos:

Programas de control: gestionan el hardware y software, por ejemplo, colas de


impresión etc.

Utilidades del sistema: programas de ayuda al usuario, por ejemplo, editores de


texto, gestión de correo, etc.

1.6 LENGUAJES
Un lenguaje de programación es un conjunto de símbolos y reglas sintácticas y
semánticas que sirven para describir las ´ordenes que controlan el comportamiento
físico y lógico de una máquina.

Los procesadores de las máquinas sólo son capaces de entender y obedecer


programas escritos en lenguaje-máquina, cuyas instrucciones son cadenas binarias
(formadas por 0 y 1) que se pueden “cargar” directamente en la memoria central, sin
necesidad de traducción. Sin embargo, el lenguaje máquina es específico de cada tipo
de computadora, por lo que los programas escritos en dicho lenguaje no son portables
en general de una máquina a otra. Además, debido a su representación totalmente
numérica, son muy difíciles de escribir, leer y corregir.

El lenguaje ensamblador facilita (sólo un poco) esas tareas, ya que permite la escritura
de las instrucciones básicas “entendibles” por la CPU en una forma más legible para el
programador. A modo de ejemplo, una instrucción básica ejecutable por la CPU podría
ser:
Conceptos Básicos de Programación 6

copiar el contenido de la celda 164 en la celda 183.

En lenguaje-máquina esta instrucción podría escribirse (sólo es un ejemplo)

mientras que en lenguaje ensamblador se podría escribir de forma parecida a:

CP 164 183

Usualmente hay una correspondencia uno a uno entre las instrucciones simples de un
código ensamblador y las de un código máquina. Por ello, el ensamblador sigue siendo
un lenguaje de bajo nivel: por un lado, el programador necesita conocer en
profundidad la arquitectura de la máquina, por otro los programas escritos en
ensamblador no son portables.

Los lenguajes de alto nivel, por el contrario, no obligan al programador a conocer los
detalles de la computadora que utiliza. Las instrucciones se escriben en un formato
flexible y más “humano”. Además, se pueden escribir, de forma sencilla, instrucciones
mucho más complicadas: cada instrucción en un lenguaje de alto nivel corresponde a
varias (incluso muchas) de lenguaje-máquina. La instrucción de los ejemplos
anteriores se podría escribir:

A=B

Ejemplos de lenguajes de alto nivel son Basic, Fortran, Pascal utilizados en las primeras
generaciones de computadoras, también están, C , C++, C#, Java, Python, Javascript,
Visual Basic y otros.

El computador sólo “comprende” los programas escritos en lenguaje-máquina.


Cualquier otro debe ser traducido.

La traducción de un programa escrito en ensamblador a lenguaje-máquina la realiza


un programa específico denominado también ensamblador.

Un programa escrito en un lenguaje de alto nivel se denomina programa fuente. Para


traducirlo al lenguaje-máquina se puede usar:

Un compilador: es un programa informático que traduce un programa fuente a


un programa equivalente escrito en lenguaje-máquina, que se denomina programa
objeto. El programa objeto puede ser almacenado como archivo en la memoria
secundaria de la computadora para ser ejecutado posteriormente sin necesidad
de volver a realizar la traducción.

Un intérprete: traduce el código fuente instrucción a instrucción y la ejecuta en el


instante. No se crea un archivo o programa objeto, de modo que hay que volver a
traducir cada vez que usemos el programa fuente correspondiente.
Conceptos Básicos de Programación 7

Datos y variables

2.1 Tipos de datos


Se denomina dato a cualquier objeto manipulable por el ordenador. Un dato puede ser un carácter
leído de un teclado, información almacenada en un disco, un número que se encuentra en la
memoria central, etc.

Los distintos tipos de datos se representan en diferentes formas en el ordenador: por ejemplo, no
se almacena internamente de la misma manera un número entero que un carácter. Aunque los
lenguajes de alto nivel permiten en alguna medida ignorar la representación interna de los datos, es
preciso conocer algunos conceptos mínimos.

A nivel de máquina todos los datos se representan utilizando una secuencia finita de bits. De este
hecho ya se deduce que no todos los datos son representables en un ordenador. La definición de
un tipo de dato incluye la definición del conjunto de valores permitidos y las operaciones que se
pueden llevar a cabo sobre estos valores.

Cuando se utiliza un dato en un programa es preciso que esté determinado su tipo para que el
traductor sepa cómo debe tratarlo y almacenarlo. Dependiendo del lenguaje puede o no ser preciso
declarar expresamente en el programa el tipo de cada dato. No todos los tipos de datos existen en
todos los lenguajes de programación. Hay lenguajes más ricos que otros en este sentido. Los tipos
de datos básicos más usuales son:

Enteros: números pertenecientes a un subconjunto finito de los números enteros.

EJEMPLO: 5, 22, -1

Reales: números pertenecientes a un subconjunto finito de los números reales (constan de


una parte entera y una parte decimal).

EJEMPLO: 0.09, -31.423, 3.0

Lógicos: los dos valores lógicos: VERDADERO (true) y FALSO (false).

Caracteres: un conjunto finito de caracteres reconocidos por un ordenador.


EJEMPLO: alfabéticos: A, B, C, ... Z, a, b, c, ... z
numéricos: 1, 2, 3, ... 9, 0
especiales: +, −, ∗, /, ∧, <, >, $, etc.

2.2 Estructuras de datos


Los tipos de datos vistos en la sección anterior se suelen denominar elementales. Una estructura
de datos o tipo de datos estructurado es un tipo de dato construido a partir de otros tipos de datos.
Como ejemplo se tienen los siguientes:
Conceptos Básicos de Programación 8

• Complejos: son datos formados por un par de datos reales y sirven para tratar números
complejos.

EJEMPLO: 2+3i, -3+i (i es la unidad imaginaria)

• Cadenas de caracteres: (también llamadas string) son una sucesión de caracteres delimitados
por una comilla (apóstrofo) o dobles comillas, según el tipo de lenguajes de programación.

EJEMPLO: ’Esto es una cadena de caracteres’, ’string’, ’123abc’

• Matrices o arreglos: son conjuntos de datos numéricos organizados para formar una matriz o
un vector.
EJEMPLO: A[4,5] Arreglo A de dos dimensiones.

2.3 Operaciones aritméticas


Las operaciones aritméticas habituales se representan normalmente mediante los símbolos
siguientes y estos pueden variar según el lenguaje de programación que se este utilizando:

Descripción Símbolo
Exponenciación ∧, **

Suma +
Resta −
Multiplicación ∗
División /, MOD, DIV
Tabla 2.1: Operadores aritméticos elementales

2.3.1 Reglas de prioridad


Las operaciones aritméticas NO se efectúan siempre en el orden en que están escritas. El orden
viene determinado por las reglas siguientes:

1. Exponenciaciones.

2. Multiplicaciones y divisiones.

3. Sumas y restas.

4. Dentro de cada grupo, de izquierda a derecha.

Para cambiar este orden se usan los paréntesis.

5. Si hay paréntesis, su contenido se calcula antes que el resto.

6. Si hay paréntesis anidados, se efectúan primero los más internos.


Conceptos Básicos de Programación 9

EJEMPLO:
2 + 3 ∗ 4 = 2 + 12 = 14
(2 + 3) ∗ 4 = 5 ∗ 4 = 20
1/3 ∗ 2 = 0.3333... ∗ 2 = 0.6666
1/(3 ∗ 2) = 1/6 = 0.166666...
2 + 3∧4/2 = 2 + 81/2 = 2 + 40.5 = 42.5
4∧3∧2 = (4∧3)∧2 = 64∧2 = 4096

2.4 Operaciones de comparación o relacionales


Imprescindibles para verificar condiciones son las expresiones lógicas, es decir, expresiones cuya
evaluación produce un valor lógico. Las más simples son aquéllas en las que se comparan dos datos.
Los operadores de comparación o relacionales actúan entre dos datos, que tienen que ser del
mismo tipo, y producen un resultado lógico: true o false (en MATLAB se equiparan con 1 y 0
respectivamente).

Los operadores de comparación se representan de distintas formas según el lenguaje. Los que se
muestran en la tabla siguiente son los de MATLAB:

Descripción Símbolo
Igual a ==
No igual a ∼=
<>
Menor que <
Mayor que >
Menor o igual que <=
Mayor o igual que >=
Tabla 2.2: Operadores de comparación

EJEMPLO:
3 <6 true
0=1 false
’A’ == ’B’ false

2.5 Operadores lógicos


Son los que actúan entre dos operandos de tipo lógico. Permiten construir expresiones que
representen condiciones más complicadas, como que se verifiquen varias condiciones a la vez, que
se verifique una entre varias condiciones, etc.
Conceptos Básicos de Programación 10

La representación de los operadores lógicos varía bastante de un lenguaje a otro. Es estas notas se
representarán como en MATLAB:

Descripción Símbolo
Negación ∼, NOT, NO
Conjunción &, AND, Y
Disyunción |, OR, O
Tabla 2.3: Operadores lógicos

El primero de ellos, el operador de negación lógica ∼, es un operador unario, es decir, actúa sobre
un solo operando lógico, dando como resultado el opuesto de su valor, como muestra la siguiente
tabla:

A ∼A
true false
false true
Tabla 2.4: Resultados del operador ∼

EJEMPLO:
(6>10) false ∼ (6>10) true
Los otros dos operadores lógicos actúan siempre entre dos operandos. Los resultados de su
aplicación se muestran en la tabla siguiente:

A B A&B A|B
true true true true
true false false true
false true false true
false false false false
Tabla 2.5: Resultados de los operadores & y |.

EJEMPLO:
(1<5) & (5<10) true
(0<5) | (0>5) false
En una expresión pueden aparecer varios operadores lógicos. En ese caso, el orden en que se
evalúan es el siguiente:

1. la negación lógica ∼
2. la conjunción y disyunción & y |

3. En el caso de igual precedencia, se evalúan de izquierda a derecha.


EJEMPLO:
∼ (5>0) & (5>4) False
Conceptos Básicos de Programación 11

2.6 Funciones intrínsecas


La mayoría de los lenguajes de programación de alto nivel dispone de una serie de funciones pre-
programadas para evaluar las funciones elementales que se usan en Matemáticas (coseno, seno,
arco-tangente, logaritmo, ...) y otras utilitarias. Se les conoce como funciones intrínsecas. La
utilización de estas funciones:

nombre de la función(argumentos)

donde argumentos pueden ser: un número o expresión, variable o expresión de variables (ver la
Sección 2.8).

EJEMPLO:
sqrt(2) calcula √2

log(cos(x/2)) calcula

2.7 Orden general de evaluación de expresiones


En una expresión general pueden aparecer operadores de tipo aritmético, de comparación y lógicos,
así como funciones. El orden de evaluación es el que sigue:

Si en una expresión hay paréntesis, lo primero que se evalúa es su contenido. Si hay paréntesis
anidados, se comienza por los más internos. Si hay varios grupos de paréntesis disjuntos, se
comienza por el que esté más a la izquierda.
En una expresión sin paréntesis de agrupamiento, el orden de evaluación es el siguiente:

1. Las funciones. Si el argumento de la función es una expresión, se le aplican estas reglas.


Si hay varias funciones, se comienza por la de la izquierda.
2. Los operadores aritméticos, en el orden ya indicado.
3. Los operadores de comparación o relacionales.
4. Los operadores lógicos, en el orden antes mencionado.
Conceptos Básicos de Programación 12

Jerarquía de los operadores


Tipo Operadores Descripción Prioridad
() Parentesis 1
funcion( args ) Funciones 2
** , ^ Potenciación 3
Operadores
*, /, DIV, MOD Multiplicación y división 4
Aritméricos
+, - Suma y resta 5
Op. Relacionales o
=, <>, <, >, <=, >= 6
de Comparación
~, NOT, NO Negación 7
Operadores Lógicos &, AND, Y Conjunción 8
|, OR, O Disyunción 9
Tabla 2.6: Tabla general de operadores y su prioridad.

2.8 Variables
Una variable es un nombre simbólico que identifica una parte de la memoria en la que se pueden
guardar números u otro tipo de datos. Es un “sitio” en la memoria del ordenador para “guardar”
datos. El contenido de una variable se puede recuperar y modificar cuantas veces se quiera durante
la ejecución de un programa.

Una variable, en general, se identifica por su nombre y su tipo. El nombre debe estar formado por
letras y números y comenzar por una letra, aunque normalmente también se admite el uso de
ciertos caracteres especiales. Una variable está asociada a un tipo de datos, el cual determina la
cantidad de bytes que usa la variable (ver Sección 2.9).

En la mayoría de los lenguajes de programación (por ejemplo, FORTRAN o C) es necesario especificar


el tipo de dato que va a contener una variable antes de usarla, declarándolo con las ordenes
específicas.

2.8.1 Instrucción de asignación


Las instrucciones de asignación sirven para almacenar un valor en una variable. La sintaxis más
habitual de una operación de asignación es:

VARIABLE = EXPRESIÓN

que debe ser interpretada como: evaluar (si es preciso) el resultado de la EXPRESIÓN y almacenarlo
en la dirección de memoria correspondiente a VARIABLE.

El signo = significa “ALMACENAR EN”.


Conceptos Básicos de Programación 13

La acción de almacenar un valor en una variable hace que se pierda el valor que, eventualmente,
tuviera dicha variable previamente.

EJEMPLO:
a=2 guardar en la variable a el valor 2
b=-4 guardar en la variable b el valor -4
raiz=sqrt(2*b+8*a) guardar en la variable raiz el valor √8
a=a+1 sumar 1 al contenido de a (guardar 3 en a)
Conceptos Básicos de Programación 14

ALGORITMOS Y ESTRUCTURAS DE PROGRAMACIÓN

3.1 Fases de creación de un programa


El proceso de resolución de problemas en una computadora conduce a la escritura de un programa
y su ejecución. Las fases en el desarrollo de un programa pueden resumirse de la siguiente forma:

1. Analizar el problema consiste en conocer perfectamente en qué consiste y qué resultados se


desean obtener.

2. Planificación de la resolución del problema, dividiéndolo, si es complicado, en una secuencia


de etapas más simples. Esta fase se lleva a cabo EN UN PAPEL, estableciendo lo más
claramente posible la finalidad de cada etapa, los datos que se necesitan de entrada, los datos
que producirían en salida, los algoritmos (ver la Sección 5.2) que se utilizarán, etc.

3. Edición del código fuente, es decir, escritura del mismo utilizando un editor de textos simple
(sin formato) y un lenguaje de programación. Los programas fuente serán almacenados en
ficheros de texto, normalmente en el disco duro de la computadora.

4. Compilación y ejecución del programa al lenguaje máquina.

5. Corrección de errores del programa. Los errores se corregirán en el código fuente, repitiendo
los pasos 3 y 4 tantas veces como sea necesario. Existen tres tipos de errores:

o Errores de sintaxis o compilación: Estos errores se dan al momento de que se viola


una regla de escritura del lenguaje de programación que se está usando. Por ejemplo:
un comando mal escrito, un carácter faltante, una variable no definida, etc.
o Errores de ejecución: Estos errores se dan cuando la computadora encuentra una
operación no válida, por ejemplo: Raices pares de números negativos, división por
cero, etc.
o Errores de lógica: Estos errores son los que provocan que los resultados esperados son
diferentes a los resultados esperados. Es decir, si al ingresar los datos de entrada al
programa los datos de salida no son los que deberían de obtenerse.

6. Documentación. Una vez que el programa funcione correctamente, es conveniente revisar el


código fuente para ordenarlos, eliminar cálculos innecesarios e incluir las líneas de
comentario necesarias, que normalmente deben incluir unas breves explicaciones al principio
del código sobre la finalidad del programa y sus argumentos de entrada y de salida.

3.2 Algoritmos
Una computadora es capaz de realizar “sólo” determinadas acciones sencillas, tales como sumar,
comparar o transferir datos, pero los problemas que normalmente interesa resolver son más
complejos. Para resolver un problema real es necesario, en primer lugar, encontrar un método de
resolución y, posteriormente, determinar la sucesión de acciones sencillas (susceptibles de ser
ejecutadas por una computadora) en que se descompone dicho método.
Conceptos Básicos de Programación 15

No todos los métodos de solución de un problema pueden ser puestos es práctica en una
computadora. Para que un procedimiento pueda ser implantado en una computadora debe ser:

• Preciso: estar compuesto de pasos bien definidos (no ambiguos) y ordenados.


• Definido: si se sigue dos veces, se obtiene el mismo resultado cada vez.
• Finito: tener un número finito de pasos.

Un procedimiento o método para resolver un problema que cumpla los requisitos anteriores se dice
que es un algoritmo. Se puede dar por tanto la siguiente definición:

Un algoritmo es un método para resolver un problema mediante una secuencia de pasos bien
definidos, ordenados y finitos.

Para que se pueda ejecutar el algoritmo es preciso, además, que se disponga de las “herramientas”
adecuadas para llevar a cabo cada uno de los pasos. Si no es así, estos deberán, a su vez, ser
descompuestos en una secuencia (algoritmo) de pasos más simples que sí se puedan llevar a cabo.

Un programa de computadora es una sucesión de ´ordenes que describen un algoritmo, escritas de


forma que puedan ser entendidas por la computadora.

En un algoritmo (y por tanto en un programa) se distinguen las siguientes acciones:

Entrada: es la información de partida que necesita el algoritmo para arrancar.

Proceso: es el conjunto de todas las operaciones a realizar.

Salida: son los resultados obtenidos.

Un ejemplo elemental es el Algoritmo 3.1.

Algoritmo 3.1 Preparar una taza de té.


Entrada: tetera, taza, bolsa de té
Salida: taza de té
Inicio
Tomar la tetera
Llenarla de agua
Encender el fuego
Poner la tetera en el fuego
Esperar a que hierva el agua
Tomar la bolsa de té
Introducirla en la tetera
Esperar 1 minuto
Echar el té en la taza Fin
Conceptos Básicos de Programación 16

3.3 Representación de algoritmos


Las dos herramientas más utilizadas comúnmente para describir algoritmos son:

Diagramas de flujo: son representaciones gráficas de secuencias de pasos a realizar. Cada operación
se representa mediante un símbolo normalizado el Instituto Norteamericano de Normalización
(ANSI - American National Standars Institute). Las líneas de flujo indican el orden de ejecución.
Algunos de los símbolos principales se muestran en la Figura 5.1, como son: Inicio/Fin del algoritmo,
Lectura/Escritura de datos que el programa necesita o genera (por ejemplo, lectura de datos que se
teclean o escritura de datos en un fichero); Proceso conjunto de instrucciones secuenciales; Decisión
es una bifurcación en el flujo del algoritmo en base a que se verifique o no cierta condición (ver la
Sección 5.5).
Los diagramas de flujo suelen ser usados sólo para representar algoritmos pequeños, ya que abarcan
mucho espacio.

Inicio/Fin Lectura/Escritura

Proceso Decisión
No

Figura 3.1: Símbolos en diagramas de flujo.

Pseudocódigos: describen un algoritmo de forma similar a un lenguaje de programación, pero sin su


rigidez, de forma más parecida al lenguaje natural. Presentan la ventaja de ser más compactos que
los diagramas de flujo, más fáciles de escribir para las instrucciones complejas y más fáciles de
transferir a un lenguaje de programación. El pseudocódigo no está regido por ningún estándar.
En estos apuntes usaremos las palabras LEER/IMPRIMIR para representar las acciones de lectura de
datos (el programa recibe datos desde algún sitio) y salida de datos (el programa escribe
información en algún medio)
El Algoritmo 3.2 y la Figura 3.2 muestran respectivamente el pseudocódigo y el diagrama de flujo
del algoritmo para calcular la altura de una persona en pulgadas y pies a partir de la altura en
centímetros introducida por el teclado.
Conceptos Básicos de Programación 17

Algoritmo 3.2 Calcular una altura en pulgadas (1 pulgada=2.54 cm) y pies (1 pie=12 pulgadas), a
partir de la altura en centímetros, que se introduce por el teclado.
Inicio
1- IMPRIMIR ’Introduce la altura en centímetros:’
2- LEER: altura
3- CALCULAR pulgadas=altura/2.54
4- CALCULAR pies=pulgadas/12
5- IMPRIMIR ’La altura en pulgadas es:’, pulgadas
6- IMPRIMIR ’La altura en pies es:’, pies
Fin

LEER
altura

pulgadas=altura/2.54

pies=pulgadas/12

ESCRIBIR
pulgadas, pies

Fin

Figura 3.2: Diagrama de flujo para determinar la altura de una persona en pulgadas y pies a partir
de la altura en centímetros introducida por el teclado.

3.4 Estructura secuencial


Es aquella en la que una acción (instrucción) sigue a la otra en el orden en el que están escritas. Su
representación y el diagrama de flujo se muestra en la Figura 3.3. Los Algoritmos 3.1 y 3.2 son
ejemplos de algoritmos secuenciales.
Conceptos Básicos de Programación 18

...
Instrucción 1 Instrucción 1
Instrucción 2
Instrucción 3 ...
Instrucción 2

Figura 3.3: Estructura secuencial de instrucciones. Instrucción 3

3.5 Estructuras de control: condicionales y bucles


Son parte fundamental de cualquier lenguaje. Sin ellas, las instrucciones de un programa sólo
podrían ejecutarse en el orden en que están escritas (orden secuencial). Las estructuras de control
permiten modificar este orden. Hay dos categorías de estructuras de control:

Condicionales o bifurcaciones: permiten que se ejecuten conjuntos distintos de instrucciones, en


función de que se verifique o no determinada condición.

Bucles o repeticiones: permiten que se ejecute repetidamente un conjunto de instrucciones, bien


un número pre-determinado de veces, o bien hasta que se verifique una determinada condición.

En términos de un lenguaje de programación, que se verifique o no una condición se traduce en que


una (adecuada) expresión lógica tome el valor VERDADERO (TRUE) o tome el valor FALSO (FALSE).
En los casos más sencillos y habituales la condición suele ser una comparación entre dos datos,
como, por ejemplo: si a < b hacer una cosa y en caso contrario hacer otra distinta.
A continuación, se describen las distintas estructuras de control. Para cada una de ellas se describe
el diagrama de flujo y la sintaxis de la sentencia correspondiente en lenguaje MATLAB. Obsérvese
que todas ellas tienen una única entrada y una única salida.

3.5.1 Estructura condicional simple: SI ( IF )


Este es el tipo más sencillo de estructura condicional. Sirve para implementar acciones condicionales
del tipo siguiente:

• Si se verifica una determinada condición, ejecutar una serie de instrucciones y luego seguir
adelante.
• Si la condición NO se cumple, NO se ejecutan dichas instrucciones y se sigue adelante.
Conceptos Básicos de Programación 19

...
si condición

instrucciones Condición Instrucciones
fin si ...
No
Figura 3.4: Estructura condicional simple: IF.

Obsérvese que, en ambos casos (que se verifique o no la condición), los “caminos” bifurcados se
unen posteriormente en un punto, es decir, el flujo del programa recupera su carácter secuencial, y
se continúa ejecutando por la instrucción siguiente a la estructura IF.
Como ejemplo de utilización de este tipo de condicional, se considera el cálculo del valor en un
punto x de una función definida por partes, como, por ejemplo:

El Algoritmo 3.3 muestra el seudocódigo correspondiente.

Algoritmo 3.3 Cálculo del valor de la función f(x) = 0 si x ≤ 0, f(x) = x2 si x > 0.


Inicio
1- LEER x
2- Si x>0 Entonces
f=x2
Fin Si
4- IMPRIMIR “El valor de la función es:”, f
Fin

3.5.2 Estructura condicional doble: SI – SINO (IF – ELSE)


Este tipo de estructura permite implementar condicionales en los que hay dos acciones alternativas:

• Si se verifica una determinada condición, ejecutar una serie de instrucciones (bloque 1).
• Si no, esto es, si la condición NO se verifica, ejecutar otra serie de instrucciones (bloque 2).

En otras palabras, en este tipo de estructuras hay una alternativa: se hace una cosa o se hace la otra.
En ambos casos, se sigue por la instrucción siguiente a la estructura IF - ELSE.
Conceptos Básicos de Programación 20

...
SI condición
bloque-1 Condición
No
SINO

bloque-2
FIN SI... Bloque 1 Bloque 2

Figura 3.5: Estructura condicional doble: IF - ELSE.

Como ejemplo de utilización de este tipo de estructuras se plantea el problema de calcular las raíces
de una ecuación de segundo grado

ax2 + bx + c = 0

distinguiendo dos casos: que las raíces sean reales o que sean complejas (no se contempla, de
momento, distinguir entre una o dos raíces reales). Ver a continuación el diagrama de flujo (Figura
5.6) y el seudocódigo correspondiente (Algoritmo 5.4).
LEER
A,B,C

CALCULAR
2
D=B-4AC
A2=2A

CALCULAR CALCULAR
DD= D ¿D>0? DD= -D
x1=(-B+DD)/A2
Sí No
Re=-B/A2
x2=(-B-DD)/A2 Im=DD/A2

ESCRIBIR ESCRIBIR
x1,x2 Re, Im

Fin

Figura 3.6: Diagrama de flujo para determinar las raíces reales o complejas de la ecuación de
segundo grado Ax2 + Bx + C = 0.
Conceptos Básicos de Programación 21

Algoritmo 3.4 Cálculo de las raíces de la ecuación de segundo grado Ax2 + Bx + C = 0,


distinguiendo los casos de raíces reales y complejas.
Inicio
1- LEER A, B y C
2- CALCULAR D=B2-4*A*C
3- CALCULAR AA=2*A
4- Si D≥0 √
CALCULAR DD= D
x1=(-B+DD)/AA
x2=(-B-DD)/AA
IMPRIMIR ’La ecuación tiene raíces reales:’, x1, x2
Si no √
CALCULAR DD= -D
Re=-B/AA
Im=DD/A*2
IMPRIMIR ’La ecuación tiene raíces complejas conjugadas:’
IMPRIMIR ’Parte real:’, Re
IMPRIMIR ’Parte imaginaria:’, Im
Fin Si
Fin

3.5.3 Estructura condicional múltiple: IF - ELSEIF - ELSE


En su forma más general, la estructura IF - ELSEIF - ELSE permite implementar condicionales más
complicados, en los que se “encadenan” condiciones en la forma siguiente:

• Si se verifica la condición 1, ejecutar las instrucciones del bloque 1.


• Si no se verifica la condición 1, pero SI se verifica la condición 2, ejecutar las instrucciones del
bloque 2.
• Si no, esto es, si no se ha verificado ninguna de las condiciones anteriores, ejecutar las
instrucciones del bloque 3.

En cualquiera de los casos, el flujo del programa continúa por la instrucción siguiente a la
estructura
IF - ELSEIF - ELSE.
La sintaxis en lenguaje MATLAB y el diagrama de flujo, se muestran en la Figura 3.7.
Conceptos Básicos de Programación 22

...
SI condicion-1
Condición 1 Bloque 1
bloque-1 SÍ
SINO No
SI condicion-2
Condición 2 Bloque 2
bloque-2 SÍ
SINO No
bloque-3 Bloque 3
FIN SI
FIN SI...

Figura 3.7: Estructura condicional múltiple: IF- ELSEIF - ELSE.

El Algoritmo 3.5 contiene un ejemplo de utilización de este tipo de estructura.

En la estructura IF - ELSEIF - ELSE se puede multiplicar la cláusula ELSEIF, obteniéndose así una
“cascada” de condiciones, como se muestra en el organigrama, cuyo funcionamiento es claro. En
este tipo de estructura condicional, la cláusula ELSE junto con su bloque de instrucciones pueden
no estar presente.

Las distintas estructuras condicionales descritas pueden ser anidadas, es decir, puede incluirse una
estructura IF (de cualquier tipo), como parte de las instrucciones que forman el bloque de uno de
los casos de otro IF. Como es lógico, no puede haber solapamiento. Cada estructura IF debe tener
su propio fin (end).

SI condición-1
instrucciones-1
SINO
SI condición-2
instrucciones-2
SINO
SI condición-3
instrucciones-3
SINO

instrucciones-k

FIN SI

FIN SI

FIN SI
Conceptos Básicos de Programación 23

Como ejemplo de utilización de este tipo de estructura condicional y de estructuras anidadas,


véase el Algoritmo 3.6.

Algoritmo 3.6 Dados dos números reales, a y b, y el símbolo, S (carácter), de un operador


aritmético (+, -, *, /), imprimir el resultado de la operación a S b
Inicio
LEER a
LEER b
LEER S
Si S=’+’ Entonces
IMPRIMIR ’El resultado es =’, a+b
Si no
Si S=’-’ Entonces
IMPRIMIR ’El resultado es =’, a-b
Si no
Si S=’*’ Entonces
IMPRIMIR ’El resultado es =’, a*b
Si no
Si b=0 Entonces
Si a=0 Entonces
IMPRIMIR ’El resultado es =’, NaN (indeterminado)
Si no
IMPRIMIR ’El resultado es =’, Inf (infinito)
Fin Si
Si no
IMPRIMIR ’El resultado es =’, a/b
Fin SI
Fin Si
Fin SI
Fin Si

3.5.4 Estructura de repetición indexada: PARA (FOR)


Este tipo de estructura permite implementar la repetición de un cierto conjunto de instrucciones
un número pre-determinado de veces.

Para ello se utiliza una variable de control del bucle, llamada también índice, que va recorriendo
un conjunto pre-fijado de valores en un orden determinado. Para cada valor del índice en dicho
conjunto, se ejecuta una vez el mismo conjunto de instrucciones.
En la Figura 3.8 se han representado la forma de escribir esta estructura en MATLAB y el
organigrama correspondiente: el bloque de instrucciones se ejecuta una vez para cada valor del
índice, que va tomando sucesivamente el valor de cada componente del vector V, de longitud N.
Conceptos Básicos de Programación 24

... PARA índice=V


instrucciones k = 1
FIN PARA ...

k > N
TRUE
FALSE
Figura 3.8: Repetición indexada: diagrama de flujo. El índice
del bucle recorre los valores de un vector V de longitud N. índice=V(k)

Instrucciones

k = k+1

Como ejemplo de utilización de la estructura FOR, véanse los Algoritmos 3.8 y 3.9 para calcular la
suma de los n primeros números impares.

Nota 3.7
a) El valor de la variable de control índice puede ser utilizado o no dentro del conjunto de
instrucciones que forman parte del cuerpo del FOR, pero no debe ser modificado.
b) El conjunto de valores que debe recorrer el índice puede ser vacío (N=0). En ese caso, el
bloque de instrucciones no se ejecuta ninguna vez.
c) Las estructuras FOR e IF pueden “anidarse”, es decir, incluir una dentro de la otra, con la
restricción (de sentido común) de que la interior tiene que estar completamente contenida en uno
de los bloques de instrucciones de la otra. Véase, como ejemplo, el Algoritmo 5.10.

Algoritmo 3.8 Dado un entero, n, calcular la suma de los n primeros números impares.
Inicio LEER n
HACER suma=0
Para i= 1, 3, 5, ..., 2*n-1 HACER
suma=suma+i
Fin Para
IMPRIMIR ’La suma vale:’, suma Fin
Conceptos Básicos de Programación 25

Algoritmo 3.9 Dado un entero, n, calcular

Inicio LEER n
HACER suma=1
HACER ter=1
Para k= 1, 2, ..., n
HACER ter=ter/2
HACER suma=suma+ter
Fin Para
IMPRIMIR ’La suma vale : ’, suma Fin

Algoritmo 3.10 Dado un número natural, n, imprimir la lista de sus divisores, en orden
decreciente.
Inicio LEER n
IMPRIMIR ’ Lista de divisores del numero: ’, n
Para i=ParteEntera(n/2) hasta 2 (incremento -1)
Si resto(n/i)=0 IMPRIMIR i
Fin Si Fin
Para
IMPRIMIR 1 Fin

3.5.5 Estructura repetitiva condicional: MIENTRAS (WHILE)


Permite implementar la repetición de un mismo conjunto de instrucciones mientras que se
verifique una determinada condición: el número de veces que se repetirá el ciclo no está definido
a priori. El diagrama de flujo descriptivo de esta estructura se muestra en la Figura 3.9.
Conceptos Básicos de Programación 26

...
MIENTRAS expresión-lógica
instrucciones Condición
FALSE
FIN MIENTRAS ...
TRUE
Figura 3.9: Estructura repetitiva MIENTRAS: sintaxis y
diagrama de flujo. Instrucciones

Su funcionamiento es evidente, a la vista del diagrama:


1. Al comienzo de cada iteración se evalúa la expresión-lógica.

2. Si el resultado es VERDADERO, se ejecuta el conjunto de instrucciones y se vuelve a iterar, es


decir, se repite el paso 1.

3. Si el resultado es FALSO, se detiene la ejecución del ciclo WHILE y el programa se sigue


ejecutando por la instrucción siguiente al END.
El Algoritmo 3.11 es un ejemplo de utilización de esta estructura.

Algoritmo 3.11 Imprimir de forma ascendente los 100 primeros números naturales.
Inicio i=1
Mientras que i ≤ 100
IMPRIMIR i
HACER i=i+1
Fin Mientras Fin

3.5.6 Ruptura de ciclos de repetición: BREAK y CONTINUE


En ocasiones es necesario interrumpir la ejecución de un ciclo de repetición en algún punto interno
del bloque de instrucciones que se repiten. Lógicamente, ello dependerá de que se verifique o no
alguna condición.

La interrupción puede hacerse de dos formas:

1. Abandonando el ciclo de repetición definitivamente.


2. Abandonando la iteración en curso, pero comenzando la siguiente.

Las instrucciones para poner esto en práctica tienen nombres diversos en los distintos lenguajes de
programación. En MATLAB, la primera opción se implementa con la instrucción BREAK y la segunda
Conceptos Básicos de Programación 27

con la instrucción CONTINUE. Ambas pueden utilizarse tanto para romper un ciclo FOR como un
ciclo WHILE. Cuando se utiliza la orden BREAK dentro de un ciclo FOR, el ´índice del bucle conserva,
fuera del mismo, el último valor que tomó.

Véanse los correspondientes diagramas de flujo en las Figuras 3.10 y 3.11.

Condición
WHILE FALSE Condición
TRUE WHILE FALSE
TRUE
Instrucciones-1
Instrucciones-1

TRUE
Condición BREAK TRUE Condición
ruptura CONTINUE
ruptura
FALSE FALSE
Instrucciones-2 Instrucciones-2

Figura 5.10: Diagrama de flujo de la ruptura Figura 5.11: Diagrama de flujo de la


ruptura de ciclo BREAK. de ciclo CONTINUE.

3.5.7 Estructura de elección entre varios casos: SWITCH


Este tipo de estructura permite decidir entre varios caminos posibles, en función del valor que tome
una determinada instrucción.

El diagrama de flujo correspondiente a una de estas estructuras (con cuatro casos) se presenta en
la Figura 3.12.

switch expresión
case valor-1 instrucciones caso 1 Valor
Expresión
case valor-2 instrucciones caso 2 ...
case {valores...}
instrucciones caso k otherwise Caso 1 Caso 2 Caso k otherwise
instrucciones ....
end Instrucs. Instrucs. Instrucs. Instrucs.
caso 1 caso 2 caso k "otro caso"

Figura 3.12: Estructura de elección de caso SWITCH: sintaxis MATLAB y diagrama de flujo.
Conceptos Básicos de Programación 28

En cada uno de los casos, el valor correspondiente puede ser o bien un sólo valor, o bien un conjunto
de valores, en cuyo caso se indican entre llaves. La cláusula OTHERWISE y su correspondiente
conjunto de instrucciones puede no estar presente. El funcionamiento es el siguiente:

1. Al comienzo se evalúa la expresión.


2. Si expresión toma el valor (´o valores) especificados junto a la primera cláusula CASE, se
ejecuta el conjunto de instrucciones de este caso y después se abandona la estructura
SWITCH, continuando por la instrucción siguiente al END.
3. Se repite el procedimiento anterior, de forma ordenada, para cada una de las cláusulas CASE
que siguen.
4. Si la cláusula OTHERWISE está presente y la expresión no ha tomado ninguno de los valores
anteriormente especificados, se ejecuta el conjunto de instrucciones correspondiente.

Obsérvese que se ejecuta, como máximo el conjunto de instrucciones de uno de los casos, es decir,
una vez que se ha verificado un caso y se ha ejecutado su conjunto de instrucciones, no se testea el
resto de casos, ya que se abandona la estructura. Obviamente, si la cláusula OTHERWISE no está
presente, puede ocurrir que no se dé ninguno de los casos.

Como ejemplo de utilización, se presenta el mismo proceso del Algoritmo 5.6, pero utilizando la
sentencia SWITCH.

Algoritmo 3.12 Dados dos números reales, a y b, y el símbolo, S (carácter), de un operador


aritmético (+, -, *, /), imprimir el resultado de la operación a S b
LEER a , b , S
Elegir caso S
Caso ’+’
IMPRIMIR ’El resultado es =’, a+b
Caso ’-’
IMPRIMIR ’El resultado es =’, a-b
Caso ’*’
IMPRIMIR ’El resultado es =’, a*b
Caso ’*’
IMPRIMIR ’El resultado es =’, a*b
Caso ’/’ Si
a6=0
IMPRIMIR ’El resultado es =’, a/b
Si no, si b6=0
IMPRIMIR ’El resultado es =’, Inf (infinito)
Si no
IMPRIMIR ’El resultado es =’, NaN (indeterminado) Fin Si
En otro caso
IMPRIMIR ’El operador no se reconoce’
Fin Elegir caso
Conceptos Básicos de Programación 29

3.6 Funciones externas


Con lo expuesto hasta aquí se pueden escribir programas sencillos y no demasiado largos. Pero
varias razones justifican la necesidad de disponer de otro tipo de recursos de programación. Por una
parte, puede haber en la resolución de un problema, partes que se repitan. Por otra parte, es
conveniente partir la resolución de un problema “largo” en una serie de etapas más cortas que se
concatenan para resolver el problema global. Los programas demasiado largos son difíciles de
revisar y de corregir.
En cualquier lenguaje de programación, existen las funciones. Son trozos de código que se escriben
separadamente y que realizan cálculos o tareas específicas. Todos los lenguajes de programación
tienen funciones incorporadas o intrínsecas, es decir, funciones que realizan cálculos o tareas de uso
habitual que han sido ya programados y están disponibles para el usuario. Pero, además, todos los
lenguajes tienen la posibilidad de que el usuario defina sus propias funciones, que reciben el nombre
de funciones externas.
La forma de definir las funciones depende del lenguaje de programación. Generalmente tienen la
siguiente forma:

nombre(argumentos de entrada)

Aquí, nombre es el nombre que se quiere dar a la función, para identificarla. Los argumentos de
entrada y los argumentos de salida son nombre de variable que hacen el papel de las variables
mudas en la definición de una función matemática: símbolos para describir la función. En
programación reciben, también, el nombre de variables mudas (de entrada o de salida).
Los argumentos de entrada y de salida, cuando hay varios, se separan por comas. Puede no haber
argumentos de entrada.
Las variables definidas dentro de una función son variables locales, en el sentido de que son
inaccesibles desde “fuera” de esta función. Se puede decir que pertenecen al espacio de trabajo
propio de la función y no son vistas desde otros espacios de trabajo. Por ejemplo, si se utiliza esta
función desde la línea de comandos de Matlab, y se tiene, en el espacio de trabajo de Matlab, una
variable de nombre, por ejemplo, w, esta variable y la w de la función son distintas: se refieren a
una posición diferente en memoria.

S-ar putea să vă placă și