[ Foro de Pascal ]
hola, queria preguntar por un ejercicio, ojala me puedan hechar una mano amigos.
generar un programa pascal que permita imprimir:
x x x
u u u
n n n
i i i
xuniLinux
i i i
n n n
u u u
x x x
me gustaria si alguien me indicara como podria ser una posible solucion, y como en pascal para este caso puedo manejar los espacios correctamente para que me de esa forma de figura.
agradecido tios.
hola , no se si alguien me pueda orientar en este ejercicio, con aterioridad muchas gracias, y ojala el profesor pueda ayudarme, quisiera para iniciar como podria hacerse la parte digamos de reflejar la palabra ingresada por teclado como porejemplo linux para imprimirla como se ve:
xuniLinux
luego seria mi duda como posicionarme arriba y exactamente en :
iii
xuniLinux
muy agradecido con anterioridad, a quien como el profesor pueda brindarme su ayuda
Lo que pides es tan desconcertante que no sé por dónde empezar... Pero bueno, al menos algunas preguntas que me ayuden a entender qué quieres conseguir y cómo, porque das tan pocos detalles que la respuesta puede ser muy ambigua o muy poco útil:
1) ¿Es un ejercicio que te han pedido o algo que haces tú por hobby?
2) ¿De dónde sale ese texto Linux? ¿Prefijado o lo teclea el usuario? ¿Si lo teclea el usuario, la longitud será siempre de 5 letras?
3) ¿Qué sabrías hacer con asteriscos en vez con una palabra: escribir la línea central, las dos que rodean a la central, dibujar toda la estructura...?
4) ¿Puedes usar la unidad CRT, con órdenes como GotoXY, o debes usar consola "pura y dura", como si fueras a volcar a un fichero de texto?
http://www.aprendeaprogramar.com/referencia/view.php?f=gotoxy&leng=Pascal
hola profesor.
1) ¿Es un ejercicio que te han pedido o algo que haces tú por hobby?
rta. es un ejercicio de parte de un trabajo
2) ¿De dónde sale ese texto Linux? ¿Prefijado o lo teclea el usuario? ¿Si lo teclea el usuario, la longitud será siempre de 5 letras?
rta .es ingresado por teclado y la longitud varia segun la cadena que se ingrese
3) ¿Qué sabrías hacer con asteriscos en vez con una palabra: escribir la línea central, las dos que rodean a la central, dibujar toda la estructura...?
rta. con asteriscos lo maximo que he hecho ha sido un triangulo como:
*
**
***
****
4) ¿Puedes usar la unidad CRT, con órdenes como GotoXY, o debes usar consola "pura y dura", como si fueras a volcar a un fichero de texto?
si puedo usar unidad crt , para el goto(x,y), nada de archivos profesor.
como podria hacerse la parte digamos de reflejar la palabra ingresada por teclado como porejemplo linux para imprimirla como se ve:
xuniLinux
luego seria mi duda como posicionarme arriba y exactamente en :
iii
xuniLinux
....
muy agradecido con anterioridad, a quien como el profesor pueda brindarme su ayuda
Aquí te dejo un código que no te va a dejar mucho aprendizaje, porque está un poco lioso o liado (como dicen en España), pero hace lo que pides:
program MostrarCadena;
uses Crt;
var
cad: string[15];
cadena: string[25];
cad_caract: string[1];
i, tam, tam2: integer;
poscentralhoriz, poscentralvert, espacios: integer;
BEGIN
clrscr;
{ Pedimos la cadena }
repeat
writeln('Introduzca una palabra con numero de caracteres impar comprendido entre 3 y 13:');
readln(cad);
tam:= length(cad);
until (tam>=3) and (tam<=13) and (tam mod 2 <> 0);
{ Generamos la cadena procesada }
cadena:=cad;
for i:=2 to tam do
begin
cad_caract:= cad[i];
insert(cad_caract,cadena,1);
end;
tam2:= length(cadena);
{ writeln('La cadena procesada es: ',cadena, '. Y su longitud es: ',tam2); }
{ Mostramos en pantalla segun se nos ha indicado }
clrscr;
poscentralhoriz:= (80 - tam2) div 2;
poscentralvert:= 13;
espacios:= 2;
gotoxy(poscentralhoriz,poscentralvert); writeln(cadena);
poscentralhoriz:= (80 - 1) div 2;
for i:=2 to tam do
begin
{ Generamos la parte inferior }
gotoxy(poscentralhoriz, poscentralvert + i - 1); write(cad[i]);
gotoxy(poscentralhoriz + espacios, poscentralvert + i - 1); write(cad[i]);
gotoxy(poscentralhoriz - espacios, poscentralvert + i - 1); write(cad[i]);
{ Generamos la parte superior }
gotoxy(poscentralhoriz, poscentralvert - i + 1); write(cad[i]);
gotoxy(poscentralhoriz + espacios, poscentralvert - i + 1); write(cad[i]);
gotoxy(poscentralhoriz - espacios, poscentralvert - i + 1); write(cad[i]);
espacios:= espacios + 1;
end;
readln;
END.
Saludos.
buen dia luis, gracias por tan perfecta solucion, es verdad que claro hay mucho codigo que entenderas no asimilo , por eso queria pedirte por favor me guies en partes que no se que estas haciendo, porejemplo:
for i:=2 to tam do
begin
cad_caract:= cad[i];
insert(cad_caract,cadena,1);
end;
tam2:= length(cadena);
por que inicias el i en 2 y en general que intentas hacer en este fragmento y si eres tan amable de explicarme algo de esta parte, es que mi intencion es entenderlo y te lo agradezco,
for i:=2 to tam do
begin
{ Generamos la parte inferior }
gotoxy(poscentralhoriz, poscentralvert + i - 1); write(cad[i]);
gotoxy(poscentralhoriz + espacios, poscentralvert + i - 1); write(cad[i]);
gotoxy(poscentralhoriz - espacios, poscentralvert + i - 1); write(cad[i]);
una ultima cosa luis, quiza por cuestiones de desajustes al enviar el emnsaje se distorsiono un poco la forma de la figura, me refiero a que deberia cambiar si la distribucion fuese:
x x x
u u u
n n n
iii
xuniLinux
iii
n n n
u u u
x x x
es decir luis con respecto a tu solucion fijate que varia en quelas letras de arriba y abajo concuerdan con las letras respectivas de la palabra central , es decir las x extremas de la primera linea concuerdan con las x extremo de xuniLinux y la central formado la palabra linux esto para las demas letras tanto arriba y abajo, osea la fila dos de las n las de arriba las dos de los extremos deben coincidir con las n de xuniLinux y asi para las de abajo y para todas, que deberia cambiar en tu codigo para dicho resultado que es como lo necesito?? muchisimas gracias luis
'cad' guarda la cadena inicial, que en tu ejemplo sería la palabra "Linux"
'cad_caract' es una cadena de un caracter que me permitirá trabajar con insert, ya que con esta función no puedo usar variables char sino string.
'cadena' va a guardar la cadena inicial junto con su reflejo, o sea, que para tu ejemplo sería "xuniLinux"
Tomo desde i:= 2, en 'cad', porque voy a trabajar desde el caracter 'i' hasta el último, osea 'x', ya que éstos serán los que van a aparecer arriba y abajo de 'cadena' (osea, en "xuniLinux").
Inicialmente lo hice de la manera que lo estás indicando ahora, pero me fijé bien en el ejemplo y lo modifiqué para saliera exacto a ese ejemplo. La solución es inicializar la variable 'espacios' en uno, en vez de dos.
Saludos.
extraordinario compañero luis, no se como agradecerte tanta generosidad, quiza aprendiendo de tus soluciones muchas gracias
Hay otra alternativa más larga, pero que puede ser más legible: crear procedimientos "EscribirIzquierda", "EscribirAbajo", "EscribirArribaDerecha" y similares, que dibujen el texto en una cierta dirección.
Todos ellos se basarían en un único procedimiento, que escribiera un texto según un cierto incremento de X (1 para derecha, -1 para izquierda) y un cierto incremento de Y (1 para abajo, -1 para arriba).
De hecho, bastaría con llamar a este único procedimiento 8 veces, pero el fuente puede resultar más legible creando procedimientos auxiliares para cada dirección.
Aquí tienes un esqueleto al que se podrían añadir fácilmente las direcciones que faltan:
program EstrellaParcial;
uses crt;
procedure Escribir(texto: string;
x, y, incrX, incrY: integer);
var
i: byte;
begin
for i := 1 to length(texto) do
begin
gotoXY(x,y);
write(texto[i]);
x := x + incrX;
y := y + incrY;
end;
end;
procedure EscribirIzquierda(texto: string; x, y: integer);
begin
Escribir(texto,x,y,-1,0);
end;
procedure EscribirArribaDerecha(texto: string; x, y: integer);
begin
Escribir(texto,x,y,1,-1);
end;
begin
EscribirArribaDerecha('Linux',20,10);
EscribirIzquierda('Linux',20,10);
gotoXY(1,1);
end.
y cuyo resultado sería
x
u
n
i
xuniL
Este planteamiento, siendo más largo, es más versátil y más fácil de reutilizar para otros problemas similares.
ufff profesor impecable y magistral tambien tu solucion, millones de gracias a los dos.
(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.)