Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] problema al crear funcion

Estas en el tema de problema al crear funcion en el foro de .NET en Foros del Web. hola, resulta que tengo un problema para crear una funcion, en teoria es algo muy simple pero me tira un error de que no todas ...
  #1 (permalink)  
Antiguo 02/05/2013, 18:07
 
Fecha de Ingreso: mayo-2013
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
problema al crear funcion

hola, resulta que tengo un problema para crear una funcion, en teoria es algo muy simple pero me tira un error de que no todas las rutas retornan un valor. es algo muy logico lo q me dice pero no se como solucionarlo. la funcion toma un numero y me dice cual es el primer numero contando de ese numero hacia abajo por el cual es divisible. ejemplo: le doy un 6 y me devuelve el 3.
la cosa es que hace tiempo que no hago nada en este lenguaje porque me habia centrado en programacion funcional para la facultad y ando medio perdido. les pongo el codigo y aver si me dan una solucion. gracias

public static int MD(int a)
{
int n;
{
for (n = a; n == 2; n = n - 1)
if (n % a == 0)
{
return n;
}

}
}
//return ????.. si pongo algo aca no me toma en cuenta el ciclo y va directo al valor que le ponga aca para q devuelva. y en realidad por lo que quiero que haga la funcion ni siquiera tendria que llegar a este return porque si o si abria un a|n en el rango del ciclo. gracias
  #2 (permalink)  
Antiguo 02/05/2013, 19:56
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 10 años, 11 meses
Puntos: 3
Respuesta: problema al crear funcion

Hola fenixelian

Para que la función haga lo que tú pides, hay que corregir el valor inicial y el valor final del ciclo for y el orden de los operandos en la operación % (módulo o residuo), y además evitar que el ciclo for entre en un ciclo infinito, así:

Código:
public static int MD(int a)
{
	int n;
	{
	if (a > 3) // porque el primer número entero no primo es el 4
	{
		for (n = a - 1; n == 1; n--) // n-- es lo mismo que n = n - 1
			if (a % n == 0)
			{
				return n;
			} // if
		} // for
	} // if (a > 3)
} // MD
Saludos cordiales.

Última edición por javidotnet; 02/05/2013 a las 19:59 Razón: n-- es lo mismo que n = n - 1
  #3 (permalink)  
Antiguo 02/05/2013, 20:12
 
Fecha de Ingreso: mayo-2013
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: problema al crear funcion

Cita:
Iniciado por javidotnet Ver Mensaje
Hola fenixelian

Para que la función haga lo que tú pides, hay que corregir el valor inicial y el valor final del ciclo for y el orden de los operandos en la operación % (módulo o residuo), y además evitar que el ciclo for entre en un ciclo infinito, así:

Código:
public static int MD(int a)
{
	int n;
	{
	if (a > 3) // porque el primer número entero no primo es el 4
	{
		for (n = a - 1; n == 1; n--) // n-- es lo mismo que n = n - 1
			if (a % n == 0)
			{
				return n;
			} // if
		} // for
	} // if (a > 3)
} // MD
Saludos cordiales.
te agradesco mucho la pronta respuesta. me aclaro mucho el panorama de la funcion, aunque por desgracia el error continua ahi, en realidad no se por que sera. si pongo un return antes de que termine la funcion(ocea antes del ultimo corchete) se va el error, pero al correr el programa me devuelve el valor que aparece en el ultimo return y no tiene en cuenta el ciclo ni nada. ahi va una foto aver si aclara un poco las cosas. gracias desde ya
espero se vea la foto
(este link es por si se ve chica la foto aca)
http://imageshack.us/photo/my-images/208/sinttulors.png/


Última edición por fenixelian; 02/05/2013 a las 20:18
  #4 (permalink)  
Antiguo 02/05/2013, 21:05
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 10 años, 11 meses
Puntos: 3
Respuesta: problema al crear funcion

Hola fenixelian

Gracias por la foto, estuvo excelente! me hizo acordar!!

El error se da porque toda función en C debe retornar un valor y nuestra función MD sólo retorna valores cuando se cumple la condición (a % n) == 0 y (a > 3)
Te paso el código corregido

Código:
public static int MD(int a)
{
	int n;
	{
	if (a > 3) // porque el primer número entero no primo es el 4
	{
		for (n = a - 1; n == 1; n--) // n-- es lo mismo que n = n - 1
		{
			if (a % n == 0)
			{
				return n;
			} // if
		} // for

		return 1; // si se llega hasta aquí es porque no se encontró divisor
	}
	else // a < 4
	{
		return 1; // indica que sólo es divisible por 1 (es decir, a = num primo)
	} // if (a > 3)
} // MD
Me había centrado en la lógica del algoritmo y me olvidé que el Lenguaje C es exquisito y detallista, en este caso con los retornos de función.

Fijate si puse bien el "else", lo que pasa es que sólo tengo el VB.NET Express
y sólo puedo probar código Visual Basic.

Saludos cordiales.
  #5 (permalink)  
Antiguo 03/05/2013, 09:44
 
Fecha de Ingreso: mayo-2013
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: problema al crear funcion

Cita:
Iniciado por javidotnet Ver Mensaje
Hola fenixelian

Gracias por la foto, estuvo excelente! me hizo acordar!!

El error se da porque toda función en C debe retornar un valor y nuestra función MD sólo retorna valores cuando se cumple la condición (a % n) == 0 y (a > 3)
Te paso el código corregido

Código:
public static int MD(int a)
{
	int n;
	{
	if (a > 3) // porque el primer número entero no primo es el 4
	{
		for (n = a - 1; n == 1; n--) // n-- es lo mismo que n = n - 1
		{
			if (a % n == 0)
			{
				return n;
			} // if
		} // for

		return 1; // si se llega hasta aquí es porque no se encontró divisor
	}
	else // a < 4
	{
		return 1; // indica que sólo es divisible por 1 (es decir, a = num primo)
	} // if (a > 3)
} // MD
Me había centrado en la lógica del algoritmo y me olvidé que el Lenguaje C es exquisito y detallista, en este caso con los retornos de función.

Fijate si puse bien el "else", lo que pasa es que sólo tengo el VB.NET Express
y sólo puedo probar código Visual Basic.

Saludos cordiales.
por desgracia otra vez con el mismo problema. paso lo mismo que me pasaba cuando le ponia un return afuera del ciclo for. Sea o no divisible me toma el valor que le pongo al final. tambien algo que vi es que en el primer if deveria ser (a>3 || a<-3) ya que por ejemplo el primer num que divide al 72 es el 32 si es q no me equivoco, pero tambien el primer num que divide al (-72) es el 32. pero bueno, eso seria algo para corregirle despues que creo no sera tan complicado. ahora lo que me preocupa es no poder lograr que ande algo tan simple. realmente no entiendo por que no llega a ningun true que pueda devolver un valor dentro del ciclo for. te agradesco mucho la respuesta, se me3 van aclarando varias cosas. aca unas fotos aver si te das cuenta que puede ser lo que esta pasando. gracias

http://imageshack.us/photo/my-images/259/33092058.png/
http://imageshack.us/photo/my-images/40/66436267.png/


  #6 (permalink)  
Antiguo 03/05/2013, 19:51
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 10 años, 11 meses
Puntos: 3
Respuesta: problema al crear funcion

Hola fenixelian

Te cuento que tuve que conseguir un IDE, para probar el código, y puedo decirte que no te preocupes porque ya encontré cuál es el error.
Fijate la sentencia "for", la definición para esta sentencia en C dice que el ciclo se ejecuta siempre que se cumpla la condición que se encuentra encerrada por los punto y comas:
Código:
for (n = a - 1; n == 1; n--)
Por lo tanto, nuestro programita nunca va a entrar dentro del ciclo porque de entrada n vale a-1, es decir que sólo entra cuando a = 2

Entonces la solución es colocar:

Código C:
Ver original
  1. for (n = a - 1; n > 0; n--)

En cuanto al "if" lo podemos quitar, teniendo en cuenta esa característica de la sentencia "for" que recién te expliqué. Por consiguiente, el código quedaría así:
Código C:
Ver original
  1. public static int MD(int a)
  2.         {
  3.             int n;
  4.            
  5.             for (n = a - 1; n > 0; n--) // n-- es lo mismo que n = n - 1
  6.             {
  7.                 if (a % n == 0)
  8.                 {
  9.                     return n;
  10.                 } // if
  11.             } // for
  12.    
  13.             return 1; // si se llega hasta aquí es porque no se encontró divisor
  14.         } // MD

Con respecto a lo otro que mencionas:

Cita:
el primer num que divide al 72 es el 32 si es q no me equivoco, pero tambien el primer num que divide al (-72) es el 32.
Permíteme corregirte, es 36 en lugar de 32; y te digo que es sencilla la solución,
sólo agregas la función Math.Abs() y listo, así:

Código C:
Ver original
  1. for (n = Math.Abs(a) - 1; n > 0; n--)

Además me tomé la libertad, ayudado por las fotos, de agregar unas cositas al main, para que te sea más fácil probar los números en la consola.

Por lo que nuestro código completo quedaría así:

Código C:
Ver original
  1. public static void Main(string[] args)
  2.         {
  3.             string valor;
  4.             int a, n;
  5.             while (true)
  6.             {
  7.                 Console.WriteLine("escriba un numero para ver el primero q lo divide (ENTER = Salir)");
  8.                 valor = Console.ReadLine();
  9.                 if (valor.Trim().Length == 0) break;
  10.                 a = Convert.ToInt32(valor);
  11.                 n = MD(a);
  12.                 Console.WriteLine("{0}\n", n);             
  13.             }
  14.            
  15.         }
  16.        
  17.         public static int MD(int a)
  18.         {
  19.             int n;
  20.            
  21.             for (n = Math.Abs(a) - 1; n > 0; n--) // n-- es lo mismo que n = n - 1
  22.             {
  23.                 if (a % n == 0)
  24.                 {
  25.                     return n;
  26.                 } // if
  27.             } // for
  28.    
  29.             return 1; // si se llega hasta aquí es porque no se encontró divisor
  30.         } // MD

Espero que te haya aclarado un poco más el panorama.

Cualquier duda no dudes en preguntar.

Saludos cordiales.

Última edición por javidotnet; 03/05/2013 a las 20:35 Razón: simplificar el código
  #7 (permalink)  
Antiguo 04/05/2013, 08:58
 
Fecha de Ingreso: mayo-2013
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: problema al crear funcion

Cita:
Iniciado por javidotnet Ver Mensaje
Hola fenixelian

Te cuento que tuve que conseguir un IDE, para probar el código, y puedo decirte que no te preocupes porque ya encontré cuál es el error.
Fijate la sentencia "for", la definición para esta sentencia en C dice que el ciclo se ejecuta siempre que se cumpla la condición que se encuentra encerrada por los punto y comas:
Código:
for (n = a - 1; n == 1; n--)
Por lo tanto, nuestro programita nunca va a entrar dentro del ciclo porque de entrada n vale a-1, es decir que sólo entra cuando a = 2

Entonces la solución es colocar:

Código C:
Ver original
  1. for (n = a - 1; n > 0; n--)

En cuanto al "if" lo podemos quitar, teniendo en cuenta esa característica de la sentencia "for" que recién te expliqué. Por consiguiente, el código quedaría así:
Código C:
Ver original
  1. public static int MD(int a)
  2.         {
  3.             int n;
  4.            
  5.             for (n = a - 1; n > 0; n--) // n-- es lo mismo que n = n - 1
  6.             {
  7.                 if (a % n == 0)
  8.                 {
  9.                     return n;
  10.                 } // if
  11.             } // for
  12.    
  13.             return 1; // si se llega hasta aquí es porque no se encontró divisor
  14.         } // MD

Con respecto a lo otro que mencionas:



Permíteme corregirte, es 36 en lugar de 32; y te digo que es sencilla la solución,
sólo agregas la función Math.Abs() y listo, así:

Código C:
Ver original
  1. for (n = Math.Abs(a) - 1; n > 0; n--)

Además me tomé la libertad, ayudado por las fotos, de agregar unas cositas al main, para que te sea más fácil probar los números en la consola.

Por lo que nuestro código completo quedaría así:

Código C:
Ver original
  1. public static void Main(string[] args)
  2.         {
  3.             string valor;
  4.             int a, n;
  5.             while (true)
  6.             {
  7.                 Console.WriteLine("escriba un numero para ver el primero q lo divide (ENTER = Salir)");
  8.                 valor = Console.ReadLine();
  9.                 if (valor.Trim().Length == 0) break;
  10.                 a = Convert.ToInt32(valor);
  11.                 n = MD(a);
  12.                 Console.WriteLine("{0}\n", n);             
  13.             }
  14.            
  15.         }
  16.        
  17.         public static int MD(int a)
  18.         {
  19.             int n;
  20.            
  21.             for (n = Math.Abs(a) - 1; n > 0; n--) // n-- es lo mismo que n = n - 1
  22.             {
  23.                 if (a % n == 0)
  24.                 {
  25.                     return n;
  26.                 } // if
  27.             } // for
  28.    
  29.             return 1; // si se llega hasta aquí es porque no se encontró divisor
  30.         } // MD

Espero que te haya aclarado un poco más el panorama.

Cualquier duda no dudes en preguntar.

Saludos cordiales.
--------------------------------------------------------------------------------------------------------

muchas gracias =) anda perfecto =). no sabia de esa funcion para el valor absoluto. se me habia ocurrido elevar al cuadrado la variable y sacarle la raiz cuadrada pero asi con esa funcion es mas facil. y con respecto al for, la verdad que me da verguenza jaja, hace mucho que no programo en este lenguaje, estube aprendiendo haskell y es muy diferente y deje mucho de lado este lenguaje. ahora lo que quiero es usar esa funcion para que me saque el MCD de dos numeros. se me complico un poco recien pero ya lo podre hacer jeje. de nuevo te agradesco mucho por la ayuda. un saludo
  #8 (permalink)  
Antiguo 04/05/2013, 17:14
 
Fecha de Ingreso: mayo-2013
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: problema al crear funcion

hola. como te va. agradesco mucho tu ayuda con lo de la funcion. averiguando un poco mas, encontre un metodo para sacar MCD de 2 numeros que no conocía. consiste en agarrar 2 numeros (x, y) luego se calcula x%y y se lo coloca en el lugar de la x, y en el lugar de la "y" se pone x. ocea quedaría (y%x, x) y asi sucesivamente. en algun momento el lugar de la x, ocea el primer lugar de los 2 valores va a ser 0 y nuestro MCD va a ser y. de esta manera se puede hacer una funcion muy simple que calcule esto. otra cosa muy interesante que no conocia de este lenguaje es que se pueden hacer definicioes recursivas al igual que en lenguajes funcionales. y de esta manera logre el objetivo =). en la facultad, para ver que un programa funciona correctamente, en un principio se hace un ejemplo paso a paso para ver que de el resultado deseado, y si no lo da, ver en que momento falla. tambien para ver que ande para cualquier caso se hace una prueba por induccion pero voy a hacer lo primero. un ejemplo de lo que digo es el siguiente:

x=15, y=35, f= el nombre de una funcion que se aplica a (x,y)
luego
f(15,35)
f(35%15, 15)
f(5,15)
f(15%5, 5)
f(0, 5)
luego como x=0 el MDC es 5

y el codigo de la funcion seria algo asi

public static int MCD(int x, int y)
{
int resultado;
if (x == 0) resultado = y;
else resultado = MCD(y % x, x);//definicion recursiva
return resultado;
}

Igualmente me sirvio muchisimo tu ayuda para crear la otra funcion, aunque no la pude aplicar me sirvio mucho para recordar muchas cosas. gracias


Código C#:
Ver original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace ComparadorAyB
  6. {
  7.     class Program
  8.     {
  9.         public static int MCD(int x, int y)
  10.         {
  11.             int resultado;
  12.             if (x == 0) resultado = y;
  13.             else resultado = MCD(y % x, x);//definicion recursiva
  14.             return resultado;
  15.         }
  16.         static void Main(string[] args)
  17.         {
  18.             int a, b;
  19.             string valor;
  20.             Console.WriteLine("Introduce primer numero: ");
  21.             valor =Console.ReadLine();
  22.             a = Convert.ToInt32(valor);
  23.             Console.WriteLine("Introduce segundo numero: ");
  24.             valor = Console.ReadLine();
  25.             b = Convert.ToInt32(valor);
  26.             Console.WriteLine("MCD: {0}", MCD(a, b));
  27.  
  28.             Console.ReadLine();
  29.         }
  30.     }
  31. }

Etiquetas: c#
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:22.