Ayuda con algoritmo C++

Iniciado por DagothXX1, 13 Noviembre 2011, 19:48 PM

0 Miembros y 2 Visitantes están viendo este tema.

DagothXX1

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.

тαптяα

Simple, tienes bien hecho el algoritmo, te falta retornar algo..después del bucle for.

return r;

Saludos

rir3760

Aparte del error que ya te indicaron hay otros, por ejemplo la condición de escape del bucle es:
r = num % 10;
num = num / 10;

if (N > r)
   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:
int Digit(int N, int num)
{
   int i;
   int r;
   
   if (num < 0)
      num = -num;
   
   i = 0;
   while (true){
      r = num % 10;
      num /= 10;
     
      if (i == N || num == 0)
         break;
     
      i++;
   }
   
   return (i == N) ? r : -1;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DagothXX1

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!

rir3760

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:

int Digit(int N, int num)
{
   int rv;
   
   if (num < 0)
      num = -num;
   
   if (num != 0){
      int i;
      int r = 0;
     
      for (N++, i = 0; i != N && num != 0; i++){
         r = num % 10;
         num /= 10;
      }
     
      if (i == N)
         rv = r;
      else
         rv = -1;
   }else if (N == 0)
      rv = 0;
   else
      rv = -1;
   
   return rv;
}


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

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language