RESUMEN DEL LIBRO (CAP 3)
3.1. CONCEPTO DE PROGRAMA
Un programa de computadora es un conjunto de instrucciones —órdenes dadas a la máquina— que producirán la
ejecución de una determinada tarea. En esencia, un programa es un medio para conseguir un fin. El fin será probablemente definido como la información necesaria para solucionar un problema.
El proceso de programación es, por consiguiente, un proceso de solución de problemas —como ya se vio en el
Capítulo 2— y el desarrollo de un programa requiere las siguientes fases:
1. definición y análisis del problema;
2. diseño de algoritmos:
• diagrama de flujo,
• diagrama N-S,
• pseudocódigo;
3. codificación del programa;
4. depuración y verificación del programa;
5. documentación;
6. mantenimiento.
3.2. PARTES CONSTITUTIVAS DE UN PROGRAMA
Conceptualmente un programa puede ser considerado como una caja negra, como se muestra en la Figura 3.2.
La
caja negra o el algoritmo de resolución, en realidad, es el conjunto de códigos que transforman las entradas del programa (datos) en salidas (resultados).
El programador debe establecer de dónde provienen las entradas al programa. Las entradas, en cualquier caso,
procederán de un dispositivo de entrada —teclado, disco...—. El proceso de introducir la información de entrada
—datos— en la memoria de la computadora se denomina entrada de datos, operación de lectura o acción de
leer.
Las salidas de datos se deben presentar en dispositivos periféricos de salida: pantalla, impresoras, discos, etc. La
operación de salida de datos se conoce también como escritura o acción de escribir.
3.3. INSTRUCCIONES Y TIPOS DE INSTRUCCIONES
El proceso de diseño del algoritmo o posteriormente de codificación del programa consiste en definir las acciones o
instrucciones que resolverán el problema.
Las acciones o instrucciones se deben escribir y posteriormente almacenar en memoria en el mismo orden en que
han de ejecutarse, es decir, en secuencia.
Un programa puede ser lineal o no lineal. Un programa es lineal si las instrucciones se ejecutan secuencialmente, sin bifurcaciones, decisión ni comparaciones.
3.3.1. Tipos de instrucciones
Instrucciones disponibles en un lenguaje de programación dependen del tipo de lenguaje. Por ello, en este apartado estudiaremos las instrucciones —acciones— básicas que se pueden implementar de modo general en un algoritmo y que esencialmente soportan todos los lenguajes.
Dicho de otro modo, las instrucciones básicas son independientes del lenguaje.
La clasificación más usual, desde el punto de vista anterior, es:
1. instrucciones de inicio/fin,
2. instrucciones de asignación,
3. instrucciones de lectura,
4. instrucciones de escritura,
5. instrucciones de bifurcación.
3.3.2. Instrucciones de asignación
Como ya son conocidas del lector, repasaremos su funcionamiento con ejemplos:
a) A ← 80 la variable A toma el valor de 80.
b) ¿Cuál será el valor que tomará la variable C tras la ejecución de las siguientes instrucciones?
A ← 12
B ← A
C ← B
A contiene 12, B contiene 12 y C contiene 12
Antes de la ejecución de las tres instrucciones, el valor de A, B y C es indeterminado. Si se desea darles un valor
inicial, habrá que hacerlo explícitamente, incluso cuando este valor sea 0. Es decir, habrá que definir e inicializar
las instrucciones.
A ← 0
B ← 0
C ← 0
c) ¿Cuál es el valor de la variable AUX al ejecutarse la instrucción 5?
1. A ← 10
2. B ← 20
3. AUX ← A
4. A ← B
5. B ← AUX
• en la instrucción 1, A toma el valor 10
• en la instrucción 2, B toma el valor 20
• en la instrucción 3, AUX toma el valor anterior de A, o sea 10
• en la instrucción 4, A toma el valor anterior de B, o sea 20
• en la instrucción 5, B toma el valor anterior de AUX, o sea 10
• tras la instrucción 5, AUX sigue valiendo 10.
3.3.3. Instrucciones de lectura de datos (entrada)
Esta instrucción lee datos de un dispositivo de entrada. ¿Cuál será el significado de las instrucciones siguientes?
a) leer (NÚMERO, HORAS, TASA)
Leer del terminal los valores NÚMERO, HORAS y TASAS, archivándolos en la memoria; si los tres números se teclean
en respuesta a la instrucción son 12325, 32, 1200, significaría que se han asignado a las variables esos valores y
equivaldría a la ejecución de las instrucciones.
NÚMERO ← 12325
HORAS ← 32
TASA ← 1200
b) leer (A, B, C)
Si se leen del terminal 100, 200, 300, se asignarían a las variables los siguientes valores:
A = 100
B = 200
C = 300
3.3.4. Instrucciones de escritura de resultados (salida)
Estas instrucciones se escriben en un dispositivo de salida. Explicar el resultado de la ejecución de las siguientes
instrucciones:
A ← 100
B ← 200
C ← 300
escribir (A, B, C)
Se visualizarían en la pantalla o imprimirían en la impresora los valores 100, 200 y 300 que contienen las variables A, B y C.
3.3.5. Instrucciones de bifurcación
El desarrollo lineal de un programa se interrumpe cuando se ejecuta una bifurcación. Las bifurcaciones pueden ser,
según el punto del programa a donde se bifurca, hacia adelante o hacia atrás.
Bifurcación condicional: la bifurcación depende del cumplimiento de una determinada condición. Si se cumple
la condición, el flujo sigue ejecutando la acción F2. Si no se cumple, se ejecuta la acción F1 (véase Figura 3.4)
Las bifurcaciones en el flujo de un programa se realizarán de modo condicional en función del resultado de la
evaluación de la condición.
Bifurcación incondicional: la bifurcación se realiza siempre que el flujo del programa pase por la instrucción sin
necesidad del cumplimiento de ninguna condición (véase Figura 3.3).
3.4. ELEMENTOS BÁSICOS DE UN PROGRAMA
programación y, la enseñanza de un nuevo lenguaje es relativamente fácil.
Los lenguajes de programación —como los restantes lenguajes— tienen elementos básicos que se utilizan como
bloques constructivos, así como reglas para las que esos elementos se combinan. Estas reglas se denominan sintaxis
del lenguaje. Solamente las instrucciones sintácticamente correctas pueden ser interpretadas por la computadora y los
programas que contengan errores de sintaxis son rechazados por la máquina. Los elementos básicos constitutivos de
un programa o algoritmo son:
• palabras reservadas (inicio, fin, si-entonces..., etc.),
• identificadores (nombres de variables esencialmente, procedimientos, funciones, nombre del programa, etc.),
• caracteres especiales (coma, apóstrofo, etc.),
• constantes,
• variables,
• expresiones,
• instrucciones.
Además de estos elementos básicos, existen otros elementos que forman parte de los programas, cuya comprensión y funcionamiento será vital para el correcto diseño de un algoritmo y naturalmente la codificación del programa.
Estos elementos son:
• bucles,
• contadores,
• acumuladores,
• interruptores,
• estructuras:
1. secuenciales,
2. selectivas,
3. repetitivas.
El amplio conocimiento de todos los elementos de programación y el modo de su integración en los programas
constituyen las técnicas de programación que todo buen programador debe conocer.
3.5. DATOS, TIPOS DE DATOS Y OPERACIONES PRIMITIVAS
El primer objetivo de toda computadora es el manejo de la información o datos. Estos datos pueden ser las cifras de
ventas de un supermercado o las calificaciones de una clase.
En el proceso de resolución de problemas el diseño de la estructura de datos es tan importante como el diseño
del algoritmo y del programa que se basa en el mismo.
Un programa de computadora opera sobre datos (almacenados internamente en la memoria almacenados en medios externos como discos, memorias USB, memorias de teléfonos celulares, etc., o bien introducidos desde un dispositivo como un teclado, un escáner o un sensor eléctrico). En los lenguajes de programación los datos deben de ser
de un tipo de dato específico
Existen dos tipos de datos: simples (sin estructura) y compuestos (estructurados). Los datos estructurados se estudian a partir del Capítulo 6 y son conjuntos de partidas de datos simples con relaciones definidas entre ellos.
Los distintos tipos de datos se representan en diferentes formas en la computadora. A nivel de máquina, un dato
es un conjunto o secuencia de bits (dígitos 0 o 1). Los lenguajes de alto nivel permiten basarse en abstracciones e
ignorar los detalles de la representación interna. Aparece el concepto de tipo de datos, así como su representación.
Los tipos de datos básicos son los siguientes:
numéricos (entero, real)
lógicos (boolean)
carácter (caracter, cadena)
3.5.1. Datos numéricos
El tipo numérico es el conjunto de los valores numéricos. Estos pueden representarse en dos formas distintas:
• tipo numérico entero (integer).
• tipo numérico real (real).
Enteros: el tipo entero es un subconjunto finito de los números enteros. Los enteros son números completos, no
tienen componentes fraccionarios o decimales y pueden ser negativos o positivos. Ejemplos de números enteros son:
5 6
–15 4
20 17
1340 26
Los enteros se denominan en ocasiones números de punto o coma fija. Los números enteros máximos y mínimos
de una computadora1
suelen ser –32.768 a +32.767. Los números enteros fuera de este rango no se suelen re presentar
como enteros, sino como reales, aunque existen excepciones en los lenguajes de programación modernos como C,
C++ y Java.
Reales: el tipo real consiste en un subconjunto de los números reales. Los números reales siempre tienen un punto decimal y pueden ser positivos o negativos. Un número real consta de un entero y una parte decimal. Los siguientes ejemplos son números reales:
0.08 3739.41
3.7452 –52.321
–8.12 3.0
En aplicaciones científicas se requiere una representación especial para manejar números muy grandes, como la
masa de la Tierra, o muy pequeños, como la masa de un electrón. Una computadora sólo puede representar un número fijo de dígitos. Este número puede variar de una máquina a otra, siendo ocho dígitos un número típico. Este
límite provocará problemas para representar y almacenar números muy grandes o muy pequeños como son los ya
citados o los siguientes:
4867213432 0.00000000387
Existe un tipo de representación denominado notación exponencial o científica y que se utiliza para números muy
grandes o muy pequeños. Así,
367520100000000000000
se representa en notación científica descomponiéndolo en grupos de tres dígitos
367 520 100 000 000 000 000
y posteriormente en forma de potencias de 10
3.675201 x 1020
y de modo similar
.0000000000302579
se representa como
3.02579 x 10–11
3.5.2. Datos lógicos (booleanos)
Este tipo de datos se utiliza para representar las alternativas (sí/no) a determinadas condiciones. Por ejemplo,
cuando se pide si un valor entero es par, la respuesta será verdadera o falsa, según sea par o impar.
C++ y Java soportan el tipo de dato bool
3.5.3. Datos tipo carácter y tipo cadena
El tipo carácter es el conjunto finito y ordenado de caracteres que la computadora reconoce. Un dato tipo carácter
contiene un solo carácter. Los caracteres que reconocen las diferentes computadoras no son estándar; sin embargo,
la mayoría reconoce los siguientes caracteres alfabéticos y numéricos:
• caracteres alfabéticos (A, B, C, ..., Z) (a, b, c, ..., z),
• caracteres numéricos (1, 2, ..., 9, 0),
• caracteres especiales (+, -, *, /, ^, ., ;, <, >, $, ...).
Una cadena (string) de caracteres es una sucesión de caracteres que se encuentran delimitados por una comilla
(apóstrofo) o dobles comillas, según el tipo de lenguaje de programación. La longitud de una cadena de caracteres es
el número de ellos comprendidos entre los separadores o limitadores. Algunos lenguajes tienen datos tipo cadena
'Hola Mortimer'
'12 de octubre de 1492'
'Sr. McKoy'
3.6. CONSTANTES Y VARIABLES
Los programas de computadora contienen ciertos valores que no deben cambiar durante la ejecución del programa.
Tales valores se llaman constantes.
3.6.1. Declaración de constantes y variables
Normalmente los identificadores de las variables y de las constantes con nombre deben ser declaradas en los programas antes de ser utilizadas. La sintaxis de la declaración de una variable suele ser:
3.7. EXPRESIONES
Una expresión consta de operandos y operadores. Según sea el tipo de
objetos que manipulan, las expresiones se clasifican en:
• aritméticas,
• relacionales,
• lógicas,
• carácter.
El resultado de la expresión aritmética es de tipo numérico; el resultado de la expresión relacional y de una expresión lógica es de tipo lógico; el resultado de una expresión carácter es de tipo carácter.
3.7.1. Expresiones aritméticas
Las expresiones aritméticas son análogas a las fórmulas matemáticas. Las variables y constantes son numéricas (real
o entera) y las operaciones son las aritméticas.
+ suma
- resta
* multiplicación
/ división
↑, **, ^ exponenciación
div, / división entera
mod, % módulo (resto)
Los símbolos +, –, *, ^ (↑ o **) y las palabras clave div y mod se conocen como operadores aritméticos. En la
expresión
5 + 3
Operadores de incremento y decremento
Los lenguajes de programación C/C++, Java y C# soportan los operadores unitarios (unarios) de incremento, ++, y
decremento, --. El operador de incremento (++) aumenta el valor de su operando en una unidad, y el operador de
decremento (--) disminuye también en una unidad. El valor resultante dependerá de que el operador se emplee como
prefijo o como sufijo (antes o después de la variable). Si actúa como prefijo, el operador cambia el valor de la variable y devuelve este nuevo valor; en caso contrario, si actúa como sufijo, el resultado de la expresión es el valor de la
variable, y después se modifica esta variable.
++i Incrementa i en 1 y después utiliza el valor de i en la correspondiente expresión.
i++ Utiliza el valor de i en la expresión en que se encuentra y después se incrementa en 1.
--i Decrementa i en 1 y después utiliza el nuevo valor de i en la correspondiente expresión.
i-i-- Utiliza el valor de i en la expresión en que se encuentra y después se incrementa en 1.
3.7.2. Reglas de prioridad
Las expresiones que tienen dos o más operandos requieren unas reglas matemáticas que permitan determinar el orden
de las operaciones, se denominan reglas de prioridad o precedencia y son:
1. Las operaciones que están encerradas entre paréntesis se evalúan primero. Si existen diferentes paréntesis
anidados (interiores unos a otros), las expresiones más internas se evalúan primero.
2. Las operaciones aritméticas dentro de una expresión suelen seguir el siguiente orden de prioridad:
• operador ( )
• operadores ++, – – + y – unitarios,
• operadores *, /, % (producto, división, módulo)
• operadores +, – (suma y resta).
3.7.3. Expresiones lógicas (booleanas)
Un segundo tipo de expresiones es la expresión lógica o booleana, cuyo valor es siempre verdadero o falso. Recuerde que existen dos constantes lógicas, verdadera (true) y falsa (false) y que las variables lógicas pueden tomar sólo
estos dos valores. En esencia, una expresión lógica es una expresión que sólo puede tomar estos dos valores, verdadero y falso. Se denominan también expresiones booleanas en honor del matemático británico George Boole, que
desarrolló el Álgebra lógica de Boole.
Operadores de relación
Los operadores relacionales o de relación permiten realizar comparaciones de valores de tipo numérico o carácter.
Los operadores de relación sirven para expresar las condiciones en los algoritmos.
Para realizar comparaciones de datos tipo carácter, se requiere una secuencia de ordenación de los caracteres
similar al orden creciente o decreciente. Esta ordenación suele ser alfabética, tanto mayúsculas como minúsculas, y
numérica, considerándolas de modo independiente. Pero si se consideran caracteres mixtos, se debe recurrir a un
código normalizado como es el ASCII (véase Apéndice A).
Cuando se utilizan los operadores de relación, con valores lógicos, la constante false (falsa) es menor que la
constante true (verdadera).
false < true
true > false
Si se utilizan los operadores relacionales = y <> para comparar cantidades numéricas, es importante recordar que
la mayoría de los valores reales no pueden ser almacenados exactamente. En consecuencia, las expresiones lógicas
formales con comparación de cantidades reales con (=), a veces se evalúan como falsas, incluso aunque estas cantidades sean algebraicamente iguales. Así,
(1.0 / 3.0) * 3.0 = 1.0
3.8. FUNCIONES INTERNAS
Las operaciones que se requieren en los programas exigen en numerosas ocasiones, además de las operaciones de las
operaciones aritméticas básicas, ya tratadas, un número determinado de operadores especiales que se denominan
funciones internas, incorporadas o estándar. Por ejemplo, la función ln se puede utilizar para determinar el logaritmo
neperiano de un número y la función raiz2 (sqrt) calcula la raíz cuadrada de un número positivo.
3.9. LA OPERACIÓN DE ASIGNACIÓN
a operación de asignación es el modo de almacenar valores a una variable. La operación de asignación se representa con el símbolo u operador ← (en la mayoría de los lenguajes de programación, como C, C++, Java, el signo de la
operación asignación es =).
3.9.1. Asignación aritmética
Las expresiones en las operaciones de asignación son aritméticas:
AMN ← 3 + 14 + 8 se evalúa la expresión 3 + 14 + 8 y se asigna a la variable AMN, es decir,
25 será el valor que toma AMN
TER1 ← 14.5 + 8
TER2 ← 0.75 * 3.4
COCIENTE ← TER1/TER2
3.9.2. Asignación lógica
La expresión que se evalúa en la operación de asignación es lógica. Supóngase que M, N y P son variables de tipo
lógico.
M ← 8 < 5
N ← M o (7 <= 12)
P ← 7 > 6
Tras evaluar las operaciones anteriores, las variables M, N y P tomarán los valores falso, verdadero, verdadero.
3.9.3. Asignación de cadenas de caracteres
La expresión que se evalúa es de tipo cadena:
x ← '12 de octubre de 1942'
La acción de asignación anterior asigna la cadena de caracteres '12 de octubre de 1942' a la variable tipo
cadena x.
3.9.4. Asignación múltiple
Todos los lenguajes modernos admiten asignaciones múltiples y con combinaciones de operadores, además de la
asignación única con el operador ← . Así se puede usar el operador de asignación (←) precedido por cualquiera de
los siguientes operadores aritméticos: +, –, *, /, %. La sintaxis es la siguiente:
<nombre variable> ← <variable> <operadores> <expresión>
3.9.5. Conversión de tipo
En las asignaciones no se pueden asignar valores a una variable de un tipo incompatible al suyo. Se presentará un
error si se trata de asignar valores de tipo carácter a una variable numérica o un valor numérico a una variable tipo
carácter.
3.10. ENTRADA Y SALIDA DE INFORMACIÓN
Los cálculos que realizan las computadoras requieren para ser útiles la entrada de los datos necesarios para ejecutar
las operaciones que posteriormente se convertirán en resultados, es decir, salida.
Las operaciones de entrada permiten leer determinados valores y asignarlos a determinadas variables. Esta entrada se conoce como operación de lectura (read).
Los datos de entrada se introducen al procesador mediante dispositivos de entrada (teclado, tarjetas perforadas, unidades de disco, etc.). La salida puede aparecer en un dispositivo de
salida (pantalla, impresora, etc.). La operación de salida se denomina escritura (write).
3.11. ESCRITURA DE ALGORITMOS/PROGRAMAS
La escritura de un algoritmo mediante una herramienta de programación debe ser lo más clara posible y estructurada,
de modo que su lectura facilite considerablemente el entendimiento del algoritmo y su posterior codificación en un
lenguaje de programación.
Los algoritmos deben ser escritos en lenguajes similares a los programas. En nuestro libro utilizaremos esencialmente el lenguaje algorítmico, basado en pseudocódigo, y la estructura del algoritmo requerirá la lógica de los programas escritos en el lenguaje de programación estructurado; por ejemplo, Pascal.
Un algoritmo constará de dos componentes: una cabecera de programa y un bloque algoritmo. La cabecera de
programa es una acción simple que comienza con la palabra algoritmo.
Esta palabra estará seguida por el nombre
asignado al programa completo. El bloque algoritmo es el resto del programa y consta de dos componentes o secciones: las acciones de declaración y las acciones ejecutables
3.11.1. Cabecera del programa o algoritmo
Todos los algoritmos y programas deben comenzar con una cabecera en la que se exprese el identificador o nombre
correspondiente con la palabra reservada que señale el lenguaje. En los lenguajes de programación, la palabra reservada suele ser program. En Algorítmica se denomina algoritmo.
algoritmo DEMO1
3.11.2. Declaración de variables
En esta sección se declaran o describen todas las variables utilizadas en el algoritmo, listándose sus nombres y especificando sus tipos
tipo-1 : lista de variables-1
tipo-2 : lista de variables-2
.
.
tipo-n : lista de variables-n
3.11.3. Declaración de constantes numéricas
En esta sección se declaran todas las constantes que tengan nombre. Su formato es
const
pi = 3.141592
tamaño = 43
horas = 6.50
Los valores de estas constantes ya no pueden variar en el transcurso del algoritmo.
3.11.4. Declaración de constantes y variables carácter
Las constantes de carácter simple y cadenas de caracteres pueden ser declaradas en la sección del programa const,
al igual que las constantes numéricas.
const
estrella = '*'
frase = '12 de octubre'
mensaje = 'Hola mi nene'
3.11.5. Comentarios
La documentación de un programa es el conjunto de información interna externa al programa, que facilitará su posterior mantenimiento y puesta a punto. La documentación puede ser interna y externa.
La documentación externa es aquella que se realiza externamente al programa y con fines de mantenimiento y
actualización; es muy importante en las fases posteriores a la puesta en marcha inicial de un programa.
La documentación interna es la que se acompaña en el código o programa fuente y se realiza a base de comentarios significativos.
Estos comentarios se representan con diferentes notaciones, según el tipo de lenguaje de programación.
Nota:
A lo largo del libro utilizaremos preferentemente para representar nuestros comentarios los símbolos // y /*. Sin
embargo, algunos autores de algoritmos, a fin de independizar la simbología del lenguaje, suelen representar los
comentarios con corchetes ([ ]).
3.11.6. Estilo de escritura de algoritmos/programas
El método que seguiremos normalmente a lo largo del libro para escribir algoritmos será el descrito al comienzo del
Apartado 3.11.
Notas
1. En ocasiones, la declaración de constantes y variables las omitiremos o se describirán en una tabla de variables que hace sus mismas funciones.
2. Las cadenas de caracteres se encerrarán entre comillas simples.
3. Utilizar siempre sangrías en los bucles o en aquellas instrucciones que proporcionen legibilidad al programa,
como inicio y fin.