VARIABLES INDICÉES
(tableaux)
Variables
• Exemple
int i ;
•
Associe au nom « i » une « cellule » de la mémoire
•
Toute référence à « i » (du genre i = 1;) affecte cette « cellule mémoire »
• But des variables indicées
•
Associer à un nom, plusieurs cellules de la mémoire
•
La référence à ce nom permet de stocker plusieurs valeurs
Variables indicées (tableaux)
• Déclaration
•
Syntaxe de déclaration simple
• <type> <nom>[<nombre de cellules>];!
•
Exemple
• int t[10];!
• Déclare une variable indicée (un tableau) contenant des entiers (10 au maximum) qui est appelée « t »
• Représentation en mémoire
•
Les cellules sont contiguës en mémoire et sont référencées de 0 à (n-1) (pour n cellules)
• Manipulation
•
Toutes les opérations et manipulations possibles sur les variables classiques le sont également sur les cellules d ’ une variable indicée
•
Le référencement d ’ une cellule
! !int t [10];!
! !t [0] = 3;!
0 1 2 3 4 5 6 7 8 9 t
Variables indicées (tableaux)
• Exemple de manipulations
int t [10], j;!
t [ 0 ] = 3;!
j = 9;!
t [ 3 ] = j;!
t[ j ] = 3;!
t [ j-2 ] = j-1;!
…!
0 1 2 3 4 5 6 7 8 9
9 9 9 9 3
3 3 3 3
9 9 9
3 3 8
t t t t t t
j j j j j j
• Parcours d ’ un tableau
•
parcours total : boucle définie (« for »)
•
Exemple :
• Remplir de « 0 » un tableau de 10 éléments entiers
! !int t [10], i;!
! !for (i = 0; i<10; i++)!
{ !
t [ i ] = 0; !
! ! }!
Variables indicées (tableaux)
• Variante
•
Tableaux multi-dimensions
•
Déclaration d ’ un tableau à 2 dimensions
• Une grille ou une matrice
• int M[3][4];!
• Déclaration d’un tableau d’entiers représenté sur 3 lignes et 4 colonnes
0 1 2 3 0
1 2
3
M[1][2]=3
Variables indicées (tableaux)
• Tableaux multi-dimensions
•
Déclaration d ’ un tableau à 3 dimensions (cubique)
• Int M[3][4][5]; !
• Déclaration de trois « matrices » de 4 lignes sur 5 colonnes
• L’utilisation (et l’adressage) se fait de la même façon que décrit précédemment (avec 3 indices !!)
• Le nombre de dimensions est a priori illimité
•
Intuition générale : au delà de 3, il faut repenser l ’ algorithmique !!
Variables indicées (tableaux)
• Petits exercices …
•
Remplir une matrice « m » composée de 5 lignes sur 6 colonnes avec des 0.
•
Supposant que l ’ on dispose de la même matrice « m » contenant cette fois des valeurs entières totalement aléatoires et a priori
inconnues, afficher la valeur maximale et la valeur minimale
contenues dans m!
• Initialisation des variables indicées
•
Lors de la déclaration
• Syntaxe
• <type> <nom> [<nb_cellules>] = {k1, k2, k3 …, kn };!
• Exemple
int t [5] = {0, 5, -9, 8, 4};!
représente
Variables indicées (tableaux)
0! -5! -9! 8! 4!
t
0 1 2 3 4
Les chaînes de caractères
• L ’ affichage d ’ une chaîne de caractères
•
Rappel : printf(« bon jour »);!
• Ce sont des variables indicées !!!
•
Particularités
• Type « char » obligatoire
• La fin de la chaîne est toujours représentée par le caractère ‘\0’
• Exemple
• Pour la chaîne de caractères « bon jour »!
• Constituée de 8 caractères
• Il faut tenir compte du caractère « fin de chaîne »
Les chaînes de caractères
• « bon jour »!
•
La représentation en mémoire nécessitera au moins 9 cellules mémoire (il faut y inclure la fin de chaîne)
•
Déclaration
• char c[9] = « bon jour »;!
• Représentation
b! o! n! ‘ ’! j! o! u! r! \0!
Les chaînes de caractères
• La chaîne de caractères se manipule comme n’importe quelle autre variable indicée
•
Condition : respecter la règle du caractère de fin de chaîne
• Le format (pour printf et scanf) : « %s »!
•
Affichage
char c[9] = « bon jour »;!
"printf(«\n %s \n », c);"
•
Saisie
char c[9] = « bon jour »;!
scanf(«%s», c);"
• Remarque: Ne jamais mettre le « & » devant la chaîne de
caractères à saisir !!!
Les chaînes de caractères
• Exercices
•
Écrivez un programme qui compte le nombre de caractères contenus dans une chaîne de caractères d’au maximum 1000 caractères (les espaces compris) saisie au clavier.
•
Écrivez un programme qui permet de saisir une chaîne de
caractères d ’ au maximum 10 caractères. Affichez la chaîne saisie.
Inversez l’ordre des lettres. Affichez la chaîne modifiée.
Chaînes de caractères
• scanf et %s :
•
s ’ arrête aux espaces, tabulations et retours de ligne
char nom[32];!
printf(« Tapez votre nom : »);!
scanf (« %s », nom);!
printf(« Votre nom est %s », nom);!
• Tapez votre nom : Paul Dupont
• Votre nom est Paul
• Et si on tape plus de 31 caractères, que se passe-t-il ?
• Ca dépend
Chaînes de caractères
• bibliothèque string
# include <stdio.h>!
!# include <string.h>!
• strlen : longueur d ’ une chaîne de caractères
char animal[10]=« Chat »;!
int longueur ;!
longueur = strlen(animal);!
printf(« %s comporte %d caractères »,animal,longueur);!
• Chat comporte 4 caractères
Chaînes de caractères
• strcpy copie d ’ une chaîne de caractères dans un autre tableau
• Ne pas utiliser l ’ affectation = , qui copie les adresses des chaînes et non les chaînes
• 1er essai
char felin[10]=« chat »;!
! !char animal[4];!
! !strcpy(animal,felin);!
! !strcpy(animal, « tigre »); NON !!!
ATTENTION :
Aucun contrôle de débordement ! Il faut s’assurer que l’espace est
suffisant dans la chaîne cible !
Chaînes de caractères
• Solution :
char felin[10]=« chat »;
char animal[10];
strcpy(animal,felin);
strcpy(animal, « tigre »);
• Remarque : il existe une fonction strncpy( ), qui permet de copier au plus n caractères d ’ une chaîne dans une autre, et complète par des ‘ \0 ’ si la chaîne cible
comporte moins de n caractères. Copie plus sécurisée.
Chaînes de caractères
• strcmp compare deux chaînes de caractères entre elles (dans l ’ ordre lexicographique)
char s1[6] = “Chat”; char s2[6] = “Chien”;
if ( strcmp(s1, s2) < 0) { printf(“%s est avant %s dans le dictionnaire”, s1, s2); }
else
if ( strcmp(s1, s2) > 0) { printf(“%s est après %s dans le dictionnaire”, s1, s2); }
else { printf(“%s et %s sont identiques”, s1, s2); } !
!
• Attention : ne pas utiliser l ’ opérateur = =, qui compare les adresses et non les chaînes !
• Remarque : il existe une fonction strncmp( ) qui permet de
contrôler la longueur de la comparaison.
Chaînes de caractères
• strcat concatène deux chaînes de caractères
• char animal[10]=« chat »;
• strcat (animal, « on »);
• Attention aux dépassements de taille !!! Il existe une fonction strncat( ).
c h a t \0 ? ? ? ? ?
c h a t o n \0 ? ? ?
D'autres types ...
• Définition de nouveaux types (types synonymes)
• Le mot-clé typedef!
•
Localisé avant la déclaration des variables globales
• Syntaxe
•
typedef <type> <nouveau type>!
•
Exemple
typedef int entier ;!
entier i, j = 23 ;!
D'autres types ...
• Généralisation de la syntaxe
•
typedef <type> <nouveau type 1>, <nouveau type 2>, ...!
• Exemple
typedef unsigned char octet, byte, uchar;!
octet i, j = 'z'; ! /* octet, byte et uchar représentent */!
byte k = 13;! /* le même type de valeur ! */ ! uchar u = 255;!
D'autres types ...
• Les types composés
•
Mot clé : struct!
•
Permet la définition de types composés (dit « structures de données» ou “structures”)
•
Localisé dans la partie supérieure d'un programme C avec les déclaration de types
•
Syntaxe:
• struct <nom de structure> { /* les champs */ };!
D'autres types ...
• Exemple de déclaration de type composé
• Définition d'un type spécifique pour la mise en place d'un annuaire téléphonique
• Spécification du type
struct abonne!
{!
char nom[100];!
int age;!
char adresse[250];!
int numero_tel;!
};!
D'autres types ...
• Utilisation du type composé struct!
•
Déclaration d'une variable « my_variable » de type « struct abonne »
• struct abonne my_variable;!
•
Utilisation de « my_variable »
• Accés aux champs de la variable : opérateur d'accés «
.
»• Exemple
• Affecte 25 au champ « age » de la variable « my_variable »
• my_variable.age = 25;!
D'autres types ...
• Programme d'exemple: une fraction
struct fraction { int num; int den; };!
main ( ) {!
float result;!
struct fraction my_frac;!
printf(« fraction ? »);!
scanf(« %d %d », &my_frac.num, &my_frac.den);!
result = my_frac.num / my_frac.den;!
printf(« %.3f », result);!
}!
D'autres types ...
• Combiner struct et typedef
• Exemple
struct my_struct { /* les champs */ };"
typedef struct my_struct my_type;"
• Resultat
•
Possibilité de déclarer des variables du type
my_type my_variable; !
•
my_variable est alors de type composé
• Exemple
struct fraction { int num; int den; };!
typedef struct fraction frac ;!
D'autres types ...
• Autre syntaxe pour la définition de nouveaux types
! !typedef struct <nom du type struct>!
! ! {!
! ! /* les champs */ !
! !} <nouveau type 1>, <nouveau type2>, ... ;!
• Exemple
typedef struct my_struct { /* les champs */ } my_type ; !!
my_type my_variable; /* définition + déclaration */!
D'autres types ...
• Autre syntaxe pour la définition de nouveaux types
•
le nom du type struct n'est pas obligatoire
typedef struct { /* les champs */ } <nouveau type>, ... ;!
!
• Exemple
typedef struct {!
/* les champs */ !
} my_type1, my_type2;!
my_type1 my_variable1; /* définition + déclaration */!
my_type2 my_variable2; !
D'autres types ...
Type énuméré
!