[ Foro de Pascal ]

div - mod

10-Aug-2014 14:44
Invitado (ramiropuestas)
6 Respuestas

hola buen dia, espero vuestra ayuda, al siguiente ejercicio, ojala puedan hecharme una mano, gracias

mostrar losdigitos de un numero ingresado por teclado que, en el mismo orden, por separado? Es decir, ¿para 135, deberás mostrar
1
3
5

nota:
no se puede utilizar ni string ni vectores, solo usando div, o mod y preferiblemente la practica con bucle while.


11-Aug-2014 23:34
Luis Torres (+18)

Lo he podido realizar, pero el orden en el que se imprimen los dígitos es inverso al que tú quieres. Te dejo el código a continuación:


program Digitos;
var
  N: integer;
BEGIN
  write('Deme un entero: ');  readln(N);
  while (N>0) do
    Begin
        writeln(N mod 10);
        N:= N div 10;
    End;
  readln;
END.

12-Aug-2014 14:05
Invitado (ramiropuestas)

hola luis, es la unica forma de hacerlo? es decir no hay manera de poder imprimir como pide el programa, osea primero el 1 luego 3 y por ultimo el 5, es que yo lo habia hecho como tu pero me imprime tal cual lo mencionas tu , de manera inversa, ojala el profesor pueda ayudarnos , gracias


12-Aug-2014 20:27
Nacho Cabanes (+84)

La manera que te propone Luis es la simple, es lo que es habitual que te pidan cuando eres un principiante. Hacerlo al contrario es trabajoso:

- Si sabes con certeza que el número tiene 3 cifras, puedes ir dividiendo entre 100, luego entre 10, y así sucesivamente o incluso hacerlo "a lo salvaje":


primeraCifra := n div 100;
resto := n mod 100;
segundaCifras := resto div 10;
terceraCifra := resto mod 10;



- Si no sabes cuantas cifras tiene, es mucho más trabajoso, porque debes empezar por la potencia de 10 más alta que permita el tipo de datos que estés usando (por ejemplo, para un entero largo sería 10.000.000.000) y hacer un "div" para ver la cifra correspondiente a esa potencia, restar, dividir la potencia entre 10 para pasar a la siguiente y así sucesivamente. Pero lo habitual es que no quieras mostrar los ceros iniciales y sí los intermedios, para lo que necesitarías un "booleano" de control, que te permita saber que ya has encontrado la primera cifra que no es cero (y que a partir de ese momento ya sí debes escribir los resultados que sean cero). Como ves, esta alternativa no es trivial.


12-Aug-2014 23:21
Luis Torres (+18)

Sí lo logré hacer, pero utilicé un procedimiento recursivo. No sé si te interese. Creo que no.
Saludos.


12-Aug-2014 23:42
Luis Torres (+18)

De todas maneras aquí te  dejo el código recursivo:


program Digitos;
  var 
      num: integer;

procedure MostrarDigitos(N: integer); {Procedimiento recursivo}
Begin
    if (N>0) then
     Begin
          N:= N div 10;
          MostrarDigitos(N);
          if (N>0) then
               writeln(N mod 10);
     End;
End;

BEGIN
  write('Deme un entero: '); readln(num);
  MostrarDigitos(num);
  writeln(num mod 10); {Mostramos el último dígito}
  readln;
END.


13-Aug-2014 00:10
Nacho Cabanes (+84)

La idea de la función recursiva es muy buena, porque permite hacer código muy compacto (a cambio de un mayor uso de memoria). Aun así, lo has hecho un poco más rebuscado de lo necesario: escribes el último dígito fuera de la función y usas dos "if n > 0". Se puede simplificar un poco:


program Digitos;
 
procedure MostrarDigitos(n: integer); {Procedimiento recursivo}
begin
    if n < 10 then
        writeLn(n)
    else
    begin
        MostrarDigitos(n div 10);
        writeLn(n mod 10);
     end;
end;

{ Programa de prueba }

var 
    num: integer;

begin
  write('Deme un entero: '); 
  readLn(num);
  MostrarDigitos(num);
end.








(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)