Está en la página 1de 14

Programación C++ con las Librerías QT sobre entorno linux

CAPITULO V

I. CONTENIDO

CAPÍTULO No. 5: Pilas y Colas. Lectura y escritura de Duración: 4 Hrs


archivos
Temas Habilidades
Al finalizar el capítulo, el alumno podrá:
• Estructura de Control • Desarrollar procesos de decsión
• Pilas • Elaborar procesos cíclicos

II. ESTRUCTURAS DE CONTROL

Las estructuras de control determinan la secuencia en la que se ejecutarán las


instrucciones de un programa, estas se dividen en tres categorías en función del flujo de
ejecución:

✓ Estructura secuencial.
✓ Estructura alternativa o condicional.
✓ Estructura iterativa o repetitiva.

➢ ESTRUCTURA SECUENCIAL, la estructura secuencial está formada por una


secuencia de instrucciones que se ejecutan en orden secuencial (de arriba hacia
abajo) una a continuación de la otra.

Cada una de las instrucciones están separadas por el carácter punto y coma (;).
No obstante, en algunos casos nos interesará agrupar en un bloque una serie de
instrucciones, como veremos al explicar las estructuras de selección y de iteración.
El bloque de sentencias se define por el carácter llave de apertura ({) para marcar
el inicio del mismo, y el carácter llave de cierre (}) para marcar el final.
{
instrucción 1;
instrucción 2;
instrucción 3;
.....
instrucción N;
}

Capitulo V Pág. 1
Programación C++ con las Librerías QT sobre entorno linux
Sin embargo, en caso de que el bloque de sentencias este constituido por una única
sentencia no es obligatorio el uso de las llaves de apertura y cierre ({ }).

➢ ESTRUCTURA CONDICIONAL, las estructuras condicionales controlan si una


sentencia o bloque de sentencias se ejecutan, en función del cumplimiento o no de
una condición o expresión lógica.

C++ tiene dos estructuras de control para la selección, if y switch.

✓ Instrucción IF, esta instrucción hace que se ejecuten unas sentencias u otras
dependiendo del valor que toma una condición. La instrucción if puede ser
simple o doble:

//Alternativa simple
if (condicion)
instrucción1;

if (condicion){
instrucción 1;
instrucción 2;
instrucción 3;
}

//Alternativa doble
if (condicion)
instrucción1;
else
instrucción2;

if (condicion){
Instrucción 1;
instrucción 2;
}
else{
instrucción 3;
instrucción 4;
}

Capitulo V Pág. 2
Programación C++ con las Librerías QT sobre entorno linux
Ejemplo de estructura condicional en C++. Programa que lee un número entero
por teclado y muestra si es par o impar.

#include <iostream>
using namespace std;
int main(void){
int num;
cout <<"Introduzca numero:";
cin >> num;
if ((num%2)==0)
cout << "PAR" << endl;
else
cout << "IMPAR" << endl;

Las instrucciones if-else se pueden anidar obteniéndose una estructura


condicional múltiple:

if(condicion1)
instrucción1;
else if(condicion2)
instrucción2;
else if(condicion3)
instrucción3;
else if(condicion4)
instruccion4;
else
instrucción5;

instrucción 6;
instrucción 7;
......

En este caso se evalúa la condicion1; si es cierta, se ejecuta la instrucción1 y


se continúa por la instrucción 6 después del bloque de if-else anidados. Si la
condición1 es falsa, se evalúa la condicion2, y así sucesivamente. En caso de
no ser cierta ninguna de las condiciones, la sentencia que se ejecuta es la del
último else, es decir, la instrucción 5.

Capitulo V Pág. 3
Programación C++ con las Librerías QT sobre entorno linux

Ejemplo de estructura condicional múltiple en C++. Programa que lee un


número entero que corresponde a una hora y muestra un mensaje según la
hora que se haya leído.

#include <iostream>
using namespace std;
int main(void){
int hora;
cout << "\nIntroduzca una hora (entre 0 y 24): ";
cin >> hora;
if ((hora >= 0) and (hora < 12))
cout << "\nBuenos dias\n";
else if ((hora >= 12) and (hora < 18))
cout << "\nBuenas tardes\n";
else if ((hora >= 18) and (hora < 24))
cout << "\nBuenas noches\n";
else
cout << "\nHora no válida\n";
}

Otro ejemplo de estructura condicional múltiple en C++. Programa que lee la


calificación numérica obtenida por un alumno en un examen y muestra la nota
equivalente en texto.

#include <iostream>
using namespace std;
int main(void){
unsigned int nota;
cout << "Introduzca una calificacion numerica entre 0 y 10:";
cin >> nota;
cout << "La calificacion del alumno es" << endl;
if (nota == 10) {
cout << "Matricula de Honor" << endl;
}
else if (nota >= 9) {
cout << "Sobresaliente" << endl;

Capitulo V Pág. 4
Programación C++ con las Librerías QT sobre entorno linux
}
else if (nota >= 7) {
cout << "Notable" << endl;
}
else if (nota >= 5) {
cout << "Aprobado" << endl;
}
else{
cout << "Suspenso" << endl;
}
}

✓ Instrucción switch, la sentencia switch selecciona una de entre múltiples


alternativas. La forma general de esta expresión es la siguiente:

switch (expresión){
case constante1:
instrucciones;
break;
case constante 2:
instrucciones;
break;
···
default:
instrucciones;
}

En una instrucción switch, expresión debe ser una expresión con un valor
entero, y constante1, constante2, ..., deben ser constantes enteras, constantes
de tipo carácter o una expresión constante de valor entero. Expresión también
puede ser de tipo char, ya que los caracteres individuales tienen valores enteros
Dentro de un case puede aparecer una sola instrucción o un bloque de
instrucciones.

La instrucción switch evalúa la expresión entre paréntesis y compara su valor


con las constantes de cada case. Se ejecutarán las instrucciones de aquel case
cuya constante coincida con el valor de la expresión, y continúa hasta el final

Capitulo V Pág. 5
Programación C++ con las Librerías QT sobre entorno linux
del bloque o hasta una instrucción que transfiera el control fuera del bloque del
switch (una instrucción break, o return). Si no existe una constante igual al
valor de la expresión, entonces se ejecutan las sentencias que están a
continuación de default si existe (no es obligatorio que exista, y no tiene porqué
ponerse siempre al final).

Ejemplo de uso de la instrucción switch en C++. Programa que lee dos números
y una operación y realiza la operación entre esos números.

#include <iostream>
using namespace std;
int main(void){
int A,B, Resultado;
char operador;
cout << "Introduzca un numero:";
cin >> A;
cout << "Introduzca otro numero:";
cin >> B;
cout <<"Introduzca un operador (+,-,*,/):";
cin >> operador;
Resultado = 0;
switch (operador)
{
case '-' : Resultado = A - B;
break;
case '+' : Resultado = A + B;
break;
case '*' : Resultado = A * B;
break;
case '/' : Resultado = A / B; //suponemos B!=0
break;
default : cout << "Operador no valido"<< endl;
}
cout << "El resultado es: ";
cout << Resultado << endl;
}

Capitulo V Pág. 6
Programación C++ con las Librerías QT sobre entorno linux
El siguiente programa determina si un carácter leído es o no una vocal. En ese
caso como la sentencia a ejecutar por todas las etiquetas case es la misma,
esta sentencia se pone una única vez al final:

#include <iostream>
using namespace std;
int main(void){
char car;
cout << "Introduzca un caracter: ";
cin >> car;
switch (car)
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'o':
case 'O':
case 'u':
case 'U': cout << car << " es una vocal" << endl;
break;
default : cout << car << " no es una vocal" << endl;
}
}

➢ ESTRUCTURAS REPETITIVAS O ITERATIVAS, C++ dispone de tres estructuras


repetitivas: while, do-while y for.

✓ Instrucción while, ejecuta una instrucción o un bloque de instrucciones cero


o más veces, dependiendo del valor de la condición. Se evalúa la condición, y
si es cierta, se ejecuta la instrucción o bloque de instrucciones y se vuelve a
evaluar la condición; pero si la condición es falsa, se pasa a ejecutar la siguiente
instrucción después del while.

while (condicion)

Capitulo V Pág. 7
Programación C++ con las Librerías QT sobre entorno linux
{
instrucción 1;
..............
instrucción N;
}
.
El siguiente programa lee números enteros hasta que se lee un número
negativo. Se muestra la suma de todos los números leidos excepto el número
negativo.

#include <iostream>
using namespace std;
int main(void){
int suma, num;
suma = 0;
cout << "Introduzca un numero: ";
cin >> num;
while (num >= 0)
{
suma = suma + num;
cout << "Introduzca un numero: ";
cin >> num;
}
cout << endl << "La suma es: " << suma << endl;
}

✓ Instrucción do while, ejecuta una instrucción o un bloque de instrucciones,


por lo menos una o más veces, dependiendo del valor de la condición. Se
ejecuta la instrucción o bloque de instrucciones y a continuación se evalúa la
condición. Si la condición es cierta, se vuelve a ejecutar la instrucción o bloque
de instrucciones, y si es falsa, pasa a ejecutarse la siguiente instrucción
después del do-while.

Cuando se utiliza una instrucción do-while el bloque de instrucciones se ejecuta


al menos una vez, ya que la condición se evalúa al final. En cambio, con una
instrucción while, puede suceder que el bloque de instrucciones no llegue a
ejecutarse nunca si la condición inicialmente es falsa.

Capitulo V Pág. 8
Programación C++ con las Librerías QT sobre entorno linux
do
{
instrucción 1;
..............
instrucción N;
} while (condicion);

En el siguiente programa que lee un número entero, el número debe estar


comprendido entre 1 y 100.

/* lee un número entre 1 y 10 */


#include <iostream>
using namespace std;
int main(void)
{
int numero;
do
{
cout << "Introduzca un numero entre 1 y 100: ";
cin >> numero;
}
while (numero < 1 || numero > 100);
}

✓ Instrucción for, un bucle for hace que una instrucción o bloque de


instrucciones se repitan un número determinado de veces mientras se cumpla
la condición.

for(inicialización; condicion; incremento/decremento)


{
instrucción 1;
...........
instrucción N;
}

A continuación de la palabra for y entre paréntesis debe haber siempre tres


zonas separadas por punto y coma:

Capitulo V Pág. 9
Programación C++ con las Librerías QT sobre entorno linux
✓ zona de inicialización
✓ zona de condición
✓ zona de incremento ó decremento.

En alguna ocasión puede no ser necesario escribir alguna de ellas. En ese caso
se pueden dejar en blanco, pero los punto y coma deben aparecer. El
funcionamiento de un bucle for es el siguiente:

✓ Se inicializa la variable o variables de control.


✓ Se evalúa la condición.
✓ Si la condición es cierta se ejecutan las instrucciones. Si es falsa, finaliza
la ejecución del bucle y continúa el programa en la siguiente instrucción
después del for
✓ Se actualiza la variable o variables de control (incremento/decremento)
✓ Se pasa al punto 2 (evalúa condición).

Esta instrucción es especialmente indicada para bucles donde se conozca el


número de repeticiones que se van a hacer.

Como regla práctica podríamos decir que las instrucciones while y do-while se
utilizan generalmente cuando no se conoce a priori el número de pasadas, y la
instrucción for se utiliza generalmente cuando sí se conoce el número de
pasadas.
El siguiente programa muestra los números del 1 al 10.

/* muestra los números de 1 a 10 */


#include <iostream>
using namespace std;
int main(void){
int n;
for (n = 1; n <= 10; n++) {
cout << n << endl;
}
}

El siguiente programa muestra los números del 10 al 1:

Capitulo V Pág. 10
Programación C++ con las Librerías QT sobre entorno linux
/* muestra los números de 10 a 1 */
#include <iostream>
using namespace std;
int main(void){
int n;
for (n = 10; n >=1; n--) {
cout << n << endl;
}
}

Se ha de tener cuidado y al escribir el punto y coma (;) después del paréntesis


final del bucle for. Por ejemplo el bucle:

#include <iostream>
using namespace std;
int main(void){
int i;
for (i = 1; i <= 100; i++); {
cout << "Hola" << endl;
}
}

No muestra "Hola" 100 veces. En realidad se muestra una vez "Hola", ya que
la sentencia for es una sentencia vacía al terminar con un punto y coma (;). La
sentencia for en este caso hace que i empiece en 1 y acabe en 11 y tras esas
iteraciones, se ejecuta la sentencia cout.

III. PILAS

Una pila (stack en inglés) es una lista ordinal o estructura de datos en la que el modo de
acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar,
primero en salir) que permite almacenar y recuperar datos. Esta estructura se aplica en
multitud de ocasiones en el área de informática debido a su simplicidad y ordenación
implícita de la propia estructura.

Capitulo V Pág. 11
Programación C++ con las Librerías QT sobre entorno linux
Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que
coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el
último elemento apilado.

El concepto de pila es muy importante en computación y en especial en teoría de lenguajes


de programación. En lenguajes procedurales como Pascal o C, la pila es una estructura
indispensable, debido a las llamadas a función. Cuando ocurre una llamada a alguna
función, el estado global del sistema se almacena en un registro y éste en una pila. Cuando
se termina de ejecutar algún procedimiento, se recupera el registro que está en la cima
de la pila. Otros ejemplos de uso de pilas son:

✓ Navegador Web, se almacenan los sitios previamente visitados, cuando el


usuario quiere regresar (presiona el botón de retroceso), simplemente se extrae
la última dirección (pop) de la pila de sitios visitados.
✓ Editores de texto, los cambios efectuados se almacenan en una pila,
usualmente implementada como arreglo. El usuario puede deshacer los
cambios mediante la operación “undo”, la cual extraer el estado del texto antes
del último cambio realizado.

Para la implementación del concepto de pilas, vamos a hacer uso de una estructura de datos,
dicha estructura debe tener los campos para almacenar los datos y un campo especial de tipo
puntero del mismo tipo de la estructura, este campo permitirá hacer el enlace hacia el
siguiente elemento de la pila.

Capitulo V Pág. 12
Programación C++ con las Librerías QT sobre entorno linux
struct Nodo{
int valor;
Nodo *siguiente;
};

La variable pila se debe declarar como un puntero del tipo de la estructura y debe estar
inicializado como nulo, luego se necesitará un nodo como puntero del tipo de la estructura,
para este nodo se deberá solicitar memoria al sistema operativo con el operador new.

Nodo *pila = NULL;


Nodo *nuevo = new Nodo();

El siguiente paso es asignar los valores al nodo. El algoritmo que permite hacer el enlace
entre la pila y el nodo es la asignación de la pila al campo puntero del nodo y luego asignar
todo el nodo a la pila, de esta forma la pila siempre se mantiene en la cima de los nodos que
la conforman.

nuevo->valor = 20;
nuevo->siguiente = pila;
pila = nuevo;

nuevo = new Nodo();


nuevo->valor = 10;
nuevo->siguiente = pila;
pila = nuevo;

nuevo = new Nodo();


nuevo->valor = 5;
nuevo->siguiente = pila;
pila = nuevo;

El proceso para consultar los valores de cada nodo de la pila implica obtener el nodo de la
cima, consultar su valor y luego liberar ese espacio de memoria.

El orden de como se obtiene los nodos siempre es inverso al orden en que fueron ingresados,
es decir primero se leen los últimos en ingresar.

De la misma forma que se se asignaba el nuevo nodo a la pila, ahora se asigna la dirección
del campo puntero del nodo a la pila.

cout<<"El valor de la pila es: "<<pila->valor<<endl;


pila = pila->siguiente;

cout<<"El valor de la pila es: "<<pila->valor<<endl;

Capitulo V Pág. 13
Programación C++ con las Librerías QT sobre entorno linux
pila = pila->siguiente;

cout<<"El valor de la pila es: "<<pila->valor<<endl;


pila = pila->siguiente;

IV. LABORATORIO N° 1

Crear un programa que haga uso de las sentencias de control.

V. LABORATORIO N° 2

Crear un programa que elabore una pila.

Capitulo V Pág. 14

También podría gustarte