Pascal/Turbo Pascal - Resultado de ejercicio

 
Vista:

Resultado de ejercicio

Publicado por gaston (3 intervenciones) el 21/06/2007 17:22:27
hola atodos, quisiera saber si pueden resolverme este ejercicio q me dieron en la facu, porq yo no pude. gracias a todos

Se lee una secuencia de caracteres finalizada en &, informar si la secuencia cumple con el siguiente patron, T$W, donde T es una secuencia de al menos tres palabras $ es un caracter, (seguro existe) y W es una secuencia de palabras donde todas empiezan con el caracter "u", utilice funciones para `procesar T y W.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Pon un ejemplo. ¿Esto valdría?

Publicado por Pascual (94 intervenciones) el 21/06/2007 20:38:26
¿Esto valdría?

hola hola hola$uhola uhola uhola

Esto yo lo haría con un analizador léxico y sintáctico, es decir, con Lex y Yacc, así lo hacíamos en la asignatura de Teoría de Autómatas y Lenguajes Formales.

De todos modos no es dificil, empieza primero a pensar que debe de pasar para que se valide la cadena.

1º) Tiene que haber un $ ¿no? Pues lo primero que haría sería recorrer la cadena y comprobar que en efecto existe ese caracter y es único (esto es importante), si no existe no seguiría validando y pondría el correspondiente mensaje de error.

2º) Si sí que está el caracter $ comprobaría que existe algo antes de $, si no hay nada antes del $ entonces dejaría de seguir haciendo comprobaciones y pondría el correspondiente mensaje de error.

3º) Si sí que existe algo antes de $ entonces comprobaría que está formado por al menos tres palabras, habría que definir un contador para que sumara uno cuando hubiera leído una palabra, yo consideraría palabra como uno o más caracteres y luego un espacio o el caracter $. Ejemplo: la cadena 'jhsd s' serían dos palabras ya que después de la s viene $.

Y así, echándole imagiación hasta que lo acabes, este tipo de prácticas requiere muchas pruebas para ver que no te dejas ningún hueco por donde las especificaciones se "escapen". La idea es ir haciendo módulos pequeños que hagan una única función (máxima cohesión) y luego juntarlos todos en el programa principal.

De todas formas ya te digo que esto se hace con Lex y Yacc (por ejemplo).

Saludos y suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:no se si Esto valdría

Publicado por gaston (3 intervenciones) el 21/06/2007 23:08:13
hola, en un principio muchas gracias por respondeme, bueno mira.. lo q pasa es q todavia no dimos esas 2 funciones, solo dimos length, q en este caso no sirve para nada, bueno espero q me puedan solucionar esto, gracias y suerte tb.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:no se si Esto valdría

Publicado por micropais (209 intervenciones) el 22/06/2007 09:52:21
hola gaston
"lo q pasa es q todavia no dimos esas 2 funciones"

- Creo que "Lex y Yacc" pertenecen a LINUX (que lo confirme Pascual).

- Perl y javascript tambien poseen analizadores gramaticales bastante potentes ( * demasiado potente *) incluidos como funciones de su lenguaje.

- Pascal carece de estas funciones y creo que se trata de eso (lo que te ha comentado pascual)
de crear una funcion o funciones para analizar cadenas y/o ( vectores,array, matrices de texto).

- Deberias empezar a crearte una funcion que separe las palabras , recorriendo la cadena
hasta su longitud length(cadena) - "donde el simbolo &" careceria de sentido -y crear subcadenas basandote en separadores (espacio
en blanco ascii 32, comas o puntos), guardar estas subcadenas (palabras) en un array de
cadenas , recorrer este array y comprobar que cumplen el enunciado estrictamente.

- Lo que mas se tardaria en hacer es el separador de subcadenas , pues no es tan facil como se parece , pues hay que limpiar los espacios (o separadores ) sobrantes segun criterio
y crear subcadenas y un contador de ellas. - para ello deberias ayudarte de las funciones de cadena PASCAL:COPY,CONCAT(+),DELETE,INSERT,POS etc...

- E ir arreglando los problemas que nos vayan surgiendo
P.E: la primera y ultima palabra difieren de las de enmedio al carecer de espacios inicial o final , claro que podriamos añadirlos pero tendriamos otro problema con cadenas de mas de 255 caracteres.

- Manda el code que ya tengas echo , si ,aunque no funcione mandalo y veremos en que podemos ayudarte .

- La politica de este foro es ayudar, "Si" , pero ... No crear tareas completas...

- Si lo que deseas es la tarea completa "cambia el enunciado" , o usa GOOGLE
haber si tienes mas suerte (siempre hay alguien mas realizando tu tarea y os podeis apoyar mutuamente).

SALUDOS de micropais.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:no se si Esto valdría

Publicado por gaston (3 intervenciones) el 22/06/2007 19:34:12
mira la verdad q tenes razon! t lo prometo q cuando pueda voy a escribir lo q mas o menos tengo, muchas gracias por preocuparte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:codigo

Publicado por micropais (209 intervenciones) el 22/06/2007 19:57:15
Saludos de nuevo gaston.
en el pos anterior te comenté que deberias apoyarte en las funciones de cadena PASCAL:COPY,CONCAT(+),DELETE,INSERT,POS etc.
no te van a hacer falta aqui te envio un code que se basa solo en length por lo de tu post :
_______________________________________________________________
"...no dimos esas 2 funciones, solo dimos "length", q en este caso no sirve para nada, bueno espero q me puedan solucionar esto..."
ahi va el code:
________________________________________________________________
uses crt;
var cadena:string;
cadena_nueva:string;

x_palabras:byte;
x_cadenas:array[1..50]of string;

posicion:byte;

{-------------------------------------------------------------------------}
{ comprobamos el ultimo caracter - debe terminar en &- }
function ultimo_caracter(cad:string;car:char):boolean;
begin
if cad[ length(cad) ]<> car then
begin
ultimo_caracter:=false;
end else ultimo_caracter:=true;

end;

{-------------------------------------------------------------------------
Separamos cada palabra por el caracter espacio y la guardamos en x_cadenas
como retorno devolvemos el numero de palabras encontradas
--------------------------------------------------------------------------}
function obtener_palabras(cad:string):byte;
var a,b:integer;
cad_temp:string;
begin
obtener_palabras:=0;
cad_temp:='';
b:=0;
for a:=1 to length(cad) do
begin
cad_temp:=cad_temp+cad[a];
if cad[a]=' ' then { se encontro el caracter separador }
begin
b:=b+1; { incrementamos el contador de palabras }
x_cadenas[b]:=cad_temp;
cad_temp:=''; { preparamos para la sigiente palabra }
end;
end;
obtener_palabras:=b;
end;
{-------------------------------------------------------------------------}
procedure mostrar_palabras;
var a:byte;
begin
writeln('listado de las :',x_palabras ,' palabras encontradas');
for a:=1 to x_palabras do writeln( a,':',x_cadenas[a] );

end;
{-------------------------------------------------------------------------}
function posicion_car_dollar(cad:string):byte;
var a:byte;
begin
posicion_car_dollar:=0;
for a:=1 to x_palabras do
begin
{ por no haber limpiado de espacios en blanco las palabras, buscamos un
caracter+spacio en blanco o dicho de otra manera un solo caracter ocupa 2
char de longitud }
if length ( x_cadenas[a])=2 then
begin
posicion_car_dollar:=a;
break;
end;
end;

end;
{-------------------------------------------------------------------------}
function w_condicion:boolean;
var a:byte;
begin
w_condicion:=false;

if x_palabras-posicion<3 then
begin
writeln('Error: faltan palabras despues del caracter $');
readln;
halt;
end;
w_condicion:=(x_cadenas[posicion+1][1]='u') and
(x_cadenas[posicion+2][1]='u') and
(x_cadenas[posicion+3][1]='u');


end;
{-------------------------------------------------------------------------}
{/////////////////////////////////////////////////////////////////////////}
begin

clrscr;
writeln('3 palabras + caracter + 3 U_palabras+&');

{ valor cadena en pruebas , desactivar para obtener el valor por teclado }
{­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­}
cadena:='una dos tres e u1 u2 u3 &';
{ activar el siguiente readln para obtener la cadena por teclado }
{­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­}
{ readln(cadena);}

writeln('Cadena de prueba :');
writeln(cadena);
writeln;

{----------------- comprobamos si la cadena termina con el caracter & -----}
if ultimo_caracter(cadena,'&')=false then
begin
writeln('Error:el texto deberia terminar con el caracter &');
readln;
halt;
end;

{ cargamos la matriz de cadenas x_cadena[]con todas las palabras encontradas}
x_palabras:= obtener_palabras(cadena);
{ ahora ya tenemos todas las palabras en la matriz x_cadena[1..x_palabras] }
{ mostramos las palabras encontradas }
mostrar_palabras;

{ buscamos una palabra de un solo caracter ver notas }
posicion:=posicion_car_dollar(cadena);

if posicion>3 then
begin
writeln(' - caracter $=',x_cadenas[posicion] );
writeln(' - condicion T se cumple');
end else
begin
writeln(' ERROR: condicion T NO se cumple (tres palabras)');
readln;
halt;
end;

if w_condicion then
begin
writeln('OK . Se cumpileron todas las condiciones T$W ');
end else
begin
writeln('ERROR:la condicion W fallo , una de las palabras no enpieza pur (u) ');
end;

readln;
halt;
readln;

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar