[ Foro de Pascal ]

Invertir una parte de una string

14-Jun-2016 01:09
Invitado (Lucía)
5 Respuestas

Hola! Tengo que realizar este ejercicio: Se necesita encriptar un mensaje ingresado por teclado, con una longitud máxima de 80 caracteres, los cuales pueden ser números, letras y/o símbolos. Para ello se tomará desde el 2º hasta el 5° espacio en blanco,
para escribir dicho contenido en forma inversa.
Se me pide utilizar array. Yo lo hice, pude dar vuelta la frase entera pero no una parte de la misma y luego volver a colocarla. Ya se me rompió la cabeza y no le encuentro la vuelta xD Les paso el código, si alguien tiene una idea se la agradecería muchísimo.


PROGRAM EJERC101; 
uses crt;
var
original: array [1..80] of char;
invertida: array [1..80] of char;
cadena, invertir:STRING[80];
g: char;
i,esp, posic, primeresp, a, b, c,  ultimoesp:INTEGER;

BEGIN
esp:= 0;
posic:= 0;
g:= ' ';
writeln('Escriba el mensaje a encriptar');
readln(cadena);

 FOR i:=1 TO length(cadena) DO
     BEGIN
           original[i]:= cadena[i];
           WRITE (original[i]);
     END;



     FOR i:=length(cadena) DOWNTO 1 DO
     BEGIN
          invertir[i]:=cadena[i];
          write(' ');
          write(invertir[i]);
     END;
for c:= 1 to length(invertir) do
begin
        g:= invertir[c];
        if (invertir[c]=' ') then
                      begin
                        esp:= esp + 1;
                        posic:= c;
                      end;
        if esp=2 then  begin primeresp:= posic; end;;
        if esp=5 then begin ultimoesp:= posic; end;
end;
writeln(primeresp, ultimoesp);
for a:= (primeresp) to (ultimoesp) do
original[a]:= invertir[a];
writeln(original);
delay(10000);
end.


 


16-Jun-2016 20:33
Luis Torres (+18)

En el siguiente fragmento de código, si lo que querías hacer es rellenar la variable "invertir" con los caracteres de atrás hacia adelante, no estás logrando tu cometido. Lo que está haciendo en realidad es recorrer "cadena" desde atrás hacia adelante y asignarle cada carácter a "invertir", pero en esa misma posición, por lo que "cadena" como "invertir" quedarán iguales (aunque no tan iguales, porque hay algo que debes saber sobre los tipo string y tipo char que no te lo he explicado). Los caracteres se imprimen en pantalla de la forma correcta porque los estás leyendo en el orden inverso, pero si más adelante haces un writeln(invertir) observarás que te mostrará la misma secuencia de carácteres que "cadena". Este es el segmento de código al que me refiero:


   FOR i:=length(cadena) DOWNTO 1 DO 
    BEGIN 
         invertir[i]:=cadena[i]; 
         write(' '); 
         write(invertir[i]); 
    END; 



Ese es el primer fallo que veo. Hay otro que está relacionado a los tipos string y arrays de char, te recomiendo que leas al respecto en el tutorial de profesor Nacho Cabanes, es muy importante que lo tengas presente porque de allí surgen los problemas de lectura de las variables "primeresp" y "ultimoesp", éstas no están guardando los valores que esperas, sino que siempre valdrán 0.

Espero haberte orientado, aunque sea un poco, sé que no es mucho, pero trata de pensar resolver el problema considerando lo anterior, allí está la clave, sin embargo, en términos generales se nota que has pensado en un esquema de solución muy bueno, de seguro encontrarás los detalles correctos.

Saludos.


20-Jun-2016 02:36
Luis Torres (+18)

Pensándolo bien, yo creo que la mejor forma de resolver este problema es usando únicamente tipos de datos string. Las ventajas son muchas, primero es un tipo de dato más avanzado que el arreglo de char, el mismo lenguaje te provee de una serie de funciones y procedimientos de manejo de cadenas que hará las cosas mucho más fáciles y, es un tipo de datos pensado especialmente para almacenamiento de cadenas.

Las funciones o procedimientos copy, delete e insert te serán muy útiles, además de length que ya la has utilizado. Como ya ha pasado mucho tiempo que escribiste el post y yo ya hice un código; me permito el escribirlo a continuación, espero que te sea de utilidad:


program InvertirSubCadena;

uses Crt;

var
  cadena, subcadena, invertida: string[80];
  
  i, esp, primeresp, ultimoesp: integer;
  
BEGIN
  writeln('Escriba el mensaje a encriptar: ');
  readln(cadena);
  { Determinemos en que posicion estab el segundo y quinto espacios en blanco }
  esp:= 0;
  for i:=1 to length(cadena) do
  begin
    if (cadena[i] = ' ') then
	begin
	  esp:= esp + 1;
	  if esp = 2 then primeresp:= i;
	  if esp = 5 then ultimoesp:= i; 
	end;
  end;

  { Extraemos la subcadena a invertir }
  subcadena:= copy(cadena,primeresp + 1, ultimoesp - primeresp - 1);
  writeln('La subcadena es: ',subcadena);
  
  { Invertimos la subcadena }
  invertida:= subcadena;
  for i:=length(subcadena) downto 1 do
   invertida[length(subcadena) - i + 1]:= subcadena[i];
  writeln('Cadena invertida: ', invertida);
  
  { Ahora tenemos que insertar la cadena invertida en la cadena original }
  delete(cadena,primeresp + 1,ultimoesp - primeresp - 1); { Pero antes hay que borrar todos los caracteres de la subcadena }
  insert(invertida,cadena,primeresp + 1);
  writeln('La cadena encriptada es: ', cadena);
 
  readln;
END.  


Saludos.


29-Jun-2016 00:35
Lucy Brown

¡Muchísimas gracias! Disculpame que no te respondí con anterioridad. Ahora el tema del ejercicio es que lo tenía que hacer con array, pero con lo que me pasaste ya estoy más que ubicada. De nuevo muchísimas gracias.
Saludos.


06-Jul-2016 16:08
Invitado (Magali)

hola.. yo estoy queriendo sacar el mismo ejercicio.. pero necesito que este mismo ejercicio haga que si hay 2 espacios pero menos de 5 espacios que encripte del 2do espacio hasta el final de la frase. si me podiras ayudar seria genial!!!


10-Jul-2016 07:04
Invitado (Luis)

Sería bueno que colocaras un ejemplo a manera de tener más claro cómo debe quedar la cadena encriptada con esos espacios en blanco de más.

Saludos.






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