Problema con ADA

Buenas, estoy intentando hacer un analizador de glosas (Cuatro versos con rima ABBA etc etc),
pero mi duda es que, el ejercicio dice que cuente las silabas (contando como silaba solo las vocales) de cada verso.
Bien, he probado y tal, pero con un simple
While Caracter/='.' Loop
   Contador1:Contador1+1;
   Contador2:Contador2+1;
   Contador3:Contador3+1;
   Contador4:Contador4+1;
End Loop;


Lo que haría sería aumentar todos los contadores al llegar al final de cada verso.
Alguien me puede ayudar para que en cada verso, se sume un contador distinto?

Gracias anticipadas:)
Uhm... no acabo de entender que quieres hacer exactamente.. ¿Hacer un contador por cada vocal?
De todas formas de entrada le veo un par de fallos a eso:
- Contador1:Contador1+1; debería ser Contador1:=Contador1+1; , no?? Hace bastante que no programo en ADA así que igual me estoy columpiando.
- Por qué cuentas cada caracter distinto de "." ?? Se te asegura que solo habrá letras? porque sino estarías contando tambien los simbolos como /()& ....

PD: Si pones el codigo del programa entero (que no creo que sea muy grande) igual me aclaro mejor ;)
has de tener en cuenta hiatos y diptongos?este es complicadete como para explicartelo aqui
o solo se usan silabas de una vocal?[i]el contador solo lo tendra que ser incrementado en caso de que sea una vocal, tal y como lo tienes la frase "hola mundo!" al final el contador valdria 11.

luego no entiendo porque utilizas cuatro contadores iguales.

el bucle no tendria que ser mientras es distinto de '\n'? o el ejercicio te dice que es un punto?
xgc1986 escribió:el bucle no tendria que ser mientras es distinto de '\n'? o el ejercicio te dice que es un punto?

Sólo como apunte para que el amigo Jordi Uchiha no se lie, en ADA no existe '\n', tendrías que usar "end of line".
Gracias por las respuestas.

Bueno, me explico, el programa que tengo que hacer es uno que al introducir 4 versos, el programa detecta si tienen rima, si realmente hay 4 versos, y el número de sílabas de cada verso, teniendo en cuenta que SOLO las vocales cuentan como sílaba,y solo es correcto el verso si tiene 7,8 o 9 silabas (Sin tener en cuenta los hiatos, diftongos, etc).

Un ejemplo sería:

aaaaaaà*
eeeeeeé*
eeeeeeé*
aaaaaaà.

El programa detectaría que hay 4 versos, cada verso tendría 7 sílabas, y rima ABBA.

Mi pregunta es, como puedo contalizar las silabas de cada verso.

Gracias por la ayuda.
Pues asi a primera vista... yo haría un for que diera 4 pasadas (una por linea) y un while not end of line dentro. Usaría un array para para almacenar las silabas y puede que otro para almacenar la rima (bueno, o puedes usar una matriz o lo que quieras, vaya).
Es decir, algo asi
Para cada linea i de 1 a 4 hacer
Mientras no sea fin de linea
Contador(i)=Contador(i)+1;
Fin mientras;
Fin para;

A eso tendrías que añadirle al final algunas lineas que comprueben los numeros de silabas y tal (if contador(1)=9 then.... (por ejemplo)), y algo para mirar la rima en cada linea, pero eso sigue la misma logica que te he puesto para el número de lineas.

Espero que te sirva, si tienes dudas no dudes en postear!
Bueno, he probado lo que me has dicho, masterpok, y he intentado hacer esto:
WITH Ada.Integer_Text_IO;USE Ada.Integer_Text_IO;
WITH Ada.Text_Io;USE Ada.Text_IO;
PROCEDURE Glosa is
   TYPE Contador_Versos IS ARRAY (1..4) OF Integer;
   Caracter:Character;

BEGIN
   PUT("Analitzador de Gloses 0.1 alfa. Per favor, introdueix els tres primers versos afegint al final de cada vers el caracter '*' i el darrer amb punt. Accentuar la silaba tonica de la darrera paraula.");
   GET(Caracter);
   FOR Contador IN 1..4 LOOP
      WHILE Caracter/='.' LOOP
         Contador_Versos:=Contador_Versos+1;
      END LOOP;
   END LOOP;
   Get(CARACTER);
   PUT(Contador);
END Glosa;


Pero el programa me da error.
Dónde puede estar el fallo?

Gracias por la ayuda. :)
Uff, ahi tienes un cacao importante...
A ver, para empezar deberías hacer el while hasta encontrar '.' o '*' , ya que el while es para analizar lo que hay en cada linea (y las lineas acaban por * o por '.' en el caso de la ultima).
Además, al actualizar el contador no estás haciendolo bien, ya que intentas hacer +1 al array entero y no a uno de los integers que hay dentro. Debería ser Contador_Versos[i]:=Contador_Versos[i]+1;
Por otro lado tienes que hacer un get character dentro del while, sino no no va a avanzar y vas a tener un loop infinito.
Y para acabar, el put(contador) no va a funcionar, tienes que escribir el contenido del array uno por uno (haciendo varios put(contador_versos(1)) o un loop.
Bien, he hecho lo siguiente:
WITH Ada.Integer_Text_IO;USE Ada.Integer_Text_IO;
WITH Ada.Text_Io;USE Ada.Text_IO;
PROCEDURE Glosa is
   TYPE Contador_Versos IS ARRAY (1..4) OF Integer;
   Caracter:Character;

BEGIN
   PUT("Analitzador de Gloses 0.1 alfa. Per favor, introdueix els tres primers versos afegint al final de cada vers el caracter '*' i el darrer amb punt. Accentuar la silaba tonica de la darrera paraula.");
   GET(Caracter);
   FOR Contador_Versos IN 1..4 LOOP
      WHILE Caracter/='.' OR Caracter/='*' LOOP
         Contador_Versos(I):=Contador_Versos(I)+1;
         Get(Caracter);
      END LOOP;
   END LOOP;
   Get(CARACTER);
   PUT(Contador_Versos(1));
END Glosa;


Y el programa me genera los siguientes errores:
glosa.adb:1:09: warning: no entities of "Integer_Text.IO" are referenced
glosa.adb:12:10: array type required in indexed component
glosa.adb: array type required in indexed component
glosa.adb:12:46: "I" is undefined (more references follow)
glosa.adb:17:04: no candidate interpretacions match the actuals:
glosa.adb:17:04: missing argument for parameter "Item" in call to "Put" declared at a-tiinio.ads:78, instance at a-inteio.ads:18
glosa.adb:17:04: missing argument for parameter "Item" in call to "Put" declared at a-tiinio.ads:62, instance at a-indeio.ads:18
glosa.adb:17:04: missing argument for parameter "Item" in call to "Put" declared at a-textio.ads:244
glosa.adb:17:04: missing argument for parameter "Item" in call to "Put" declared at a-textio.ads:210
glosa.adb:17:08: expected type "Standard.Integer"
glosa.adb:17:08: found type "Contador_Versos" defined at line 4
glosa.adb:17:08:   ==> in call to "Put" at a-tiinio.ads:68, instance at a-inteio.ads:18
glosa.adb:17:08:   ==> in call to "Put" at a-textio.ads:245
glosa.adb:17:08:   ==> in call to "Put" at a-textio.ads:211


Eso me dice al compilar el programa.
Que puedo hacer?

Bueno, perdona por abusar un poco de ti xD, pero me estas ayudando mucho:)
Gracias por la ayuda.
Uhm... mira a ver si los arrays se escriben con [] en vez de con (), que no me acuerdo.
Por otro lado, acabo de darme cuenta que el for lo tienes mal, tendrías que hacer "for i in 1..4 loop" (y recuerda que esa i solo existe dentro del for).
A ver si con eso se va aclarando un poco la cosa ;)
Uufff... me estoy volviendo loco xD

Este es el código como lo tengo ahora:
WITH Ada.Integer_Text_IO;USE Ada.Integer_Text_IO;
WITH Ada.Text_Io;USE Ada.Text_IO;

PROCEDURE Glosa is

   Caracter:Character;
   TYPE Contador_silabas IS ARRAY (1..4) OF Integer;
   TYPE Contador_versos IS ARRAY (1..4) OF Integer;

BEGIN

   PUT("Analitzador de Gloses 0.1 alfa. Per favor, introdueix els tres primers versos afegint al final de cada vers el caracter '*' i el darrer amb punt. Accentuar la silaba tonica de la darrera paraula.");
   GET(Caracter);
   New_line;
   FOR I IN 1..4 LOOP
      WHILE Caracter/='.' OR Caracter/='*' LOOP
         Contador_silabas(I):=Contador_silabas(I)+1;
         Get(Caracter);
      END LOOP;
   END LOOP;
     
   FOR I IN 1..4 LOOP
      WHILE Caracter='.' OR Caracter='*' LOOP
         Contador_Versos(I):=Contador_Versos(I)+1;
         Get(Caracter);
      END LOOP;
   END LOOP;
   Get(CARACTER);
   PUT(Contador_Versos(1));

END Glosa;


Y me da error, Illegal operand for array conversion (refiriendose a la I), y muchos errores de los mencionados anteriormente.
Sabes por qué puede ser?
Muchas gracias, de verdad.
¿Por qué tienes dos bucles identicos con distintos contadores? No lo entiendo...
Por otro lado, recuerda que para contar las silabas tendrás que meter un if en el bucle, para que solo cuente si las letras son "a" "e" "i" "o" "u".
En qué linea te da ese error?
Bueno, añadiendo el IF que has dicho queda:
WITH Ada.Integer_Text_IO;USE Ada.Integer_Text_IO;
WITH Ada.Text_Io;USE Ada.Text_IO;

PROCEDURE Glosa is

   Caracter:Character;
   TYPE Contador_silabas IS ARRAY (1..4) OF Integer;
   TYPE Contador_versos IS ARRAY (1..4) OF Integer;

BEGIN

   PUT("Analitzador de Gloses 0.1 alfa. Per favor, introdueix els tres primers versos afegint al final de cada vers el caracter '*' i el darrer amb punt. Accentuar la silaba tonica de la darrera paraula.");
   GET(Caracter);
   New_line;
   FOR I IN 1..4 LOOP
      WHILE Caracter/='.' OR Caracter/='*' LOOP
         IF Caracter='a' OR Caracter='e' OR Caracter='i' OR Caracter='o' OR Caracter='u' THEN
            Contador_Silabas(I):=Contador_Silabas(I)+1;
         END IF;
         Get(Caracter);
      END LOOP;
   END LOOP;

   FOR I IN 1..4 LOOP
      WHILE Caracter='.' OR Caracter='*' LOOP
         Contador_Versos(I):=Contador_Versos(I)+1;
         Get(Caracter);
      END LOOP;
   END LOOP;
   Get(CARACTER);
   PUT(Contador_Versos(1));

END Glosa;




El error de la "I" lo da en la linea 18.
Y lo de los dos bucles con distintos contadores, no es asi?
Lo que intento con esos bucles, es que uno me cuente el número de silabas de cada verso, y otro me cuente cuantos versos hay en el texto.

Muchas gracias por la ayuda.
Antes de nada, no habias dicho que siempre eran de 4 versos? Porque sino yo me he patinado desde el principio y la cosa se complica...
Por otro lado, si quieres contar dos cosas distintas por que le dices que cuente exactamente lo mismo? (estas usando un contador distinto, pero la forma de contar es la misma) Ahora has cambiado un poco uno de los bucles y por tanto ya no cuentan las mismas cosas, pero a efectos practicos tu programa haría lo siguiente:
-Pedir texto
-Contar las vocales (equivalente a silabas en tu caso) del texto que metas.
-Volver a pedir texto (no te saldría mensaje pidiendotelo, pero el programa lo necesitaria)
-Contar las letras del texto que metas.
Los versos pueden variar, si meten 3 tiene que salir un error, al igual que si metes 5 y tal.
Respecto al programa, bueno, lo he modificado (por lo de que lee las letras y tal), y me queda así:
WITH Ada.Integer_Text_IO;USE Ada.Integer_Text_IO;
WITH Ada.Text_Io;USE Ada.Text_IO;

PROCEDURE Glosa is

   Caracter:Character;
   TYPE Contador_silabas IS ARRAY (1..4) OF Integer;
   TYPE Contador_versos IS ARRAY (1..4) OF Integer;

BEGIN

   PUT("Analitzador de Gloses 0.1 alfa. Per favor, introdueix els tres primers versos afegint al final de cada vers el caracter '*' i el darrer amb punt. Accentuar la silaba tonica de la darrera paraula.");
   GET(Caracter);
   New_line;
   FOR I IN 1..4 LOOP
      WHILE Caracter/='.' OR Caracter/='*' LOOP
         IF Caracter='a' OR Caracter='e' OR Caracter='i' OR Caracter='o' OR Caracter='u' THEN
            Contador_Silabas(I):=Contador_Silabas(I)+1;
         END IF;
         Get(Caracter);
      END LOOP;
   END LOOP;

   FOR I IN 1..4 LOOP
      WHILE Caracter='.' OR Caracter='*' LOOP
         Contador_Versos(I):=Contador_Versos(I)+1;
      END LOOP;
   END LOOP;
   Get(CARACTER);
   PUT(Contador_Versos(1));

END Glosa;


Pero claro, el problema es que el programa me da errores por todos lados, y no compila :S.
Algo debo estar haciendo mal...
Hmmm... tu sabes que hago mal, y como seria correcto?

Muchisimas gracias por la ayuda.:)
Si pones los errores que te dan igual podemos hacernos una idea de a qué se refieren, porque asi a pelo... estoy demasiado desentrenado.
De todas formas sigo sin entender qué hace ese segundo bucle (bueno, sé lo que hace, lo que no entiendo es para que pones eso ahi).
En cuanto a que el programa tiene que aceptar más o menos versos... eso lo complica un poco (no mucho), asi que te recomendaría que primero consiguieras que funcione uno que solo acepte 4 y luego lo mejores (aunque ya te adelanto es cosa de cambiar ese for por un while).
No entiendo lo que quieres decir ocn que no sabes que hace ahi ese segundo bucle xD, es decir, lo coloco mal? sobra?
Los errores que me da tal cual el código de antes son:

glosa.adb:1:09: warning: no entities of "Integer_Text_Io" are referenced
glosa.adb:18:30: illegal operand for array conversion
glosa.adb:18:34: expected type universal integer
glosa.adb:18:34: found type "Contador_silabas" defined at line 7
glosa.adb:26:26: illegal operand for array conversion
glosa.adb:26:30: expected type universal integer
glosa.adb:26:30: found type "Contador_versos" defined at line 8
glosa.adb:30:04: no candidate interpretations match the actuals:
glosa.adb:30:04: missing argument for parameter "Item" in call to "Put" declared at a-tiinio.ads:78, instance at a-inteio.ads:18
glosa.adb:30:04: missing argument for parameter "Item" in call to "Put" declared at a-tiinio.ads:62, instance at a-inteio.ads:18
glosa.adb:30:04: missing argument for parameter "Item" in call to "Put" declared at a-textio.ads:244
glosa.adb:30:04: missing argument for parameter "Item" in call to "Put" declared at a-textio.ads:210
glosa.adb:30:08: expected type "Standard.Integer"
glosa.adb:30:08: found type "Contador_versos" defined at line 8
glosa.adb:30:08:   ==> in call to "Put" at a-tiinio.ads:68, instance at a-inteio.ads:18
glosa.adb:30:08:   ==> in call to "Put" at a-textio.ads:245
glosa.adb:30:08:   ==> in call to "Put" at a-textio.ads:211


Puff, lo siento si te estoy mareando, pero agradezco un montón tu ayuda:).
A mi ese bucle me sobra, pero tú sabrás lo que quieres hacer. No pienses en lo que yo quiero que hagas y piensa en qué pretendes tú que haga.
La verdad es que no tengo ni idea de a qué error se refiere eso. Si tuviera el compilador instalado lo probaría pero no es el caso, lo siento. De todas formas empieza por inicializar el contenido del array, que recuerda que todas las variables no inicializadas llevan basura por defecto.
Y una pregunta, con la I del Contador_silabas(I), le tengo que dar un valor antes, lo tengo que declarar o algo?
Porque el error me apunta siempre a la I :S

Gracias por la ayuda.
Esa I en principio no necesitas tocarla porque es un entero que va tomando los valores 1,2,3,4 gracias al for.
Bueno, me da el problema con la I, pero de todas formas, muchas gracias por la ayuda, me ha servido bastante:)

Un saludo y gracias.
No hay de que, espero que consigas solucionarlo. Le comentaré a un amigo que le eche un vistazo al hilo si me acuerdo, por curiosidad, que él tiene algo más fresco el ADA...
Humm...
Reaciendo el programa, tengo que:

WITH ADA.INTEGER_TEXT_IO;USE ADA.INTEGER_TEXT_IO;
WITH ADA.TEXT_IO;USE ADA.TEXT_IO;

PROCEDURE GLOSA IS
   
   CARACTER:CHARACTER;
   TYPE Contador_Silabas IS ARRAY (1..9) OF Integer;
   
   BEGIN

   PUT("Introduce el texto: ");
      GET(CARACTER);
      FOR I IN 1..9 LOOP
         WHILE Caracter/='.' OR Caracter/='*' LOOP
            IF Caracter='a' OR Caracter='e' OR Caracter='i' OR Caracter='o' OR Caracter='u' THEN
               Contador_Silabas(i):=Contador_Silabas(i)+1;
            END IF;
            GET(CARACTER);
         END LOOP;
      END LOOP;
   END GLOSA;


Y me da 3 errores,
contador_caracter.adb:16:33: illegal operand for array conversion
contador_caracter.adb:16:37: expected type universal integer
contador_caracter.adb:16:37: found type "Contador_Silabas" defined at line 7

Todos los errores me apuntan a la I, pero no tengo ni idea de que hacer.
Alguna sugerencia?

Gracias por la ayuda.
masterpok escribió:
xgc1986 escribió:el bucle no tendria que ser mientras es distinto de '\n'? o el ejercicio te dice que es un punto?

Sólo como apunte para que el amigo Jordi Uchiha no se lie, en ADA no existe '\n', tendrías que usar "end of line".


no tenia ni idea, una cosa mas que se xD.

en los blucles tendrias que hacerlos de 1..4, y el tamaño del array ha de ser de tamaño 4 (uno por verso)

no tengo ni idea de ADA, pero no tendrias que poner Caracter en mayusculas igual que en su declaraacion :-?, y luego Contador_Silabas no es un tipo?, es decir luego no tendrias que hacer:

TYPE ContadorSilabas IS ARRAY (1..9) OF Integer;
Contador_Silabas:ContadorSilabas;


no se si es eso, ya he dicho que no tengo ni idea de ADA, pero es que es lo unico que hay en la linia 16, y que podria coincidir con el error

y otra dudilla que tengo, en ADA los arrays empiezan por 0 o por 1?

es que es un lenguaje que tengo pendiente por aprender
Los arrays en teoria empiezan del valo 1 al que le quieras dar.

De todas formas, la duda ya está resuelta, muchas gracias a todos los que me habéis hechado un cable, me ha servido de mucho.

Un saludo! ;)
Jordi Uchiha escribió:Los arrays en teoria empiezan del valo 1 al que le quieras dar.

De todas formas, la duda ya está resuelta, muchas gracias a todos los que me habéis hechado un cable, me ha servido de mucho.

Un saludo! ;)

Por curiosidad, qué pasaba?

Los arrays en ADA empiezan de donde quieras, depende de como los definas. Si te fijas, él ha puesto en la definicion 1..4, asi que el array empezará de 1 y acabará en 4.
En el array tenia que declarar esto:

Procedure programa is
  Type Contador Is Array (1..5) of Integer;
  Numero_Silabas:Contador;
Begin
  Numero_Silabas:(0,0,0,0,0);
  For I In 1..5 Loop
    Numero_Silabas(I):=Numero_Silabas(I)+1;
  End Loop;
End programa;


Al hacer eso, ya tiraba.
Muchas gracias a todos, pero sobretodo a masterpok por resolver todas mis dudas.
Un saludo! ;)
26 respuestas