Foros-FIUBA Foros HostingPortal
 FAQ  •  Buscar  •  Wiki  •  Apuntes  •  Planet  •  Mapa  •  Eyeon  •  Chat
Preferencias  •  Grupos de Usuarios
Registrarse  •  Perfil  •  Entrá para ver tus mensajes privados  •  Login
Ver tema siguiente
Ver tema anterior

Responder al tema Ver tema anteriorEnviar por mail a un amigo.Mostrar una Lista de los Usuarios que vieron este TemaGuardar este Tema como un archivoPrintable versionEntrá para ver tus mensajes privadosVer tema siguiente
Autor Mensaje
ezequiel.grillo
Nivel 4



Registrado: 11 Abr 2011
Mensajes: 74

Carrera: Informática y Sistemas
argentina.gif
MensajePublicado: Lun Abr 11, 2011 9:07 pm  Asunto: Pregunta Ayuda TP Individual Responder citandoFin de la PáginaVolver arriba

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. Sad
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 Smile


   OfflineGalería Personal de ezequiel.grilloVer perfil de usuarioEnviar mensaje privadoMSN Messenger
loonatic
Nivel 9


Edad: 32
Registrado: 16 May 2009
Mensajes: 1256

Carrera: Sistemas
CARRERA.sistemas.3.jpg
MensajePublicado: Lun Abr 11, 2011 9:16 pm  Asunto: Pregunta Re: Ayuda TP Individual Responder citandoFin de la PáginaVolver arriba

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.


Geminis Género:Femenino Cabra OfflineGalería Personal de loonaticVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
El jevi
Nivel 7


Edad: 34
Registrado: 31 May 2010
Mensajes: 418
Ubicación: Almagro
Carrera: Informática y Sistemas
burundi.gif
MensajePublicado: Lun Abr 11, 2011 9:18 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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

_________________
Image

Capricornio Género:Masculino Serpiente OfflineGalería Personal de El jeviVer perfil de usuarioEnviar mensaje privado
ezequiel.grillo
Nivel 4



Registrado: 11 Abr 2011
Mensajes: 74

Carrera: Informática y Sistemas
argentina.gif
MensajePublicado: Lun Abr 11, 2011 11:21 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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 Rolling Eyes

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 Confused Sad )


   OfflineGalería Personal de ezequiel.grilloVer perfil de usuarioEnviar mensaje privadoMSN Messenger
loonatic
Nivel 9


Edad: 32
Registrado: 16 May 2009
Mensajes: 1256

Carrera: Sistemas
CARRERA.sistemas.3.jpg
MensajePublicado: Lun Abr 11, 2011 11:27 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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 Confused Sad )


En palabras: "mientras que el numero que ingreses esté fuera del rango, te voy a pedir otro número"


Geminis Género:Femenino Cabra OfflineGalería Personal de loonaticVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
Joaco.
Nivel 9


Edad: 36
Registrado: 25 Jul 2006
Mensajes: 1041

Carrera: Industrial
argentina.gif
MensajePublicado: Lun Abr 11, 2011 11:36 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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 Rolling Eyes

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 Confused Sad )


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.


Sagitario Género:Masculino Gato OfflineGalería Personal de Joaco.Ver perfil de usuarioEnviar mensaje privadoEnviar email
ezequiel.grillo
Nivel 4



Registrado: 11 Abr 2011
Mensajes: 74

Carrera: Informática y Sistemas
argentina.gif
MensajePublicado: Lun Abr 11, 2011 11:41 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Ok eso para decirle q se fue de rango
Y para validar el rango ahi si uso un if?? u otro while??


   OfflineGalería Personal de ezequiel.grilloVer perfil de usuarioEnviar mensaje privadoMSN Messenger
ezequiel.grillo
Nivel 4



Registrado: 11 Abr 2011
Mensajes: 74

Carrera: Informática y Sistemas
argentina.gif
MensajePublicado: Lun Abr 11, 2011 11:43 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

ahhh okok
que duro q soy por dios jajaj

perdon por el doble post no habia recargado al pag


   OfflineGalería Personal de ezequiel.grilloVer perfil de usuarioEnviar mensaje privadoMSN Messenger
ezequiel.grillo
Nivel 4



Registrado: 11 Abr 2011
Mensajes: 74

Carrera: Informática y Sistemas
argentina.gif
MensajePublicado: Lun Abr 11, 2011 11:59 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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


   OfflineGalería Personal de ezequiel.grilloVer perfil de usuarioEnviar mensaje privadoMSN Messenger
ezequiel.grillo
Nivel 4



Registrado: 11 Abr 2011
Mensajes: 74

Carrera: Informática y Sistemas
argentina.gif
MensajePublicado: Mar Abr 12, 2011 2:05 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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


   OfflineGalería Personal de ezequiel.grilloVer perfil de usuarioEnviar mensaje privadoMSN Messenger
loonatic
Nivel 9


Edad: 32
Registrado: 16 May 2009
Mensajes: 1256

Carrera: Sistemas
CARRERA.sistemas.3.jpg
MensajePublicado: Mar Abr 12, 2011 9:41 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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.


Geminis Género:Femenino Cabra OfflineGalería Personal de loonaticVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
ezequiel.grillo
Nivel 4



Registrado: 11 Abr 2011
Mensajes: 74

Carrera: Informática y Sistemas
argentina.gif
MensajePublicado: Mie Abr 13, 2011 12:26 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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.


   OfflineGalería Personal de ezequiel.grilloVer perfil de usuarioEnviar mensaje privadoMSN Messenger
Kartlan
Nivel 5


Edad: 43
Registrado: 09 Ago 2005
Mensajes: 176
Ubicación: Once
Carrera: Informática
argentina.gif
MensajePublicado: Mie Abr 13, 2011 11:41 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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


Aries Género:Masculino Gallo OfflineGalería Personal de KartlanVer perfil de usuarioEnviar mensaje privadoEnviar emailYahoo MessengerMSN Messenger
ezequiel.grillo
Nivel 4



Registrado: 11 Abr 2011
Mensajes: 74

Carrera: Informática y Sistemas
argentina.gif
MensajePublicado: Mie Abr 13, 2011 7:31 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Muchisimas gracias pero tengo otra duda....que funcion cumple eso de "step 2", creo q nunka lo vimos eso.
Graciass


   OfflineGalería Personal de ezequiel.grilloVer perfil de usuarioEnviar mensaje privadoMSN Messenger
ezequiel.grillo
Nivel 4



Registrado: 11 Abr 2011
Mensajes: 74

Carrera: Informática y Sistemas
argentina.gif
MensajePublicado: Mie Abr 13, 2011 11:33 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

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?


   OfflineGalería Personal de ezequiel.grilloVer perfil de usuarioEnviar mensaje privadoMSN Messenger
Mostrar mensajes de anteriores:      
Responder al tema Ver tema anteriorEnviar por mail a un amigo.Mostrar una Lista de los Usuarios que vieron este TemaGuardar este Tema como un archivoPrintable versionEntrá para ver tus mensajes privadosVer tema siguiente

Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro
No podés responder a temas en este foro
No podés editar tus mensajes en este foro
No podés borrar tus mensajes en este foro
No podés votar en encuestas en este foro
No Podéspostear archivos en este foro
No Podés bajar archivos de este foro


Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker
365 Attacks blocked.

Powered by phpBB2 Plus, phpBB Styles and Kostenloses Forum based on phpBB © 2001/6 phpBB Group :: FI Theme :: Mods y Créditos

Foros-FIUBA está hosteado en Neolo.com Cloud Hosting

[ Tiempo: 0.2456s ][ Pedidos: 20 (0.1659s) ]