Sie sind auf Seite 1von 98

UNIVERSITE ABDELMALEK ESSAADI

FACULTE DES SCIENCES ET TECHNIQUES


TANGER

Module : Algorithmes et Structures de donn donnes en C


Dpartement Gnie Informatique

A.U :2011/2012

Programme

10/11/2011

Evaluation
CC1 CC2 & Examen de TP

8 semaines

PARTIE 1

Rappel gnral et mise niveau


Les Oprateurs LAffectation:
Identificateur_de_variable = expression Exp: A=5; A=A+1; B=A*2; SOMME=A+B;

Oprateurs
Arithmtiques Logiques De comparaison incrmentatio n

+ , * , - , && , || , ! /

< ,> ,<=,>=, !=,==

++, --

PARTIE 1

Rappel gnral et mise niveau


Les Types
4 types de base, les autres types seront drivs de ceux-ci.
Type Signification Caractre unique Exemples de valeur 'a' 'A' 'z' 'Z' '\n' 'a' 'A' 'z' 'Z' '\n' Varie de 128 127 0 1 -1 4589 32000 -231 231 +1 0.0 1.0 3.14 5.32 -1.23 0.0 1.0E10 1.0 1.34567896 Codage en mmoire 1 octet Peut tre

char

signed, unsigned Short, long, signed, unsigned

int

Nombre entier Nombre rel simple

2 ou 4 octets

float

4 octets

Nombre rel double double prcision

8 octets

long
5

PARTIE 1

Rappel gnral et mise niveau


Les Types
Il existe un certain nombre de qualificateurs qui peuvent tre associs aux types de base : short : s'applique aux entiers (short int : entier cod sur deux octets) long : s'applique aux entiers (long int : entier cod sur quatre octets) et aux nombres virgule flottante double prcision (long double : double prcision tendue) signed : s'applique au type char (de -128 127) ou aux types entiers (de -2n-1 2n-1-1, n tant le nombre de bits utiliss). unsigned : s'applique au type char (de 0 255) ou aux types entiers (de 0 2n-1).

PARTIE 1

Rappel gnral et mise niveau


Le Mot cl Typedef

permet de renommer un type. Syntaxe: typedef type nouveau_type ; Exp: Typdef short type1; Typdef int type2; Typdef struct ETUD STR_ETD;

PARTIE 1

Rappel gnral et mise niveau


Les Variables
Les variables sont des units de stockage dont l'objectif est de mmoriser des valeurs qui peuvent tre le rsultat de calculs intermdiaires. Une variable est dsigne par un identificateur. Une variable est type. i.e : (elle peut contenir et mmoriser des valeurs d'un seul type.)

Syntaxe:
nom_type indent_var1,ident_var2,,ident_varn; const nom_type ident_var;
? var1 Var 6 . . Var i Mmoire

Rappel gnral et mise niveau


Les constantes
Grce au prprocesseur #define NB 15 int i = NB;
Le prprocesseur soccupe seulement deffectuer des remplacements de valeurs ou des inclusions de fichier

les constantes symboliques : const int nb = 15; const int constante_symbolique = 15; int i = constante_symbolique; ne peuvent faire partie d'une expression constante (les indices de tableaux)

les valeurs numriques 15 => int 15L => long int 15.0 => double (les vbles relles sont par dfaut doubles) 15.0F => float

Rappel gnral et mise niveau


Les constantes numres
enum permet de dclarer des constantes numres enum couleur {jaune, rouge, vert, bleu} /*couleur est un nouveau type numr.*/ enum logique {vrai, faux} enum couleur c1, c2; enum logique f; les composants d'un enum sont des entiers ordinaires numrots de 0 (n sauf initialisation. exemple int i; c1 = jaune; i = vert; c2 = c1 + 2 c1 = f; jaune = 2;

/* vert */ /* bizarre mais accept */ /* impossible jaune n'est pas une Lvalue */

Rappel gnral et mise niveau


Les constantes numres
Initialisation : enum couleur {jaune = 1, rouge = 5, vert , bleu =9} vert vaut 6. Les Enum peuvent tre remplacs par des define : #define false 0 #define true 1 enum bool {false, true};

Rappel gnral et mise niveau


Les conversions
Les conversions dajustement de type : Les conversions se font selon une hirarchie qui permet de ne pas dnaturer la valeur. int > long > float > double > long double Exemple : i * l + f i est un int, l est un long, f est un float

Rappel gnral et mise niveau


Les conversions
Les promotions numriques : Les oprateurs arithmtiques ne sont pas dfinis pour les types short et char. Le langage C convertit automatiquement ces types en int. Exemple : s1 * s2 + s3 * f s1, s2, s3 sont des short, f est un float.

Rappel gnral et mise niveau


Les conversions
Les promotions numriques des caractres : Lentier associ un caractre donn nest pas toujours le mme. Exemple : c1+i c1 est un char, i est un entier.

Exemple : c1 - c2 c1 et c2 sont des char.

Les unsigned char renvoient un chiffre entre 0 255 alors que les char renvoient un nombre entre -128 et 127

Rappel gnral et mise niveau


Les oprateurs logiques
(condition1) && (condition2) condition1 et condition2.

(condition1) || (condition2) condition1 ou condition2.

!(condition) not condition.

Rappel gnral et mise niveau


Loprateur cast
On peut forcer la conversion dune expression grce loprateur cast

(type) expression_a_ caster


Permissivit excessive du C. Exemple :

double d; int i,j; i = 20; j = 7; d = i / j; d = (double)(i/j); d = (double)(i)/j; d = 20 / 7; d = 20.0 / 7.0;

/* d vaut 2 */ /* d vaut 2.0 */ /* d vaut 2.857143 */ /* d vaut 2 */ /* d vaut 2.857143 */

Rappel gnral et mise niveau


Loprateur conditionnel
si a > b alors max = a; sinon max = b; peut scrire : max = a > b ? a : b max = (a > b ? a : b); Format de loprateur conditionnel cond ? valeur de retour si cond est vraie : valeur de retour si cond est fausse

Loprateur squentiel
Loprateur squentiel est la virgule. a*b ,c+d a * b est valu dabord puis c + d. if ( i++, a > b) <==> i++; if ( a > b )... for (i = 0, j = 10; . .. ; ...) <==> i = 0; f or ( j = 10; . .. ; ...)

Rappel gnral et mise niveau


Loprateur sizeof
Loprateur sizeof() renvoie la taille en octet de loprande ou du type. int i; float j; sizeof(i); ==> 2 sizeof(j); ==> 4 On peut utiliser sizeof avec le nom des types : sizeof(int); ==> 2 sizeof(float); ==> 4 gain de portabilit pratique avec les structures

Rappel gnral et mise niveau


Les entres-sorties conversationnelles
La fonction printf printf("premier argument %format_arg2 % format_ arg3", arg2, arg3); Le premier argument de printf contient une chane de caractres qui est affiche lcran lexception des mots commenant par le caractre % . Example : int i = 6; float f = 2.3456; printf("Rang : %d , valeur %10.5f", i, f); affiche l'cran Rang : 6, valeur 2.34560

Rappel gnral et mise niveau


Les entres-sorties conversationnelles
Le nombre d'arguments de printf est variable et dtermin par le premier argument (une chane de caractres) Le premier argument composent ce que lon nomme le "format" ; dans notre exemple "Rang : %d , valeur %10.5f %x est appel le code format, il reprsente un code de conversion ; dans notre exemple %d et %10,5F Exemple de code format : %c %f %s %Lf %3d Printf renvoie le nombre de caractres crits, ngatif si erreur.

Rappel gnral et mise niveau


Les formats de printf
c : char caractre (convient aussi pour int ou short compte tenu des conversions systmatiques). d : int les entiers (convient aussi pour char ou short compte tenu des conversions systmatiques). u : unsigned int (convient aussi pour unsigned char ou unsigned short compte tenu des conversions systmatiques). ld :long int. lu : unsigned long int. f :double ou float crit notation en dcimale ex : 999.123456 ou 999.123400 (compte tenu des conversions systmatiques float --> double). e : double ou float crit en notation exponentielle, mantisse 1 10, 6 chiffres aprs la dcimale ex : -x.xxxxxxe+yyy -x.xxxxxxe-yyy s : chane de caractres, fournir ladresse (pointeur) de la chane.

Rappel gnral et mise niveau


Prcision de printf
Le nombre plac aprs le % dans le code format est appel gabarit printf( "%10.3f",f); /* dcimale */ f =99.1236; ^^^^99.124 printf( "%12.3e",f); /* exponentielle */ f =99.1263E8; ^^^^9.913e+08 calage gauche signe moins printf( "% -10.3f",f); le caractre * dans le gabarit ou dans la prcision signifie que la valeur effective est fournie dans la liste des arguments de printf. printf( "%8.*f",n,f); n = 1 f = 99.12345 ^^^^99.1

Rappel gnral et mise niveau


putchar
Putchar(c) est quivalent printf("%c",c) pas danalyse de format ==> plus rapide. putchar(i) nest pas une vraie fonction mais une macro le fait que putchar soit une macro entrane lobligation de la directive #include<stdio.h>

Rappel gnral et mise niveau


scanf
scanf(format, liste d'adresses); scanf("%arg2%arg3", &arg2, &arg3); Scanf permet de saisir des donnes entres au clavier. Le format dtermine le type des donnes saisies. Il est ncessaire de fournir l'adresse des variables qui contiendront les donnes.

Rappel gnral et mise niveau


Le tampon de scanf
Les informations entres au clavier sont places dans un tampon. Scanf explore ce tampon caractre par caractre au fur et mesure des besoins. L'espace et la fin de ligne '\n' sont considrs comme des sparateurs (il peut y en avoir d'autre). Fonctionnement de scanf
pour les nombres : scanf avance jusqu'au premier caractre diffrent d'un sparateur, puis scanf prend en compte tous les caractres jusqu' la rencontre d'un sparateur ou en fonction d'un gabarit ou d'un caractre invalide. pour les nombres : pas de conversion implicite. pour les caractres %c : scanf renvoie le prochain caractre dans le buffer sparateur ou non sparateur.

Exemple ( ^ = espace, @ = fin de ligne) : scanf("%d%d",&n,&p);


45^23@ ===> n = 45 p = 23 45@@23@ ===> n = 45 p = 23 scanf("%d%c",&n,&c); 45^a ===> n = 45 c = ' '

Rappel gnral et mise niveau


Gabarit de scanf
Saisie avec gabarit :
scanf avance jusqu'au premier caractre diffrent d'un sparateur, puis scanf prend en compte tous les caractres jusqu' la rencontre d'un sparateur ou lorsque le nombre de caractres indiqus dans le gabarit est atteint. Lecture d'un nombre d'au plus X chiffres.

Exemple ( ^ = espace, @ = fin de ligne) : scanf("%3d%3d",&n,&p);


45^23@ 12345@ ===> ===> n = 45 p = 23 n = 123 p =45

Rappel gnral et mise niveau


L'espace et caractres invalides dans le code format
L'espace dans le code format indique scanf d'avancer jusqu'au prochain caractre qui n'est pas un sparateur (c'tait dj le cas pour les nombres). Exemple ( ^ = espace, @ = fin de ligne) :
scanf("%d^%c",&n,&c); 45^^a ===> n = 45 c = 'a

Caractre invalide
scanf("%d^%c",&n,&c); 45a@ ===> La rencontre d'un caractre invalide (le point dans un entier) provoque l'arrt du traitement du code format.

Rappel gnral et mise niveau


getchar
getchar() est quivalent scanf("%c",c) pas danalyse de format ==> plus rapide. getchar(i) nest pas une vraie fonction mais une macro. getchar utilise le mme tampon que scanf.

PARTIE 1

Rappel gnral et mise niveau


Les Structures de contrles ( TESTS)
L'instruction if ..else : Syntaxe: if (condition) instruction1 else instruction2
instruction1 est excute si condition est diffrent de 0. instruction2 est excute si condition vaut 0. Si Condition # 0 Condition ? Si Condition = 0 Instruction 2 Instruction 1

PARTIE 1

Rappel gnral et mise niveau


Les Structures de contrles ( TESTS)
L'instruction switch L'instruction permet d'effecter un choix entre plusieurs possibilits. Il s'agit d'un oprateur de branchement. Syntaxe: switch(expression) { case const1 : instruction1 case const2 : instruction2 ... defaut : instruction_def }

Rappel gnral et mise niveau


Break
for( i = 0; i < 5; i++) {printf ("boucle for : ") if ( i == 2 ) break; printf(" %d fois \n", i +1 ); } donne comme rsultat : boucle for 1 fois boucle for 2 fois boucle for break permet de sortir de la boucle la plus interne.

Rappel gnral et mise niveau


continue
for( i = 0; i < 5; i++) {printf ("boucle for : ") if ( i == 2 ) continue; printf(" %d fois \n", i +1 ); } donne comme rsultat : boucle for 1 fois boucle for 2 fois boucle forboucle for 4 fois boucle for 5 fois "continue" permet de passer prmaturment au tour de boucle suivant. "continue" s'applique la boucle la plus interne.

Rappel gnral et mise niveau


goto
for( i = 0; i < 5; i++) {printf ("boucle for : ") if ( i == 2 ) goto sortie; printf(" %d fois \n", i +1 ); } sortie : printf("\nfin\n"); donne comme rsultat : boucle for 1 fois boucle for 2 fois boucle for Fin goto permet de se brancher un emplacement quelconque du programme dans la mme fonction.

Goto est viter.

PARTIE 1

Rappel gnral et mise niveau


Les Boucles

While while (expression) { instruction1; .. }

For for(exp1;exp2;exp3) { Instruction1; . }

do while do { instruction1; .. } while(expression);

PARTIE 1

Rappel gnral et mise niveau


Qu'est-ce qu'un bon programme?
Il doit rsoudre le PROBLEME !

Efficacit Rapidit?

INSTANTANE !

DUREE DE VIE ?

- Lisible - Structur

35

PARTIE 1

Rappel gnral et mise niveau


Qualits dun programme?

Clart Simplicit Efficacit Modularit Extensibilit


36

Structure d'un programme C


#include <stdio.h> #define DEBUT -10 #define FIN 10 #define MSG "Programme de dmonstration\n"
int fonc1(int x); int fonc2(int x); void main() { main*/ int i; i=0; fonc1(i) ; fonc2(i) ; } int fonc1(int x) { return x; } int fonc2(int x) { return (x * x); } /* fin du bloc de la fonction main */

PARTIE 1

Directives du prprocesseur : accs avant la compilation Dclaration des fonctions

/* dbut du bloc de la fonction


/* dfinition des variables locales */

Programme principal

Dfinitions des fonctions

37

Cration dun programme C


dition dun fichier ".c" : pgrm.c Compilation : gcc pgrm.c tape 1 le prprocesseur cpp : traite les directives du source qui le concernent (#include #define) ==> pgrm.i tape 2 : assembler pour crer : pgrm.obj tape 3 : dition de liens Linker cration dun excutable nomm a.out permet de lier lobjet les fonctions des librairies externes (printf, scanf) Rendre excutable a.out pour Linux : chmod u+x a.out

Rappel gnral et mise niveau


Les tableaux une dimension
Dfinitions: Un tableau (uni-dimensionnel) A est une variable structure forme d'un nombre entier N de variables simples du mme type, qui sont appeles les composantes du tableau. Le nombre de composantes N est alors la dimension du tableau.

En faisant le rapprochement avec les mathmatiques, on dit encore que "A est un vecteur de dimension N Exemple: La dclaration int JOURS[12]={31,28,31,30,31,30,31,31,30,31,30,31}; dfinit un tableau du type int de dimension 12. Les 12 composantes sont initialises par les valeurs respectives 31, 28, 31, ... , 31. On peut accder la premire composante du tableau par JOURS[0], la deuxime composante par JOURS[1], . . . , la dernire composante par JOURS[11]

Rappel gnral et mise niveau


Dclaration et mmorisation
Dclaration de tableaux en C: <TypeSimple> <NomTableau>[<Dimension>]; Les noms des tableaux sont des identificateurs qui doivent correspondre aux restrictions dfinies auparavant. Exemple: int JOURS[12]; Mmorisation: En C, le nom d'un tableau est le reprsentant de l'adresse du premier lment du tableau. Les adresses des autres composantes sont calcules (automatiquement) relativement cette adresse. Exemple: short A[5] = {1200, 2300, 3400, 4500, 5600};

Si un tableau est form de N composantes et si une composante a besoin de M octets en mmoire, alors le tableau occupera de N*M octets.

Rappel gnral et mise niveau


Initialisation et rservation automatique
Initialisation: Lors de la dclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la liste des valeurs respectives entre accolades. Exemple: int A[5] = {10, 20, 30, 40, 50}; float B[4] = {-1.05, 3.33, 87e-5, -12.3E4}; int C[10] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1}; Il faut videmment veiller ce que le nombre de valeurs dans la liste corresponde la dimension du tableau. Si la liste ne contient pas assez de valeurs pour toutes les composantes, les composantes restantes sont initialises par zro Rservation automatique: Si la dimension n'est pas indique explicitement lors de l'initialisation, alors l'ordinateur rserve automatiquement le nombre d'octets ncessaires. Exemple:

Rappel gnral et mise niveau


Accs aux composantes
En dclarant un tableau par int A[5]; nous avons dfini un tableau A avec cinq composantes, auxquelles on peut accder par: A[0], A[1], ... , A[4] Exemple:

MAX = (A[0]>A[1]) ? A[0] : A[1]; A[4] *= 2;

Rappel gnral et mise niveau


Affectation avec des valeurs provenant de l'extrieur
#include<stdio.h> int main(int argc, char *argv[]) { int A[5]; int I; /* Compteur */ for (I=0; I<5; I++) scanf("%d", &A[I]); return 0; }

Affichage du contenu d'un tableau


#include<stdio.h> int main(int argc, char *argv[]) { int A[5]; int I; /* Compteur */ for (I=0; I<5; I++) printf("%d ", A[I]); return 0; }

Rappel gnral et mise niveau


Exercice 1 Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Calculer et afficher ensuite la somme des lments du tableau. Exercice 2 Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Effacer ensuite toutes les occurrences de la valeur 0 dans le tableau T et tasser les lments restants. Afficher le tableau rsultant. Exercice 3 Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Ranger ensuite les lments du tableau T dans l'ordre inverse sans utiliser de tableau d'aide. Afficher le tableau rsultant. Ide: Echanger les lments du tableau l'aide de deux indices qui parcourent le tableau en commenant respectivement au dbut et la fin du tableau et qui se rencontrent en son milieu. Exercice 4 Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Copiez ensuite toutes les composantes strictement positives dans un deuxime tableau TPOS et toutes les valeurs strictement ngatives dans un troisime tableau TNEG. Afficher les tableaux TPOS et TNEG.

Exercice 1 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int T[50]; /* tableau donn */ int N; /* dimension */ int I; /* indice courant */ long SOM; /* somme des lments - type long cause */ /* de la grandeur prvisible du rsultat. */ /* Saisie des donnes */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (I=0; I<N; I++) { printf("Elment %d : ", I); scanf("%d", &T[I]); }

/* Affichage du tableau */ printf("Tableau donn :\n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n"); /* Calcul de la somme */ for (SOM=0, I=0; I<N; I++) SOM += T[I]; /* Edition du rsultat */ printf("Somme de lments : %ld\n", SOM); return 0; }

Exercice 2 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int T[50]; /* tableau donn */ int N; /* dimension */ int I,J; /* indices courants */ /* Saisie des donnes */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (I=0; I<N; I++) { printf("Elment %d : ", I); scanf("%d", &T[I]); } /* Affichage du tableau */ printf("Tableau donn : \n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n"); /* Effacer les zros et comprimer : */ /* Copier tous les lments de I vers J et */ /* augmenter J pour les lments non nuls. */

for (I=0, J=0 ; I<N ; I++) { T[J] = T[I]; if (T[I]) J++; } /* Nouvelle dimension du tableau ! */ N = J; /* Edition des rsultats */ printf("Tableau rsultat :\n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n"); return 0; }

Exercice 3 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int T[50]; /* tableau donn */ int N; /* dimension */ int I,J; /* indices courants */ int AIDE; /* pour l'change */ /* Saisie des donnes */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (I=0; I<N; I++) { printf("Elment %d : ", I); scanf("%d", &T[I]); } /* Affichage du tableau */ printf("Tableau donn : \n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n");

/* Inverser le tableau */ for (I=0, J=N-1 ; I<J ; I++,J--) /* Echange de T[I] et T[J] */ { AIDE = T[I]; T[I] = T[J]; T[J] = AIDE; } /* Edition des rsultats */ printf("Tableau rsultat :\n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n"); return 0; }

Exercice 4 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ /* Les tableaux et leurs dimensions */ int T[50], TPOS[50], TNEG[50]; int N, NPOS, NNEG; int I; /* indice courant */ /* Saisie des donnes */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (I=0; I<N; I++) { printf("Elment %d : ", I); scanf("%d", &T[I]); } /* Affichage du tableau */ printf("Tableau donn :\n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n");

/* Initialisation des dimensions de TPOS et TNEG */ NPOS=0; NNEG=0; /* Transfer des donnes */ for (I=0; I<N; I++) { if (T[I]>0) { TPOS[NPOS]=T[I]; NPOS++; } if (T[I]<0) { TNEG[NNEG]=T[I]; NNEG++; } } /* Edition du rsultat */ printf("Tableau TPOS :\n"); for (I=0; I<NPOS; I++) printf("%d ", TPOS[I]); printf("\n"); printf("Tableau TNEG :\n"); for (I=0; I<NNEG; I++) printf("%d ", TNEG[I]); printf("\n"); return 0; }

Rappel gnral et mise niveau


Les tableaux deux dimensions
Dfinitions: En C, un tableau deux dimensions A est interprter comme un tableau (uni-dimensionnel) de dimension L dont chaque composante est un tableau (uni-dimensionnel) de dimension C.

En faisant le rapprochement avec les mathmatiques, on peut dire que "A est un vecteur de L vecteurs de dimension C", ou mieux:"A est une matrice de dimensions L et C". Exemple: Pour mmoriser les notes des lves dans les 10 devoirs d'un trimestre, nous pouvons rassembler plusieurs de ces tableaux uni-dimensionnels dans un tableau NOTES deux dimensions : int NOTE[10][20] = {{45, 34, ... , 50, 48}, {39, 24, ... , 49, 45}, {40, 40, ... , 54, 44}};

Rappel gnral et mise niveau


Dclaration et mmorisation
Dclaration de tableaux en C: <TypeSimple> <NomTableau>[<DimLigne>][<DimCol>]; Les noms des tableaux sont des identificateurs qui doivent correspondre aux restrictions dfinies auparavant. Exemple: int note[10][20]; Mmorisation: Comme pour les tableaux une dimension, le nom d'un tableau est le reprsentant de l'adresse du premier lment du tableau (c.--d. l'adresse de la premire ligne du tableau). Les composantes d'un tableau deux dimensions sont stockes ligne par ligne dans la mmoire. Exemple: short A[3][2] = {{1, 2 }, {10, 20 }, {100, 200}}; Un tableau de dimensions L et C, form de composantes dont chacune a besoin de M octets, occupera L*C*M octets en mmoire.

Rappel gnral et mise niveau


Initialisation et rservation automatique

Rappel gnral et mise niveau


Accs aux composantes
Les lments d'un tableau de dimensions L et C se prsentent de la faon suivante:

Affectation avec des valeurs provenant de l'extrieur #include<stdio.h> int main(int argc, char *argv[]) { Affichage du contenu d'un tableau int A[5][10]; #include<stdio.h> int I,J; int main(int argc, char *argv[]) /* Pour chaque ligne ... */ { for (I=0; I<5; I++) int A[5][10]; /* ... considrer chaque composante */ int I,J; for (J=0; J<10; J++) /* Pour chaque ligne ... */ scanf("%d", &A[I][J]); for (I=0; I<5; I++) return 0; { } /* ... considrer chaque composante */ for (J=0; J<10; J++) printf("%7d", A[I][J]); /* Retour la ligne */ printf("\n"); } return 0; }

Rappel gnral et mise niveau


Exercice 1 Ecrire un programme qui lit les dimensions L et C d'un tableau T deux dimensions du type int (dimensions maximales: 50 lignes et 50 colonnes). Remplir le tableau par des valeurs entres au clavier et afficher le tableau ainsi que la somme de tous ses lments. Exercice 2 Ecrire un programme qui lit les dimensions L et C d'un tableau T deux dimensions du type int (dimensions maximales: 50 lignes et 50 colonnes). Remplir le tableau par des valeurs entres au clavier et afficher le tableau ainsi que la somme de chaque ligne et de chaque colonne en n'utilisant qu'une variable d'aide pour la somme. Exercice 3 Ecrire un programme qui transfre un tableau M deux dimensions L et C (dimensions maximales: 10 lignes et 10 colonnes) dans un tableau V une dimension L*C.

Exercice 1 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int T[50][50]; /* tableau donn */ int L, C; /* dimensions */ int I, J; /* indices courants */ long SOM; /* somme des lments - type long cause */ /* de la grandeur prvisible du rsultat. */ /* Saisie des donnes */ printf("Nombre de lignes (max.50) : "); scanf("%d", &L ); printf("Nombre de colonnes (max.50) : "); scanf("%d", &C ); for (I=0; I<L; I++) for (J=0; J<C; J++) { printf("Elment[%d][%d] : ",I,J); scanf("%d", &T[I][J]); }

/* Affichage du tableau */ printf("Tableau donn :\n"); for (I=0; I<L; I++) { for (J=0; J<C; J++) printf("%7d", T[I][J]); printf("\n"); } /* Calcul de la somme */ for (SOM=0, I=0; I<L; I++) for (J=0; J<C; J++) SOM += T[I][J]; /* Edition du rsultat */ printf("Somme des lments : %ld\n", SOM); return 0; }

Exercice 2
#include <stdio.h> int main(int argc, char *argv[]) {/* Dclarations */ int T[50][50]; /* tableau donn */ int L, C; /* dimensions */ int I, J; /* indices courants */ long SOM; /* Saisie des donnes */ printf("Nombre de lignes (max.50) : "); scanf("%d", &L ); printf("Nombre de colonnes (max.50) : "); scanf("%d", &C ); for (I=0; I<L; I++) for (J=0; J<C; J++) { printf("Elment[%d][%d] : ",I,J); scanf("%d", &T[I][J]); } /* Affichage du tableau */ printf("Tableau donn :\n"); for (I=0; I<L; I++) { for (J=0; J<C; J++) printf("%7d", T[I][J]); printf("\n"); }

/* Calcul et affichage de la somme des lignes */ for (I=0; I<L; I++) { for (SOM=0, J=0; J<C; J++) SOM += T[I][J]; printf("Somme - ligne %d : %ld\n",I,SOM); } /* Calcul et affichage de la somme des colonnes */ for (J=0; J<C; J++) { for (SOM=0, I=0; I<L; I++) SOM += T[I][J]; printf("Somme - colonne %d : %ld\n",J,SOM); } return 0; }

Exercice 3
#include <stdio.h> int main(int argc, char *argv[]) {/* Dclarations */ int M[10][10]; /* tableau 2 dimensions */ int V[100]; /* tableau 1 dimension */ int L, C; /* dimensions */ int I, J; /* indices courants */ /* Saisie des donnes */ printf("Nombre de lignes (max.10) : "); scanf("%d", &L ); printf("Nombre de colonnes (max.10) : "); scanf("%d", &C ); for (I=0; I<L; I++) for (J=0; J<C; J++) { printf("Elment[%d][%d] : ",I,J); scanf("%d", &M[I][J]); } /* Affichage du tableau 2-dim */ printf("Tableau donn :\n"); for (I=0; I<L; I++) { for (J=0; J<C; J++) printf("%7d", M[I][J]); printf("\n"); }

/* Transfer des lments ligne par ligne */ for (I=0; I<L; I++) for (J=0; J<C; J++) V[I*C+J] = M[I][J]; /* Affichage du tableau 1-dim */ printf("Tableau rsultat : "); for (I=0; I<L*C; I++) printf("%d ", V[I]); printf("\n"); return 0; }

Rappel gnral et mise niveau


LES CHANES DE CARACTRES
Il n'existe pas de type spcial chane ou string en C. Une chane de caractres est traite comme un tableau une dimension de caractres (vecteur de caractres). Il existe quand mme des notations particulires et une bonne quantit de fonctions spciales pour le traitement de tableaux de caractres. Dclaration de chanes de caractres en C: char NOM [20]; char PRENOM [20]; char PHRASE [300]; Lors de la dclaration, nous devons indiquer l'espace rserver en mmoire pour le stockage de la chane. La reprsentation interne d'une chane de caractres est termine par le symbole '\0' (NUL). Ainsi, pour un texte de n caractres, nous devons prvoir n+1 octets. Exemple: Mmorisation: char TXT[10] = "BONJOUR !";

Rappel gnral et mise niveau


Initialisation de chanes de caractres
En gnral, les tableaux sont initialiss par l'indication de la liste des lments du tableau entre accolades: char CHAINE[] = {'H','e','l','l','o','\0'}; Pour le cas spcial des tableaux de caractres, nous pouvons utiliser une initialisation plus confortable en indiquant simplement une chane de caractre constante: char CHAINE[] = "Hello";

Rappel gnral et mise niveau


Exercice
Lesquelles des chanes suivantes sont initialises correctement ? Corrigez les dclarations fausses et indiquez pour chaque chane de caractres le nombre d'octets qui sera rserv en mmoire. a) b) c) d) e) f) g) h) i) char a[] = "un\ndeux\ntrois\n"; char b[12] = "un deux trois"; char c[] = 'abcdefg'; char d[10] = 'x'; char e[5] = "cinq"; char f[] = "Cette " "phrase" "est coupe"; char g[2] = {'a', '\0'}; char h[4] = {'a', 'b', 'c'}; char i[4] = "'o'";

Rappel gnral et mise niveau


Exercice a) char a[] = "un\ndeux\ntrois\n"; Dclaration correcte Espace: 15 octets b) char b[12] = "un deux trois"; Dclaration incorrecte: la chane d'initialisation dpasse le bloc de mmoire rserv. Correction: char b[14] = "un deux trois"; ou mieux: char b[] = "un deux trois"; Espace: 14 octets c) char c[] = 'abcdefg'; Dclaration incorrecte: Les symboles '' encadrent des caractres; pour initialiser avec une chane de caractres, il faut utiliser les guillemets (ou indiquer une liste de caractres). Correction: char c[] = "abcdefg"; Espace: 8 octets d) char d[10] = 'x'; Dclaration incorrecte: Il faut utiliser une liste de caractres ou une chane pour l'initialisation Correction: char d[10] = {'x', '\0'} ou mieux: char d[10] = "x"; Espace: 2 octets

Rappel gnral et mise niveau


Exercice e) char e[5] = "cinq"; Dclaration correcte Espace: 5 octets f) char f[] = "Cette " "phrase" "est coupe"; Dclaration correcte Espace: 24 octets g) char g[2] = {'a', '\0'}; Dclaration correcte Espace: 2 octets h) char h[4] = {'a', 'b', 'c'}; Dclaration incorrecte: Dans une liste de caractres, il faut aussi indiquer le symbole de fin de chane. Correction: char h[4] = {'a', 'b', 'c', '\0'}; Espace: 4 octets i) char i[4] = "'o'"; Dclaration correcte, mais d'une chane contenant les caractres '\'', 'o', '\'' et '\0'. Espace: 4 octets

Rappel gnral et mise niveau


Accs aux lments d'une chane
L'accs un lment d'une chane de caractres peut se faire de la mme faon que l'accs un lment d'un tableau. En dclarant une chane par: char A[6]; nous avons dfini un tableau A avec six lments, auxquels on peut accder par: A[0], A[1], ... , A[5]

Rappel gnral et mise niveau


Prcdence alphabtique
La prcdence des caractres dans l'alphabet d'une machine est dpendante du code de caractres utilis. Pour le code ASCII, nous pouvons constater l'ordre suivant: . . . ,0,1,2, ... ,9, . . . ,A,B,C, ... ,Z, . . . ,a,b,c, ... ,z, . . . Relation de prcdence De la prcdence alphabtique des caractres, on peut dduire une relation de prcdence 'est infrieur ' sur l'ensemble des caractres. Ainsi, on peut dire que '0' est infrieur 'Z' et noter '0' < 'Z' car dans l'alphabet de la machine, le code du caractre '0' (ASCII: 48) est infrieur au code du caractre 'Z' (ASCII: 90).

Rappel gnral et mise niveau


Prcdence lexicographique
En nous basant sur cette relation de prcdence alphabtique des caractres, nous pouvons dfinir une prcdence lexicographique pour les chanes de caractres. Cette relation de prcdence suit l'<<ordre du dictionnaire>> et est dfinie de faon rcurrente: a) La chane vide "" prcde lexicographiquement toutes les autres chanes. b) La chane A = "a1a2a ... ap" (p caractres) prcde lexicographiquement la chane B = "b1b2 ... bm" (m caractres) si l'une des deux conditions suivantes est remplie: 1) 'a1' < 'b1' 2) 'a1' = 'b1' et "a2a3 ... ap" prcde lexicographiquement "b2b3 ... bm Exemples "ABC" prcde "BCD" car 'A'<'B' "ABC" prcde "B" car 'A'<'B' "Abc" prcde "abc" car 'A'<'a' "ab" prcde "abcd" car "" prcde "cd" " ab" prcde "ab" car ' '<'a' (le code ASCII de ' ' est 32, et le code ASCII de 'a' est 97)

Rappel gnral et mise niveau


Conversions et tests
En tenant compte de l'ordre alphabtique des caractres, on peut contrler le type du caractre (chiffre, majuscule, minuscule). Exemples if (C>='0' && C<='9') printf("Chiffre\n", C); if (C>='A' && C<='Z') printf("Majuscule\n", C); if (C>='a' && C<='z') printf("Minuscule\n", C); Il est facile, de convertir des lettres majuscules dans des minuscules: if (C>='A' && C<='Z') C = C-'A'+'a'; ou vice-versa: if (C>='a' && C<='z') C = C-'a'+'A';

Rappel gnral et mise niveau


Affichage de chanes de caractres
printf avec le spcificateur de format %s permet d'intgrer une chane de caractres dans une phrase. En plus, le spcificateur %s permet l'indication de la largeur minimale du champ d'affichage. Dans ce champ, les donnes sont justifies droite. Si on indique une largeur minimale ngative, la chane sera justifie gauche. Un nombre suivant un point indique la largeur maximale pour l'affichage. Exemples char NOM[] = "hello, world"; printf(":%s:", NOM);-> printf(":%5s:", NOM); -> printf(":%15s:", NOM);-> printf(":%-15s:", NOM);-> printf(":%.5s:", NOM); -> :hello, world: :hello, world: : hello, world: :hello, world : :hello:

Rappel gnral et mise niveau


Affichage de chanes de caractres
puts est idale pour crire une chane constante ou le contenu d'une variable dans une ligne isole. Syntaxe: puts( <Chane> ) Effet: puts crit la chane de caractres dsigne par <Chane> sur stdout et provoque un retour la ligne. En pratique, puts(TXT); est quivalent printf("%s\n",TXT); Exemples char TEXTE[] = "Voici une premire ligne."; puts(TEXTE); puts("Voici une deuxime ligne.");

Rappel gnral et mise niveau


Lecture de chanes de caractres
scanf avec le spcificateur %s permet de lire un mot isol l'intrieur d'une suite de donnes du mme ou d'un autre type. Effet: scanf avec le spcificateur %s lit un mot du fichier d'entre standard stdin et le mmorise l'adresse qui est associe %s. Exemple char LIEU[25]; int JOUR, MOIS, ANNEE;

printf("Entrez lieu et date de naissance : \n"); scanf("%s %d %d %d", LIEU, &JOUR, &MOIS, &ANNEE); Remarques importantes - La fonction scanf a besoin des adresses de ses arguments: * Les noms des variables numriques (int, char, long, float, ...) doivent tre marqus par le symbole '&. * Comme le nom d'une chane de caractres est le reprsentant de l'adresse du premier caractre de la chane, il ne doit pas tre prcd de l'oprateur adresse '&' ! - La fonction scanf avec plusieurs arguments prsuppose que l'utilisateur connaisse exactement le nombre et l'ordre des donnes introduire! Ainsi, l'utilisation de scanf pour la lecture de chanes de caractres est seulement conseille si on est forc de lire un nombre fix de mots en une fois.

Rappel gnral et mise niveau


Lecture de chanes de caractres
gets est idal pour lire une ou plusieurs lignes de texte (p.ex. des phrases) termines par un retour la ligne. Syntaxe: gets( <Chane> ) Effet: gets lit une ligne de de caractres de stdin et la copie l'adresse indique par <Chane>. Le retour la ligne final est remplac par le symbole de fin de chane '\0'. Exemple int MAXI = 1000; char LIGNE[MAXI]; gets(LIGNE);

Rappel gnral et mise niveau


Exercice Ecrire un programme qui lit 5 mots, spars par des espaces et qui les affiche ensuite dans une ligne, mais dans l'ordre inverse. Les mots sont mmoriss dans 5 variables M1, ... ,M5. Exemple voici une petite phrase ! ! phrase petite une voici Exercice Ecrire un programme qui lit une ligne de texte (ne dpassant pas 200 caractres) la mmorise dans une variable TXT et affiche ensuite: a) la longueur L de la chane. b) le nombre de 'e' contenus dans le texte. c) toute la phrase rebours, sans changer le contenu de la variable TXT. d) toute la phrase rebours, aprs avoir invers l'ordre des caractres dans TXT: voici une petite phrase ! ! esarhp etitep enu iciov

Rappel gnral et mise niveau


Exercice Ecrire un programme qui lit un texte TXT (de moins de 200 caractres) et qui enlve toutes les apparitions du charactre 'e' en tassant les lments restants. Les modifications se feront dans la mme variable TXT. Exemple: Cette ligne contient quelques lettres e. Ctt lign contint qulqus lttrs .

Rappel gnral et mise niveau


Exercice #include <stdio.h> int main(int argc, char *argv[]) { char M1[30], M2[30], M3[30], M4[30], M5[30]; printf("Entrez 5 mots, spars par des espaces :\n"); scanf ("%s %s %s %s %s", M1, M2, M3, M4, M5); printf("%s %s %s %s %s\n",M5, M4, M3, M2, M1); return 0; }

Rappel gnral et mise niveau


Exercice #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ char TXT[201]; /* chane donne */ int I,J; /* indices courants */ int L; /* longueur de la chane */ int C; /* compteur des lettres 'e' */ int AIDE; /* pour l'change des caractres */ /* Saisie des donnes */ printf("Entrez une ligne de texte (max.200 caractres) :\n"); gets(TXT); /* L'utilisation de scanf est impossible pour */ /* lire une phrase contenant un nombre variable de mots. */ /* a) Compter les caractres */ /* La marque de fin de chane '\0' est utilise comme condition d'arrt. */ for (L=0; TXT[L]; L++) printf("Le texte est compos de %d caractres.\n",L);

Rappel gnral et mise niveau


Exercice /* b) Compter les lettres 'e' dans le texte */ C=0; for (I=0; TXT[I]; I++) if (TXT[I]=='e') C++; printf("Le texte contient %d lettres \'e\'.\n",C); /* c) Afficher la phrase l'envers */ for (I=L-1; I>=0; I--) putchar(TXT[I]); /* ou printf("%c",TXT[I]); */ putchar('\n'); /* ou printf("\n"); */ /* d) Inverser l'ordre des caractres */ for (I=0,J=L-1 ; I<J ; I++,J--) { AIDE=TXT[I]; TXT[I]=TXT[J]; TXT[J]=AIDE; } puts(TXT); /* ou printf("%s\n",TXT); */ return 0; }

Exercice #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ char TXT[201]; /* chane donne */ int I,J; /* indices courants */ /* Saisie des donnes */ printf("Entrez une ligne de texte (max.200 caractres) :\n"); gets(TXT); /* Eliminer les lettres 'e' et comprimer : */ /* Copier les caractres de I vers J et incrmenter J */ /* seulement pour les caractres diffrents de 'e'. */ for (J=0,I=0 ; TXT[I] ; I++) { TXT[J] = TXT[I]; if (TXT[I] != 'e') J++; } /* Terminer la chane !! */ TXT[J]='\0'; /* Edition du rsultat */ puts(TXT); return 0; }

Rappel gnral et mise niveau


Les fonctions de <string>
La bibliothque <string> fournit une multitude de fonctions pratiques pour le traitement de chanes de caractres. Voici une brve description des fonctions les plus frquemment utilises. Dans le tableau suivant, <n> reprsente un nombre du type int. Les symboles <s> et <t> peuvent tre remplacs par : * une chane de caractres constante * le nom d'une variable dclare comme tableau de char un pointeur sur char

Rappel gnral et mise niveau


Fonctions pour le traitement de chanes de caractres
strlen(<s>) fournit la longueur de la chane sans compter le '\0' final strcpy(<s>, <t>) strcat(<s>, <t>) strcmp(<s>, <t>) ngatif si <s> prcde <t> zro si <s> est gal <t> positif si <s> suit <t> strncpy(<s>, <t>, <n>) strncat(<s>, <t>, <n>) copie au plus <n> caractres de <t> vers <s> ajoute au plus <n> caractres de <t> la fin de <s> copie <t> vers <s> ajoute <t> la fin de <s> compare <s> et <t> lexicographiquement et fournit un rsultat:

Rappel gnral et mise niveau


Exercice Ecrire un programme qui demande l'introduction du nom et du prnom de l'utilisateur et qui affiche alors la longueur totale du nom sans compter les espaces. Employer la fonction strlen. Exemple: Introduisez votre nom et votre prnom: Mickey Mouse Bonjour Mickey Mouse ! Votre nom est compos de 11 lettres. Exercice Ecrire un programme qui lit deux chanes de caractres CH1 et CH2, les compare lexicographiquement et affiche le rsultat: Exemple: Introduisez la premire chane: ABC Introduisez la deuxime chane: abc "ABC" prcde "abc"

Rappel gnral et mise niveau


Exercice Ecrire un programme qui lit deux chanes de caractres CH1 et CH2 et qui copie la premire moiti de CH1 et la premire moiti de CH2 dans une troisime chane CH3. Afficher le rsultat. a) Utiliser les fonctions spciales de <string>. b) Utiliser uniquement les fonctions gets et puts. Exercice Ecrire un programme qui lit un verbe rgulier en "er" au clavier et qui en affiche la conjugaison au prsent de l'indicatif de ce verbe. Contrlez s'il s'agit bien d'un verbe en "er" avant de conjuguer. Utiliser les fonctions gets, puts, strcat et strlen. Exemple: Verbe : fter je fte tu ftes il fte nous ftons vous ftez ils ftent

Exercice #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char NOM[40], PRENOM[40]; printf("Introduisez votre nom et votre prnom: \n"); scanf("%s %s", NOM, PRENOM); printf("\nBonjour %s %s !\n", NOM, PRENOM); printf("Votre nom est compos de %d lettres.\n", strlen(NOM) + strlen(PRENOM)); /* ou bien printf("Votre nom est compos de %d lettres.\n", strlen(strcat(NOM,PRENOM))); */ return 0; }

Exercice #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { /* Dclarations */ char CH1[200], CH2[200]; /* chanes entres */ int RES; /* rsultat de la fonction strcmp */ printf("Introduisez la premire chane de caractres : "); gets(CH1); printf("Introduisez la deuxime chane de caractres : "); gets(CH2); /* Comparaison et affichage du rsultat */ RES = strcmp(CH1,CH2); if (RES<0) printf("\"%s\" prcde \"%s\"\n",CH1 ,CH2); else if (RES>0) printf("\"%s\" prcde \"%s\"\n",CH2 ,CH1); else printf("\"%s\" est gal \"%s\"\n",CH1, CH2); return 0; }

Exercice Utiliser les fonctions spciales de <string>. #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { /* Dclarations */ char CH1[100], CH2[100]; /* chanes donnes */ char CH3[100]=""; /* chane rsultat */ /* Saisie des donnes */ printf("Introduisez la premire chane de caractres : "); gets(CH1); printf("Introduisez la deuxime chane de caractres : "); gets(CH2); /* Traitements */ strncpy(CH3, CH1, strlen(CH1)/2); strncat(CH3, CH2, strlen(CH2)/2); /* Affichage du rsultat */ printf("Un demi \"%s\" plus un demi \"%s\" donne \"%s\"\n", CH1, CH2, CH3); return 0; }

Exercice Utiliser uniquement les fonctions gets et puts. #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ char CH1[100], CH2[100]; /* chanes donnes */ char CH3[100]=""; /* chane rsultat */ /* Copier la premire moiti de CH2 vers CH3 */ int L1,L2; /* longueurs de CH1 et CH2 */ J=I; int I; /* indice courant dans CH1 et CH2 */ for (I=0 ; I<(L2/2) ; I++) int J; /* indice courant dans CH3 */ { /* Saisie des donnes */ puts("Introduisez la premire chane de caractres : "); CH3[J]=CH2[I]; gets(CH1); J++; puts("Introduisez la deuxime chane de caractres : "); } gets(CH2); /* Terminer la chane CH3 */ /* Dtermination les longueurs de CH1 et CH2 */ for (L1=0; CH1[L1]; L1++) ; CH3[J]='\0'; for (L2=0; CH2[L2]; L2++) ; /* Affichage du rsultat */ /* Copier la premire moiti de CH1 vers CH3 */ puts("Chane rsultat : "); for (I=0 ; I<(L1/2) ; I++) CH3[I]=CH1[I]; puts(CH3);
return 0; }

Exercice #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { /* Dclarations */ char VERB[20]; /* chane contenant le verbe */ strcat(AFFI, "e"); char AFFI[30]; /* chane pour l'affichage */ puts(AFFI); int L; /* longueur de la chane */ /* Saisie des donnes */ printf("Verbe : "); ... gets(VERB); /* Contrler s'il s'agit d'un verbe en 'er' */ AFFI[0]='\0'; L=strlen(VERB); if ((VERB[L-2]!='e') || (VERB[L-1]!='r')) strcat(AFFI, "ils "); puts("\aCe n'est pas un verbe du premier groupe.!"); strcat(AFFI, VERB); else { strcat(AFFI, "ent"); /* Couper la terminaison 'er'. */ puts(AFFI); VERB[L-2]='\0'; } /* Conjuguer ... */ AFFI[0]='\0'; return 0; strcat(AFFI, "je "); } strcat(AFFI, VERB);

Rappel gnral et mise niveau


Les fonctions de <ctype>
Les fonctions de <ctype> servent classifier et convertir des caractres. Les symboles nationaux (, , , , , , ...) ne sont pas considrs. Les fonctions de <ctype> sont indpendantes du code de caractres de la machine et favorisent la portabilit des programmes. Dans la suite, <c> reprsente une valeur du type int qui peut tre reprsente comme caractre. Fonctions de classification et de conversion Les fonctions de classification suivantes fournissent un rsultat du type int diffrent de zro, si la condition respective est remplie, sinon zro.

Rappel gnral et mise niveau


Tableaux de chanes de caractres
Souvent, il est ncessaire de mmoriser une suite de mots ou de phrases dans des variables. Il est alors pratique de crer un tableau de chanes de caractres, ce qui allgera les dclarations des variables et simplifiera l'accs aux diffrents mots (ou phrases). Dclaration, initialisation et mmorisation: Un tableau de chanes de caractres correspond un tableau deux dimensions du type char, o chaque ligne contient une chane de caractres. La dclaration char JOUR[7][9]; rserve l'espace en mmoire pour 7 mots contenant 9 caractres (dont 8 caractres significatifs)

Rappel gnral et mise niveau


Tableaux de chanes de caractres
Initialisation: Lors de la dclaration il est possible d'initialiser toutes les composantes du tableau par des chanes de caractres constantes: char JOUR[7][9]= {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};

Les tableaux de chanes sont mmoriss ligne par ligne. La variable JOUR aura donc besoin de 7*9*1 = 63 octets en mmoire.

Rappel gnral et mise niveau


Tableaux de chanes de caractres
Accs aux diffrentes composantes: Il est possible d'accder aux diffrentes chanes de caractres d'un tableau, en indiquant simplement la ligne correspondante. Exemple L'excution des trois instructions suivantes: char JOUR[7][9]= {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"}; int I = 2; printf("Aujourd'hui, c'est %s !\n", JOUR[I]); affichera la phrase: Aujourd'hui, c'est mercredi !

Rappel gnral et mise niveau


Tableaux de chanes de caractres
Affectation: Des expressions comme JOUR[I] reprsentent l'adresse du premier lment d'une chane de caractres. N'essayez donc pas de 'modifier' une telle adresse par une affectation directe ! Attention!

L'attribution d'une chane de caractres une composante d'un tableau de chanes se fait en gnral l'aide de la fonction strcpy: Exemple La commande strcpy(JOUR[4], "Friday"); changera le contenu de la 5e composante du tableau JOUR de "vendredi" en "Friday".

Rappel gnral et mise niveau


Tableaux de chanes de caractres
Affectation: Des expressions comme JOUR[I] reprsentent l'adresse du premier lment d'une chane de caractres. N'essayez donc pas de 'modifier' une telle adresse par une affectation directe ! Attention!

L'attribution d'une chane de caractres une composante d'un tableau de chanes se fait en gnral l'aide de la fonction strcpy: Exemple La commande strcpy(JOUR[4], "Friday"); changera le contenu de la 5e composante du tableau JOUR de "vendredi" en "Friday".

Rappel gnral et mise niveau


Tableaux de chanes de caractres
Accs aux caractres: Evidemment, il existe toujours la possibilit d'accder directement aux diffrents caractres qui composent les mots du tableau. Exemple L'instruction for(I=0; I<7; I++) printf("%c ", JOUR[I][0]); va afficher les premires lettres des jours de la semaine: l m m j v s d

Rappel gnral et mise niveau


Exercice Ecrire un programme qui lit un nombre entre 1 et 7 et qui affiche le nom du jour de la semaine correspondant: "lundi" pour 1 "mardi" pour 2 ... ... "dimanche" pour 7 Utiliser le premier lment du tableau pour mmoriser un petit message d'erreur. Exercice Ecrire un programme qui lit 5 mots, spars par des espaces et qui les affiche ensuite dans une ligne, mais dans l'ordre inverse. Les mots sont mmoriss dans un tableau de chanes de caractres. Exemple voici une petite phrase ! ! phrase petite une voici

Rappel gnral et mise niveau


Exercice Refaire (Conjugaison des verbes rguliers en "er") en utilisant deux tableaux de chanes de caractres: SUJ pour les sujets TERM pour les terminaisons Employez les fonctions printf, scanf, strlen. Exercice Ecrire un programme qui lit 10 mots et les mmorise dans un tableau de chanes de caractres. Trier les 10 mots lexicographiquement en utilisant les fonctions strcmp et strcpy. Afficher le tableau tri. Utilisez la mthode de tri par slection directe

Exercice #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int N; /* nombre entr */ char JOUR[8][9] = {"\aErreur!", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi","dimanche"}; /* Saisie du nombre */ printf("Entrez un nombre entre 1 et 7 : "); scanf("%d", &N); /* Affichage du rsultat - pour perfectionnistes */ if (N>0 && N<8) printf("Le %de%c jour de la semaine est %s.\n", N, (N==1)?'r':' ', JOUR[N]); else puts(JOUR[0]); return 0; }

Exercice #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ char MOT[5][50]; /* tableau pour les 5 mots */ int I; /* indice courant */ /* Saisie des mots */ printf("Entrez 5 mots, spars par des espaces :\n"); /* Aprs le retour la ligne, scanf lit */ /* les 5 donnes la fois. */ for (I=0; I<5; I++) scanf("%s", MOT[I]); /* Affichage du rsultat */ for (I=4; I>=0; I--) printf("%s ", MOT[I]); printf("\n"); return 0; }

{ Exercice /* Couper la terminaison 'er'. */ #include <stdio.h> int main(int argc, char *argv[]) VERB[L-2]='\0'; { /* Conjuguer ... */ /* Dclarations */ /* Sujets et terminaisons */ for (I=0; I<6; I++) char SUJ[6][5] = {"je","tu","il","nous","vous","ils"}; printf("%s %s%s\n",SUJ[I], VERB, TERM[I]); char TERM[6][5] = {"e","es","e","ons","ez","ent"}; } char VERB[20]; /* chane contenant le verbe */ int L; /* longueur de la chane */ return 0; int I; /* indice courant */ } /* Saisie des donnes */ printf("Verbe : "); scanf("%s", VERB); /* Contrler s'il s'agit d'un verbe en 'er' */ L=strlen(VERB); if ((VERB[L-2] != 'e') || (VERB[L-1] != 'r')) printf("\"%s\" n'est pas un verbe du premier groupe.\n",VERB); else

/* Recherche du prochain mot droite de A[I] */ Exercice PMOT=I; #include <stdio.h> #include <string.h> for (J=I+1; J<10; J++) int main(int argc, char *argv[]) if (strcmp(MOT[J], MOT[PMOT]) < 0) { /* Dclarations */ PMOT=J; char MOT[10][50]; /* tableau de 10 mots trier */ /* Echange des mots l'aide de strcpy */ char AIDE[50]; /* chane d'aide pour la permutation */ strcpy(AIDE, MOT[I]); int I; /* rang partir duquel MOT n'est pas tri */ strcpy(MOT[I], MOT[PMOT]); int J; /* indice courant */ int PMOT; /* indique la position du prochain mot */ strcpy(MOT[PMOT], AIDE); /* dans la suite lexicographique. */ } /* Saisie des donnes */ /* Edition du rsultat */ for (J=0; J<10; J++) { printf("Tableau tri lexicographiquement :\n"); printf("Mot %d : ", J); for (J=0; J<10; J++) gets(MOT[J]); /* ou : scanf ("%s\n", MOT[J]); */ puts(MOT[J]); /* ou : printf("%s\n",MOT[J]); */ } /* Tri du tableau par slection directe du */ printf("\n"); /* prochain mot dans la suite lexicographique. */ return 0; for (I=0; I<9; I++) { }

Das könnte Ihnen auch gefallen