Pascal/Turbo Pascal - duda con la ñ

 
Vista:

duda con la ñ

Publicado por Tamara (5 intervenciones) el 02/07/2008 12:17:57
Hola. tengo que hacer una función que compruebe si una palabara de tipo string está formada por caracteres alfabéticos,siendo alfabéticos si están comprendidos entre la A y la Z mayúsculas.¿Alguien me puede ayudar?
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:duda con la ñ

Publicado por Dani (94 intervenciones) el 02/07/2008 14:52:38
Un REPEAT, comprobando desde el primer caracter hasta el ultimo (si este es alfabético, devuelve TRUE), o hasta que encuentre un caracter no alfabético (devuelve FALSE)
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:duda con la ñ

Publicado por Gonzalo (159 intervenciones) el 02/07/2008 17:53:30
Aca tenes que tener claro el codigo ascii para determinar que caracter es una letra, y en este caso que sea mayuscula.
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:duda con la ñ

Publicado por Dani (94 intervenciones) el 03/07/2008 15:42:12
No hace falta para nada el código ASCII
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:duda con la ñ

Publicado por Gonzalo (159 intervenciones) el 03/07/2008 16:19:30
¿Y como seria entonces?, en la primer respuesta le dijiste que tenia que recorrer la palabra, y si un caracter no era una letra que devuelva FALSE. Mi pregunta seria, ¿como haces para determinar si no es una letra? sin usar el codigo ASCII.
Soy novato en esto. Y justo estamos viendo el tratamiento de palabras, y surgio algo similar. La forma que se nos ocurrio fue preguntando con respecto al ASCII. Asi que si hay alguna forma mas sencilla, me sirviria a mi tambien.
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:duda con la ñ

Publicado por Dani (94 intervenciones) el 03/07/2008 18:07:36
Para determinar si es una letra

IF ((caracter >= 'A') AND (caracter <= 'Z')) THEN

Claro, también podría ser

IF ((caracter >= chr (65)) AND (caracter <= chr (90))) THEN

o

IF ((ord (caracter) >= 65) AND (ord (caracter) <= 90)) THEN

Yo, la verdad, me quedo con la primera opción, es la más clara, evita errores, y además, no hay que aprenderse los códigos ASCII :p

Esto yo lo haría así con las letras del alfabeto inglés (tanto mayúsculas como minúsculas), y con los dígitos del 0 al 9. Para otros caracteres sí usaría el código ASCII (y SIEMPRE usando constantes, por ejemplo:

TeclaEsc := #27; //el código ASCII de la tecla ESC es el 27, aquí sí es necesario usarlo
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:duda con la ñ

Publicado por Gonzalo (159 intervenciones) el 03/07/2008 20:07:42
Gracias por la explicacion. Hace poco, debi resolver un problema, y no tenia a disposicion el ASCII y lo hice de la manera que lo planteas vos. En definitiva si, no hace falta saberlo.
Pero tengo una duda. En la condicion "IF ((caracter >= 'A') AND (caracter <= 'Z')) THEN" la Ñ no la tomaria (creo que este era su problema), no es asi? Por que las mayusculas estan entre el 65 y el 90, salvo la Ñ que esta en el 165. Creo que a eso te referia con el alfabeto ingles. Lo mismo con las minusculas con tilde. Ahi si deberia tener en cuenta el codigo ASCII.
Saludos , y gracias por la inmediata respuesta.
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:duda con la ñ

Publicado por Diego Romero (996 intervenciones) el 03/07/2008 22:03:08
IF not (caracter in ['A'..'Z', 'a'..'z', 'Ñ','ñ']) THEN ...

También se pueden agregar las vocales acentuadas y los signos de puntuación y el espacio en blanco.
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:duda con la ñ

Publicado por Tamara (5 intervenciones) el 07/07/2008 11:39:01
Entonces para comprobarlo mediante un conjunto, primero tendríamos que crear un tipo conjunto no?
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:duda con la ñ

Publicado por Dani (94 intervenciones) el 07/07/2008 11:43:17
No, es tal y como lo ha puesto Diego.

Un saludo!
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:duda con la ñ

Publicado por Tamara (5 intervenciones) el 07/07/2008 11:44:37
Ok, 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

RE:duda con la ñ

Publicado por Tamara (5 intervenciones) el 07/07/2008 12:20:47
Otra pregunta.¿Cómo creo un tipo conjunto que esté definido por letras mayúsculas más la ñ?. lo que tengo que hacer es comprobar si en una palabra hay caracteres repetidos, entonces yo había creado este tipo:
type
alfabeto:'A'..'Z';
alf_conjunto: set of alfabeto

y cree este subprograma:

function comprobar_repetidos(var palabra:string):boolean;
var
i:integer;
valida:boolean;
car:char;
conjunto:alf_conjunto;

begin
i:=1;
valida:=true;
conjunto:=[];
car:=palabra[i];
conjunto:=conjunto+[car];
while (i<=length(palabra)) and valida do
begin
car:=palabra[i+1];
if car in conjunto
then valida:=false
else begin
conjunto:=conjunto+[car];
i:=i+1
end
end;
comprobar_repetidos:=valida
end;

El problema está en que la Ñ no está contemplada y no se como introducirla en el conjunto.
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:duda con la ñ

Publicado por Diego Romero (996 intervenciones) el 07/07/2008 19:09:48
Quita el tipo "alfabeto" y cambia la definición de alf_conjunto a:

type
alf_conjunto: set of char;

Lo que haces en el código está bien, muy ingenioso, pero falla en algunas cosas tal como está, por ejemplo no solo no contemplas la Ñ sino que tampoco contemplas el espacio en blanco (ASCII 32).

La idea general según tu código es que si un caracter ya está en el conjunto entonces está repetido pero si no está entonces se agrega al conjunto. Y repito, está muy bien, pero eso implica que es irrelevante el caracter que se esté procesando (o sea, da igual si es el A el Y o Ñ o #13).

Me parece que tu pregunta se debe a que tienes en la cabeza que "palabra" solo debe contener letras mayúsculas. Pero eso lo puedes verificar con otra función antes de llamar a esta, algo así:

if esmayusculas(palabra) then
begin
WriteLn('solo contiene mayúsculas);
if comprobar_repetidos(palabra) then
WriteLn('Tiene letras repetidas')
else
WriteLn('NO tiene letras repetidas')
end;

Aparte de todo esto. El código tiene un bug en la condición del while (i<=length(palabra)). Antes de entrar al ciclo "i" vale 1. Pero dentro del ciclo no estás probando el caracter señalado por "i", sino el inmediato siguiente dentro del string. Cuando "i" sea igual a length(palabra), la condición del while seguirá siendo verdadera y ya dentro del ciclo *estás evaluando una posición mayor a length(palabra)*. La solución a esto es quitar el = en la condición del while.
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