[ Foro de Pascal ]

ayuda palabra

05-May-2014 18:24
Invitado (popocho94)
10 Respuestas

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


05-May-2014 19:00
Nacho Cabanes (+84)

¿Te permiten usar "gotoxy"?


05-May-2014 20:20
Luis Torres (+18)

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.


05-May-2014 21:03
Invitado (popocho94)

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.
   


06-May-2014 17:23
Luis Torres (+18)

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.


06-May-2014 20:56
Invitado (popocho94)

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;


     


06-May-2014 23:16
Nacho Cabanes (+84)

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. 



07-May-2014 09:44
Invitado (popocho94)

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.


07-May-2014 10:03
Nacho Cabanes (+84)

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.


07-May-2014 11:40
Invitado (popocho94)

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


07-May-2014 14:08
Nacho Cabanes (+84)

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