Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Dacan en 13 Marzo 2013, 16:03 pm



Título: Es posible hacer esto sin arreglos?
Publicado por: Dacan en 13 Marzo 2013, 16:03 pm
Escriba un programa que reciba como entrada 10 números introducidos por teclado, y nos indique si es que se repitió algún número, y si es así, cuantas veces se repitió.

Mi idea:

Código:
#include <stdio.h>
main(){
int i,n,contador,numero;
contador = 0;
numero = 0;

for (i=1;i<=10;i++){
   
printf("Introduzca un numero (%d): \n",i);
scanf("%d",&n);

// COMO COMPROBAR ESO?????
numero = n;
if(n == numero){
contador++;     


}

printf("Un numero se repitio %d ves/veces",contador);
getch();       
}


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: amchacon en 13 Marzo 2013, 16:36 pm
Tienes que guardar todos los números obligatoriamente, hay una posibilidad de hacerlo sin arreglos (encadenar los numeros por punteros) pero es muy complicado y menos eficiente que un arreglo.


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: Puntoinfinito en 13 Marzo 2013, 16:49 pm
Escriba un programa que reciba como entrada 10 números introducidos por teclado, y nos indique si es que se repitió algún número, y si es así, cuantas veces se repitió.

Mi idea:

Código:
#include <stdio.h>
main(){
int i,n,contador,numero;
contador = 0;
numero = 0;

for (i=1;i<=10;i++){
    
printf("Introduzca un numero (%d): \n",i);
scanf("%d",&n);

// COMO COMPROBAR ESO?????
numero = n;
if(n == numero){
contador++;    
}  

}

printf("Un numero se repitio %d ves/veces",contador);
getch();      
}


Los arreglos pueden ser muy útiles aquí, no entiendo porque no hacerlos servir xD

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.  
  8. int com;
  9.  
  10. int numero[10];
  11.  
  12. for (int i = 0; i < 10; i++) {
  13.  
  14. cout << endl << "Pon un numero >> ";
  15.  
  16. cin >> numero[i];
  17.  
  18. }
  19.  
  20. for (int i = 0; i < 10; i++) {
  21.  
  22. com = numero[i];
  23.  
  24. for (int u = 0; i < 10; u++) {
  25.  
  26. if (com == numero[u]) {
  27. cout << "nNumero repetido";
  28. return 0;
  29. }
  30.  
  31. }
  32.  
  33. }
  34. cout << "Ningun valor repetido";
  35. return 0;
  36.  
Lo acabo de escribir muy rápido, tal vez algo haya salido mal, pero de todos modos es para que te hagas una idea de el uso que pueden dar en ejercicios como estos

Saludos


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: naderST en 13 Marzo 2013, 16:51 pm
Usando un conjunto de bits lo podrías hacer, pero no puedes usar un número mayor que 64


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: Dacan en 13 Marzo 2013, 17:17 pm
Es que me pusieron eso de tarea y aun no han dado arreglos, por lo cual tendria que almacenar todos los numeros en variables y hacer un monton de if...

Gracias de todas formas.


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: Puntoinfinito en 13 Marzo 2013, 18:11 pm
Es que me pusieron eso de tarea y aun no han dado arreglos, por lo cual tendria que almacenar todos los numeros en variables y hacer un monton de if...

Gracias de todas formas.

Como tu dices, esto solo lo puedes hacer con muchos ifs, es la manera, sino, sorprende el profesor con unas buenas matrices XD


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: naderST en 13 Marzo 2013, 18:25 pm
Usa arreglos y argumenta tu solución (sobran argumentos)


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: fary en 13 Marzo 2013, 20:01 pm
Haber, poder se puede pero es como si intentases crear un array en ASM.

Suponiendo que cada numero ocupa un tamaño de 4bytes solo tienes que crear un buffer de longitud 40 (10 numeros por 4 bytes) donde en la posicion 1 pones el primer numero en la posicion 4 el segundo numero en la posicion 8 el tercer numero y así consecutivamente.... En realidad así es como trabajan los arrays a nivel ensamblador solo que no lo vemos debido a que se programa en niveles superiores.

un saludo!



Mira edito el tema para dejarte como seria que avisara si se repite un numero, solo tienes que añadir que se cuenten las veces que se repita:

Código
  1. // mDrinky
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. int main()
  7. {
  8.    char * Buffer = malloc(10);
  9.    int numero;
  10.    int i = 0;
  11.    int a;
  12.  
  13.    numero = 0;
  14.    memset(Buffer,0,10);
  15.  
  16.    printf("Ingrese 10 numeros: ");
  17.  
  18.    while (i<10)
  19.    {
  20.        a = 0;
  21.        scanf("%i",&numero);
  22.  
  23.        numero += 0x30;
  24.        Buffer[i] = numero;
  25.  
  26.        while(a<i)
  27.        {
  28.            if (Buffer[a] == Buffer[i])
  29.            {
  30.                printf("Numero repetido!");
  31.                return 1;
  32.            }
  33.            a++;
  34.        }
  35.        i++;
  36.    }
  37.  
  38.    return 0;
  39. }
  40.  



Título: Re: Es posible hacer esto sin arreglos?
Publicado por: rir3760 en 14 Marzo 2013, 03:51 am
Como ya se comento no es posible sin el uso de un array o, como en el programa de mDrinky, mediante la reserva de memoria en tiempo de ejecución.

En cuanto a este ultimo considerando que se trabaja con enteros se pueden sustituir las llamadas a malloc y memset (su prototipo se encuentra en <string.h>) por una llamada a calloc. Y si la intención es leer números de un solo dígito mejor indicarlo así en la llamada a scanf con "%1d".

Por ultimo ya que en este caso el rango de números es pequeño (0 a 9) se puede utilizar el array como uno de banderas indicando si el numero ya fue introducido:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char *Buffer = calloc(10, 1);
  7.   int numero;
  8.   int i;
  9.  
  10.   printf("Ingrese 10 numeros: ");
  11.   for (i = 0; i < 10; i++){
  12.      scanf("%1d", &numero);
  13.  
  14.      if (Buffer[numero]++){
  15.         puts("Numero repetido!");
  16.         break;
  17.      }
  18.   }
  19.  
  20.   return EXIT_SUCCESS;
  21. }

Un saludo


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: 85 en 15 Marzo 2013, 02:40 am
Lo que necesitás es almacenamiento para 10 enteros, por lo tanto por una cuestión de lógica , necesitás un espacio para 10 enteros.

Digo que son enteros al ver tu código.

tus posibilidades son usar un arreglo de 10 , o un buffer de asignación dinámica, o declarar 10 variables de enteros.
No creo que tu profesor te permita usar tantas variables, a menos que estás en un curso de ingreso XD


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: pacoperico en 16 Marzo 2013, 12:36 pm
Si la cuestion es que no puedes usar arreglos una posible alternativa podria ser usar una estructura. Seria una estructura de diez miembros de tipo int y cada uno almacenaria cada valor que has introducido por teclado, una vez hecho esto solo tendrias que comprobar cada miembro de la estructura para ver si alguno se repite.


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: DaniekL en 16 Marzo 2013, 20:54 pm
Si puedes usar punteros lo que puedes hacer es "fingir" el array con las direcciones de memoria.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void) {
  5.  
  6. int *p, i, j, c=0;
  7.  
  8. p = malloc(sizeof(int)*10);
  9. for(i=0;i<10;i++) {
  10. printf("Introduzca un numero: ");
  11. scanf("%d", p+(sizeof(int)*i));
  12. for(j = 0; j < i; j++) {
  13. if(*(p+(sizeof(int)*i)) == *(p+(sizeof(int)*j))) {
  14. c++;
  15. }
  16. }
  17. }
  18. printf("Han ocurrido %d coincidencias\n", c);
  19. return 0;
  20. }


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: mr.blood en 23 Marzo 2013, 12:48 pm
Si he entendido bien el problema no es que no pueda hacerlo con arrays, es que aun no los han dado.



Como que no es posible sin arrays? No es eficiente ni limpio, pero posible es.

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int num;
  6.    char num0=0, num1=0, num2=0, num3=0, num4=0, num5=0, num6=0, num7=0, num8=0, num9=0, i;
  7.    puts("Introduce 10 numeros\n");
  8.    for(i=0;i<10;i++)
  9.    {
  10.        scanf("%i",&num);
  11.        fflush(stdin);
  12.        switch(num)
  13.        {
  14.            case 0:
  15.                num0++;
  16.                break;
  17.            case 1:
  18.                num1++;
  19.                break;
  20.            case 2:
  21.                num2++;
  22.                break;
  23.            case 3:
  24.                num3++;
  25.                break;
  26.            case 4:
  27.                num4++;
  28.                break;
  29.            case 5:
  30.                num5++;
  31.                break;
  32.            case 6:
  33.                num6++;
  34.                break;
  35.            case 7:
  36.                num7++;
  37.                break;
  38.            case 8:
  39.                num8++;
  40.                break;
  41.            case 9:
  42.                num9++;
  43.                break;
  44.        }
  45.    }
  46.    if(num0>0)
  47.    {
  48.        printf("El 0 se repite %i veces\n", num0);
  49.    }
  50.    if(num1>0)
  51.    {
  52.        printf("El 1 se repite %i veces\n", num1);
  53.    }
  54.    if(num2>0)
  55.    {
  56.        printf("El 2 se repite %i veces\n", num2);
  57.    }
  58.    if(num3>0)
  59.    {
  60.        printf("El 3 se repite %i veces\n", num3);
  61.    }
  62.    if(num4>0)
  63.    {
  64.        printf("El 4 se repite %i veces\n", num4);
  65.    }
  66.    if(num5>0)
  67.    {
  68.        printf("El 5 se repite %i veces\n", num5);
  69.    }
  70.    if(num6>0)
  71.    {
  72.        printf("El 6 se repite %i veces\n", num6);
  73.    }
  74.    if(num7>0)
  75.    {
  76.        printf("El 7 se repite %i veces\n", num7);
  77.    }
  78.    if(num8>0)
  79.    {
  80.        printf("El 8 se repite %i veces\n", num8);
  81.    }
  82.    if(num9>0)
  83.    {
  84.        printf("El 9 se repite %i veces\n", num9);
  85.    }
  86.    getchar();
  87.    return 0;
  88. }
  89.  

Otro modo mas eficiente seria algo como:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.    int num, i;
  7.    char repes[10];
  8.    memset(repes, 0, 10);
  9.    puts("Introduce 10 numeros\n");
  10.    for(i=0;i<10;i++)
  11.    {
  12.        scanf("%i",&num);
  13.        fflush(stdin);
  14.        repes[num]++;
  15.    }
  16.    for(i=0;i<10;i++)
  17.    {
  18.        if(repes[i]>0)
  19.        {
  20.            printf("Numero %i repetido %i veces\n", i, repes[i]);
  21.        }
  22.    }
  23.    getchar();
  24.    return 0;
  25. }

Aunque pueda mejorarse ;).

Sa1uDoS


Título: Re: Es posible hacer esto sin arreglos?
Publicado por: 85 en 23 Marzo 2013, 13:50 pm
Es raro que le hayan dicho que no puede usar arrays, structs, asignación dinámica, punteros, etc
le queda usar 10 variables enteras, o eso que hiciste mr.blood que para listar ya tiene el número dentro del string. Si fuera que son números del 0 al 9.
Ese profesor debe ser cualquiera para requerir estas cosas.. o se trata de un curso de ingreso o algo