Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… ·...

23
Programación Mª Dolores Molina Programación Avanzada en C++ Introducción Este manual ha sido diseñado como continuación del manual “Iniciación a la programación” que utilizamos al inicio de este curso. En este documento vamos a introducir nuevos conceptos de programación avanzado como son el uso de cadenas de caracteres, ficheros y conceptos de programación orientada a objetos que nos van a ayudar a crear programas más complejos y con muchas más funciones. Conceptos avanzados de Programación Subprogramas: funciones y procedimientos Definimos un subprograma como un subconjunto de líneas de código que realizan una función específica dentro un programa. Programar incluyendo subprogramas tiene las siguientes ventajas: Los subprogramas pueden ser llamados (invocados) desde cualquier parte del programa tantas veces como sea necesario, ahorrando así al programador la necesidad de incluir repetidamente su código. El código de los subprogramas se puede definir en ficheros independientes del programa principal, lo que permite definir una estructura modular para un programa que hace más fácil su organización y mantenimiento. Una vez que un subprograma ha sido definida y funciona correctamente puede ser incluida en una biblioteca que permita su reutilización en distintos programas. En C++ podemos encontrar dos tipos de subprogramas: Procedimentos: Formados por un conjunto de líneas que realiza una tarea específica. La función principal (main) se comunica con el procedimiento mediante los parámetros, pero los procedimientos no envían de vuelta ningún tipo de información a la función principal. Funciones: Al igual que los procedimientos son un conjunto de líneas que realiza una tarea específica, pero a diferencia de ellos las funciones se comunican con la función principal (main) a través de los parámetros y de un valor de retorno que envía a la función principal cuando termina su ejecución. En C++ todos los subprogramas tienen las siguientes partes: Nombre: es la forma de identificar el conjunto de líneas de código que forman el subprograma. Parámetros o argumentos: Son los valores de partida para el subprograma, se los pasa el programador cuando la utiliza, en el caso que el subprograma no necesite valores de partida se utiliza el tipo void (vacío) para indicar que dicha subprograma no tiene parámetros. Valor devuelto: Este elemento solo está presente en los subprogramas de tipo función. Todas las funciones en C devuelven algún valor, aun cuando no lo necesiten, ya que en C tenemos

Transcript of Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… ·...

Page 1: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

Programación Avanzada en C++

Introducción

Este manual ha sido diseñado como continuación del manual “Iniciación a la programación” queutilizamos al inicio de este curso. En este documento vamos a introducir nuevos conceptos deprogramación avanzado como son el uso de cadenas de caracteres, ficheros y conceptos deprogramación orientada a objetos que nos van a ayudar a crear programas más complejos y conmuchas más funciones.

Conceptos avanzados de Programación

Subprogramas: funciones y procedimientos

Definimos un subprograma como un subconjunto de líneas de código que realizan una funciónespecífica dentro un programa. Programar incluyendo subprogramas tiene las siguientes ventajas:

• Los subprogramas pueden ser llamados (invocados) desde cualquier parte del programatantas veces como sea necesario, ahorrando así al programador la necesidad de incluirrepetidamente su código.

• El código de los subprogramas se puede definir en ficheros independientes del programaprincipal, lo que permite definir una estructura modular para un programa que hace másfácil su organización y mantenimiento.

• Una vez que un subprograma ha sido definida y funciona correctamente puede ser incluidaen una biblioteca que permita su reutilización en distintos programas.

En C++ podemos encontrar dos tipos de subprogramas: • Procedimentos: Formados por un conjunto de líneas que realiza una tarea específica. La

función principal (main) se comunica con el procedimiento mediante los parámetros, perolos procedimientos no envían de vuelta ningún tipo de información a la función principal.

• Funciones: Al igual que los procedimientos son un conjunto de líneas que realiza una tareaespecífica, pero a diferencia de ellos las funciones se comunican con la función principal(main) a través de los parámetros y de un valor de retorno que envía a la función principalcuando termina su ejecución.

En C++ todos los subprogramas tienen las siguientes partes:

• Nombre: es la forma de identificar el conjunto de líneas de código que forman elsubprograma.

• Parámetros o argumentos: Son los valores de partida para el subprograma, se los pasa elprogramador cuando la utiliza, en el caso que el subprograma no necesite valores de partidase utiliza el tipo void (vacío) para indicar que dicha subprograma no tiene parámetros.

• Valor devuelto: Este elemento solo está presente en los subprogramas de tipo función. Todaslas funciones en C devuelven algún valor, aun cuando no lo necesiten, ya que en C tenemos

Page 2: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

un tipo para definir el vacío, el tipo void, que se utiliza para indicar que el valor de retornono va a ser utilizado.

Se distinguen tres fases en la utilización de un subprograma: 1. Declaración del subprograma. Se especifica qué tipos de datos recibirá el subprograma

como parámetros y de que tipo de datos son los valores devueltos. Los subprogramas sedeclaran antes de la función main y después de las directivas para el compilador. Ladeclaración de un subprograma no es obligatoria en C++ aunque si no se hace el compiladorno comprobará el número y el tipo de parámetros que se le pasan dando lugar a posibleserrores de compilación y posterior funcionamiento del programa, por tanto es altamenterecomendable declarar los subprogramas. En la declaración de un subprograma se definen eltipo de datos que devuelve, el nombre del subprograma y tipo y número losargumentos.

2. Definición del subprograma: En la definición del subprograma el programador incluye todaslas líneas que código que van a formar parte del mismo. Un subprograma se puede definir encualquier parte del código, pero se suelen definir después de la función main o en ficherosindependientes que después se incluyen como cabeceras (ficheros con extensión .h). En ladefinición del subprograma se definen entre paréntesis los tipos de los argumentos y elnombre de dichas variables, es decir, se incluye una declaración de los argumentos que sevan a utilizar en él y por tanto no es necesario volver a declararlos dentro del código.

3. Invocación o llamada al subprograma: Cuando se quiere llamar al subprograma bastaescribir su nombre y especificar los datos con los que debe trabajar.

En el siguiente ejemplo vamos a ver la declaración, definición e invocación de una función querecibe como parámetros dos números y devuelve el mayor de los dos.

#include <iostream>using namespace std;

int mayor(int, int); /*declaración de la función, solo se incluyen los tipos de datos */

int main(void){

int numero1, numero2, numeromayor;

cout << “Programa para comparar dos números /n”;cout <<“ Introduzca el primer número a comparar:”;cin >> numero1;cout << “Introduzca el segundo número a comparar:”;cout << numero2;

numeromayor=mayor(numero1, numero2); /*invocación de la función, con sus valores */

cout << “El número mayor es:” << numeromayor;

return(0);}

Page 3: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

int mayor(int n1, int n2) /*definición de la función, se incluye la declaración de parámetros */{ /* no es necesario volver a declararlos dentro, el resto de variables */

if(n1>n2) /* si necesitan ser declarados */ return(n1);else return(n2);

}

Realiza los ejercicios del 1 al 7 del final del tema

Cadenas de caracteres:

En algunos lenguajes de programación como C, una cadena de texto es también un tipo de datonativo como los enteros o los decimales (float). Sin embargo en C++ el tipo de datos para manejarlas cadenas de caracteres (string) corresponde con un objeto, el concepto de objeto se explicará másadelante en este manual. Esto no afecta demasiado a su manejo básico, que es bastante similar al delos tipos de datos básicos con los que hemos trabajo hasta ahora. Para manejar el tipo stringdebemos incluir la biblioteca estándar <string>.

Declaración de una cadena de caracteres: Para declarar una cadena de caracteres utilizamos lasiguiente instrucción:

string nombre_variable;

Introducir cadenas desde teclado: Se realiza de igual forma que hemos explicado antes con los valores numéricos, mediante la instrucción cin >>.

cin >> nombre_variable;

La función cin solo puede leer cadenas de caracteres que no contenga espacios en blanco en sucontenido. Para leer cadenas de caracteres que contenga espacios en blanco deberemos emplearalguna de las funciones incluidas en las librerías estándar del lenguaje y que estudiaremos másadelante.

Mostrar cadenas por pantalla: Se realiza de igual forma que hemos explicado antes con los valoresnuméricos, mediante la instrucción cout <<

cout << nombre_variable;

También podemos mostrar varias cadenas de caracteres en la misma línea, tanto constantes comovariables, siguiendo la misma sintaxis que hemos empleado con los tipos de datos numéricos:

cout << “Bienvenido al sistema” << nombre << endl;

Leer cadenas de caracteres con espacios en blanco: Para almacenar una cadena de caracteres conespacios en blanco usaremos la función getline(cin, texto) tal y como se muestra en el siguienteejemplo.

Page 4: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

// Lectura de cadenas de texto con espacios

#include <iostream>#include <string>using namespace std;

int main() { string nombre;

cout << “Introduce tu nombre completo:”;getline(cin, nombre);cout << “Bienvenido al sistema” << nombre << endl;return 0;

}

Cuando implementamos lecturas de cadenas dentro de bucles podemos encontrar problemas comoconsecuencia del carácter intro que utilizamos para indicar a la función cin o getline que debe dejarde leer, de forma que ese carácter que se ha quedado almacenado en el buffer interfiere en lasiguiente lectura haciendo que se almacene una cadena vacía. Para evitar este tipo de problemasutilizaremos el manipulador ws en el flujo cin tal y como se muestra en el siguiente ejemplo:

#include <iostream> #include <string> using namespace std ;

int main() {

string nombre ; int edad ; for (int i = 0; i < 5; ++i) {

cout << "Introduzca el nombre: " ; cin >> ws ; // elimina los espacios en blanco y fin de línea

// debe ir justo antes del getline para que funcionegetline(cin, nombre) ; cout << "Introduzca edad: " ; cin >> edad ; cout << "Edad: " << edad << " Nombre: [" << nombre << "]" << endl ;

} }

Como podemos ver en el ejemplo el manipulador ws elimina del buffer de entrada todos loscaracteres en blanco de forma que no podremos leer una cadena de caracteres vacía.

Calcular la longitud de una cadena de caracteres: Para calcular la cantidad de caracteres queforman una cadena añadiremos .length() a su nombre tal como se muestra en el siguiente ejemplo:

// Calcular la longitud de una cadena

#include <iostream>#include <string>using namespace std;

Page 5: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

int main(){ string nombre; cout << “Introduce tu nombre: ”; cin >> nombre; cout << “ Tu nombre tiene “ << nombre.length() << “caracteres.” << endl; return 0;}

Realiza el ejercicio 8 que encontrarás al final del tema.

Acceder a una posición individual dentro de una cadena de caracteres: Podemos acceder aposiciones individuales de una cadena de caracteres tal y como lo hemos hecho con los vectores pormedio de los corchetes nombre[i] o mediante .at(n) tal y como se muestra en el siguiente ejemplo:

// Programa que imprime tu nombre al revés repitiendo cada letra dos veces

#include <iostream> #include <string> using namespace std;

int main() { string nombre;

int i;

// zona de entrada de datos cout << "Introduce tu nombre: "; cin >> nombre; //mostramos la cadena al revés */

cout << "Tu nombre al revés es:";

// restamos uno a la longitud para no mostrar el fin de cadena

for (i=nombre.length()-1;i>=0;i--) { cout << nombre[i]; cout << nombre.at(i); }

return(0); }

Realiza el ejercicio 9 que encontrarás al final del tema.

Page 6: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

Subcadenas: Podemos extraer una parte de una cadena completa, subcadena, empleando.substr(inicio,longitud), donde inicio será la posición dentro de la cadena desde la que queremosempezar a copiar y longitud el número de caracteres que queremos copiar, tal y como se muestra enel siguiente ejemplo:

// Programa que extrae una subcadena de una cadena

#include <iostream> #include <string> using namespace std;

int main() { string nombre, subcadena;

// zona de entrada de datos cout << "Introduce tu nombre: "; cin >> nombre; //copiamos las 5 primeras letras de nuestro nombre en la variable subcadena subcadena=nombre.substr(0,5);

cout << “Las 5 primeras letras de tu nombre son:” << subcadena << endl ;

return(0); }

Realiza el ejercicio 10 que encontrarás al final del tema.

Unir varias cadenas: Podemos concatenar dos cadenas utilizando el signo +. También podemosutilizar .append para añadir un nuevo fragmento al final de una cadena o .assing para modificar suvalor (esto último también se puede hacer con el signo de asignación =).

// Programa que monta en una sola cadena tu nombre y apellidos

#include <iostream> #include <string> using namespace std;

int main() { string nombre, apellido1, apellido2, nombrecompleto;

// zona de entrada de datos cout << "Introduce tu nombre: "; cin >> nombre;

cout << "Introduce tu primer apellido: "; cin >> apellido1

cout << "Introduce tu segundo apellido: "; cin >> apellido2;

Page 7: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

nombrecompleto= nombre + “ “ + apellido1 + “ “ + apellido2; cout << “Tu nombre completo es” << nombrecompleto << endl ;

// lo mismo de otra forma seríanombrecompleto.assign(nombre);nombrecompleto.append(“ “);nombrecompleto.append(apellido1);nombrecompleto.append(“ “);nombrecompleto.append(apellido2);cout << “Tu nombre completo es” << nombrecompleto << endl ;

return(0); }

Realiza el ejercicio 11 que encontrarás al final del tema.

Comparar cadenas de caracteres: Podemos comparar cadenas de caracteres con los mismosoperadores que hemos empleado para comparar números, igual (==), distinto (!=), mayor (>),menor(<), mayor o igual (>=), menor o igual(<=), debemos tener en cuenta que en este caso seutilizará la ordenación alfabética ascendente (de la a a la z), aunque todas las minúsculas siempreson mayores que las mayúsculas.

Realiza los ejercicios 12 y 13 que encontrarás al final del tema.

Tipos de parámetros de un subprograma

Ya hemos explicado en apartados anteriores el concepto de subprograma y la diferencia entre unprocedimiento y una función. En este apartado nos vamos a centrar en cómo se realiza elintercambio de información entre el subprograma y la función que lo llama.

El intercambio de información en la llamada a un subprograma se puede realizar hacia elsubprograma, desde el subprograma o en ambos sentidos. Dicho intercambio de información serealiza a través de los parámetros.

Dependiendo del contexto en que se utilicen, hablaremos de los siguientes tipos de parámetros:• Parámetros formales: Nos referimos a los que aparecen en la definición del subprograma,• Parámetros actuales (o reales): Nos referimos a los que aparecen en la llamada al

subprograma.• Parámetros de entrada: Son aquellos que se utilizan para que el subprograma pueda recibir

la información necesaria para realizar una determinada tarea. • Parámetros de salida: Son a aquellos que se utilizan para retornar la información calculada

al programa que invocó al subprograma.

Cuando llamamos a una función es necesario pasarle un valor a sus parámetros formales para que lafunción pueda realizar las tareas que el programador ha incluido en su definición. Para pasarle unvalor a los parámetros de una función podemos utilizar las siguientes técnicas:

Page 8: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

• Paso por valor: En este caso los parámetros formales, los que declaramos en la definición,son variables independientes, que toman sus valores iniciales como copias de los valoresde los parámetros actuales, los que aparecen en la llamada en el momento de la invocaciónal subprograma, es decir, el valor del parámetro actual se copia en el parámetro formal parausarlo en la función. El parámetro actual puede ser cualquier expresión cuyo tipo seacompatible con el tipo del parámetro formal correspondiente. Se declaran especificando eltipo y el identificador asociado. Esta técnica se emplea para pasar el valor a los parámetrosen entrada.

Veamos un ejemplo en el que se realiza la llamada a una función utilizando el paso porvalor:

Llamada a la función desde la función principal

Se crea y se asigna una valor al parámetro actual

int main(void){ int valor=20;

aumenta(valor);

Ejecución de la función

Se crean los parámetros formales y se copia elvalor del parámetro actual en el parámetroformal.

void aumenta (int numero) /* numero vale 20*/{ numero ++; /* numero vale 21 */ cout << numero;}

Fin de la ejecución de la función y vuelta al programa principal

Se destruyen los parámetros formales, losparámetros actuales no cambian de valorcout << valor; /*valor sigue valiendo 20*/

return 0;}

• Paso por referencia: En este caso los parámetros formales son una referencia a lavariable que se haya especificado como parámetro actual en el momento de la llamada alsubprograma, es decir, no hay una variable copia que recibe el valor de la variable original sino que la misma posición de memoria (variable) se referencia con dos nombres, el asignadoal parámetro formal y el asignado al parámetro actual. Ello exige que el parámetro actualcorrespondiente a un parámetro formal por referencia sea una variable, es decir, no podemosllamar a una función con parámetros por referencia con una constante como valor para losparámetros actuales. Cualquier acción dentro del subprograma que se haga sobre elparámetro formal se realiza sobre la variable referenciada, que aparece como parámetro

Page 9: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

actual en la llamada al subprograma. Para utilizar parámetros por referencia es necesariodeclararlos especificando el tipo de la variable y añadiendo el símbolo “ampersand ” (&)entre éste y el identificador asociado en la definición de la función. Esta técnica se utilizapara definir los parámetros de salida, ya que durante la ejecución de la función se modificael valor de los parámetros actuales, permitiendo así que una función puedan generar más deun parámetro de salida, recordemos que la función return que estudiamos en cursosanteriores permite devolver una única variable.

Veamos un ejemplo en el que se le pasan dos parámetros por valor (parámetros de entrada) y dospor referencia (parámetros de salida).

Llamada a la función desde la función principal

Se crean y se asignan valores a los parámetrosactuales. En este ejemplo los parámetros porvalor se pasan con valores constantes, aunque noes obligatorio, y los parámetros por referencia sepasan como variables, esto sí es obligatorio.

int main() { int cociente ; int resto ; dividir(21, 3, cociente, resto) ;

Ejecución de la funciónSe crean los parámetros formales y se copia elvalor del parámetro actual en el parámetroformal (para dividendo y divisor). Se establecela referencia entre los parámetros formales y losactuales en los parámetros por referencia (paracoc y resto), también se modifica el valor de losparámetros actuales.

void dividir(int dividendo, int divisor, int& coc,int& resto) { coc = dividendo / divisor ; resto = dividendo % divisor ; }

Fin de la ejecución de la función y vuelta al programa principal Se destruyen los parámetros formales definidos

por valor y se elimina la referencia entre losparámetros actuales y los formales en losdefinidos por referencia. Comprobamos que losparámetros actuales han cambiado de valordurante la ejecución de la función.

cout << cociente << resto; /*ahora cociente vale 7 y resto vale 0*/return 0;}

Realiza los ejercicios 14, 15, 16 que encontrarás al final del tema.

Page 10: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

Ficheros:

Cuando ejecutamos un programa, sus datos se mantienen en memoria principal, que como yasabemos es una memoria volátil, de forma que cuando termina la ejecución de un programa losdatos con los que hayamos estado trabajando se pierden. En las mayoría de nuestros programas serámuy importante no perder la información que manejamos y así poderla recuperar para posterioresejecuciones. Para evitar esta pérdida de información podemos utilizar ficheros. Los ficheros nospermite volcar la información generada por un programa en memoria secundaria y así tenerlasiempre disponible.

Los ficheros se pueden clasificar siguiendo diferentes criterios, en este tema vamos a distinguir dostipos de ficheros atendiendo al formato en el que almacena la información, los ficheros de texto ylos ficheros binarios. En los ficheros de texto la información se almacena como una secuencia decaracteres siguiendo una codificación estándar de forma que cualquier programa podrá leer esainformación aunque no corresponda con el mismo que creó el fichero, por ejemplo podrían sereditados con un editor de textos planos como gedit. En los ficheros binarios sin embargo lainformación se almacena utilizando el mismo formato empleado para ser almacenados en memoriaprincipal, y ningún programa que no conozca como ha sido codificada la información podrá accedera la misma. Este tipo de ficheros son empleados cuando no queremos que la información quealmacenan sea visible por otros programas distintos al que la generó.

A la hora de utilizar ficheros en nuestros programas debemos realizar cuatro operaciones básicas:1. Declarar la variable que va a manejar el fichero (ofstream);2. Abrir el fichero (.open());3. Realizar operaciones de lectura o escritura sobre el fichero ( con los operadores << o >>)4. Cerrar el fichero (.close());

Además será necesario ir comprobando a cada paso que estas operaciones se han realizadocorrectamente, controlando en todo momento los posibles errores que se hayan podido producir.Para manejar fichero deberemos incluir la biblioteca <fstream>.

Escritura en un fichero de texto: La escritura en un fichero de texto se realiza con el operador << ,de igual forma que cuando escribimos por pantalla con cout, pero los datos se vuelcan a unofstream (output file stream, o flujo de salida) asociado a una variable que será utilizada comomanejador del fichero. Antes de escribir en el flujo de salida deberemos vincular la variable con elfichero (abrir el fichero ) y eliminar esta vinculación al terminar (cerrar el fichero). Veamos unejemplo:

// Escritura en un fichero de texto#include <iostream>#include <fstream>using namespace std;

int main(){ ofstream manejafichero; manejafichero.open(“nombresusuarios.txt”) //vinculamos la variable manejador con el fichero //comprobamos apertura, si es errónea enviamos un aviso al usuario if (manejafichero.fail()) cout << “Error al abrir el fichero” << endl; else{ // si es correcta procesamos el fichero

Page 11: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

manejafichero << “Usuario1: Antonio” << endl; // escribimos una líneamanejafichero << “Usuario2: Francisco” << endl; // escribimos otra línea

}manejafichero.close(); //cerramos el fichero y rompemos la asociación

return 0;}

Realiza el ejercicio 17 que encontrarás al final del tema.

Lectura en un fichero de texto (palabras): Para leer un fichero utilizamos el operador >> de igualforma que cuando vamos a leer desde el teclado con la función cin, pero en este caso los datos seleen desde un ifstream (input file stream, o flujo de entrada) asociado a una variable que seráutilizada como manejador del fichero. Antes de leer del flujo de entrada deberemos vincular lavariable con el fichero (abrir el fichero ) y eliminar esta vinculación al terminar (cerrar el fichero),de igual modo que explicamos para el proceso de escritura. Al igual que con la función cin solo selee caracteres hasta que encuentra un carácter espacio. Veamos un ejemplo:

// Lectura en un fichero de texto#include <iostream>#include <fstream>using namespace std;

int main(){ ifstream manejafichero; string usuario;

manejafichero.open(“nombresusuarios.txt”) //vinculamos la variable manejador con el fichero //comprobamos apertura, si es errónea enviamos un aviso al usuario if (manejafichero.fail()) cout << “Error al abrir el fichero” << endl; else{ // si es correcta procesamos el fichero

manejafichero >> usuario; // leemos la primera palabra del ficherocout << “El nombre del primer usuario almacenado es: “ << usuario;

}manejafichero.close(); //cerramos el fichero y rompemos la asociación

return 0;}

Realiza el ejercicio 18 que encontrarás al final del tema.

Page 12: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

Lectura en un fichero de texto (línea):Para leer una línea completa de un fichero de textoincluyendo los espacios utilizamos la función getline(fichero,cadena); donde fichero será unavariable manejador asociada a un fichero y cadena será una variable de tipo string.

// Lectura en un fichero de texto de una línea completa#include <iostream>#include <fstream>using namespace std;int main(){ ifstream manejafichero; string linea;

manejafichero.open(“nombresusuarios.txt”); //vinculamos la variable manejador con el fichero //comprobamos apertura, si es errónea enviamos un aviso al usuario if (manejafichero.fail()) cout << “Error al abrir el fichero” << endl; else{ // si es correcta procesamos el fichero

getline(manejafichero,linea); // leemos la primera línea del ficherocout << “La primera línea es: “ << linea;

}manejafichero.close(); //cerramos el fichero y rompemos la asociación

return 0;}

Realiza el ejercicio 19 que encontrarás al final del tema.

Lectura completa de un fichero de texto: Para leer un fichero completo utilizamos un bucle quevaya repitiendo la lectura de una línea hasta encontrar el final del fichero que viene indicada por laoperación .eof (end of file, final del fichero) que devuelve un valor verdadero cuando encuentra elfin del fichero. Veamos un ejemplo:

// Lectura en un fichero de texto de una línea completa#include <iostream>#include <fstream>using namespace std;int main(){ string linea; ifstream fichero; fichero.open(“usuarios.txt”); if (fichero.fail()) cout << “Error al abrir el fichero” << endl; else{ // si es correcta procesamos el fichero while(! fichero.eof()) { getline(fichero,linea); //leemos la línea entera if (! fichero.eof()) cout << linea << endl;

Page 13: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

} //fin del while } //fin del else fichero.close(); //cerramos el fichero y rompemos la asociación

return 0;

Realiza el ejercicio 20 que encontrarás al final del tema.

Cómo pedir el nombre del fichero al usuario:No es necesario que el nombre del fichero estéprefijado en el programa, podemos pedir al usuario que introduzca el nombre del fichero yalmacenarlo en una variable string, para poder pasar esta variable de tipo string como nombre delfichero deberemos convertirla al tipo carácter (char) utilizando la función c_str().

// Fichero con nombre introducido por el usuario#include <iostream>#include <fstream>using namespace std;int main(){ string nombrefichero; ifstream fichero; cout << “Introduce el nombre del fichero:”; cin >> nombrefichero;

fichero.open(nombrefichero.c_str());

. . . return 0;}

Realiza el ejercicio 21 que encontrarás al final del tema.

Registros:

Un registro es una agrupación de tipos de datos simples bajo un nombre común.

Definición de un registro: Para definir registros utilizaremos un nuevo tipo de dato registro que seespecifica con la palabra reservada struct, a continuación se enumeran, entre llaves, cada uno de lostipos de datos simples o compuestos que lo componen, especificando su tipo y el identificador conel que referenciarlo, seguido de ; al final de cada campo simple y la llave de cierre. Veamos unejemplo:

Page 14: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

struct tipocliente // definimos el registro { string nombre; int edad; } ;

tipocliente cliente; //declaramos una variable del tipo registro

Acceso a los datos individuales de un registro: Para acceder a los datos individuales del registroutilizamos la siguiente sintáxis registro.campo. Veamos un ejemplo:

cliente.nombre =”Hector”;cliente.edad=8;

Realiza el ejercicio 22 que encontrarás al final del tema.

Arrays de registros: Es posible combinar el uso de los registro con el uso de los arrays o vectores.Por ejemplo podremos guardar los datos de varios usuarios, incluyendo su nombre y su edad,definiendo un vector de registros para los usuarios. Veamos un ejemplo:

// Arrays de registros

#include <iostream>#include <fstream>using namespace std;

int main(){ struct tipousuario { string nombre; int edad; };

tipousuario usuario[50]; int i; for(i=0;i<50;i++) { cout << “Introduce el nombre del usuario:”; cin >> usuario[i].nombre; cout << “Introduce la edad del usuario:”; cin >> usuario[i].edad; }

return 0;}

Realiza el ejercicio 23 que encontrarás al final del tema.

Page 15: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

Programación Orientada a Objetos (POO)Clases y Objetos: En el apartado anterior hemos estudiado los registros, que nos permiten introducirdatos de distintos tipos asociados a un mismo nombre, consiguiendo así definir una entidad máscompleja con la que trabajar, lo que se asemeja a nuestra forma de proceder en el mundo real. Perocon los registros solo podemos definir sus características y no podremos incluir las acciones quedicha entidad puede realizar. En programación una clase se entiende como un registro struct al que se le añaden todas lasacciones que puede realizar en forma de funciones. Las clases se declaran con la orden class paradetallar todas estas características. Un objeto es una instancia concreta de una clase, es decir,primero declaramos la clase en la que definimos su estructura y posteriormente declaramos objetoscorrespondientes a la clase que hemos definido con anterioridad. Los atributos de un objeto sontodos los datos que declaramos para definirlo y los métodos de un objeto son las funciones quedefinimos para describir aquellas operaciones que puede realizar. Veamos un ejemplo:

// Clases y objetos#include <iostream>using namespace std;

class Claseusuario //definimos la clase Claseusuario{ public: string nombre; //definimos el atributo nombre

void Almacenar() // definimos el método Almacenar { cout << “Introduce el usuario:”; cin >> nombre; } void Imprimir() //definimos el método Imprimir { cout << “El nombre del usuario introducido es:” << nombre; }};

int main(){ Claseusuario usuario; //Declaramos el objeto usuario perteneciente a la clase Claseusuario usuario.Almacenar(); //Invocamos el método Almacenar del objeto usuario usuario.Imprimir(); //Invocamos el método Imprimir del objeto usuario return 0;}

Page 16: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

Zona privada y zona pública en la definición de una clase: Podemos distinguir dos ámbitos devisibilidad (accesibilidad) en la definición de una clase, la zona pública y privada. Los atributos ymétodos definidos en la parte pública serán accesibles tanto desde dentro como desde fuera de lapropia clase, sin embargo los definidos en la parte privada solo serán accesibles desde el ámbitointerno de la clase, es decir, no podrán ser referenciados fuera de ella. Por defecto la zona privadade una clase comienza desde el comienzo de la definición de la clase hasta la etiqueta public: y laparte pública desde esta etiqueta hasta el final o hasta que se encuentre otra etiqueta private:.Veamos un ejemplo:

// Clases y objetos#include <iostream>using namespace std;

class Claseusuario //definimos la clase Claseusuario{ public: string nombre; //definimos el atributo nombre

void Almacenar() // definimos el método Almacenar { cout << “Introduce el usuario:”; cin >> nombre; } void Imprimir() //definimos el método Imprimir { cout << “El nombre del usuario introducido es:” << endl << nombre <<endl; subraya(); } private: void subraya() { int i;

for(i=0;i<nombre.length();i++) cout << “-”; cout << endl; }};

int main(){ Claseusuario usuario; //Declaramos el objeto usuario perteneciente a la clase Claseusuario usuario.Almacenar(); //Invocamos el método Almacenar del objeto usuario usuario.Imprimir(); //Invocamos el método Imprimir del objeto usuario return 0;}

Page 17: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

Como podemos ver el método subraya, solo puede ser referenciada dentro de la definición de laclase a diferencia del resto de métodos y atributos definidos en la parte pública de la clase.

Herencia: La herencia es el mecanismo para facilitar la reutilización de código haciendo mássencillo la creación de un programa. Un objeto puede heredar atributos y propiedades de otros deforma que solo sería necesario programar las novedades en su comportamiento. Para que entendermejor el concepto de herencia podemos decir que permite establecer relaciones del tipo “es un”entre clases y estableciendo jerarquías entre ellas, tal y como se muestra en el siguiente ejemplo.

La sintaxis general para indicar que una clase hereda atributos y métodos de otra clase es lasiguiente:

class Nombre_clase: public Clase_padre

Es posible definir en una clase métodos y atributos que solo pueden ser utilizados por la claseprincipal y sus clases heredadas, esto se realiza utilizando la palabra reservada protected. Veamosun ejemplo de herencia:

#include <iostream> #include <string>

using namespace std;

class Alumno /*clase principal alumno tiene todos los atributos y los métodos principales */ { protected: string nombre, apellidos, optativa1, optativa2, optativa3; int edad;

void Grabar() /*pide los datos del alumno al usuario */ { cout << "Introduce los datos del alumno:" << endl; cout << "Nombre: "; cin >> ws ; // elimina los espacios en blanco y fin de línea getline(cin, nombre); cout << "Apellidos: "; cin >> ws ; // elimina los espacios en blanco y fin de línea getline(cin, apellidos);

Page 18: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

cout << "Edad: "; cin >> ws ; // elimina los espacios en blanco y fin de línea cin >> edad; }

void Comprobar() /*muestra los datos almacenados por pantalla */ { cout << "Se va a proceder a grabar los datos del siguiente alumno " << endl; cout << "Nombre: " << nombre <<" " << apellidos << endl << "Edad:" << edad << endl; cout << "Optativas:" << optativa1 << ";" << optativa2 << ";" << optativa3 << endl; } };

class Alumno_Ciencias : public Alumno /*clase secundaria o subclase que hereda atributos ymétodos de la clase principal Alumno */ { public: void Asigna() /*función que asigna las optativas de ciencias */ { Grabar(); optativa1="Matemáticas"; optativa2="Física y Química"; optativa3="Dibujo Técnico"; Comprobar(); } }; class Alumno_Letras : public Alumno {

public: void Asigna() /*función que asigna las optativas de letras */ { Grabar(); optativa1="Latín"; optativa2="Griego"; optativa3="Literatura Universal"; Comprobar(); } };

int main() { char opcion;

Alumno_Ciencias valumno_ciencias; /*definimos las variables de las clases arriba definidas */ Alumno_Letras valumno_letras; do /*bucle que va a ir pidiendo alumnos hasta que el usuario introduzca la letra N*/ { cout << "¿Desea grabar los datos de un alumno de Ciencias/Letras (C/L) N para salir?";

Page 19: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

cin >> opcion; switch (opcion) /*selector que asigna optativas en función de la opción introducida por elusuario */ { case 'C': valumno_ciencias.Asigna(); break; case 'c': valumno_ciencias.Asigna(); break; case 'L': valumno_letras.Asigna(); break; case 'l': valumno_letras.Asigna(); break; case 'n': cout << endl; break; case 'N': cout << endl; break; default: cout << "Opción errónea"; }; } while(opcion!='N' && opcion!='n'); return 0; }

Realiza el ejercicio 24 que encontrarás al final del tema.

Ejercicios del Tema 1. Escribe el código de un programa que muestre por pantalla el siguiente menú:

1.- Tabla de multiplicar de un número2.- Factorial de un número3.- Salir

2. Escribe el código de un programa que pida por pantalla una matriz de 3x4 y la muestre conformato (filas y columnas) por pantalla.

3. Escribe el código de un programa que realice las cuatro operaciones básicas con dosnúmeros, suma, resta, multiplicación y división. Utiliza funciones para codificar lasoperaciones. Utilizad las siguientes declaraciones para definir las funciones: a) int suma(int, int) b) int resta(int, int) c) int multiplica(int, int) d) float divide(int, int)

Page 20: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

4. Realiza un programa que incluya dos funciones llamadas pedir y triple. a) La función pedir, debe pedir un número por pantalla y devolverlo a la función principal.

(esta función no tendrá parámetros) b) La función triple recibirá como parámetro el valor devuelto por la función pedir y

retornará el triple del valor que le hemos pasado como parámetro.

5. Realiza una programa que indique si un número es par o impar utiliza las siguientesfunciones: a) int pedir(void); esta función pide al usuario el número. b) Int par(int); esta función recibe como parámetro el número introducido en pedir y

devuelve un 1 si el número es par y un 0 en caso contrario.

6. Realiza un programa que pida los tres coeficientes de las ecuaciones de segundo grado (a, b,c) y resuelva la ecuación utilizando el método más adecuado atendiendo al valor de loscoeficientes. Utiliza las siguientes funciones: a) float bvale0(int, int); esta función devuelve la solución de la ecuación y recibe como

parámetros los valores de a y c. b) float cvale0(int, int); esta función devuelve la solución de la ecuación y recibe como

parámetros los valores de a y b c) void completa(int, int, int); esta función no devuelve ningún valor, recibe como

parámetros los valores de los tres coeficientes de una ecuación de segundo grado ymuestra las soluciones por pantalla.

7. Escribe el código de un programa que muestre un menú con las siguientes operaciones: a) Cálculo del área de un cuadrado b) Cálculo del área de un triángulo c) Cálculo del sumatorio de un número d) Cálculo del factorial de un número

• Todas las operaciones se realizarán con funciones a las que les pasaremos comoparámetros los valores necesarios para realizar los cálculos y devolverán el resultadoo un error en caso que el valor no se pueda calcula. Todas las comprobaciones (ladosmenores que cero, factorial de cero, … se realizarán en las funciones).

8. Escribe el código de un programa que almacene tu nombre completo, con espacios eimprima por pantalla el nombre introducido y su longitud.

9. Escribe el código de un programa que pida una cadena, con espacios en blanco, y lamuestre por pantalla escrita al revés.

10. Escribe el código de un programa que solicite al usuario su nombre y sus dosapellidos y muestre por pantalla un usuario de correo formado por: las tres primeras letrasdel nombre, las tres primeras letras del primer apellido, las tres primeras letras del segundoapellido, y la constante de cadena “@informatica.com”.

11.Escribe el código de un programa que pida el nombre, el primer apellido y el segundoapellido y los guarde en tres cadenas independientes. Debe unir en una sola cadena elnombre completo separado con espacios, pero seleccionando solo los 10 primeros caracteresde cada cadena. Muestra el nombre completo por pantalla.

12. Escribe el código de un programa que pida dos cadenas de caracteres y nosindique si son iguales o son distintas.

13. Escribe el código de un programa que pida por pantalla 5 cadenas las muestre

Page 21: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

por pantalla ordenadas alfabéticamente. Utiliza una matriz para almacenar las 5 cadenas y elmétodo burbuja para ordenar las cadenas.

14. Escribe el código de un programa que realice las cuatro operaciones básicas condos números, suma, resta, multiplicación y división. Utiliza funciones para codificar lasoperaciones. Utilizad las siguientes declaraciones para definir las funciones: a) int suma(int, int) b) int resta(int, int) c) int multiplica(int, int) d) void divide(int, int, int &, int &)

15. Realiza un programa que pida los tres coeficientes de las ecuaciones de segundogrado (a, b, c) y resuelva la ecuación utilizando el método más adecuado atendiendo al valorde los coeficientes. Utiliza las siguientes funciones: a) float bvale0(int, int); esta función devuelve la solución de la ecuación y recibe como

parámetros los valores de a y c definidos por valor. b) float cvale0(int, int); esta función devuelve la solución de la ecuación y recibe como

parámetros los valores de a y b definidos por valor. c) void completa(int, int, int, float &, float &); esta función devuelve las dos soluciones

para la ecuación con parámetros definidos por referencia y recibe como parámetros losvalores para a, b, c definidos como parámetros por valor.

16. Escribe el código de un programa que muestre un menú con las siguientesoperaciones: a) Ordena de mayor a menor. b) Ordena de menor a mayor. c) Se pedirá al usuario 3 variables que se pasarán por referencia a las funciones

ordenmayor y ordenmenor. Estas funciones ordenarán las variables según se indica. d) Como ampliación intenta modificar el ejercicio para hacerlo con 10 variables utilizando

vectores y el método de ordenación burbuja.

17. Escribe el código de un programa que pida al usuario nombres de cliente y losalmacene en el fichero clientes.txt. El programa dejará de pedir nombres cuando el usuariointroduzca una cadena vacía.

18. Escribe el código de un programa que muestre por pantalla en líneas distintas losnombres de los clientes almacenados en el fichero clientes.txt.

19. Escribe el código de un programa que pida al usuario introducir las definicionesde hardware y software y las almacene en el fichero definiciones.txt. Después debe mostrarla primera línea por pantalla.

20. Escribe el código de un programa que lea el fichero del ejercicio anterior desdeel principio hasta el final y lo muestre por pantalla.

21. Escribe el código de un programa que realice las siguientes acciones: a) Solicite el nombre de un fichero por pantalla al usuario b) Cree el fichero de texto con el nombre que ha introducido el usuario c) Pida al usuario un texto para almacenar en el fichero d) Escriba en el fichero el texto que el usuario ha introducido por pantalla e) Lea el fichero completo y lo muestre por pantalla.

Page 22: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

22. Escribe el código de un programa que solicite los siguientes datos que seránalmacenados en un registro y los muestre por pantalla: a) Nombre b) Apellidos c) Edad d) Usuario e) Contraseña

23. Crea un programa que rellene los valores de un registro como los del ejercicioanterior en una función a la que pasaremos el registro por referencia y después muestre elregistro en otra función a la que le pasaremos el registro por valor. a) Como ampliación intenta modificar el ejercicio para hacerlo con 10 registros utilizando

un vector de registros que pasaremos como parámetro a las funciones.

24. Crea un programa que defina la clase personaje con las siguientes propiedades: a) nombre: cadena de 30. b) sexo: carácter (M, F) c) edad: entero entre 1 y 100

y los siguientes métodos: d) dormir: mostrará el texto “zzz” por pantalla e) hablar: mostrará el texto “bla, bla, bla” por pantalla f) adquirir_datos: pedirá su nombre, su edad y su sexo. g) mostrar_datos: mostrará su nombre, su edad y su sexo por pantalla.

25. Completa el ejemplo de la clase Alumno_Letras, Alumno_Ciencias para que segraben los datos en el fichero alumnos.txt. Define el manejador del fichero y realiza todaslas operaciones del fichero desde la función main.

26. Añade al ejercicio anterior una función que lea el fichero línea a línea, pidiendoconfirmación en cada una de ellas (¿Quiere continuar (s/n)?) y separa los datos utilizando elcarácter delimitador que hemos incluido en dicho ejercicio.

27. Crea un programa que realice las siguientes acciones: a) Define una clase clasecadena con los siguientes métodos y atributos:

• string unir(string,string), public; (concatena las dos cadenas que le pasamos comoparámetros con un espacio en blanco en medio y retorna la cadena unida);

• int compara(string, string), public; (retorna un 1 si la primera cadena es mayor que lasegunda, un 2 si la segunda es mayor que la primera y un cero si son iguales);

• string reves(string), public; (retorna la cadena que le hemos pasado como parámetroescrita al revés);

b) En el programa principal realiza las siguientes acciones:• declara un objeto de la clase clasecadena• declara dos cadenas de caracteres• pide al usuario que las introduzca por pantalla• llama a los métodos del objeto clasecadena pasándoles como parámetros las cadenas

de caracteres que has declarado en la función principal.

Page 23: Programación Avanzada en C++ Conceptos avanzados de ... › 2019 › 09 › 2t2_programacion… · Programación Avanzada en C++ Introducción Este manual ha sido diseñado como

Programación Mª Dolores Molina

Bibliografía

Curso de Informática. 2004. Pedro Reina. Web: www.pedroreina.net/curso

Fundamentos de programación con el lenguaje de programación C++. Vicente Benjumea y ManuelRoldán. Dpto Lenguajes y Ciencias de la Computación. Universidad de Málaga