PDA

Ver la Versión Completa : Ayuda con ciclo de repeticion(bucle)


gabtroc
12-05-2012, 01:34:05
ok para aclarar ciertas cosas estoy estudiando ingenieria estoy viendo clases de programacion y trabajamos con delphi, como practica me mandaron a hacer un programa para determinar cuantos y cuales son los numeros naturales de 4 cifras que no tienen digitos repetidos en una aplicacion tipo consola.

Para eso se me ocurrio empezar realizando un programa al cual le ingrese un numero este numero sea separado en digitos individuales y realizar una comprobacion para ver si los digitos de ese numero son iguales o no y el codigo es asi:

Readln(x);
auxiliar:=x;


d4:=auxiliar mod 10;
auxiliar:=auxiliar div 10;
d3:=auxiliar mod 10;
auxiliar:=auxiliar div 10;
d2:=auxiliar mod 10;
auxiliar:=auxiliar div 10;
d1:=auxiliar mod 10;



if (d1-d2<>0) and (d1-d3<>0) and (d1-d4<>0) then
begin
if (d2-d3<>0) and (d2-d4<>0) then
begin
if (d3-d4<>0) then Writeln(x);
end;
end;

Siendo x el numero ingresado por el usuario y d1,d2,d3 y d4 los digitos individuales del numero original.

Ahora lo que de verdad quiero es un programa que me imprima la lista de los numeros que no tienen digitos repetidos para eso se me ocurre utilizar un ciclo de repeticion que empieze por el 1000 y termine en el 9999 realizando la comprobacion que puse en el codigo anterior, el unico problema es que cada vez que intento realizar un ciclo de repeticion el programa o no comienza o no imprime los numeros en pantalla.

Alguien me podria ayudar diciendome como coloco un ciclo de repeticion o bucle como creo que le dicen que me haga lo que quiero?
Seria de gran ayuda. Gracias :D

ecfisa
12-05-2012, 04:06:24
Hola gabtroc y bienvenido a Club Delphi :)

Como a todos los que se inician te invitamos a que leas nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

Creo que podrías hacer:

...
var
aux, i: Integer;
d1, d2, d3, d4: Integer;
begin
for i:= 1000 to 9999 do // para i <- desde 1000 hasta 9999 hacer
begin
aux:= i;
d4:= aux mod 10;
aux:= aux div 10;
d3:= aux mod 10;
aux:= aux div 10;
d2:= aux mod 10;
aux := aux div 10;
d1:= aux mod 10;
if (d1<>d2)and(d1<>d3)and(d1<>d4)and(d2<>d3)and(d2<>d4)and(d3<>d4) then
Write(i:5);
end;
Readln;
...


Saludos.

AzidRain
12-05-2012, 18:51:41
Y el algoritmo 'apá? Antes de siquiera meter el primer begin, tendrías que haber empezado por diseñar un algoritmo, el cual puedes "ejecutar" físicamente para verificar que funciona y una vez hecho esto, entonces sí, pasarlo al programa. Siendo que deseas ser ingeniero vete acostumbrando a empezar por el diseño y luego seguimos con el código. Si el algoritmo esta mal, por muy bonito y elegante que sea tu código, simplemente no servirá.

gabtroc
13-05-2012, 04:11:18
Me parecio mas facil copiar el codigo que lo tengo en la pc a copiar el algoritmo que lo hice a mano en papel pero tranquilo que el algoritmo lo hago.

Gracias por el codigo ecfisa ya vi cual era mi error ya el programa terminado me quedo asi

Writeln('Ingrese cuantos digitos desea imprimir en pantalla');
Readln(numlin);
Writeln('Presione ENTER para comenzar el programa');
Readln;

lineas:=0;
cont:=0;

for x := 1000 to 9999 do
begin

//Separacion en digitos individuales

auxiliar:=x;
d4:=auxiliar mod 10;
auxiliar:=auxiliar div 10;
d3:=auxiliar mod 10;
auxiliar:=auxiliar div 10;
d2:=auxiliar mod 10;
auxiliar:=auxiliar div 10;
d1:=auxiliar mod 10;

// comparacion de variables d

if (d1-d2<>0) then
if (d1-d3<>0) then
if (d1-d4<>0) then
if (d2-d3<>0) then
if (d2-d4<>0) then
if (d3-d4<>0) then begin
Writeln(x);
lineas:=lineas+1;
cont:=cont+1;
if lineas=numlin then begin
Writeln;
Writeln('....Presione ENTER para continuar');
readln;
lineas:=0;
end; //
end; //

end;

Writeln;
Writeln('Cantidad de numeros sin digitos repetidos: ',cont);

Writeln;
Writeln;
Writeln('Presione ENTER para terminar');
Readln;
end.


Gracias por la ayuda :D

ecfisa
13-05-2012, 04:18:33
Hola gabtroc.

De nada. :)

Recuerda usar los TAG's cuando pongas código en tus mensajes para hacerlo más legible. Te pongo una imágen que explica su uso:

http://img403.imageshack.us/img403/3461/75416396.jpg

Ya agregué las etiquetas a tu mensaje.

Saludos.

Delphius
13-05-2012, 08:08:25
if (d1-d2<>0) then
if (d1-d3<>0) then
if (d1-d4<>0) then
if (d2-d3<>0) then
if (d2-d4<>0) then
if (d3-d4<>0) then


Fíjate que eso se puede mejorar, justo como el ejemplo que te ha dado ecfisa. Analiza tus ifs anidados. Fíjate que para que se ejecute el último if deben cumplirse los anteriores, por tanto todas las condiciones deben de ser necesariamente verdaderas. Dado este escenario entonces es inpráctico estar separando cada evaluación. Para el caso es lo mismo:

if A then if B then ...

que

if A AND B AND ...

Ya que la tabla de verdad AND indica que o se cumplen todos o ninguno.

Saludos,

gabtroc
14-05-2012, 01:42:29
Vale, Gracias delphius ya corregi eso no me habia dado cuenta que era lo mismo, error de novato xd.

Para no estar haciendo otro tema preguntare esto por aqui mismo necesito hacer un programa que me genere numeros aleatorios por la tecnica del cuadrado medio. Si no lo saben consiste en tomar un número de N cifras elevarlo al cuadrado y usar los N dígitos centrales como número aleatorio, luego repetir el proceso para generar nuevos números aleatorios usando como semilla el aleatorio anterior.

Necesito escribir el programa para que lea un número entero cualquiera de N cifras y genere una lista de 20 números aleatorios utilizando esa tecnica, pero no logro hacer un algoritmo que me sirva y no tengo idea de como hacer que solo agarre los numeros centrales. Alguna idea?

Si la tienen se los agradecere mucho, de todas formas gracias por la ayuda con el programa anterior.

ecfisa
14-05-2012, 02:30:06
Para no estar haciendo otro tema preguntare esto por aqui mismo necesito hacer un programa que me genere numeros aleatorios por la tecnica del cuadrado medio.

Hola gabtroc.

Contrariamente yo te aconsejo que inicies un nuevo hilo con tu nueva pregunta. Y entre otros, los principales motivos son: Facilitar la búsqueda temática e incrementar tu posibilidad de recibir respuestas.

Un saludo.

Edito: Ya me olvidaba... Aplicando la ley de De Morgan también podés utilizar:

if not((d1=d2)or(d1=d3)or(d1=d4)or(d2=d3)or(d2=d4)or(d3=d4)) then

gabtroc
14-05-2012, 03:14:48
Ok ecfisa ya genero un nuevo tema con la pregunta, si tienes alguna idea para eso te invito a contestarla.

Delphius
14-05-2012, 05:41:52
El generador que debes implementar se llama Generador de Lehmer no del cuadrado medio. Ha repasar la teoría de Modelos y Simulación :rolleyes:

Saludos,

Delphius
14-05-2012, 06:02:11
Yo y mi bocota, mejor mandenme a mi recursar la cátedra... confundí el Cuadrado Central con Lehmer. :o Esto me pasa por confundir los primeros estudios de Lehmer, ya que fue el quien a quien se lo conoce como el iniciador de los generadores.

Saludos,