Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DagothXX1 en 13 Noviembre 2011, 19:48 pm



Título: Ayuda con algoritmo C++
Publicado por: DagothXX1 en 13 Noviembre 2011, 19:48 pm
Hola. Estoy iniciándome en la programación (Dev C++) y tengo problemas con un algoritmo que estoy haciendo, el cual no puedo dar con el error. Lo que tengo que hacer es implementar una función dígito(N,num) que me devuelva el digito N-ésimo de un número num, teniendo en cuenta que el dígito 0 es el dígito más a la derecha (el menos significativo). La función tiene que devolver -1 si el numero no tiene suficientes dígitos y también tener en cuenta si el N pueda ser un número negativo.

Acá les paso un ejemplo:
digito (0,3456), devuelve 6
digito(1, -3456) devuelve 5
digito(4, 3456) devuelve -1

Acá les muestro el código que hice:

int Digit (int N, int num)
{
  int r;
 
  for (int i=0; i<N; i++)
  {
    r = num%10;
    num = num/10;

    if (N>r)
     return -1;
  }
}

int main()
{
  int N, num;

  cout<<"Ingrese la posicion: ";
  cin>>N;

  cout<<"ingrese el numero a evaluar: ";
  cin>>num;

  cout<<"La cifra es: "<<Digit(N,num)<<endl;
  system ("PAUSE");
}


Quedo a la espera de una respuesta para saber en qué me equivoqué, y desde ya, muchas gracias.


Título: Re: Ayuda con algoritmo C++
Publicado por: тαптяα en 13 Noviembre 2011, 20:52 pm
Simple, tienes bien hecho el algoritmo, te falta retornar algo..después del bucle for.

Código:
return r;

Saludos


Título: Re: Ayuda con algoritmo C++
Publicado por: rir3760 en 14 Noviembre 2011, 03:53 am
Aparte del error que ya te indicaron hay otros, por ejemplo la condición de escape del bucle es:
Código
  1. r = num % 10;
  2. num = num / 10;
  3.  
  4. if (N > r)
  5.   return -1;
Esta mal (revisa a lápiz y papel que pasa si quieres obtener el dígito de indice 3 del numero 3210).

Tampoco consideras, como indica el enunciado, si el numero es negativo. Aquí lo mejor seria revisar que dice el estándar sobre "quien se queda con el signo" (hasta donde recuerdo es "implementation defined").

También faltan las directivas de inclusión (supongo solo fue un olvido).

Una forma de implementar la función con un bucle "feo" (para así evitar el caso especial del numero cero) es:
Código
  1. int Digit(int N, int num)
  2. {
  3.   int i;
  4.   int r;
  5.  
  6.   if (num < 0)
  7.      num = -num;
  8.  
  9.   i = 0;
  10.   while (true){
  11.      r = num % 10;
  12.      num /= 10;
  13.  
  14.      if (i == N || num == 0)
  15.         break;
  16.  
  17.      i++;
  18.   }
  19.  
  20.   return (i == N) ? r : -1;
  21. }

Un saludo


Título: Re: Ayuda con algoritmo C++
Publicado por: DagothXX1 en 14 Noviembre 2011, 12:24 pm
Hola nuevamente. Muchísimas gracias a todos aquellos que se han tomado un poquito de su tiempo para contestar mi duda. Disculpen si mi pregunta ahora suena un poco "mal", pero quería saber si no hay una forma más simple de resolver los errores que me marcaste rir3760, es decir usando sentencias un tanto más "básicas" digamos, dado que, como recién me estoy iniciando, hay varias de ellas de las cuales no comprendo bien su funcionamiento. Con respecto a lo de las directivas de inclusión, eso lo hice a drede para no hacer tan largo el código y centrarme directamente en la función y el programa principal. Quedo a la espera de la respuesta, y nuevamente muchas gracias por ayudarme!


Título: Re: Ayuda con algoritmo C++
Publicado por: rir3760 en 15 Noviembre 2011, 00:36 am
El problema es, no se puede reducir mucho y utilizando formas mas simples lo único que se consigue es incrementar el tamaño de la función.

Para empezar se puede manejar al numero cero como un caso especial. Eso deja el bucle principal de una forma mas "natural" y por ultimo se puede eliminar el uso del operador condicional "? :" quedando en:
Código
  1. int Digit(int N, int num)
  2. {
  3.   int rv;
  4.  
  5.   if (num < 0)
  6.      num = -num;
  7.  
  8.   if (num != 0){
  9.      int i;
  10.      int r = 0;
  11.  
  12.      for (N++, i = 0; i != N && num != 0; i++){
  13.         r = num % 10;
  14.         num /= 10;
  15.      }
  16.  
  17.      if (i == N)
  18.         rv = r;
  19.      else
  20.         rv = -1;
  21.   }else if (N == 0)
  22.      rv = 0;
  23.   else
  24.      rv = -1;
  25.  
  26.   return rv;
  27. }

El codigo es mas facil de seguir pero, honestamente, no me gusta nada (prefiero la primera forma).

Un saludo