Transformer chaine de carac en maj en ada

thib79 Messages postés 329 Date d'inscription   Statut Membre Dernière intervention   -  
 lipton / pgs.dev.ada -
Bonjour,

je programme en ada ( ou j'essaye ^^) depuis peu et j'ai récement eu un devoir ou il fallait réaliser une fonction qui prend en entrée une chaine de caractères et qui transforme toutes les minuscules en majuscules mais il peut déja y avoir des majuscules dans la chaine.

C'est le seul exercice que je n'ai pas su faire donc si vous pouviez m'aider à le faire afin de m'entrainer, j'en serai très heureux ou du moins me donner des pistes.

Merci d'avance
A voir également:

12 réponses

Charles Babbage
 
Salut,

Nous ne demandons qu'à t'aider. Mais ce serait peut-être plus simple si tu nous disais simplement où ça cloche.
1
lipton / pgs.dev.ada
 
Il y a aussi une autre solution ne passant pas par un tableau pour la cpnversion.

En substance, comment sait-on qu'on est face à une minuscule ? ?
Parce que notre inconnue min_letter est dans 'a' .. 'z'.
A partir de là, on peut dire que si min_letter est dans 'a' .. 'z', alors maj_letter, le résultat souhaité, se trouvera facilement en faisant simplement une addition et une soustraction.

une solution serait donc de faire une fonction du genre :

function To_Maj (Letter : Character) return Character is
begin
if Letter in 'a' .. 'z' then -- range checking
Result_Letter := 'A' - 'a' + Letter;
else
Result_Letter := Letter;
end if;
return Result_Letter
end To_Maj;
1
thib79 Messages postés 329 Date d'inscription   Statut Membre Dernière intervention   13
 
Ce qui cloche c'est que je suis un débutant.
Est ce que ceci marche ?

function majuscule (s:string) return string is

for i in 1..s'lenght loop
j:=tab(i)
if (tab(i)>='A' and tab(i)='Z') then
tab(i)='j'
else
tab(i)='J'
end if
end loop

end majuscule

sinon quelq'un m'a orienté vers ceci mais je ne vois pas vraiment comment ça marche:

type To_Maj is array (Character range 'a' .. 'z') of Character;

my_tab : To_Maj := ...
if (c>="A" and c<="Z") then
return c;
else
return my_tab( c ) ;
begin
0
Charles Babbage
 
Primo: ce n'est pas que tu sois un débutant qui cloche, ce serait plutôt que tu ne veuilles pas débuter.

Secundo: l'utilisation d'un tableau est effectivement une solution simple pour la conversion
je ne vois aucune objection à manipuler un tableau contenant des majuscules, les indices de ce tableau pouvant parfaitement être des lettres minuscules.
Si tu as un tableau t avec
t('a') contient 'A'
t('b') contient 'B'
etc jusqu'à t('z') contient 'Z'

tu vois facilement que la conversion de ta chaine correspond à
pour chaque caractère c de la chaine s
si c est >= 'a' et c est <= 'z'
alors concaténer t(c) au résultat
sinon concaténer c au résultat

je te laisse écrire
1. la construction du tableau
2. la fonction de conversion qui exploite le tableau
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
thib79 Messages postés 329 Date d'inscription   Statut Membre Dernière intervention   13
 
Est ce que ça marche ça :

type To_maj is array (character range 'a'..'z') of character

function majuscule (c:character) return character

my_tab : to_maj := (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z);
if (c>="A" and c<="Z") then
return c;
else
return my_tab (c);
end if;
end majuscule;
0
Charles Babbage
 
Un peu de sérieux quand même !
- un caractère ou une chaîne de caractères est délimité par des apostrophes
- que se passe-t-il si majuscule est appelée avec '=' ?
- même si le langage le permet, évite les return en plein corps ; préfère plutôt utiliser une variable supplémentaire contenant le résultat (ie resultat) et n'inscrire qu'un return resultat; qu'en fin de fonction
0
thib79 Messages postés 329 Date d'inscription   Statut Membre Dernière intervention   13
 
Voila ou j'en suis :

a:Character;
type To_maj is array (character range 'a'..'z') of character;

function majuscule (c:character) return character is

my_tab : to_maj := ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
begin
if (c>='A' and c<='Z') then
a:=c;
else
a:=my_tab (c);
END IF;
return a;
END Majuscule;

Maintenant si ma fonction est bonne il faut que j'en fasse une autre pour la chaine de caractères qui appelle la fonction majuscule pour chaque caractères. Petit problème parce que je ne voit pas comment faire.
0
Charles Babbage
 
re

premier constat : ton tableau semble bien présenté, mais je ne me souviens pas de l'utilité de - dans une énumération de caractères... peux-tu me rafraîchir la mémoire ?
second constat : il reste toujours le pb des non majuscules. si la fonction majuscule est appelée avec en paramètre le caractère '&', le if passera le contrôle au else car '&' n'est pas dans l'intervalle A..Z et l'affectation dans le else essaiera de mettre my_tab('&') dans a... est-ce que ça marchera ?
troisième constat: tu te creuses pas trop la tête. pourquoi est-ce à moi de te souffler qu'une chaîne de caractères n'est qu'un agglomérat de caractères ? ne peux-tu t'en rendre compte ? n'as-tu pas dans ta référence des instructions ou des fonctions agissant sur une partie de la chaîne de caractères ?

peux-tu expliquer en termes simples ou en algorithmique pourquoi utiliser s'length (cf. post 2) ? et si cet attribut s'avère utile, à quoi peut-il donc servir ? et comment ?
0
thib79 Messages postés 329 Date d'inscription   Statut Membre Dernière intervention   13
 
Salut Charles; bon tout d'abord si je viens ici c'est parce que j'ai besoin d'aide tout simplement. Je suis d'accord pour dire que ce n'est pas toi de faire mon programme mais si je dis que je ne voit pas comment faire c'est que je ne l'est jamais fait.

Sinon voila ou j'en suis :

procedure maj is
c:character;
n:character;
A:Character;
f:character;
type To_maj is array (character range 'a'..'z') of character;

function majuscule (c:character) return character is

my_tab : to_maj := ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
BEGIN
if (c>='A' and c<='Z') then
a:=c;
elsif (c>='a' and c<='z') then
a:=My_Tab (C);
ELSE
a:=0;
END IF;
return a;
END Majuscule;


FUNCTION Chaine (S:String) RETURN String IS

c:Character;
e:string;
begin
FOR I IN 1..S'Length LOOP
e:=Majuscule(c);
END LOOP;
return e;
end chaine;


Pour ma fonction majuscule, j'essaye de retourner 0 quand ce n'est pas une lettre car finalement pour mettre en majuscule il faut des lettres. (il faut simplement dire à l'utilisateur de rentrer des lettres si on fait le programme.)
Ensuite,j'ai essayé de faire une autre fonction qui appelle la première et qui, pour une chaine de caractères; renvoie une chaine de caractère. Donc avec une boucle for j'essaye d'appeler pour chaque caractère de ma chaine, ma fonction majuscule. J'utilise donc s'length pour aller jusqu'à la dernière lettre de ma chaine car je ne connais pas a l'avance le nombre de caractères. Par contre, je ne sais pas si je m'y prend bien et si cette fonction marche.
0
Lord Byron
 
Salut

> pour ta fonction majuscule
elle est actuellement fausse car tu dans la variable caractère a tu stockes la valeur entière 0. le compilateur te le refusera.
le but de ta fonction majuscule est quand même de 'convertir une minuscule en majuscule', et pas de "convertir en minuscule ce qui n'est pas majuscule"
donc ta fonction doit être : si c est minuscule alors a <- my_tab(c) sinon a <- c finsi

> pour ta fonction chaine
tu utilises un indice i pour énumérer tous les éléments de s, c'est bien. ce qui est moins bien, c'est que tu ne te sers pas de i dans ta boucle : tu passes directement à utiliser c qui contient une valeur indéfinie (je ne vois pas c := qqe chose) ; qui plus est, la majuscule de ce contenu indéfini est stocké dans e, mais nulle part tu conserves le contenu de e : à chaque itération, la majuscule précédemment calculée est écrasée par la majuscule nouvellement calculée...
donc, tu dois dans ta fonction concaténer à e la majuscule du iième caractère de s
0
Lord Byron
 
Sorry, je me suis emmêlé les pinceaux...
je voulais écrire le but de ta fonction majuscule est quand même de 'convertir une minuscule en majuscule', et pas de "convertir en majuscule ce qui n'est pas majuscule"
qui est - j'espère - plus compréhensible en le but de ta fonction majuscule est quand même de 'convertir une minuscule en majuscule', et pas de "convertir ce qui n'est pas majuscule en majuscule"
0
thib79 Messages postés 329 Date d'inscription   Statut Membre Dernière intervention   13
 
Peut tu me la corriger parce que je n'y arrive pas. Non franchement je vois pas

FUNCTION Chaine (S:String) RETURN String IS

c:Character;
e:string;
begin
FOR I IN 1..S'Length LOOP
c:=Majuscule(i);

END LOOP;
return e;
end chaine;
0
Lord Byron
 
re

le léger pb, c'est que c'est le but de l'exercice : utilser get de je_ne_sais_plus_quel_package pour extraire un caractère d'une chaine. car, contrairement à d'autres langages, un caractère isolé n'est pas directement récupérable : il faut passer par une fonction qui va chercher la séquence de caractères qui va bien et qui va te le resservir comme tu le désires. et comme ça fait 20 ans que je n'en ai plus fait, je ne me rappelle plus de la syntaxe... mais tu vas bien la retrouver !

en tout cas, si i est l'indice de ton caractère dans la chaine, la majuscule du caractère indicé n'est certainement pas la majuscule de l'indice !!!

courage, tu y es presque ;-)
0