Necesito ayuda con arrays

Iniciado por djbraks, 29 Enero 2020, 17:58 PM

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

djbraks

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;
}

MCKSys Argentina

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.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


K-YreX

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 (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>

main(){
    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
    printf("Introduzca la cantidad de numeros(hasta un maximo de 10): "); // Pides el numero de elementos a guardar
    scanf("%i",&size); // Y lo guardas en size... Bien
    for (i=0;i<size;i++){ // Recorres el array hasta size y pides un valor para cada posicion
        printf("Numero %i: ",i+1);
        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
    }
    // A partir de aqui es cuando ya tu programa pierde el sentido...
    for (i=0;i<size;i++){
        if (numero==size){
           contador++;
        }
        printf("%i  %i\n",numero,contador);
    }
    // No te recomiendo usar system("pause")... Es una mala practica.
    // Para C++ (el de verdad...) lo recomendable es usar cin.get() que pertenece al archivo de cabecera <iostream>
    // Para tu C++ (que es practicamente C) lo recomendable es usar getchar() que pertenece a <stdio.h>
    system("Pause");
    return 0;
}


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 (cpp) [Seleccionar]

int contador = 0;
for(int i = 0; i < size; ++i)
    if(numeros[i] == x)
        ++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):

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.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;