[ Foro de Pascal ]

como hago? (estrella de un nombre)

25-Mar-2014 16:37
Invitado (mario9)
9 Respuestas

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.


31-Mar-2014 20:47
Invitado (mario9)

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


31-Mar-2014 20:58
Nacho Cabanes (+84)

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


31-Mar-2014 22:14
Invitado (mario9)

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



01-Apr-2014 01:57
Luis Torres (+18)

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.


01-Apr-2014 13:24
Invitado (mario9)

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


01-Apr-2014 15:15
Luis Torres (+18)

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


01-Apr-2014 15:32
Invitado (mario9)

extraordinario compañero luis, no se como agradecerte tanta generosidad, quiza aprendiendo de tus soluciones muchas gracias


01-Apr-2014 15:40
Nacho Cabanes (+84)

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.


01-Apr-2014 15:50
Invitado (mario9)

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