Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con ciclo de repeticion(bucle) (https://www.clubdelphi.com/foros/showthread.php?t=78728)

gabtroc 12-05-2012 01:34:05

Ayuda con ciclo de repeticion(bucle)
 
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:

Código Delphi [-]
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.

Creo que podrías hacer:
Código Delphi [-]
...
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
Código Delphi [-]
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:



Ya agregué las etiquetas a tu mensaje.

Saludos.

Delphius 13-05-2012 08:08:25

Cita:

Empezado por gabtroc (Mensaje 432489)
Código Delphi [-]
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:

Código Delphi [-]
if A then if B then ...

que

Código Delphi [-]
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

Cita:

Empezado por gabtroc (Mensaje 432509)
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:
Código Delphi [-]
  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,


La franja horaria es GMT +2. Ahora son las 08:44:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi