Pascal/Turbo Pascal - Mi programa para sacar el factorial de un número deja de funcionar a partir de 8

 
Vista:
sin imagen de perfil
Val: 15
Ha disminuido su posición en 2 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Mi programa para sacar el factorial de un número deja de funcionar a partir de 8

Publicado por Marcos (7 intervenciones) el 18/05/2020 21:07:59
Hola, estoy haciendo un ejercicio que consiste en calcular el factorial de un número que se pide por teclado. El caso es que mi programa funciona pero solo del 2 al 7, a partir de 8 da negativo, y tampoco funcionaría para 1 o menores. No se me ocurre nada que solucione esto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Var
num,i,resta,factor:integer;
Begin
writeln('Introduce un número:');
readln(num);
 for i:= 1 TO (num - 1) DO
 Begin
  resta:=num-1;
  writeln(resta);
 If i = 1 then
  Begin
  factor:=1*num;
  End
 Else
  Begin
  factor:=factor*num
  End;
 num:=resta;
 End;
writeln ('El factorial del número introducido es: ', factor);
End.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 86
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Mi programa para sacar el factorial de un número deja de funcionar a partir de 8

Publicado por David (37 intervenciones) el 19/05/2020 10:11:00
Es un programa muy breve.
Te propongo 2 cosas.

- Con papel y boli (o notepad) haz un borrador y sigue el flujo del programa y comp ueba tu mismo que valor devuelve para los primeros números y que es lo que falla. (usa la calculadora si lo necesitas)

- Si buscas el algoritmo o el pseudocodigo para calcular un factorial seguro que consigues alguna idea.

Si sigues con dudas o con dificultades para resolverlo háznoslo saber y te ayudaré.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 15
Ha disminuido su posición en 2 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Mi programa para sacar el factorial de un número deja de funcionar a partir de 8

Publicado por Marcos (7 intervenciones) el 19/05/2020 13:45:10
Hice el borrador con papel y boli y según lo que yo interpreto, mi programa funciona desde el número 1. Sin embargo cuando lo ejecuto, a partir de 8 da números negativos que la verdad no sé de donde salen. Se agradecen ideas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mi programa para sacar el factorial de un número deja de funcionar a partir de 8

Publicado por Nacho (13 intervenciones) el 19/05/2020 16:13:25
La mejor idea de todas es que aprendas a depurar.

No te da números negativos a partir de 8, te da un error, pues factorial de 8 es 40320 y eso no cabe en un integer de 16 bits.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 86
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Mi programa para sacar el factorial de un número deja de funcionar a partir de 8

Publicado por David (37 intervenciones) el 19/05/2020 16:38:38
Bien visto @Nacho, el problema creo que guarda relación con lo que dices.

@Marcos, lo acabo de probar en Lazarus y a mí me funciona para 8 devolviendo 40320 (debe ser el compilador).
Lo deberías poder solucionar declarandolo como longint

No obstante, te sigo recomendando buscar algun algoritmo o pseudocodigo para plantear el cálculo del factorial, porque te falla para 0 y 1 (ambos casos debe devolver 1 y devuelve 0)

Según https://wiki.freepascal.org/Variables_and_Data_Types
Los integer pueden ser de 2 o 4 bytes comportándose como enteros cortos o largos (creo que según necesidad y según el compilador).

Smallint -32768 .. 32767 2 bytes (16 bits)
Longint -2147483648 .. 2147483647 4 bytes (32 bits)
Integer smallint or longint 2 or 4 bytes (16 o 32 bits)

Si tienes dificultades para encontrar el algoritmo te ayudo a buscarlo o te ayudo a hacerlo, estás muy cerca de tener uno válido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 15
Ha disminuido su posición en 2 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Mi programa para sacar el factorial de un número deja de funcionar a partir de 8

Publicado por Marcos (7 intervenciones) el 19/05/2020 16:54:26
He cambiado el valor integer por longint y ahora funciona hasta 12. Además he añadido las dos condiciones para el 1 y el 0.
No se me ocurre nada más. Si me ayudais a hacerlo os lo agradezco.
Soy novato.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 15
Ha disminuido su posición en 2 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Mi programa para sacar el factorial de un número deja de funcionar a partir de 8

Publicado por Marcos (7 intervenciones) el 19/05/2020 16:54:55
El programa nuevo es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Var
num,i,resta,factor:longint;
Begin
writeln('Introduce un número:');
readln(num);
If num=0 then
 Begin
 factor:=1;
 End;
If num=1 then
 Begin
 factor:=1;
 End
Else
 for i:= 1 TO (num - 1) DO
 Begin
  resta:=num-1;
  writeln(resta);
 If i = 1 then
  Begin
  factor:=1*num;
  End
 Else
  Begin
  factor:=factor*num
  End;
 num:=resta;
 End;
writeln ('El factorial del número introducido es: ', factor);
End.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 86
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Mi programa para sacar el factorial de un número deja de funcionar a partir de 8

Publicado por David (37 intervenciones) el 19/05/2020 18:31:41
Sin detenerme mucho en el código, porque si funciona y a tí te vale, pues ya está.
Lo que veo es que si haces lo mismo para num=1 o num=0 puedes usar el mismo condicional.

1
2
3
4
if (num = 0) or (num = 1) then
begin
sentencias;
end;

Aunque lo que haces de usar una variable para guardar el valor a mostrar es un buen habito en mi opinión también puedes hacer

1
writeln(resta-1);

en vez de:

1
2
resta:=num-1;
  writeln(resta);

Y puedo equivocarme, pero yo diria que el for lo puedes hacer de 1 hasta num, no veo necesidad de restar 1, al fin y al cabo el factorial de 5 si no me equivoco es 1x2x3x4x5 (cada uno seria una vuelta al bucle). Quiero decir que se puede plantear diferente, por eso te recomende verte algun ejemplo de codigo porque te puede mostrar maneras mas eficientes.

La manera mas eficiente creo que seria una funcion recursiva, apenas serian 4 líneas, pero si no has visto funciones no lo hagas porque te costará comprender la recursividad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar