• Domingo 22 de Septiembre de 2019, 11:59

Autor Tema:  procedure recursivo para obtener division y resto entero  (Leído 2079 veces)

tomas_sauron

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
procedure recursivo para obtener division y resto entero
« en: Miércoles 24 de Noviembre de 2010, 18:36 »
0
hola gente del foro soi nuevo en el tema de la programacion y necesito 1 poco de su ayuda
requiero hacer un procedure recursivo para obtener el resto y la division (enteros) por restas sucesivas
yo pense en lo sgte pero me da error de segmentacion

procedure div_resto(a:tnum;b:tnum;s:tnum)


begin
                                           if a >= b
                                                                              then
                                                                                    begin
                                                                                                                      a:=a-b;
                                                                                                                      inc(s)
                                                                                     end;
                                            div_resto(a-b,b,s+1)

 end;

el tipo tnum es de tipo integer probe con cambiarlo con smallint pero sigue tirando segmentation fault
si alguien puede ayudarme lo agradeceria mucho !!!!!!
saludos
pd:el codigo de un posible programa es el que sigue[attachment=0:1zvsqi2j]divission.txt[/attachment:1zvsqi2j]
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Homer

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: procedure recursivo para obtener division y resto entero
« Respuesta #1 en: Jueves 25 de Noviembre de 2010, 01:24 »
0
Buenas,
he visto un par de cosas que a lo mejor te pueden ayudar...

Lo primero es prácticamente todo estético aunque tambien tiene cierta funcionalidad:
Citar
Tu código

    type
        tnum=smallint;

    var

       a:tnum;
       b:tnum;
       s:tnum;
Yo lo simplificaría en un:
Código: Pascal
  1. Var
  2.      Dividendo, Divisor, Resto: integer;
  3.  
Si has estado haciendo pruebas, está muy bien lo de declarar el tipo "tnum" porque con cambiar ahí, es suficiente, pero para un programa pequeño, yo lo haría más fácil a la vista. De todas formas, para mi lo más importante es darle nombres "útiles" a las variables porque si en este programa, que ya es pequeño, cuesta saber qué variable corresponde a cada cosa, en uno grande... imagínate... te dejas los ojos. (He usado integer por usar uno, puedes elegir el que mejor te vaya). Fíjate que al final del programa en el procedimiento "mostrar" igualas estás variables a otras simplemente para ponerles otro nombre... si esto lo haces al principio, ya no te perderás a lo largo del programa y tampoco tendrás que hacer eso al final.

Citar
Tu código
procedure ingresar(var a:tnum;var b:tnum;var s:tnum);


begin
     writeln('ingrese numero');
     read(a);
     writeln('ingrese numero');
     read(b);
     s:=0
end;

Yo pondría:
Código: Pascal
  1. Procedure Ingresar (var a, b, c: tnum); {en el siguiente procedimiento lo haces así}
  2.       Begin
  3.             Write ("Ingrese el Dividendo y pulse enter: "); {Yo no pondría WriteLn, así el número que introduzca lo hace justo después de los ":"}
  4.             ReadLn (a); {Aquí si pondría el ReadLn, ya que así salta a la siguiente línea. En tu código, al no ponerlo, te pondrá la siguiente petición justo después de este número.}
  5.             {Lo mismo para el divisor}
  6.  

Ahora a al tema:
Comento sobre tu código.
Citar
Código: Pascal
  1. procedure div_resto(a,b,s:tnum); {Si dentro de los paréntesis no pones "var" cuando hagas la llamada recursiva, estarás pasando los mismos valores (esto no lo sé con seguridad, pero si lo pones, te curas en salud, ya que si pasas los mismo valores tendrías un bucle infinito.}
  2. begin
  3.      if a>=b
  4.         then
  5.             begin
  6.                  a:=a-b;
  7.                  inc(s) {Esto no sé que es, supongo que quieres incrementar "s" --> s:= s + 1;}
  8.             end
  9.      else  {Si a < b no tengo muy claro este punto, ya que "a" que posteriormente dices que es el resto no se sabe si será cero o no, ya que es sería una división con decimales pero cuyo resto no conocemos, con lo cual... habría que mirar bien qué pasaría en este caso}
  10.         begin
  11.              a:=0;
  12.              s:=0
  13.         end;
  14.     div_resto(a-b,b,s+1) {Si no me equivoco (no tengo el compilador instalado) sería algo del estilo --> Procedure div_resto (...);}{Por otro lado, las variables, las estás modificando de nuevo antes de volver a usarlas. Ejemplo a= 100, b = 5. Entra el procedimiento a - b = 95 = a y s = 0 + 1. Llegas al final y le estás enviando los datos de nuevo pero envías Procedure div_resto (95-5, 5, 1+1). Cuando vuelvas a usar los datos, te habrás saltado un paso}{Sería Procedure div_resto (a, b, s);}
  15. end;
  16.  

Y para finalizar, tu procedimiento "mostrar", yo lo eliminaría por completo ya que con substituirlo por un par de WriteLn del estilo:
Código: Pascal
  1. WriteLn ("La solución es: ", s);
  2. WriteLn ("El resto es: ", a);
  3. {Fíjate bien sobre todo en cómo muestras las cosas por pantalla, ya que como tu lo pones sería algo del estilo "solucion20resto0". Bajo mi punto de vista es importante que tanto la petición como la devolución de datos sean lo más amenas posible, ya que es lo único que el usuario ve. De igual forma cuanto más organices el código, aunque el usuario no lo vea, te será mucho más simple a ti, mejorarlo, encontrar fallos...}
  4.  

No estoy seguro si es lo que buscabas y tampoco si funciona pero espero que te sirva para algo.

Un saludo.

tomas_sauron

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
Re: procedure recursivo para obtener division y resto entero
« Respuesta #2 en: Sábado 27 de Noviembre de 2010, 22:36 »
0
gracias por el aport  homer....ehhhhh sisi todo lo q ayude sirve.. igualment me apure un poco a pedir ayuda...probando un poco mas pude sacar el algorirtmo..y esto de la programacion es asi no? prueba y error...muchas gracias homer saludos