Busqueda

Resultados

jueves, 22 de julio de 2010

Arreglo de Objetos. Un poco de ayuda

Creación de Objetos
Creamos un objeto mediante la siguiente sintaxis:

Objeto a(arg1, arg2); //Creo un objeto Objeto, usando el contructor de argumentos arg1 y arg2
Objeto b; //Creo un objeto Objeto, usando el constructor sin parámetros

En ambos casos, se creo un objeto en memoria estática. Es decir, la memoria asignada para la función o método donde se creo el objeto. Una vez que la función finaliza, el objeto se destruye.

Para crear un objeto en memoria dinámica usamos:


Objeto* a = new Objeto(arg1, arg2);

Objeto* b = new Objeto;

Si queremos crear un arreglo de objetos en memoria dinámica usamos:


Objeto* c = new Objeto[20] //Creo un arreglo de 20 espacios de Objeto.


Cuando definimos un objeto en memoria dinámica, esta memoria queda tomada por el resto de la ejecución del programa hasta que nosotros llamemos al destructor por medio de:

delete a;
delete b;
delete [] c; //Si al crear el objeto usamos [] (Hicimos un arreglo) entonces delete // se debe llamar con []

Debemos tener en cuenta que la memoria estática se obtiene en el momento en que se compila el programa. La memoria dinámica se asigna durante la ejecución. Es decir, podemos pedir la medida justa de memoria de acuerdo a parámetros que se pueden obtener en tiempo de ejecución. A cambio de este beneficio, debemos preocuparnos de liberar la memoria que pedimos. Cada vez que hacemos un new, debemos preocuparnos de hacer delete después. Edemas, en los destructores de la clase debemos preocuparnos de hacer delete en la memoria que hayamos pedido con new dentro del objeto.

un ejemplo de como hacer lo anteriormente descrito

main()
{

... // Aquí deberían estar declaradas algunas o las variables que se necesitan

int dim; //Dimensión del arreglo de objetos

alumno *p; //Crea un puntero a objeto alumno, Se asume que la clase alumno esta implementada
alumno *aux; //Puntero auxiliar tipo alumno (Solo por ejemplo pero no es necesario)

cout << "Cuantos alumnos tiene la clase? ";
cin >> dim; //Para cuantos objetos hay que liberar memoria? // es de ejemplo
cout << "\n";

p = new alumno[dim]; //Asigna memoria dinámicamente

if (p==0) //Si p=0 no hay memoria suficiente
{
cout << "Error no hay suficiente memoria";
return 0; //Sale del programa
};

aux=p; //Asignación de un puntero a otro del mismo tipo

do //estructura do...while
{ //que mantiene en el ciclo principal
cout << " \n";

... // aqui debería estar el menu de opciones

cin >> opcion;

switch (opcion)
{
case 1: (p+numero_objeto) -> ingresar(); //operador flecha en vez de operador punto
numero_objeto++;
break;
case 2: cout <<"\n";
cout <<"Lista de Estudiantes inscritos \n";
for (i=0;i<numero_objeto;i++)
{
cout << "Estudiante numero " << i;
cout << ": ";
(aux+i) -> mostrar_nombre();
cout << "\n";
}
break;
case 3: cout << "Ingrese el número de lista del estudiante a examinar \n";
cin >> n;
cout << "Alumno: ";
(p+n) ->mostrar_nombre();
cout << "\n";
(p+n) -> reporte();
break;
default: return 0; //Sale del programa
}
} while (opcion !=4); //sale del programa

delete [] p; //libera la memoria asignada a *p
}


Ing. Tom Zambrano

"El hombre inteligente no es aquel que lo sabe todo, sino aquel que sabe aplicar lo poco que sabe"
Zilver sTone

"El poder del hombre no radica en su fuerza, sino en el poder de su palabra"










Get news, entertainment and everything you care about at Live.com. Check it out!

martes, 20 de julio de 2010

Cómo convertir un número de base decimal a otra y no morir en el intento con C



Saludos seguidores;

Acá les dejo un sencillo programa realizado en c++ para convertir un numero de base decimal a base binaria, octal o hexadecimal, solo hay que especificar con que base se desea trabajar. Deseo les sirva de orientación y ayuda...

#include <iostream>
#include <string.h>
using namespace std;

void invertir(char origen[], char destino[]){
    int j = strlen(origen)-1;
   
    destino[j+1] = '\0';  //colocar el fin de cadena
    for(int i=j;i>=0;i--){
        //cout<<origen[i];
        destino[j-i] = origen[i];
    }
}

/**
* numero: número decimal a convertir
* base: la base del numero a la cual convertir (2: binaria, 8: octal, 16: hexadecimal
* c[]: el número convertido
**/

void dec2base(int numero, int base, char c[]){
    int resto = 0;
    int n = numero;
    int i = 0;
    char aux[100];
   
    if (base!=2 && base!=8 && base!=16){ //validar que la base sea valida
        cout << "base no valida debe ser 2,8 o 16"<<endl;
        return;
    }
    strcpy(c, "");
    if (n==0){
        strcpy(c,"0");
    } else {
        while (n>0){
            resto = n % base;  //Obtiene el resto de la division entera
            if (resto<10){
                c[i] = '0'+resto; //el ASCII de 0 es 48 y así sucesivamente   
            } else {
                c[i] = '7'+resto; //el ASCII de A es 65 y así sucesivamente
            }
           
            n = n / base;     //división entera y se actualiza el valor de n
            i++;
        }
        c[i] = '\0';   //se coloca el fin de la cadena
        invertir(c,aux); // se invierte la cadena
        strcpy(c,aux); // se asigna aux a c
    }
   
}

int main(){
    char s[100],d[100];
    dec2base(1024,16,d);
    cout<<d;
    return 0;
}



Get news, entertainment and everything you care about at Live.com. Check it out!

miércoles, 14 de julio de 2010

Ejercicios prácticos propuestos

Saludos;


Acá les dejo seis ejercicios prácticos evaluados, de los cuales deben resolver sólo cuatro.


1. Diseña la clase Circulo representado por el radio r con dos método que calculan su perímetro y su área. Implemente la clase junto con sus métodos en una aplicación funcional para obtener dichos valores.

2. Diseñe un calculadora básica la cual tiene como atributos dos operadores x e y de tipo float y como métodos las operaciones matemáticas básicas; suma, resta, multiplicación y división. Implemente la clase junto con sus métodos en un programa funcional para obtener dichos resultados.

3. Desarrolle una clase Fecha representado por el atributo día, el cual es un dato de tipo long y es introducido en el formato AAAA-MM-DD, por ejemplo 31 de diciembre sería 20101231, implemente los métodos para determinar el número de días transcurridos desde el día 1 de enero de ese año, cuál es el día anterior, cuál es el día siguiente.

4. Realizar una aplicación para gestionar cierta información de los empleados de una empresa. El diseño de la aplicación estará formado por dos clases: la clase empleado y la clase empleadoPorHoras (que hereda de empleado), junto con un programa principal que llama a las operaciones públicas de ambas clases. La Clase empleado: contiene como datos privados el nombre del empleado y su número de CI. Además, sus métodos públicos son: un constructor de la clase, dos operaciones obtenedoras (GetNombre y GetCI), y una operación destructora de la clase. La Clase empleadoPorHoras: contiene como datos privados el costo por hora de un empleado y el número de horas trabajadas durante la semana. Además, dispone de los siguientes métodos públicos: un constructor de la clase (que requiere de su clase base el nombre y la CI del empleado) y una operación llamada DevuelvePago (que calcula el pago del empleado multiplicando su costo por hora por el número de horas trabajadas en la semana).

5. Crear una clase base abstracta Vehículo que contenga una función virtual para mostrar los atributos de un objeto en pantalla y dos clases derivadas que deberán concretar la clase anterior: vehiculo_de_tierra y vehiculo_de_aire. La clase base definirá dos atributos: costo y año del vehículo y dos funciones para obtener sus valores. Las clases derivadas vehiculo_de_tierra y vehiculo_de_aire contienen los atributos kilometraje y horas de vuelo respectivamente. Además deberán ofrecer funciones para obtener y establecer esos atributos. Escriba una aplicación funcional que cree objetos de las clases derivadas y un apuntador de clase base que haga uso de la función virtual que se ha concretado en cada una de las clases derivadas.

6. Dada una clase llamada Figuras que tiene dos atributos, identificador que es un arreglo de char de 25 caracteres y area de tipo float. La clase Figuras implementa dos métodos virtuales Calcular_Area(), e Identificar(). Defina dos clases derivadas; Rectangulo y Triangulo donde son redefinidos estos métodos y calculan los valores correspondientes. A continuación la implementación de la clase Figuras:
class Figuras{

protected:

char identificar[25];
float area;

public:
// Definiendo las funciones virtuales en la clase base
virtual void Calcular_Area();
virtual void Identificar();
};
// Cuando se definen las funciones no es necesario utilizar virtual
void Figuras::Calcular_Area(){
}
void Figuras::Identificar(){
cout << "Nombre Figura:" << identificar << endl; cout << "El Area es:" << area << endl;

}