Nombre de lettres et de chiffres - Ada - Programmation
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...
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)
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
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; |
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
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 |
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 |
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; |
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; |
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; |
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; |
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; |
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; |
Et voila:
gnatmake -gnatx -gnatwa charscount.adb |
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.
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.
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...
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.... |
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
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
Si ça t'amuse de tout refaire en permanence, c'est du C qu'il faut faire, ou de l'ASM
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.
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
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