Sei sulla pagina 1di 28

PROGRAMA ANALÍTICO

UNIDAD 1: INTRODUCCIÓN A LA PROGRAMACIÓN

1. Introducción a la programación mediante programación por bloques


Introducción a la Programación. Marco Conceptual. Herramientas conceptuales. Estrategia de solución y
división en subtareas. Legibilidad. Herramientas del lenguaje. Comandos primitivos. Secuencia de comandos.
Procedimientos y parámetros. Repetición simple y repetición condicional. Alternativa condicional. Datos.
Valores (literales numéricos y otros). Sensores y datos primitivos; sensores de interactividad. Operadores,
parámetros y Variables.

2. Conceptos básicos
Ciencias de la Computación o Informática. Campos de conocimiento de la disciplina Informática. La
computadora como herramienta de la automatización. Componentes del hardware que intervienen en el
procesamiento de datos. Representación de información en la memoria. Concepto de bit y byte. Códigos de
representación de la información. Representación de texto. Representación de números enteros y reales.
Rango de valores. Programación. Paradigmas de programación. Lenguajes de programación. Herramientas
software para la programación (IDE). Resolución de problemas. Etapas en la resolución. Algoritmos. Concepto
y Características. Métodos de representación de algoritmos.

UNIDAD 2: PROGRAMACIÓN ESTRUCTURADA

3. Estructura y componentes de un programa


Concepto de programa. Instrucciones y tipos de instrucciones. Elementos básicos de un programa. Datos,
tipos de datos y operaciones primitivas. Datos simples y compuestos. Constantes y variables. Expresiones.
Funciones.

4. Modularización. Funciones
Descomposición de problemas y modularización. Subprogramas o módulos. Procedimientos. Funciones.
Parámetros. Métodos para el pasaje de parámetros. Pasaje por valor. Pasaje por referencia. Variables locales
y variables globales. Procedimientos y funciones con parámetros.

5. Estructuras de control
Programación Estructurada. Estructuras de Control. Secuencial. Selectiva: Simple, Doble, Múltiple.
Estructuras repetitivas: Mientras, Hacer-Mientras, Para. Recomendaciones para el diseño de los bucles.
Sentencias de salto en bucles. Estructuras repetitivas anidadas.

UNIDAD 3: ESTRUCTURAS DE DATOS

6. Estructuras de datos compuestas


Tipos de datos. Clasificación. Tipo de datos definidos por el usuario. Tipo de dato enumerativo. Tipo de dato
Cadena. Operaciones con cadenas. Registros. Acceso a los campos de un registro. Operaciones sobre
registros. Anidamiento de registros.

7. Datos compuestos indexados


Arreglos: Vectores. Matrices. Operaciones con arreglos. Detección de mayor en un arreglo. Conceptos de
Pilas y Colas. Operaciones sobre pilas y Colas. Comparación de estructuras de datos arreglos con pilas y
colas. Implementación de pilas y colas con arreglos.
TEMA 1: INTRODUCCIÓN A LA PROGRAMACIÓN MEDIANTE PROGRAMACIÓN POR
BLOQUES

MARCO CONCEPTUAL PARA LA ENSEÑANZA DE LA PROGRAMACIÓN


Estragedia de solución y división en subtareas o módulos.
Herramientas
Legibilidad: elección de nombres adecuados.
conceptuales
Algorítmica básica: recorridos.
Acciones (comandos – “verbos”)
- Comandos primitivos; secuencia de comandos.
- Procedimientos y parámetros.
- Repetición simple.
Herramientas - Alternativa condicional.
del lenguaje - Repetición condicional.
Datos (expresiones – “sustantivos”)
- Valores (literales numéricos y otros).
- Sensores y datos primitivos; sensores de interactividad.
- Operadores, parámetros y variables.

HERRAMIENTAS CONCEPTUALES
Estrategia de solución y división en subtareas o módulos
La estrategia de solución es una idea particular de QUÉ hacer para resolver un problema, la división en
subtareas es una forma específica de CÓMO expresar dicha estrategia a través de soluciones a problemas
más pequeños.
La herramienta del lenguaje básica para expresar subtareas y estrategias es el procedimiento.
Procedimiento
Es un conjunto de primitivas expresadas en el orden adecuado para crear una nueva tarea. Además de
primitivas, pueden utilizarse también otros procedimientos ya definidos.
Conviene definir un procedimiento cuando identificamos un “patrón”.
Un patrón es algo que ocurre con regularidad. A su vez, una regularidad es todo aquello que se presenta en
un orden periódico, es decir, tiene una sucesión regular.
La ventaja de detectar un patrón de acciones que el autómata debe realizar es que se puede “enseñar” una
sola vez al autómata a realizar esta nueva tarea, mediante un procedimiento y luego se puede volver a utilizar
esta tarea las veces que sean necesarias, sin necesidad de volver a escribir toda la secuencia de acciones.
Legibilidad
Un programa es una descripción ejecutable de la solución a un problema computacional. Los programas son
entidades “duales” dado que deben indicarle a una máquina cómo funcionar, pero, también deben comunicar
la solución propuesta a las personas.
Se dice que un programa es legible cuando puede ser leído con sencillez por una persona, y entendido con
poca o ninguna explicación adicional.
La legibilidad se ve expresada en la elección de nombres adecuados para las entidades que se escriban en el
programa: procedimientos, parámetros, variables y otras entidades.
Se suelen favorecer nombres cortos pero descriptivos. En el caso de los comandos, por ejemplo, estos
nombres usualmente requieren verbos en infinitivos. Adicionalmente, se requiere que el nombre brinde una
idea correcta respecto del propósito de la entidad nombrada.
Algorítmica básica: recorridos
Un recorrido es un esquema de repetición en el cual se realiza una tarea para cada uno de los elementos de
una serie, pues recorre la secuencia de elementos de a uno, procesando de alguna forma cada uno de ellos.
La idea de un recorrido es organizar la división en subtareas a la hora de resolver una tarea que requiere
trabajar con cada uno de los elementos de una secuencia. De esta forma, habrá subtareas para iniciar el
recorrido, determinar si se terminaron los elementos, procesar un elemento, pasar al siguiente elemento y
para finalizar el recorrido.

HERRAMIENTAS DEL LENGUAJE


En la programación, la forma de expresar las ideas y soluciones propuestas es, invariablemente, a través de
un lenguaje de programación. Un lenguaje de programación determinado establece cómo escribir programas
en dicho lenguaje, y provee diferentes herramientas, y diferentes formas de combinarlas, pero todas esas
formas se pueden entender como casos particulares de una serie genérica de herramientas.
Las herramientas del lenguaje se pueden clasificar según el tipo de elementos que describen: los comandos
se utilizan para describir acciones (verbos) y las expresiones se utilizan para describir datos (sustantivos).
Acciones (comandos – “verbos”)
Condiciones primitivos
Descripción de las acciones elementales que la máquina que ejecutará el programa puede realizar. La primera
forma de combinación de comandos primitivos es la secuenciación. En una secuencia de 2 comandos, por
ejemplo, se realiza la acción indicada por el primer comando y habiendo terminado esa acción, se realiza la
acción indicada por el segundo comando.
Procedimientos
Un procedimiento en su forma más simple no es más que una acción compleja (obtenida, por ejemplo, por
secuenciación de acciones más elementales) a la que se le asigna un nombre que la identifica. Puede
entenderse también como una forma de definición de nuevos comandos.
La división en subtareas y procedimientos pueden verse como dos instancias del mismo concepto
fundamental: la abstracción. Una del lado conceptual, la otra del lado del lenguaje.
El verdadero poder expresivo de los procedimientos se encuentra cuando se los combina con la noción de
parámetro.
Los parámetros son una herramienta que permite expresar muchos procedimientos diferentes mediante un
único procedimiento parametrizado. Un parámetro es como un “agujero” que el procedimiento tiene, y que
debe ser completado con un dato: el argumento.
Repetición simple y condicional
La repetición simple es la que repite un número fijo de veces.
La forma avanzada de repetición es la que se denomina repetición condicional, pues la cantidad de
repeticiones no se conoce a priori, y se utiliza una condición como mecanismo para determinar cuándo dejar
de repetir.
Alternativa condicional
La alternativa condicional es una forma de elegir entre dos posibles cursos de acción, basándose en una
condición.
Expresiones (datos – “sustantivos”)
Las expresiones son la manera de describir información, y por ello equiparables a los “sustantivos” de un
lenguaje natural.
En su forma más básica, las expresiones aparecen en forma literal, por ejemplo, para representar números (2,
17, 42, etc.) o cadenas de caracteres ("hola", "Este es un string", etc.) o valores de verdad (verdadero y falso).
Las expresiones pueden ser:
• nombres que representan información de manera indirecta: parámetros y variables.
• sensores y datos primitivos que representan la información que la máquina puede recolectar del medio
ambiente en el que ejecuta.

MÉTODO DE RESOLUCIÓN DE PROBLEMAS


- Analizar el problema (ver el escenario).
- Determinar el QUÉ (objetivo).
- Pensar una solución global.
- Pensar un nombre para la solución.
- Detectar “patrones”. Esto es reconocer situaciones que se repiten y se pueden reutilizar.
- Pensar una estrategia.
- Dividir el problema en tareas (procedimientos).
- Pensar nombres representativos para las tareas.
- Escribir la solución global.
- Analizar las primitivas.
- Determinar el CÓMO.
- Armar la solución final con:
- las primitivas
- los procedimientos
- las repeticiones
- CODIFICAR.
- Verificar: ejecutar y comprobar que se haya logrado el objetivo establecido en el primer paso. Esto implica
conocer de antemano el resultado esperado.
TEMA 2: CONCEPTOS BÁSICOS

CIENCIAS DE LA COMPUTACIÓN O INFORMÁTICA


Por Informática se entiende al “Conjunto de conocimientos científicos y técnicas que hacen posible el
tratamiento automático y racional de la información por medio de computadoras”.
En esta definición se destacan dos términos relevantes:
- Tratamiento automático: Se refiere a que son las propias máquinas (las computadoras) las que realizan las
tareas de captura, proceso y presentación de la información.
- Tratamiento racional: Se refiere a que todo el proceso está regulado a través de una secuencia de
instrucciones (programa) que siguen el razonamiento humano.
La informática como disciplina
La Computación como disciplina comprende el estudio de procesos algorítmicos que describen y transforman
a la información. “Computación” hace referencia directa a procesos numéricos, es decir cálculos, lo que sea
computable, mientras que el término “Informática”, está más relacionado con la aplicación de las tecnologías
de la computación. Para simplificar, se consideran ambos términos como equivalentes.
Dentro de la disciplina se identifican distintas subáreas de conocimiento:
• Estructuras de Datos y Algoritmos
• Lenguajes de Programación
• Arquitectura
• Computación Numérica y Simbólica
• Sistemas Operativos
• Ingeniería de Software
• Bases de Datos y Búsqueda de Información
• Inteligencia Artificial y Robótica
• Comunicación Humano-Computadora
Información y Dato
La Informática tiene como objetivo principal proporcionar información en forma automatizada, por lo tanto, es
necesario tener claro qué se entiende por INFORMACIÓN.
El término “información” en Informática puede entenderse, en un sentido amplio, como el conjunto de
símbolos con los que se representan convencionalmente hechos, objetos e ideas, y en una acepción más
específica, información como resultado del procesamiento realizado por una computadora.
En tanto que, un dato es una representación de un objeto del mundo real mediante la cual se puede modelar
aspectos de un problema que se desea resolver con un programa en una computadora.
En el contexto genérico de procesamiento de información, se denomina dato a la información de entrada e
información a la salida o resultado del procesamiento. La computadora recibe como entrada una
representación simbólica de ciertos datos de un problema y proporcionará como producto cierta secuencia de
símbolos, que, convenientemente interpretada, dará la solución (información) del problema.
Carácter
Un dato está formado por uno o varios caracteres. Un carácter es cualquier símbolo numérico, alfabético o
especial que se emplea en la escritura y en el cálculo, tal como:
- Numéricos: 0,1, 2, …, 9
- Alfabéticos: a, b, c, …, z, A, B, C, …, Z
- Especiales: *, /, +, #, …
- De control: salto de línea, fin de archivo (EOF), ...
Estos símbolos se representan en la computadora como un conjunto de bits denominado byte. Entonces,
cuando se refiere a caracteres almacenados, un byte es equivalente a un carácter.

LA COMPUTADORA COMO HERRAMIENTA DE AUTOMATIZACIÓN


La Informática trata exclusivamente el procesamiento realizado por una computadora. La computadora se
define como una máquina capaz de aceptar unos datos de entrada, efectuar con ellos operaciones lógicas y
aritméticas, y proporcionar la información resultante a través de un medio de salida; todo ello sin intervención
de un operador humano y bajo el control de un programa de instrucciones previamente almacenado en el
propio computador.
Componentes del hardware que intervienen en el procesamiento de datos
A alto nivel, una computadora está constituida por la Unidad Central de Proceso (UCP) y unidades de E/S,
con uno o varios módulos de cada tipo. Estos componentes se interconectan de manera tal que se pueda
llevar a cabo la función básica de una computadora, que es ejecutar programas.
La mayoría de las computadoras de la actualidad, se han diseñado basándose en los conceptos desarrollados
por John von Neumann. Este diseño se conoce con el nombre Arquitectura de Von Neumann y se basa en
tres conceptos claves:
- Los datos y las instrucciones se almacenan en una sola memoria de lectura escritura.
- Los contenidos de esta memoria se direccionan indicando su posición, sin considerar el tipo de dato
contenido en la misma.
- La ejecución se realiza siguiendo una secuencia de instrucción por instrucción (a no ser que dicha secuencia
se modifique explícitamente).
Programas e instrucciones
Una instrucción es un conjunto de símbolos que representa una orden de operación o tratamiento para la
computadora. En general, estas operaciones se realizan con datos.
Un programa es un conjunto ordenado de instrucciones que se dan a la computadora indicándole las
operaciones o tareas que debe realizar.

REPRESENTACIÓN DE INFORMACIÓN EN LA MEMORIA


Concepto de BIT y BYTE
En el mundo de las computadoras la información es digital, es decir, que está representada por bits. Un bit o
dígito binario, es la unidad más pequeña de información que puede procesar una computadora. Puede tener
uno de dos valores: 0 o 1. Representa la información correspondiente a la ocurrencia de un suceso de entre
dos posibilidades distintas: prendido o apagado, abierto o cerrado, blanco o negro.
Una computadora puede procesar fragmentos más grandes de información tratando grupos de bits como
unidades lógicas. Por ejemplo, una colección de 8 bits, llamada byte, puede representar 256 mensajes
diferentes (256 = 28). Esta codificación permite representar, por ejemplo, las letras del alfabeto, los dígitos
decimales y símbolos especiales.

CÓDIGOS DE REPRESENTACIÓN DE LA INFORMACIÓN EN LAS COMPUTADORAS


Los datos o cualquier información que se maneja internamente en un sistema informático están representados
por números binarios según un método preestablecido. En la representación interna de las computadoras, se
consideran básicamente, dos tipos de información: textos y números.
Representación de texto
EBCDIC: Código de Intercambio Decimal Codificado en Binario Extendido
Es un sistema de codificación de 8 bits, donde cada carácter se representa como una cadena de 8 dígitos
binarios y hay un total de 28 (256) caracteres a disposición. Cada carácter codificado o byte, se divide en dos
secciones, la primera denominada zona, se compone de 4 bits (posiciones 7, 6, 5 y 4); la segunda sección
denominada dígito, también compuesta por 4 bits (posiciones 3, 2, 1 y 0).
La sección zona, a su vez se subdivide en las posiciones 7 y 6 para identificar el tipo de carácter a
representar, y en las posiciones 5 y 4 que determinan grupos de caracteres a representar.
En la sección dígito se asigna el peso correspondiente a 23, 22, 21 y 20, es decir sus equivalentes 8, 4, 2 y 1,
respectivamente (el valor decimal que resulta del cálculo de la base 2 elevada a la posición relativa del dígito).
ASCII: Código Estándar Americano para el Intercambio de Información
Es uno de los más utilizados en la codificación interna de las computadoras. Este código reserva los primeros
32 códigos (numerados del 0 al 31 en decimal) para códigos diseñados para controlar los dispositivos. El
código 32 corresponde al carácter espacio. Los códigos del 33 al 126 se conocen como caracteres
imprimibles, y representan letras, dígitos, signos de puntuación y varios símbolos.
Cada carácter tiene una representación interna dada por un conjunto determinado de bits, que también
pueden expresarse en decimal y hexadecimal, siguiendo las reglas de conversión entre sistemas.
El código ASCII de 7 bits representa 128 caracteres y contiene todos lo necesario para escribir en idioma
inglés. En 1986, se modificó el estándar para agregar nuevos caracteres latinos, necesarios para la escritura
de textos en otros idiomas, como por ejemplo el español, así fue como se agregaron los caracteres que van
del ASCII 128 al 255, denominados ASCII Extendido.
UNICODE
Este código fue propuesto con el objetivo de representar además de textos de la cultura anglosajona y latina
otro tipo de escrituras como ser la china, japonesa, israelí entre otras.
Unicode está reconocido como estándar ISO/IEC 10646, y presenta las siguientes propiedades:
• Universalidad: trata de cubrir la mayoría de los lenguajes escritos: 16 bits -> 65.536 símbolos.
• Unicidad: a cada carácter se le asigna exactamente un único código.
• Uniformidad: ya que todos los símbolos se representan con un número mínimo de bits (16).
Representación de números
Sistemas de representación restringidos a n bits
Las computadoras disponen de registros y buses de tamaños específicos que limitan la cantidad de bits
disponibles para la representación de los datos. Es habitual mencionar que el sistema trabaja con un número
finito de n bits, denominado “palabra”. La palabra puede ser de 8, 16, 32 bits o más. Por lo tanto, las
representaciones que se utilizan tienen limitaciones, y los cálculos están sujetos a aproximaciones y por ende
a errores.
Para caracterizar los sistemas de representación y compararlos, se definen dos parámetros importantes:
- Capacidad de representación: es la cantidad de diferentes combinaciones que se pueden representar. Para
ello es necesario elevar la base del sistema binario, es decir 2, a la n que sería el tamaño de la palabra a
procesar.
- Rango: el rango de un sistema está dado por el número mínimo y el número máximo representables.
Representación de enteros
A medida que la tecnología fue evolucionando se diseñaron diferentes formas de representar números enteros
en la computadora, debiendo almacenar el valor del número y el signo. El más utilizado es el Complemento a
2 (C-2). Este método posee un rango de representación asimétrico, y los valores mínimos y máximos de
representación están en función del tamaño de la palabra de computadora.
Desbordamiento (Overflow): se conoce como overflow (desbordamiento) a la condición que se produce al
sumar dos números a través de un determinado método de representación y una determinada cantidad de
bits, cuyo resultado no puede ser representado utilizando la misma cantidad de bits, obteniéndose un
resultado erróneo.
Representación de números reales. Coma flotante
La representación de coma flotante es una forma de notación científica usada en los procesadores con la cual
se pueden representar números reales extremadamente grandes y pequeños de una manera eficiente y
compacta, y con la que se pueden realizar operaciones aritméticas. El estándar para la representación en
coma flotante es el IEEE 754.
El IEEE creó un estándar que especifica cómo deben representarse los números en coma flotante con simple
precisión (32 bits) o doble precisión (64 bits).
- Simple Precisión (32 bits). De izquierda a derecha, el bit de la posición 31 es el bit de signo (S), los
siguientes 8 son los bits del exponente (E) y los restantes 23 son la mantisa (M).
- Doble precisión (64 bits). El primer bit es el bit de signo (S), los siguientes 11 son los bits del exponente (E) y
los restantes 52 son la mantisa (M).

PROGRAMACIÓN. PARADIGMAS DE PROGRAMACIÓN.


Un programa de cómputo es un conjunto de instrucciones o declaraciones (también conocidas como código)
que debe realizar la CPU de una computadora. El término código se refiere a las declaraciones escritas en
cualquier lenguaje de programación.
Cuando un programador escribe un programa primero realiza un diseño de la solución, mediante un
seudocódigo. Luego debe escribir las instrucciones en un lenguaje de programación, siguiendo alguna
metodología de desarrollo. Las más utilizadas son la “programación estructurada” y la “programación
orientada a objetos”.
Lenguajes de programación
Un lenguaje de programación es una notación para escribir programas. Permiten la comunicación con el
hardware y dar así las órdenes adecuadas para la realización de un determinado proceso. Un lenguaje está
definido por una gramática o conjunto de reglas que se aplican a un alfabeto constituido por el conjunto de
símbolos utilizados.
Clasificación de los lenguajes de programación
Los lenguajes de programación se agrupan normalmente en tres categorías o niveles. El nivel hace referencia
a lo próxima que la forma de expresar las sentencias esté al hombre (o sea, al lenguaje natural), o a la
máquina (el lenguaje de unos y ceros de los circuitos electrónicos).
• Lenguajes de bajo nivel (máquina)
• Lenguajes intermedios (ensambladores)
• Lenguajes de alto nivel (evolucionados)
Paradigmas de programación
Un paradigma de programación es una colección de modelos conceptuales que modelan el proceso de diseño
y determinan la estructura de un programa. Cuando un lenguaje refleja bien un paradigma particular, se dice
que soporta el paradigma.
Tipos de paradigmas
Se agrupan en tres categorías de acuerdo con la solución que aportan para resolver el problema:
- Procedural o imperativo: Utilizan instrucciones como unidad de trabajo (PASCAL, C, ADA).
- Funcional y lógicos: Basados en la definición de funciones o relaciones. No utilizan instrucciones de
asignación (sus variables no almacenan valores). Los programas están formados por una serie de definiciones
de funciones (Lenguajes funcionales, como LISP) o de predicados o expresiones lógicas (Lenguajes de
programación lógica, como PROLOG).
- Orientados a objetos: Los programas se descomponen en objetos que implementan parte del sistema
encapsulando los datos que almacenan su estado junto con los métodos que se utilizan para acceder a ellos.
De este modo, las distintas partes del programa son menos dependientes entre sí, lo que facilita el
mantenimiento de las aplicaciones (SMALLTALK, C++, Java).

RESOLUCIÓN DE PROBLEMAS. ALGORITMOS.


Etapas en la resolución de problemas: el ciclo de vida del software
Desde el planteo inicial de un problema hasta que se obtiene el correspondiente programa o aplicación y su
instalación y funcionamiento en una computadora, se sigue una serie de pasos que en conjunto constituyen lo
que en Ingeniería de Software se denomina ciclo de vida del software.
Los pasos o etapas que generalmente siguen los programadores son:
- Análisis del problema: En la etapa de análisis se determina qué deberá hacer el programa. Como resultado
de esta etapa se obtiene la especificación de los requerimientos. Consiste en un documento donde queda
claramente establecido el objetivo del programa y el resultado esperado.
- Diseño de la solución:
a) Definir la estrategia de solución: identificar la solución global requerida como módulo principal.
b) Identificar y nombrar adecuadamente cada una de las tareas: el problema principal se descompone en
tareas o procedimientos. El procedimiento debe tener un nombre que represente adecuadamente esa porción
del algoritmo de la solución.
c) Representar la solución con alguna técnica: Los métodos más usuales para representar un algoritmo son el
seudocódigo y el diagrama de flujo.
- Codificación de un programa: Para realizar la conversión de un algoritmo en un programa, las operaciones
indicadas en el algoritmo se expresan en el lenguaje de programación elegido, respetando sus reglas y
sintaxis. Esta operación se realiza con un programa editor propio del lenguaje de programación o un editor de
texto de uso general. Como resultado se obtiene un programa fuente o código simplemente, almacenado
como archivo en la computadora.
- Compilación y ejecución de un programa: La compilación consiste en la traducción del programa fuente a
lenguaje de máquina. De esta tarea se encarga el programa compilador del lenguaje de programación. Si
luego de la compilación se presentan errores (errores de sintaxis), es necesario editar nuevamente el
programa, corregir los errores y compilar otra vez. Este proceso se repite hasta que no se presenten más
errores, obteniéndose el programa objeto, que todavía no es ejecutable directamente. A continuación, se
realiza la fase de montaje o enlace (link), que completa el programa objeto con bibliotecas existentes (también
conocidas como librerías) o rutinas propias del compilador, para generar el programa ejecutable.
- Verificación y depuración de un programa: La verificación de un programa es el proceso de
comprobación de la corrección de un programa. El propósito es determinar si se logra el objetivo para el cual
se diseñó y codificó la solución. Se utiliza un conjunto de datos de pruebas, denominados casos de prueba,
para determinar si el programa permite el logro del objetivo.
La depuración consiste encontrar errores y corregirlos. En general, existen tres tipos de errores:
- Errores de sintaxis: se producen cuando el código no cumple las reglas o sintaxis del lenguaje de
programación.
- Errores de ejecución: se producen por instrucciones que la computadora puede comprender, pero no
ejecutar.
- Errores de lógica: se producen en la lógica del programa y la fuente del error suele ser el diseño del
algoritmo. Estos errores son los más difíciles de detectar porque el programa funciona sin producir mensajes
de error, el error solo se advierte por la obtención de resultados incorrectos.
- Documentación: La documentación de un programa consiste en la descripción de los distintos pasos en el
proceso de resolución de un problema. La documentación de un programa puede ser: interna o externa. La
interna es la contenida en los comentarios del programa fuente, que son explicaciones intercaladas con el
código para ayudar a comprender pasos específicos. La externa incluye análisis, diagramas de flujo y/o
pseudocódigos, y manuales del usuario con instrucciones para ejecutar el programa y para interpretar los
resultados.
- Mantenimiento (o Evolución): Actualización del programa en función de los requerimientos de los usuarios,
o para mejorar el rendimiento. Esta es la etapa más larga del ciclo de vida de desarrollo de software, y puede
durar muchos años. En la actualidad se considera que el mantenimiento es realmente un desarrollo evolutivo.

ALGORITMOS: CONCEPTO Y CARACTERÍSTICAS


Un algoritmo es un conjunto finito de reglas que dan una secuencia de operaciones para resolver un problema
específico. Los algoritmos son independientes tanto del lenguaje de programación en que se expresan como
de la computadora que los ejecuta.
Los algoritmos son más importantes que los lenguajes de programación o las computadoras. Un lenguaje de
programación es tan solo un medio para expresar un algoritmo y una computadora es solo un procesador para
ejecutarlo.
Características de los algoritmos
• Precisión: el algoritmo debe indicar el orden de realización de cada acción, de forma clara y sin
ambigüedades. Además, el algoritmo debe ser concreto en el sentido de contener sólo el número de pasos
precisos para llegar a la solución (no deben darse pasos de más).
• Repetitividad: el algoritmo debe poder repetirse tantas veces como se quiera, alcanzándose siempre los
mismos resultados para una misma entrada, independientemente del momento de ejecución.
• Finitud: el algoritmo debe terminar en algún momento.
Además, a la hora de estudiar la calidad de un algoritmo, es deseable que los algoritmos presenten también
otra serie de características, tales como:
- Validez: el algoritmo construido hace exactamente lo que se pretende hacer.
- Eficiencia: el algoritmo debe dar una solución en un tiempo razonable.
- Optimización: se trata de dar respuesta a la cuestión de si el algoritmo diseñado para resolver el problema es
el mejor.
En el algoritmo se plasman las tres partes fundamentales de una solución informática:
• Entrada: información dada al algoritmo.
• Proceso: cálculos necesarios para encontrar la solución del problema.
• Salida: resultados finales de los cálculos.
Métodos de representación de algoritmos
Para escribir algoritmos se utilizan diversas técnicas que buscan eliminar la ambigüedad en la especificación
de sus pasos. Los métodos usuales para representar un algoritmo son:
a) Diagrama de flujo.
b) Lenguaje de especificación de algoritmo: seudocódigo.
c) Lenguaje natural: español, inglés, o cualquier otro idioma.
d) Fórmulas matemáticas.
Los métodos c) y d) no son fáciles de transformar en programas. Una descripción en español narrativo no es
satisfactoria porque puede presentar ambigüedades. A su vez, las fórmulas son útiles cuando los pasos a
seguir se pueden expresar como operaciones aritméticas y funciones matemáticas. Sin embargo, no es
frecuente que un algoritmo pueda ser expresado por medio de una simple fórmula.
Los diagramas de flujo constituyen un recurso gráfico, que facilita especialmente la visualización de
alteraciones en el flujo de control, porque utilizan flechas para indicar qué instrucción se debe ejecutar a
continuación. Además, utiliza distintos símbolos que determinan la forma de interpretar el contenido de los
mismos.
En el pseudocódigo los datos y operaciones se expresan de la misma manera que en los diagramas de flujo,
pero las alteraciones en el flujo de control y las operaciones de entrada/salida se indican mediante palabras
clave (instrucciones específicas). A diferencia de los lenguajes, sus reglas son más flexibles, permitiendo
concentrarse en la estructura lógica del algoritmo, sin preocuparse por las limitaciones que impondría trabajar
con un lenguaje de programación en particular.
Análisis de algoritmos. Concepto de eficiencia.
Referido a los algoritmos, en Informática se utiliza el uso de la palabra eficiencia haciendo referencia al mejor
aprovechamiento de los recursos disponibles, es decir, diremos que una solución es más eficiente en cuanto a
la utilización de un recurso.
A la hora de evaluar la eficiencia de los algoritmos, generalmente, los recursos más importantes a considerar
son el tiempo de ejecución (considerando que cuanto menor es el tiempo, mayor es la eficiencia) y el espacio
utilizado en memoria (considerando que utilizar menos espacio en memoria es más eficiente).
TEMA 3: ESTRUCTURA Y COMPONENTES DE UN PROGRAMA

CONCEPTO DE PROGRAMA
Se llama “programa” al conjunto de instrucciones (órdenes) que se dan a la computadora para la ejecución de
una tarea determinada.
El proceso de programación es un proceso de resolución de problema que se realiza siguiendo una
metodología determinada. En esta asignatura se propone un método de resolución de problemas que
propone: definir el objetivo, especificar la estrategia de solución, descomponer la solución en tareas con
nombres representativos, y verificar la solución con casos de pruebas predefinidos.
Conceptualmente, un programa puede ser considerado como una “caja negra”. Esta caja negra es el algoritmo
de solución que permitirá obtener la salida en función de las entradas. El programador debe definir de donde
provienen las entradas al programa, es decir, debe indicar desde que dispositivo de entrada (teclado, disco,
...) ingresarán los datos.
El proceso de ingresar 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 los datos se deben presentar en
dispositivos periféricos de salida: pantalla, impresora, disco, etc. La operación de salida se conoce también
como escritura o acción de escribir.

INSTRUCCIONES Y TIPOS DE INSTRUCCIONES


El proceso de diseño del algoritmo 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 la
secuencia en que deben ejecutarse.
Tipos de instrucciones
Las instrucciones disponibles en un lenguaje de programación dependen de cada lenguaje específico. Las
instrucciones básicas que soportan la mayoría de los lenguajes son:
1. Instrucciones de inicio y fin
Estas instrucciones indican a la computadora el inicio del programa y la finalización del mismo. La indicación
de fin de programa puede estar en cualquier lugar del programa y puede haber más de una instrucción de fin,
sujeta a las condiciones que evalúa el programa.
2. Instrucciones de lectura de datos (entrada)
Las instrucciones de lectura dan ingreso a los datos que se procesan, esto es, indican las variables o
posiciones de memoria en las que se almacenarán los datos en el momento de la ejecución del programa.
Una instrucción de lectura deposita valores en las posiciones de memoria indicadas por los nombres de las
variables.
3. Instrucciones de escritura de resultados (salida)
Una instrucción de escritura toma valores de las posiciones de memoria indicadas por los nombres de
variables y escribe los datos en un dispositivo de salida.
4. Instrucciones de asignación
Una instrucción de asignación coloca un valor determinado en una variable o posición de memoria.
5. Instrucciones de bifurcación
La alteración de la secuencia lineal de las instrucciones de un programa se realiza a través de las
instrucciones de bifurcación.
Las bifurcaciones pueden ser condicionales, si depende del cumplimiento de una determinada condición, o
incondicionales si la bifurcación no depende de ninguna condición. En general, las bifurcaciones
incondicionales (GOTO) no son una práctica recomendada en programación, debido a que no respetan las
estructuras de control propuestas por la programación estructurada.
ELEMENTOS BÁSICOS DE UN PROGRAMA
Los lenguajes de programación tienen elementos básicos que se usan como bloques constructivos, así como
reglas, que componen su sintaxis. Solamente las instrucciones sintácticamente correctas serán reconocidas
por la computadora; los programas con errores de sintaxis no serán ejecutados.
Los elementos básicos constitutivos de un programa o algoritmo son:
- Identificadores (nombres de variables, funciones, procedimientos, etc.)
- Palabras reservadas (INICIO, FIN, SI, MIENTRAS…)
- Caracteres especiales (coma, apóstrofos, etc.)
- Constantes
- Variables
- Expresiones
- Instrucciones
- Comentarios
- Archivos de cabecera
- Bucles, contadores, acumuladores, estructuras de control, etc.

DATOS, TIPOS DE DATOS Y OPERACIONES PRIMITIVAS


Un dato es la expresión general que describe los objetos con los que opera la computadora. En general, las
computadoras pueden operar con varios tipos de datos. Los programas operan sobre esos tipos de datos.
En el proceso de resolución de problemas el diseño de las estructuras de los datos es tan importante como el
diseño del algoritmo y del programa que se basa en el mismo.
Tipos de datos
Los distintos tipos de datos se representan en diferentes formas en la computadora. A nivel de máquina, un
dato es un conjunto 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 dato, así como de su
representación.
El tipo de un dato asocia un determinado rango de valores que el dato puede tomar durante la ejecución del
programa. Si se intenta asignar un valor fuera del rango se producirá un error.
Un lenguaje de programación se dice que es fuertemente tipado cuando:
- todos los datos deben tener un tipo declarado explícitamente.
- existen ciertas restricciones en las expresiones en cuanto a los tipos de datos que en ellas intervienen.
Una ventaja de los lenguajes fuertemente tipados es que se requiere menos esfuerzo en depurar (corregir) los
programas gracias a la cantidad de errores que detecta el compilador.
Los datos pueden ser: simples o compuestos.
Un tipo de dato simple es aquel cuyo contenido se trata como una unidad que no puede separarse en partes
más elementales. Los más usuales son:
a) Numéricos (enteros, reales)
b) Lógicos (booleano)
c) Carácter (char)
Un tipo de dato compuesto o estructurado es aquel que permite almacenar un conjunto de elementos bajo una
estructura particular, darle un único nombre, pero con la posibilidad de acceder en forma individual a cada
componente. Ejemplo de datos estructurados son los arreglos y registros.
Datos simples
a) Datos numéricos
- Entero: el tipo entero es un subconjunto finito de los números enteros. Pueden ser positivos o negativos y no
tienen decimales (en C, short, int, long).
- Real: El tipo real es un subconjunto de los números reales. Pueden ser positivos o negativos y tienen punto
decimal. Un número real consta de una parte entera y de una parte decimal (en C, float y double).
Una computadora sólo puede representar un número fijo de dígitos que depende del tamaño de la palabra.
Una palabra es el número de bits con los que opera internamente una computadora. El tamaño de la palabra
puede ser 1 byte, 2 bytes, 4 bytes u 8 bytes. Esta cantidad limitada de bits puede afectar la representación de
números muy grandes o muy pequeños, de aquí surge la coma flotante para disminuir estas dificultades.
Para datos de este tipo se utiliza la notación científica. Igual que en las calculadoras, el dígito que se
encuentra a continuación de la E representa la potencia a la que se elevará el número 10 para multiplicarlo
por la cantidad a la izquierda de dicha E.
Los tipos de datos reales pierden precisión cuando se sobrepasa el valor de sus bits de mantisa. Cuando
supera este valor, la variable que contiene el número pierde precisión y almacena un valor aproximado.
Cuanto mayor es la precisión, menor pérdida de datos habrá.
b) Datos lógicos (booleanos)
El tipo lógico, también denominado booleano, sólo puede tomar 2 valores: verdadero (true) o falso (false).
c) Datos de tipo Carácter (Char) y tipo Cadena (String)
El tipo carácter (char) es el conjunto finito y ordenado de caracteres que la computadora reconoce. Un dato de
este tipo contiene un solo símbolo. Los caracteres que reconocen las diferentes computadoras no son
estándar, pero la mayoría reconoce los caracteres: alfabéticos: letras A la Z en mayúsculas y minúsculas, los
dígitos de 0 al 9, caracteres especiales: signos de puntuación y otros símbolos. En general, estos caracteres
se almacenan en código ASCII.
Una cadena (string) de caracteres representa un conjunto de caracteres. Se puede trabajar con una variable
de este tipo como si se tratara de una unidad, sin embargo, no es un dato de tipo simple dado que está
integrado por elementos a los cuales se puede acceder en forma individual. Se trata de un tipo de datos
estructurado.
Una cadena de caracteres tiene dos características importantes: la longitud física y la longitud dinámica o
lógica. La longitud física se define en la declaración del tipo de dato y permite al procesador reservar el
espacio máximo de memoria necesario para almacenar el valor de una variable de ese tipo.
Constantes y variables
Constantes
Los programas muchas veces requieren valores que no deben cambiar durante la ejecución del programa.
Estos valores se denominan constantes. Son espacios de la memoria principal cuyo contenido permanece sin
variaciones durante la ejecución. Se identifican con un nombre y poseen un tipo de dato.
Variables
Los valores que cambian durante la ejecución del programa se llaman variables, y corresponden a espacios
de la memoria principal que se identifican con un nombre y son de un tipo de dato, y pueden cambiar de
contenido si el programador así lo especifica con las instrucciones adecuadas.
Expresiones
Las expresiones son combinaciones de constantes, variables, operadores, paréntesis y nombres de
funciones.
El resultado de cada expresión es un valor que se determina tomando los valores de las variables y
constantes implicadas y la ejecución de las operaciones indicadas. Una expresión consta de operandos y
operadores.
Según sea el tipo de objetos que manipulan, las expresiones se clasifican en:
- Aritméticas (Resultado de tipo Numérico).
- Lógicas (Resultado de tipo Lógico).
- Carácter (Resultado de tipo Carácter).
- Cadena de caracteres (resultado de tipo Cadena).
TEMA 4: MODULARIZACIÓN Y FUNCIONES

MODULARIZACIÓN
En el desarrollo de algoritmos complejos, la descomposición de problemas y la modularización son
fundamentales. Siguiendo el método de resolución de problemas se logra dividir un problema en un conjunto
de tareas más sencillas de resolver. Cada tarea recibe el nombre de subprograma, módulo o rutina.
Modularizar significa descomponer un problema en partes funcionalmente independientes. Cada una de estas
partes se denomina módulo.
La descomposición busca lograr:
- Alta Cohesión: medida del grado de identificación de un módulo con una función concreta.
- Bajo Acoplamiento: medida de la interacción de los módulos que constituyen un programa.
Un módulo o subprograma puede realizar las mismas acciones que un programa (aceptar datos, realizar
cálculos y devolver resultados). La diferencia está en que el módulo se ejecuta cada vez que el programa
principal lo invoca. Además, un módulo puede invocar a otros.
Cada módulo debe tener un nombre que lo identifique y, en algunos casos, una serie de parámetros
asociados, que se explicarán más adelante. El nombre del módulo se utiliza para su invocación.
Si un programa o subprograma necesita ejecutar las acciones que corresponden a algún módulo, debe
invocarlo usando su nombre. La invocación pasa el control al módulo, una vez ejecutada la última instrucción
del módulo, el control retorna al programa que lo llamó.
La metodología que se adecua es el diseño descendente (Top Down). Es una técnica para resolver problemas
que comienza descomponiendo el problema principal en subproblemas, para luego diseñar las soluciones
específicas para cada uno de ellos.
Ventajas de la modularización
• Mayor productividad: al dividir un sistema de software en módulos funcionalmente independientes, un
equipo de desarrollo puede trabajar simultáneamente en varios módulos, incrementando la productividad (es
decir reduciendo el tiempo de desarrollo global del sistema).
• Reusabilidad: la reutilización consiste en aprovechar el trabajo realizado en desarrollos anteriores, de
manera tal que no sea necesario codificar soluciones que ya fueron probadas.
• Facilidades de mantenimiento correctivo: La división lógica de un sistema en módulos permite aislar los
errores que se producen con mayor facilidad. Esto significa poder corregir los errores en menor tiempo y
disminuir los costos de mantenimiento de los sistemas.
• Facilidades de evolución del sistema: Los sistemas de software reales crecen (es decir aparecen con el
tiempo nuevos requerimientos del usuario). La modularización permite disminuir los riesgos y costos de
incorporar nuevas funcionalidades en un sistema en funcionamiento.
• Mayor Legibilidad: Un efecto de la modularización es una mayor claridad para leer y comprender el código
fuente. El ser humano maneja y comprende con mayor facilidad un número limitado de instrucciones
directamente relacionadas.

LAS FUNCIONES EN C
Una función realiza una tarea específica agrupando un conjunto de instrucciones con un nombre. Para que se
ejecuten las instrucciones contenidas en la función ésta se debe invocar o llamar mediante su nombre desde
otra función.
Cada función puede ser diseñada, verificada y depurada de manera independiente; esto permite que cada
función se pueda probar sin tener que esperar a que estén programadas todas las demás funciones que
también se usarán en el programa. Sin embargo, las funciones no pueden actuar de manera autónoma, es
decir, no pueden ejecutarse por sí mismas: su ejecución depende de que sea invocada por otra función y esto
a su vez debe estar relacionado siempre con la ejecución de una función main.
En el lenguaje C se pueden distinguir dos tipos de funciones: las predefinidas y las definidas por el
programador. Las funciones predefinidas se encuentran en las bibliotecas estándar de C, y es necesario hacer
uso de la directiva #include para invocarlas. Con respecto a las definidas por el programador, las diseña el
programador según sus necesidades.
Función main(): Es la función principal. Su papel es coordinar a las otras funciones mediante llamadas o
invocaciones.
Estructura de una función
Una función se compone de una cabecera y un cuerpo. En la cabecera se especifican los parámetros con los
que la función va a trabajar y el tipo de datos del valor de retorno. El cuerpo es la codificación del algoritmo de
la función.

Tipo_de_retorno nombreFuncion(lista de parámetros) {


cuerpo de la función;
return expresión;
}

• Tipo_de_retorno: es el tipo de dato del valor que devuelve la función. Si se omite el tipo de dato, asume
entero.
• nombreFuncion: es el nombre asignado a la función.
• lista de parámetros: lista de variables con sus respectivos tipos de datos: tipo1 parámetro1, tipo2
parámetro2, .... Cuando existen, éstos son los datos que debe recibir la función cuando se le invoque.
• cuerpo de la función: son las sentencias o instrucciones que ejecutará la función cada vez que sea
invocada.
• expresión: valor que devuelve la función (cuando devuelve valor).
Instancias de definición de una función
a) Prototipo de una función
La declaración de una función se denomina “prototipo”. El prototipo describe la lista de parámetros que la
función espera recibir y el tipo de datos de su valor de retorno. Contiene la cabecera de la función, siendo
opcional incluir los nombres de variables, y termina con punto y coma para indicar al compilador que es una
instrucción.
Los prototipos se sitúan normalmente al principio del programa, antes de la función main. El compilador utiliza
los prototipos para validar que el número y los tipos de datos de los parámetros reales son los mismos que el
número y los tipos de datos de los parámetros formales de la función llamada. En caso de inconsistencia se
visualiza un error.
b) Invocación de una función
Una invocación o llamada a una función implica pasarle el control de la ejecución del programa, así como los
argumentos o parámetros reales que requiere para realizar su tarea, se realiza colocando el nombre de la
función y los argumentos reales en el mismo orden que los parámetros formales correspondientes. La función,
previamente debe estar prototipada, ese decir, declarada, antes del programa principal main().
c) Desarrollo de una función
Para desarrollar una función, se define su cabecera y su cuerpo. La cabecera es idéntica al prototipo, pero les
pone nombre a los parámetros de la función.
Formas de implementación
Según el propósito específico, las funciones pueden ser diseñadas o definidas, de las siguientes maneras:
a) Funciones sin paso de parámetros. Son subprogramas que no requieren información adicional de su
entorno, pues simplemente ejecutan una acción cada vez que son invocadas.
b) Funciones con paso de parámetros. Para la ejecución de estos subprogramas se requiere además de su
invocación, que se le pase información adicional de su entorno.
c) Funciones que no regresan valor. Subprogramas que luego de su ejecución no devuelven al entorno
algún valor como resultado de su ejecución.
d) Funciones que regresan valor. Funciones que luego de su ejecución generan un valor como resultado y
“entregan” ese valor a su entorno.
El entorno de cualquier función es la función por la que es invocada.
Funciones con paso de parámetros
Una función con paso de parámetros es aquella que además de ser invocada requiere información por parte
del subprograma que la llama. Esta información se refiere a los datos de entrada que se necesitan para que la
función trabaje.
La forma general de este tipo de función es la siguiente:

tipo_dato identificador (tipo_dato parámetro) {


declaración de variables locales;
cuerpo de la función;
return (valor);
}

Parámetros formales y argumentos


Los parámetros formales (también denominados parámetros ficticios) son las variables que se declaran dentro
del paréntesis junto con la función. Por otro lado, los valores con que se invoca a la función se denominan
argumentos o parámetros reales o parámetros actuales.
Cabe señalar también que los parámetros son variables siempre, mientras que los argumentos pueden ser
variables, constantes, expresiones aritméticas e incluso lo que devuelva la llamada a otra función, siempre y
cuando los argumentos coincidan en cantidad, tipo de dato y orden con los parámetros, tal como se hayan
declarado en la función.
Paso de parámetros por valor y por referencia
Funciones con parámetros por valor
Los parámetros por valor reciben una copia de lo que valen los argumentos; su manipulación es
independiente, es decir, una vez finalizada la función, los argumentos continúan con el valor que tenían antes.
Funciones con parámetros por referencia
a) Punteros y direcciones de memoria
Para entender este concepto, se requiere conocer previamente que una dirección de memoria y su contenido
no son la misma cosa.
Supongamos que tenemos una variable x de tipo entero a la que le asignamos el valor 65.
La memoria RAM en la que se almacenan los datos está constituidas por celdas, cada una de ella posee una
dirección. En el gráfico podemos ver que la dirección de la variable x es 1802 y el contenido de la variable es
65.

Entonces, podemos operar con el valor de las variables o con su dirección.


Un puntero es una variable que contiene como valor una dirección de memoria de otra variable. Se dice que el
puntero apunta a dicha variable.
b) Paso por referencia
El paso de parámetros por referencia implica utilizar los operadores & y *.
El operador & se antepone a una variable, dando con ello acceso a su direcciónde memoria asignada. Se
utiliza en los argumentos para pasar por referencia dicha variable. El ejemplo clásico de una función de este
tipo es scanf, donde los valores introducidos por medio del teclado son almacenados por referencia en la
variable o variables indicadas; cuando se utiliza la función, se le llama con el operador & antes del identificador
de cada variable.
scanf (&a, &b, &c);
Luego de recibir las variables argumento, lo que se almacena en ellas permanece incluso después de
finalizada la función, dado que pasaron por referencia.
El operador * es un apuntador que “apunta” a la dirección de la variable pasada como argumento. Se utiliza
tanto en la declaración de los parámetros formales de la función como en el cuerpo de la misma. Debe
aparecer antes del nombre de un parámetro formal en la cabecera para indicar que dicho parámetro será
pasado por referencia, y debe aparecer en el cuerpo de la función antepuesto al nombre de un parámetro
formal para acceder al valor de la variable externa a la función y referenciada por el parámetro formal.
Alcance de variables
Una característica de las variables de un programa es el “alcance” o ámbito de referencia de estas. El alcance
determina la zona del programa donde la variable es definida y conocida. De acuerdo con este alcance, las
variables utilizadas en los programas y/o módulos se clasifican en: locales y globales.
Variables locales
Las variables locales tienen las siguientes características:
• Sólo pueden ser reconocidas y utilizadas por la función en la que están declaradas; ninguna otra, ni siquiera
main, que es el programa principal, tiene acceso a las variables locales declaradas en otra función.
• Los espacios reservados en memoria para variables locales están disponibles sólo en el momento en que se
está ejecutando la función donde fueron declaradas, una vez que se termina la ejecución de la función
desaparecen de la memoria.
El uso de variables locales presenta la ventaja importante de construir módulos altamente independientes,
donde las comunicaciones necesarias desde los programas que los invoquen deben hacerse necesariamente
mediante el pasaje de parámetros. De esta manera se evitan posibles efectos colaterales producidos por
operaciones sobre datos globales dentro de un módulo.
Variables globales
Se declara fuera de todos los módulos del programa y puede ser usada por el programa y todos los módulos
del mismo.
TEMA 5: ESTRUCTURAS DE CONTROL

PROGRAMACIÓN ESTRUCTURADA
La programación estructurada es una forma de escribir programas de forma clara, utilizando únicamente tres
estructuras: secuencia, selección e iteración o repetitivas; siendo innecesario y no permitiéndose el uso de
instrucciones de transferencia incondicional (Por ejemplo, GoTo).

ESTRUCTURAS DE CONTROL
La expresión flujo de control hace referencia al orden en el que se ejecutarán las instrucciones de un
programa, desde el inicio hasta que finaliza. El flujo normal de ejecución es el secuencial. Las sentencias de
control selectivas y las iterativas o repetitivas permiten que el flujo secuencial del programa sea modificado.
También cumplen con este objetivo las sentencias denominadas de invocación o salto.
Las sentencias selectivas o alternativas se denominan así porque permiten seleccionar uno de entre varios
caminos por donde seguirá la ejecución del programa. En algunos casos esta selección viene determinada por
la evaluación de una expresión lógica. Este tipo de sentencias se clasifican en:
• simples: SI (IF)
• dobles: SI-SINO (IF-ELSE)
• múltiples: SEGÚN-SEA (SWITCH, CASE)
Las sentencias de salto o invocación permiten realizar saltos en el flujo de control de un programa, es decir,
permiten transferir el control del programa, alterando bruscamente el flujo de control del mismo. En
programación estructurada se considera una mala práctica el uso de las condiciones de salto, ya que, entre
otras cosas, restan legibilidad al código. Sin embargo, si bien se debe evitar su uso, la mayoría de los
lenguajes las incluyen. Algunas sentencias de salto o invocación son:
• ROMPER (BREAK)
• CONTINUAR (CONTINUE)
• IR-A (GO TO) (Su utilización no es considerada una buena práctica en programación).
• VOLVER (RETURN)
Estructura secuencial
La estructura secuencial es aquella en que las acciones (instrucciones) se ejecutan sucesivamente, una a
continuación de otra, sin posibilidad de omitir ninguna y sin bifurcaciones.
Estructuras selectivas
Las estructuras selectivas posibilitan, como resultado de la evaluación de una condición, seleccionar la o las
siguientes instrucciones a ejecutar, de entre varias posibilidades o alternativas. Reciben también el nombre de
estructuras alternativas o de decisión. Las estructuras selectivas o alternativas pueden ser:
• simples: SI (IF)
• dobles: SI-SINO (IF-ELSE)
• múltiples: SEGÚN-SEA (SWITCH, CASE)
La base de este tipo de estructuras es la condición. Para expresar una condición se utilizan las expresiones
condicionales, lógicas o booleanas, que devuelven como resultado uno de estos valores: VERDADERO
(TRUE) o FALSO (FALSE).
Alternativa Simple
La estructura alternativa simple de la forma SI-ENTONCES (IF-THEN) ejecuta una acción o conjunto de
acciones cuando se cumple una determinada condición. Como resultado de evaluar la condición, pueden
ocurrir dos cosas:
• que la condición sea verdadera: en cuyo caso se ejecuta la acción preestablecida
• que la condición sea falsa: en esta situación, el programa continúa con la siguiente instrucción.
Alternativa Doble
La estructura condicional doble permite elegir entre dos opciones o alternativas posibles en función del
cumplimiento o no de una determinada condición.
Alternativa Múltiple
La estructura alternativa múltiple es una toma de decisión especializada que permite evaluar una expresión
con n posibles resultados, y en base al resultado seleccionar el siguiente bloque de instrucciones a ejecutar,
de entre varios posibles.
Estructuras de decisión anidadas
Según lo expresado, las estructuras de decisión simple y doble permiten seleccionar entre dos alternativas
posibles. Sin embargo, la instrucción SI-ENTONCES puede ser utilizada también en casos de selección de
más de dos alternativas. Esto es posible anidando estas instrucciones. Es decir, una estructura SI-
ENTONCES puede contener a otra, y esta a su vez a otra. El anidamiento de instrucciones alternativas
permite ir descartando valores hasta llegar al bloque de instrucciones que se debe ejecutar.
Estructuras de control repetitivas
En muchas ocasiones la forma más apropiada de expresar un algoritmo consiste en la repetición de una
misma instrucción de manera controlada, una cantidad finita de veces determinada de antemano (al diseñar el
programa) o en tiempo de ejecución (cada vez que se corre el programa).
Las estructuras algorítmicas que permiten realizar operaciones de este tipo se conocen con el nombre de
estructuras repetitivas o iterativas.
El concepto de bucle
En programación se denomina bucle a la ejecución repetidas veces de un mismo conjunto de sentencias.
Normalmente, en cada nueva ejecución varía algún elemento. Siempre que utilicemos las instrucciones
repetitivas, tenemos que indicar al programa donde empieza el bucle, donde termina y cuántas iteraciones
tiene que hacer entre el comienzo y el final.
Tipos de bucles
En general se utilizan en programación, dos tipos de bucles, aquellos en los que conocemos previamente la
cantidad de iteraciones, denominados, bucles controlados por contador y aquellos en los que no se conoce, a
priori, el número exacto de iteraciones, denominados bucles controlados por condición.
La estructura PARA (FOR)
Se utiliza para resolver problemas en los cuales se conoce de antemano la cantidad de veces que es
necesario repetir las instrucciones que componen el bucle.
Cuando se ejecuta la instrucción FOR, a la variable de control se le asigna el valor inicial, al llegar al final del
bucle se verifica si el valor de la variable de control es igual que el valor final; en caso negativo se incrementa
el valor de la variable de control en uno (o lo que indique el incremento), y se vuelven a ejecutar todas las
instrucciones del bucle, hasta que la variable de control sea igual que el valor final.
SEUDOCÓDIGO FORMATO C
PARA variable DESDE valor-inicial HASTA
valor-final [INCREMENTO incremento]
for (inicialización, condiciónIteración,
INSTRUCCIÓN incremento) {
[...] sentencias del bucle;
INSTRUCCIÓN }
FIN-PARA

La estructura MIENTRAS (WHILE)


Esta estructura se utiliza cuando no se conoce de antemano la cantidad de veces que será necesario repetir
un conjunto de instrucciones para solucionar el problema, o bien es conveniente que estas instrucciones sean
repetidas hasta alcanzar una determinada condición.
Al ejecutarse, lo primero que realiza es la evaluación de la condición o expresión lógica. Si el resultado es
Falso, no se realiza ninguna acción y el programa prosigue en la siguiente sentencia después del bucle. Si el
resultado es Verdadero, se ejecuta el cuerpo del bucle y se evalúa de nuevo la expresión. Este proceso se
repite mientras la expresión lógica permanezca verdadera.
SEUDOCÓDIGO FORMATO C
MIENTRAS condición HACER
INSTRUCCIÓN while (condición-bucle) {
[...] sentencias del bucle;
INSTRUCCIÓN }
FIN-MIENTRAS

La estructura HACER-MIENTRAS (DO-WHILE)


La instrucción HACER-MIENTRAS se utiliza para especificar un bucle condicional que se ejecuta al menos
una vez. La condición (expresión lógica) se evalúa al final del bucle, después de ejecutarse todas las
sentencias. Si la expresión lógica es verdadera, se vuelve a repetir el bucle y se ejecutan todas las
sentencias. Si la condición se evalúa a falso cuando se ejecuta el bucle por primera vez, el cuerpo del bucle
se ejecutará al menos una vez.
SEUDOCÓDIGO FORMATO C
HACER
INSTRUCCIÓN do {
[...] sentencias del bucle;
INSTRUCCIÓN } while (condición)
MIENTRAS condición

Sentencias de salto en bucles


Interrumpir (Break)
Esta instrucción se utiliza cuando se desea terminar un bucle en un lugar determinado del cuerpo del bucle sin
esperar a que este termine de modo natural por su entrada o su salida.
Continuar (Continue)
Esta instrucción hace que el flujo de ejecución salte el resto del cuerpo del bucle para continuar con la
siguiente iteración.
Consideraciones a tener en cuenta en el diseño de los bucles
I. Inicializar variables: Para evitar errores, se recomienda como buena práctica de programación
inicializar las variables que serán usadas en el programa.
II. Evitar bucles infinitos: Como regla general, conviene terminar un bucle con una condición de mayor o
menor, evitar la verificación de igualdad o desigualdad.
III. Finalización de los bucles: En general, existen dos métodos para controlar o terminar un bucle: bucles
controlados por contador (bucles de conteo) y bucles condicionales.
a) Ingreso de valores desde el operador o usuario del programa: Este método consiste en preguntar al
usuario si existen más entradas.
b) Uso de un valor “centinela” o valor de fin de dato: Un centinela es un valor especial utilizado para indicar
el final de una lista de datos. El valor elegido debe ser totalmente distinto de los posibles valores de la lista.
TEMA 6: ESTRUCTURAS DE DATOS

TIPOS DE DATOS
Los datos se clasifican en simples y compuestos.
Los tipos de datos simples o primitivos son aquellos que no están definidos en términos de otros tipos de
datos. Tienen como característica común que cada variable (o identificador) representa un valor de dato único.
Los tipos de datos simples estándar son: entero, real, carácter, lógico.
Los tipos de datos compuestos o estructurados están construidos en base a los tipos de datos primitivos.
Tienen como característica común que un identificador (nombre) puede representar múltiples datos
individuales, pudiendo cada uno de éstos ser referenciado independientemente. Dentro de estos se
encuentran los tipos de datos cadenas, registros, arreglos, pilas y colas.
El tipo de dato determina los valores que pueden asignarse a un dato, el formato de representación
correspondiente y las operaciones que pueden realizarse con dicho dato.
Clasificación de los tipos de datos
Entero
Real
Estándar
Carácter
Datos Simples o Primitivos
Lógico

Definido por el programador (no Subrango


estándar) Enumerativo
Cadenas (string)
Estáticos Registro
Arreglos (vectores/matrices)
Datos Estructurados o
Listas (pilas/colas)
Compuestos
Listas enlazadas
Dinámicos
Árboles y grafos
Ficheros (archivos)

Tipos de datos definidos por el programador


Un aspecto importante de las características de un lenguaje de programación es que brinde la posibilidad de
representar datos no estándares, especificando los valores permitidos y las operaciones válidas sobre los
mismos.
Un tipo de dato definido por el usuario es aquel que no existe en la definición del lenguaje, por tanto, el
programador define su denominación y el conjunto de valores y operaciones asociados al tipo definido.
Declaración de tipos
Los lenguajes de programación en general permiten asignar nombres a los tipos y usarlos en declaraciones
posteriores. Cada declaración de tipos define identificadores que pueden ser utilizados en declaraciones de
tipos, variables y funciones posteriores. El nuevo tipo puede ser tan simple como el nombre de un tipo
predefinido o puede contener la descripción de un tipo totalmente nuevo.
La declaración typedef
En C la declaración typedef permite crear nuevos tipos de datos. La sintaxis es:
typedef declaración;
donde declaración tiene la forma de una declaración de variable, sólo que se está definiendo un tipo de
datos.
Por ejemplo, la declaración:
typedef int tEntero;
hace del identificador tEntero un sinónimo del tipo de dato int.
Una vez creado este nuevo tipo de dato, puede ser utilizado para declarar variables de este tipo. Por ejemplo,
la siguiente instrucción:
tEntero len, maxlen;
declara las variables len y maxlen del tipo tEntero.
Tipo de dato enumerativo
Una enumeración es un tipo definido por el usuario que consta de un conjunto de constantes simbólicas con
nombre conocidas como enumeradores. Se utiliza principalmente para asignar nombres a constantes
numéricas. Su utilidad reside en que los nombres descriptivos hacen que un programa sea más fácil de leer.
Sintaxis:
enum nombre_de_tipo {lista_de_identificadores};
Ejemplos de declaración de enumeraciones:
enum operaciones {SUMA, RESTA, MULTIPLICACIÓN, DIVISIÓN};
enum diashabiles {LUNES, MARTES, MIERCOLES, JUEVES, VIERNES};
Operaciones sobre datos enumerativos: Las operaciones válidas sobre las variables de tipo de dato
enumerativo son reducidas para la mayoría de los lenguajes que la soportan. Solo se admiten operaciones de
asignación o de comparación.

ESTRUCTURAS DE DATOS COMPUESTAS


Los tipos de datos simples, tanto los predefinidos como los definidos por el usuario, tienen como principal
limitación que permiten la creación de variables que representan valores de datos únicos. Los datos
estructurados o compuestos permiten representar los elementos del mundo real, que generalmente son más
complejos que un simple número o una letra.
Las estructuras de datos compuestas pueden clasificarse de distintas formas según sus características.
Según el tipo de datos pueden ser:
- Homogéneas: si los datos que la componen son todos del mismo tipo.
- Heterogéneas: si los datos que la componen son de distinto tipo.
Según la cantidad de espacio de memoria utilizada por la estructura durante la ejecución del
programa, pueden ser:
- Estáticas: si la cantidad de elementos que contienen es fija, es decir, si la cantidad de
memoria que se utiliza no varía durante la ejecución del programa.
- Dinámicas: si la cantidad de elementos y, por lo tanto, la cantidad de memoria puede
variar durante la ejecución del programa.
Tipo de datos Cadenas (String)
La información de texto se almacena en constantes y en variables de tipo “cadena”. Una cadena de caracteres
se define como un conjunto ordenado de caracteres (letras, números, signos de puntuación, espacios en
blanco, etc.).
Internamente una cadena de caracteres se almacena en posiciones consecutivas de memoria, asignando un
byte para almacenar el código ASCII de cada uno de los caracteres que la componen. El problema que tiene
esta representación es que requiere que se indique a la computadora donde termina la cadena. El lenguaje C
utiliza una “marca de fin de cadena”, el carácter nulo (NULL o ASCII 0), que se representa con \0.
Funciones para manejo de cadenas
La biblioteca estándar de ANSI C contiene el archivo de cabecera string.h, que permite utilizar las funciones
de manipulación de cadenas de caracteres más usuales.
a) Función strcpy: Copia la cadena apuntada por cadena2 a cadena1, incluyendo el carácter nulo. Su
sintaxis es:
char strcpy(char cadenal, char cadena2);
Cadena1 debe ser de tamaño igual o mayor a cadena2, ya que almacena completamente hasta el carácter de
terminación de cadena2.
b) Función strcat: Concatena dos cadenas, copiando una a continuación de la otra, incluyendo su carácter
nulo de terminación. Su sintaxis es:
char strcat(char cadena1,char cadena2);
c) Función strcmp: Compara elementos sucesivos de dos cadenas, hasta que encuentre elementos distintos
o hasta que se acaben las cadenas. Devuelve 0 si las cadenas son iguales, un número negativo si cadena1 es
menor que cadena2 (en términos lexicográficos), y un número positivo si es mayor. Su sintaxis es:
int resultado = strcmp(char cadena1, char cadena2)
d) Longitud de una cadena: El número total de bytes de una cadena en C, en la memoria RAM, es igual a la
longitud de la cadena (cantidad de elementos) más 1 (marca de fin de cadena \0). En tanto que la longitud de
una cadena, es la cantidad de caracteres válidos, es decir, sin contar la marca de fin de cadena.
- Calcular la longitud recorriendo una cadena: dado que una cadena es un dato de tipo compuesto, podemos
recorrer y contar cada uno de sus elementos hasta identificar la marca de fin de cadena.
- Calcular la longitud utilizando la función strlen: Esta función calcula el número de caracteres del parámetro
cadena, excluyendo el carácter nulo de terminación de la cadena. Su sintaxis es:
size_t strlen(const char *s);
donde size_t corresponde a un tipo de entero sin signo que se utiliza generalmente para representar el
tamaño de un objeto.
e) Funciones de conversión entre mayúsculas y minúsculas: El archivo de cabecera ctype.h provee
funciones de conversión entre mayúsculas y minúsculas.
- tolower: convierte un dato carácter a minúscula.
- toupper: convierte un dato carácter a mayúsculas.

TIPO DE DATO REGISTRO


Los registros son uno de los tipos de datos estructurados más utilizados. Permiten agrupar datos de distintos
tipos y con una conexión lógica en una estructura única.
Un registro es un conjunto de valores, con tres características básicas:
- Los valores pueden ser de distinto tipo, esto hace que un registro tenga una estructura heterogénea.
- Los valores almacenados en un registro se denominan campos, cada campo tiene un identificador; los
campos son nombrados individualmente como si fueran variables comunes.
- El almacenamiento ocupado por un registro es fijo, por tanto, es una estructura estática.
Declaración de registros
Un registro en C se declara con la palabra reservada struct, cuyo formato es el siguiente:
struct datos{
tipo1 dato1;
tipo2 dato2;
/* ... otros campos del registro */
} variable1, variable2;
La palabra reservada struct inicia la definición del registro que nos es más que una lista de declaraciones de
variables entre llaves. A la palabra struct puede seguir, opcionalmente, un nombre. Los campos del registro
se definen con un tipo x y un nombre dato x. Una vez definido el registro se declaran variables de este tipo.
Para utilizar los campos que componen el registro se utiliza el operador “.”, que conecta el nombre del registro
con el nombre de campo:
nombre_registro.campo
EJEMPLO: Supongamos que se desea almacenar en una estructura los datos de mediciones de
temperaturas, por ejemplo: hora, minuto y valor de la medición en grados. Para ello se define la siguiente
estructura:
struct medida {
char hora:
char minuto;
float temperatura;
} registroMedida;
De esta manera se definió una variable compuesta, denominada registroMedida, que contiene tres campos:
la hora, los minutos y el valor de la temperatura medida. Para dar valor a esta variable se deben hacer
asignaciones a cada uno de los campos del registro:
regMedida.hora=10;
regMedida.minuto=55;
regMedida.temperatura=37.5
Con la declaración typedef se puede crear nuevos tipos de datos.
EJEMPLO: Crear un tipo de dato para el domicilio que contendrá calle, número y código postal.
typedef struct {
char calle[25];
int numero;
int codigo_postal;
} t_domicilio;
Y utilizar el nuevo tipo de dato para crear dos variables que son del mismo tipo: domicilioActual y
domicilioOrigen.
typedef struct {
int dni;
int codCar;
char codSex;
t_domicilio domicilioActual;
t_domicilio domicilioOrigen;
} tr_alumno;
TEMA 7: DATOS COMPUESTOS INDEXADOS

ARREGLOS
Un arreglo es un conjunto finito y ordenado de elementos homogéneos. Agrupa elementos similares
identificando al conjunto con un solo nombre o identificador. Se utilizan índices para acceder al valor de una
determinada posición dentro del arreglo.
Arreglos Unidimensionales – Vectores
Los vectores son arreglos unidimensionales. Los elementos del vector se referencian por su índice (1, 2, ..., i,
..., n), es decir, por su posición relativa en el vector. Los índices de un vector pueden ser números enteros,
variables o expresiones enteras.
Ventajas:
- Cada elemento de un vector se puede procesar como si fuese una variable simple al ocupar una posición de
memoria.
- Cada elemento es accesible directamente.
Declaración de vectores
Los arreglos necesitan ser dimensionados previamente a su uso dentro del programa. Dimensionar significa
reservar el espacio necesario en la memoria principal.
La declaración de un vector en C tiene el siguiente formato:
tipo nombreDelArray [numeroElementos];
Operaciones con vectores
Las operaciones que se pueden realizar con vectores durante el proceso de resolución de un problema son:
- Asignación directa: la asignación de valores a un elemento del vector se realizará con la instrucción de
asignación:
A[3] = 5;
- Asignación desde dispositivos de E/S: la asignación de valores a los elementos de un arreglo puede hacerse
también mediante dispositivos de E/S como el teclado. En este caso, la instrucción de lectura se representará
como:
int A[5];
scanf(“%d”, $A[2]);
printf(“Elemento de A[2]: %d \n”, A[2]);
- Acceso secuencial (recorrido): A la operación de efectuar una acción general sobre todos los elementos de
un vector se denomina recorrido del vector. Se realizan utilizando estructuras repetitivas, cuyas variables de
control (por ejemplo “i”) se utilizan como índice del vector. El incremento del contador del bucle producirá el
tratamiento sucesivo de los elementos del vector.
- Actualización (añadir, borrar, insertar).
- Búsqueda.
- Ordenación.
Arreglos Bidimensionales – Matrices
Los arreglos de tipo bidimensional se denominan matrices. Una matriz es un conjunto de elementos, todos del
mismo tipo, en el cual el orden de los componentes es significativo y en el que se necesita especificar dos
índices para poder identificar cada elemento. Una matriz puede considerarse como un vector de vectores.
Declaración de matrices
La declaración de una matriz en C tiene el siguiente formato:
tipoDato nombreDelArray [elementosFila], [elementosColumna];
Recorrido y manipulación de matrices
Existen diferentes ordenamientos para el recorrido de una matriz. Los más usuales son: recorrido por filas y
recorrido por columnas.
- Recorrido por filas: los elementos de la primera fila se procesan primero, luego los de la segunda, y así
sucesivamente. Se hace variar el índice de fila, y dentro de éste al índice de columna. Al iniciar cada nueva
fila se recorre desde la primera columna nuevamente.

Recorrido por filas en C:


for (fila=0; fila<3; fila++) {
for(columna=0; columna<4; columna++) {
scanf(“%d”, &A[fila][columna]);
}
}
- Recorrido por columnas: los elementos de la primera columna se procesan primero, luego los de la
segunda y así sucesivamente. Primero se hace variar el índice de columna y dentro de éste al índice de fila. Al
iniciar cada nueva columna se recorre desde la primera fila nuevamente.

Recorrido por columnas en C:


for (columna=0; columna <3; columna ++) {
for(fila=0; fila<4; fila++) {
scanf(“%d”, &A[fila][columna]);
}
}

PILAS
Una pila (stack) es una estructura de datos relativamente simple. Pertenece al grupo de estructuras de datos
lineales. Es un tipo especial de lista lineal, es decir, es un conjunto ordenado de elementos de un tipo dado,
donde cada elemento tiene un único predecesor y un único sucesor.
Las inserciones y eliminaciones se hacen por un extremo: cima, cabeza o tope (top) de la pila.
Las pilas también se conocen como LIFO (last-in, first-out), es decir, último en entrar, primero en salir.

Implementaciones
Puede implementarse de dos maneras:
a) Con punteros: la ventaja es que es la forma dinámica.
b) Con vectores (arrays): con la desventaja de que limita el máximo número de elementos que la pila puede
contener y origina la necesidad de una función más: preguntar si está llena. Condiciones:
- Declarar el array de dimensión suficientemente grande que permita contener todos los posibles elementos
de la pila.
- Declarar una variable entera que almacene el índice del último elemento de la lista.
Operaciones básicas sobre pilas
- Crear o inicializar: inicializar una pila vacía. Sólo hay que inicializar el valor de la cima o tope en un valor
inicial (-1 en el caso de C).
- Pila vacía (empty): determinar si una pila está vacía. Devuelve verdadero si la pila está vacía (si el tope = -
1).
- Pila llena: determinar si una pila está llena. Devuelve verdadero si una pila está llena (si el tope = máximo –
1).
- Apilar (push): inserta un elemento en la cima de la pila. Se debe verificar que la pila no esté llena, caso
contrario habrá desbordamiento.
- Desapilar (pop): recupera y elimina el último elemento en la cima de la pila. Se debe verificar que la pila no
esté vacía.
- Obtener la cima de la pila: permite consultar el contenido del elemento que se encuentra en la parte
superior de la pila.
- Recorrer la pila.

COLAS
Es una lista en la que las inserciones se realizan por un extremo (final) y las eliminaciones se realizan por el
otro extremo (principio o frente). También se llaman listas FIFO (first-in, first-out), es decir, el primero en entrar
es el primero en salir.
Implementación con Arrays
Condiciones:
- Declarar el array de dimensión suficientemente grande que permita contener todos los posibles elementos
de la cola.
- Definir dos variables, frente y final, que representan la posición del primer elemento y del último elemento de
la cola respectivamente.
Operaciones básicas sobre colas
- Crear o inicializar: solo debemos asignar -1 a las variables frente y final.
- Cola vacía: devuelve verdadero si la cola está vacía (frente = -1 y final = -1).
- Cola llena: devuelve verdadero si la cola está llena (final = máximo – 1).
- Añadir un elemento al final: en primer lugar se deberá verificar que la cola no esté llena, para evitar el
desbordamiento. Luego hay que incrementar el final e insertar el elemento en la posición final. Tener en
cuenta que si el final = 0 (por ser C) significa que es el primer elemento, por lo tanto el frente debe ser igual a
0.
- Suprimir el primer elemento:
a) Frente móvil: en primer lugar se deberá verificar si la cola está vacía. Luego se pone en cero o vacío
(depende del tipo de dato de los elementos) el elemento que está en el frente de la cola, para sacar el primer
elemento. Finalmente, incrementar en 1 el frente para que deje de referenciar al elemento que ahora está
vacío. Pero antes tener en cuenta que si frente = final significa que la cola está vacía porque se ha eliminado
el último elemento, entonces hay que poner en -1 el frente y final, es decir inicializar la cola.
b) Frente fijo: en primer lugar se deberá verificar si la cola está vacía. Luego se pone en cero o vacío
(depende del tipo de dato de los elementos) el elemento que está en el frente de la cola, para sacar el primer
elemento. Reacomodar el vector, es decir mover todos los elementos una posición hacia adelante (a través de
un bucle for). Limpiar el lugar restante luego de la reestructuración, es decir, poner en cero o vacío. Y
finalmente actualizar el final (final = final – 1). Pero antes tener en cuenta que si frente = final significa que la
cola está vacía porque se ha eliminado el último elemento, entonces hay que poner en -1 el frente y final, es
decir inicializar la cola.
Diferencia entre la implementación de frente fijo y la de frente móvil: en la implementación de frente móvil,
cuando se llena, tenemos que esperar eliminar todos los elementos para poder ingresar uno nuevo. En la
implementación de frente fijo, podemos ir ingresando elementos a medida que se vaya liberando espacio.
- Consulta del primer elemento: esta operación es idéntica a obtener la cima de una pila, ya que nos
interesa el contenido del primer elemento de la cola, es decir del elemento en la posición del frente.
- Recorrer la cola.

Potrebbero piacerti anche