Cours 5

Transcription

Cours 5
Étape 5
Tableaux
En C, il est possible d’allouer un tableau d’éléments. Si lors de la déclaration,
le nom d’une variable est suivi de l’opérateur d’indexation [], alors la variable
est un tableau. Le nombre d’éléments composant le tableau doit être spécifié,
ou déductible, au moment de la déclaration.
int chiffres[10];
déclare un tableau de 10 entiers.
Tout comme lors d’une déclaration d’une variable, on ne sait pas ce qu’il y a
dans le tableau a priori.
int chiffres[]={6, 7, 2, 4, 8, 4, 3, 2, 1, 0};
déclare un tableau de 10 éléments de type entier et initialise chacun d’eux. Le
nombre d’éléments du tableau est déclaré implicitement par l’initialisation.
int chiffres[10]={0, 1};
déclare un tableau de 10 éléments de type entier et initialise les deux premiers
éléments.
Il est possible d’accéder à chaque élément du tableau en spécifiant son indice. Les
indices du tableau commencent à 0 et se terminent au “nombre d’éléments du tableau - 1”. Ainsi chiffres[0] est le premier élément du tableau et chiffres[9]
est le dernier élément du tableau chiffre.
En mémoire lors d’une allocation de tableau d’éléments, ces derniers sont stockés
dans des espaces mémoire consécutifs.
Il y a donc une relation étroite entre la notion de pointeurs et les tableaux.
Les opérations réalisées sur les tableaux peuvent également être effectuées en
utilisant des pointeurs.
1
2
ÉTAPE 5. TABLEAUX
int main(void){
int a[]={6,7,2,4,8,4,3,2,1,0};
int *pa;
pa = &a[0];
printf("%d, %p %d\n", a[0], pa, *pa);
pa++;
printf("%d, %p %d\n", a[0], pa, *pa);
}
Notez que &a[0] est équivalent à a (le tableau est le pointeur vers son premier
élément). Dans le code précédent, on aurait donc pu écrire :
pa = a;
Lors du passage de paramètre dans une fonction, c’est l’adresse d’un élément
dans le tableau qui est transmise. En général, il s’agit de l’adresse de l’élément
ayant l’indice 0, rien n’interdit de transmettre l’adresse de tout autre élément.
int indicemax(int *t, int n){
int max = t[0];
int i, indice = 0;
for (i=0; i<n; i++){
if (max < t[i]){
indice = i;
max = t[i];
}
}
return indice;
}
int main(void){
int a[]={6,7,2,4,8,4,3,2,1,0};
printf("%d\n", indicemax(a,10));
printf("%d\n", indicemax(a,3));
printf("%d\n", indicemax(&a[7],3)+7);
}
Dans le cas de tableaux de caractères, lors de son initialisation, le caractère \0
est inséré en fin de chaîne.
3
int strlen(char *s){
int n;
for (n=0; *s!=’\0’;s++) n++;
return n;
}
int main(void){
char chaine[]={"Bonjour"};
printf("%d\n", strlen(chaine));
printf("%d\n", strlen(&chaine[3]));
}
Compter le nombre d’élément dans une chaîne de caractère peut aussi être
calculé en faisant la différence entre l’adresse du premier élément du tableau et
l’adresse du dernier.
int strlen(char *s){
char *p = s;
while(*p != ’\0’) p++;
return p−s;
}
int main(void){
char chaine[]={"Bonjour"};
printf("%d\n", strlen(chaine));
printf("%d\n", strlen(&chaine[3]));
}
Il est également possible d’allouer des tableaux à deux dimensions :
int tab[10][4];
déclare un tableau de 10 éléments où chaque élément est un tableau de 4 entiers.
Lorsque la fonction main est appelée, elle est appelée avec deux argurments.
Le premier, par convention appellé argc (pour argument count) est le nombre
d’arguments figurant sur la ligne de commande lorsque le programme est appelé.
Le second, par convention appellé argv (pour argument vector) est un pointeur
sur un tableau de chaîne de caractères qui contient les arguments (un par chaîne
de caractère).
4
ÉTAPE 5. TABLEAUX
int atoi(char *s){
int i, n;
for(i=0, n=0; s[i]>=’0’ && s[i]<=’9’; i++){
n = 10 * n + (s[i] − ’0’);
}
return n;
}
int main(int argc, char **argv){
int i;
for(i=0; i<argc; i++){
printf("%d\n", atoi(argv[i]));
}
}
5.1
Exercices
Écrire un programme qui renverse une chaîne de caractère.
Écrire un programme qui renvoie 1 si deux tableaux d’entiers sont identiques et
0 sinon.
Écrire un programme qui renvoie la valeur minimale d’un tableau d’entier.
Écrire un programme qui effectue un tri par sélection :
On recherche le plus petit élément et on l’échange avec l’élément 0 du tableau ;
On reitère ce processus en considérant le tableau qui commence à la case suivante du tableau. Arrivé à la dernière case du tableau, le tableau est trié.