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 -
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
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:
- Transformer chaine de carac en maj en ada
- Maj en min - Guide
- È maj - Guide
- Transformer image en icone - Guide
- Chaine tnt gratuite sur mobile - Guide
- Maj chrome - Accueil - Applications & Logiciels
12 réponses
Salut,
Nous ne demandons qu'à t'aider. Mais ce serait peut-être plus simple si tu nous disais simplement où ça cloche.
Nous ne demandons qu'à t'aider. Mais ce serait peut-être plus simple si tu nous disais simplement où ça cloche.
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;
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;
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
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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;
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;
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
- 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
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.
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.
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 ?
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 ?
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.
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.
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
> 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
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"
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"
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;
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;
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 ;-)
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 ;-)