Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction mettre en MAJUSCULES les minuscules - RÉSOLU

ASTUCES POUR TOUS =D

Sujet résolu
8 septembre 2010 à 3:46:17

Bonjour chers amis zéros,

Depuis quelques temps hier, je cherchais une fonction qui mettrait ma chaine de caractère en majuscules. Exemple : J'aime les oranges. -> J'AIME LES ORANGES. Au début, ma solution était un peu lourd :-°

char chaine[100] = "allo les zeros";
int i = 0;

while (chaine[i] != '\0')
{
     if (chaine[i] == 'a')
          chaine[i] = 'A';

     if (chaine[i] == 'b')
          chaine[i] = 'B';

     if (chaine[i] == 'c')
          chaine[i] = 'C';

     //...
     //...
     //...
     //Et on continue pour tout les autres lettres de l’alphabet !
     i++;
}


C'est trop long comme code source me direz-vous ! :lol:

Et bien vous savez quoi ?
J'ai trouvé un solution encore meilleur.


VERSION 2 :

Comme vous l'avez sûrement bien appris dans le cours de m@teo, chaque caractère en C est représenté par un nombre. Cette conversion ce base sur la table ASCII :
Image utilisateur
:o ok ?

C'est bourré d'information ! :p Nous, ce qu'on veut, c'est Dec et Char (chr). Regardez plus vers la droite, les deux dernières colonnes. À la dernière, on peut voir les minuscules. À l'avant-derniere, on peut voir les Majuscules.

Prenons la lettre 'a' pour exemple. 'a' = 97 et 'A' = 65

97 - 65 = 32

vous avez compris ?
Exemple : 'd' = 100

100 - 32 = 68

68 = 'D'

Voici ma fonction :
void majuscule(char *chaine)
{
    int i = 0;

    //Tant que nous ne sommes pas arrivés a la fin de la chaine, continuer
    while (chaine[i] != '\0')
    {
        /*si chaine[1] est une minuscule
         *Car les minuscules se situent entre 97 et 122 inclusivement
         */
        if (chaine[i]  >= 97 &&  chaine[i] <= 122)
            
            //Convertir en majuscules
            chaine[i] = chaine[i] - 32;
        i++;
    }
}


Il y a sûrement déjà eut quelqu'un qui a penser à cette fonction et je ne dois sûrement pas être le premier qui la écrite... mais je me sentais trop comme un génie alors j'ai décider de publier mon code source (tuto) ;) J'espère avoir pû aider quelqu'un d'entre vous. Si vous trouver une meilleure façon de faire cette fonction, faites moi le savoir :)
  • Partager sur Facebook
  • Partager sur Twitter
8 septembre 2010 à 4:05:25

ou plus simplement et plus clairement:
void majuscule(char *chaine)
{
    int i = 0;
    for (i = 0; chaine[i] != '\0'; i ++)
    {
        if (chaine[i]  >= 'a' &&  chaine[i] <= 'z')
	     chaine[i] -=  'a' - 'A';
    }
}
  • Partager sur Facebook
  • Partager sur Twitter
8 septembre 2010 à 4:17:19

:-° Pas fou ! Sérieusement, je n'y avais pas penser :p

Vous savez s'il existe en C une fonction déjà faite pour ça ?
  • Partager sur Facebook
  • Partager sur Twitter
8 septembre 2010 à 4:52:04

Bien sûr ;)

#include <ctype.h>

int toupper ( int c );

Cette fonction met un caractère en majuscule ! Donc :

#include <ctype.h>

void strtoupper(char *str)
{
    for ( ; *str ; str++)
        *str = toupper(*str);
}


Ou bien :
#include <ctype.h>

void majuscule(char *chaine)
{
    int i = 0;
    for (i = 0 ; chaine[i] != '\0' ; i++)
    {
        chaine[i] = toupper(chaine[i]);
    }
}
  • Partager sur Facebook
  • Partager sur Twitter
8 septembre 2010 à 5:05:04

Citation : EamjeeInc

:-° Pas fou ! Sérieusement, je n'y avais pas penser :p

Vous savez s'il existe en C une fonction déjà faite pour ça ?

On ne pense pas du premier coup que 'a' est juste une constante symbolique dont la valeur est 97.
  • Partager sur Facebook
  • Partager sur Twitter
8 septembre 2010 à 21:55:28

Citation : psimod

Citation : EamjeeInc

:-° Pas fou ! Sérieusement, je n'y avais pas penser :p

Vous savez s'il existe en C une fonction déjà faite pour ça ?

On ne pense pas du premier coup que 'a' est juste une constante symbolique dont la valeur est 97.



Ou pas :)
  • Partager sur Facebook
  • Partager sur Twitter
9 septembre 2010 à 13:32:15

Citation : psimod

ou plus simplement et plus clairement:

void majuscule(char *chaine)
{
    int i = 0;
    for (i = 0; chaine[i] != '\0'; i ++)
    {
        if (chaine[i]  >= 'a' &&  chaine[i] <= 'z')
	     chaine[i] -=  'a' - 'A';
    }
}


Bien que ce soit presque portable, cette solution relève de la bidouille.

La solution de HighTam est plus élégante (et standard en plus), à savoir par utilisation de la fonction toupper().
  • Partager sur Facebook
  • Partager sur Twitter
9 septembre 2010 à 17:23:27

Oui c'est sur, mais j'ai cru que le PO voulait lui meme coder cette fonction, c'est pour ca.
  • Partager sur Facebook
  • Partager sur Twitter
25 octobre 2010 à 17:52:09

Merci beaucoup, moi qui cherchait depuis qq temps comment mettre une chaine en majuscule
  • Partager sur Facebook
  • Partager sur Twitter
25 octobre 2010 à 18:06:15

Citation : fraisetagada

Merci beaucoup, moi qui cherchait depuis qq temps comment mettre une chaine en majuscule


méfis toi toupper utilise un lib à inclur #include <ctype.h>
  • Partager sur Facebook
  • Partager sur Twitter
25 octobre 2010 à 19:18:31

Je tacherai de ne pas oublier :D mais comme je travaille avec et sur les chaines, je suis obligé d'inclure cette bibliothèque.
  • Partager sur Facebook
  • Partager sur Twitter
2 septembre 2011 à 12:03:01

Salut, je débute en programmation depuis un mois environ, je suis les cours de matheo@21 et j'en suis au TP du pendu.
dans ce TP j'ai voulu aussi faire une fonction qui mettent en majuscule une chaine. Comme ca l'utilisateur n'a pas a ce préocuper de taper ou non en majuscule (dans le mode 2 joueurs que j'ai créé).

voici la fonction que j'ai écrit en m'inspirant de plusieurs solution existante.

void chaineEnMajuscule(char*chaine)

int i=0;

for(i=0;chaine[i]!='\n';i++)
{
chaine[i]=toupper(chaine[i]);
}
}

je crois que ca ressemble beaucoup a celle de High Tam mais je le trouve plus comprehensible pour moi (je le rappel je debute).

  • Partager sur Facebook
  • Partager sur Twitter
2 septembre 2011 à 13:17:57

Bonjour Guillaume211191,
Comme tu débutes visiblement sur le forum également, prends soin d'apprendre a poster du code avec les balises 'code' : le bouton Image utilisateur
cela devient:
void chaineEnMajuscule(char*chaine)
{
     int i=0;

     for(i=0;chaine[i]!='\n';i++)
     {
          chaine[i]=toupper(chaine[i]);
     }
 }

Par contre une chaine AZT (a zero terminal-> http://www.commentcamarche.net/contents/c/cstring.php3 ) se termine par '\0' et pas '\n' (qui est le retour a la ligne)! donc tu auras une erreur pour
char *ch = "chaineAZT"; // le compilateur rajoute un '\0' après le T pour marquer la fin de la chaine
chaineEnMajuscule(ch);
  • Partager sur Facebook
  • Partager sur Twitter
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
2 septembre 2011 à 13:27:22

@ EamjeeInc: C'est très bien d'avoir trouvé cela tous seul, cependant, je suis désolé de te décevoir, mais c'est archi-connu ^^" .

@ Guillaume211191: Le créateur du tuto sur le C est M@teo21 et non M@theo21 ;)
  • Partager sur Facebook
  • Partager sur Twitter

🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.

2 septembre 2011 à 14:38:12

Citation : @che

@ EamjeeInc: C'est très bien d'avoir trouvé cela tous seul, cependant, je suis désolé de te décevoir, mais c'est archi-connu ^^" .


Ça l'était peut être moins il y a UN an... (enfin bon j'en doute... mais la fraicheur d'un codeur débutant qui crois avoir trouvé un truc génial ca fait toujours plaisir...)!
  • Partager sur Facebook
  • Partager sur Twitter
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
2 septembre 2011 à 17:54:02

Oui évidement, je ne voulais pas être déplaisant :) juste qu'il sache que c'était connu .
Mais je répète, c'est très bien d'avoir trouver ça tout seul. :)
  • Partager sur Facebook
  • Partager sur Twitter

🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.

8 octobre 2011 à 17:19:56

Bonjour, tout le monde. J'en profite pour poser quelques questions:
J'ai lu dans un bouquin en C qu'il y a des fonctions standard qui renvoie si le caractère envoyé est une lettre. Une autre, un chiffre, etc...
Mais le livre, je ne le verrais pas avant deux semaines, et sur internet, je n'arrive pas à les trouver. Si quelqu'un savait, j'en serais ravi :)
Sinon, j'attendrais...
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 17:21:21

Renseigne toi sur les fonctions de ctype.h (isdigit, etc.). :)
Crée un nouveau post pour ton problème, c'est toujours mieux. ;)
  • Partager sur Facebook
  • Partager sur Twitter
26 mai 2018 à 17:30:55

il y a un problème de compilation au niveau de conversion de la chaine en majuscule


program moyenne;
uses wincrt;
var
i,n,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19,n20,n21,n22,n23,n24,dc1,dc2,synt1,ddc1,ddc2:integer;
syn2,phg,mag,madg,infg,tecg,frg,arg,ang,spg,isg,terg,geg:integer;
ch,ch1,ch2,ch3,ch4:string;
begin
writeln('sumestre 1');
writeln('donner le nom de matiere');
readln(ch);
writeln('donner la note de devoir de controle n°=1');
readln(dc1);
writeln('donner la note de devoir de controle n°=2');
readln(dc2);
writeln('donner la note de devoir desynthese n°=1');
readln(synt1);

if (ch:=(upcase('MATH');

n1:=((dc1+dc2)+(synt1*2))/4);   
if (ch:=(upcase('PHYZIQUE');
n2:dc1+dc2;
if ch:=(upcase('INFORMATIQUE');
n3:dc1+dc2;
if ch:=(upcase('TECHNIQUE');
n4:dc1+dc2;
if ch:=(upcase('FRANCAIS')OR('FRANçAIS');
n5:dc1+dc2;
if ch:=(upcase('ARABE');
n6:dc1+dc2;
if ch:=(upcase('ANGLAIS')) then
n7:=dc1+dc2+(syn1/2)/5;
if ch:=(upcase('MADANIA');
n8:dc1+dc2;
if ch:=(upcase('SPORT');
n9:dc1+dc2;
if ch:=(upcase('ISLEMIA');
n10:dc1+dc2;
if ch:=(upcase('TERI5')OR('TERIKH');
n11:dc1+dc2;
if ch:=(upcase('GEO')or('GEOGRAPHIQUE');
n12:dc1+dc2;
writeln('symestre2');
writeln('donner la note de devoir de controle n°=1');
readl(ddc1);
writeln('donner la note de devoir de controle n°=2');
readln(ddc2);
writeln('donner la note de de voir de synthese n°=2');
readln(syn2);
if ch:=(upcase('MATH')) then
n13:=ddc1+ddc2+(syn1/2)/5;
if ch:=(upcase('PHYZIQUE');
n14:ddc1+ddc2;
if ch:=(upcase('INFORMATIQUE');
n15:ddc1+ddc2;
if ch:=(upcase('TECHNIQUE');
n16:ddc1+ddc2;
if ch:=(upcase('FRANCAIS')OR('FRANçAIS');
n17:ddc1+ddc2;
if ch:=(upcase('ARABE');
n18:ddc1+ddc2;
if ch:=(upcase('ANGLAIS')) then
n19:=ddc1+ddc2+(syn1/2)/5;
if ch:=(upcase('MADANIA');
n20:ddc1+ddc2;
if ch:=(upcase('SPORT');
n21:ddc1+ddc2;
if ch:=(upcase('ISLEMIA');
n22:ddc1+ddc2;
if ch:=(upcase('TERI5')OR('TERIKH');
n23:dc1+ddc2;
if ch:=(upcase('GEO')or('GEOGRAPHIQUE');
n24:ddc1+ddc2;
writeln('moyenne generale');
mag:=n1+n13/2;
phg:=n2+n14/2;
ifng:=n3+n15/2;
tecg:=n4+n16/2;
frg:=n5+n17/2;
arg:=n6+n18/2;
ang:=n7+n19/;
madg:=n8+n20/2;
spg:=n9+n21/2;
isg:=n10+n22/2;
terg:=n11+n23/2;
geg:=n12+n24/2;
writeln('moyenne general de matier mathematique',mag);
writeln('moyenne general de matier physique',phg);
writeln('moyenne general de matier informatique',ifng);
writeln('moyenne general de matier technique',tecg);
writeln('moyenne general de matier français',frg);
writeln('moyenne general de matier arabe',arg);
writeln('moyenne general de matier anglais',ang);
writeln('moyenne general de matier sport',spg);
writeln('moyenne general de matier issllemia',isg);
writeln('moyenne general de matier teri5',terg);
writeln('moyenne general de matier geo',geg);
end.

-
Edité par ayedimohamed 26 mai 2018 à 17:37:55

  • Partager sur Facebook
  • Partager sur Twitter
26 juin 2019 à 15:37:59

Demandez à l’utilisateur de saisir une phrase et mettez tous les « a » en majuscule.
Demandez à l’utilisateur de saisir une phrase et mettez-la en majuscule.
 Demandez à l’utilisateur de saisir une phrase et le caractère au milieu de la phrase :
Mettez-le en majuscule s’il est une lettre,
Remplacez-le par # s’il est un espace
Remplacez-le par ** s’il est un chiffre

est ce que je peux avoir une solution

  • Partager sur Facebook
  • Partager sur Twitter
26 juin 2019 à 16:14:03

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter