•Rappel sur les fonctions •Rappel sur la définition de ...
Transcript of •Rappel sur les fonctions •Rappel sur la définition de ...
•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