Necesito ayuda para que el programa pueda eliminar números repetidos

Iniciado por RedHood, 6 Mayo 2021, 04:35 AM

0 Miembros y 1 Visitante están viendo este tema.

RedHood

Código (cpp) [Seleccionar]
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <time.h>
#include <string>
using namespace std;

//Se generan variables globales para evitar el paso de parametros o argumentos entre las funciones
int i=0, j=0, k=0, l=0;
int n=0;
int cn=0;                   //Numero de datos leidos y a ordenar
int guardacn;
int temp;
int arreglo[1000000];         //maximo se podran ordenar 1000000 de numeros
clock_t t_ini, t_fin;
double secs;
string nombrearchivo;      //nombre del archivo de entrada

int continuar = 0;
int numBuscar = 0;
int bandera = 0;


struct Entrada {           //declaracion de estructura que permiten leer y copiar los numeros en el arreglo "arreglo"
int valor;
} entrada;


//*****  Prototipo o definición del metodo de ordenamiento
int busSecElimDup();
int busqueda();
void leeArchivo();


//**** Funcion de lectura del archivo
//lee los numeros contenidos en el archivo y los copia en el arreglo "arreglo"
//Se dejan los numeros en un arreglo llamado "arreglo" para que la función (algoritmo o metodo) de Burbuja los pueda ordenar
void leeArchivo(){
FILE *archivo1;                                  //Crea un apuntador de archivo, utilizando en la función fopen, el apuntador se le asigná el llamado al archivo
   cout<<"\n Teclea el nombre del archivo de entrada (sin espacio, ni caracteres especiales):   ";
cin>>nombrearchivo;
nombrearchivo+= ".txt"; // Se le agrega al nombre del archivo la extension ".txt"
archivo1 = fopen(nombrearchivo.c_str(), "r");   // Se abre el archivo de modo lectura  
if(archivo1== NULL ){                       //    el archivo contiene los numeros a ordenar
     cout<<"\n No se puede abrir el archivo "; //si no se puede abrir el archivo termina con error el programa
 exit(1);
}                                  
else{
 cout<<"\n Se abrio el archivo "<<nombrearchivo.c_str()<<"  correctamente";
    }
   
   //Lee el archivo y copia los numeros contenidos en el archivo en el arreglo "arreglo"  
   cn=0;
   for (int i=0; !feof(archivo1); i++) {          // Repite hasta que sea el fin del archivo
       fscanf (archivo1, "%i", &entrada.valor);   // Lee el numero contenido en el archivo y lo guarda en la estructura
       arreglo[i]=entrada.valor;                    // El numero contenido en la estructura lo pasa al arreglo "arreglo"
       cn++;                                      // suma 1 al contador de numeros leidos
}
cn--;
cout<<"\n\nSe ha generado el arreglo con los datos del archivo de entrada";
cout<<"\nLa cantidad de numeros contenidos en el arreglo son:  "<<cn<<"\n\n";
n=cn;
fclose(archivo1);                             //cierra el archivo de entrada
system ("pause");
}



//Llama en general a una funcion de busqueda
int busqueda() {
   busSecElimDup();            //Se utiliza cuando los datos estan desordenados
   return (0);
}


//Metodo de Busqueda Secuencial
int busSecElimDup(){
  int contador = 0;
  cout<<"\nDato originales\n";
  for (i=0; i<n; i++){
cout<<arreglo[i]<<"  ";
}
// Busca duplicados dentro del arreglo
for (i=0; i<n; i++) {
  if  (arreglo [i] == arreglo[i+1]){
            // corrimiento a la izquierda
            for (j=i;  j < n;   j++) {           // eliminar con corrimiento a la izquierda
              arreglo [j-1] = arreglo[j];

            }
            contador ++;
}
}
cout<<endl;
cout<<"\nDato eliminados\n";
for (i=0; i<n; i++){
cout<<arreglo[i]<<"  ";
}
   cout<<endl;
   return (0);
   
   
}



//*** Funcio main ()
int main() {
continuar = 1;
   leeArchivo();  
n = cn;                        // lee y copia en una arreglo los numeros contenidos en el archivo de entrada
/*    do {
    system ("cls");
    for (l=0; l<n; l++){
    cout<<arreglo[l]<<"     ";
}
cout<<endl<<endl;
cout<<"\n\nTeclee el numero a buscar o consultar:  ";
cin>>numBuscar;
*/
       t_ini = clock();                       // guarda tiempo inicial (antes de ordenar)
       
       busqueda ( );                          //Llama al metodo de ordenamiento

       t_fin = clock();   // guarda tiempo final (despues de ordenar)

                                              // Imprime el tiempo que se tardo el metodo en ordenar los datos
       secs = (double)(t_fin - t_ini) / (double)CLOCKS_PER_SEC; // determina los milisegundo utilizados
       printf("%.16g milisegundos", secs * 1000.0);   // imprime el tiempo utilizado
       cout<<"\n\n";                          // se utiliza printf porque es una sentencia mas poderosa que cout
                                              // permite ver cantidades muy pequeñas o muy grandes
/*      
cout<<"\nDesea consultar otro numero (SI = 1,  NO = 0)";
       cin>>continuar;
cout<<"\n\n";

} while (continuar == 1);
*/
cout<<"\n\nMetodo de Busqueda Secuencial con eliminacion concluido \n\n";
   system ("pause");
}


Editado: Código formateado con geshi.

MAFUS

La siguiente función debe usarse sobre un array ya ordenado.
array contiene el array ordenado
tam contiene el número de elementos de dicho array

Cuando la función ha terminado

array contiene los elementos sin duplicar en su parte más baja
tam marca el índice más alto a partir del cual los datos son inválidos. Indica el nuevo tamaño del array.

El código es en C:

void array_eliminar_duplicados(int array[], size_t *tam) {
   size_t k = *tam;
   for(int i=0, j=1; j<k; ++i, ++j) {
       if(array[i] >= array[j]) {
           --*tam;
           while(array[i] >= array[j] && j<k) {
               ++j;
           }
       }
       array[i+1] = array[j];
   }
}