[ Foro de Pascal ]

Por que me da este error !!!!

14-Nov-2009 10:44
alveiro pana
3 Respuestas

Hola profesores cordialisimo saludo y de antemano mil gracias por su tiempo para con nosotros.
Bien estoy en el tema de funciones y estoy realizando a manera personal el siguiente ejercicio:

a traves de funciones de solucion al coeficiente binomial de dos numeros,expresada mediante la formula:

 n        
     =    n!/m!(n-m)!   donde n debe ser mayor que m
 m    


bien pues creo tener claro los conceptos de funciones y realice el siguiente programa para intentar dar solucion:
tome var como real pues pienso que el resulado puede ser muy grande para definirla como integer o longint en las funciones.


program coeficientebinomial;
uses crt;

function factorial(num:integer):real;
 var
     fact:real;
    begin

      while num0 do
       begin
       fact:=fact*num;
       num:=num-1;
       end;
      factorial:=fact;

    end;


function coeficiente_binomial(numN,numM:integer):real;

 var numerador,denominador, binomial:real;
 begin

 numerador:=factorial(numN);
 denominador:=factorial(numM) * factorial(numN-numM);
 binomial:=numerador/denominador;
 coeficiente_binomial:=binomial;
 end;

 {programa principal}
   var
    numeroN,numeroM:integer;
    coef_binomial:real;
    seguir:char;
    begin
     clrscr;
       repeat
       writeln('introduzca dos numeros (n>m):');
        write('escriba el numero N: ');
        readln(numeroN);
        write('escriba el numero M: ');
        readln(numeroM);
        coef_binomial:=coeficiente_binomial(numeroN,numeroM);
        write('el coeficiente binomial es:',coef_binomial:0:2);
        writeln;
        writeln('desea obtener el coeficiente binomial de   otros dos numeros (S/N)?: ');
        readln(seguir);
        until (seguir='n') or (seguir='N');

     end.

bien haciendo digamos un seguimiento a papel creo que la logica que planteo para la solucion es correcta pero claro al ejecutarlo para valores de n=5, y m=2 el coeficiente binomial deberia dar como resultado 10 (en mi caso coef_binomial =10 seria la respuesta correcta que se mostraria en pantalla)sin embargo me sale un error al ejecutar este codigo que no comprendo y es en la linea:

binomial:=numerador/denominador;
y el tipo de error que me sale es:division by zero ,si puedieran explicarme el por que pues si yo reemplazo los valores que creo esta recibiendo la funcion seria:
binomial= 5!/2!(5-2)!  y esto no da un denominador zero,
asi que por favor me podrian ayudar  en el porque? de este error o si es que en el codigo estoy haciendo algo mal,por su ayuda mil gracias





14-Nov-2009 12:49
Antonio P.G.

Hola,

Lo primero comentarte que lo de los factoriales es un poco molesto por eso de que se pueden producir desbordamientos ;). Cuando yo lo hice, no usé real, sino longint.

Decirte también que puedes ahorrarte el uso de unas cuantas variables, como en la función "coeficiento_binomial", podrías escribir simplemente "coeficiente_binomial:= factorial(numN) / ( factorial(numM) * factorial(numN-numM));". En el programa principal puedes echar también un vistazo.

Si has copiado el código fuente correctamente, tienes un error que está en la función "factorial", porque no has "arrancado" o "iniciado" la variable "fact". Ésta, en tu programa puede adquirir cualquier valor.

Sin embargo, creo que el fallo principal está en el "while". ¿Cuál es la condición que has establecido? ¿ ">0" o ">=0"?

Si has puesto la segunda ( num >= 0 ), definitivamente sería lógico que el error te diese donde te da, ya que tu factorial valdría cero independientemente de cualquier número. En este caso, quita el igual.

Espero haberte sido de ayuda.


14-Nov-2009 15:51
alveiro pana

Tenias toda la razon Profesor Antonio, gracias a tus observaciones pude dar solucion al ejercicio,muchisimas gracias por tu tiempo y tu conociemiento.


14-Nov-2009 18:45
Antonio P.G.

Hola Alveiro.

Solamente una aclaración: yo no soy profesor. Estoy aquí como alumno. Aquí el profesor es Nacho Cabanes. Mis conocimientos sobre la materia no alcanzan ni un 1% de lo que él sabe.

¡Ciao!






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)