43
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 124 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
copié dans le second tableau.
Prototype :
Code : C
void copie(long tableauOriginal[], long tableauCopie[], long tailleTableau);
Exercice 4 : créer une fonction maximumTableau qui aura pour rôle de remettre à 0 toutes les cases du tableau ayant une valeur
supérieure à un maximum. Cette fonction prendra en paramètre le tableau ainsi que le nombre maximum autorisé (valeurMax).
Toutes les cases qui contiennent un nombre supérieur à valeurMax doivent être mises à 0.
Prototype :
Code : C
void maximumTableau(long tableau[], long tailleTableau, long valeurMax);
Exercice 5 (plus difficile) : créer une fonction ordonnerTableau qui classe les valeurs d'un tableau dans l'ordre croissant. Ainsi, un
tableau qui vaut {15, 81, 22, 13} doit à la fin de la fonction valoir {13, 15, 22, 81} !
Cet exercice est un peu plus difficile que les autres, mais est tout à fait réalisable. Ca va vous occuper un petit moment
Prototype :
Code : C
void ordonnerTableau(long tableau[], long tailleTableau);
Faites-vous un petit fichier de fonctions appelé tableaux.c (avec son homologue tableaux.h qui contiendra les prototypes
bien sûr !) contenant toutes les fonctions de votre cru réalisant des opérations sur des tableaux
Vous entraîner comme ça, c'est le meilleur moyen de vous former
Au boulot !
Lorsqu'on a appris à se servir des pointeurs, généralement le reste coule de source. Je ne pense pas que ce chapitre vous
aura posé trop de problèmes (enfin je peux me tromper hein
)
Attention toutefois, cela ne veut pas dire qu'il n'y a pas de pièges. Si je devais vous faire retenir 2 choses auxquelles il faut faire très
attention ce serait :
N'oubliez JAMAIS qu'un tableau commence à l'indice 0, et non pas l'indice 1
Quand vous envoyez un tableau à une fonction, envoyez toujours à côté la taille du tableau. Sinon, il n'est pas possible de
connaître la taille du tableau lorsqu'on doit le parcourir !
Ah au fait, j'ai une bonne nouvelle. Vous avez maintenant le niveau pour manipuler des chaînes de caractères, c'est-à-dire du texte.
Vous allez pouvoir être capables de retenir du texte dans la mémoire, et donc de demander à l'utilisateur son nom par exemple
Ah il en aura fallu du temps pour faire une chose aussi simple, comme quoi vous voyez même ça c'était pas simple
Nous allons justement étudier les chaînes de caractères dans le prochain chapitre.
(hop hop hop, vous avez vu la transition de dingue que je viens de faire là ?
)
Les chaînes de caractères
Une chaîne de caractères, c'est un nom programmatiquement correct pour désigner... du texte, tout simplement
Une chaîne de caractères est donc du texte que l'on peut retenir sous forme de variable en mémoire. On pourrait ainsi stocker le nom de
l'utilisateur.
Comme nous l'avons dit plus tôt, notre ordinateur ne peut retenir que des nombres. Les lettres sont exclues. Comment diable les
45
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 125 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
programmeurs font-ils pour manipuler du texte alors ?
Y sont malins, z'allez voir
Le type char
Dans ce chapitre, nous allons porter une attention particulière au type char.
Si vous vous souvenez bien, le type char permet de stocker des nombres compris entre -128 et 127.
Si ce type char permet de stocker des nombres, il faut savoir qu'en C on l'utilise rarement pour ça. En général, même si le
nombre est petit, on le stocke dans un long ou un int. Certes, ça prend un peu plus de place en mémoire, mais aujourd'hui la
mémoire c'est vraiment pas ce qui manque sur un ordinateur
Vous ne tuerez pas votre ordi parce que vous utilisez des int
ou des long
Le type char est en fait prévu pour stocker... une lettre !
Attention, j'ai bien dit : UNE lettre.
Comme la mémoire ne peut stocker que des nombres, on a inventé une table qui fait la conversion entre les nombres et les lettres.
Cette table indique ainsi par exemple que le nombre 65 équivaut à la lettre A.
Le langage C permet de faire très facilement la traduction : lettre => nombre correspondant. Pour obtenir le nombre associé à une
lettre, il suffit de mettre cette lettre entre apostrophes, comme ceci : 'A'. A la compilation, 'A' sera remplacé par la valeur
correspondante.
Testons :
Code : C
int main(int argc, char *argv[])
{
char lettre = 'A';
printf("%ld\n", lettre);
return 0;
}
Code : Console
65
On sait donc que la lettre A majuscule est représentée par le nombre 65. B vaut 66, C vaut 67 etc.
Testez avec des minuscules, et vous verrez que les valeurs sont différentes. En effet, la lettre 'a' n'est pas identique à la lettre 'A',
l'ordinateur faisant la différence entre les majuscules et les minuscules.
La plupart des caractères "de base" sont codés entre les nombres 0 et 127.
Afficher un caractère
La fonction printf, qui n'a décidemment pas fini de nous étonner, peut aussi afficher un caractère. Pour cela, on doit utiliser le symbole
%c (c comme caractère) :
Code : C
int main(int argc, char *argv[])
{
char lettre = 'A';
printf("%c\n", lettre);
return 0;
}
39
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 126 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
Code : Console
A
Hourra !
Nous savons afficher une lettre
On peut aussi demander à l'utilisateur de rentrer une lettre en utilisant le %c dans un scanf :
Code : C
int main(int argc, char *argv[])
{
char lettre = 0;
scanf("%c", &lettre);
printf("%c\n", lettre);
return 0;
}
Si je tape la lettre B, je verrai :
Code : Console
B
B
(le premier des 2 B étant celui que j'ai tapé au clavier, et le second étant affiché par le printf)
Voici à peu près tout ce qu'il faut savoir sur le type char. Il cachait décidemment bien son jeu celui-là
Retenez bien :
Le type char permet de stocker des nombres allant de -128 à 127, unsigned char des nombres de 0 à 255.
Il y a une table que votre ordinateur utilise pour convertir les lettres en nombres et inversement.
On peut donc utiliser le type char pour stocker UNE lettre.
'A' est remplacé à la compilation par la valeur correspondante (65 en l'occurrence). On utilise donc les apostrophes pour obtenir la
valeur d'une lettre.
Les chaînes sont des tableaux de char !
Arf, j'ai tout dit dans le titre, qu'est-ce que je vais bien pouvoir raconter maintenant
Ben oui, tout y est : une chaîne de caractères n'est rien d'autre qu'un tableau de type char. Un bête tableau de rien du tout
Si on crée un tableau :
Code : C
char chaine[5];
... et qu'on met dans chaine[0] la lettre 'S', dans chaine[1] la lettre 'a', etc... On peut ainsi former une chaîne de caractères, c'est-à-dire
du texte
Voici un schéma de la façon dont ça pourrait être stocké en mémoire (attention je vous préviens de suite, c'est un peu plus compliqué
que ça en réalité, je vous explique après pourquoi) :
22
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 127 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
Comme on peut le voir, c'est un tableau qui prend 5 cases en mémoire pour représenter le mot "Salut". Pour la valeur, j'ai mis exprès les
lettres entre apostrophes, pour indiquer que c'est un nombre qui est stocké et non une lettre. En réalité, dans la mémoire ce sont bel et
bien les valeurs de ces lettres qui sont stockées
Oui mais attention
, une chaîne de caractères ne contient pas que des lettres ! Le schéma que vous voyez ci-dessus est en
fait incomplet.
Une chaîne de caractère doit impérativement contenir un caractère spécial à la fin de la chaîne, appelé "Caractère de fin de chaîne".
Ce caractère s'écrit '\0'.
Pourquoi devoir terminer une chaîne de caractères par un \0 ?
Tout simplement pour que votre ordinateur sache quand s'arrête la chaîne ! Le caractère \0 permet de dire : "Stop, c'est fini, y'a plus
rien à lire après circulez !"
Par conséquent, pour stocker le mot "Salut" (qui comprend 5 lettres) en mémoire, il ne faut pas un tableau de 5 char, il faut un
tableau de 6 char !
A chaque fois que vous créez une chaîne de caractères,
vous allez donc devoir penser à prévoir de la place pour le caractère de fin de
chaîne. Il faut toujours toujours toujours rajouter un bloc de plus dans le tableau pour stocker ce caractère \0, c'est impératif !
Oublier le caractère de fin \0, c'est une source d'erreurs impitoyable du langage C. Je le sais, j'en ai fait les frais et pas qu'une fois
En clair, le bon schéma de la chaîne de caractères "Salut" en mémoire est le suivant :
25
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 128 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
Comme vous le voyez, la chaîne prend 6 caractères et non pas 5, il va falloir s'y faire
La chaîne se termine par '\0', le caractère de fin de chaîne qui permet d'indiquer à l'ordinateur que la chaîne se termine là.
Voyez le caractère \0 comme un avantage. Grâce à lui, vous n'aurez pas à retenir la taille de votre tableau car il indique
que le tableau s'arrête là
Vous pourrez passer votre tableau de char à une fonction sans avoir à ajouter à côté une variable
indiquant la taille du tableau.
Cela n'est valable que pour les chaînes de caractères (c'est-à-dire le type char*, qu'on peut aussi écrire char[] ). Pour les autres
types de tableaux, vous êtes toujours obligés de retenir la taille du tableau quelque part.
Création et initialisation de la chaîne
Si on veut initialiser notre tableau chaine avec le texte "Salut", on peut utiliser la méthode old-school un peu bourrin :
Code : C
char chaine[6]; // Tableau de 6 char pour stocker S-a-l-u-t + le \0
chaine[0] = 'S';
chaine[1] = 'a';
chaine[2] = 'l';
chaine[3] = 'u';
chaine[4] = 't';
chaine[5] = '\0';
Cette méthode marche.
On peut le vérifier en faisant un printf.
Ah oui, j'allais oublier le printf : y'a encore un nouveau symbole à retenir
48
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 129 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
C'est le %s (s comme string, qui signifie "chaîne" en anglais).
Voici le code complet qui crée une chaîne "Salut" en mémoire et qui l'affiche :
Code : C
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char chaine[6]; // Tableau de 6 char pour stocker S-a-l-u-t + le \0
// Initialisation de la chaîne (on écrit les caractères 1 à 1 en mémoire)
chaine[0] = 'S';
chaine[1] = 'a';
chaine[2] = 'l';
chaine[3] = 'u';
chaine[4] = 't';
chaine[5] = '\0';
// Affichage de la chaîne grâce au %s du printf
printf("%s", chaine);
return 0;
}
Résultat :
Code : Console
Salut
Pfiou
Tout ça pour stocker "Salut" en mémoire et l'afficher quand même
C'est un peu fatigant et répétitif de devoir écrire les caractères un à un comme on l'a fait dans le tableau chaine.
Pour initialiser une chaîne, il existe heureusement une méthode plus simple :
Code : C
int main(int argc, char *argv[])
{
char chaine[] = "Salut"; // La taille du tableau chaine est automatiquement calculée
printf("%s", chaine);
return 0;
}
Code : Console
Salut
Comme vous le voyez à la première ligne, je crée une variable de type char[]. J'aurais pu écrire aussi char*, le résultat aurait été le
même.
En tapant entre guillemets la chaîne que vous voulez mettre dans votre tableau, le compilateur C calcule automatiquement la taille
nécessaire. C'est-à-dire qu'il compte les lettres et rajoute 1 pour placer le caractère \0. Il écrit ensuite une à une les lettres du mot
"Salut" en mémoire et rajoute l'\0 comme on l'a fait nous-mêmes manuellement quelques instants plus tôt.
Bref, c'est bien pratique
Défaut : ça ne marche que pour l'initialisation ! Vous ne pouvez pas écrire plus loin dans le code :
Code : C
chaine = "Salut";
47
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 130 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
Cette technique est donc à réserver à l'initialisation. Après cela, il faudra écrire les caractères manuellement un à un en mémoire
Récupération d'une chaîne via un scanf
Vous pouvez enregistrer une chaîne rentrée par l'utilisateur via un scanf, en utilisant là encore le symbole %s.
Seul problème : vous ne savez pas combien de caractères l'utilisateur va rentrer. Si vous lui demandez son prénom, il s'appelle peut-être
Luc (3 caractères), mais qui vous dit qu'il ne s'appelle pas Jean-Edouard (beaucoup plus de caractères) ?
Pour ça, il n'y a pas 36 solutions. Il va falloir créer un tableau de char très grand, suffisamment grand pour pouvoir stocker le prénom.
On va donc créer un char[100] pour stocker le prénom. Ca donne l'impression de gâcher de la mémoire, mais souvenez-vous encore une
fois que de la place en mémoire c'est pas ce qui manque (et y'a des programmes qui gâchent de la mémoire de manière bien pire que
ça, si vous saviez
)
Code : C
int main(int argc, char *argv[])
{
char prenom[100];
printf("Comment t'appelles-tu petit Zer0 ? ");
scanf("%s", prenom);
printf("Salut %s, je suis heureux de te rencontrer !", prenom);
return 0;
}
Code : Console
Comment t'appelles-tu petit Zer0 ? Mateo21
Salut Mateo21, je suis heureux de te rencontrer !
Voilà en gros comment ça se passe pour demander d'entrer du texte à l'utilisateur
Fonctions de manipulation des chaînes
Les chaînes de caractères sont, vous vous en doutez, fréquemment utilisées. Tous les mots, tous les textes que vous voyez à votre écran
sont en fait des tableaux de char en mémoire qui fonctionnent de la manière que je viens de vous expliquer (ah on ne voit plus son
ordinateur de la même façon du coup hein ?
)
Afin de nous aider un peu à manipuler les chaînes, on nous fournit dans la librairie string.h une pléthore de fonctions dédiées aux calculs
sur des chaînes.
Je ne peux pas vraiment toutes vous les présenter ici, ce serait un peu long et elles ne sont pas toutes forcément indispensables.
Je vais me contenter de vous parler des principales dont vous aurez très certainement besoin dans peu de temps, ce qui fait déjà pas
mal
Pensez à inclure string.h
Même si cela devrait vous paraître évident, je préfère vous le préciser encore au cas où : comme on va utiliser une nouvelle librairie
appelée string.h, vous devez l'inclure en haut des fichiers .c où vous en avez besoin :
Code : C
#include <string.h>
Si vous ne le faites pas, l'ordinateur ne connaîtra pas les fonctions que je vais vous présenter car il n'aura pas les prototypes, et la
compilation plantera.
Bref, n'oubliez pas d'inclure cette librairie à chaque fois que vous utilisez des fonctions de manipulation de chaînes
strlen : calculer la longueur d'une chaîne
strlen est une fonction qui calcule la longueur d'une chaîne de caractères (sans compter le caractère \0 ).
Documents you may be interested
Documents you may be interested