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.

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).


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)


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.



Entradas populares de este blog

EJERCICIO "ESTRUCTURA SELECTIVA ANIDADA"