• Aucun résultat trouvé

VARIABLES INDICÉES

N/A
N/A
Protected

Academic year: 2022

Partager "VARIABLES INDICÉES"

Copied!
30
0
0

Texte intégral

(1)

VARIABLES INDICÉES

(tableaux)

(2)

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

(3)

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 »

(4)

•  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

(5)

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

(6)

•  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; !

! ! }!

(7)

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 dun tableau dentiers représenté sur 3 lignes et 4 colonnes

0 1 2 3 0

1 2

3

M[1][2]=3

(8)

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 !!

(9)

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!

(10)

•  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

(11)

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 »

(12)

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!

(13)

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 !!!

(14)

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.

(15)

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

(16)

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

(17)

Chaînes de caractères

•  strcpy copie d ’ une chaîne de caractères dans un autre tableau

•  Ne pas utiliser laffectation = , 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 !

(18)

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.

(19)

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.

(20)

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 ? ? ?

(21)

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

(22)

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

(23)

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 */ };!

(24)

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

};!

(25)

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

(26)

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

}!

(27)

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

(28)

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 */!

(29)

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

(30)

D'autres types ...

Type énuméré

!

Un type énuméré en C consiste en l'énumération de tous les éléments d'un ensemble. En pratique, chacun de ces

éléments est représenté sous forme d'un entier.

enum fruit_t{ !

FRAISE,!

POMME, ! POIRE, ! ORANGE!

};!

Références

Documents relatifs

[r]

chaîne de caractères = suite d’octets Lecture fichier texte : lignes stockées dans une chaîne de caractères.. Lecture fichier binaire : données stockées dans une chaîne

chaîne de caractères = suite d’octets Lecture fichier texte : lignes stockées dans une chaîne de caractères.. Lecture fichier binaire : données stockées dans une chaîne

Lecture fichier binaire : données stockées dans une chaîne de caractères... 3.2 str : chaîne d’octets (pas

[r]

Dans la liste des périodes possibles, on trouve avec une période telle que abcde les périodes bcdea, cdeab, deabc, eabcd ; d’où 10 périodes multiples de 2439, compatibles avec 41

- Ecrire une fonction récursive qui calcule le PGCD de deux entiers positifs. On suppose qu’on ne peut effectuer que

Une pile est représentée par une structure regroupant un entier, pour le sommet, et un tableau de MAX_PILE éléments (ici, des caractères). II.1- En utilisant la