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
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
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
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

Pract met de la program templa

  • 1.
    Universidad Nacional delAltiplano 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 delAltiplano 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 delAltiplano 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 delAltiplano 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