Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: djbraks en 29 Enero 2020, 17:58 pm



Título: Necesito ayuda con arrays
Publicado por: djbraks en 29 Enero 2020, 17:58 pm
Buenas, tengo que hacer un programa que introduciendo 10 números por teclado, me diga cuantas veces se repite cada uno. (C++)
Esa semana no fui a clase y ando perdidisimo, espero que alguien me pueda echar una mano.


#include <stdio.h>
#include <stdlib.h>
 
main()
 
{
 
    int numero[10],size,contador=0,i=0;
    printf("Introduzca la cantidad de numeros(hasta un maximo de 10): ");
    scanf("%i",&size);
    for (i=0;i<size;i++)
    {   
     printf("Numero %i: ",i+1);
     scanf("%i",&numero);
     }
    for (i=0;i<size;i++)
    {
     if (numero==size)
     {
      contador++;
      }
      printf("%i  %i\n",numero,contador);
     }
    system("Pause");
 
 
   return 0;
}


Título: Re: Necesito ayuda con arrays
Publicado por: MCKSys Argentina en 29 Enero 2020, 18:03 pm
Hola!

Y qué es lo que llevas hecho? Muestra tus avances para que puedan ayudarte.

Debes saber que en este foro no se hacen tareas. Por las dudas, lee las reglas (https://foro.elhacker.net/programacion_cc/reglas_del_subforo-t251603.0.html).

Saludos!


Título: Re: Necesito ayuda con arrays
Publicado por: K-YreX en 30 Enero 2020, 07:44 am
Bueno, lo primero informarte de que lo pides en C++ pero tu programa tiene una pinta de C que no puede con ello... :silbar:
Y lo segundo que para futuras consultas coloca tu código entre etiquetas de Código GeSHi porque sino se dificulta mucha la lectura de éste... Gracias.

Tu código digamos que hace lo siguiente:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. main(){
  5.    int numero[10],size,contador=0,i=0; // Declaras el array de 10 elementos y un par de variables mas... De momento no va mal aunque... La funcion es: int main() ya que devuelve un int
  6.    printf("Introduzca la cantidad de numeros(hasta un maximo de 10): "); // Pides el numero de elementos a guardar
  7.    scanf("%i",&size); // Y lo guardas en size... Bien
  8.    for (i=0;i<size;i++){ // Recorres el array hasta size y pides un valor para cada posicion
  9.        printf("Numero %i: ",i+1);
  10.        scanf("%i",&numero[i]); // AQUI SUPONGO QUE USAS EL INDICE i AUNQUE COMO PUEDES VER EN TU MENSAJE NO SE VE POR NO USAR ETIQUETAS DE CODIGO GESHI
  11.    }
  12.    // A partir de aqui es cuando ya tu programa pierde el sentido...
  13.    for (i=0;i<size;i++){
  14.        if (numero==size){
  15.           contador++;
  16.        }
  17.        printf("%i  %i\n",numero,contador);
  18.    }
  19.    // No te recomiendo usar system("pause")... Es una mala practica.
  20.    // Para C++ (el de verdad...) lo recomendable es usar cin.get() que pertenece al archivo de cabecera <iostream>
  21.    // Para tu C++ (que es practicamente C) lo recomendable es usar getchar() que pertenece a <stdio.h>
  22.    system("Pause");
  23.    return 0;
  24. }

Bueno pues te voy a dar una solución intentando que sea fácil de entender (ya habrá tiempo de hacerla más eficiente una vez entendido el procedimiento). Imagina que tienes un array con valores y te piden saber cuántas veces se repite un número concreto x... Fácil:
Código
  1. int contador = 0;
  2. for(int i = 0; i < size; ++i)
  3.    if(numeros[i] == x)
  4.        ++contador;
Y ya estaría. El problema en tu caso es que no sabes cuántos valores tienes que buscar de antemano por lo que una posible solución es crear un par de arrays auxiliares:
En uno de ellos guardarás cada uno de los valores introducidos pero sólo una vez. Es decir si se introduce {1,2,3,2,3,1,3,2,4,1,2,4,1} tu array auxiliar guardará {1,2,3,4} y así puedes saber qué valores tienes que buscar.
El otro guardará cuántas veces está cada uno. Para el ejemplo anterior quedaría {4,4,3,2}, es decir, 4 veces el 1, 4 veces el 2, 3 veces el 3 y 2 veces el 4.

Creo que una buena forma de hacerlo (simple pero sin tener que recorrer todos los arrays 50 veces sería):
Código:
numeros : array de longitud 10
valoresUnicos : array de longitud 10 // ya que en el peor de los casos habra 10 elementos diferentes
sizeValoresUnicos := 0 // Numero de elementos introducidos en valoresUnicos
indiceValoresUnicos := 0 // indice para recorrer el array de valoresUnicos y a veces utilizado para el array contadores. Lo puedes ver mas abajo
contadores : array de longitud 10 // igual que antes para el peor de los casos en el cual quedaria {1,1,1,1,1,1,1,1,1,1}. IMPORTANTE: debe estar inicializado a 0

PEDIR size
PARA i := 0 HASTA size-1 HACER
    PEDIR numeros[i]
    // Buscamos si ese valor ya esta en valoresUnicos y sino lo metemos
    indiceValoresUnicos := 0
    MIENTRAS indiceValoresUnicos < sizeValoresUnicos && valoresUnicos[indiceValoresUnicos] != numeros[i] HACER // IMPORTANTE: las condiciones en ese orden o te dara problemas
        indiceValoresUnicos := indiceValoresUnicos + 1
    FIN MIENTRAS
    // Cuando salimos de ese bucle tenemos que comprobar cual ha sido la condicion que ha hecho salir
    SI indiceValoresUnicos == sizeValoresUnicos ENTONCES // Si hemos llegado hasta el final significa que no lo hemos encontrado
        valoresUnicos[indiceValoresUnicos] := numeros[i] // Entonces lo metemos
        contadores[indiceValoresUnicos] = 1; // y guardamos que ya tenemos una vez ese valor
        sizeValoresUnicos := sizeValoresUnicos + 1 // y este array ya tiene 1 elemento mas
    SINO // En cambio si no hemos llegado hasta el final significa que si lo hemos encontrado. Entonces incrementamos en 1 el numero de veces que ha salido ese valor
        contadores[indiceValoresUnicos] := contadores[indiceValoresUnicos] + 1
    FIN SI
FIN PARA

Ahora tienes que entender el algoritmo y una vez lo hayas entendido tienes que pasarlo a C/C++ ya que como puedes ver no he usado la sintaxis de estos lenguajes. Si entiendes cómo funciona, traducirlo resulta muy sencillo.
Si tienes alguna duda o algo no te funciona, siempre puedes preguntar pero recuerda utilizar las etiquetas para facilitarnos la lectura de tu código.