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

[SOLUCIONADO] Valores repetidos en un arreglo en C

Estas en el tema de Valores repetidos en un arreglo en C en el foro de C/C++ en Foros del Web. Ejemplo: Si el arreglo original es 8 4 8 5 4, entonces el arreglo se transformará a: 8 4 -1 5 -1 y se devolverá ...
  #1 (permalink)  
Antiguo 30/03/2015, 16:30
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Pregunta Valores repetidos en un arreglo en C

Ejemplo: Si el arreglo original es 8 4 8 5 4, entonces el arreglo se transformará a: 8 4 -1 5 -1 y se devolverá como cantidad de
repeticiones 2.

Código:
//Declaración de variables
    int liN, liContador, laiArreglo[10];

    //Entrada de datos
    do
    {
        printf("Cantidad de componentes del arreglo: ");
        scanf("%d", &liN);

        if (liN <= 0)
            printf("\n\tError!, debe ingresar un valor mayor que 0.\n\n");
    } while (liN <= 0);

    for (liContador = 0; liContador < liN; liContador++)
    {
        do
        {
            printf("Valor #%d: ", liContador + 1);
            scanf("%d", &laiArreglo[liContador]);

            if (laiArreglo[liContador] < 0)
                printf("\n\tError!, debe ingresar un valor mayor que 0.\n\n");
        } while (laiArreglo[liContador] < 0);
    }

    //Procesamiento
    //Funcion(liN, laiArreglo);
    int liContador1, liContador2;

    for (liContador1 = 0; liContador1 < liN - 1; liContador1++)
    {
        for (liContador2 = liContador1 + 1; liContador2 < liN; liContador2++)
        {
            if (laiArreglo[liContador2] == laiArreglo[liContador1])
                laiArreglo[liContador2] = -1;
        }
    }


Como pueden ver, no logro hacerlo, estoy vuelto loco y ya no se que hacer :(
  #2 (permalink)  
Antiguo 30/03/2015, 18:43
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Valores repetidos en un arreglo en C

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main () {
  4.     int salir = 0;
  5.     int n = 0;
  6.     int numeros[] = {8, 4, 8, 5, 4};
  7.     int repeticiones = 0; //contador de repeticiones
  8.     int i, z;
  9.  
  10.     //Pasamos por cada casilla comparando con las demas.
  11.     for ( i = 0; i < sizeof ( numeros ) / sizeof ( numeros[0] ); i++ ) {
  12.         //Pasamos por alto comparaciones de casillas con un valor -1 ya que quiere decir que -1 es repetido y ya ha sido marcado.
  13.         if ( numeros[i] != -1 ) {
  14.             //comparamos cada casilla con todas las demas...
  15.             for ( z = 0; z < sizeof ( numeros ) / sizeof ( numeros[0] ); z++ ) {
  16.                 //...pero solo si no se trata de la misma casilla, ya que sabemos que se trata del mismo numero y no se puede comparar un numero con el mismo XD
  17.                 if ( i != z ){
  18.                     //Nos quedamos con el primer numero que no repita, los demas  que se repiten se modifican a -1 y se añaden +1 al contador.  
  19.                     if ( numeros[i] == numeros[z] ){
  20.                         numeros[z] = -1;
  21.                         repeticiones++;
  22.            
  23.            
  24.                     }
  25.                 }
  26.             }
  27.         }
  28.        
  29.     }
  30.    
  31.     //imprimimos arreglo modificado
  32.     for ( i = 0; i < sizeof ( numeros ) / sizeof ( numeros[0] ); i++ ) {
  33.         printf ("%d, ", numeros[i]);
  34.    
  35.     }
  36.     printf("Numero de repeticiones: %d\n\n", repeticiones );
  37.    
  38.     getchar();
  39.     return 0;
  40. }
  #3 (permalink)  
Antiguo 30/03/2015, 19:58
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Valores repetidos en un arreglo en C

Cita:
Iniciado por vangodp Ver Mensaje
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main () {
  4.     int salir = 0;
  5.     int n = 0;
  6.     int numeros[] = {8, 4, 8, 5, 4};
  7.     int repeticiones = 0; //contador de repeticiones
  8.     int i, z;
  9.  
  10.     //Pasamos por cada casilla comparando con las demas.
  11.     for ( i = 0; i < sizeof ( numeros ) / sizeof ( numeros[0] ); i++ ) {
  12.         //Pasamos por alto comparaciones de casillas con un valor -1 ya que quiere decir que -1 es repetido y ya ha sido marcado.
  13.         if ( numeros[i] != -1 ) {
  14.             //comparamos cada casilla con todas las demas...
  15.             for ( z = 0; z < sizeof ( numeros ) / sizeof ( numeros[0] ); z++ ) {
  16.                 //...pero solo si no se trata de la misma casilla, ya que sabemos que se trata del mismo numero y no se puede comparar un numero con el mismo XD
  17.                 if ( i != z ){
  18.                     //Nos quedamos con el primer numero que no repita, los demas  que se repiten se modifican a -1 y se añaden +1 al contador.  
  19.                     if ( numeros[i] == numeros[z] ){
  20.                         numeros[z] = -1;
  21.                         repeticiones++;
  22.            
  23.            
  24.                     }
  25.                 }
  26.             }
  27.         }
  28.        
  29.     }
  30.    
  31.     //imprimimos arreglo modificado
  32.     for ( i = 0; i < sizeof ( numeros ) / sizeof ( numeros[0] ); i++ ) {
  33.         printf ("%d, ", numeros[i]);
  34.    
  35.     }
  36.     printf("Numero de repeticiones: %d\n\n", repeticiones );
  37.    
  38.     getchar();
  39.     return 0;
  40. }
wow hermano muchisimas gracias, bastante ayuda me diste. No tengo como agradecertelo, nunca iba a llegar a esas conclusiones, aun me falta mucho por aprender.

Una pregunta hermano, funciona con cualquier cantidad de valores en el arreglo?. Si es mas de 5 en este caso?.

otra cosa, no entendi esta parte:
Código:
for ( i = 0; i < sizeof ( numeros ) / sizeof ( numeros[0] ); i++ ) {
por qué divides?.

Última edición por RGT; 30/03/2015 a las 20:12
  #4 (permalink)  
Antiguo 31/03/2015, 00:41
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Valores repetidos en un arreglo en C

Cita:
Iniciado por RGT Ver Mensaje
Una pregunta hermano, funciona con cualquier cantidad de valores en el arreglo?. Si es mas de 5 en este caso?.

otra cosa, no entendi esta parte:
Código:
for ( i = 0; i < sizeof ( numeros ) / sizeof ( numeros[0] ); i++ ) {
por qué divides?.
sizeof( numeros ) te va a devolver el número de bytes que "ocupa" la variable "numeros"... sizeof( numeros[ 0 ] ), que podrías ponerlo también como sizeof( int ) puesto que cada item de "numeros" es un entero, te va a devolver el tamaño del tipo int... luego si tienes que el arreglo ocupa, por ejemplo 20 bytes y que cada int ocupa 4 bytes tienes 20/4=5 que es el número de elementos del array.

La gracia de usar "sizeof( numeros[0] )" es que si después cambias el tipo del arreglo, por ejemplo "double numeros[5]", no tendrás que tocar nada en el bucle para que todo funcione correctamente, ya que sizeof(numeros[0]) SIEMPRE te va a devolver el tamaño de cada elemento del arreglo.

Con todo lo anterior te respondo a las dos preguntas:

* Sí, como has visto sirve para cualquier número de elementos
* Ya has visto el motivo por el que se divide

Un saludo
  #5 (permalink)  
Antiguo 31/03/2015, 01:02
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Valores repetidos en un arreglo en C

si lo pones mas numeros a la hora de declarar si, de forma manual con un scanf ya no te serviría, por que le tendrías que dar un tamaño fijo al arreglo, no se lo tomaría el tamaño de forma automática.

Si tenemos un array como int numeros[] = {8, 4, 8, 5, 4}; automáticamente toma un tamaño de 5, ya que son 5 elementos. XD pero ese tamaño no lo puse yo, simplemente fue añadiendo números al arreglo a mi bola, para saber cuantos elementos tengo a la hora de un for y no tener que estar contándolos, hago sizeof ( numeros ) / sizeof ( numeros[0] ).

Si recuerdas sizeof retorna la cantidad en bytes que tiene un tipo de dato, un simples char ocupa 1 byte, no necesitaría dividir, si hago sizeof( char ) me devuelve 1 que es un byte. Lo puedes comprobar haciendo printf("%d", sizeof(char));.

Bien.. Si hago un printf("%d", sizeof(int)); en mi ordenador va imprimir un 4, que son 4 bytes, el tamaño de un tipo de dato puede variar de un ordenador a otro. Pero la cosa es que si hago un sizeof de un array de enteros, me va a dar la cantidad de elementos que contiene el array pero en bytes que en mi ordenador son 4 veces más, o sea que si tengo 5 elementos en el array me va dar un 5*4bytes, eso no me da en absoluto la cantidad de elementos que tiene el array, si no que 4 veces más(en mi pc, en otro puede variar). La solución es dividir sizeof(array) por sizeof(int) que se traduce dividir 5 elementos que ocupan 4 bytes cada uno y que en un total tiene 20bytesTotal=5elementos*4bytes. Si divido por la primera posición del arreglo es lo mismo que dividir por un entero. En otras palabras: sizeof(array[0]) es lo mismo que sizeof(int), si array fuera un int.

Lo que hace sizeof ( array ) / sizeof ( array[0] ) es decirme la cantidad de elementos que tiene un arreglo sea del tipo que sea. Muy útil para saber el tamaño de arreglos que no has dado un tamaño fijo, si no que han tomado el tamaño de forma automática.
  #6 (permalink)  
Antiguo 31/03/2015, 16:37
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Valores repetidos en un arreglo en C

Cita:
Iniciado por vangodp Ver Mensaje
si lo pones mas numeros a la hora de declarar si, de forma manual con un scanf ya no te serviría, por que le tendrías que dar un tamaño fijo al arreglo, no se lo tomaría el tamaño de forma automática.

Si tenemos un array como int numeros[] = {8, 4, 8, 5, 4}; automáticamente toma un tamaño de 5, ya que son 5 elementos. XD pero ese tamaño no lo puse yo, simplemente fue añadiendo números al arreglo a mi bola, para saber cuantos elementos tengo a la hora de un for y no tener que estar contándolos, hago sizeof ( numeros ) / sizeof ( numeros[0] ).

Si recuerdas sizeof retorna la cantidad en bytes que tiene un tipo de dato, un simples char ocupa 1 byte, no necesitaría dividir, si hago sizeof( char ) me devuelve 1 que es un byte. Lo puedes comprobar haciendo printf("%d", sizeof(char));.

Bien.. Si hago un printf("%d", sizeof(int)); en mi ordenador va imprimir un 4, que son 4 bytes, el tamaño de un tipo de dato puede variar de un ordenador a otro. Pero la cosa es que si hago un sizeof de un array de enteros, me va a dar la cantidad de elementos que contiene el array pero en bytes que en mi ordenador son 4 veces más, o sea que si tengo 5 elementos en el array me va dar un 5*4bytes, eso no me da en absoluto la cantidad de elementos que tiene el array, si no que 4 veces más(en mi pc, en otro puede variar). La solución es dividir sizeof(array) por sizeof(int) que se traduce dividir 5 elementos que ocupan 4 bytes cada uno y que en un total tiene 20bytesTotal=5elementos*4bytes. Si divido por la primera posición del arreglo es lo mismo que dividir por un entero. En otras palabras: sizeof(array[0]) es lo mismo que sizeof(int), si array fuera un int.

Lo que hace sizeof ( array ) / sizeof ( array[0] ) es decirme la cantidad de elementos que tiene un arreglo sea del tipo que sea. Muy útil para saber el tamaño de arreglos que no has dado un tamaño fijo, si no que han tomado el tamaño de forma automática.
hola,
valla ya veo, es muy útil si.

Entonces, con esto:
sizeof ( arreglo ) / sizeof ( arreglo[0] )

puedo tener la cantidad de valores que tiene el arreglo.
perfecto hermano!, me has ayudado bastante no se como agradecertelo, he aprendido cosas nuevas contigo, en hora buena!!

Etiquetas: arreglo, funcion, int, repetidos
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 22:11.