[ Foro de Pascal ]
hola gracias por la atencion que puedan prestarme y por su ayuda.
como hago para dada una palabra pueda imprimir en pantalla la siguiente figura:
ejemplo:
oracion: protagonista
altura:4
t a g o
o n
r i
p s t a
muchisimas gracias por su ayuda, tengo problemas en cosas tales de como ir tomando de 4 en 4 caracteres de la oracion
¿Te permiten usar "gotoxy"?
Está claro que vas a trabajar con los índices de la cadena, en la notación de arrays. Como por ejemplo, cadena[1], cadena[2],..., cadena[n]. Para cada cuatro caracteres de la cadena se cumple la siguiente condición:
índice_cadena mod 4 = 0
Saludos.
hola nacho y luis. nacho si se me permite usar gotoxy y luis es que eso lo tenia pensado lo del mod lo que no se es como hacer para ir almacenando cada mod 4 esa parte de la cadena, me sugieres quiza un for:
n:=length(cadena);
for i:=1 to n do
if ( i mod 4 = 0 ) then
cad4:=cad4 +cadena[i]
es que no entiendo bien luis ayudame por favor.
Si te fijas bien, para cualquier cadena de cualquier tamaño, la forma de mostrarla en pantalla es siguiendo una secuencia que se repite cíclicamente; primero cuatro caracteres hacia arriba, luego cuatro caracteres horizontales, después cuatro caracteres hacia abajo y por último cuatro caracteres horizontales; una vez hecho esto se vuelve a repetir el ciclo (hacia arriba 4, horizontal 4, vertical abajo 4, horizonal 4).
Yo lo que haría es definir una variable inicializada en 1, y se incrementa cada vez que índice_for mod 4 = 0. Si el incremento llegase a ser 5, entonces le asignamos el valor 1 para comience el ciclo nuevamente. Cuando esa variable valga 1, la cadena se imprimirá hacia arriba, cuando valga 2 horizonal, para 3 vertical y para 4 horizonal.
Esa sería, más o menos, la estrategia de solución que yo aplicaría para resolver este problema
Saludos.
hola compañero luis, por favor necesito tu ayuda,a ver si lo que me dices en tu explicacion es algo como lo que intento plasmar, pero tengo duda en lo que me dices de cuando la variable tome el valor 1: la cadena se imprimirá hacia arriba, etc. o es que deben haber dos variables una que controle la longitud de la palabra y la otra la que mencionas tu, es que estoy algo confuso compañero, lo estoy intentando pero me cuesta, si pudieras hecharme una ayuda con el codigo que intento y me corrijas o lo que sea de tu generosidad sera mucho para mi. gracias luis
program figura_texto;
uses crt;
var i,j,n:integer;
palabra:string;
begin
writeln('digite una palabra:');
readln(palabra);
n:=length(palabra);
i:=1;
while i<=n do
begin
if (i mod 4 =0) then
begin
i:=i+1;
if i:=5 then
i:=1
end;
end;
Con ese código recorres la cadena y descubres cuando debes "girar". Ahora te falta pensar cómo girar. Por ejemplo, puedes tener un "incremento de X" y un "incremento de Y". Si incrX = 1 e incrY = 0, escribes hacia la derecha, Si incrX = 0 e incrY = -1, escribes hacia arriba, y así sucesivamente. Mira este ejemplo:
program TextoDirecciones;
uses crt;
var
x, y: integer;
incrX, incrY: integer;
i: integer;
frase: string;
begin
x := 40;
y:= 15;
frase := 'EjemploDeFrase';
incrX := 0;
incrY := -1;
for i := 1 to length(frase) do
begin
gotoXY(x, y);
write(frase[i]);
x := x + incrX;
y := y + incrY;
end;
gotoXY(1,1);
end.
hola profesora nacho, gracias por responder a mi duda, lo necesitaba y mas en la forma en que me lo explicas en tu codigo.
queria preguntarte si hay una forma mejor que la que tengo respecto a recorrer la cadena y descubrir cuando se debe debe "girar", pues siguiendo el lineamiento del compañero luis
en mi codigo no entiendo en que momento cuando hago la variable nuevamente igual a 1,(cuando el incremento llega a ser 5), para comienzo de ciclo nuevamente. en que forma Cuando esa variable valga 1, la cadena se imprimirá hacia arriba, cuando valga 2 horizonal, para 3 vertical y para 4 horizonal. como hago para hacer que mi variable valga 2 o 3 o 4 pues cada que llega a i:=i+1 =5 inicio el ciclo nuevamente, como almacenos entonces esos valores para los que la variable valga 2 para imprimir la cadena hacia arriba, o 3 para imprimirla verticlmente, etc, como explica el compañero luis ????
i:=1;
while i<=n do
begin
if (i mod 4 =0) then
begin
i:=i+1;
if i:=5 then
i:=1
end; ???
end;
gracias a los dos por cualquier ayuda que me brinden y por la ya recibida.
Yo prepararía un "array de direcciones": cuando empiezas debes moverte hacia arriba (Ix=0, Iy=-1), luego a la derecha (Ix = 1, Iy=0), luego abajo (Ix=0, Iy=1), etc.
Cada vez que "i mod 4" vale 0, tomas los datos de la siguiente dirección. Cuando agotes todas las direcciones (que puede ocurrir si la palabra es muy larga), vuelves a empezar por la primera otra vez.
buenos dias profesor, que bueno recibir tan temprano tu respuesta, aunque poco la entendi y disculpame por ello, queria preguntarte si mi codigo estaria bien:
program palabratriangulo;
uses crt;
var palabra:string[15];
n,i,alt:byte;
begin
clrscr;
writeln('ingrese una palabra :');
readln(palabra);
writeln('ingrese la altura de la ola :');
readln(alt);
clrscr;
n:=length(palabra);
limite:=false;
i:=1;
while (i<=n) do
begin
if(i mod 4 =0) then
begin
i:=i+1;
case i of
1:imprimirArriba;
2:imprimirDerecha;
3:imprimirAbajo;
4:imprimirHoizontal;
else
begin
i:=1;
end;
end;
end;
readkey;
end.
o que me corregirias de el ? o si puedes plasmar tu idea o la de luis en algo de codigo por favor quiza lo comprenda mas facil, mil gracias es poco
Tu idea se va acercando, pero esos "imprimirAbajo" y demás tendrían que parecerse al esqueleto que te he mostrado antes, y necesitarían recibir parámetros, como la posición en la que hay que empezar y la cantidad de letras a escribir, para evitar usar variables globales.
Yo ampliaría el ejemplo que te he enseñado, ya sea con un "array de records" para las direcciones o (más simple, aunque menos elegante) dos arrays paralelos, para X e Y, así:
program TextoDirecciones2;
uses crt;
const
DIRECCIONES = 4;
LETRAS_POR_DIRECCION = 4;
var
x, y: integer;
i: integer;
frase: string;
direcX, direcY: array[1..DIRECCIONES] of integer;
direccionActual: byte;
begin
direcX[1] := 0; direcY[1] := -1; { Arriba }
direcX[2] := 1; direcY[2] := 0; { Derecha }
direcX[3] := 0; direcY[3] := 1; { Abajo }
direcX[4] := 1; direcY[4] := 0; { Derecha }
direccionActual := 1;
x := 20;
y:= 15;
frase := 'EjemploDeFraseDePruebaBastanteLarga';
for i := 1 to length(frase) do
begin
gotoXY(x, y);
write(frase[i]);
x := x + direcX[direccionActual];
y := y + direcY[direccionActual];
if (i mod LETRAS_POR_DIRECCION = 0) then
begin
direccionActual := direccionActual + 1;
if direccionActual > DIRECCIONES then
direccionActual := 1;
end;
end;
gotoXY(1,1);
end.
Que escribiría
ploDe baBas
m F e t
e r u a a
j a r n g
E seDeP teLar
(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.)