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...
Top Related