tema 1. programación modular - uji.esbadenas/ig17-2010-11/archivos/tema1/tema_1.pdf · introducir...

21
Tema 1. Programación modular Programación Avanzada Ingeniería Técnica en Informática de Gestión Jorge Badenas

Upload: hoangdat

Post on 04-Oct-2018

218 views

Category:

Documents


0 download

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;