Ptet paske tu fais tes tests sur l'ensemble des caractères au lieu de les faire sur ta phrase
Accessoirement, comme tu as défini "ligne" en tant que "character" (un caractère unique), seul un caractère est retenu (essaie en ajoutant ada.text_io.put(ligne);ada.text_io.new_line; en dessous de ton ada.text_io.get)
Et franchement, tu devrais utiliser les packages standards. Tu peux trouver tout le bazar sur Adapower (dans le Ada95 Reference Manual par exemple)
Posons la chose de manière simple, en français.
Tout d'abord, ce que tu veux c'est faire du comptage de charactères
procedure charscount is
begin
end charscount; |
Tu veux saisir une ligne, ta ligne c'est du texte. Du texte, c'est le type ADA "String" (défini en tant que "array(Positive range <> ) of character" ), et pas "character".
procedure charscount is
line:= String(1..100); -- On définit une chaîne de 100 caractères max.
begin
end charscount; |
On a besoin de faire des entrées/sorties, donc on récupère les deux packages qui vont bien
with ada.text_io, ada.integer_text_io;
procedure charscount is
line: String(1..100);
begin
end charscount; |
Ensuite, notre premier boulot est de saisir la chaîne.
Si on se ballade un peu dans Ada.Text_IO, on voit une méthode "get_line" qui me semble intéressante. Cette méthode rend un argument "Item" de type "String" et un argument "Last" de type "Natural" (qui est simplement un Integer positif ou nul), il nous faut donc ajouter une variable "length" de type Natural (ou Integer, ça irait très bien. Mais on va faire ça proprement). Last donne en fait l'index du dernier caractère saisi. Notre chaîne commençant ç l'index "1", c'est la même chose que d'avoir la longueur de la chaîne.
with ada.text_io, ada.integer_text_io;
procedure charscount is
line: String(1..100);
length: Natural; -- La longueur de la chaîne
begin
ada.text_io.put("Entrez le texte a traiter: " );
ada.text_io.get_line(line, length); -- On place notre ligne de texte dans "line" et sa longueur dans "length"
ada.text_io.new_line;
end charscount; |
Bien, maintenant il nous faut tester chaque caractère de notre chaîne un à un.
Premièrement, l'itération. Il suffit de parcourir du premier au dernier caractère de la chaîne. Coup de bol, notre chaîne commence au caractère "1" et "length" nous donne l'index du dernier caractère.
with ada.text_io, ada.integer_text_io;
procedure charscount is
line: String(1..100);
length: Natural;
begin
ada.text_io.put("Entrez le texte a traiter: " );
ada.text_io.get_line(line, length);
ada.text_io.new_line;
for i in 1..length loop -- On boucle sur toute notre chaîne, l'index du caractère actuel est stocké dans "i"
end loop;
end charscount; |
Bon.
Maintenant qu'on peut obtenir chaque caractère (un String n'étant qu'un tableau de caractères), il nous faut déterminer si ces caractères sont des minuscules, des majuscules ou des chiffres.
On remarque alors dans la documentation un package Ada.Characters possédant un sous-package Ada.Characters.Handling, et dans Characters.Handling des fonctions "Is_Upper", "Is_Lower" et "Is_Digit" dont on nous dit qu'elles renvoient True si le caractère qui leur est donné est respectivement en majuscule, en minuscule ou un chiffre décimal.
Great, le boulot est déjà fait, il n'y a plus qu'à utiliser ces fonctions
with ada.text_io, ada.integer_text_io, ada.characters.handling;
use ada.characters.handling; -- On va user ada.characters.handling, parce que c'est pas tout ça mais les lignes deviennent longues et difficilement lisibles sans
procedure charscount is
line: String(1..100);
length: Natural;
begin
ada.text_io.put("Entrez le texte a traiter: " );
ada.text_io.get_line(line, length);
ada.text_io.new_line;
for i in 1..length loop
if Is_Lower(line(i)) then -- Un String est un simple tableau de caractères, donc on l'utilise comme tel en prenant le caractère au rang "i"
elsif Is_Upper(line(i)) then -- elsif permet de poser des conditions en chaîne. Les tests des "elsif" ne sont faits que si tous les "if/elsif" précédents sont faux, donc on gagne du temps d'exécution
elsif Is_Digit(line(i)) then
end if;
end loop;
end charscount; |
Bon, on va maintenant créer 3 variables de stockage de nos nombres, parce que c'est pas tout ça mais c'est pas super utile actuellement notre machin
(et ça compile toujours pas)
with ada.text_io, ada.integer_text_io, ada.characters.handling;
use ada.characters.handling;
procedure charscount is
line: String(1..100);
length: Natural;
uppersCount, lowersCount, digitsCount: Integer := 0; -- On initialise nos comptes à 0
begin
ada.text_io.put("Entrez le texte a traiter: " );
ada.text_io.get_line(line, length);
ada.text_io.new_line;
for i in 1..length loop
if Is_Lower(line(i)) then
lowersCount := lowersCount + 1; -- On incrémente chaque variable au moment kivabien
elsif Is_Upper(line(i)) then
uppersCount := uppersCount + 1;
elsif Is_Digit(line(i)) then
digitsCount := digitsCount + 1;
end if;
end loop;
end charscount; |
Maintenant ça compile (il y a juste un warning parce qu'on utilise pas encore "ada.integer_text_io" )
Il n'y a plus qu'à faire l'affichage
with ada.text_io, ada.integer_text_io, ada.characters.handling;
use ada.characters.handling;
procedure charscount is
line: String(1..100);
length: Natural;
uppersCount, lowersCount, digitsCount: Integer := 0;
begin
ada.text_io.put("Entrez le texte a traiter: " );
ada.text_io.get_line(line, length);
ada.text_io.new_line;
for i in 1..length loop
if Is_Lower(line(i)) then
lowersCount := lowersCount + 1;
elsif Is_Upper(line(i)) then
uppersCount := uppersCount + 1;
elsif Is_Digit(line(i)) then
digitsCount := digitsCount + 1;
end if;
end loop;
ada.text_io.put("Caracteres minuscules: " );
ada.integer_text_io.put(lowersCount);
ada.text_io.new_line;
ada.text_io.put("Caracteres majuscules: " );
ada.integer_text_io.put(uppersCount);
ada.text_io.new_line;
ada.text_io.put("Chiffres: " );
ada.integer_text_io.put(digitsCount);
ada.text_io.new_line;
end charscount; |
Et voila:
gnatmake -gnatx -gnatwa charscount.adb
gcc -c -gnatx -gnatwa charscount.adb
gnatbind -x charscount.ali
gnatlink charscount.ali
>charscount
Entrez le texte a traiter: Ceci est un test
Caracteres minuscules: 12
Caracteres majuscules: 1
Chiffres: 0
|
Possibilités d'améliorations: voir si tu ne peux pas permettre la saisie de textes sans limite de longueur (actuellement, au dessus de 100 caractères on est coupés)
Et franchement, utilise les packages standards, il y en a énormément, ils font le boulot à ta place et au moins tu sais qu'ils fonctionnent et n'ont pas de bugs. C'est tout l'intérêt d'un langage comme l'Ada avec une grosse lib standard.
Message édité par masklinn le 01-11-2005 à 21:44:37
---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody