[ Foro de Pascal ]
hola a todos, especialmente al profesor nacho.
queria preguntaros como puedo realizar un programa en pascal que me permita
invertir los dígitos de cada número (elemento de la matriz) , es para un juego que estoy realizando como proyecto del instituto y esta parte no se como hacerla de manera eficaz, agradezco cualquier coloboracion al respecto , estare agredecido de este foro.gracias
¿A qué te refieres con invertir números? ¿A dar la vuelta a las cifras, de modo que la primera pase a ser la última y así sucesivamente, de modo que el número 4567 se convierta en 7654?
Gracias por responder profesor.
Efectivamente me refiero a dar la vuelta a las cifras, validando de alguna menera y de antemano que los elementos de la matriz sean como minimo de dos cifras, por que si fueran de una, logicamente seria el mismo elemento, gracias por la ayuda que puedas brindarme.
bueno se me ocurre algo asi,...
program invertir;
const
f=//el tamaño e filas que quieras en tu matriz
c=// el tamaño de columnas que quieras en tu matriz
type
matrix:array [0..F,0..C]of integer;
var
auxiliar2:string;
NUMERO:INTEGER;
M_numerosorigina,M_numerosinvertidos:matrix:
procedure invierte(var asd:string);
var
begin
tamaño:=(length(asd)-1);
for i:=0 to (tamañoñ) do
begin
aux[i]:=(asd([tamaño])-i);
end;
end;
PROCEDURE INGRESADIGITOS(VAR auxiliar:string);
var
auxiliar:STRING;
COD:INTEGER;
TAMAÑO:INTEGER;
begin
REPEAT
WRITELN('INGRESE UN NUMERO DE DOS DIGITOS ');
READLN(AUXILIAR);
TAMAÑO:=LENGHT(AUXILIAR);
UNTIL (TAMAÑO)>=1);
end;
Begin
clrscr;
WHILE (((F<={el tamaño que elejiste para las filas}) AND (C<={el tamaño que elejiste para las columnas})) and (OP='y'))do
begin
INGRESADIGITOS(NUMERO);
auxiliar2:=auxiliar;
invierte(var auxiliar2:string);
VAL (AUXILIAR,NUMERO,COD);//lo convierto en un integer
VAL (AUXILIAR2,NUMEROinv,COD);//lo convierto en un integer
M_numerosoriginal[F,C]:=NUMERO;
M_numerosinvertidos[F,C]:=NUMEROINV;
WRITELN('presione <y> para cargar otro numero o cualquier tecla para salir ');
READLN(op);
op:=upcase (OP);
end;
/// no se si lo queres mostrar o que.... use 2 matrices para guardar en una el numero original y la otra para guardar el numero invertido porque no se si vas a necesitar o no para algo el numero original....
end.
le pido un favor al admin.... como hago para recuperar mi cuenta... me olvide el nombre de usuario y contraseña
Yo para invertir una cadena crearía una función, que recorra la cadena original al revés, extrayendo letra a letra y cree una nueva a partir de ellas:
function invertir(texto: string): string;
var
cadena: string;
i: byte;
begin
cadena := '';
for i:=length(texto) downto 1 do
cadena := cadena + texto[i];
invertir := cadena;
end;
Por supuesto, esta idea se puede aplicar para invertir números, sólo con convertirlos de número a cadena (usando "str"), y, si es necesario, luego de cadena a número (con "val").
claro pero el lo que quiere es invertir numeros.. asique se me ocurrio que primero lo guarde directamente en una cadena, lo invierta y despues lo convierta a numero... igual despues de subir el codigo me di cuenta que tiene muchos errores.. estoy corrigiendolo ahora lo subo...
program invertir;
uses crt;
type
matrix=array [0..3,0..3]of integer;
var
auxiliar,auxiliar2:string;
cod,filas,columna,numero,NUMEROinv:INTEGER;
M_numerosoriginal,M_numerosinvertidos:matrix;
OP:CHAR;
function invierte(asd:string):string;///asd
var
i,tam:integer;
aux:string;
begin
tam:=(length(asd)-1);
for i:=0 to (tam) do
begin
aux[i]:=(asd[tam-i]);
end;
invierte:=aux;
end;
PROCEDURE INGRESADIGITOS(VAR auxiliar:string);
var
COD:INTEGER;
TAM:INTEGER;
begin
REPEAT
WRITELN('INGRESE UN NUMERO DE DOS DIGITOS ');
READLN(AUXILIAR);
TAM:=LENGTH(AUXILIAR);
UNTIL ((TAM)>=1);
end;
Begin
clrscr;
filas:=0;
columna:=0;
WHILE (((filas<=3{el tama±o que elejiste para las filas}) AND (columna<=3{el tama±o que elejiste para las columnas})) and (OP='y'))do
begin
if (filas=3)then
begin
columna:=columna+1;
filas:=0;
end;
INGRESADIGITOS(auxiliar);
auxiliar2:=invierte(auxiliar);
VAL (AUXILIAR,NUMERO,COD);//lo convierto en un integer
VAL (AUXILIAR2,NUMEROinv,COD);//lo convierto en un integer
M_numerosoriginal[filas,columna]:=NUMERO;
M_numerosinvertidos[filas,columna]:=NUMEROINV;
WRITELN('presione <y> para cargar otro numero o cualquier tecla para salir ');
READLN(op);
op:=upcase (OP);
if (op='Y') then
filas:=filas+1;
end;
/// no se si lo queres mostrar o que.... use 2 matrices para guardar en una el numero original y la otra para guardar el numero invertido porque no se si vas a necesitar o no para algo el numero original....
end.
ahi le arregle algunos errores.... creo que funciona no tuve tiempo de probarlo...
Gracias a las respuestas que me han dado profesor nacho y compañera natalia, sin embargo queria saber si hay una forma mas corta, me refiero en el caso del codigo de natalia, en cuanto a si seria mas facil porrejemplo con dos for que vayan recorriendo cada fila y columna respectivamente y en cada lectura llamar al procedimiento que invierte las cifras? si me corriges profesor por favor, me refiero a algo asi porejemplo:
for i:=1 to n do
for j:=1 to m do
invertircifras(i,j);
end j
end i
algo asi podria resumir un poco mas el codigo de natalia que me parece es correcto pero quiza algo extenso? podrias corregirnos a los dos profesor, muchisimas gracias por todas las correcciones que puedas brindarnos para mejorar.y una vez mas muchiismas gracias de igual forma para ti natalia
Efectivamente, se podría hacer con un doble for:
for i:=1 to n do
begin
for j:=1 to m do
begin
dato := matriz[i,j];
str(dato, texto);
textoInvertido := invertir( texto );
val(textoInvertido, matriz[i,j]);
end;
end;
Esa es la parte "más difícil", la lógica del problema. El resto que te sugería Natalia es básicamente la parte de introducción de datos, que también tendrás que hacer, pero que son partes más sencillas.
(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.)