[ Foro de Pascal ]
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.
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.
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
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.
Sí lo logré hacer, pero utilicé un procedimiento recursivo. No sé si te interese. Creo que no.
Saludos.
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.
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.)