elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Necesito ayuda para que el programa pueda eliminar números repetidos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Necesito ayuda para que el programa pueda eliminar números repetidos  (Leído 8,872 veces)
RedHood

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Necesito ayuda para que el programa pueda eliminar números repetidos
« en: 6 Mayo 2021, 04:35 am »

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <time.h>
  6. #include <string>
  7. using namespace std;
  8.  
  9. //Se generan variables globales para evitar el paso de parametros o argumentos entre las funciones
  10. int i=0, j=0, k=0, l=0;
  11. int n=0;
  12. int cn=0;                   //Numero de datos leidos y a ordenar
  13. int guardacn;
  14. int temp;
  15. int arreglo[1000000];         //maximo se podran ordenar 1000000 de numeros
  16. clock_t t_ini, t_fin;
  17. double secs;
  18. string nombrearchivo;      //nombre del archivo de entrada
  19.  
  20. int continuar = 0;
  21. int numBuscar = 0;
  22. int bandera = 0;
  23.  
  24.  
  25. struct Entrada {           //declaracion de estructura que permiten leer y copiar los numeros en el arreglo "arreglo"
  26. int valor;
  27. } entrada;
  28.  
  29.  
  30. //*****  Prototipo o definición del metodo de ordenamiento
  31. int busSecElimDup();
  32. int busqueda();
  33. void leeArchivo();
  34.  
  35.  
  36. //**** Funcion de lectura del archivo
  37. //lee los numeros contenidos en el archivo y los copia en el arreglo "arreglo"
  38. //Se dejan los numeros en un arreglo llamado "arreglo" para que la función (algoritmo o metodo) de Burbuja los pueda ordenar
  39. void leeArchivo(){
  40. FILE *archivo1;                                  //Crea un apuntador de archivo, utilizando en la función fopen, el apuntador se le asigná el llamado al archivo
  41.    cout<<"\n Teclea el nombre del archivo de entrada (sin espacio, ni caracteres especiales):   ";
  42. cin>>nombrearchivo;
  43. nombrearchivo+= ".txt"; // Se le agrega al nombre del archivo la extension ".txt"
  44. archivo1 = fopen(nombrearchivo.c_str(), "r");   // Se abre el archivo de modo lectura  
  45. if(archivo1== NULL ){                       //    el archivo contiene los numeros a ordenar
  46.      cout<<"\n No se puede abrir el archivo "; //si no se puede abrir el archivo termina con error el programa
  47.  exit(1);
  48. }                                  
  49. else{
  50.  cout<<"\n Se abrio el archivo "<<nombrearchivo.c_str()<<"  correctamente";
  51.     }
  52.  
  53.    //Lee el archivo y copia los numeros contenidos en el archivo en el arreglo "arreglo"  
  54.    cn=0;
  55.    for (int i=0; !feof(archivo1); i++) {          // Repite hasta que sea el fin del archivo
  56.        fscanf (archivo1, "%i", &entrada.valor);   // Lee el numero contenido en el archivo y lo guarda en la estructura
  57.        arreglo[i]=entrada.valor;                    // El numero contenido en la estructura lo pasa al arreglo "arreglo"
  58.        cn++;                                      // suma 1 al contador de numeros leidos
  59. }
  60. cn--;
  61. cout<<"\n\nSe ha generado el arreglo con los datos del archivo de entrada";
  62. cout<<"\nLa cantidad de numeros contenidos en el arreglo son:  "<<cn<<"\n\n";
  63. n=cn;
  64. fclose(archivo1);                             //cierra el archivo de entrada
  65. system ("pause");
  66. }
  67.  
  68.  
  69.  
  70. //Llama en general a una funcion de busqueda
  71. int busqueda() {
  72.    busSecElimDup();            //Se utiliza cuando los datos estan desordenados
  73.    return (0);
  74. }
  75.  
  76.  
  77. //Metodo de Busqueda Secuencial
  78. int busSecElimDup(){
  79.   int contador = 0;
  80.   cout<<"\nDato originales\n";
  81.   for (i=0; i<n; i++){
  82. cout<<arreglo[i]<<"  ";
  83. }
  84. // Busca duplicados dentro del arreglo
  85. for (i=0; i<n; i++) {
  86.   if  (arreglo [i] == arreglo[i+1]){
  87.             // corrimiento a la izquierda
  88.             for (j=i;  j < n;   j++) {           // eliminar con corrimiento a la izquierda
  89.               arreglo [j-1] = arreglo[j];
  90.  
  91.             }
  92.             contador ++;
  93. }
  94. }
  95. cout<<endl;
  96. cout<<"\nDato eliminados\n";
  97. for (i=0; i<n; i++){
  98. cout<<arreglo[i]<<"  ";
  99. }
  100.    cout<<endl;
  101.    return (0);
  102.  
  103.  
  104. }
  105.  
  106.  
  107.  
  108. //*** Funcio main ()
  109. int main() {
  110. continuar = 1;
  111.    leeArchivo();  
  112. n = cn;                        // lee y copia en una arreglo los numeros contenidos en el archivo de entrada
  113. /*    do {
  114.     system ("cls");
  115.     for (l=0; l<n; l++){
  116.     cout<<arreglo[l]<<"     ";
  117. }
  118. cout<<endl<<endl;
  119. cout<<"\n\nTeclee el numero a buscar o consultar:  ";
  120. cin>>numBuscar;
  121. */
  122.        t_ini = clock();                       // guarda tiempo inicial (antes de ordenar)
  123.  
  124.        busqueda ( );                          //Llama al metodo de ordenamiento
  125.  
  126.        t_fin = clock();   // guarda tiempo final (despues de ordenar)
  127.  
  128.                                               // Imprime el tiempo que se tardo el metodo en ordenar los datos
  129.        secs = (double)(t_fin - t_ini) / (double)CLOCKS_PER_SEC; // determina los milisegundo utilizados
  130.        printf("%.16g milisegundos", secs * 1000.0);   // imprime el tiempo utilizado
  131.        cout<<"\n\n";                          // se utiliza printf porque es una sentencia mas poderosa que cout
  132.                                               // permite ver cantidades muy pequeñas o muy grandes
  133. /*      
  134. cout<<"\nDesea consultar otro numero (SI = 1,  NO = 0)";
  135.         cin>>continuar;
  136. cout<<"\n\n";
  137.  
  138. } while (continuar == 1);
  139. */
  140. cout<<"\n\nMetodo de Busqueda Secuencial con eliminacion concluido \n\n";
  141.    system ("pause");
  142. }

Editado: Código formateado con geshi.


« Última modificación: 6 Mayo 2021, 06:20 am por WHK » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Necesito ayuda para que el programa pueda eliminar números repetidos
« Respuesta #1 en: 6 Mayo 2021, 14:05 pm »

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:

Código
  1. void array_eliminar_duplicados(int array[], size_t *tam) {
  2.    size_t k = *tam;
  3.    for(int i=0, j=1; j<k; ++i, ++j) {
  4.        if(array[i] >= array[j]) {
  5.            --*tam;
  6.            while(array[i] >= array[j] && j<k) {
  7.                ++j;
  8.            }
  9.        }
  10.        array[i+1] = array[j];
  11.    }
  12. }


« Última modificación: 6 Mayo 2021, 16:19 pm por MAFUS » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines