Pascal/Turbo Pascal - Problema en OR

 
Vista:

Problema en OR

Publicado por Sasti (4 intervenciones) el 27/06/2006 15:53:10
Un saludo craks del foro, alguen save que hago mal en el IF Frase = ('a' OR 'A'....
quizas mejor usar un CASE ?

PROGRAM EX03; {farase acavada en punt, contar vocals}

VAR
Vocals:integer;
Frase:char;
Lletra:char;

BEGIN
Vocals:=0;
Writeln('Entra una frase acavada en punt: ');
Writeln('');
Readln(Frase);
WHILE Frase <> '.' DO
IF Frase = ('a' OR 'A' OR 'e' OR 'E' OR 'I' OR 'i' OR 'O' OR 'o' OR 'u' OR 'U') THEN Vocals:=Vocals+1
END IF;
Read(Frase);
Writeln('El nombre total de vocals de la faraes es: ',Vocals);
END.

Gracias
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

RE:Problema en OR

Publicado por Willy De Leon (7 intervenciones) el 27/06/2006 18:08:35
Hola Sasti!

Yo creo que debes poner: IF Frase = 'a' or (Frase = 'A') or (Frase = 'e' ) etc..

Además en: WHILE Frase <> '.' DO
debes poner WHILE Frase <> '.' DO BEGIN
Para que: Read(Frase); quede incluido dentro del ciclo WHILE

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:Problema en OR

Publicado por Sasti (4 intervenciones) el 28/06/2006 10:25:37
Hola i gracias a los dos, creo que he evolucionado un poco.
Entended que estoi empezando a hacer li primer ejecicio en Pascal i no tengo ni idea...

Ahora he dejado el codigo asi i me pone que la linia és demasiado larga, como puedo hacer para "romper" una linea? he provado con espacio i sub gion, parece que funiona, pero luego me da un error Type mismach

GRAM EX03; {farase acavada en punt, contar vocals}

VAR
Vocals:integer;
Frase:char;
Lletra:char;

BEGIN
Vocals:=0;
Writeln('Entra una frase acavada en punt: ');
Writeln('');
Readln(Frase);
WHILE Frase <> '.' DO BEGIN
IF (Frase = 'a)' OR (Frase='A') OR (Frase='e') OR (Frase='E') _
OR (Frase='I') OR (Frase='i') OR (Frase='O') OR (Frase='o') OR (Frase='u') OR (Frase='U') THEN Vocals:=Vocals+1
END;
Read(Frase);
Writeln('El nombre total de vocals de la faraes es: ',Vocals);
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
sin imagen de perfil

RE:Problema en OR

Publicado por Willy (177 intervenciones) el 28/06/2006 16:33:50
Veo que mejoras Sasti !

Fíjate en esta línea que copié de tu programa:

Writeln('Entra una frase acavada en punt: ');
!
!
Aquí no cerraste con '
poreso te pone que la línea es demasiado larga

Te vuelvo a recordar que si quieres que el programa repita la lectura de los caracteres ingresados hasta que el usuario ingrese un punto, debes poner Read(Frase) antes de el END porque el END está cerrando el ciclo repetitivo WHILE. Significa que repite todo lo que esta entre WHILE y END.

Más adelante te darás cuenta de que un buen programador es el que realiza el mismo programa pero con menos líneas de código, como en el caso de Diego Romero que te muestra una bonita versión.

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:Problema en OR

Publicado por Diego Romero (996 intervenciones) el 28/06/2006 01:08:11
Disculpa la rudeza pero tu programa no tiene sentido. Pareces tener graves problemas para comprender los tipos de datos de Pascal.

El caracter 'a', como cualquier otro caracter, no contiene valor booleano alguno por lo tanto no lo puedes evaluar con OR (o cualquier otro operador booleano).

La sentencia if no termina con un "end if" en Pascal.

El ámbito o alcance de la sentencia while no está clara. Debes encerrar lo que quieres ciclar con el par de sentencias begin ... end;

Pero vamos, entiendo lo que quieres hacer. Deseas contar cuántas vocales ingresa el usuario y como condición de salida el usuario debe ingresar un punto.

Hay muchas formas de hacerlo. Esta es mi versión:

repeat
ReadLn(Frase);
Frase:=Upcase(Frase); { pasa el caracter a mayúsculas }
if (Frase = 'A') or (Frase = 'E') or (Frase = 'I') or (Frase = 'O') or (Frase = 'U') then
Inc(Vocales);
until Frase = '.';

O más elegantemente usar el tipo set

const
TVocales: set of char=['A', 'E', 'I', 'O', 'U'];
...
repeat
ReadLn(Frase);
Frase:=Upcase(Frase); { pasa el caracter a mayúsculas }
if Frase in TVocales then Inc(Vocales);
until Frase = '.';
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:Problema en OR

Publicado por micropais (209 intervenciones) el 28/06/2006 17:05:39
Hola Diego Romero :

Tienes toda la razon pero TP7 debe tener un bug cuando usamos conjunto de caracteres superiores
en vez de :
____________________________________
const
TVocales: set of char=['A', 'E', 'I', 'O', 'U'];
____________________________________

Prueba con todo el abecedario o letras acentuadas y ó con un superconjunto de palabras y verás que no funciona tu code como debiera hacerlo ,volviendo a los 'IF' mas estables.

SALUDOS.
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:Problema en OR

Publicado por Diego Romero (996 intervenciones) el 28/06/2006 19:18:57
Pues probé mi código en TP7 (no muy exaustivamete, es cierto) y no vi que funcionara mal para el problema propuesto :S. ¿En qué casos dices que no funciona?.
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:Problema en OR

Publicado por Sasti (4 intervenciones) el 29/06/2006 08:52:03
Gracias Willy !! quizas he mejorado un poquito, pero no mucho, sigo sin resolver el problema..... :(

Dices que en Wirteln no cierro, pero si no hago

Writeln('Entra una frase acavada en punt: ');
!
!
Aquí no cerraste con '

.., si que lo hice, no?, el final de la linia es..: punt: ');

Asi pues estoy que con esto:

PROGRAM EX03; {farase acavada en punt, contar vocals}

VAR
Vocals:integer;
Frase:char;
Lletra:char;

BEGIN
Vocals:=0;
Writeln('Entra una frase acavada en punt: ');
Writeln('');
Readln(Frase);
WHILE Frase <> '.' DO BEGIN
IF (Frase = 'a)' OR (Frase='A') OR (Frase='e') OR (Frase='E') _
OR (Frase='I') OR (Frase='i') OR (Frase='O') OR (Frase='o') OR (Frase='u') OR (Frase='U') THEN Vocals:=Vocals+1
END;
Read(Frase);
Writeln('El nombre total de vocals de la faraes es: ',Vocals);
END

Ahora, el error me lo da en el segundo OR entre 'A' i 'e'

Muchas gracias por la ayda, muy agradecido.
Un saludo des de cerquita de Barcelona !!
Sasti
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:Problema en OR

Publicado por Mario De León (2 intervenciones) el 07/07/2006 21:30:49
Hola Sasti, te comento que soy hermano de Willy, a quien admiro mucho porque por su propia cuenta aprendió pascal y desarrolló su lógica de programación.
Pues para mí que te hace falta encerrar todas las condiciones entre un gran paréntesis, Pascal no te protesta si solo evaluas 2 condiciones conectadas con OR o conectadas con AND, pero si son más, hay que encerrarlas entre paréntesis, quedando asi :

IF ( (Frase = 'a)' OR (Frase='A') OR (Frase='e') OR (Frase='E') _
OR (Frase='I') OR (Frase='i') OR (Frase='O') OR (Frase='o') OR (Frase='u') OR (Frase='U') )
Then Vocals:= Vocals+1;

Fijate que despues del IF hay un paréntesis que cierra hasta Antes del Then.
Pruébalo asi y me cuentas, que no tengo pascal a la mano para probarlo.

Saludos desde Guatemala.
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