[ Foro de Pascal ]
Hola de nuevo, gracias por toda su ayuda, es que necesito realizar el marco para una matriz de la siguiente forma:
8 X X X X X X X X
7 X X X X X X X X
6 X X X X X X X X
5 X X X X X X X X
4 X X X X X X X X
3 X X X X X X X X
2 X X X X X X X X
1 X X X X X X X X
a b c d e f g h
Me podrian por favor ayudar en como poder hacer dicha matriz es que no se como hacerlo , cualquier ayuda me seria muy util y les agradezco su tiempo y el apoyo que nos dan para aprender.
No acabo de entender la pregunta...
¿Tienes una matriz de 8x8 y quieres escribir los números del 8 al 1 al principio de cada fila, y las letras de la "a" a la "h" en la parte inferior?
En realidad vendría a ser una matriz de 9x9 y el caracter que está en la fila 9 columna 1 es el espacio en blanco. De ser así, este sería el código:
program Matriz;
var
mat: array[1..9,1..9] of char;
i,j,valor: integer;
carNum: string;
car: char;
BEGIN
for i:=1 to 9 do
for j:=1 to 9 do
begin
if (j=1) and (i<>9) then
begin
valor:= 9-i;
str(valor,carNum);
car:=carNum[1];
mat[i,j]:= car;
end
else if (j=1) and (i=9) then
mat[i,j]:= ' '
else if (i<>9) then
mat[i,j]:= 'X'
else
mat[i,j]:= chr(j+95);
end;
for i:=1 to 9 do
begin
for j:=1 to 9 do
write(mat[i,j],' ');
writeln;
end;
readln;
END.
Se podría hacer de una manera más sencilla, pero no quise cambiarlo. Saludos.
Gracias Luis, era lo que pedia y te lo agradezco muchiismo, se nota que sabes programar muy bien, me gustaria contactar contigo si es posible, y antes tambien preguntarte cual es esa otra forma mas sencilla, seria muy positivo para mi y quiza para el resto de compañeros , sino te importa claro.
muy agradecido.
Mira, la verdad, no dispongo de mucho tiempo. Esta semana estuve libre, pero de unos días vuelvo a estar muy ocupado. Quise venir aquí porque este foro es muy bueno y, me ha aclarado muchas dudas.
A continuación te dejo el código modificado, más sencillo:
program Matriz2;
var
mat: array[1..9,1..9] of char;
i,j,valor: integer;
BEGIN
for i:=1 to 9 do
for j:=1 to 9 do
begin
if (j=1) and (i<>9) then
begin
mat[i,j]:= chr(57-i);
end
else if (j=1) and (i=9) then
mat[i,j]:= ' '
else if (i<>9) then
mat[i,j]:= 'X'
else
mat[i,j]:= chr(j+95);
end;
for i:=1 to 9 do
begin
for j:=1 to 9 do
write(mat[i,j],' ');
writeln;
end;
readln;
END.
Hola luis, me podrias explicar dentro del for j, cuando esta en 1 vale, pero por donde entra el j cuando hace la segunda pasada y el resto de ellas por que no se si estoy equivocado pero en ese caso solo el for lo estas utilizando solo para una sola pasada y el resto de pasadas no las utilizas y me dejas con la duda si eso es correcto u optimo, ademas no entiendo por que es necesario en este caso hacer:
for i:=1 to 9 do
for j:=1 to 9 do
begin
if (j=1) and (i<>9) then
begin
mat[i,j]:= chr(57-i);
es decir por que conviertes lo que son numeros en caracteres, osea por que haces que mat[i,j]:= '8'
no podria tomarse directamente asi:
for i:=1 to 9 do
for j:=1 to 9 do
begin
if (j=1) and (i<>9) then
begin
mat[i,j]:= 9-i; de tal forma que en este caso mat[i,j]:= 8
pero como numero
gracias por cualquier explicacion que me puedas brindar al caso y bueno lo de tu tiempo no lo sabia pero si gustas te dejo mi correo por si cuando quieras miramos cosas, el profesor nacho nos da la opcion de ponerlo y luego el lo quita por seguridad, pero bueno eso ya lo que me digas tu luis, yo hasta hace pocos dias entre a este foro y he aprendido muchiismo, estoy muy enganchado ahora aqui, ademas por que el profesor nacho da unas explicaciones y soluciones unicas
No entendí muy bien tu pregunta (la primera parte). En cuanto a la razón por la que convierto los números a caracteres numéricos ascii, es porque la matriz contiene X's y letras desde la 'a' a la 'h', entonces tuve que declarar el arreglo como una matriz de caracteres (char). Si trato de meter un número entero en una varable char generará un error, así que todo lo debo transformar a caracteres. Dentro de la tabla ascii hay caracteres númericos, y eso facilita las cosas. Si ves arriba y contabilizas el número de filas y columnas te darás cuenta que hay 9 filas y 9 columnas, de ahí que se toman ambos ciclos for del 1 al 9.
Lo mejor es que sigas colocando tus dudas en este foro, el profesor Nacho está entrando todos los días, así que no tendrás ningún problema en que él te de una respuesta profesional. Yo estaré muy ocupado y no quiero comprometerme. A veces tú ayudas a la gente y al final se convierten en tus enemigos.
Saludos.
Hola profesor nacho y compañero luis.
Ante todo no se por que dices eso al final luis :'A veces tú ayudas a la gente y al final se convierten en tus enemigos. ', de todas formas respeto tu opinion y sin mas queria preguntaros por la cuestion que en el mensaje anterior a tu codigo plante y es que no me gustaria quedar con esa duda, la referente a que haces un for interno :
for j:=1 to 9 do
begin
if (j=1) and (i<>9) then
begin
mat[i,j]:= chr(57-i);
end
else if (j=1) and (i=9) then
mat[i,j]:= ' '
else if (i<>9) then
mat[i,j]:= 'X'
else
mat[i,j]:= chr(j+95);
end;
mi pregunta si hago un seguimiento y espero este en lo correcto es que solo entraria a este for cuando j:=1, en los demas casos creo a mi punto de ver no se y por favor me lo corrigen si estoy errado, que solo se realizan las demas iteraciones, es decir a partir de j:=2 hasta j:=9 , si es correcto mi seguimiento, os pido el favor si hay forma de hacerle alguna modificacion para no desperdiciar esas iteraciones, se que no son muchas pero si hay una forma me gustaria saberlo por inquietud y aprender.
Por otra parte es que quise llevar el mismo ejercicio al caso de hacer una variente utilizando variables type definidas por el usuario:
program marco_matriz;
uses crt;
type tpDecision = ( libre, aceptado, letra );
tpElementosDecision = array[1..8, 'a'..'h'] of tpDecision;
procedure mostrarMatriz(elemts: tpElementosDecision);
var f, valor: integer; c: char;
begin
for f:= 8 downto 1 do
begin
for c:='a' to 'h' do
begin
if elemts[f,c] = letra then
write('M ')
else
if elemts[f,c] = aceptado then
write('X ')
else
write('O '); //letra O
end;
writeln;
end;
end;
bien con esto independientemente de lo que hace el minijuego optengo
para una entrada como:
1 a // 1 es la fila y a la columna del marciano.
O O O O O O O O
O O O O O O O O
O O X X X X X X
O O O O O O O O
X X X X X X X X
X X X X X X X X
X X X X X X X X
M X X X X X X X
pues bien de igual forma con dicho procedimiento he intentado en base al ejemplo de luis hacer lo mismo, pero he hecho no se cuantos intentos hoy y no he podido, quiza si me pudieran hechar una mano de como deberia hacer para que con el mismo procedimiento que repìto me da el resultado esperado tal como esta, como podria ser para que el resultado saliera con el marco:
para una entrada como:
1 a // 1 es la fila y a la columna del marciano.
8 O O O O O O O O
7 O O O O O O O O
6 O O X X X X X X
5 O O O O O O O O
4 X X X X X X X X
3 X X X X X X X X
2 X X X X X X X X
1 M X X X X X X X
a b c d e f g h
como veias lo unico que quiero es dentro de ese procedimiento lograr que pueda imprimir en pantalla el marco numerico de cada fila y el marco caracter de las columnas tal como se ve.
agredezco muchisimo vuestra ayuda, pues es algo que quise hacer a manera personal intentando aplicar lo que luis hizo en el primer planteamiento, es decir ahora usando el procedimiento que os puse en este nuevo hilo.
Con lo de "A veces tú ayudas a la gente y al final se convierten en tus enemigos", imagino que Luis se refiere a la sensación que en algún momento hemos tenido todos los que intentamos ayudar: puede ocurrir que malinterpretes alguna pregunta, guíes a alguien en una dirección que no era la correcta para lo que realmente quería, y resultes ser "el malo de la película" por haberle hecho perder tiempo. Y es algo muy desmotivador.
Por eso muchas veces mi primera respuesta es "¿te refieres a esto o a esto otro?", de modo que pueda saber mejor hacia dónde dirigir la respuesta (y hacer que mi escaso tiempo libre cunda un poco más).
Volviendo a tu pregunta, ocurre lo que imaginaba (mira mi primera respuesta en este hilo): no querías dibujar una matriz de 9x9 caracteres, sino una matriz de 8x8 con un marco adicional alrededor, formado por una columna inicial de números y una fila inferior de letras.
Pero no es difícil: partiendo de tu base, basta con mostrar un número al principio de cada fila, y una última fila adicional de las letras, algo como:
procedure mostrarMatriz(elemts: tpElementosDecision);
var f, valor: integer; c: char;
begin
for f:= 8 downto 1 do
begin
write(f, ' '); (* Número de fila *)
for c:='a' to 'h' do
begin
if elemts[f,c] = letra then
write('M ')
else
if elemts[f,c] = aceptado then
write('X ')
else
write('O '); //letra O
end;
writeln;
end;
write(' a b c d e f g h'); (* Pie, con códigos de columnas *)
end;
Gracias profesor Nacho, muy acertada tu respuesta, ya solucione el problema, en parte a tus excelentes explicaciones como las de Luis.
profesor disculpa es que aun me queda de este hilo la gran duda respecto a la tambien correcta respuesta del compañero Luis, especificamente en el for interno que realiza:
...
for j:=1 to 9 do
begin
if (j=1) and (i<>9) then
begin
mat[i,j]:= chr(57-i);
end
else if (j=1) and (i=9) then
mat[i,j]:= ' '
else if (i<>9) then
mat[i,j]:= 'X'
else
mat[i,j]:= chr(j+95);
end;
al hacer un seguimiento del programa y espero este en lo correcto, se estaria solo entrando a este for j:=1 to 9 , cuando j:=1, en los demas casos solo se realizan las demas iteraciones sin tener un efecto significativo dentro del programa, es decir a partir de j:=2 hasta j:=9 , si es correcto mi seguimiento, habria alguna forma de hacerle alguna modificacion para no desperdiciar esas iteraciones, se que no son muchas pero si hay una forma me gustaria saberlo por inquietud y aprender.
mil gracias, por lo demas de este hilo es la unica inquietud que me queda,...gracias.
Para no tener que hacer tantas comprobaciones, la alternativa es la que te he mostrado: el número del principio se muestra siempre, al principio de cada fila, y las letras del pie se muestra tras todas las iteraciones.
Aun así, incluyo una versión comentada de la propuesta de Luis, para que sea más fácil de leer, por si alguna parte de la lógica de esa solución no te resulta clara:
...
for columna:=1 to 9 do
begin
if (columna=1) and (fila<>9) then (* Primera columa de los datos: número *)
begin
matriz[fila,columna]:= chr(57-fila); (* Número desde 9, descendiendo *)
end
else if (columna=1) and (fila=9) then
matriz[fila,columna]:= ' ' (* Espacio en la esquina inferior izqda*)
else if (fila<>9) then
matriz[fila,columna]:= 'X' (* Datos fuera del marco *)
else
matriz[fila,columna]:= chr(columna+95); (* Letras, última fila *)
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.)