Les tableaux -Langage c

34
Algorithme et programmation 2 Cours préparé par : Pr. Yassine Belahmar A. U : 2014-2015

Transcript of Les tableaux -Langage c

Algorithme et programmation 2

Cours préparé par :

Pr. Yassine Belahmar

A. U : 2014-2015

Chap 4 : Les tableaux

I- IntroductionSupposons qu’on a une grande liste d’éléments à manipuler,dans ce cas il est plus commode de les caser dans un tableaudont le nombre de case est égale au nombre d’éléments qu’onveut manipuler. Ces éléments sont tous de même types.

II- Les tableaux statiquesII-1 Les tableaux statiques à un seul indice

Pour les tableaux statiques, la taille N c’est à dire lenombre de cases est fixée une fois pour toute au début duprogramme. La numérotation des éléments commence à partir de0 et se termine à un indice égal à N-1. Le i ème élémentoccupe donc la case (i-1) du tableau. L’indice estobligatoirement un entier. Exemple : int T[20] ; pour déclarer un tableau de 20entiers. Double V[10] ; pour déclarer un tableau de10 réels.Syntax algorithmique de déclaration d’un tableau : type nom_du_tableau[taille]

Exemple1

entier T[10] pour déclarer un tableau de 10 entiers.reel V[20] ; pour déclarer un tableau de 20 réelsAutre façon de déclarer Tconstante N=10 entier T[N]Exemple2-1Ecrire un algorithme qui lit et affiche un tableau d’entiers

// algorithme qui lit et affiche un tableau d’entiers//déclarationentier T[10]I :entier//préparation du traitementPour(I allant de 0 jusqu’à 9 par pas de 1)

{ecris(‘’donner l’elmt ‘’,I)Lis T[I]}//traitement et affichageEcris(‘’voici votre tableau ‘’)Pour(I allant de 0 jusqu’à 9 par pas de 1)Ecris(T[I])Ecris(‘’FIN’’)

Exemple2-2Ecrire un algorithme qui lit et affiche un tableau d’entiers de dimension N avec ladimension déclarée comme constante.

// algorithme qui lit et affiche un tableau d’entiers//déclarationConstante N=10entier T[N]I :entier//préparation du traitementPour(I allant de 0 jusqu’à N-1 par pas de 1){ecris(‘’donner l’elmt ‘’,I)Lis T[I]}//traitement et affichageEcris(‘’voici votre tableau ‘’)Pour(I allant de 0 jusqu’à N-1 par pas de 1)Ecris(T[I])Ecris(‘’FIN’’)

Syntax en C de déclaration d’un tableau :Type nom[taille] ;

Exemple3

Float V[50] ;Ou bienConst int N=50 ;Float V[N] ;

Exemple4Ecrire un programme qui lit et affiche un tableau d’entiers de dimension N avec ladimension déclarée comme constante.// programme qui lit et affiche un tableau d'entiers//déclaration#include<stdlib.h>

#include<stdio.h>int main(){const int N=4;int T[N];int I; //préparation du traitementfor(I=0; I<N;I++){printf("donner l'elmt %d\n",I);scanf("%d",&T[I]);}//traitement et affichageprintf("voici votre tableau\n");for(I=0; I<N;I++)printf("%d |",T[I]);printf("\n");printf("FIN \n");system("PAUSE");return 0;}

Recherche dans un tableau un seul indice

Exemple5 : trouver le plus petit élément et sa position

Syntax algorithmique : entier I,pospp,ppContante entier N=10Pospp=0Pp=T[0]Pour I allant de 0 jusqu’à N-1 par pas de 1 fait

{si(T[I]<PP{ pp=T[I]Pospp=I}}

Exemple6Ecrire un programme qui lit he un tableau d’entiers de dimension N avec ladimension déclarée comme variable<=20 et >0. Puis trouver le plus petit élémentde ce tableau et sa position ainsi que le plus grand élément et sa position.// Exemple6

#include<stdlib.h>#include<stdio.h>int main(){//déclarationint T[20];int I,POSPG,PG,PP,POSPP,N; //préparation du traitementdo{printf("donner votre dimension 0<N<20 \n");scanf("%d",&N);}while((N<=0)||(N>=20));for(I=0; I<N;I++){printf("donner l'elmt %d\n",I);scanf("%d",&T[I]);}// affichage du tableau Tprintf("voici votre tableau\n");for(I=0; I<N;I++)printf("%d |",T[I]);printf("\n");// traitementPOSPG=0;PG=T[0] ;POSPP=0;PP=T[0] ;for(I=1; I<N;I++){if(T[I]>PG){PG=T[I];POSPG=I;}if(T[I]<PP){PP=T[I];POSPP=I;}}

printf("PP=%d et POSPP=%d \n",PP,POSPP);printf("PG=%d et POSPG=%d \n",PG,POSPG);printf("FIN \n");system("PAUSE");return 0;}

Exécution

donner votre dimension 0<N<204donner l'elmt 01

donner l'elmt 16donner l'elmt 2-1donner l'elmt 33voici votre tableau1 |6 |-1 |3 |PP=-1 et POSPP=2PG=6 et POSPG=1FINAppuyez sur une touche pour continuer...

Exemple7Ecrire un programme qui lit he un tableau d’entiers de dimension N avec ladimension déclarée comme variable<=20 et >0. Puis trouver le nombred’éléments nul du tableau.

/* Exemple7 programme qui calcule le nombre d'éléments nuls dans un tableaud'entiers à un seul indice */#include<stdlib.h>#include<stdio.h>int main(){//déclarationint T[20];int I,C,N; //préparation du traitementdo{printf("donner votre dimension 0<N<20 \n");scanf("%d",&N);}while((N<=0)||(N>=20));for(I=0; I<N;I++){printf("donner l'elmt %d\n",I);scanf("%d",&T[I]);}//initialisation du compteur CC=0;for(I=0; I<N;I++)if(T[I]==0)C=C+1;

// affichage du tableau Tprintf("voici votre tableau\n");for(I=0; I<N;I++)printf("%d |",T[I]);printf("\n");printf("le nombre d elements nuls de votre tableau est egal a %d \n",C);printf("FIN \n");system("PAUSE");return 0;}Exécutiondonner votre dimension 0<N<204donner l'elmt 00donner l'elmt 11donner l'elmt 20donner l'elmt 32voici votre tableau0 |1 |0 |2 |le nombre d elements nuls de votre tableau est egal a 2FINAppuyez sur une touche pour continuer...

Tri des éléments d’un tableau à un seul indice

Ici nous ne présentons qu’un cas simple d’algorithme de tri

dont le principe est le suivant :

Supposons que l’on veut classer par ordre croissant N variables

casées dans un tableau. On commence par supposer que la

première variable est celle qui est la plus petite et on la

compare aux N-1 autres variables. Si cela est toujours vrai, la

première variable dans l’ancienne numérotation garde sa place,

sinon on échange la place de cette variable avec la première

petite trouvée et ainsi de suite jusqu’à ce que la première

case soit occupée effectivement par la variable minimale,

ensuite on fait pareil avec la deuxième variable, sans toucher

à la première et ainsi de suite sans toucher aux variables déjà

triées . L’algorithme se présente de la manière suivante :

Syntax algorithmique : entier I,ECHContante entier N=10

Pour I allant de 0 jusqu’à N-2 par pas de 1 faitPour J allant de J+1 jusqu’à N-1 par pas de 1 fait

{si(T[I]> T[J]{ ECH=T[I]T[I]=T[J]T[J]=ECH}}

for (I = 0 ;I<N-1 ; I++)

for (J = I+1; J<N ; J++)

if (B[I]> B[J])

{

Valint= B[I]; B[I]= B[J]; B[J] = valint ;}

Exemple8Ecrire un programme qui lit un tableau d’entiers de dimension N avec la dimension

déclarée comme variable<=20 et >0. Puis classer ce tableau par ordre décroissant.

/* Exemple8 programme qui classe les éléments d'un tableau d'entiers

à un seul indice par ordre décroissant *///déclaration#include<stdlib.h>#include<stdio.h>int main(){int T[20];int I,J,N,ECH; //préparation du traitementdo{printf("donner votre dimension 0<N<20 \n");scanf("%d",&N);}while((N<=0)||(N>=20));for(I=0; I<N;I++){printf("donner l'elmt %d\n",I);scanf("%d",&T[I]);}// affichage du tableau T avant le triprintf("voici le tableau que vous avez saisie\n");for(I=0; I<N;I++)printf("%d |",T[I]);printf("\n");// Trifor(I=0; I<N-1;I++)for(J=I+1; J<N;J++)if(T[I]<T[J]){ECH=T[I];T[I]=T[J];T[J]=ECH;}// affichage du tableau T aprés le triprintf("voici le tableau apres le tri\n");for(I=0; I<N;I++)printf("%d |",T[I]);printf("\n");printf("FIN \n");system("PAUSE");return 0;

}

Exécution

donner votre dimension 0<N<204donner l'elmt 00donner l'elmt 1-4donner l'elmt 212donner l'elmt 33voici le tableau que vous avez saisie0 |-4 |12 |3 |voici le tableau apres le tri12 |3 |0 |-4 |FINAppuyez sur une touche pour continuer...

Suppression et tassement

On veut dans un tableau supprimer certains éléments et décaler

vers la gauche d’autres éléments du tableau à leur place. Dans

les cases vides, on mettra des zéro.

Exemple9 Ecrire un programme qui lis un tableau à N éléments

entiers et qui met tous les zéro présents dans le tableaux à

la fin et décale les autres éléments non nuls à gauche

Exemple

On donne

2 4 0 0 10 0 3 5 6 12

Et on veut arriver au tableau suivant :

2 4 10 3 5 6 12 0 0 0

/* on lit et on affiche un tableau d'entiersdans lequel on fait la suppresion et le tassement */#include <iostream>#include <cmath>using namespace std;int main(){

const int N=10; int c,I,J=0;

int B[N];

for (I=0;I<N;I++){cout<<"donner votre element "<<I<<endl;cin>>B[I];}cout<<"donner l entier que vous voulez supprimer "<<endl;cin>>c;for (I=0;I<N;I++) if(B[I]!=c) {B[J]=B[I];J++;} for (I=J;I<N;I++) B[I]=0;cout<<"apres suppresion de tous les "<<c<<" et tassement votre nouveau

tableau est :"<<endl;for (I=0;I<N;I++) cout<<B[I]<<" | ";cout<<endl;cout<< " FIN "<<endl;

system("PAUSE");return 0;}

Exécutiondonner votre element 02donner votre element 14donner votre element 20donner votre element 30donner votre element 410donner votre element 50donner votre element 6

3donner votre element 75donner votre element 86donner votre element 912donner l entier que vous voulez supprimer0apres suppresion de tous les 0 et tassement votre nouveau tableau est :2 | 4 | 10 | 3 | 5 | 6 | 12 | 0 | 0 | 0 | FINAppuyez sur une touche pour continuer...

Attention : L’initialisation de J est obligatoire.

Permutation dans un tableau

On veut dans un tableau effectuer une certaine permutation sur

les éléments occupant chacun une case du tableau. L’algorithme

de base est celui appris dans la première partie Algo et prog1

mais avec laquelle il faut introduire une boucle pour effectuer

toutes les permutations demandées dans le tableau.

Exemple10 Ecrire un programme qui lit un tableau à N éléments

réels et qui effectue la permutation de droite à gauche

suivante sur les éléments du tableau.

Exemple

On donne

1 2 3 4 5 6

Et on veut arriver au tableau suivant :

2 3 4 5 6 1

// programme qui lit, affiche et fait la permutation de droite vers la

//gauche dans un tableau d'entiers

//déclaration

#include<stdlib.h>

#include<stdio.h>

int main()

{

const int N=6;

int T[N];

int I,ECH;

//préparation du traitement

for(I=0; I<N;I++)

{printf("donner l'elmt %d\n",I);

scanf("%d",&T[I]);

}

//traitement et affichage

printf("voici votre tableau que vous avez saisie\n");

for(I=0; I<N;I++)

printf("%d |",T[I]);

printf("\n");

//Permutation

ECH=T[0];

for(I=0; I<N-1;I++)

T[I]=T[I+1];

T[N-1]=ECH;

//affichage du tableau aprés permutation

printf("voici votre tableau apres permutation\n");

for(I=0; I<N;I++)

printf("%d |",T[I]);

printf("\n");

printf("FIN \n");

system("PAUSE");

return 0;

}

Exemple11 Ecrire un programme qui lit un tableau à N éléments

réels avec N pair et qui effectue la permutation dont un

exemple est donné ci-dessus.

Exemple

On donne

1 2 3 4 5 6

Et on veut arriver au tableau suivant :

2 1 4 3 6 5

// programme qui lit, affiche et fait la permutation

//deux à deux des éléments dans un tableau d'entiers

//déclaration

#include<stdlib.h>

#include<stdio.h>

int main()

{

int T[20];

int I,ECH,N;

//préparation du traitement

//lecture de la vrais dimension

do

{printf("donner votre dimension N \n");

scanf("%d",&N);

}while((N<=0)||(N>20)||(N%2!=0));

for(I=0; I<N;I++)

{printf("donner l'elmt %d\n",I);

scanf("%d",&T[I]);

}

// affichage avant traitement

printf("voici votre tableau que vous avez saisie\n");

for(I=0; I<N;I++)

printf("%d |",T[I]);

printf("\n");

//Permutation

for(I=0; I<N;I=I+2)

{ECH=T[I];

T[I]=T[I+1];

T[I+1]=ECH;}

//affichage du tableau aprés permutation

printf("voici votre tableau apres permutation\n");

for(I=0; I<N;I++)

printf("%d |",T[I]);

printf("\n");

printf("FIN \n");

system("PAUSE");

return 0;

}

II-2 Les tableaux statiques à deux indices

Pour Ces tableaux statiques à deux indices, le nombre delignes NL et le nombre de colonnes NC sont fixés une foispour toute au début du programme. La numérotation deséléments commence à partir de (0,0) et se termine à unindice égal à (NL-1,NC-1).

Syntax algorithmique de déclaration d’un tableau à deuxindices : type nom_du_tableau[NL][NC]

Exemple : int A[5] [6]; pour déclarer une matrice à 5 ligneset 6 colonnes dont les éléments sont des entiers.

Exemple12

Ecrire un programme qui lit et affiche une matrice A(NL,NC)avec NL et NCdéclarés comme constante. NL=3 et NC=4// programme qui lit, affiche une matrice//déclaration#include<stdlib.h>#include<stdio.h>int main(){const int NL=3,NC=4;int A[NL][NC];int I,J; //préparation du traitement

for(I=0; I<NL;I++)for(J=0; J<NC;J++){printf("donner l'elmt %d%d\n",I,J);scanf("%d",&A[I][J]);}// affichage de la matrice Aprintf("voici votre tableau que vous avez saisie\n");for(I=0; I<NL;I++){for(J=0; J<NC;J++)printf("%d ",A[I][J]);printf("\n");}

printf("FIN \n");system("PAUSE");return 0;}Exemple13

Ecrire un programme qui lit une matrice A(NL,NC)et qui met à zéro les élémentsdes deux diagonales.// programme qui lit, affiche une matrice en//annulant ses deux diagonales

#include<stdlib.h>#include<stdio.h>int main(){const int NL=3,NC=3;int A[NL][NC];int I,J; //préparation du traitement

for(I=0; I<NL;I++)for(J=0; J<NC;J++){printf("donner l'elmt %d%d\n",I,J);scanf("%d",&A[I][J]);}for(I=0; I<NL;I++)for(J=0; J<NC;J++)if((I==J)||(I==NC-1-J))A[I][J]=0;

// affichage de la matrice Aprintf("voici votre tableau que vous avez saisie\n");for(I=0; I<NL;I++){for(J=0; J<NC;J++)printf("%d ",A[I][J]);printf("\n");}

printf("FIN \n");system("PAUSE");return 0;}Exemple14

Ecrire un algorithme qui lit deux matrices carrées A(N,N)et B(N,N) et calcule leurproduit, soit C=A*B./ programme qui fait le produit de deux matrices carées//déclaration#include<stdlib.h>#include<stdio.h>int main(){const int N=2;

int A[N][N], B[N][N], C[N][N];int I,J,K; //préparation du traitement

for(I=0; I<N;I++)for(J=0; J<N;J++){printf("donner l'elmt %d%d\n",I,J);scanf("%d",&A[I][J]);}for(I=0; I<N;I++)for(J=0; J<N;J++){printf("donner l'elmt %d%d\n",I,J);scanf("%d",&B[I][J]);}//initialisation de la matrice Cfor(I=0; I<N;I++)for(J=0; J<N;J++)C[I][J]=0;//calcul de Cfor(I=0; I<N;I++)for(J=0; J<N;J++)for(K=0; K<N;K++)C[I][J]=C[I][J]+A[I][K]*B[K][J];

// affichage de la matrice C=A*Bprintf("voici votre tableau C\n");for(I=0; I<N;I++){for(J=0; J<N;J++)printf("%d ",C[I][J]);printf("\n");}

printf("FIN \n");system("PAUSE");return 0;}III- Les tableaux dynamiquesIII-1 Les tableaux dynamiques à un seul indice

Ce sont des tableaux dont le nombre de cases peut varier au

cours de l’exécution du programme. Ils permettent d’ajuster la

taille du tableau au besoin du programmeur. Pour manipuler ces

tableaux, on utilise la notion de pointeur.

Avec ce genre de tableau nous allons allouer dynamiquement de la mémoire. L'allocation dynamique permet de créer un tableau Tdont la taille est déterminée par une variable N au moment de l'exécution.

Après la déclaration d’un pointeur T qui pointe sur une variable de type (typedeselements) et la lecture de N. La syntaxe de cette allocation est effectuée de la manière suivante :  malloc(N * sizeof(typedeselements)).

Dès qu’on n’a plus besoin de ce tableau, il faut libérer la mémoire qui lui a été allouée et la syntaxe est la suivante : free(T) 

ExempleUtiliser la notion de tableau dynamique pour écrire un programme qui lit etaffiche un tableau d’entiers

// Programme qui lit et affiche un tableau d’entiers#include<stdlib.h>#include<stdio.h>int main(){int N, I ; int* T=NULL ; // Ce pointeur va servir de tableau après l'appel du mallocdo{ printf("donner le nombre d elements N de votre tableau T\n");scanf("%d",&N) ;}while(N<=0) ; T = malloc(N * sizeof(int)); // On alloue de la mémoire pour le tableau

// Lecture du tableau T for (I = 0 ; I < N ; I++) { printf("donner l element %d ? ", I ); scanf("%d", &T[I]); }

// affichage du tableau T printf("\n\nVoici votre tableau T :\n"); for (I = 0 ; I < N ; I++) {

printf("%d | ", T[I]); }

// On libère la mémoire allouée avec malloc, on n'en a plus besoin free(T); system("PAUSE");

return 0;}

III-2 Les tableaux dynamiques à deux indices

Il y a plusieurs façons de créer un tableau dynamique A à deux

dimensions de type (type) (par exemple int). La plus courante

consiste à créer un tableau de NL lignes contenant les adresses

des NL tableaux de NC colonnes. L'avantage de cette méthode est

qu'elle permet un usage habituel du tableau avec la notation

[i][j].

Syntaxe :

int** A;

A=(int**)malloc(NL*sizeof(int*));for (i=0;i<NL;i++) {A[i]=(int*)malloc(NC*sizeof(int));}

Bien sûr, pour une utilisation correcte, il faut en plus tenir compte du fait que malloc() peut échouer et qu'il faut libérer les blocs alloués après usage.

Il va sans dire qu'il faut ensuite libérer le tableau alloué selon le procédé inverse :

for (i = 0; i < NL; i++)

{

free(A[i]), A[i] = NULL;

}

free(A), A = NULL;

ExempleUtiliser la notion de tableau dynamique pour écrire un programme qui lit etaffiche une matrice dont les éléments sont des entiers.

// Programme qui lit et affiche un tableau à 2 indices #include<stdlib.h>#include<stdio.h>int main(){int NL,NC, i,j ;do{ printf("donner NL et NC\n");scanf("%d%d",&NL,&NC) ;}while((NL<=0)||(NC<=0)) ; int** A=(int**)malloc(NL*sizeof(int*));for (i=0;i<NL;i++) {A[i]=(int*)malloc(NC*sizeof(int));}//lecture du tableaufor(i=0; i<NL;i++)for(j=0;j<NC;j++){printf("donner l'elmt %d%d\n",i,j);scanf("%d",&A[i][j]);}//traitement et affichageprintf("voici votre tableau\n");for(i=0; i<NL;i++){for(j=0;j<NC;j++)printf("%d ",A[i][j]);printf("\n");} for (i = 0; i < NL; i++) { free(A[i]), A[i] = NULL; } free(A), A = NULL;printf("FIN \n");system("PAUSE");return 0;

}

IV- Les structuresDans cette partie, nous allons apprendre à manipuler un nouveau

type appelée structures.

Définition : Le type struct (abréviation de structure) permet

de regrouper dans une même entité plusieurs variables. Ces

variables peuvent être de types différents.

Exemple1 : on peut définir une entité appelé point dans

laquelle on peut regrouper deux variables de type réel.

La première variable contiendra l’abscisse du point. La

deuxième variable contiendra son ordonnée.

Exemple2   : on peut définir une entité appelée fraction dans

laquelle on peut regrouper deux variables de type entier.

La première variable contiendra le numérateur de la fraction.

La deuxième variable contiendra son dénominateur.

Exemple3   : on peut définir une entité appelé employé dans

laquelle on peut regrouper plusieurs variables de différent

type.

La première variable de type string contiendra le nom de

l’employé.

La deuxième variable de type string contiendra son prénom.

La troisième variable de type int contiendra son indice sur la

liste.

La quatrième variable de type string contiendra sa date de

naissance.

La cinquième variable de type string contiendra la date

d’embauche.

La sixième variable de type string contiendra son adresse.

La septième variable de type double contiendra son salaire.

La huitième variable de type int contiendra le nombre

d’enfants.

Etc….

La syntaxe de déclaration d’une structure est la suivante :

Struct nom_de_la_structure

{liste des variables membres et leur type;};

Struct nom_de_la_structure s1,s2,si ;

Exemple1

//programme qui calcule le milieu d’un segment et la distance

entre deux points

#include<stdlib.h>#include<stdio.h>#include<math.h>int main(){struct point{

float x;float y;} ;

struct point A,B,C;float D;printf("donner abscisse du point A \n ");scanf("%f",&A.x);printf(" donner l ordonnee du point A \n ");scanf("%f",&A.y);printf("donner abscisse du point B \n ");scanf("%f",&B.x);printf("donner l ordonnee du point B \n ");scanf("%f",&B.y);C.x=0.5*(A.x+B.x);C.y=0.5*(A.y+B.y);D=sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y));printf("le milieu de votre segment A B a pour abscisse %f ",C.x);printf("\n le milieu de votre segment A B a pour ordonnee %f ",C.y);printf("\n la distance entre vos deux points vaut %f \n ",D);

printf("FIN \n");system("PAUSE");return 0;}

Exemple2

Ecrire un programme qui utilise le type truct pour lire auclavier le numérateur et le dénominateur de deux fraction et et qui calcule leur produit, leur somme, leursoustraction et leur rapport.

Reprendre l’exemple 1 en utilisant la notion de structure et lanotion de fonction.

1) une fonction qui permet de saisir un point 2) une fonction qui permet d’afficher un point3) une fonction qui permet de calculer le milieu du segment

constitué par deux points saisie au claviers4) une fonction qui permet de calculer la distance entre

deux points.

/* on utilise la notion de structure et fonction pour calculer le milieu du ségment entre du points */

#include<stdio.h>#include<math.h>struct point{

float x;float y;} ;

struct point A,B,C;float D;void saisie_point(struct point *p);void milieu(struct point a, struct point b, struct point *m);double distance(struct point a, struct point b);void affichage_point(struct point p);

int main(){struct point A,B,C;

double d;printf("saisie du point A \n ");saisie_point(&A);printf("saisie du point B \n ");saisie_point(&B);

D=distance(A,B);printf("\n la distance entre vos deux points vaut %f \n ",D);milieu(A,B,&C);

printf("affichage du point C \n"); affichage_point(C);

printf("FIN \n");system("PAUSE");return 0;}

void saisie_point(struct point *p){

printf("donner abscisse du point \n ");scanf("%f",&(*p).x);printf(" donner l ordonnee du point \n ");scanf("%f",&(*p).y);

}void milieu(struct point a, struct point b, struct point *m){

(*m).x=(a.x+b.x)/2;(*m).y=(a.y+b.y)/2;

//peut être écris//m->x=(a.x+b.x)/2;// m->y=(a.y+b.y)/2;

}

double distance(struct point a, struct point b){

double dx,dy;dx=a.x-b.x;dy=a.y-b.y;

return sqrt(dx*dx+dy*dy);

}// D=sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y));

void affichage_point(struct point p){

printf("le milieu de votre segment A B a pour abscisse %f ",p.x);printf("\n le milieu de votre segment A B a pour ordonnee %f ",p.y);

}

Exemple3

en utilisant la notion de structure et la notion de fonction.Ecrire un programme qui comporte :

1) une fonction qui permet de saisir une fraction2) une fonction qui permet d’afficher une fraction3) une fonction qui permet de calculer le produit de deux

fractions4) une fonction qui permet de calculer la somme de deux

fractions5) une fonction qui permet de calculer la différence de deux

fractions6) une fonction qui permet de rendre une fraction

irréductible c’est à dire normalisée.7) une fonction qui permet de donner les deux entiers qui

encadrent une fraction.8) Qui fait appelle à toutes ces fonctions

Chap 5 : les tableaux de caractères, les chaînes de caractères

I- Les tableaux de caractères indicés par des entiers: Il s’agit de tableaux dont les éléments sont descaractères et l’indice de chaque élément est un entier.

La syntaxe de leur déclaration est la suivante :Char identificateur_du_tableau[nombre d’éléments] ;Pour affecter un caractère à un élément I de ce tableau on lefait de la manière suivante :Identificateur_du tableau[I]= ’ caractère à affecter ’ ;

Exemple 1Ecrire un programme qui permet de remplir les cases d’untableau par les 5 premières lettres de l’alphabet majuscule.// on rempli et on affiche un tableau de caractère#include<stdlib.h>#include<stdio.h>// on rempli et on affiche un tableau de caractère

int main(){

const int N=5; int I;

char T[N];T[0]='A';T[1]='B';T[2]='C';T[3]='D';T[4]='E';printf("Le tableau que vous avez donnes est le suivant: \n");for (I=0;I<N;I++)

printf("%c \n",T[I]);printf( " FIN \n");

system("PAUSE");return 0;}

Exemple2Dans cet exercice, si on choisi d’afficher tous les éléments dutableaux sur une même ligne.

#include<stdlib.h>#include<stdio.h>// on rempli et on affiche un tableau de caractère sur une même ligne

int main(){

const int N=5; int I;

char T[N];T[0]='A';T[1]='B';T[2]='C';T[3]='D';T[4]='E';printf("Le tableau que vous avez donnes est le suivant: \n");

// for (I=0;I<N;I++)printf("%s ",T[I]);printf( " FIN \n");

system("PAUSE");return 0;}On peut remarquer que bien qu’on ait obtenu notre résultat surune même ligne, il y a des caractères en plus. Ce ci car lasuite de caractères du tableau T est considérée comme unechaîne de caractères et dans ce cas il faut préciser que lachaîne prend fin à la dernière case du tableau. Le programmedoit être modifié de la manière suivante en mettant dans ladernière case les deux caractères suivants : ‘\0’.

Exemple2_bis

#include<stdlib.h>#include<stdio.h>// on rempli et on affiche un tableau de caractère sur une même ligne

int main(){

const int N=5; int I;

char T[N];T[0]='A';T[1]='B';T[2]='C';T[3]='D';T[4]='E';T[5]='\0';printf("Le tableau que vous avez donnes est le suivant: \n");

// for (I=0;I<N;I++)printf("%s ",T);printf( " FIN \n");

system("PAUSE");return 0;}Le tableau que vous avez donnes est le suivant:ABCDE FINAppuyez sur une touche pour continuer...On peut également avoir le même résultat soit en supposant que notre chaine decaractère est contenue dans un tableau de caractère, on parle alors de chaine decaractères de style C, soit en déclarant la chaine de caractère en utilisant le typestring. Dans ces deux derniers cas les programmes se présentent respectivement dela manière suivante :

Exemple 3

// on lit une chaine de caractère dans un tableau#include<stdlib.h>#include<stdio.h>#include<string.h>

int main(){

const int N=5; int I;

char T[N];printf("donnez votre chaine des 5 lettres de l alphabet majuscule \n");scanf("%s",&T);printf("Le tableau que vous avez donne est le suivant: \n");

printf("%s \n",T);printf( " FIN \n");

system("PAUSE");return 0;}

Exécution

donnez votre chaine des 5 lettres de l alphabet majuscule:ABCDELa chaine que vous avez donne est la suivante: ABCDE FINAppuyez sur une touche pour continuer...

II- chaînes de caractères

II- 1 Définition Une chaîne de caractères est une suite de lettres, chiffresou autres symboles tels que + / . < ; ? etc.

II-2 Manipulations globales de chaînes  Exemple1 de déclaration d’une chaine constante const char *s1 = "MIPS320142015";

Exemple2 déclaration d’une chaine variable-1char chaine[256];

printf("Donnez votre prenom : ");scanf("%s", chaine);printf("Vous vous appelez %s\n", chaine);

Exemple3 déclaration d’une chaine variable-2 Il est conseillé d’utiliser l’allocation dynamique de mémoire sans oublier de la libérer à la fin d’utilisation. char *Texte = malloc (sizeof (*texte) * 256); /* * Utilisation d'une chaine de 255 caractères maximum */ free (texte);

De nombreuses fonctions qui permettent de manipuler leschaînes de caractères sont prédéfinies dans le fichier

string.h qu’il faut donc introduire dans le programme par#include<string.h>.

a) Affectations  Les affectations sont possibles grâce à la fonction strcpy.La syntaxe est la suivante :

strcpy(chaine1, chaine2) ;Exemple

char chaine1[10];char chaine2[] = "MIPS3";printf("la chaine chaine2 est %s \n",chaine2);strcpy (chaine1, chaine2);printf("apres copy de chaine2 dans chaine1, chaine1 vaut: %s\n",chaine1);

Exécutionla chaine chaine2 est MIPS3apres copy de chaine2 dans chaine1, chaine1 vaut: MIPS3FINAppuyez sur une touche pour continuer...On peut aussi utiliser l’allocation dynamique :char *strcpy(char *chaine1, const char *chaine2) ;

b) Concatenation Syntaxe : strcat(chaine1, chaine2);

ou en utilisant l’allocation dynamique char *strcat (char *chaine1, const char *chaine2);pour coller la chaine chaine2 à la chaine chaine1, le résultatest dans chaine1Exemplechar chaine1[] = "MIPS32014";char chaine2[] = "2015";strcat(chaine1, chaine2);printf("la nouvelle chaine chaine1 vaut %s \n",chaine1);Exécutionla nouvelle chaine chaine1 vaut MIPS320142015FINAppuyez sur une touche pour continuer...

c) Comparaisons  c-1 Dans le code ASCII, chaque caractère est représenté parun nombre. La comparaison des chaînes de caractères se fait

en se basant sur l’ordre des codes ASCII de chacun descaractères la composant.

Exemple  aac < abc

c-2) Fonction strcmp elle permet de comparer deux chaînes. La syntaxe est la suivante : strcmp (chaine1, chaine2);ou en utilisant l’allocation dynamiqueint strcmp (const char *chaine1, const char *chaine2);

le résultat de cette fonction peut être soit négatif, nul oupositif suivant que la chaine1 est avant chaine2, la chaine1est égale à chaîne 2 ou enfin chaîne 2 est avant chaine1.Exempleint N=0 ;char chaine1[] = "MIPS3";char chaine2[] = "MIPS2";N=strcmp (chaine1, chaine2);if(N==-1) printf("la chaine %s est avant %s \n",chaine1,chaine2);if(N==1) printf("la chaine %s est avant %s \n",chaine2,chaine1);if(N==0) printf("la chaine %s et %s sont les memes\n",chaine2,chaine1);

Exécutionla chaine MIPS2 est avant MIPS3FINAppuyez sur une touche pour continuer...

d-Fonction strlen elle permet d’avoir le nombre decaractères dans une chaine.

Dont la syntaxe est :strlen (chaine); le résultat est un entier.Exemple int N=0 ;char s1[] = "MIPS320142015";

N=strlen(s1) ;printf("la chaine %s comporte %d caracteres\n",s1,N);Exécutionla chaine MIPS320142015 comporte 13 caracteresFINAppuyez sur une touche pour continuer...

Elle permet d’obtenir la longueur d’une chaîne, i.e. lenombre de caractères qu’elle contient (y compris les blancset les caractères non affichables mais pas le caractère defin de chaine).