Université Louis Pasteur
LICENCE 1ère année
Mercredi 9 mai 2007
 
Travaux Dirigés
Algorithmique et Programmation
(sujet n°6)

Structures




Notions et points abordés :


Déclaration d'une structure

Syntaxe

Exemple

// Déclaration

struct
{
  type1 champ1;
  type2 champ2;
  ...
  typen champn;
} nom;

// Déclaration de 2 cases d'un échiquier. Une case est repérée par un couple (lettre,chiffre). Les lettres de A à H désignent les colonnes et les chiffres de 1 à 8 désignent les rangées

struct
{
  char colonne;
  int rangee;
} A1;

struct
{
  char colonne;
  int rangee;
} A2;

Affectation d'une structure (affectation de chaque champ de la structure)

Syntaxe

Exemple


nom.champ1 = valeur;

nom.champ2 = valeur;


// Affectation de chaque champ de la case A1

A1.colonne = 'A';

A1.rangee = 1;

A2.colonne = A1.colonne;

A2.rangee = A1.rangee+1;

Définition d'un nouveau type

Syntaxe

Exemple


typedef type nom;

// Définition du type des booléens

typedef int bool;

#define true  1
#define false 0

// Déclaration et affectation d'un booléen

bool b;

b = true;

// Définition du type case d'un échiquier

typedef struct
{
  char colonne;
  int rangee;
} Case;

// Déclaration et affectation de cases

Case B1;
Case X;

B1.colonne = 'B';
B1.rangee = 1;

X = B1;

Remarque : En C, un nouveau type peut être utilisé comme n'importe quel autre type de base.

Structure en argument ou en résultat d'une fonction

#include <stdio.h>

typedef struct
{
  char colonne;
  int rangee;
} Case;


void afficher_case( Case c ) // Afficher une case à l'écran
{
  printf("%c%d",c.colonne,c.rangee);
}

Case lire_case() // Lecture d'une case au clavier
{
  Case r;
  scanf("%c%d",&r.colonne,&r.rangee);
  return r;
}

int main()
{
  Case c;

  printf("Entrer une case : ");
  c = lire_case();
  printf("La case est : ");
  afficher_case(c);
  printf("\n");

  return 0;
}


On peut aussi combiner pointeurs et structures :

Syntaxe

Exemple


type *nom;







nom->champ est un raccourci
pour (*nom).champ

// Déclaration d'un pointeur sur une case

Case *p;

// allocation d'une zone mémoire pour 1 case

p = malloc(sizeof(Case));

// Affectation de la structure pointée par p

(*p).colonne = 'C';
(*p).rangee = 4;

// ou de façon plus concise :

p->colonne = 'C';
p->rangee = 4;

Syntaxe

Exemple


typedef struct

   ...
   type *champ;
   ...
} nom;




// Déclaration d'un type ensemble de nombres réels
// les réels sont stockés dans un tableau dynamique

typedef struct
{
  int card; // cardinal de l'ensemble
  float *contenu; // un tableau à card éléments
} ensemble;

// Déclaration d'un ensemble E

ensemble E;

// Affectation à E de l'ensemble vide { }

E.contenu = NULL;
E.card = 0;

// Affectation à E de l'ensemble { 3.14 }

E.contenu = malloc(sizeof(float));
*(E.contenu) = 3.14; // ou E.contenu[0] = 3.14;
E.card = 1;



Exercices


Nombres complexes

    Définir un type complexe pour représenter les nombres complexes. On utilisera une structure à deux champs pour la partie réelle et la partie imaginaire d'un nombre complexe.

            complexe cons_complexe( float r, float i )             void affiche_complexe( complexe c )


Polynômes à coefficients réels

    Définir un type polynome pour représenter les polynomes de degré n à coefficients réels. On utilisera une structure à deux champs :  un entier degre égal à n et un tableau dynamique coef de n+1 réels contenant les coefficients du polynôme.

            polynome cons_polynome( int n )             void affiche_polynome( polynome p )

Polynômes à coefficients complexes

    Définir un type polynome_complexe pour représenter les polynômes de degré n à coefficients complexes. Mêmes questions que pour les polynômes à coefficients réels.