Publicado el 4 de Marzo del 2020
597 visualizaciones desde el 4 de Marzo del 2020
66,7 KB
21 paginas
Creado hace 15a (26/09/2009)
Tema 1.
Programación
modular
Programación Avanzada
Ingeniería Técnica en
Informática de Gestión
Jorge Badenas
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
2
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
3
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)
{
acumulado
i
float cuadrado = v[i] * v[i];
acumulado += cuadrado;
}
float media = acumulado / tam;
return media;
cuadrado
media
}
Programación Avanzada - Ingeniería Técnica en Informática de Gestión
4
1.4. Nuevos tipos de datos
C++ tiene 7 tipos de datos básicos:
void
int
char
float
double
bool
wchar
Ya existían en C
Nuevos en C++
Siguen existiendo los modificadores
de tipo:
short
long
signed
unsigned
Programación Avanzada - Ingeniería Técnica en Informática de Gestión
5
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
6
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ón
int 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
7
1.7. Referencias
Referencia: nombre alternativo
para una variable.
int i = 1;
int &x = i; // x es referencia a i
x = 5;
cout << i; // Se muestra un 5
Utilidad de las referencias: paso de
parámetros por referencia.
// fragmento de una función
int 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;
}
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
8
1.8. Funciones inline
Las funciones aportan muchas
ventajas:
Reutilización de código
Mejor 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
9
1.9. Sobrecarga de funciones
Sobrecargar 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
10
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
11
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
construirMatriz se está llamando?:
construirMatriz
Según los parámetros que se pasen
en la llamada a la función.
MatrizCuadrada m1, m2, m3;
construirMatriz( m1 ); // Primera función
construirMatriz( m2, 15); // Segunda función
construirMatriz( m3, m2); // Tercera función
Programación Avanzada - Ingeniería Técnica en Informática de Gestión
12
1.10. Parámetros con valor
por defecto
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)
else
m.matriz[i][j] = d;
m.matriz[i][j] = 0.0;
}
Posibles llamadas:
MatrizCuadrada m1, m2;
diagonalizarMatriz( m1, 5.0 ); // d = 5.0
diagonalizarMatriz( 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
13
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 elemento
delete 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
14
1.12. string
string: 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 datosInterface.
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
15
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 string
string 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 = longitud
if( 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
16
1.12. string (continuación)
Otras operaciones sobre string:
Vaciar un string:
string s;
s.clear();
Obtener un char* a partir de un
string
char 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
17
1.13. vector
vector: 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 longs
Tamaño
vi.resize( 10, 0); // 10 elementos con valor 0
int tam = vi.size(); // Saber el tamaño
Insertar al final (aumenta el tamaño
del vector)
vi.push_back( 6 );
Eliminar el último
vi.pop_back();
Programación Avanzada - Ingeniería Técnica en Informática de Gestión
18
1.13. vector
Vaciar un vector
vi.clear()
Acceder a un elemento
int 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
19
1.13. vector
Inserción y borrado con iteradores
insert
vi.insert ( vi.begin() + 3, 2, 0 )
erase
vi.erase( vi.begin()+3 );
El primer elemento:
vi.front( ); // Lo mismo que *vi.begin()
El últi
Comentarios de: Tema 1. Programación modular (0)
No hay comentarios