Pascal/Turbo Pascal - CICLO FOR

 
Vista:

CICLO FOR

Publicado por DELTA (5 intervenciones) el 30/05/2007 17:04:02
tengo una duda con el siguiente programa, soy nuevo con el ciclo for y no consigo la falla del siguiente programa.

NOTA: el prorama me funciona para calcular valores de factoriales entre 1 y 7, pero al ingresar como valor de n= 8 me da un valor errado (-25216) y al ingresar n= 25 me da 0

program factorial;
var n,i,fact: integer;

begin
write ('Ingrese el numero al cual le desea calcular su factorial:');
readln (n);
fact:=1;
for i:=1 to n do
fact:=fact*i;
writeln (' El factorial de ',n,' es: ',fact);
readln;
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

RE:CICLO FOR

Publicado por M@rceloL (3 intervenciones) el 31/05/2007 02:51:14
No es un error del For, es un error de rango del tipo de datos integer.

Los valores numéricos tienen un determinado rango, en el caso de los integers, éstos pueden represetar valores entre -32768 y 32767.

Debido al sistema de representación usado internamente por el tipo integer, cuando un número excede el valor 32767 "da la vuelta" y comienza a contar desde los negativos:

Si meto 32768 obtengo -32768, si meto 32769 obtengo -32767.

Como 8! es 40320, se va de rango y uno termina con un valor incorrecto.

La solución es usar un tipo de dato con un rango mayor, por ejemplo LongInt o Word.

Saludos.
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

RE:CICLO FOR

Publicado por M@rceloL (1 intervención) el 31/05/2007 02:54:42
Por cierto, para evitar este tipo de sorpresas se puede activar la opción Overflow checking, en Options> compiler (en TP 7).
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

RE:CICLO FOR

Publicado por DELTA (5 intervenciones) el 01/06/2007 17:59:36
Gracias amigo si era eso lo pudo coloborar cambiando el rango d integer a real, pero no entiendo como usar los otros rangos q me diste LongInt o Word, dado q cambio la linea q dice

Fact: real;

por fact: longint; y me da un error 89 me dice q espera un ">" como es eso t agradeceria tu ayuda.

y aactive lo q me dijsite d overflow pero como se usa, o que hace eso?
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

RE:CICLO FOR

Publicado por M@rceloL (3 intervenciones) el 04/06/2007 17:59:06
Bueno, debés estar escribiendo algo mal...

Simplemente cambiá el "integer" por "word" o "longint".

La opción de check overflow sirve para que uno se de cuenta que hubo una operación matemática que dio un resultado fuera del rango de alguna variable.

No te va a salvar la vida, claro, pero te va a perimitir ver que hay algo que anda mal y dónde ocurre el error. Si ocurre un error de rango, simplemente el programa se va a parar y te va a tirar un mensaje. De esta manera el error no pasa desapercibido.

program factorial;
var n,i,fact: word; <<<<<<<<<<<<<<<<<<<-------------------------------

begin
write ('Ingrese el numero al cual le desea calcular su factorial:');
readln (n);
fact:=1;
for i:=1 to n do
fact:=fact*i;
writeln (' El factorial de ',n,' es: ',fact);
readln;
end.

¿Se eniende ahora? Saludetes.
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

RE:CICLO FOR

Publicado por Delta (5 intervenciones) el 06/06/2007 15:22:32
Si ya logre corregir el problema, muchas gracias por todo.
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

RE:CICLO FOR

Publicado por milton (3 intervenciones) el 11/07/2013 08:25:48
y si lo quiero correr este programa sin necesidad de salirme del programa , como seria
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

RE:CICLO FOR

Publicado por willy (1 intervención) el 11/11/2012 15:22:11
viejo porfa necesito hacer este programa pa hoy ayuda porfa desarrolle un programa en turbo pascal que lea el nombre y sexo de 10 estudiantes e imprima los datos de los estudiantes de sexo femenino utiliza el ciclo for
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

RE:CICLO FOR

Publicado por ramon (2158 intervenciones) el 11/11/2012 16:58:00
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{A ver si esto te sirve}
 
 program nombres;
  uses
    crt;
  const
     delsexo : array[1..2] of string[10] = (
     'Masculino','Femenino');
  var
    estudiantes : array[1..10] of record
                         nombre : string[50];
                         sexo : string[10];
                       end;
    i : integer;
 
  procedure entrada_datos;
  var
    n : integer;
    tec : char;
  begin
      n := 1;
    repeat
      clrscr;
      writeln(' Entrada De Datos N§ : ',n);
      writeln;
      write('Entre Nombre : ');
      readln(estudiantes[n].nombre);
      writeln(' El Sexo Es Pulse [1 = Masculino] [2 = Femenino]');
      repeat
           tec := readkey;
      until tec in['1','2'];
      if tec = '1' then
      estudiantes[n].sexo := delsexo[1];
      if tec = '2' then
      estudiantes[n].sexo := delsexo[2];
      n := n + 1;
    until n > 10;
  end;
 
  begin
      entrada_datos;
      clrscr;
      for i := 1 to 10 do
      if estudiantes[i].sexo = delsexo[2] then
      writeln(estudiantes[i].nombre,' =  ',estudiantes[i].sexo);
      readln;
  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