Nombre de lettres et de chiffres

Nombre de lettres et de chiffres - Ada - Programmation

Marsh Posté le 30-10-2005 à 19:02:26    

Il faut que j'écrive un programme qui affiche le nombre de lettres majuscules, de lettres minuscules et de chiffres contenus dans une ligne de texte sachant que ces trois groupes de caractères forment des intervalles distincts dans le code LATIN-1.
 
Je n'arrive pas à cerner le problème, je ne trouve aucun point de départ pour écrire mon algorithme.
Pouvez vous m'aider en me donnant des indications pour éclaircir le problème svp?
 
Merci


Message édité par Profil supprimé le 01-11-2005 à 09:29:59
Reply

Marsh Posté le 30-10-2005 à 19:02:26   

Reply

Marsh Posté le 31-10-2005 à 14:38:42    

Je pense qu'il doit falloir lire tous les caractères de la ligne, puis les tester pour savoir si ce sont des majuscules, des minuscules ou des chiffres.
 
Par contre je ne vois pas du tout quelle est la commande permettant de lire les caractères...

Reply

Marsh Posté le 31-10-2005 à 14:52:40    

lib Ada.Characters.Handling pour les tests, et tu dois sûrement pouvoir accéder aux caractères d'un string en considérant celui-ci comme un tableau de charactères (essaie, sinon il y a peut être des fonctions pour gérer ça dans ada.strings)


Message édité par masklinn le 31-10-2005 à 14:54:23

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 31-10-2005 à 16:44:43    

désolé mais j'ai pas tout compris à ce que tu me dis de faire...
je commence à peine en ada et je connaias pas tout ça

Reply

Marsh Posté le 01-11-2005 à 20:03:57    

J'ai essayer un programme mais il n'est pas encore correct, il ne donne pas le bon résultat mais je ne vois pas pourquoi
 
Avez vous une idée?  

with ada.text_io, ada.integer_text_io;
procedure caractere is
   A,B,C: Integer;
   ligne : character;
begin
   ada.text_io.put("saisir une ligne de texte :" );
   ada.text_io.get(ligne);
   A:=0;
   B:=0;
   C:=0;
   for X in Character'First..Character'Last loop
      if Character'Pos('A')<=Character'Pos(X)  
         and Character'Pos(X)<=Character'Pos('Z') then
         A:=A+1;
      end if;
      if Character'Pos('a')<=Character'Pos(X)  
         and Character'Pos(X)<=Character'Pos('z') then
         B:=B+1;
      end if;
      if Character'Pos('0')<=Character'Pos(X)  
         and Character'Pos(X)<=Character'Pos('9') then
         C:=C+1;
      end if;
   end loop;
   Ada.Text_Io.Put("nombre de lettres majuscules :" ); Ada.integer_Text_Io.Put(A);
   Ada.Text_Io.new_line;
   Ada.Text_Io.Put("nombre de lettres minuscules :" ); Ada.integer_Text_Io.Put(B);
   Ada.Text_Io.new_line;
   Ada.Text_Io.Put("nombre de chiffres :" ); Ada.integer_Text_Io.Put(C);
   Ada.Text_Io.new_line;
end;

Reply

Marsh Posté le 01-11-2005 à 21:39:09    


Ptet paske tu fais tes tests sur l'ensemble des caractères au lieu de les faire sur ta phrase [:hfrbaxter]  
 
Accessoirement, comme tu as défini "ligne" en tant que "character" (un caractère unique), seul un caractère est retenu [:pingouino] (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 [:jar jar]

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 [:pingouino]
(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
Reply

Marsh Posté le 02-11-2005 à 09:53:33    

Je te remercie bcp pour ton aide.
 
Je ne savais qu'il existait des packages, et c'est sur qu'en les connaissant ça devient tout de suite bcp plus facile :)
Encore merci.

Reply

Marsh Posté le 02-11-2005 à 15:07:05    

Si c'est pour un exercice, il vaut peut être mieux se passer de ada.characters.handling . C'est plus simple, mais pour apprendre à utiliser le langage....
 
Enfin, je dis ça...
 
 
 ;)

Reply

Marsh Posté le 02-11-2005 à 16:01:27    

Loki du placard a écrit :

Si c'est pour un exercice, il vaut peut être mieux se passer de ada.characters.handling . C'est plus simple, mais pour apprendre à utiliser le langage....
 
Enfin, je dis ça...
 
 
 ;)


Désolé, mais je vois franchement pas l'intérêt d'utiliser des conditions à la mords moi le noeud quand on a des fonctions Is_* dispos [:petrus75]
 
Et connaître le contenu des libs et savoir les utiliser, j'appelle ça savoir utiliser le langage perso, je vois pas l'intérêt de réinventer la roue quand tous les diamètres et tous les types de roues sont déjà fournis de base avec le langage [:petrus75]
 
Si ça t'amuse de tout refaire en permanence, c'est du C qu'il faut faire, ou de l'ASM [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 02-11-2005 à 17:14:49    

Pour l'exercice, on a tous réécrit des fifo, lifo... Pourtant la plupart des langages sont livrés avec.
 
delphinounette semble débuter, donc ce n'est pas inutile d'utiliser les "conditions à la mords moi le noeud" dans un premier  temps. Après, c'est clair, faut utiliser les libs standard sans hésiter.
 
Et pour info, j'ai passé l'age de réinventer la roue.  ;)

Reply

Marsh Posté le 02-11-2005 à 17:14:49   

Reply

Marsh Posté le 02-11-2005 à 19:11:21    

Loki du placard a écrit :

Pour l'exercice, on a tous réécrit des fifo, lifo... Pourtant la plupart des langages sont livrés avec.


Nous on les faisait en C.
 
Le C n'est pas livré avec des piles/files (ou un truc qui permette de les émuler, genre std::vector) dans la distro standard :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed