Pascal/Turbo Pascal - Ayuda procedimiento y función para leer una frase

 
Vista:

Ayuda procedimiento y función para leer una frase

Publicado por Rass (7 intervenciones) el 16/06/2012 11:51:42
Hola a todos.
Tengo que entregar una práctica de Pascal, ya la tengo terminada y me compila bien, pero al leer la frase introducida (es un programa que mediante un menú puedes seleccionar distintas acciones que hacer con una frase introducida por el usuario) se que como colgado el programa, si no introduces la frase salta una excepción, y si la introduces se queda pillado y no avanza más. Lo he estado mirando, y creo que el problema solo puede estar en una función y un procedimiento, pero no consigo ver el problema.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function dividir_frase(frase:STRING; var lista:t_lista_pal):boolean;
var
i:integer;
marca:integer;
cantidad:integer;
begin
 marca:=1;
 i:=2;
 while (i<=length(frase)) or (lista.num_pal<max_pal) do
  begin
   if (frase[i]<>' ') and (frase[i-1]=' ') then marca:=i;
   if ((frase[i]=' ') and (frase[i-1]<>' ')) or ((frase[i]<>' ') and (i=length(frase))) then
    begin
      if i<length(frase) then cantidad:=i-marca
       else cantidad:=i-marca+1;
      lista.palabras[lista.num_pal+1].pal:=copy(frase,marca,cantidad);
      lista.palabras[lista.num_pal+1].long:=cantidad;
      if i<=length(frase) then dividir_frase:=false
       else dividir_frase:=true;
    end;
   end;
   if i<=length(frase) then dividir_frase:=false
   else dividir_frase:=true;
 end;
 
procedure leer_frase(var pal:t_lista_pal);
var
frase:string;
val:boolean;
begin
 repeat
  writeln('Introduzca una frase de maximo 10 palabras y cada palabra de un maximo de 10 caracteres');
  readln(frase);
  val:=(dividir_frase(frase,pal) and longitud_val(pal));
 until val=true;
end;


Gracias por vuestra atención, un saludo.
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

Ayuda procedimiento y función para leer una frase

Publicado por ramon (2158 intervenciones) el 16/06/2012 22:28:19
Te comento los fallos en un programa pueden venir por diferentes causas del conjunto del programa
por lo cual sino se ve entero es difícil determinar la causa del fallo.
Pero observo algo que tengo que preguntarte esta parte es acaso un puntero [ lista:t_lista_pal]
pues los punteros suelen dar bastante mal sino se tiene cuidado con ellos.
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

Ayuda procedimiento y función para leer una frase

Publicado por Rass (7 intervenciones) el 17/06/2012 11:53:28
A continuación pongo las constantes y tipos del programa principal para que quede mas claro.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CONST
  intentos=10;
  tam_serie=10;
  max_pal=10;
  max_letra=10;
TYPE
    t_palabra=record
    pal:STRING;
    long:integer;
  end;
  t_cadena_pal=array[1..max_pal] of t_palabra;
  t_lista_pal=record
    palabras:t_cadena_pal;
    num_pal:byte;
  end;

Muchas gracias.
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

Ayuda procedimiento y función para leer una frase

Publicado por ramon (2158 intervenciones) el 17/06/2012 14:32:25
Me sige faltando datos que es esto [longitud_val(pal)]
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

Ayuda procedimiento y función para leer una frase

Publicado por Rass (7 intervenciones) el 17/06/2012 19:14:17
Vale, lo siento, no me había dado cuenta. "longitud_val" es una función, aquí la dejo. Y muchas gracias de nuevo.
1
2
3
4
5
6
7
8
9
10
11
12
function longitud_val(lista:t_lista_pal):boolean;
var
i:integer;
val:boolean;
begin
 val:=true;
 for i:=1 to lista.num_pal do
  begin
   if lista.palabras[i].long>max_letra then val:=false;
  end;
 longitud_val:=val;
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

Ayuda procedimiento y función para leer una frase

Publicado por ramon (2158 intervenciones) el 17/06/2012 21:59:26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function dividir_frase(frase:STRING; var lista:t_lista_pal):boolean;
var
i:integer;
marca:integer;
cantidad:integer;
begin
 marca:=1;
 i:=2;
 while (i<=length(frase)) or (lista.num_pal<max_pal) do
  begin
   if (frase[i]<>' ') and (frase[i-1]=' ') then marca:=i;
   if ((frase[i]=' ') and (frase[i-1]<>' ')) or ((frase[i]<>' ') and (i=length(frase))) then
    begin
      if i<length(frase) then cantidad:=i-marca
       else cantidad:=i-marca+1;
      lista.palabras[lista.num_pal+1].pal:=copy(frase,marca,cantidad);
      lista.palabras[lista.num_pal+1].long:=cantidad;
      if i<=length(frase) then dividir_frase:=false
       else dividir_frase:=true;
    end;
   end;
   if i<=length(frase) then dividir_frase:=false
   else dividir_frase:=true;
 end;

Rebisa este procedimiento la variable i no incrementa el proceso se cuelga.
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

Ayuda procedimiento y función para leer una frase

Publicado por ramon (2158 intervenciones) el 17/06/2012 22:09:33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function dividir_frase(frase:STRING; var lista:t_lista_pal):boolean;
var
i:integer;
marca:integer;
cantidad:integer;
begin
 marca:=1;
 i:=2;
 while (i<=length(frase)) or (lista.num_pal<max_pal) do
  begin
   if (frase[i]<>' ') and (frase[i-1]=' ') then marca:=i;
   if ((frase[i]=' ') and (frase[i-1]<>' ')) or ((frase[i]<>' ') and (i=length(frase))) then
    begin
      if i<length(frase) then cantidad:=i-marca
       else cantidad:=i-marca+1;
      lista.palabras[lista.num_pal+1].pal:=copy(frase,marca,cantidad);
      lista.palabras[lista.num_pal+1].long:=cantidad;
      if i<=length(frase) then dividir_frase:=false
       else dividir_frase:=true;
    end;
   end;
   if i<=length(frase) then dividir_frase:=false
   else dividir_frase:=true;
 end;

Revisa este función la variable i no incrementa el proceso se cuelga.
En el while (i<=length(frase)) or (lista.num_pal<max_pal) do no sale del bucle.
Disculpa lo anterior,
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

Ayuda procedimiento y función para leer una frase

Publicado por ramon (2158 intervenciones) el 18/06/2012 21:49:19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
{Esto funciona ya no se bloquea }
 
uses
   crt;
 
CONST
  intentos=10;
  tam_serie=10;
  max_pal=10;
  max_letra=10;
 
TYPE
    t_palabra=record
    pal:STRING;
    long:integer;
  end;
  t_cadena_pal=array[1..max_pal] of t_palabra;
  t_lista_pal=record
    palabras:t_cadena_pal;
    num_pal:byte;
  end;
  var
    pal : t_lista_pal;
 
 function longitud_val(lista:t_lista_pal):boolean;
 var
    i : integer;
   val : boolean;
  begin
    val := true;
   for i := 1 to lista.num_pal do
   begin
      if lista.palabras[i].long > max_letra then
      val := false;
   end;
    longitud_val := val;
 end;
 
  function dividir_frase(frase:STRING; var lista:t_lista_pal):boolean;
  var
    i:integer;
    marca:integer;
    cantidad:integer;
  begin
    marca:=1;
    i := 2;
 while i < length(frase)  do
  begin
   if (frase[i] <> ' ') and (frase[i - 1] = ' ') then
   marca := i;
   if ((frase[i] = ' ') and (frase[i - 1] <> ' ')) or ((frase[i]<>' ') and
                                         (i = length(frase))) then
    begin
      if i < length(frase) then
      cantidad := i - marca
   else
      cantidad := i - marca + 1;
      lista.palabras[lista.num_pal+1].pal:=copy(frase,marca,cantidad);
      lista.palabras[lista.num_pal+1].long:=cantidad;
      if i <= length(frase) then
      dividir_frase:=false
   else
     dividir_frase:=true;
    end;
    i := i + 2;
   end;
   if i <= length(frase) then
      dividir_frase := false
   else
     dividir_frase := true;
 end;
 
procedure leer_frase(var pal:t_lista_pal);
var
frase:string;
val1, val:boolean;
begin
 repeat
  writeln('Introduzca una frase de maximo 10 palabras y cada palabra de un maximo de 10 caracteres');
  readln(frase);
  val := (dividir_frase(frase,pal)) and (longitud_val(pal));
 until val = true;
end;
 
 begin
     clrscr;
     leer_frase(pal);
     writeln('proceso terminado pulse una tecla');
     readkey;
 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

Ayuda procedimiento y función para leer una frase

Publicado por Rass (7 intervenciones) el 19/06/2012 14:22:28
El programa ya me lee la frase, el problema está ahora en lo siguiente:
Tiene un menú con distintas opciones una vez introducida y leída la frase:
1.Mostrar palabra mayor, menor y media de la frase.
2.Calcule la media de caracteres de una frase en caso de que la palabra se encuentre en la frase.
3.Mostrar palabras cuyo tamaño no supera la media.

En las opciones 1 y 3 me salta nada mas de darles un error con una excepción en la línea de la siguiente función
1
2
3
4
5
6
7
8
9
10
function media_carac(pal:t_lista_pal):integer;
var
i:integer;
suma:real;
begin
 suma:=0;
 for i:=1 to pal.num_pal do
  suma:=suma+pal.palabras[i].long;
  media_carac:=trunc (round (suma/pal.num_pal));
end;

Y en la opción 2, da igual si la palabra que introduces está en la frase, que no la reconoce y dice que no está. El procedimiento empleado para reconocer las palabras es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure validar_para_media(pal:t_lista_pal);
var
i:integer;
esta:boolean;
palabra:string;
begin
 writeln('Introduzca una palabra');
 readln(palabra);
 esta:=false;
 for i:=1 to pal.num_pal do
  begin
   if upcase(palabra)=upcase(pal.palabras[i].pal) then
   esta:=true;
  end;
 if esta then writeln(media_carac(pal))
else writeln('La palabra intruducida no está en la frase');
end;

Muchas gracias.
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

Ayuda procedimiento y función para leer una frase

Publicado por Rass (7 intervenciones) el 19/06/2012 14:25:53
La excepción me salta en la penúltima línea de la función "media_carac", donde pone esto:
1
media_carac:=trunc (round (suma/pal.num_pal))
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

Ayuda procedimiento y función para leer una frase

Publicado por ramon (2158 intervenciones) el 19/06/2012 18:52:31
Como ya te comente es bastante difícil corregir un fallo sin tener todo el proceso pero intentare
ayudarte lo que pueda.
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

Ayuda procedimiento y función para leer una frase

Publicado por ramon (2158 intervenciones) el 19/06/2012 19:23:30
Estudiados los dos te comento de cada uno lo que observo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function media_carac(pal:t_lista_pal):integer;
var
i:integer;
suma:real;
begin
 suma:=0;
 for i:=1 to pal.num_pal do
  suma:=suma+pal.palabras[i].long;
  media_carac:=trunc (round (suma/pal.num_pal)); {Sobra trunc puesto que rounde ya lo pone a
                                                                                              entero por eso falla}
 
end;
 
 
 
 
procedure validar_para_media(pal:t_lista_pal);
var
i:integer;
esta:boolean;
palabra:string;
begin
 writeln('Introduzca una palabra');
 readln(palabra);
 esta:=false;
 for i:=1 to pal.num_pal do
  begin
   if upcase(palabra)=upcase(pal.palabras[i].pal) then  {Fallo  puesto que upcase solo funciona
                                                                                                    con 1 carácter no con cadena}
   esta:=true;
  end;
 if esta then writeln(media_carac(pal))
else writeln('La palabra intruducida no está en la frase');
end;

Eso es lo que veo por encima corrige lo y prueba 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

Ayuda procedimiento y función para leer una frase

Publicado por Rass (7 intervenciones) el 20/06/2012 14:25:15
Muchas gracias, ya me funciona todo correctamente.
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