1. Universidad Nacional del Altiplano Escuela Profesional de Ingeniería de Sistemas
Práctica de Metodología de la Programación
Apellidos y nombres:…………………………………………………………………… Cód.Matric:………..
Fecha: ……………………….
I.- Marcar los que son verdaderos con V, y los que son falsos con F.
1.- Seleccionar la forma correcta de definición de cabecera de un template de función:
a) template (int) (*foo) (char *m[]).
b) template class foo(char *m[]).
c) template<typename T> int foo(char *m[]).
d) template<typename T, T2> T foo(T2 *m[]).
e) template<class X> void *foo(X *m[]).
2.-
a) los templates de función no pueden ser sobrecargados.
b) Cuando un template de función es sobrecargado, el compilador primero intenta emparejar con la versión
no-template de la función.
3.-
a) Una plantilla (template) de clase no necesita la palabra clave template.
b) los templates de clases representan las clases genéricas.
c) los templates de clases son tipos parametrizados.
4.-
a) Los templates de clases pueden tener parámetros sin tipo.
b) Los templates de clases que tienen parámetros sin tipo con diferentes valores son considerados como
tipos de datos diferentes.
II.- Ejemplo de template de función (a)
#include <iostream>
using namespace std;
template<class Type>
Type Min(Type arg1, Type arg2)
{
Type min;
if (arg1 < arg2)
min = arg1;
else
min = arg2;
return min;
}
int main()
{
cout << Min(15, 25) << endl;
cout << Min(254.78, 12.983) << endl;
cout << Min('A', 'Z') << endl;
return 0;
}
En el ejercicio anterior sobrecargar la función Min para comparar cadenas, por
ejemplo cout<<Min(“MANZANA” , “NARANJA”);
Ejemplo de template de función (b)
#include <iostream>
using std::cout;
using std::endl;
// funcion template printArray
//template< typename T >
template< class T >
void printArray( const T *array, int count )
{
for ( int i = 0; i < count; i++ )
cout << array[ i ] << " ";
Ingº William E. Arcaya C.
Docente Asociado TC
2. Universidad Nacional del Altiplano Escuela Profesional de Ingeniería de Sistemas
cout << endl;
}
int main()
{
const int ACOUNT = 5;
const int BCOUNT = 7;
const int CCOUNT = 6;
int a[ ACOUNT ] = { 1, 2, 3, 4, 5 };
double b[ BCOUNT ] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
char c[ CCOUNT ] = "HELLO"; // 6ta posicion para null
cout << "Array a Contiene:" << endl;
//invoca función template para enteros
printArray( a, ACOUNT );
cout << "Array b Contiene:" << endl;
// invoca función template para doubles
printArray( b, BCOUNT );
cout << "Array c Contiene:" << endl;
// invoca función template para caracteres
printArray( c, CCOUNT );
return 0;
}
III.- Ejemplo de template de clase
#include <iostream>
using std::cout;
using std::endl;
template<class Type>
class CCompare
{
protected:
Type arg1;
Type arg2;
public:
CCompare(Type arg1, Type arg2)
{
CCompare::arg1 = arg1;
CCompare::arg2 = arg2;
}
~CCompare() {}
Type GetMin()
{
Type min;
if (arg1 < arg2)
min = arg1;
else
min = arg2;
return min;
}
Type GetMax()
{
Type max;
if (arg1 > arg2)
max = arg1;
else
max = arg2;
Ingº William E. Arcaya C.
Docente Asociado TC
3. Universidad Nacional del Altiplano Escuela Profesional de Ingeniería de Sistemas
return max;
}
int Igual()
{
int Igual;
if (arg1 == arg2)
Igual = 1;
else
Igual = 0;
return Igual;
}
};
int main()
{
CCompare<int> compare1(15, 25);
CCompare<double> compare2(254.78, 12.983);
CCompare<char> compare3('A', 'Z');
cout << "EL OBJETO COMPARE1" << endl;
cout << "Menor: " << compare1.GetMin() << endl;
cout << "Mayor: " << compare1.GetMax() << endl;
cout << "Igual: " << compare1.Igual() << endl;
cout << endl;
cout << "EL OBJETO COMPARE2" << endl;
cout << "Menor: " << compare2.GetMin() << endl;
cout << "Mayor: " << compare2.GetMax() << endl;
cout << "Igual: " << compare2.Igual() << endl;
cout << endl;
cout << "EL OBJETO COMPARE3" << endl;
cout << "Menor: " << compare3.GetMin() << endl;
cout << "Mayor: " << compare3.GetMax() << endl;
cout << "Igual: " << compare3.Igual() << endl;
cout << endl;
return 0;
}
Ejemplo de template de clase(b)
//pila.h (esto va en Header Files) template< typename T >
template< typename T > Pila< T >::Pila( int s )
class Pila : size( s > 0 ? s : 10 ),
{ top( -1 ),
public: PilaPtr( new T[ size ] )
Pila( int = 10 ); {
~Pila() }
{
delete [] PilaPtr; template< typename T >
} bool Pila< T >::push( const T &pushValue )
bool push( const T& ); {
bool pop( T& ); if ( !isFull() )
bool isEmpty() const {
{ PilaPtr[ ++top ] = pushValue;
return top == -1; return true;
} }
return false;
bool isFull() const }
{ template< typename T >
return top == size - 1; bool Pila< T >::pop( T &popValue )
} {
if ( !isEmpty() )
private: {
int size; popValue = PilaPtr[ top-- ];
int top; return true;
T *PilaPtr; }
};
return false;
}
Ingº William E. Arcaya C.
Docente Asociado TC
4. Universidad Nacional del Altiplano Escuela Profesional de Ingeniería de Sistemas
//main.cpp (esto va en Source Files)
#include <iostream>
using std::cout;
using std::endl;
#include "Pila.h"
int main()
{
Pila< double > doublePila( 5 );
double doubleValue = 1.1;
cout << "Empilar elementos de tipo doublen";
while ( doublePila.push( doubleValue ) )
{
cout << doubleValue << ' ';
doubleValue += 1.1;
}
cout << "nPila llena. no puede empilar " << doubleValue
<< "nnDesapilar elmentos de pila con doublesn";
while ( doublePila.pop( doubleValue ) )
cout << doubleValue << ' ';
cout << "nPila vacia. no puede desapilarn";
Pila< int > intPila;
int intValue = 1;
cout << "nEmpilar elementos en Pila de enterosn";
while ( intPila.push( intValue ) )
{
cout << intValue << ' ';
intValue++;
}
cout << "nPila llena. no puede empilar " << intValue
<< "nndesapilar elementos de pila de enterosn";
while ( intPila.pop( intValue ) )
cout << intValue << ' ';
cout << "nPila vacia. no puede desapilar" << endl;
return 0;
}
V.- Implementar una función template para ordenar un array de enteros, float o doubles.
Ingº William E. Arcaya C.
Docente Asociado TC