Sie sind auf Seite 1von 11

1/11

GUIA DE LABORATORIO N11


PLANTILLAS, PUNTEROS Y ASIGNACION DINAMICA DE
MEMORIA
OBJETIVOS
1. Conocer y aplicar plantillas de funcin en sus programas
2. Establecer las diferencias entre variables y punteros
3. Conocer los operadores puntero de C/C++: & y *
4. Utilizar los operadores new y delete de C++ para asignar y liberar memoria
dinmica
PARTE I: Plantillas o templates
Ejem 1.
#include <iostream>
using namespace std;
//Muestra el uso de plantillas de funcion o patrones en C++
/* El programa define dos funciones plantilla llamadas maximo para evaluar el
maximo de dos y tres datos respectivamente */
template <class T>
T maximo(T x, T y)
{
if (x > y)
return x;
else
return y;
}
template <class T>
T maximo(T x, T y, T z)
{
T max = x;
if (y > max)
max = y;
if (z > max)
max = z;
return max;
}
void main()
{
//probando con enteros
int a, b, c; cout<<"Ingrese dos enteros diferentes ";
cin>>a>>b;

Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

2/11
if (a!=b)
cout<<"El maximo de "<<a<<" y "<<b<<" es : "<<maximo(a,b)<<endl;
else
cout<<"Los numeros ingresados deben ser diferentes\n";
cout<<"Ingrese tres enteros diferentes ";
cin>>a>>b>>c;
if((a!=b && b!=c) && (a!=c && c!=b))
cout<<"El maximo de "<<a<<" , "<<b<<" y "<<c<<" es : "<<maximo(a,b,c)<<endl;

else
cout<<"Los tres numeros ingresados deben ser diferentes entre si\n";
//probando con reales
float f, g, h; cout<<"Ingrese dos reales diferentes ";
cin>>f>>g;
if (f!=g)
cout<<"El maximo de "<<f<<" y "<<g<<" es : "<<maximo(f,g)<<endl;
else
cout<<"Los numeros ingresados deben ser diferentes\n";
cout<<"Ingrese tres reales diferentes "; cin>>f>>g>>h;
if((f!=g && g!=h) && (f!=h && h!=g))
cout<<"El maximo de "<<f<<" , "<<g<<" y "<<h<<" es : "<<maximo(f,g,h)<<endl;

else
cout<<"Los tres numeros ingresados deben ser diferentes entre si\n";
//probando con caracteres
char car1, car2, car3;
cout<<"Ingrese dos caracteres diferentes ";
cin>>car1>>car2;
cout<<"El maximo valor de "<<car1<<" y "<<car2<<" es : " <<maximo(car1,car2)<<endl;

cout<<"Ingrese tres caracteres diferentes ";


cin>>car1>>car2>>car3;
cout<<"El maximo de "<<car1<<","<<car2<<"y"<<car3<<"es:"
<<maximo(car1,car2,car3)<<endl;
system("PAUSE");
}
Ejem 2.
/* la plantilla de funcion imprimeArray, imprime un arreglo
segun el tipo de dato que recibe como argumento */
#include <iostream>
using namespace std;
template <class T>
void imprimeArray(const T *array, const int n)
{
for(int i=0; i<n; i++)
cout<<array[i]<<" ";
cout<<endl;
}

Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

3/11

void main()
{
int a[10], n=10, i;
double d[10];
char s[]="ALGORITMOS Y PROGRAMACION";
//cargando el array de enteros
for(i=0; i<n; i++)
a[i]=i*2+1;
cout<<"El arreglo a, de enteros contiene: ";
imprimeArray(a,n); // llamando a la funcion plantilla
// cargando el array de dobles
for(i=0; i<n; i++)
d[i]=i+2.2;
cout<<"\nEl arreglo d, de dobles contiene: ";
imprimeArray(d,n); // llamando a la funcion plantilla
cout<<"\nEl arreglo s, de caracteres contiene: ";
imprimeArray(s,sizeof(s));
system("PAUSE");
}
Ejem 3
// Programa que calcula la distancia entre 2 puntos
#include <iostream>
using namespace std;
#include <math.h>
// Definicion de la plantilla
template <class T> class Punto
{
private:
T x1,y1,x2,y2;
float d;
public:
void Lectura();
void Proceso();
void Ver();
};
// Programa principal
void main()
{
Punto<int> P;
Punto<float> Q;
cout<<"LAS COORDENADAS DEL PRIMER OBJETO"<<endl;
P.Lectura();
P.Proceso();
Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

4/11
P.Ver();
cout<<"LAS COORDENADAS DEL SEGUNDO OBJETO"<<endl;
Q.Lectura();
Q.Proceso();
Q.Ver();
system ("pause");
} // Fin de programa principal
template <class T> void Punto<T>::Lectura()
{
cout<<"x1=";cin>>x1;cout<<"y1=";cin>>y1;
cout<<"x2=";cin>>x2;cout<<"y2=";cin>>y2;
}
template <class T> void Punto<T>::Proceso()
{
d=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
template <class T> void Punto<T>::Ver()
{
cout<<"P("<<x1<<","<<y1<<")"<<endl;
cout<<"Q("<<x2<<","<<y2<<")"<<endl;
cout<<"La distancia de P a Q es="<<d<<endl;
}
Ejem 4
// Programa que permite almacenar datos en un vector, mostrar y ordenar
#include <iostream>
using namespace std;
using namespace std;
const int M=100;
// Declarando la clase plantilla
template <class S>
class Vector
{ private:
int N;
S X[M];
public:
Vector(int m);
void Lectura();
void Escribe();
void Sortear();
};
// Programa principal
int main()
Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

5/11
{ int elem;
cout<<"Ingrese tamao del vector:";cin>>elem;
Vector <int> Z(elem);
Vector <char> Y(elem);
cout<<"\nLECTURA DE DATOS ENTEROS\n";
Z.Lectura();
cout<<"SALIDA DE DATOS DEL VECTOR- NUMEROS ENTEROS\n";
Z.Escribe();
cout<<"\nLECTURA DE DATOS CHAR\n";
Y.Lectura();
cout<<"SALIDA DE DATOS DEL VECTOR- CHAR\n";
Y.Escribe();
cout<<"ORDENAMIENTO DEL VECTOR-CHAR\n";
Y.Sortear();
cout<<"SALIDA DEL VECTOR ORDENADO-CHAR\n";
Y.Escribe();
cout<<"ORDENAMIENTO DEL VECTOR-NUMEROS ENTEROS\n";
Z.Sortear();
cout<<"SALIDA DEL VECTOR ORDENADO-ENTEROS\n";
Z.Escribe();
system ("pause");
} // Fin de programa principal
// Definiendo las funciones miembro de la clase
template <class S>
Vector<S>::Vector(int m)
{
N=m;
}
template <class S>
void Vector<S>::Lectura()
{
int i,j;
for(i=0;i<N;i++)
{
cout<<"A["<<i<<"]=";
cin>>X[i];
}
}
template <class S> void Vector<S>::Escribe()
{
int i,j;
for(i=0;i<N;i++)
cout<<X[i]<<"\t";
cout<<endl;
Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

6/11
}
template <class S> void Vector<S>::Sortear()
{
int i,j;
S temp;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(X[i]>X[j])
{ temp=X[i];X[i]=X[j];
X[j]=temp;
}
}
PARTE 2: Punteros y asignacin dinmica de memoria
Ejem 5.
#include<iostream.h>
#include <conio.h>
//muestra el uso de variables y punteros
void main()
{
int i; // i variable entera
int *pi; // pi variable puntero a entero
i=100;
pi=&i; cout<<"i: "<<i<<endl; //valor almacenado en i
cout<<"pi: "<<pi<<endl;//pi guarda la direccion de i
cout<<"*pi: "<<*pi<<endl;//valor al que apunta pi
cout<<"&pi: "<<&pi<<endl;//direccion de pi
*pi=500; //cambiando el valor apuntado por pi
cout<<"*pi: "<<*pi<<endl;//nuevo valor apuntado por pi
cout<<"i: "<<i<<endl; //nuevo valor en i
system(pause);
}

Ejem 6.
#include <iostream>
using namespace std;
#include <conio.h>
//punteros y sentencias de asignacion
void main()
{
int i, j; // variables enteras
int *pi, *pj; //variables puntero a entero

Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

7/11
// parte 1
i=100;
pi=&i; //asignar la direccion de i a pj
pj=pi; //asignar pi a pj
cout<<"Parte 1"<<endl;
cout<<"Valor en i: "<<i<<"\t\t\tDireccion de i: "<<pi<<endl;
cout<<"Valor apuntado por pj: "<<*pj<<endl<<endl;
//parte 2
j=500;
pj=&j; cout<<"Parte 2"<<endl;
cout<<"Valor en j: "<<j<<"\tDireccion de j: "<<pj<<endl;
pj=pi; cout<<"Valor apuntado por pi: "<<*pi<<"\tValor apuntado por pj:"
<<*pj<<endl<<endl;
//parte 3
*pi=*pj; cout<<"Parte 3"<<endl;
cout<<"Direccion almacenada en pi: "<<pi
<<"\tDireccion almacenada en pj: "<<pj<<endl;
cout<<"Valor apuntado por pi: "<<*pi<<"\tValor apuntado por pj: "
<<*pj<<endl;
cout<<"Valor en i: "<<i<<"\t\t\tValor en j: "<<j<<endl;
cout<<"Direccion de pi: "<<&pi<<"\tDireccion de pj: "<<&pj<<endl;
system(Pause);
}
Ejem 7.
#include <iostream>
using namespace std;
//muestra el uso del operador new para asignar memoria dinamica
void main()
{
int i, *pi;
pi = new int; //pi es ahora variable dinamica
cout<<"Ingrese un entero ";
cin>>*pi;
cout<<*pi<<endl;
i = *pi; cout<<"Valor en i "<<i<<endl;
*pi=*pi+10; //el valor entero ingresado es ahora aumentado en 10
cout<<"Valor incrementado en 10: "<<*pi<<endl;
cout<<"Valor actual en i: "<<i<<endl;
i=*pi; cout<<"Nuevo valor en i: "<<i<<endl;
system("PAUSE");
}

Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

8/11

Ejem 8.
#include <iostream>
using namespace std;
#include <conio.h>
//mas acerca del uso del operador new
void main()
{
int *pi,*pj;
pi = new int;
pj = new int; // pi pj son ahora punteros dinamicos
if (pi == NULL && pj == NULL)
{
cout<<"Error: Memoria insuficiente!.\n";
exit(1);
}
*pi= 100;
pj=pi; cout<<"*pi = "<<*pi<<endl; cout<<"*pj = "<<*pj<<endl;
*pj=50; cout<<"\n*pi = "<<*pi<<endl; cout<<"*pj = "<<*pj<<endl;
pi = new int;
*pi = 200; cout<<"\n*pi = "<<*pi<<endl; cout<<"*pj = "<<*pj<<endl;
system(pause);
}
Ejem 9.
#include <iostream>
#include <conio.h>
const int N = 10;
void main()
{
int *px, i;
int x[N];
// cargando el array
for (i=0; i<N; i++)
x[i]=2*i;
// recorrer y mostrar el array
for (i=0;i<N;i++)
{ px=&x[i];
cout<<"Elemento "<<i<<" valor "<<x[i]<<" direccion "<<px<<endl;
}
system(pause);
}

Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

9/11

Ejem 10
#include <iostream>
using namespace std;
const int N=10;
void main()
{
int *px, i;
int x[N];
//cargando el array
for (i=0; i<N; i++)
x[i]=2*i;
//mostrando el array
px=&x[0];
for (i=0;i<N;i++)
cout<<"Elemento "<<i<<" valor "<<x[i]<<" direccion "<<px+i<<endl;
system("PAUSE");
}
Ejem 11.
#include <iostream>
using namespace std;
#include <conio.h>
// muestra el uso de un array dinamico
typedef int* pArrayEnt; //puntero a un array de enteros
void leerArray(int a[], int n);
void escribirArray(int a[], int n);
void ordenaArray(int a[], int n);
void main()
{
int n; cout<<"Ingrese numero de elementos en el Array ";
cin>>n;
pArrayEnt a;
a = new int[n]; // array dinamico
if (a == NULL)
{ cout<<"Error: Memoria insuficiente!.\n"<<endl;
exit(1);
}
leerArray(a,n);
ordenaArray(a,n);
escribirArray(a,n);
delete []a; // liberar memoria dinamica
system(Pause);
}

Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

10/11
//definiendo las funciones
void leerArray(int a[], int n)
{
cout<<"Ingrese "<<n<<" enteros en el array"<<endl;
for (int i=0; i<n; i++)
cin>>a[i];
}
void escribirArray(int a[], int n)
{
cout<<"El array ordenado de menor a mayor es: "<<endl;
for (int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
//Metodo de Seleccion Directa
void ordenaArray(int a[], int n)
{
int selec;
for (int i = 0; i<n; i++)
{
int k = i;
selec = a[i]; //seleccion inicial
for (int j =i+1; j<n; j++) //busqueda en secuencia
if ( a[j] < selec )
{ k = j;
selec = a[k]; //seleccion
}
a[k] = a[i]; //intercambio
a[i] = selec;
}
}

Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

11/11

PROBLEMAS PROPUESTOS
Escriba un programa que defina y pruebe una funcin plantilla que
implemente el algoritmo intercambio, para ello se sabe que los datos
pueden ser enteros, flotantes, char, entero largo o doubles.
Escriba un programa que defina y pruebe una funcin plantilla que
implemente el algoritmo de la burbuja de tal manera que permita
ordenardatos enteros, flotantes, doubles, char, entero largo.
Se tiene un grupo de datos (enteros, float, char, float o double) almacenado
en un vector, se pide determinar el numero o carcter mayor, el menor
numero o carcter y el segundo entero o carcter mayor, para implemente
el programa utilizando una plantilla de funcin.
Elabore una funcin plantilla que permita evaluar la ecuacin de segundo
grado sabiendo que las constantes a, b y c pueden ser enteros o reales.
Elabore una funcin plantilla que permita calcular la potenciacion de un
numero, dado que el numero como el exponente pueden ser enteros o
reales.

Profesor: Ing. Felix Huari E.

Curso: Algoritmos y Programacin

Das könnte Ihnen auch gefallen