Présenté par Aurore ZEBINA, DEUG TI, juin 98
Une structure rassemble une ou plusieurs variables, qui peuvent être de types différents, que l'on regroupe sous un seul nom pour les manipuler facilement.
Les structures servent à organiser des données compliquées en particulier dans un long programme, parce qu'elles permettent de traiter un groupe de variables liées entre elles comme un tout et non comme des entités séparées.
Un exemple de structure traditionnel : un produit auquel on associe son nom et son prix.
struct produit { char nom[40]; float prix; }produit;
Un autre exemple est une fiche d'état civil .L'individu décrit un ensemble d'attributs tels son nom, adresse, date de naissance etc...
A leur tour certains attributs peuvent être des structures : l'adresse (numéro de rue, nom de rue, ville), la date de naissance (jour, mois, année).
Ce type de fiche est représenté dans l'exemple 2.
typedef struct adresse { int num; char nom[40]; char ville[20]; } adresse; typedef struct date { int j; int m; int an; } date; typedef struct fiche { char nom[40]; char prenom[40]; date persd; adresse persa; } fiche;
Si l'on considère que l'ensemble des fiches représente une classe de 20 individus, on créera un tableau de 20 structures de type fiche appelé classe.
fiche classe[20];
De même pour un stock de 100 produits
produit stock[100];
Les structures sont aussi de bons exemples pour le graphisme.
Créons quelques structures appropriées au graphisme.
L'objet est le point qui est représenté par ses coordonnées entières x et y.
struct point { int x; int y; }point;
struct point pt définit une variable de type point.
On peut aussi imbriquer les structures pour représenter des figures géométriques.
struct rect { struct point pt1; struct point pt2; }rect;
On peut également créer des fonctions qui fabriquent des points, des figures géométriques, calculent l'aire, la superficie d'une figure.
struct point fabpoint (int x,int y) { struct point pt; pt.x=x; pt.y=y; return pt; }
En exercice on pourra créer d'autres fonctions et structures pour réaliser des figures.
Nous pouvons aussi fabriquer un tableau de structures de type point ou figure qui comportera les coordonnées des points ou figures afin de réaliser une image.
Nous allons traiter un stock de produits. Avant de réaliser le tri nous avons besoin de saisir les informations et de pouvoir les afficher. Nous allons créer progressivement le programme.
L'exemple 5 réalise la saisie d'un tableau de structure de type produit appelé stock.
#include <stdio.h> #include <string.h> typedef struct produit { char nom[40]; float prix; }produit; void main(void) { int i,nb; produit stock[100]; printf("\n\n Combien de produits voulez entrer "); scanf("%d",&nb); for(i=0;i<nb;i++) { printf("Entrez le prix du produit \n"); scanf("%f",&stock[i].prix); printf("Entrez le nom du produit \n"); fflush(stdin); //notre version de Turbo C a besoin d'un fflush avant gets gets(stock[i].nom);n printf(" \n Le nom du produit %d :%s et le prix :%0.2f \n",i+1,stock[i].nom,stock[i].prix); } }
L'exemple 6, la saisie, le tri et l'affichage. Ce programme est composé de quatre fonctions : saisie, tri alphabétique des noms, tri numérique des prix (du moins cher au plus cher ), et la dernière, l'affichage.
#include <stdio.h> #include <string.h> #include <mem.h> typedef struct produit { char nom[40]; float prix; }produit; /* FONCTION DE SAISIE */ void saisie (produit liste[],int nbliste) { int fin,i; for(i=0;i<nbliste;i++) { printf("Veuillez entrer le nom du produit\n"); fflush(stdin); gets(liste[i].nom); printf("Veuillez entrer le prix du produit \n"); scanf("%f",&liste[i].prix); printf("Le %d produit :%s coute %0.2f \n",i+1,liste[i].nom,liste[i].prix); } } /* FONCTION DE TRI ALPHABETIQUE */ void trichaine(produit liste[],int taille) { int fin,i; for(fin=taille-1;fin>0;fin--) { int modifie=0; for(i=0;i<fin;i++) { if(strcmp(liste[i].nom,liste[i+1].nom)>0) { produit tmp; memcpy(&tmp,liste+i,sizeof(produit)); memcpy(liste+i,liste+(i+1),sizeof(produit)); memcpy(liste+(i+1),&tmp,sizeof(produit)); modifie=1; } } if(!modifie) break; } } /* FONCTION DE TRI NUMERIQUE produit du plus cher au moins cher */ void trinombre(produit liste[],int taille) { int fin,i; for (fin=taille-1;fin>0;fin--) { int modifie=0; for(i=0;i<fin;i++) { if(liste[i].prix>liste[i+1].prix) { produit tmp; memcpy(&tmp,liste+i,sizeof(produit)); memcpy(liste+i,liste+(i+1),sizeof(produit)); memcpy(liste+(i+1),&tmp,sizeof(produit)); modifie=1; } } if(!modifie) break; } } /* FONCTION D'AFFICHAGE */ void affiche(produit liste[],int taille) { int i; printf("LISTE DES PRODUITS TRIES\n\n"); for(i=0;i<taille;i++) printf("%s à %0.2f\n",liste[i].nom,liste[i].prix); } /* PROGRAMME PRINCIPAL */ void main(void) { produit stock[100]; /*tableau de 100 structures de type produits*/ int i,nb; printf("Combien d'articles voulez vous saisir ?"); scanf("%d",&nb); saisie(stock,nb); printf("\n TRI PAR NOM \n\n"); trichaine(stock,nb); affiche(stock,nb); printf("\n TRI PAR PRIX \n\n"); trinombre(stock,nb); affiche(stock,nb); }
#include <conio.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define nbre 20 typedef struct adresse { int num; char rue[40]; char ville[20]; }adresse; typedef struct date { char j[2]; char m[2]; char an[2]; }date; typedef struct fiche { char nom[15]; char prenom[15]; adresse persa; date persd; }fiche; void saisie (fiche liste[],int nbliste) { int i,j,m,a; for(i=0;i<nbliste;i++) { //clrscr(); printf("Veuillez entrer le nom \n"); fflush(stdin); gets(liste[i].nom); printf("Veuillez entrer le prenom \n"); fflush(stdin);gets(liste[i].prenom); printf("Veuillez entrer l'adresse \n"); printf(" \n Le numero de la rue ");scanf("%d",&liste[i].persa.num); printf("\n Le nom de la rue ");fflush(stdin);gets(liste[i].persa.rue); printf("\n Le nom de la ville");fflush(stdin);gets(liste[i].persa.ville); printf("Veuillez entrer votre date de naissance \n"); fflush(stdin);gets(liste[i].persd.j); while(strcspn(liste[i].persd.j,"0123456789")!=0) { printf("Erreur de saisie,rentrez une autre valeur\n"); gets(liste[i].persd.j); }j=atoi(liste[i].persd.j); while(j<1||j >31) { printf("Entrer le format correct\n"); fflush(stdin);gets(liste[i].persd.j); j=atoi(liste[i].persd.j); } gets(liste[i].persd.m); while(strcspn(liste[i].persd.m,"0123456789")!=0) { printf("Erreur de saisie,rentrez une autre valeur\n"); gets(liste[i].persd.m); } m=atoi(liste[i].persd.m); while(m<1||m >12) { printf("Entrer le format correct\n"); fflush(stdin); gets(liste[i].persd.m); m=atoi(liste[i].persd.m); } fflush(stdin); gets(liste[i].persd.an); a=atoi(liste[i].persd.an); while(strcspn(liste[i].persd.an,"0123456789")!=0) { printf("Erreur de saisie,rentrez une autre valeur\n"); gets(liste[i].persd.an); a=atoi(liste[i].persd.an); } printf("\n\n La fiche %d \nNOM :%s \nPRENOM :%s\nADRESSE :%d %s\n %s\n", i+1,liste[i].nom,liste[i].prenom,liste[i].persa.num, liste[i].persa.rue,liste[i].persa.ville); printf("DATE DE NAISSANCE %d/%d/%d\n",j,m,a); } } void triage(fiche liste[], int taille) { int fin,i; printf("TRI PAR AGE DU PLUS JEUNE AU PLUS AGE \n"); for(fin=taille-1;fin>0;fin--) { int modifie=0; for(i=0;i<fin;i++) { if(liste[i].persd.an>liste[i+1].nom) { fiche tmp; memcpy(&tmp,liste+i,sizeof(fiche)); memcpy(liste+i,liste+(i+1),sizeof(fiche)); memcpy(liste+(i+1),&tmp,sizeof(fiche)); modifie=1; } }if (!modifie) break; printf("%d\n",liste[i].nom); } } void affich(fiche liste[],int taille) { int i; for(i=0;i<taille;i++) { printf("\n\n La fiche %d \nNOM :%s \nPRENOM :%s\nADRESSE :%d %s\n %s\n", i+1,liste[i].nom,liste[i].prenom,liste[i].persa.num, liste[i].persa.rue,liste[i].persa.ville); printf("DATE DE NAISSANCE %c/%d\c/%c\n", liste[i].persd.j[0],liste[i].persd.m[0],liste[i].persd.an[0]); } } void main(void) { fiche classe[20]; saisie(classe,3); triage(classe,3); affich(classe,3); }