Rechercher : dans
Par :

Transformer chaine de carac en maj en ada

Dernière réponse le 18 nov 2009 à 14:51:17 thib79, le 14 oct 2009 à 19:02:34 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Firefox 3.5.3

Meilleures réponses pour « transformer chaine de carac en maj en ada » dans :
PHP - Nettoyer une chaîne de caractères VoirVoici une fonction en PHP qui peut être assez pratique, surtout quand on fait de l'URL Rewriting. Cette fonction permet de transformer les caractères de n'importe quelle chaîne de caractères en chaîne non accentuée, en enlevant les caractères...
Transformer un fichier Word (.doc) en PDF VoirTransformer en fichier PDF un fichier Microsoft Word (.doc) Rien de plus simple ! Ouvrez votre fichier *.doc avec OpenOffice.org Réglez éventuellement la mise en page par le menu Format / Page... Dès lors, 2 solutions pour transformer...
Transformer un fichier Microsoft Excel (.xls) en PDF VoirTransformer en fichier PDF un fichier Microsoft Excel (.xls) Rien de plus simple ! Ouvrez votre fichier *.xls avec OpenOffice.org Réglez éventuellement la mise en page par le menu Format / Page... Dès lors, 2 solutions pour transformer en...
Télécharger Transform XP to Vista VoirSi vous cherchez quelque chose de nouveau pour personnaliser l'interface de votre Windows XP, mais que vous n'avez pas le temps pour des tests. Ce thème est fait pour vous. Transform Xp to Vista est un pack complet pour la personnalisation de votre...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
VBScript - Les fonctions de chaînes de caractères VoirLes fonctions de chaînes de caractères Fonction Description Filter(InputStrings, Value[, Include[, Compare]]) Sélectionne des chaînes de caractères parmi un tableau de chaînes...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

Charles Babbage, le 14 oct 2009 à 19:14:24

Salut,

Nous ne demandons qu'à t'aider. Mais ce serait peut-être plus simple si tu nous disais simplement où ça cloche.

Répondre à Charles Babbage

2

thib79, le 14 oct 2009 à 19:23:55

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

Répondre à thib79

3

Charles Babbage, le 14 oct 2009 à 21:04:15

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

Répondre à Charles Babbage

4

thib79, le 14 oct 2009 à 21:06:28

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;

Répondre à thib79

5

Charles Babbage, le 14 oct 2009 à 21:26:16

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

Répondre à Charles Babbage

6

thib79, le 14 oct 2009 à 21:43:59

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.

Répondre à thib79

7

Charles Babbage, le 15 oct 2009 à 00:30:52

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 ?

Répondre à Charles Babbage

8

thib79, le 15 oct 2009 à 16:50:57

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.

Répondre à thib79

9

Lord Byron, le 15 oct 2009 à 21:25:09

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

Répondre à Lord Byron

10

Lord Byron, le 15 oct 2009 à 21:31:31

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"

Répondre à Lord Byron

11

thib79, le 15 oct 2009 à 23:14:14

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;

Répondre à thib79

12

Lord Byron, le 16 oct 2009 à 02:23:15

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 ;-)

Répondre à Lord Byron

13

 lipton / pgs.dev.ada, le 18 nov 2009 à 14:51:17
  • +1

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;

Répondre à lipton / pgs.dev.ada
Collection CommentÇaMarche.net