[ Foro de Pascal ]

matriz

15-Jan-2014 22:39
Invitado (carlos jurado)
7 Respuestas

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


15-Jan-2014 23:08
Nacho Cabanes (+31)

¿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?


19-Jan-2014 14:22
Invitado (carlos jurado)

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.


19-Jan-2014 23:21
Invitado (Natalia tavora)

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


20-Jan-2014 01:00
Nacho Cabanes (+31)

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").


20-Jan-2014 01:14
Invitado (Natalia tavora)

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...


20-Jan-2014 12:42
Invitado (carlos jurado)

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


20-Jan-2014 20:06
Nacho Cabanes (+31)

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.)