tema 1. programación modular - uji.esbadenas/ig17-2010-11/archivos/tema1/tema_1.pdf · introducir...
TRANSCRIPT
Tema 1.Programación modular
Programación AvanzadaIngeniería Técnica en
Informática de GestiónJorge Badenas
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 2
1.1. Objetivos
Repasar brevemente mediante ejemplos los elementos principales del lenguaje C.
Introducir algunos elementos de C++ que no están directamente relacionados con la programación orientada a objetos, pero que mejoran la programación:
Nueva E/S.
Nuevos operadores para manejo de memoria.
Paso de parámetros por referencia.
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 3
1.2. Un primer programa en C++ (E/S en C++)#include <stdio.h>
int main ( ){
int i;int edades [10];float media;
for( i=0; i<10; i++){
printf(“Edad persona numero %d:”, i);scanf(“%d”, &edades[i]);
}printf(“\n”);media = 0.0;for( i=0; i<10; i++)
media += edades[i];media /= 10.0;printf(“La edad media son %f años”, media);return 0;
}
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 4
1.3. Espacio de utilización de las variables
Una variable puede usarse desde el punto donde se declara hasta el final del bloque donde fue declarada.
float mediaCuadrados( float v[ ], int tam){
float acumulado;acumulado = 0.0;for( int i=0; i<tam; ++i){
float cuadrado = v[i] * v[i];acumulado += cuadrado;
}float media = acumulado / tam;return media;
}
acumulado
i
cuadrado
media
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 5
1.4. Nuevos tipos de datos
C++ tiene 7 tipos de datos básicos:voidintcharfloatdoubleboolwchar
Siguen existiendo los modificadores de tipo:
shortlongsignedunsigned
Ya existían en C
Nuevos en C++
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 6
1.5. El tipo bool
#include <iostream>using namespace std;
int main(){
bool iguales = false;int i1, i2;…iguales = i1 == i2;if( iguales )
cout << “Los dos son iguales”<< endl;
return 0;}
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 7
1.6. Paso de parámetros por referencia al estilo de C
En C si quiero que una función pueda modificar el contenido de una variable he de pasar su dirección.
// fragmento de una funciónint x = 5;int y = 6;intercambiarValores( &x, &y );cout<<“Valores actuales: “<<x<<“,”<<y<<endl;…} // Final de la función
void intercambiarValores( int *dx, int *dy){
int aux = *dx;*dx = *dy;*dy = aux;
}
dx es la dirección de x, por lo tanto
estamos asignando x
dy es la dirección de y, por lo tanto
estamos modificando y
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 8
// fragmento de una funciónint x = 5;int y = 6;intercambiarValores( x, y);cout<<“Valores actuales: “<<x<<“,”<<y<<endl;…} // Final de la función
void intercambiarValores( int &rx, int &ry){
int aux = rx;rx = ry;ry = aux;
}
1.7. ReferenciasReferencia: nombre alternativo para una variable.
Utilidad de las referencias: paso de parámetros por referencia.
int i = 1;int &x = i; // x es referencia a ix = 5;cout << i; // Se muestra un 5
ry es un nombre alternativo de y, por lo
tanto estamos modificando y
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 9
1.8. Funciones inlineLas funciones aportan muchas ventajas:
Reutilización de códigoMejor estructuración Programas más simples de diseñar y comprender
Sólo cuando una función se ejecuta un gran número de veces, su pequeño coste temporal puede significar un inconveniente.Funciones inline: cuando el compilador transforma el programa en código ejecutable se substituyen las llamadas a funciones inline por su código.
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 10
1.9. Sobrecarga de funcionesSobrecargar una función: definir varias funciones con el mismo nombre, pero con distintos parámetros.¿Para qué? Para que funciones conceptualmente similares compartan el mismo nombre.
struct MatrizCuadrada{
int tam;float matriz [100][100];
};
void construirMatriz( MatrizCuadrada &m ){
m.tam = 0;}
// Sigue en la siguiente transparencia
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 11
1.9 Sobrecarga de funciones (continuación)
// Viene de la trasparencia anterior
void construirMatriz( MatrizCuadrada&m, int t){
m.tam = t;for( int i=0; i<t; ++i)
for( int j=0; j<t; ++j)m.matriz[i][j] = 0.0;
}
void construirMatriz( MatrizCuadrada &m, MatrizCuadrada &o)
{m.tam = o.tam;for( int i=0; i<m.tam; ++i )
for( int j=0; j<m.tam; ++j)m.matriz[i][j] = o.matriz[i][j];
}
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 12
1.9 Sobrecarga de funciones (continuación)
En las tres funciones el concepto es el mismo “construir (inicializar) una matriz a patir de los parámetros que se pasen”.¿Cómo distingue el compilador a qué versión de la función construirMatrizconstruirMatriz se está llamando?:
Según los parámetros que se pasen en la llamada a la función.
MatrizCuadrada m1, m2, m3;
construirMatriz( m1 ); // Primera funciónconstruirMatriz( m2, 15); // Segunda funciónconstruirMatriz( m3, m2); // Tercera función
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 13
1.10. Parámetros con valor por defecto
Posibles llamadas:
void diagonalizarMatriz( MatrizCuadrada &m,float d = 1.0)
{for( int i=0; i<m.tam; ++i)
for( int j=0; j<m.tam; ++j)if( i==j)
m.matriz[i][j] = d;else
m.matriz[i][j] = 0.0;}
MatrizCuadrada m1, m2;
diagonalizarMatriz( m1, 5.0 ); // d = 5.0diagonalizarMatriz( m2); // d = 1.0
Regla:Si el parámetro k tiene valor por defecto, también el k+1
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 14
1.11. Memoria dinámica
new reserva de memoria substituye a malloc.delete liberación de memoria substituye a free.Sintaxis:
Reservar un elemento:int *pi;pi = new int;Liberar un elementodelete pi;Reservar un vector de elementos (vector dinámico).int *pi = new int [5];Liberar un vector dinámico.delete [] pi;
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 15
1.12. stringstring: clase cuyos objetos adaptan su tamaño a la longitud de las cadenas que contienen.Clase:
Contiene datos no accesibles Ocultación de la información.Contiene funciones (métodos) para manejar los datos Interface.
Frente a las cadenas de caracteres de C presentan varias ventajas:
No necesito decidir el tamaño de antemano.Se pueden emplear operadores para hacer ciertas operaciones:
= asignación + concatenación<, >, == comparación
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 16
1.12. string (continuación)#include <string>using namespace std;
int main( ){
string s1 = “HOLA”; // Se inicializa con un char*string s2 = s1; // Se inicializa con un stringstring s3; // Longitud 0
s2 = “Y ADIOS”; // Asignación con un char*s3 = s1 + s2; // Concatenación
cout <<“El string contiene:”<<s3; // E/S cin >> s2;
if( s2 == s1) cout <<“s1 y s2 son iguales”;if( s2 < s1 ) cout << “s2 menor que s1”;
for( int i=0; i<s2.size(); ++i) // size = longitudif( s2[i] == ‘A’)
s2[i] = ‘a’; // Acceso como un vector
return 0;}
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 17
1.12. string (continuación)Otras operaciones sobre string:
Vaciar un string: string s;s.clear();Obtener un char* a partir de un stringchar cadena[10];string s = “123456”;strcpy( cadena, s.c_str());Longitud
Se puede obtener la longitud tanto con s.length() como con s.size().
Encontrar una subcadena:string s = “23456”;if( s.find( “345” ) != string::npos )
cout << “Subcadena encontrada”;Para leer strings con blancos:string str;getline( cin, str );
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 18
1.13. vectorvector: clase que almacena elementos de manera secuencial y cuyo tamaño se adapta dinámicamente.Operaciones sobre vector:
Declaración:#include <vector>vector<int> vi;vector<long> vl( 5 ); // Vector de 5 longsTamañovi.resize( 10, 0); // 10 elementos con valor 0int tam = vi.size(); // Saber el tamañoInsertar al final (aumenta el tamaño del vector)vi.push_back( 6 ); Eliminar el últimovi.pop_back();
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 19
1.13. vectorVaciar un vectorvi.clear() Acceder a un elementoint t = vi[6];vi[6] = 5;
Iteradores:Se comportan como punteros.
vector<int> vi( 10 );vector<int>::iterator it; for( it = vi.begin(); it != vi.end(); it++ )
cin >> *it ;vi.begin() es un iterador al primer elemento de vi.vi.end() es un iterador que apunta detrás del último elemento. NO AL ÚLTIMO.Si el objeto es constante hay que utilizar const_iterator.
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 20
1.13. vectorInserción y borrado con iteradores
insertvi.insert ( vi.begin() + 3, 2, 0 )erasevi.erase( vi.begin()+3 );
El primer elemento:vi.front( ); // Lo mismo que *vi.begin()
El último elemento:vi.back(); // Lo mismo que *(vi.end()-1)
Programación Avanzada - Ingeniería Técnica en Informática de Gestión 21
1.14. list
list: clase que permite almacenar elementos mediante una lista doblemente enlazada.Operaciones sobre list:
Declaración:#include <list>using namespace std;
list<double> ld;Son válidas todas las funciones que hemos visto para vector, excepto el operador corchetes.Dispone de las funciones
pop_front;push_front;