[ Foro de Pascal ]

ideas y sugerencias para dos programa de cadenas...

17-Apr-2012 10:02
oscar gomez
13 Respuestas

Cordial saludo profesor Nacho cabanes y compañeros.


ante todo agradecerles su atencion y por supuesto la ayuda que puedan brindarme en ideas o sugerencias o algun algoritmo de como seria una buena solucion para los siguientes dos programas:

1.
UNA PALABRA ES UNA SECUENCIA DE 1 O MAS CARACTERES SEGUIDOS , DISTINTOS DE BLANCOS.UNA LINEA DE PALABRAS ES UNA SECUENCIA DE PALABRAS SEPARADAS ENTRE SI POR UNO O MAS BLANCOS.EN UNA LINEA UNA LETRA SE LLAMA FRECUENTE SI APARECE EN DOS O MAS PALABRAS. CONSIDERANDO LA SIGUIENTE DEFINICION PASCAL:

TYPE
conjuntoLetras= SET of ‘A’..’Z’;

SE PIDE CODIFICAR EL PROCEDIMIENTO:
PROCEDURE EncontrarFrecuentes( Var frecuentes:conjuntoLetras);


QUE LEA UNA LINEA DE PALABRAS POR LA ENTRADA ESTANDAR Y QUE ALMACENE EN FRECUENTES LAS LETRAS FRECUENTES EN LA LINEA SEGÚN LA ESPECIFICACION DADA ANTERIORMENTE. EL TRATAMIENTO DE LA LINEA SE DEBERA REALIZAR SEGÚN EL PATRON ANTERIOR – ACTUAL. SE CONSIDERARAN LAS LETRAS MINUSCULAS IGUALES A LAS CORRESPONDIENTES MAYUSCULAS.
EJEMPLO:

TRAS PROCESAR LA LINEA DE PALABRAS:
EN UN LUGAR DE LA MANCHA.
FRECUENTES DEBERIA SER IGUAL AL CONJUNTO:
[ ‘E’ , ‘N’ , ‘U’ , ‘L’ , ‘A’]


-------------------------------------------------------------
2.
REALICE UN PROGRAMA PASCAL QUE LEA N PAREJAS DE PALABRAS, LAS CUALES SON ANTÓNIMOS. EL PROGRAMA DEBE ESCRIBIR LAS LETRAS COMUNES A LAS DOS PALABRAS. SI UNA LETRA APARECE MÁS DE UNA VEZ EN LA PALABRA Y EN SU ANTÓNIMO, DEBE REGISTRASE UNA SOLA VEZ. AL FINAL SE DEBE IMPRIMIR EL NÚMERO DEL PAR QUE TIENE MÁS LETRAS EN COMÚN Y LA CANTIDAD DE LETRAS EN COMÚN:
POR EJEMPLO:

INTERESANTE     ABURRIDO       IRA
GORDO           FLACO          O
ALEGRE          TRISTE         ER
ALTO            BAJO           AO


PAR CON MÁS LETRAS EN COMÚN:
ES EL PAR   INTERESANTE    ABURRIDO
Y TIENE 3 LETRAS EN COMÚN.

les agradezco cualquier idea, sugerencia o algoritmo que pueda permitirme solucionarlos, mil gracias


08-May-2012 11:21
oscar gomez

cordial saludo profesor Nacho Cabanes. ante tod mil gracias por ayudarnos y regalarnos algo de tu valioso tiempo.

profesor queria pedirte orientacion o algunas ideas para poder desarrollar estos dos ejercicios, cualquier opinion seria importante para saber mas o menos como enfocar una posible solucion a los mismos.
mil gracias por tu atencion.


08-May-2012 13:24
Nacho Cabanes (+84)

Vamos uno por uno. Empezamos por el segundo, que es más fácil. Yo te doy pistas, tú lo desarrollas, te digo si veo fallos, y, cuando esté bien, pasamos al primero. Y cuando el primero esté bien, vamos a por el otro que has consultado de los valores cero...  ;-)

La idea básica del segundo es:

DEBE ESCRIBIR LAS LETRAS COMUNES A LAS DOS PALABRAS

Ejemplo:    ALTO            BAJO          AO

(hay que hacer alguna mejora posterior, como no repetir y mostrar un resumen, pero vamos a centrarnos en esto).

Una forma sencilla de hacerlo sería:

- Para cada letra de la primera palabra
-   Si esa letra aparece en la segunda palabra
-     Escribir esa letra

¡Vamos con ello!


08-May-2012 21:11
Luis Torres (+18)

¿Será hacer lo siguiente?:

var
 palabra1, palabra2: string;
 letra: char;
 i,j: integer;

BEGIN
palabra1:= 'ALTO';
palabra2:= 'BAJO';
for i:=1 to length(palabra1) do
 begin
   letra:= palabra1[i];
   for j:=1 to length(palabra2) do
     if letra=palabra2[j] then
       write(letra);
 end;
readln;
END.


Quisiera hacer una pregunta: ¿cómo le doy formato con colores al código?.

Saludos.


08-May-2012 23:14
Nacho Cabanes (+84)

Efectivamente, Luis, sería así. Yo lo haría dentro de una función, para que el programa resultante sea un poco más modular y un poco más legible.

Para que el fuente se vea con colores en el foro, tienes que dar dos pasos:

1.- Debajo del cuerpo del mensaje, en la casilla que pone "Tipo de formato", no deberás escoger "formato de texto plano", que es el que mejor resultado da normalmente para los fuentes porque respeta los espacios en blanco múltiples, sino "formato automático".

2.- Deberás incluir la línea

antes de tu fuente y la línea 

al final.

Así, el servidor, al analizar el formato automático de tu mensaje, se dará cuenta de esas etiquetas especiales y coloreará tu fuente cada vez que vaya a mostrarlo.


08-May-2012 23:27
Nacho Cabanes (+84)

Aquí está el ejemplo de cómo lo haría yo. Me he limitado a sacar todo a una función que devuelve un "string", y de paso he eliminado tu segundo "for" para reemplazarlo por una función "pos", que hace el mismo resultado:



program BuscarLetrasComunes;

function letrasComunes(s1, s2: string): string;
var
  letra: char;
  i: integer;
  resultado: string;
begin
resultado := '';
for i:=1 to length(s1) do
  begin
    letra:= s1[i];
    if pos(letra, s2) > 0 then
        resultado := resultado + letra;
  end;
letrasComunes := resultado;
end;



(* Cuerpo del programa *)

begin
    writeLn(letrasComunes('ALTO', 'BAJO'));
end.

09-May-2012 03:16
Luis Torres (+18)

El problema de nuestros códigos es que si hay una letra que se repite dentro de una misma palabra y se encuentra en la otra, pues aparecerá varias veces.
Saludos.


09-May-2012 09:20
oscar gomez

Gracias  profesor Nacho cabanes y a ti luis por vuestras respuestas,no alcance a formular mi solucion, estaba en ello, es evidente que me cuesta mas,les agradezco su tiempo. mil gracias.


09-May-2012 10:04
Nacho Cabanes (+84)

Efectivamente, a nuestra solución le falta no incluir las letras repetidas, y también mostrar el resumen final, pero es que se trata de "atacar" el problema poco a poco, refinando la solución en cada paso.

Lo del resumen final, se lo dejaremos a Oscar  ;-)  pero con lo de no incluir letras sí que le ayudaremos... Basta con, cuando se recorren la letras, decir "si aparece en la segunda cadena y no aparece en el resultado":


program BuscarLetrasComunesNoRepetidas;

function letrasComunesNR(s1, s2: string): string;
var
  letra: char;
  i: integer;
  resultado: string;
begin
resultado := '';
for i:=1 to length(s1) do
  begin
    letra:= s1[i];
    if (pos(letra, s2) > 0)
            and (pos(letra, resultado) = 0) then
        resultado := resultado + letra;
  end;
letrasComunesNR := resultado;
end;



(* Cuerpo del programa *)

begin
    writeLn(letrasComunesNR('ALTO', 'BAJO'));
    writeLn(letrasComunesNR('INTERESANTE', 'ABURRIDO'));
    writeLn(letrasComunesNR('ALEGRE', 'TRISTE'));
end.



(Realmente, falta una mejora adicional, para que sea más robusto: convertir las palabras a mayúsculas, por si alguna se había introducido totalmente o parcialmente en minúsculas).


11-May-2012 12:32
oscar gomez

Gracias profesor Nacho cabanes, por tu explicacion al ejercicio,muy entendible como lo solucionas, bastante interesante, al igual como no al compañero Luis quien inicialmente dio la idea genial de su solucion.

respecto a mi queria preguntarte desde la modestia profesor y que disculpes mi ignorancia, pero la verdad no entiendo que quieres decir cuando haces referencia a "lo del resumen final", me gustaria me indiques por favor a que te refieres con ello para como no intentar aportar mi granito de arena a la solucion final del ejercicio.

mil gracias por tu tiempo profesor.


12-May-2012 09:36
Nacho Cabanes (+84)

Con lo de que "falta el resumen", me refiero a que te falta al final un bloque de información como éste, que también te pedían:

PAR CON MÁS LETRAS EN COMÚN:
ES EL PAR  INTERESANTE    ABURRIDO
Y TIENE 3 LETRAS EN COMÚN.

Pero que es sencillo: no necesitas almacenar todas las palabras sino sólo el par que hasta el momento tiene más letras en común.


17-May-2012 09:29
oscar gomez

cordial saludo profesor nacho cabanes y compañeros.
profesor para completar este ejercicio y por alucion a lo que a mi me respecta en esta parte final del ejercicio:

program BuscarLetrasComunesNoRepetidas;

var
 cad1, cad2: string; {variables globales}
 cantidad: integer; {global}

function letrasComunesNR(s1, s2: string): string;
var
 letra: char;
 i: integer;
 resultado: string;

begin
resultado := '';
for i:=1 to length(s1) do
 begin
   letra:= s1[i];
   if (pos(letra, s2) > 0)
           and (pos(letra, resultado) = 0) then
       resultado := resultado + letra;
 end;
letrasComunesNR := resultado;
if length(resultado)> cantidad then
begin
 cad1:= s1;
 cad2:= s2;
 cantidad:= length(resultado);
end;
end;


begin
   cad1:= '';
   cad2:= '';
   cantidad:= 0;
   writeLn(letrasComunesNR('ALTO', 'BAJO'));
   writeLn(letrasComunesNR('INTERESANTE', 'ABURRIDO'));
   writeLn(letrasComunesNR('ALEGRE', 'TRISTE'));

   writeln('El par con mas letras en comun: ');
   writeln(cad1,'  ',cad2);
   writeln('y tiene ',cantidad,' letras en comun.');

   readln;
end.

como tu lo indicaste profesor una vez finalizado este ejercicio,quedo en espera de tu valiosa ayuda en las pautas de  solucion del ejercicio 1  de este mismo hilo.

si me pudieras dar tu opinion o explicacion en el del hilo:
"SUMAR TIEMPOS TOTALES SIN INCLUIR CEROS", el cual ya he resuelto pero me queda solo la inquietud de la primera forma en que lo hice y que te indico alli.

mil gracias profesor por tu ayuda, tu tiempo y tu amabilidad.


28-Sep-2012 17:18
oscar gomez

Cordial saludo profesor nacho.
en alguna ocasion me dijiste que cuando terminara el segundo ejercicio de los dos que te plantee en este hilo,darias las pautas para poder desarrollar el primero, esto como recuerdas fue hace ya algunos meses.resolvi en lo que a mi me correspondia por alusion propia de tu parte y quisiera pedirte el favor si puedes hecharme una mano con el otro programa ( el primero ) que falta, para poder intentar acabarlo.
mil gracias por tu ayuda.


04-Oct-2012 21:45
Nacho Cabanes (+84)

¿El que te falta es el de las letras frecuentes?

Yo te propondría un primer acercamiento algo más sencillo: por un momento, olvida las palabras y el hecho de que estén separadas por espacios en blanco.

En vez de eso, crea una primera versión que te diga qué letras aparecen dos o más veces en la frase (insisto: olvida los espacios en blanco por ahora).






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