Autor |
Mensaje |
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
Antes que nada saludss a todos
La verdad q me estoy rompiendo la cabeza y nose como corregir el TP individual .
Les comento q estoy cursando con GUARNA y tuvimos q entregar un TP individual. A mi me toco una consigna q decia maso menos asi:
Determinar si un numero natural con rango entre 1 y 10000 es perfecto.
El programa lo hice y lo entregue pero hoy me lo devolvio el ayudante que me asignaron (Ezequiel) y me dijo q lo reentregue. En el mail me puso esto:
"Falta validar el rango del número. Además, la forma de checkear si los candidatos aún son válidos no es óptima, fijate si podés detectar antes cuándo cortar el ciclo que no sea llegar hasta N/2.".
Estoy un poko perdido y nose como arreglarlo.
Les paso el codigo de lo que habia entregado
program Perfecto;
uses CRT;
var
Numero, Candidato, Suma: Integer;
Begin
clrscr;
writeln('Programa para determinar si un numero es perfecto');
writeln('Ingrese Numero');
readln(Numero);
suma:=0;
for Candidato:=1 to Numero div 2 do
if Numero mod Candidato=0 then
Suma:= Suma + Candidato;
if Numero=Suma then
writeln(Numero,' es perfecto')
else
writeln(Numero,' no es perfecto');
end.
Gracias y Abrazoo
|
|
|
|
|
|
|
|
|
loonatic
Nivel 9
Edad: 32
Registrado: 16 May 2009
Mensajes: 1256
Carrera: Sistemas
|
|
ezequiel.grillo escribió:
|
Determinar si un numero natural con rango entre 1 y 10000 es perfecto.
[b]"Falta validar el rango del número."
|
Con esto te quiso decir que inmediatamente después de recibir el número del usuario tenes que chequear si esta entre 1 y 10000; si no está entonces le podes pedir que lo ingrese nuevamente.
|
|
|
|
|
|
|
|
|
El jevi
Nivel 7
Edad: 34
Registrado: 31 May 2010
Mensajes: 418
Ubicación: Almagro
Carrera: Informática y Sistemas
|
|
Y lo segundo es que le pongas una condicion de corte al ciclo... Por ejemplo en vez de un for usar un Do...While y a una variable la inicias en 0, y en el caso en que encuentre el numero le cambias el valor a 1. Entonces en el while pones que itere mientras el valor sea 0. ENtonces una vez que lo encuentra no sigue iterando al pedo
|
|
|
|
_________________
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
El jevi escribió:
|
Y lo segundo es que le pongas una condicion de corte al ciclo... Por ejemplo en vez de un for usar un Do...While y a una variable la inicias en 0, y en el caso en que encuentre el numero le cambias el valor a 1. Entonces en el while pones que itere mientras el valor sea 0. ENtonces una vez que lo encuentra no sigue iterando al pedo
|
Perdon que joda pero no entiendo bien....podrias ponerme un ejemplo en codigo
Y para la validacion del rango podria usar tmb un while i ahi mandarle el rango q me piden o seria mejor un for, como se hasta donde va a llegar.
(Estoy un pokito complicado con esta materia jaja )
|
|
|
|
|
|
|
|
|
loonatic
Nivel 9
Edad: 32
Registrado: 16 May 2009
Mensajes: 1256
Carrera: Sistemas
|
|
ezequiel.grillo escribió:
|
Y para la validacion del rango podria usar tmb un while i ahi mandarle el rango q me piden o seria mejor un for, como se hasta donde va a llegar.
(Estoy un pokito complicado con esta materia jaja )
|
En palabras: "mientras que el numero que ingreses esté fuera del rango, te voy a pedir otro número"
|
|
|
|
|
|
|
|
|
Joaco.
Nivel 9
Edad: 36
Registrado: 25 Jul 2006
Mensajes: 1041
Carrera: Industrial
|
|
ezequiel.grillo escribió:
|
El jevi escribió:
|
Y lo segundo es que le pongas una condicion de corte al ciclo... Por ejemplo en vez de un for usar un Do...While y a una variable la inicias en 0, y en el caso en que encuentre el numero le cambias el valor a 1. Entonces en el while pones que itere mientras el valor sea 0. ENtonces una vez que lo encuentra no sigue iterando al pedo
|
Perdon que joda pero no entiendo bien....podrias ponerme un ejemplo en codigo
Y para la validacion del rango podria usar tmb un while i ahi mandarle el rango q me piden o seria mejor un for, como se hasta donde va a llegar.
(Estoy un pokito complicado con esta materia jaja )
|
While numero>1000 or numero<0 do
writeln('número inválido, el rango es 0 a 1000');
else
*codigo*
o al revez:
while número<1000>0 do
*codig*
else
writeln('sarasa');
edit:
¿Lo de validar podría ser también asegurar que el usuario ingresa un número y no cualquier caracter, como una letra o un signo. pascal tiene una funcion para eso.
|
|
|
|
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
Ok eso para decirle q se fue de rango
Y para validar el rango ahi si uso un if?? u otro while??
|
|
|
|
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
ahhh okok
que duro q soy por dios jajaj
perdon por el doble post no habia recargado al pag
|
|
|
|
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
Estoy probando de hacerlo asi como estba pero agregando solo la validacion de rango pero me salta un error
Me dice "; expected but ELSE found".
|
|
|
|
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
El jevi escribió:
|
Y lo segundo es que le pongas una condicion de corte al ciclo... Por ejemplo en vez de un for usar un Do...While y a una variable la inicias en 0, y en el caso en que encuentre el numero le cambias el valor a 1. Entonces en el while pones que itere mientras el valor sea 0. ENtonces una vez que lo encuentra no sigue iterando al pedo
|
Sigo rompiendo aka tratando de arreglar el TP pero no entiendo bien lo q me quiso decir jevi.
Alguno me podria dar un ejemplo en codigo por favor.
Abrazoo
|
|
|
|
|
|
|
|
|
loonatic
Nivel 9
Edad: 32
Registrado: 16 May 2009
Mensajes: 1256
Carrera: Sistemas
|
|
ezequiel.grillo escribió:
|
El jevi escribió:
|
Y lo segundo es que le pongas una condicion de corte al ciclo... Por ejemplo en vez de un for usar un Do...While y a una variable la inicias en 0, y en el caso en que encuentre el numero le cambias el valor a 1. Entonces en el while pones que itere mientras el valor sea 0. ENtonces una vez que lo encuentra no sigue iterando al pedo
|
Sigo rompiendo aka tratando de arreglar el TP pero no entiendo bien lo q me quiso decir jevi.
Alguno me podria dar un ejemplo en codigo por favor.
Abrazoo
|
Lo que te quiso decir el profesor (creo) es que existen formas de hacer que el calculo no sea tan largo. Un ejemplo: el numero 40. Sus divisores son 1,2,4,5,8,10,20... Y no tiene sentido seguir buscando, porque la suma ya se paso de 40! Me explico?
Saludos.
|
|
|
|
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
asi puede ser.....
program Perfecto;
uses CRT;
var
Numero, Candidato, Suma, Bandera: Integer;
Begin
clrscr;
writeln('Programa para determinar si un numero es perfecto');
writeln('Ingrese Numero');
readln(Numero);
suma:=0;
bandera:=0
candidato:=1
while (numero>10000) or (numero<0) do
while (bandera:=0) or (suma <numero>numero then
bandera:=1;
if bandera:=1 then
writeln(Numero,' es perfecto')
else
writeln(Numero,' no es perfecto');
end.
|
|
|
|
|
|
|
|
|
Kartlan
Nivel 5
Edad: 43
Registrado: 09 Ago 2005
Mensajes: 176
Ubicación: Once
Carrera: Informática
|
|
1.Solo por que preguntaste muchas-muchas-muchas-veces sobre lo mismo...
2.Por Díos! si pones código ponelo en entre los tag y tabulalo.
A) Validar que los datos de entrada son correctos es: "Asegurarse que el pelot... del usuario no te meta nada incorrecto..." ergo... fijarte que cuando lees los datos pasen una comprobación que puede ser más o menos elegante, pero para algo1 puede ser:
Código:
|
Repeat
readln(variable);
Until (<<condicion>>);
|
Donde condición puede ser ( valor > 0 and valor < 1000 ).
El código que pusiste nunca termina si es que el número que te dieron es correcto, y no hace nada si no lo es.
B) Mejorar el rendimiento del ciclo. Bueno... acá es donde tenes que usar la cabeza...
1) Definición de número primo... todos los pares salvo el 2 no son primos... así que está mal que pruebes si es divisible por 4,6,8,10, etc etc etc; el for tiene una forma de cambiar el paso de cada iteración. Y todos sabemos que el 1 divide a todo así que podes usar un (en este for me salto la parte de comprobar si es divisible por 2):
Código:
|
for candidato:=3 to numero/2 step 2 do
|
2) Definición de número perfecto... bueno mirando por internet se puede ver que se cree que el primer número perfecto impar es mayor a 10^300 así que si te pasan un impar podes decir tranquilamente que es "no perfecto"... por esto podes dejar el for del punto A si queres y es funcional al problema. Hay otras trampas... por ejemplo que en el rango que te dieron solo existen 4 números perfectos pero no es la idea del ejercicio.
3) Condiciones de corte... bueno... el for es un while en cubierto para que sea facíl verlo.. así que primero transformas el for en un while, y despues le agregas las condiciones de corte prematuro que queres a la pregunta del while. Además en este caso una condición prematura es no seguir sumando si ya te pasaste del número antes de llegar a la mitad.
Código:
|
contador,suma: Integer;
suma:= 3; { por que por todo lo anterior te saltas el 1 y el 2. }
{
for (contador:=3 to numero/2 step 2) do
suma:= suma+contador;
}
contador:= 3;
while ( (contador < numero/2) and (suma < numero) ) do
begin
if (numero div contador = 0) then
suma:= suma + contador;
contador:= contador +2;
end;
|
No lo ejecute pero creo que ya con eso tenes de sobra...
|
|
|
|
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
Muchisimas gracias pero tengo otra duda....que funcion cumple eso de "step 2", creo q nunka lo vimos eso.
Graciass
|
|
|
|
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
No entiendo porque si pongo 496 (q es otro numero perfecto) me pone q no es perfecto.
¿Cual seria la condicion final para q me diga si lo es o no?
|
|
|
|
|
|
|
|
|
|