19
•Rappel sur les fonctions •Rappel sur la définition de variables •Les tableaux D fi i i Définition Utilisation Initialisation Nombre de valeurs significatives Nombre de valeurs significatives Passage de paramètre par référence Définition de types Définition de types typedef Application aux tableaux TCH010-Informatique •Tableaux multidimensionnels

•Rappel sur les fonctions •Rappel sur la définition de

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: •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

Page 2: •Rappel sur les fonctions •Rappel sur la définition de

É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.

Page 3: •Rappel sur les fonctions •Rappel sur la définition de

• 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)

Page 4: •Rappel sur les fonctions •Rappel sur la définition de

• 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

Page 5: •Rappel sur les fonctions •Rappel sur la définition de

• 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

Page 6: •Rappel sur les fonctions •Rappel sur la définition de

• 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

Page 7: •Rappel sur les fonctions •Rappel sur la définition de

• 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

Page 8: •Rappel sur les fonctions •Rappel sur la définition de

• 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

Page 9: •Rappel sur les fonctions •Rappel sur la définition de

•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

Page 10: •Rappel sur les fonctions •Rappel sur la définition de

• 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

Page 11: •Rappel sur les fonctions •Rappel sur la définition de

• 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_ [ ] ;

Page 12: •Rappel sur les fonctions •Rappel sur la définition de

• 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_ [ ] ;

Page 13: •Rappel sur les fonctions •Rappel sur la définition de

• 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]);

}

Page 14: •Rappel sur les fonctions •Rappel sur la définition de

• 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

…}

Page 15: •Rappel sur les fonctions •Rappel sur la définition de

• 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

Page 16: •Rappel sur les fonctions •Rappel sur la définition de

• 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)

Page 17: •Rappel sur les fonctions •Rappel sur la définition de

• 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

Page 18: •Rappel sur les fonctions •Rappel sur la définition de

• 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

Page 19: •Rappel sur les fonctions •Rappel sur la définition de

• 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