•rappel sur les fonctions •rappel sur la définition de
TRANSCRIPT
•Rappel sur les fonctions
•Rappel sur la définition de variables
•Les tableauxD fi i i Définition Utilisation Initialisation Nombre de valeurs significativesNombre de valeurs significativesPassage de paramètre par référence
•Définition de types Définition de types typedefApplication aux tableaux
TCH010-Informatique
•Tableaux multidimensionnels
Écrire une fonction qui calcule la distanceentre 2 points d’un plan étant donnéesleurs coordonnées x1,y1 et x2,y2.
Écrire une fonction qui calculel’hypothénuse d’un triangle rectangle étantdonnées les longueurs des deux autrescotés
TCH010-Informatique
cotés.
• Déclaration des variables• Types fondamentaux
// Programme de calcul de salaire en C#include <stdio.h>#include <stdlib.h>yp
Entier• short (8 bits) • int (16 bits)• long (32 bits)
int main(void) {
float taux;fl t b h ulong (32 bits)
Réel• float (16 bits)• double (32 bits) • long double(64 bits)
float nb_heure;float salaire;
printf(″\n\nEntrez le taux horaire svp : ″);scanf(″%f ″,&taux);• long double(64 bits)
Caractère• char (8 bits)• int (16 bits)
Booléens représentés par 0 et 1
printf(″\n\nEntrez le nombre d’heures : ″);scanf(″%f ″,&nb_heures);
salaire = taux * nb heures;Booléens représentés par 0 et 1 (faux/vrai) (1 bit)
• En C il n’y a pas de type booléen • int (16 bits) par exemple
T t t êt
salaire = taux * nb_heures;printf(″\n\nSalaire brut: %f ″,salaire);
return EXIT_SUCCESS; }
TCH010-Informatique
• Tous ces types peuvent être préfixés de unsigned (non-signés)
• On définit une variable en spécifiant le type et l’identificateur int prix=5;
• Forme générale de définition de variables:
prixtype id [= valeur];
• La définition de variable permet d’allouer un espace mémoire et de
prix
pl’initialiser:
Le type de la variable définit la taille de l’espace alloué
5L’identificateur définit le nom de l’espace mémoire La valeur définit la valeur initiale
U i bl f i f l
Int16 bits
TCH010-Informatique
• Une variable fait référence à une valeur en mémoire
Espace mémoire
• Une seule variable peut aussi faire référence à un ensemble de valeurs en mémoire
int prix[3]={1,8,5};mémoire
• On peut définir un tableau:
prixtype id[taille];type id[taille]={valeur,…,valeur};
• La définition du tableau permet
prix
pd’allouer des espaces mémoire contigus et de les initialiser:
Le type définit l’espace mémoire d’un 1 8 5
yp pélément du tableauLa taille définit le nombre d’éléments (ou de cases) du tableauLes valeurs servent à initialiser les éléments du tableau
int16 bits
int16 bits
int16 bits
TCH010-Informatique
éléments du tableau Espace mémoire
• Les cases ne sont pas initialisés par défaut int A[3]={1,8,5};
int B[3]={1 8};• Il est possible de mettre des valeurs
initiales dans le tableau au moment de sa définition
int B[3]={1,8};int C[3]={0};
• S’il n’y a pas assez de valeurs données pour remplir le tableau, les cases restantes seront mises à 0
A 1 8 5• Cette propriété peut être utilisée pour
initialiser toutes les cases à 0:
int tabInt[100] {0};1 8 0
1 8 5
Bint tabInt[100] = {0};
• Ces initialisations ne sont possibles qu’une seule fois à la définition du tableau
0 0 0C
TCH010-Informatique
tableau Espace mémoire
• Si la taille du tableau est omise, il faut remplir toutes les cases du tableau avec une initialisation
char alpha[]={‘S’,’a’,’l’,’u’,’t’};une initialisation
• La taille est calculée à partir du nombre de valeurs d’initialisation fournies
alpha
S a l u t0 1 2 3 4
char8 bits
TCH010-Informatique
Espace mémoire
• On accède aux différents éléments d’un tableau par un numéro qu’on appelle indice
int prix[3]prix[0]=1;appelle indice
• En C les indices commencent à 0
prix[0]=1;prix[1]=8;prix[2]=5;
prixprix
0 1 2
1 8 50 1 2
int16 bits
int16 bits
int16 bits
TCH010-Informatique
Espace mémoire
•On accède à une valeur à l’aide du char tabCar[]={‘a’,’l’,’l’,’o’,’!’};nom du tableau et le numéro decase entre crochets
•À quoi fait référence tabCar[3] ?
•Comment copier la dernière
tabCar[3]
valeur du tableau dans une autrevariable ?
C ffi h l ièa l l o !
•Comment afficher la premièrevaleur du tableau ?
•Comment afficher tout le contenu
char8 bits
TCH010-Informatique
•Comment afficher tout le contenudu tableau ?
Espace mémoire
• Attention. En C :
Les indices des tableaux commencent à 0
Les tableaux sont statiques: • La taille est invariable• Une fois définie, la taille ne peut pas être modifiéeUne fois définie, la taille ne peut pas être modifiée
L’accès à une case inexistante ne cause pas d’erreur de compilationp
Le compilateur ne prévient pas si l’on tente d’accéder à une case inexistante durant l’exécution
TCH010-Informatique
• Conséquences des tableaux statiques:
Quand le nombre d’éléments n’est pas connu à l’avance, la taille du tableau est fixée à une valeur maximale sécuritaire
Les tableaux crées sont souvent plus grands que nécessaireLes tableaux crées sont souvent plus grands que nécessaire
Certains éléments ne sont pas significatifs
double tab_notes[8] = {0};t b t [0] 94
94 48 0 76.5 0 0 0 0
tab_notes[0] = 94;tab_notes[1] = 48; tab_notes[2] = 0; tab notes[3] = 76.5;
TCH010-Informatique
non significatifs_ [ ] ;
• Un tableau statique vient souvent en paquet de deux:
Le tableauUne variable qui retient le nombre d’éléments significatifs
A t l ti• Autre solution
Mettre une valeur impossible pour les valeurs non-significatives.
double tab_notes[8] = {0};t b t [0] 94
94 48 0 76.5 -1 -1 -1 -1
tab_notes[0] = 94;tab_notes[1] = 48; tab_notes[2] = 0; tab notes[3] = 76.5;
TCH010-Informatique
non significatifs_ [ ] ;
• Si on modifie le contenu d’untableau dans une fonction, leparamètre effectif associé sera
#include <stdio.h>#include <stdlib.h>#define MAX 10paramètre effectif associé sera
affecté:
Les valeurs du tableau d’ i i difié
#define MAX 10
void incrementer_tableau(int tab[ ], int nb, int inc);void afficher_tableau(int tab[ ], int nb);
int main(void){d’origine sont modifiées
• On dit que les tableaux sontpassés par référence plutôt que
int main(void){int tablo[MAX]= {0};incrementer_tableau(tablo,MAX,3);afficher_tableau(tablo,MAX); return EXIT_SUCCESS;
}p p p qpar copie. }
void incrementer_tableau(int tab[ ], int nb, int inc){int i;for(i = 0; i < nb; i++)
t b[i] itab[i] += inc;}
void afficher_tableau(int tab[ ], int nb){int i;f ( )
TCH010-Informatique
for(i = 0; i < nb; i++)printf("%d ",tab[i]);
}
• En C un certains nombre de types fondamentaux sont définis par défaut
#include <stdio.h>#include <stdlib.h>
• Il est possible de définir des nouveaux types
// definition de typetypedef short petit_entier;typedef long grand_entier;
// prototypes• Le mot clef typedef permet de définir des types
• On définit les nouveaux types avant
// prototypesint calcul_pgcd(int a, int b);
// Programme principalint main(void) On définit les nouveaux types avant
la fonction main et les prototypes
• Les nouveaux types peuvent ensuite être utilisés comme les types
{petit_entier y; grand_entier x;
être utilisés comme les types fondamentaux pour définir des variables
…return EXIT_SUCCESS;
}
int calcul_pgcd(int a, int b){
TCH010-Informatique
…}
• Par exemple, on peut considérer un tableau comme un nouveau type
#include <stdio.h>#include <stdlib.h>
Catégorie de données• Suite de variables du même type,
consécutives en mémoire, accessibles par un indice (numéro)
#define MAX 18typedef int t_tab_entier[MAX];
p ( )Limite
• Nombre de variables consécutivesOpérations
• Accéder à une variable• Toutes les autres opérations sont des
fonctions du langage ou elles doivent être définies par le programmeur (comparer, copier, fouiller, ajouter, retirer, etc.)
TCH010-Informatique
• Par exemple, on peut considérer un tableau comme un nouveau type
#include <stdio.h>#include <stdlib.h>
• On utilise les nouveaux types comme les types fondamentaux :
on peut définir des variables de ce type
#define MAX 10typedef int t_tab_entier[MAX];
void afficher tab(t tab entier int nb); // prototypetypeLes paramètres d’une fonction peuvent être du nouveau type
• Certaines opérations n’ont plus de
void afficher_tab(t_tab_entier,int nb); // prototypeint main(void) {
t_tab_entier mon_tableau; afficher_tab(mon_tableau,MAX);Certaines opérations n ont plus de
sens ou ne sont pas définies pour les nouveaux types:
printf d’un tableau ?Addition de deux tableaux ?
…
mon_tableau
0 1 2 3 8 9 10ET/OU/XOR de deux tableaux ?
• Vous pouvez définir ces opérations vous-même en créant des sous- int
(16 bit )
0 1 2 3 … … 8 9 10
TCH010-Informatique
programmes manipulant les nouveaux types
Espace mémoire(16 bits)
• Il est possible de créer destableaux de tableaux:
#define MAXX 10#define MAXY 3t d f i t t t b ti [MAXX]
C’est l’équivalent d’un tableau à deux dimensions
typedef int t_tab_entier[MAXX];typedef t_tab_entier t_tab_entier2D[MAXY];
int main(void) {
• On peut étendre ce concept aunombre de dimensions voulues
{t_tab_entier mon_tableau; t_tab_entier2D mon_tableau_2D;…mon_tableau
0 1 2 3 … … 8 9 10
Espace mémoire
TCH010-Informatique
Espace mémoiremon_tableau_2D
• Les règles d’initialisation des tableaux multidimensionnels sont les mêmes que pour les tableaux à
#define MAXX 3#define MAXY 3t d f i t t t b ti [MAXX]les mêmes que pour les tableaux à
une seule dimension:
S’il n’y a pas assez de valeurs
typedef int t_tab_entier[MAXX];typedef t_tab_entier t_tab_entier2D[MAXY];
int main(void) {y p
pour remplir le tableau, les cases restantes seront mises à 0
Cette propriété peut être utilisée
{t_tab_entier2D mon_tableau_2D={{1,2,3},{1},{0}};…
p p ppour initialiser toutes les cases à 0
Ces initialisations sont possibles qu’une seule fois à la définition
1 2 3
1 0 0
1 2 3 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0qdu tableau
1 0 0
0 0 0
Espace mémoire
1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
TCH010-Informatique
Espace mémoiremon_tableau_2D
• Pour parcourir toutes les cases d’un tableau multidimensionnel, il faut autant de boucles imbriquées qu’il // éd d’ ffi h d t autant de boucles imbriquées qu il y a de dimensions:
1D → 1 boucle
// procédure d’affichage du contenu // d’un tableau 2Dvoid afficher_tab2D(t_tab_entier2D tab,
int nb_ligne,
2D → 2 boucles3D → 3 boucles...ND → n boucles
int nb_colonne) {int ligne;int col;
ND → n bouclesfor(ligne = 0; ligne < nb_ligne; ligne++){
for(col = 0; col < nb_colonne; col++){printf(« %d »,tab[ligne][col]);
}
1 2 3
1 0 0
}printf(« \n »);
}}
TCH010-Informatique
0 0 0