[ Foro de Pascal ]
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
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.
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!
¿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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
¿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.)