Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Como eliminar los Elementos de un Arrays

Estas en el tema de Como eliminar los Elementos de un Arrays en el foro de C/C++ en Foros del Web. Hola, buenas, estoy creando un programa "proyecto" para mi universidad pero tengo una duda a la hora de eliminar los datos de un arrays. de ...
  #1 (permalink)  
Antiguo 23/07/2015, 21:15
 
Fecha de Ingreso: julio-2015
Mensajes: 3
Antigüedad: 8 años, 9 meses
Puntos: 1
Como eliminar los Elementos de un Arrays

Hola, buenas, estoy creando un programa "proyecto" para mi universidad pero tengo una duda a la hora de eliminar los datos de un arrays. de verdad no se como empezar a hacerlo sin que me modifique todos los demas datos. el programa tiene estas opciones. para ver si pueden ayudarme a hacerlo o orientarme de alguna manera. se trata de una empresa X.

Código:
#include <iostream>
#include <string>
#include <conio.h>
#include <cstdlib>
#include <stdio.h> 
#include <cstring>
using namespace std;

class Empresa{
public:
struct Trab {
int totalempl;
int nempleado[100];
int cedula[100];
int Antiguedad[100];
char nombre[100][100];
char nombre2[100][100];
char nacionalidad[1][100];
double salario[100];
double TotalFinal[100];
} trabajadores;	
public:
float Carga_Inicial ();
float Depar_Opci ();
float Anadir_Empl();
float Gana_Emple ();
float Extr_Traba ();
float Consulg_Emp();
void Consuloa_Emp();
float consul_Emp();
float Modif_Emp();
float Borr_Emp();
float Calcular_Sueldo();

};
float Empresa::Carga_Inicial() {
	int N;
   	system("cls");
   	cout<<"Carga Inicial De Empleados"<<endl;
   	cout<<"---------------------------"<<endl;
    cout<<"Ingrese la cantidad de Empleados que desea Ingresar:"<<endl;
    cin>>N;
    while((N < 2) || (N > 100)) {
    	cout<<"Debe ingresar un numero mayor o igual a 0 y menor o igual 100"<<endl;
    	cin>>N;
    }
    int i;
    for (i = 0; i < N; i++) {
    	cout<<"Registro numero:"<<i+1<<endl;
    	Empresa::Anadir_Empl(); }}
    	
float Empresa::Anadir_Empl(){
	
	system("cls");
	int i = trabajadores.totalempl;

	char V[100] = "V";
	char E[100] = "E";
	
	cout<<"Ingrese los datos del Empleado:"<<endl;
	cout<<"--------------------"<<endl;
	cout<<"Numero de Empleado: "<<i+1<<endl;
	cout<<"\n"<<endl;
	trabajadores.nempleado[i]=i+1;
    cout<<"Nombre:"<<endl;
    cin>>trabajadores.nombre[i];
    cout<<"\n"<<endl;
    cout<<"cedula:"<<endl;
    cin>>trabajadores.cedula[i];
    cout<<"\n"<<endl;
     cout<<"Antiguedad en la Empresa (Valorada en Años):"<<endl;
    cin>>trabajadores.Antiguedad[i];
    cout<<"\n"<<endl;
	cout<<"Nacionalidad V o E:"<<endl;
	cin>>trabajadores.nacionalidad[i];
	
	while((strcmp(trabajadores.nacionalidad[i], E) != 0) && (strcmp(trabajadores.nacionalidad[i], V) != 0)) {
		cout<<"Indique una opcion valida (V o E):"<<endl;
		cin>>trabajadores.nacionalidad[i];
	}
	cout<<"\n"<<endl;
	cout<<"Salario del Empleado:"<<endl;
	cin>>trabajadores.salario[i];
	trabajadores.totalempl++;
};

float Empresa::Depar_Opci (){
	system("cls");
	int U;
	cout<<"Bienvenido a la Empresa Daniel&Christian C.A - Company - "<<endl;
	cout<<"------------------------------------------------------------------"<<endl;
	cout<<"Cantidad de Empleados registrados ("<< trabajadores.totalempl <<")"<<endl;
	cout<<"Elija una de las siguientes opciones:"<<endl;
	cout<<"1) Datos del empleado que mas gana por Semana"<<endl;
	cout<<"2) Total pagado a los Empleados Extranjeros"<<endl;
	cout<<"3) Consulta general ordenada por número de empleado"<<endl;
	cout<<"4) Consulta general ordenada por nombre de empleado"<<endl;
	cout<<"5) Consulta individual"<<endl;
	cout<<"6) Ingresar un Nuevo Empleado"<<endl;
	cout<<"7) Modificar Datos"<<endl;
	cout<<"8) Borrar Datos"<<endl;
	cout<<"9) Salir"<<endl;
	cout<<"OPCION: ";
    cin>>U;
    while((U < 1) || (U > 9)) {
    	cout<<"Debe ingresar un opcion valida"<<endl;
    	cin>>U;
    }
	switch (U)
    {
        case 1:
            Empresa::Gana_Emple();
            Empresa::Depar_Opci();
            break;
        case 2:
        	Empresa::Extr_Traba();
        	Empresa::Depar_Opci();
            break;
        case 3:
            Empresa::Consulg_Emp();
            Empresa::Depar_Opci();
            break;
        case 4:
        	Empresa::Consuloa_Emp();
        	Empresa::Depar_Opci();
            break;
        case 5:
            Empresa::consul_Emp();
            Empresa::Depar_Opci();
            break;
        case 6:
        	Empresa::Anadir_Empl();
        	Empresa::Calcular_Sueldo();
        	Empresa::Depar_Opci();
        	break;
        	
        case 7:
        	Empresa::Modif_Emp();
        	Empresa::Calcular_Sueldo();
        	Empresa::Depar_Opci();
        	break;
        case 8:
        	Empresa::Borr_Emp();
        	Empresa::Depar_Opci();
        	break;
        case 9:
        	
        	break;
    }
};

float Empresa::Gana_Emple(){
	
	int T = trabajadores.totalempl;
	int M = 0;
	int i;
	for (i = 1; i < T; i++) {
		if(trabajadores.salario[i] > trabajadores.salario[i-1]) {
			M = i;
		}
	}
	system("cls");
	cout<<"El Empleado que mas gana por dia a la Semana"<<endl;
	cout<<"Numero: "<<trabajadores.nempleado[M]<<endl;
	cout<<"Nombre: "<<trabajadores.nombre[M]<<endl;
	cout<<"Nacionalidad: "<<trabajadores.nacionalidad[M]<<endl;
	cout<<"Antiguedad: "<<trabajadores.Antiguedad[M]<< " Años"<<endl;
	cout<<"Gana: "<<trabajadores.salario[M]<<endl;
	cout<<"\n"<<endl;
	system("pause");

	}
	
float Empresa::Extr_Traba() {
	char e[100] = "V";
	int i;
	int T = trabajadores.totalempl;
	double Total = 0;
	
	for(i = 0; i < T; i++) {
		if(strcmp(trabajadores.nacionalidad[i], e) == 0) {
			
		}
		else {
			Total = Total + trabajadores.salario[i];
			cout<<trabajadores.salario[i];
		}
	}
	
	cout<<"\n"<<endl;
	cout<<"El monto total pagado a los Empleados Extranjeros es de: "<<Total<<endl;
	cout<<"\n"<<endl;
	system("pause");
	
}


float Empresa::Consulg_Emp() {
	
		int cont,i;
		system ("cls");
	cout<<" ---------------------------------------------------------------------------"<<endl;
	cout<<"!             Consulta General Ordenada por Numero de Empleado               ! "<<endl;
	cout<<" ---------------------------------------------------------------------------"<<endl;
	cout<<" ---------------------------------------------------------------------------"<<endl;
	for (int i=0; i<trabajadores.totalempl; i++)
	{
		
	cout<<"Num: "<<trabajadores.nempleado[i]<<"\t Nombre: "<<trabajadores.nombre[i]<<"\t Antiguedad: "<<trabajadores.Antiguedad[i]<<"\t Salario: "<<trabajadores.salario[i]<<"\t Salario Total "<<trabajadores.TotalFinal[i]<<endl;
	cout<<" --------------------------------------------------------------------------"<<endl;
	}
	system("Pause");
}



void Empresa::Consuloa_Emp(){


int i,j;
int h,k;
char aux[100];

for (h=0;h<trabajadores.totalempl; h++)
strncpy(trabajadores.nombre2[h], trabajadores.nombre[h], 100);


for(i=0; i<trabajadores.totalempl-1; i++)
for(j=i+1; j<trabajadores.totalempl; j++)
if(strcmp(trabajadores.nombre2[i], trabajadores.nombre2[j]) > 0)	
{ 
strcpy(aux, trabajadores.nombre2[i]); 
strcpy(trabajadores.nombre2[i], trabajadores.nombre2[j]); 
strcpy(trabajadores.nombre2[j], aux); 
} 
cout<<" ---------------------------------------------------------------------------"<<endl;
cout<<"!             Consulta General Ordenada por Nombre de Empleado              ! "<<endl;
cout<<" ---------------------------------------------------------------------------"<<endl;
for(i=0; i<trabajadores.totalempl; i++) {
cout<<"Nombres: "<< trabajadores.nombre2[i]<<"\t Antiguedad: "<<trabajadores.Antiguedad[i]<<"\t Salario: "<<trabajadores.salario[i]<<"\t Salario Total "<<trabajadores.TotalFinal[i]<<endl;
}


system("Pause");
}
	

float Empresa::consul_Emp() {
	 int n;
	 cout<<"Ingrese el numero de empleado que desea consultar:"<<endl;
	 cin>>n;
	 cout<<"\n"<<endl;
	 cout<<"Nombre: "<<trabajadores.nombre[n-1]<<endl;
	 cout<<"Cedula: "<<trabajadores.cedula[n-1]<<endl;
	 cout<<"Nacionalidad: "<<trabajadores.nacionalidad[n-1]<<endl;
	 cout<<"Antiguedad: "<<trabajadores.Antiguedad[n-1]<<endl;
	 cout<<"Salario: "<<trabajadores.salario[n-1]<<endl;
	 
	 system("Pause");
	} 

float Empresa::Calcular_Sueldo(){
	int i;
	int semana;
	double Totalfinal;
	semana=4*5;
	for (int i=0; i<trabajadores.totalempl; i++)
	{
	
	trabajadores.TotalFinal[i]=trabajadores.salario[i]*semana;
    
}

}
	 
float Empresa::Modif_Emp(){
	int n;
	int o;
	 cout<<"Ingrese el numero de empleado que desea Modificar:"<<endl;
	 cin>>n;
	cout<<"\n"<<endl;
	cout<<"Nombre de empleado a Modificar: "<<trabajadores.nombre[n-1]<<endl;
	cout<<"Opciones para Modificar Selecione"<<endl;
	cout<<"1) Nombre"<<endl;
	cout<<"2) Cedula"<<endl;
	cout<<"3) Antiguedad"<<endl;
	cout<<"4) Nacionalidad (V o E)"<<endl;
	cout<<"5) Salario"<<endl;
	cout<<"6) No Editar"<<endl;
	cout<<"opc: ";
	 cin>>o;
    while((o < 1) || (o > 6)) {
    	cout<<"Debe ingresar un opcion valida"<<endl;
    	cin>>o;
    }
		switch (o)
    {
        case 1:
            cout<<"Editar Nombre: "<<endl;
            cin>>trabajadores.nombre[n-1];
            break;
        case 2:
            cout<<"Editar Cedula: "<<endl;
            cin>>trabajadores.cedula[n-1];
            break;
        case 3:
        cout<<"Editar Antiguedad : "<<endl;
            cin>>trabajadores.Antiguedad[n-1];
            break;
        case 4:
        	cout<<"Edit Nacionalidad Ingrese (V o E): "<<endl;
            cin>>trabajadores.nacionalidad[n-1];
            break;
        case 5:
            cout<<"Editar Salario: "<<endl;
            cin>>trabajadores.salario[n-1];
            break;
		case 6:
		break;	
}
	 }

float Empresa::Borr_Emp() {
	int n;
	int o;
	 cout<<"Ingrese el numero de empleado que desea Eliminar: "<<endl;
	 cin>>n;
	 cout<<" Los datos que desea Eliminar Son del empleado: "<<trabajadores.nombre[n-1];
	 cout<<"\n"<<endl;
	 cout<<"SEGURO QUE QUIERE ELIMINAR LOS DATOS (Y O N)"<<endl;
	 cin>>o;
	   switch (o)
    {
        case 'y':
               
            break;
        case 'n':
           break;
	  
}
}	


int main ()
{
	Empresa x;
	x.Carga_Inicial();
	x.Calcular_Sueldo();
	x.Depar_Opci();
	system("pause");
}
  #2 (permalink)  
Antiguo 24/07/2015, 01:29
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como eliminar los Elementos de un Arrays

Te comento un poco lo que puedo ver de tu código:

Clases confusas

anidar una clase dentro de otra puede tener sentido en ciertas ocasiones (para organizar datos para uso interno de la clase, por ejemplo. No es tu caso.

Además, estás creando dentro de Trab el arreglo de trabajadores... el concepto es algo complicado porque estás mezclando responsabilidades. Tendrías un código más limpio si:
  • Trab la declaras fuera de Empresa
  • Trab se "centra" en almacenar los datos de un trabajador
  • Empresa pasa a gestionar la lista de trabajadores

Algo así:

Código C++:
Ver original
  1. class Trabajador
  2. {
  3.   public:
  4.    
  5.     Trabajador( )
  6.       : _numEmpleado( 0 ),
  7.         _cedula( 0 ),
  8.         _antiguedad( 0 ),
  9.         _salario( 0 )
  10.     { }
  11.    
  12.     int NumEmpleado( ) const
  13.     { return _numEmpleado; }
  14.    
  15.     void SetNumEmpleado( int num )
  16.     { _numEmpleado = num; }
  17.    
  18.     int Cedula( ) const
  19.     { return _cedula; }
  20.    
  21.     void SetCedula( int cedula )
  22.     { _cedula = cedula; }
  23.    
  24.     int Antiguedad( ) const
  25.     { return _antiguedad; }
  26.    
  27.     void SetAntiguedad( int antiguedad )
  28.     { _antiguedad = antiguedad; }
  29.    
  30.     string Nombre( ) const
  31.     { return _nombre; }
  32.    
  33.     void SetNombre( const string& nombre )
  34.     { _nombre = nombre; }
  35.    
  36.     string Nombre2( ) const
  37.     { return _nombre2; }
  38.    
  39.     void SetNombre2( const string& nombre )
  40.     { _nombre2 = nombre; }
  41.  
  42.     string Nacionalidad( ) const
  43.     { return _nacionalidad; }
  44.    
  45.     void SetNacionalidad( const string& nacionalidad )
  46.     { _nacionalidad = nacionalidad; }
  47.    
  48.     double Salario( ) const
  49.     { return _salario; }
  50.    
  51.     void SetSalario( double salario )
  52.     { _salario = salario; }
  53.    
  54.   private:
  55.    
  56.     int _numEmpleado;
  57.     int _cedula;
  58.     int _antiguedad;
  59.     string _nombre;
  60.     string _nombre2;
  61.     double _salario;
  62. };
  63.  
  64. class Empresa
  65. {
  66.   private:
  67.     std::vector< Empleado > _empleados;
  68. }

Aunque a primera vista parezca que hay más código este diseño tiene bastantes ventajas frente al actual:
  • Cada clase se dedica a una única cosa, los posibles errores están más acotados
  • Como para modificar cada valor de Trabajador hay que llamar a un método, es muy sencillo añadir filtros para evitar la inserción de valores no válidos
  • Ampliar la funcionalidad es más sencillo

También habrás notado que he sustituído los char* por la clase string. string es una clase de C++ pensada para trabajar con cadenas de texto. Es muy util y da muchos menos problemas que trabajar con arreglos de tipo char.

Seguimos separando responsabilidades

Yo entiendo que puede parecer muy práctico porque parece que se escribe menos código, pero tener en la clase Empresa una función que sea Anadir_Empl que interactua con la entrada salida no es una buena idea:
  • Genera acoplamiento, si en el futuro los datos pasan a venir de un socket, de una base de datos, de un USB... tendrás que modificar la clase Empresa y después tendrás que probar esta clase al completo para asegurarte de que todo funciona bien.
  • En línea con lo anterior, si resulta que después tienes que compatibilizar dos o más orígenes de datos la única solución que te queda es duplicar código mientras la clase empieza a almacenar código sin control.
  • En la poca historia que lleva la programación a sus espaldas ha quedado claro que los diseños monolíticos (como es tu caso) son la peor elección posible.

Si se piensa un poco, se ve que la responsabilidad de Empresa es almacenar la lista de trabajadores. Al menos en tu código no hay más elementos que la Empresa deba almacenar. Con esto en mente la clase Empresa puede quedar de dos formas diferentes:

Código C++:
Ver original
  1. // Como un alias de un vector
  2. typedef std::vector< Trabajador > Empresa;
  3.  
  4. // Como una clase propia que almacene un vector de trabajadores
  5. class Empresa
  6. {
  7.   private:
  8.  
  9.     std::vector< Trabajador > _trabajadores;
  10. };

Como imagino que tampoco te apetece meterte en un jardín, yo tiraría de momento por la primera opción. Mientras no tengas que añadir más tipos de objetos a Empresa te puedes ahorrar bastante código así.

Espera, ¿y qué pasa entonces con las funciones que actualmente hay en Empresa? Bueno, es que ninguna de esas funciones debería haber pertenecido nunca a esa clase. Lo mejor es que las dejes como funciones independientes y, si en el futuro ves que se pueden agrupar en clases, entonces dedicas un tiempo a refactorizar el código.

Cuidado con las llamadas a las funciones

Código C++:
Ver original
  1. float Empresa::Carga_Inicial() {
  2.   int N;
  3.   system("cls");
  4.   cout<<"Carga Inicial De Empleados"<<endl;
  5.   cout<<"---------------------------"<<endl;
  6.   cout<<"Ingrese la cantidad de Empleados que desea Ingresar:"<<endl;
  7.   cin>>N;
  8.   while((N < 2) || (N > 100)) {
  9.     cout<<"Debe ingresar un numero mayor o igual a 0 y menor o igual 100"<<endl;
  10.     cin>>N;
  11.   }
  12.   int i;
  13.   for (i = 0; i < N; i++) {
  14.     cout<<"Registro numero:"<<i+1<<endl;
  15.     Empresa::Anadir_Empl(); // <<<-- AQUI!!!!!!
  16.   }
  17. }

La línea que te marco está intentando hacer una llamada a una función estática. Mucho cuidado con eso porque la aplicación puede funcionar incorrectamente.

No se si te lo han explicado, pero cualquier método no estático de una clase o estructura en C++ tiene una variable local creada por defecto. La variable en cuestión es un puntero a la clase actual y se llama this. Otra característica de esta variable es que es implícita, es decir, el compilador es capaz de intuir su uso.

¿Por qué te cuento este royo? Pues porque en el ejemplo que te he puesto, dispones de dos formas de realizar la llamada a la función:

Código C++:
Ver original
  1. for (i = 0; i < N; i++) {
  2.     cout<<"Registro numero:"<<i+1<<endl;
  3.  
  4.     // opción 1
  5.     this->Anadir_Empl();
  6.  
  7.     // opción 2
  8.     Anadir_Empl();
  9.   }

Y tu podrás pensar... Pues vaya chorrada que exista el puntero this si luego no hace falta usarlo... Bueno, this tiene su utilidad en ciertos casos... por ejemplo imagínate que tienes una colección de objetos de tipo Teléfono y que cuando se descuelga uno debe avisar a un objeto de tipo Centralita para poder dar tono. Queda claro que la centralita necesita un puntero al teléfono que se ha descolgado para poder comunicarse con el. La cosa podría quedar así:

Código C++:
Ver original
  1. class Telefono
  2. {
  3.     void Descolgar( )
  4.     {
  5.       // Le pedimos tono a la centralita... y le indicamos quiénes somos
  6.       Centralita::PeticionTono( this );
  7.     }
  8. };
  9.  
  10. class Centralita
  11. {
  12.   public:
  13.     static void PeticionTono( Telefono* telefono );
  14. };

Otro caso en el que necesitas usar "this":

Código C++:
Ver original
  1. class A
  2. {
  3.   public:
  4.     void SetDato( int dato )
  5.     {
  6.        // ¿Se te ocurre una forma alternativa de almacenar el valor cuando las dos
  7.        // variables se llaman igual?
  8.        this->dato = dato;
  9.     }
  10.  
  11.   private:
  12.     int dato;
  13. };

Cuidado con los return

Todas las funciones de Empresa, salvo una, indican en su declaración que devuelven un float... ¿cuántas tienen un return? pues eso. Si una función debe retornar un valor hay que poner un return.

Dicho esto te indico que se entiende como una falta de respeto que nos cueles código que no compila. Salvo que tu problema esté relacionado precisamente con el hecho de que no eres capaz de hacerlo compilar preocúpate por poner código compilable.

Eliminar elementos de una lista

Si la lista se basa en un arreglo, tienes que mover una posición los elementos que sean posteriores al elemento a eliminar para ocupar el hueco que va a dejar el elemento eliminado:

Código C++:
Ver original
  1. NumElementos--;
  2. for( int i=posElementoAEliminar; i<NumElementos; ++i)
  3. {
  4.   lista[i] = lista[i+1];
  5. }

Si la lista se basa en un contenedor de C++ basta con que le indiques al contenedor el elemento que quieres eliminar y él se encarga de todo:

Código C++:
Ver original
  1. std::vector< int > elementos;
  2. elementos.push_back( 1 );
  3. elementos.push_back( 2 );
  4. elementos.push_back( 3 );
  5.  
  6. // Se elimina el segundo elemento
  7. elementos.erase( elementos.begin( ) + 1 );
  8.  
  9. for( int i=0; i < elementos.size( ); ++i )
  10.   std::cout << elementos[ i ] << std::endl;

Un saludo
  #3 (permalink)  
Antiguo 24/07/2015, 07:08
 
Fecha de Ingreso: julio-2015
Mensajes: 3
Antigüedad: 8 años, 9 meses
Puntos: 1
Respuesta: Como eliminar los Elementos de un Arrays

Conchale muy buena respuesta, osea que tendría que modificar todo el codigo prácticamente lo que pasa es que hay muchas cosas que no se, de verdad muchísimas gracias te esforzaste en explicarme.
yo se que este foro no es para conseguir que te hagan las cosas, pero de verdad no dispongo de tiempo. sera que me puedes ayudar a implementar el codigo, Yo se mas o menos pero no se como de verdad implementar todo lo que me dijiste en mi proyecto, es para el lunes y de verdad ando preocupado.

Elija una de las siguientes opciones:
1) Datos del empleado que mas gana por Semana
2) Total pagado a los Empleados Extranjeros
3) Consulta general ordenada por número de empleado
4) Consulta general ordenada por nombre de empleado
5) Consulta individual
6) Ingresar un Nuevo Empleado
7) Modificar Datos
8) Borrar Datos

Etiquetas: arrays, char, elementos, int, numero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:04.