Vous êtes sur la page 1sur 93

Atelier de programmation 1

Premire
partie

Sries des exercices

Atelier de programmation 1

Srie1 : Introduction, Les bases du langage C

Rappel du cours
Comparons d'abord la dfinition du programme en C avec celle en langage algorithmique.
HELLO_WORLD en langage algorithmique
programme HELLO_WORLD
| (* Notre premier programme en C *)
| crire "hello, world"
fprogramme
HELLO_WORLD en C
#include <stdio.h>
|main()
|/* Notre premier programme en C */
|{
| printf("hello, world\n");
| return 0;
|}
Les noms des fonctions et des variables en C sont composs d'une suite de lettres et de chiffres. Le
premier caractre doit tre une lettre. Le symbole '_' est aussi considr comme une lettre.
* L'ensemble des symboles utilisables est donc:
{0,1,2,...,9,A,B,...,Z,_,a,b,...,z}
* Le premier caractre doit tre une lettre (ou le symbole '_') - voir aussi Remarques -.
* C distingue les majuscules et les minuscules, ainsi:
'Nom_de_variable' est diffrent de 'nom_de_variable'
La fonction main est la fonction principale des programmes en C: Elle se trouve obligatoirement dans
tous les programmes. L'excution d'un programme entrane automatiquement l'appel de la
fonction main.

Exercice 1 :
Ecrire un programme qui affiche une date sous la forme jj/mm/aa en utilisant les fonctions de la
librairie standard C.

Exercice 2 :
Qu'affichent les instructions suivantes:

Atelier de programmation 1

int x = 9;
int y = x + 10;
printf("%d:%d:%d y", x, y, y );
a) 9:19:19:19
b) 9:19:19 y
c)

%d:%d:%d y

Exercice 3 :
Ecrire un programme qui affiche la taille des types suivants : char, int, float, double, short et long.

Exercice 4 :
Ecrire un programme qui affiche les 4 lignes suivantes :
'/' = /
'\' = \
''' = '
'"' = "
Exercice 5 :
Ecrire un programme en C qui permet de calculer lair et le primtre dun carr.

Atelier de programmation 1

Correction de la Srie1

Exercice 1 :
#include stdio.h
Void main()
{
/* declaration des variables*/
Int j,m,a;
/* saisie des donnees*/
printf("enter le jour");
scanf(%i,&j);
printf("enter le mois");
scanf(%i,&m);
printf("enter lannee ");
scanf(%i,&a);
/* affichage du resultat */
printf(la date est %2i/%2i/%2i, j,m,a);

}
Exercice 2:
Le programme affiche 9:19:19 y
Pour afficher un ensemble de variables il faut toujours mettre leurs types dans un message (exemple
%i %c ou %f), et puis les citer dans lordre

Exercice 3:
#include stdio.h
Void main()
{
printf("\nTaille des types:\n");
printf("

char :

%d\n", sizeof(char));

printf("

int :

%d\n", sizeof(int));

printf("

float :

%d\n", sizeof(float));

printf("

double : %d\n", sizeof(double));

Atelier de programmation 1

printf("

short :

%d\n", sizeof(short));

printf("

long :

%d\n", sizeof(long));

}
Exercice 4 :
#include stdio.h
Void main()
{

printf("\'/\' = /

\n");

printf("\'\\\' = \\

\n");

printf("\'\'\' = \'

\n");

printf("\'\"\' = \"

\n");

}
Exercice 5 :
#include stdio.h
Void main()
{

float c, Perimetre, Aire ;


printf("Donner le cote du carre") ;
scanf("%f", &c) ;
Perimetre=4*c ;
Aire=c*c;
printf("Le perimetre est %f", Perimetre);
printf("Laire est %f", Aire);
}

Atelier de programmation 1

Srie 2: Les structures conditionnelles

Rappel du cours
On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie
ou non.
La structure alternative en langage algorithmique
si (<expression logique>)
alors
<bloc d'instructions 1>
sinon
<bloc d'instructions 2>
finssi
* Si l'<expression logique> a la valeur logique vrai,
alors le <bloc d'instructions 1> est excut
* Si l'<expression logique> a la valeur logique faux,
alors le <bloc d'instructions 2> est excut
La structure alternative en C
les 'conditions' en C peuvent tre des expressions quelconques qui fournissent un rsultat
numrique. La valeur zro correspond la valeur logique faux et toute valeur diffrente de zro est
considre comme vrai.
if ( <expression> )
<bloc d'instructions 1>
else
<bloc d'instructions 2>
Switch : Selon valeur expression faire
L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une mme variable. Ce
branchement conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable, car cette
opration aurait t complique (mais possible) avec des if imbriqus. Sa syntaxe est la suivante :
switch (Variable) {
case Valeur1 :
Liste d'instructions;
break;
case Valeur2 :
Liste d'instructions;
break;
Default
Liste d'instructions;
}

Atelier de programmation 1

Les parenthses qui suivent le mot cl switch indiquent une expression dont la valeur est teste
successivement par chacun des case. Lorsque l'expression teste est gale une des valeurs
suivant uncase, la liste d'instructions qui suit celui-ci est excute. Le mot cl break indique la
sortie de la structure conditionnelle. Le mot cl default prcde la liste d'instructions qui sera
excute si l'expression n'est jamais gale une des valeurs.
N'oubliez pas d'insrer des instructions break entre chaque test, ce genre d'oubli est difficile
dtecter car aucune erreur n'est signale...
En effet, lorsque l'on omet le break, l'excution continue dans les blocs suivants !
`
Exercice 1 :
Ecrire un programme qui calcule, le maximum de 2 entiers a et b et qui affiche le rsultat lcran.
Exercice 2 :
Ecrire un programme qui dtermine si un entier x est pair.

Exercice 3 :
On veut crire un programme en C qui simule le traitement du jeu suivant :
On a deux joueurs. Chaque joueur saisit un entier entre 0 et 6 Le programme calcule alors leur
somme. Si la somme correspond au code ASCII dune lettre voyelle le premier joueur obtient
(26*code ASCII) points, le deuxime 10 points. Si la somme correspond au code ASCII dun
caractre numrique pair, le premier joueur obtient 10 points et le deuxime (26*code ASCII) points.
Dans tous les autres cas, le joueur qui a donne la valeur la plus grande comme nombre de points. Le
vainqueur est celui qui a obtenu le nombre de points le plus grand.
Le programme affichera comme rsultat le vainqueur ainsi que son nombre de points.
Exercice 4 :
Ecrire un programme C qui perm et d'effectuer les oprations simples (+, -, *, /).
programme donnerait par exemple 5 + 11 = 15.
Exercice 5 :
Ecrire un programme qui permet de vrifier si une date est valide ou pas. On suppose que le jour,
le mois et lanne sont des entiers, et (1900< anne <2050).

Atelier de programmation 1

Correction de la srie 2

Exercice 1:
#include stdio.h
void main( )
{
int a,b;
printf("Entrez un entier a: ");
scanf("%d", &a);
printf("Entrez un entier b: ");
scanf("%d", &b);
if(a>b)
printf("\nLe maximum est: %d", a) ;
else if(b>a)
printf("\nLe maximum est: %d", b) ;
else
printf("\nles deux valeurs sont egales, Le maximum est
%d", a ) ;
}

Exercice 2:
#include stdio.h
void main( )
{
int a;
printf("Entrez un entier a: ");
/* loperateur modulo % retourne le reste dune division
entire*/
if(x%2==0)
printf("\nLentier est pair ") ;
else
printf("("\nLentier est impair ")

Atelier de programmation 1

Exercice 3:
#include stdio.h
void main( )
{
int valJ1,valJ2,som,nbpoints1,nbpoints2;
do{
printf("1er joueur :\n Donner un entier :");
scanf("%i",&valJ1);
}while(valJ1<0||valJ1>61);
do{
printf("\n 2eme joueur :\n Donner un entier :");
scanf("%i",&valJ2);
}while(valJ2<0||valJ2>61);
som=valJ1+valJ2;
//conversion en miniscule
if(som=='A'||som=='E'||som=='I'||som=='O'||som=='U'||som=='Y'
)
som=som+'a'-'A';
switch(som)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'y':
nbpoints1=26*som;
nbpoints2=10;
break;
case '0':
case '2':
case '4':

Atelier de programmation 1

case '6':
case '8':
nbpoints1=10;
nbpoints2=26*som;
break;
default:
if(valJ1>valJ2)
nbpoints1=som;
else
if(valJ2>valJ1)
nbpoints2=som;
else
{
nbpoints1=valJ1;
nbpoints2=valJ2;
}
}
if (nbpoints1>nbpoints2)
printf("Joueur1 est le vainqueur avec un score=%i
",nbpoints1);
else
if(nbpoints2>nbpoints1)
printf("Joueur2 est le vainqueur \n
score=%i",nbpoints2);
else
printf("Partie nulle ");
}

Exercice 4

#include stdio.h
void main( )
{
float x,y,res; char op;
int ind=0;
printf("Donner le 1er operande :");

Atelier de programmation 1

scanf("%f",&x);
printf("Donner l'operateur :");
scanf("%c",&op);
printf("Donner le 2eme operande :");
scanf("%f",&y);
switch(op)
{
case '+':
res=x+y;
break;
case '-':
res=x-y;
break;
case '*':
res=x*y;
break;
case '/':
if(y!=0)
res=x/y;
else
{
printf("diviseur nul
ind=1 ;
}
break;
default:
printf("operateur erronee) ;
}

Exercice 5 :

#include stdio.h
void main( )
{
int jour, mois, annee, valide=1;
do{

Atelier de programmation 1

printf("donner le jour");
scanf("%i", &jour);
printf("donner le mois");
scanf("%i", &mois);
printf("donner l'annee");
scanf("%i", &annee);
if((annee<1900)&&(annee>2050))
valide=0;
else
{
switch(mois)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: if(jour>31)
valide=0;
break;
case 4:
case 6:
case 9:
case 11: if (jour>30)
valide=0;
break;
case 2:
if
((jour>29)&&(((annee%4==0)&&(annee%100!=0))||(
annee%400==0)))
valide=0;
else if((jour!=28)&&(!(((
annee%4==0)&&(annee%100!=0))||(annee%400==0)))
)
valide=0;
break;

Atelier de programmation 1

default: valide=0;
}
if (valide==0)
printf("date invalide, saisissez une autre
date");
else
printf("date valide");
}
}
while (valide==0);
}

Atelier de programmation 1

Srie 3: Les Structures rptitives

Rappel du cours
En C, nous disposons de trois structures qui nous permettent la dfinition de boucles conditionnelles:
la structure : while
while ( <expression> )
<bloc d'instructions>
* Tant que l'<expression> fournit une valeur diffrente de zro,
le <bloc d'instructions> est excut.
* Si l'<expression> fournit la valeur zro,
l'excution continue avec l'instruction qui suit le bloc d'instructions.
* Le <bloc d'instructions> est excut zro ou plusieurs fois.
la structure : do while
do
<bloc d'instructions>
while ( <expression> );
Le <bloc d'instructions> est excut au moins une fois
et aussi longtemps que l'<expression> fournit une valeur diffrente de zro.
la structure : for
Le plus souvent, for est utilis comme boucle de comptage (le nombre ditrations est connu au
pralable) :
for ( <init.> ; <cond. rptition> ; <compteur> )
<bloc d'instructions>
<init> cette instruction est value une fois avant le passage de la boucle.
Elle est utilise pour initialiser les donnes de la boucle.
<cond> est value avant chaque passage de la boucle.
Elle est utilise pour dcider si la boucle est rpte ou non.
<compteur> cette instruction est value la fin de chaque passage de la boucle.
Elle est utilise pour rinitialiser les donnes de la boucle.

Atelier de programmation 1

Exercice 1 :
crire un programme qui affiche la table de multiplication dun entier n.
Par exemple, pour n=4, la fonction affichera :
1x4=4
2x4=8
3 x 4 = 12
4 x 4 = 16

10 x 4 = 40
Exercice 2 :
Ecrire la un programme qui permet dafficher un ensemble dtoiles sous cette forme (ici n vaut
*
**
***
****
*****
****
***
**
*
Exercice 3 :
Ecrire un programme qui affiche le minimum, le maximum et la moyenne d'une suite d'entiers positifs
entrs au clavier. On arrtera la saisie quand le nombre -1 est entr, comme dans l'exemple suivant
:
Entrez un entier positif : 5
Entrez un entier positif : 2
Entrez un entier positif : 3
Entrez un entier positif : -1
La valeur minimum est : 2
La valeur maximum est : 5
La moyenne de ces 3 entiers vaut 3.333333

Exercice 4 :
Ecrire un programme en C qui affiche tous les nombres premiers compris entre [1099]. Il existe

Atelier de programmation 1

de nombreuses faons de savoir si un nombre est de la "taille" du nombre. Pour lintervalle [10,99]. il
suffit de tester si le nombre est divisible par 2, 3, 5, 7.

Atelier de programmation 1

Correction de la Srie 3

Exercice 1 :
#include stdio.h
void main( )

{
int I,n;
printf (donner un entire n) ;
scanf(%i, &n)

for (i=1; i<=10; i++)


{
printf("%d x %d = %d\n", i, n, i*n);
}
}
Exercice 2 :
#include stdio.h
void main( )

{
int I,n;
int j;
printf (donner un entire n) ;
scanf(%i, &n)

for (i=1; i<=n; i++)


{
for (j=1; j<=i; j++)
printf("*");

printf("\n");
}

Atelier de programmation 1

for (i=n-1; i>=1; i--)


{
for (j=1; j<=i; j++)
printf("*");

printf("\n");

}
}
Exercice 3 :
#include stdio.h
void main( )
{
int sum = 0;
int count = 0;
int min = INT_MAX;
int max = INT_MIN;
int x=0;

while (x!=-1)
{
printf("Entrez un entier positif: ");
scanf("%d", &x);
if (x !=-1)
{
sum +=x;
count++;
if (x<min)
min = x;

if (x>max)
max= x;
}
}

float avg = 0;

Atelier de programmation 1

if (count>0)
avg=(float)sum/count;

printf("La valeur minimum est : %d \n", min);


printf("La valeur maximum

est : %d \n", max);

printf("La moyenne de ces %d entiers vaut


avg);
}

Exercice 4 :
#include stdio.h
void main( )
{
for(int i=10; i<100; i++)
{
if((i%2!=0)&&(i%3!=0)&&(i%5!=0)&&(i%7!=0))
printf("%i \n", i);
}
}

: %f \n", count,

Atelier de programmation 1

Srie 4 : Les Tableaux

Un tableau (uni-dimensionnel) 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 ladimension du tableau.
Dclaration de tableaux en C
<TypeSimple> <NomTableau>[<Dimension>];
Initialisation
Lors de la dclaration d'un tableau, on peut initialiser les composantes du tableau, en
indiquant la liste des valeurs respectives entre accolades.
Float B[5] = {10.1, 2.5, 3.8, 4.0, 5.6};
int C[] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};

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]
- l'accs au premier lment du tableau se fait par T[0]
- l'accs au dernier lment du tableau se fait par T[N-1]
Exemple daffectation de valeurs
main()
{
int A[5];
int I; /* Compteur */
for (I=0; I<5; I++)
scanf("%d", &A[I]);
return 0;
}

Exercice 1:
Ecrire un programme qui permet de fusionner deux tableaux tris dans le sens croissant dans un
nouveau tableau. Ce dernier doit de mme tre tri.
Exemple :

Atelier de programmation 1

Exercice 2:
Soit un tableau contenant une liste de N nombres entiers positifs, dont la valeur est comprise entre
1 et 100. Ecrire un programme en C qui calcule le nombre doccurrences de chaque valeur
Contenue dans le tableau sachant quelle peut apparaitre plusieurs fois.
a) Ecrire une premire version qui nutilise quun seul tableau.
b) b) Ecrire une seconde version qui utilise deux tableaux. Le premier contiendra les donnes et
le deuxime les occurrences de chaque nombre entier.

NB : On peut utiliser lentier a traiter comme indice du deuxime tableau

Atelier de programmation 1

Correction de la srie 4

Exercice 1 :

#include <stdio.h>
Void main()
{
/* Dclarations */
/* Les tableaux et leurs dimensions */
int A[50], B[50], FUS[100];
int N, M;
int IA, IB, IFUS; /* indices courants */

/* Saisie des donnes */


printf("Dimension du tableau A (max.50) : ");
scanf("%d", &N );
printf("Entrer les lments de A dans l'ordre croissant
:\n");
for (IA=0; IA<N; IA++)
{
printf("Elment A[%d] : ", IA);
scanf("%d", &A[IA]);
}
printf("Dimension du tableau B (max.50) : ");
scanf("%d", &M );
printf("Entrer les lments de B dans l'ordre croissant
:\n");
for (IB=0; IB<M; IB++)
{
printf("Elment B[%d] : ", IB);
scanf("%d", &B[IB]);
}

/* Affichage des tableaux A et B */

Atelier de programmation 1

printf("Tableau A :\n");
for (IA=0; IA<N; IA++)
printf("%d ", A[IA]);
printf("\n");

printf("Tableau B :\n");
for (IB=0; IB<M; IB++)
printf("%d ", B[IB]);
printf("\n");

/* Fusion des lments de A et B dans FUS */


/* de faon ce que FUS soit aussi tri. */
IA=0; IB=0; IFUS=0;
while ((IA<N) && (IB<M))
if(A[IA]<B[IB])
{
FUS[IFUS]=A[IA];
IFUS++;
IA++;
}
else
{
FUS[IFUS]=B[IB];
IFUS++;
IB++;
}
/* Si IA ou IB sont arrivs la fin de leur tableau, */
/* alors copier le reste de l'autre tableau.
while (IA<N)
{
FUS[IFUS]=A[IA];
IFUS++;
IA++;
}
while (IB<M)
{
FUS[IFUS]=B[IB];

*/

Atelier de programmation 1

IFUS++;
IB++;
}

/* Edition du rsultat */

printf("Tableau FUS :\n");


for (IFUS=0; IFUS<N+M; IFUS++)
printf("%d ", FUS[IFUS]);
printf("\n");

Exercice2:

a)
#include stdio.h
void main( )
{
int tab[100], nb=0,nbreElement=0,i,j, trouve, occurence=0;
while ((nb!=-1)&&(nb<100))
{
printf("entrez un entier positif (
scanf("%d",&nb);
if (nb>=0)
tab[nbreElement++]=nb;
}
for(i=0;i<nbreElement;i++)
{
trouve =0; j=0;
while((j<i)&&(trouve==0))
{
if (tab[i]==tab[j])
trouve=1;
else
j++;
}

Atelier de programmation 1

if(trouve==0)
{
occurence=1;
for(j=i+1;j<nbreElement;j++)
{
if (tab[i]==tab[j])
occurence ++;
}
printf("%d: %d occurence(s) \n",tab[i],occurence);
}
}
}

b)
#include stdio.h
void main( )
{
int tab[100],tab_Occ[100],
nb=0,nbreElement=0,i,j,occurence=0;
while ((nb!=-1)&&(nb<100))
{
printf("entrez un entier positif , (-1 pour finir)");
scanf("%d",&nb);
if (nb>=0)
{
tab[nbreElement]=nb;
nbreElement++;
}
}
for(i=0;i<100; i++)
{
tab_Occ[i]=0;
}
for(i=0;i<nbreElement;i++)
{
tab_Occ[tab[i]]=tab_Occ[tab[i]]+1;
}

Atelier de programmation 1

for(j=0;j<100; j++)
{
if (tab_Occ[j]!=0)
printf("%d: %d occurence(s)
}
}
}

Atelier de programmation 1

Srie5: les chaines 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 <NomVariable> [<Longueur>];
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'. Ainsi, pour un
texte de n caractres, nous devons prvoir n+1 octets.
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";
Les fonctions prdfinies
strlen(<s>)
fournit la longueur de la chane sans compter le '\0' final
strcpy(<s>,<t>) copie <t> vers <s>
strcat(<s>, <t>) ajoute <t> la fin de <s>
compare <s> et <t> lexicographiquement et fournit un
strcmp(<s>,<t>)
rsultat:
ngatif
zro
positif

si <s> prcde <t>


si <s> est gal
<t>
si <s> suit <t>

Exercice 1 :
crire un programme qui recherche une sous-chane de caractres dans une chane de caractres.
Par exemple, si la chane de caractres contient la valeur "programme d'ordinateur" et que la souschane recherche est "gramme d'or", la procdure de recherche doit indiquer que la sous-chane
existe et l'indice retourn doit tre gal 3.

Atelier de programmation 1

Exercice 2 :
Un mot est dit Palindrome s'il se lit de la mme manire dans le sens de lecture de droite gauche
que dans le sens de gauche droite. Par exemple, les mots "LAVAL" et "ADA" ''engage le jeu que
je le gagne '' sont des palindromes. crire un programme qui dit si une chane donne est un
palindrome.

Exercice 3 :
Ecrire un programme qui permet de nettoyer un tableau de caractres en liminant les espaces
superflus: chaque fois que l'on trouve une suite d'espaces, il faudra les liminer tous sauf un. Sachant
que le premier caractre du tableau et le dernier caractre sont diffrents du caractre espace.
Exercice 4 :
Ecrire un programme en C qui permet de saisir deux chaines de caractres ch1 et ch2 et de dduire
si elles sont quivalentes. Deux chaines sont dites quivalentes si elles contiennent les mmes lettres
mais pas ncessairement dans le mme ordre.
a) On suppose quune chaine ne peut pas contenir la mme lettre deux fois
b) On suppose quune chaine peut contenir la mme lettre plusieurs fois
Exemple :
a) ch1= azerty, ch2= yterza (quivalente)
b) ch1= aazerty, tazeryy (non quivalentes)

Atelier de programmation 1

Correction de la srie 5

Exercice 1 :

#include "stdio.h"
#include "string.h"
void main(int argc, char* argv[])
{
char ch[100], sch[100];
int i,j,pos,stop,existe;

printf("donner la chaine \t"); gets (ch);


printf("donner la sous chaine \t"); gets (sch);
i=0;
existe=0;
while ( (i<strlen(ch)- strlen(sch)+1) && (!existe))
{
j=0;
pos=i;
stop=0;
while ( (j<strlen(sch)) && (!stop))
{
if (ch[i]!=sch[j])
stop=1;
else
{ i++;

j++; }

}
if (!stop)
existe=1;
else
i=pos+1;
}
if (existe)
printf("%s existe dans %s a la position: %d \n\n", sch,
ch, pos);
else

Atelier de programmation 1

printf("%s n'existe pas dans %s \n\n",sch,ch);


}

Exercice2 :

#include "stdio.h"
#include "ctype.h" // toupper
#include "string.h"

int main(int argc, char* argv[])


{
char chaine [50];
int taille,i,continuer=1;

printf("entrer le mot a verifier:\t");


gets(chaine);

taille=strlen(chaine);
i=0;

while((i<taille-1)&&(continuer==1))
{

if (toupper(chaine[i])==toupper(chaine[(taille-1)]))
{
i++;
taille--;
}
else
{

if (chaine[i]==' ')
i++;
else
if (chaine[(taille-1)]==' ')
taille--;
else
continuer=0;

Atelier de programmation 1

}
}

if(chaine[i]==chaine[(taille-1)])
printf("cette chaine est un palindrome!!\n");
else
printf("cette chaine n'est pas un palindrome!!!\n");

return 0;
}

Exercice 3 :
#include "stdio.h"
#include "string.h"

void main(int argc, char* argv[])


{
char ch[100];
int i,j,N;
printf("donner la chaine \t");
gets(ch);
i=0;
N=strlen(ch);

while (i< (N-1)) // car le dernier caractere ne peut pas etre un


espace
{
if ((ch[i]==' ') &&

(ch[i+1]==' '))

{
for (j=i+1; j<(N-1); j++)
{ch[j]=ch[j+1];}

N--;

Atelier de programmation 1

ch[N]='\0'; // lors du dcalage de la chane, le dernier c


persiste dou on doit mettre fin a la chaine

}
else
i++;

}
printf("La chaine de caracteres devient %s \n", ch);
}

Exercice4:
#include "stdio.h"
#include "string.h"

Void main()
{
char ch1[10],

ch2[10];

int egaux=1, i=0;


printf("saisir ch1");
scanf("%s", ch1);
printf("saisir ch2");
scanf("%s", ch2);

if(strlen(ch1)!=strlen(ch2))
egaux=0;
else
{

while((egaux==1)&&(i<strlen(ch1)))
{
int j=0,trouve=0;
while((j<strlen(ch2)) && (trouve==0))
{

if (ch1[i]==ch2[j])
trouve=1;
else j++;

Atelier de programmation 1

}
if(trouve==0) egaux=0;
i++;
}
}
if(egaux==1)
printf("deux chaines equivalentes");
else
printf("non equivalentes");
}

b)

#include "stdio.h"
#include "string.h"

Void main()
{

char ch1[10],

ch2[10];

int egaux=1, i=0, occ1,occ2;


printf("saisir ch1");
scanf("%s", ch1);
printf("saisir ch2");
scanf("%s", ch2);

if(strlen(ch1)!=strlen(ch2))
egaux=0;
else
{

while((egaux==1)&&(i<strlen(ch1)))
{
occ1=0; occ2=0;

Atelier de programmation 1

for(int j=0;j<strlen(ch2); j++)


{
if (ch1[i]==ch1[j])
occ1++;
if (ch1[i]==ch2[j])
occ2++;
}

if(occ1!=occ2) egaux=0;
i++;
}
}
if(egaux==1)
printf("deux chaines equivalentes");
else
printf("non equivalentes");

Atelier de programmation 1

Srie 6 : Les matrices

Rappel du cours
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.
On appelle L le nombre de lignes du tableau et C le nombre de colonnes du tableau. L et C sont alors
les deux dimensions du tableau. Un tableau deux dimensions contient donc L*C composantes
Dclaration de tableaux deux dimensions en C
<TypeSimple> <NomTabl>[<DimLigne>][<DimCol>];
Initialisation
Lors de la dclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la
liste des valeurs respectives entre accolades. A l'intrieur de la liste, les composantes de chaque ligne
du tableau sont encore une fois comprises entre accolades. Pour amliorer la lisibilit des
programmes, on peut indiquer les composantes dans plusieurs lignes.
Exemples
short A[3][2] = {{1, 2 },
{10, 20 },
{100, 200}};
Accs un tableau deux dimensions en C
<NomTableau>[<Ligne>][<Colonne>]
les indices du tableau varient de 0 L-1, respectivement de 0 C-1.

Exercice 1
crire un programme permettant de transposer une matrice carre (tableau double dimension).
Exemple:

Exercice 2 :

==>

Atelier de programmation 1

crire un programme qui permet d'effectuer la multiplication de deux matrices A et B avec


respectivement les dimensions m x n et n x p. Noter que le nombre de colonnes de A doit tre gal
au nombre de lignes de B. Le rsultat de la multiplication est une matrice C de dimensions m x p
avec
n

cij = aik x bkj


k=1

10

25

36

21

15

17

28

19

Exercice 3 :

Un carr magique est un arrangement de nombres avec n lignes et n colonnes. La somme des
valeurs dans chaque ligne, colonne et diagonale est la mme. Par exemple, le carr suivant est
magique.

16

12

13

11

14

15

10

1) crire un programme qui permet de dterminer si un carr est magique.


2) Une autre condition pour un arrangement de nombres avec n lignes et n colonnes d'tre un vrai
carr magique est qu'il doit contenir tous les entiers 1, 2, ..., n2. Amliorer votre programme pour
qu'il vrifie galement cette condition

Atelier de programmation 1

Correction de la srie 6

Exercice1:
#include "stdio.h"
Void main()
{
int mat[100][100],
int i=0, j,x;
int trouve=0, prod=1;
// Saisir la taille de la matrice, une seule dimension car la
matrice est carre
do{
printf("Donnez un nbre de lignes de la matrice \n");
scanf("%i",&n);
}while ((n>=100)||(n<1));

/*Remplissage de la matrice*/

for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
printf ("ligne %d, colonne %d : ",i+1,j+1);
scanf ("%d",&A[i][j]);
}

Atelier de programmation 1

for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(i!=j)
{
x=mat[i][j];
mat[i][j]=mat[j][i];
mat[j][i]=x;
}
}
}
}

Exercice2:

#include "stdio.h"
Void main()
{
int i,j,k,m,n,p;
int A[100][100],B[100][100], C[100][100];
/* Saisie dimension matrice A*/
do{
printf("Donnez un nbre de ligne de A \n");

Atelier de programmation 1

scanf("%i",&m);
}while ((m>=100)||(m<1));
do{
printf("Donnez un nbre de colonne de A \n");
scanf("%i",&n);
}while ((n>=100)||(n<1));
/* Saisie dimension matrice B*/
// on connait dj son nombre de ligne qui est le nbre de
colonne de A
do{
printf("Donnez un nbre de colonne de B \n");
scanf("%i",&p);
}while ((p>=100)||(p<1));
/*Remplissage de la premiere matrice*/
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
printf ("ligne %d, colonne %d : ",i+1,j+1);
scanf ("%d",&A[i][j]);
}
}
/*Remplissage de la seconde matrice*/
for (i=0;i<n;i++)
{
for (j=0;j<p;j++)

Atelier de programmation 1

{
printf ("ligne %d, colonne %d : ",i+1,j+1);
scanf ("%d",&B[i][j]);
}
}
/*Initialisation de la matrice rsultante*/
for (i=0;i<m;i++)
{
for (j=0;j<p;j++)
{
C[i][j]=0;
}
}
/*Calcul de la matrice rsultante*/
for (i=0;i<m;i++)
{
for (j=0;j<p;j++)
{
for (k=0;k<n;k++)
{
C[i][j]=A[i][k]*B[k][j]+C[i][j];
}
}
}

/*Affichage de la matrice rsultante*/

Atelier de programmation 1

printf ("\nProduit matriciel :\n");


for (i=0;i<m;i++)
{
for (j=0;j<p;j++)
{
printf ("ligne %d,colonne %d : ",i+1,j+1);
printf ("%d\n",C[i][j]);
}
}
}
Exercice 3 :

1)
#include "stdio.h"
void main()
{
int n,magique,somL=0,somC=0,somD=0,somAD=0,som=0,i,k,j;
int tab[100][100] ;
do
{

printf ("Donnez taille du carre");


scanf("%d",&n) ;

}while ((n<1)||(n>=100));

for (i=0;i<n;i++)
{
for (j=0;j<n;j++)

Atelier de programmation 1

{
printf ("ligne %d, colonne %d : ",i+1,j+1);
scanf ("%d",&tab[i][j]);
}
}

magique=1; i=0 ;
do
{
if (i==0)
{
for(j=0 ;j<n ;j++)
{
somD=somD+tab[j][j];
somAD=somAD+tab[j][n-j-1];
}
if (somD!=somAD) magique=0; else som=somD;
}
if (magique==1)
{

somL=0;
for(k=0 ;k<n ;k++)
somL=somL+tab[i][k] ;
if (somL!=som) magique=0 ;
else
{

somC=0;
for(k=0 ;k<n ;k++)

Atelier de programmation 1

somC=somC+tab[k][i] ;
if (somC!=som) magique=0;
else i++;
}

}
}while((i<n)&&(magique==1));

if (magique==1)
printf("Carre magique");
else
printf("oooopss !! Rien de magique") ;
}
2)

k=1; int continuer=1;


while ((k<=n*n)&& (continuer==1))
{
i=0;int trouver=0;
while ((i<n) && (trouver==0))
{
j=0;
while (j<n && trouver==0)
{
if( tab[i][j]==k)
trouver=1;

Atelier de programmation 1

else
j++;
}
if (trouver==0)i++;
}
if (trouver==1)k++;
else continuer=0;
}
if (magique==1&&(k==(n*n)+1))
printf("Carre magique");
else
printf("oooopss !! Rien de magique");
}

Atelier de programmation 1

Srie 7 : les fonctions

Rappel du cours
La structuration de programmes en sous-programmes se fait en C l'aide de fonctions. Nous avons
dj utilis des fonctions prdfinies dans des bibliothques standard
(printf de <stdio>, strlen de <string>, pow de <math>, etc.). Dans ce chapitre, nous allons
dcouvrir comment nous pouvons dfinir et utiliser nos propres fonctions
Dfinition d'une fonction en C
Dans la dfinition d'une fonction, nous indiquons:
- le nom de la fonction
- le type, le nombre et les noms des paramtres de la fonction
- le type du rsultat fourni par la fonction
- les donnes locales la fonction
- les instructions excuter
<TypeRs> <NomFonct> (<TypePar1> <NomPar1>,
<TypePar2> <NomPar2>, ... )
{
<dclarations locales>
<instructions>
}
Exemple illustratif
Exemple
Avant de parler des dtails, penchons-nous sur un exemple. Dans le programme suivant, la
fonction main utilise les deux fonctions:
- ENTREE qui lit un nombre entier au clavier et le fournit comme rsultat. La fonction ENTREE n'a pas
de paramtres.
- MAX qui renvoie comme rsultat le maximum de deux entiers fournis comme paramtres.
#include <stdio.h>
main()
{
/* Prototypes des fonctions appeles */
int ENTREE(void);
int MAX(int N1, int N2);
/* Dclaration des variables */
int A, B;
/* Traitement avec appel des fonctions */
A = ENTREE();
B = ENTREE();
printf("Le maximum est %d\n", MAX(A,B));
}

Atelier de programmation 1

int ENTREE(void)
{
int NOMBRE;
printf("Entrez un nombre entier : ");
scanf("%d", &NOMBRE);
return NOMBRE;
}
/* Dfinition de la fonction MAX */
int MAX(int N1, int N2)
{
if (N1>N2)
return N1;
else
return N2;
}

Ecrire un programme permettant de grer un tableau dentier en offrant les fonctionnalits suivantes
Ecrire une fonction void saisieClav( int tab[], int *N) qui permet de permet de faire le remplissage
dun tableau de taille n
Ecrire une fonction void saisieAlea( int tab[], int *N) qui permet de remplir un tableau
alatoirement par des entiers appartenant [0 100].
Ecrire une fonction void affichage(int tab[], int N) qui permet dafficher le contenu dun tableau
Ecrire une fonction int max(int tab[], int N) qui retourne le maximum dans un tableau dentier

Ecrire une fonction int min(int tab[], int N) qui retourne le minimum dans un tableau dentier
Ecrire une fonction int modifier(int tab[], int *N, int ind) qui permet de modifier le contenu de la
case dindice ind (par une nouvelle valeur). La fonction retourne 0 si lindice est erron et 1 sinon.
7. Ecrire une fonction int recherche(int tab[], int N, int x) qui permet chercher un entier dans un
tableau et retourner sa positon (0 sil nexiste oas).
8. Ecrire une fonction int ajout(int tab[], int *N, int x, int pos) qui permet dajouter un entier a une
position donne . la fonction retourne 1 si lajout est effectu avec succs, 0 sinon.

Atelier de programmation 1

9. Ecrire une fonction int suppression(int tab[], int *N, int x) qui permet de supprimer un entier
donn dun tableau la fonction retourne 1 si la suppression est effectue avec succs, 0 sinon.
10. Ecrire une fonction void tri(int tab[], int N) permet de trier les lments du tableau dans le sens
croissant.

11. Ecrire une fonction int comparaison(int t1[], int N1, int t2[], int N2) qui retourne le nombre des
valeurs de t1 qui apparaissent dans t2 (On ne prend pas le nombre doccurrence en considration)
12. Ecrire une fonction char menu() qui permet dafficher un menu prsentant 11 choix
correspondant au 11 fonctions prsentes ci-dessus et retourne le choix de lutilisateur.
1. La saisie dun tableau au clavier
2. Le remplissage dun tableau dune manire alatoire
3. Laffichage du contenu du tableau
4. La dtermination du minimum
5. La dtermination du maximum
6. La modification dune case tant donn son indice
7. La recherche dun entier x
8. Lajout dun entier une position donne
9. La suppression dun entier x donn sil existe
10. Le tri du tableau
11. La comparaison de deux tableaux
Ecrire un programme principal qui affiche le menu ci-dessous et qui effectue le traitement adquat
selon le choix de lutilisateur. Le traitement se rpte tant que le choix de lutilisateur nest pas de
quitter lapplication

Atelier de programmation 1

Correction de la srie 7

Corrig
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void saisieClav( int tab[], int *N);


void saisieAlea( int tab[], int *N);
void affichage(int tab[], int N);

int max(int tab[], int N);


int min(int tab[], int N);
int modifier(int tab[], int *N, int ind);
int recherche(int tab[], int N, int x);
int ajout(int tab[], int *N, int x, int pos);
int suppression(int tab[], int *N, int x);
void tri(int tab[], int N);
int comparaison(int t1[], int N1, int t2[], int N2);
char menu();

void main()
{
char choix;
int T1[100],T2[100],ind,x,pos,N1,N2;
int res;
do{
choix=menu();
switch(choix)
{
case 'a': saisieClav(T1,&N1); break;
case 'b':
saisieAlea(T1,&N1);

Atelier de programmation 1

printf("Remplissage effectu avec


succs....\n");
break;
case 'c':
printf("La liste des elements du tableau
:\n");
affichage(T1,N1);
break;
case 'd':
printf("Le plus grand entier du tableau :\n");
max(T1,N1);
break;
case 'e':
printf("Le plus petit entier du tableau :\n");
min(T1,N1);
break;
case 'f':
printf("donner l'indice modifier : ");
scanf("%d",&ind); res=modifier(T1,&N1,ind);
if(res)
printf("modification effectue avec
succs....\n");
else
printf("La modification a
choue....\n");
break;
case 'g':
printf("donner l'entier chercher : ");
scanf("%d",&x); res=recherche(T1,N1,x);
if(res)
printf("L'entier %d existe la position
%d\n",x,res);
else
printf("L'entier %d n'appartient pas au
tableau....\n",x);
break;
case 'h':

Atelier de programmation 1

printf("donner l'entier ajouter : ");


scanf("%d",&x);
printf("donner la position d'ajout : ");
scanf("%d",&pos);
res=ajout(T1,&N1,x,pos);
if(res)
printf("Ajout effectu avec
succs....\n");
else
printf("L'ajout a echou....\n");
break;
case 'i':
printf("donner l'entier supprimer : ");
scanf("%d",&x); res=suppression(T1,&N1,x);
if(res)
printf("Suppression effectue avec
succs....\n");
else
printf("La suppression a echoue....\n");
break;
case 'j':
tri(T1,N1);
printf("Les elements du tableau tris :\n");
affichage(T1,N1);
break;
case 'k':
printf("Saisie du 2me tableau :\n");
saisieClav(T2,&N2);
res=comparaison(T1,N1,T2,N2); if(res==N1
&&N1==N2)
printf("Les 2 tableaux contiennent les
memes valeurs...\n");
else
if(res==N1)
printf("Toutes les valeurs de t1 ont t
identifies...\n");
else

Atelier de programmation 1

printf("Les 2 tableaux ne contiennent pas


les memes valeurs...\n");
break;
}

system("pause");

system("cls");
}while(choix!='l');
printf("a+\nFin de l'application....\n\n");

char menu()
{

char choix;
printf("selectionner un choix [a..l]\n");
printf("a. Saisie dun tableau au clavier\n");
printf("b. Remplissage dun tableau dune manire
alatoire\n");
printf("c. Affichage du contenu du tableau\n");
printf("d. Dtermination du minimum\n"); printf("e.
Dtermination du maximum\n");
printf("f. Modification dune case tant donn son
indice\n");
printf("g. Recherche dun entier x\n");
printf("h. Ajout dun entier une position donne\n");
printf("i. Suppression dun entier x donn sil
existe\n"); printf("j. Tri du tableau\n");
printf("k. Comparaison de deux tableaux\n");
printf("l. Quitter\n");
do{
choix=getchar();
fflush(stdin);
}while(choix<'a'||choix>'l');
return choix;
}

Atelier de programmation 1

void saisieClav( int tab[], int *N)


{
int i;
printf("donner le nombre des elts : ");
scanf("%d",N);
for(i=0;i<*N;i++)
{
printf("donner l'elts n %d ",i+1);
scanf("%i",&tab[i]);
}
}
void saisieAlea( int tab[], int *N)
{
int i;
srand(time(NULL));
printf("donner le nombre des elts : ");
scanf("%d",N);
for(i=0;i<*N;i++)
tab[i]=rand()%101;
}

void affichage(int tab[], int N)


{
int i; printf("\n\n");
for(i=0;i<N;i++)
printf("%5d",tab[i]);
printf("\n\n");
}

int max(int tab[], int N)


{
int max=tab[0],i;
for(i=1;i<N;i++)
if(tab[i]>max)
max=tab[i];
return max;
}

Atelier de programmation 1

int min(int tab[], int N)


{
int i;
int min=tab[0];
for(i=1;i<N;i++)
if(tab[i]<min)
min=tab[i];
return min;
}
int modifier(int tab[], int *N, int ind)
{
int res=1,x;
if(ind<0||ind>=*N)
{
printf("L'indice est erron\n");
res=0;
}
else
{
printf("donner la nouvelle valeur : ");
scanf("%d",&x);
tab[ind]=x;
}
return res;
}
int recherche(int tab[], int N, int x)
{
int trouve=0,i=0;
while(i<N && !trouve)
{
if(tab[i]==x)
trouve=i+1;//la position
i++;
}
return trouve;
}

Atelier de programmation 1

int ajout(int tab[100], int *N, int x, int pos)


{
int succe=1,i;
if (*N==100)
{
printf("Tableau satur\n");

succe=0;
}
else
if((pos<1) || (pos > *N+1))
{
printf("position errone\n");
succe=0;
}
else
{
for(i=*N;i>pos-1;i--)
tab[i]=tab[i-1];
tab[pos-1]=x;
(*N)++;
}
return succe;
}

int suppression(int tab[], int *N, int x)


{
int succe=1,i,pos;
if (*N==0)
{
printf("Tableau vide\n");
succe=0 ;
}
else
{
pos=recherche(tab,*N,x);
if(!pos)

Atelier de programmation 1

{
printf("L'element %d n'appartient pas au
tableau...\n",x);
succe=0;
}
else
{
for(i=pos-1;i<*N-1;i++)
tab[i]=tab[i+1];
(*N)--;
}
}
return succe;
}
void tri(int tab[], int N)
{

int i,j,temp;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(tab[j]<tab[i])
{
temp=tab[i]; tab[i]=tab[j]; tab[j]=temp;
}
}

int comparaison(int t1[], int N1, int t2[], int N2)


{
int nbident=0,i,res;
for(i=0;i<N1;i++)
{
res=recherche(t2,N2,t1[i]);
if(res)
nbident++;
}
return nbident; }

Atelier de programmation 1

Deuxime
partie

Devoirs surveills

Atelier de programmation 1

Devoir surveill n 1 (2009-2010)

Exercice 1 (12 pt):


Ecrire un programme qui permet de remplir deux tableaux dentiers T1 et T2, chacun de taille gale
n. Ensuite, on doit permuter les valeurs des deux tableaux, de sorte quon obtienne la fin les n
valeurs minimales dans le premier tableau et les n valeurs maximales dans le deuxime. Les
permutations seront faites comme suit :
- Trouver la valeur maximale (max) dans T1
- Trouver la valeur minimale (min) dans T2
- Si max>min permuter les deux cases
Le programme se termine lorsquil ny a plus de permutations possibles.
Exemple :
T1

10

80

11

80

11

10

T2

Exercice 2 (8 pt):
Ecrire un programme qui permet de calculer le nombre doccurrences de tous les bigrammes qui
figurent dans un tableau de caractres. Le bigramme doit tre compos de deux lettres diffrentes.
Le tableau est saisi par lutilisateur, et les valeurs des cases ne doivent pas changer au cours du
programme.
Exemple :
a

Le programme affichera :
le bigramme ab figure 3 fois
le bigramme bc figure 2 fois
le bigramme cr figure 1 fois
le bigramme ra figure 1 fois
le bigramme ca figure 1 fois

Atelier de programmation 1

Correction du devoir surveill n 1


Exercice1 :

#include "stdafx.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
int t1[100],t2[100];
int i,x,n,max,min;
do
scanf("%i",&n);
while(n>100 || n<0);
printf("\n saisir t1");
for(i=0;i<n;i++)
scanf("%i",&t1[i]);
printf("\n saisir t2");
for(i=0;i<n;i++)
scanf("%i",&t2[i]);
do
{

max=0;min=0;
for(i=1;i<n;i++)
{
if(t1[i]>t1[max])
max=i;
if(t2[i]<t2[min])
min=i;
}
if(t1[max]>t2[min])
{
x=t1[max];
t1[max]=t2[min];
t2[min]=x;

Atelier de programmation 1

}
while(t1[max]>t2[min]);
printf("t1=\n");
for(i=0;i<n;i++)
printf("%i ",t1[i]);
printf("\nt2=\n");
for(i=0;i<n;i++)
printf("%i ",t2[i]);
return 0;
}

Ex2 :
#include "stdafx.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
char t[100];
int i,n,j,occ,trouve;
do
scanf("%i",&n);
while(n>100 || n<0);
printf("\n saisir t1");
scanf("%s",t);
for(i=0;i<n-1;i++)
{
if(t[i]!=t[i+1])
{
j=0; trouve=0;
while(j<i-1 && trouve==0)
{
if( (t[j]==t[i])&& (t[j+1]==t[i+1]))
{

Atelier de programmation 1

trouve=1;
}
j++;

}
if(trouve==0)
{
j=i+2; occ=1;
for(j=i+2; j<n-1;j++ )
{
if( (t[j]==t[i])&& (t[j+1]==t[i+1]))
{
occ++;
}

}
printf("\n
%i",t[i],t[i+1],occ);

return 0;
}

le

nbr

d'occ

de

%c

%c

est

Atelier de programmation 1

Devoir surveill n 2 (2009-2010)

Exercice 1 (12 pt):


Ecrire un programme qui permet de saisir un tableau de caractres et puis dordonner les lettres de
telle sorte quon aura une suite de syllabes. Chaque syllabe est compose dune consonne et dune
voyelle. On suppose que le tableau ne contient que des lettres de lalphabet.
Chaque case dindice impair doit contenir une consonne, sinon on doit parcourir le reste du tableau
et permuter cette case avec la premire consonne trouve.
Chaque case dindice pair doit contenir une voyelle, sinon on doit parcourir le reste du tableau et
permuter cette case avec la premire voyelle trouve.
Ce processus sarrtera lorsquon trouve plus de permutations possibles ou lorsquon termine tout le
tableau.
Exemple :
b

Exercice 2 (8pt):
Ecrire un programme qui permet de saisir un tableau dentiers. Aprs avoir termin la saisie, on doit
parcourir le tableau et afficher les lments isols. Un lment est qualifi comme non isol sil est
gal la somme de deux autres entiers existants dans le mme tableau.
Exemple :
5

14

Le programme affichera seulement: 2, 14, 3, 88


Car

5 = 2+3
8 = 5+3
10= 8+2

10

88

Atelier de programmation 1

Correction du de devoir surveill n 2

Exercice 1

#include "stdafx.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char* argv[])
{
char t[100];
int i,n,j,trouve,x;
printf("\n saisir t1");
scanf("%s",t);
n=strlen(t);
for(i=0;i<n;i++)
{
if(i%2==0)
{
if(t[i]=='a'
||
t[i]=='i'
t[i]=='o'|| t[i]=='y')

||

t[i]=='e'||

{
j=i,trouve=0;
while(j<n && trouve==0)
{
if(t[j]!='a' && t[j]!='i' && t[j]!='e'&&
t[j]!='o' && t[j]!='y')
{
trouve=1;
x=t[i];
t[i]=t[j];
t[j]=x;
}
j++;

Atelier de programmation 1

}
}
}
if(i%2==1)
{
if(t[i]!='a' && t[i]!='i' && t[i]!='e'&& t[i]!='o'
&& t[i]!='y')
{
j=i,trouve=0;
while(j<n && trouve==0)
{
if(t[j]=='a' || t[j]=='i' || t[j]=='e'||
t[j]=='o'|| t[j]=='y')
{
trouve=1;
x=t[i];
t[i]=t[j];
t[j]=x;
}
j++;
}
}
}
}
for(i=0;i<n;i++)
printf("%c ",t[i]);
return 0;
}

Exercice 2

#include<stdio.h>
#include<stdlib.h>

Atelier de programmation 1

int main()
{
int t[100], stop,n;
do
{
printf("donner la taille du tabelau");
scanf("%i", &n);

}while ((n<=0)||n>100));
for(int i=0;i<n;i++)
{
printf(donner une entier);
scanf("%i", &t[i]);
}
for(int i=0;i<n;i++)
{
stop=0;
while (j<n)&&(stop==0)
{
while (k<n)&&(stop==0)
{
if((j!=i) && (k!=i) && t[k]+t[j]==t[i])
{
stop=1
}
else
k++;
}
j++;

Atelier de programmation 1

}
if(stop==0) // t[i] est isole
printf("%i est un entier isol")
}

Atelier de programmation 1

Devoir surveill n 3 (2011-2012)

Exercice 1 (6 points):
Ecrire un programme qui permet de:
- Saisir un tableau T dentiers positifs,
- Effacer les lments gaux lentier V du tableau T,
- Afficher le nouveau tableau T.
Exercice 2 (5 points):
Ecrire un programme qui permet de saisir un caractre car et dindiquer quil sagit dune lettre
de lalphabet ou non. Dans le premier cas, si le caractre car est une lettre de lalphabet, le
programme doit afficher sil sagit dune voyelle ou dune consonne.
Exercice 3 (9 points):
On se propose dcrire un programme en C permettant lutilisateur de crer son propre
dictionnaire de la manire suivante:
Lutilisateur donne le nombre de mot saisir
Linsertion de chaque nouveau mot se fait de manire quil soit plac selon lordre alphabtique
On ne doit pas accepter lexistence du mme mot plus quune seule fois
A la fin, il faut afficher le dictionnaire obtenu

Exemple : Pour n=3


Mot1= belle

\0

\0

\0

\0

Mot 2= ballon
\0

Mot 3= Arbre

\0

Atelier de programmation 1

Correction du devoir surveill n 3

Exercice 1: (6pts)
#include "stdio.h"
int main(int argc, _TCHAR* argv[])
{
int T[100];
int n,i,j, val,existe=0;
do{
printf("Donnez le nombre d'lments");
scanf("%i",&n);
}while(n<1||n>100);
for(i=0;i<n;i++)
{
printf("Donnez le %i me lment ", i+1);
do{
scanf("%i",&T[i]);
if(T[i]<0)
printf("Saisie incorrecte! Tapez un nombre
strictement positif");
}while(T[i]<0);
}
printf("Donnez une valeur supprimer");
scanf("%d",&val);
for(i=0;i<n;i++)
{
if(T[i]==val)
{
existe=1;
for(j=i;j<n-1;j++)
T[j] = T[j+1];
n--;
}
}
if (!existe)

Atelier de programmation 1

printf("Impossible de supprimer");
else
{
printf("Aprs suppression, le tableau devient: \n");
for(i=0;i<n;i++)
printf("%i\t",T[i]);
}
return 0;
}

Exercice 2: (5pts)
#include "stdio.h"
int main(int argc, _TCHAR* argv[])
{
char car;
printf("Donnez un caractre");
scanf("%c",&car);
if((car>='a' && car<='z')||(car>='A'&&car<='Z'))
{
if(car=='o'||car=='i'||car=='e'||car=='a'||car=='u'||car
=='y'||car=='O'||car=='I'||car=='E'||car=='A'||car=='U'|
|car=='Y')
printf("Lettre voyelle");
else
printf("Lettre consonne");
}
else
printf("le caractre saisi n'est pas une lettre
de l'alphabet franais");
return 0;
}
Exercice 3: (9pts)
#include "stdio.h"
#include "string.h"
int main(int argc, _TCHAR* argv[])
{
const int Tmax = 100;

Atelier de programmation 1

char dic[Tmax][10], Tmp[10];


int i,j,k,n,ind,stop,trouve;
do{
printf("Donnez le nombre de mots");
scanf("%i",&n);
}while (n<1 || n>Tmax);
printf("Inserez le mot 1:");
fflush(stdin);
fgets(dic[0],10,stdin);
for(i=1;i<n;i++)
{
Do
{
printf("Inserez le mot %i: ", i+1);
fflush(stdin);
fgets(Tmp,10,stdin);
j=0; trouve=0; stop=0;
while(j<i && !stop && !trouve)
{
if(strcmp(Tmp, dic[j])==0)
trouve=1;
else{
if(strcmp(Tmp,dic[j])<0)
{
stop=1;
ind=j;
}
else
j++;
}

Atelier de programmation 1
}
}while(trouve);
if(stop)
{
for(k=i;k>ind;k--)
strcpy(dic[k],dic[k-1]);
strcpy(dic[ind],Tmp);
}
else
strcpy(dic[i],Tmp);
}
printf("\n****************Le dictionnaire**************\n");
for(i=0;i<n;i++)
printf("%s \n", dic[i]);
return 0;
}

Page 70

Atelier de programmation 1

Devoir surveill corrig n 4 (2012-2013)

Exercice1 :

(12

pts)

Soit T un tableau dentiers distincts de taille logique N, et soit M une matrice dentiers distincts de
taille (N x N), sachant que N est comprise entre 1 et 100. On se propose de tester si tous les
lments de T apparaissent dans M dans le mme ordre dapparition dans T et dafficher un
message selon le rsultat du test.
Ecrire un programme en C qui permet de saisir le tableau T et la matrice M et dafficher le
message correspondant au rsultat du test.
NB : En remplissant la matrice, vous n'tes pas cens de faire le contrle de saisie.
Exemple :
Soit la matrice M (3,3) suivante :
1

10

11

Le tableau T1 existe dans la matrice


5

Le tableau T2 nexiste pas dans la matrice


1

Le tableau T3 nexiste pas dans la matrice

Page 71

Atelier de programmation 1

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{

int t[100];
int M[100][100];
int n, i, j, k, stop, trouve, w;
// saisie de la taille logique entre 1 et 100

1.5 pt avec contrle de saisie ; 0.5 pt sans contrle

do{
printf("donner une taille logique N");
scanf("%i",&n);
}while((n<1)||(n>100));
// remplissage dun tableau dentiers distincts

2.5 pt si on vrifie la redondance ; 1 pt sinon

for(i=0;i<n;i++)
{do{
printf ("donner une valeur");
scanf("%i",&t[i]);
j=0; stop=0;
while((j<i)&&(stop==0))
{
if(t[j]==t[i])
stop=1;
else
j++;
}
}while(stop==1);
}

Page 72

Atelier de programmation 1
//remplissage dune matrice

1 pt

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{

printf ("donner une valeur matrice");


scanf("%i",&M[i][j]);

}
}

//affichage de la matrice
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{printf("%i \t", M[i][j]);
}
printf("\n");
}
//Recherche par ordre
i=0;j=0;k=0; stop=0;
while((i<n)&&(stop==0))// Parcours du tableau

1.5 pt

{trouve=0 ;
// Pour chaque valeur de t on continue la recherche partir des indices de la valeur prcdente

while((j<n)&&(trouve==0))//j est l'indice des lignes de la matrice

0.75 pt

{if(k>=n) k=0;// On ne rinitialise lindice des colonnes 0 que si on parcourt toutes les colonnes de la
matrice pour un indice courant dune ligne et pour chaque valeur de t .
0.5 pt

Page 73

Atelier de programmation 1
while((k<n) && (trouve ==0))

0.75 pt

{
if(M[j][k]==t[i])

1.5 pt

trouve=1;

k++;
}
if(k>=n)

1 pt

j++;// on ne passe la ligne suivante que si on termine toutes les colonnes


}
if(trouve==0)

0.5 pt

stop=1;
else

i++;
}
if((stop==0))

0.5 pt

{
printf("le tableau existe dans la matrice");
}
else
{
printf("le tableau n'existe pas dans la matrice");
}

system("PAUSE");
return EXIT_SUCCESS;
}

Page 74

Atelier de programmation 1

Exercice 2: (8

pts)

Etant donn un mot, on se propose de le codifier o chaque lettre du mot sera prcd de son nombre
doccurrences successives (gal 1 ou 2). Par exemple le mot assassin son code sera la chaine
1a2s1a2s1i1n.
Ecrire un programme C qui demande lutilisateur de saisir une chaine et dafficher son code.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{

char t[100];
int l, occ, i;

printf("donner le mot\n");

1 pt, on peut aussi utiliser les fonctions scanf et gets

fflush(stdin);
fgets(t, 100, stdin);

l=strlen(t)-1;

1 pt pour linitialisation des variables et leur dclaration

occ=1;
i=0;

while((i<l-1))

1 pt si on sarrte l-2 ( la position de lavant dernier caractre ) ; 0.5pt

sinon

{
if(i==(l-2))

1 pt pour le traitement des deux derniers caractres sils sont

identiques

{if(t[i]==t[i+1])
{occ=2;

Page 75

Atelier de programmation 1
printf("%d%c", occ, t[i]);
}
Else

1 pt pour le traitement des deux derniers caractres sils sont diffrents

{
occ=1;
printf("%d%c", occ, t[i]);
printf("%d%c", occ, t[i+1]);
}

i++;
}
else
{
if(t[i]==t[i+1])

1.5 pt pour le traitement des autres caractres au milieu du tableau sils

sont identiques

{occ=2;
printf("%d%c", occ, t[i]);
i=i+2;
}
Else

1.5 pt pour le traitement des autres caractres au milieu du tableau sils sont

diffrents

{occ=1;
printf("%d%c", occ, t[i]);
i=i+1;
}
}
}
system("PAUSE");
return EXIT_SUCCESS; }

Page 76

Atelier de programmation 1

Troisime
partie

Les Projets

Page 77

Atelier de programmation 1

Projet N.1 (2009-2010)

HEURISTIQUE PLUS PROCHE VOISIN


POUR LE PROBLME DU VOYAGEUR DE COMMERCE
Description du problme :
Dfinition du problme du voyageur de commerce
tant donn un ensemble fini de villes, il s'agit de trouver le plus court chemin qui relie toutes ces villes,
en passant une seule fois par chaque ville.
Pour un problme de N villes, on disposera d'une matrice (MATRICE_DISTANCE N*N) de distances
donnant la distance entre chaque couple de villes.
Il est noter que cette distance est symtrique, c'est-- dire distance(villea, villeb) = distance(villeb,
villea)
Mthode de rsolution :
Heuristique (mthode) du plus proche voisin
Il ne s'agit pas ici de trouver le meilleur chemin possible, mais essayer de trouver un bon chemin. L'ide
est de lancer plusieurs voyageurs (NB_VOYAGEUR), chacun commenant partir d'une ville diffrente.

Dans son parcours chaque voyageur se dirige vers la ville la plus proche qu'il n'a pas encore visite.
Une fois tous les voyageurs auront termin leurs parcours, le chemin le plus court sera affich ainsi que
sa distance parcourue
Chaque voyageur devra donc enregistrer la liste des villes parcourus. On utilisera une autre
matrice(NB_VOYAGEUR * N) avec N le nombre de villes. Chaque ligne de cette matrice contient la
squence des villes parcourues par le voyageur.
Travail demand :
On vous demande dcrire les programmes suivants :

Init_Matrice Distance (MATRICE_DISTANCE), qui rinitialise la matrice distance avec


les distances relles des villes tunisiennes.

Placer_Voyageurs (NB_VOYAGEUR), qui permet de placer alatoirement un nombre


de voyageurs sur des villes diffrentes

Afficher_Meilleur_Parcours, qui affiche la squence des villes qui correspond la


distance minimale.

Page 78

Atelier de programmation 1

Une interface graphique, permettant lutilisateur de placer les voyageurs sur la carte
de la Tunisie, et dafficher leurs parcours est souhaitable.

En labsence dinterface graphique, lutilisateur doit avoir la possibilit de saisir le


nombre de voyageur

PARTIE 2
CALCUL DE LA MATRICE DE CO-OCCURRENCE
Dans le domaine de traitement dimages, chaque image est reprsente par une matrice de niveau de
gris. Chaque case de la matrice est relative un pixel (point) de limage. Par exemple, cette image
de 4*4 pixels est reprsente par la matrice suivante (o le
blanc par exemple est cod par la valeur 3):

Il est possible dtudier quelques caractristiques concernant limage initiale partir de cette matrice.
Pour cela, il faut calculer ce quon appelle la Matrice de Co-occurrences.
Cette matrice est de taille Ng*Ng (Ng tant le nombre de niveaux de gris figurant dans limage).
Dans ce qui suit on ne traite que les images ayant les 4 niveaux de gris 0,1,2,3.
Pour le calcul de la matrice de co-occurrence, les paramtres gnralement utiliss sont :

d : la distance entre les 2 pixels (en gnral cest gal 1)

: l'angle de la droite reliant ces 2 pixels (en gnral on utilise = 0 cd les deux
voisins horizontaux (celui de droite et celui de gauche)). Dans la suite on va considrer
(d = 1 et = 0 )

La premire tape pour le calcul de matrice de co-occurrences, est de calculer la matrice relative aux
voisins de droite (MVD) et la matrice relative aux voisins de gauche (MVG). C'est--dire quon doit

Page 79

Atelier de programmation 1
tudier toutes les combinaisons entre les niveaux de gris. Dans notre exemple, on a 16 combinaisons
possibles (4*4) qui sont :
(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)
(3,0) (3,1) (3,2) (3,3)
Les deux matrices MVD et MVG de lexemple ci-dessus sont les suivants :

La valeur 2 (dans la cellule (1,2)) de MVD veut dire quil existe 2 cas dans la matrice M o un pixel=0
un voisin droit =1 (cad les cases (1,2), (2,2) de M).
La valeur 3 (dans la cellule (3,3)) de MVG veut dire quil existe 3 cas o un pixel=2 a un voisin
gauche =2 (cad le pixel (3,3), (3,4), (4,2) de M). Une fois les deux matrices de voisinage calcules, la
deuxime tape est de symtriser (cad faire la somme des deux matrices MVD et MVG). Dans notre
exemple la matrice symtrise (MS) est :

La dernire tape est la normalisation o on doit diviser la matrice symtrise (MS) par la somme de
ses lments (de telle sorte que la nouvelle somme soit gale 1). Dans notre exemple, on divise par
24, et la matrice de co-occurrence (MC) est :

Page 80

Atelier de programmation 1

Travail demand :
Soit M la matrice de niveaux de gris, voici lalgorithme principal qui permet de calculer la matrice de
co occurrences.
Algorithme CalculCoOccurrence
M, MDV, MDG, MS, MC (Tableau [1..4, 1..4] dentiers)
Dbut
GenererMatriceGris (M)
CalculMatriceVoisins (M, MVD, MVG)
SymtrisationMatrice (MVD, MVG, MS)
NormalisationMatrice (MS, MC)
Fin
On vous demande dcrire les programmes suivants :
GenererMatriceGris (M) : pour la premire version on vous propose saisir M
CalculMatriceVoisins permet de calculer les matrices des voisins MVD et MVG partir de la
matrice M
SymtrisationMatrice permet de calculer la matrice MS partir des matrices MVD et MVG
NormalisationMatrice a comme entre la matrice MS et permet de calculer la matrice de cooccurrences M.

Page 81

Atelier de programmation 1

Projet N.2 (2011-2012)

Jeux Motus & Morpion


Dans ce projet on se propose d'implmenter deux jeux :
Jeu Motus :
Un joueur J1 propose un mot masqu. Un deuxime joueur J2 doit le deviner tout en suggrant des
mots. A chaque fois que le joueur J2 choisit un mot, le programme linforme des lettres bien places,
des lettres mal places et celles qui nappartiennent pas au mot recherch.
Le nombre de tentatives est limit. Lorsque lutilisateur saisit un mot diffrent du mot recherch, un
dcompte est effectu jusqu' lchec.
On fixe le temps de rponse du joueur J2.
Exemple : Il a 10 minutes pour trouver le mot sinon il perd.
Jeu du Morpion :
Pour jouer au morpion il faut tre deux joueurs. Chaque joueur possde un symbole, savoir :
X pour le joueur 1
O pour le joueur 2.

Les joueurs inscrivent tour tour leur symbole sur une grille 3x3.
Chaque joueur va tour de rle inscrire son symbole sur l'une des 9 cases encore vide de la grille.
La partie se termine quand :
un des joueurs arrive le premier aligner trois symboles identiques horizontalement ou
verticalement ou en diagonale.
Partie nulle.
Le score est donc calculer de la faon suivante :
Si le joueur 1 aligne trois X en premier, alors il gagne 1 point.
Si le joueur 2 aligne trois O en premier, alors il gagne 1 point.
En cas de match nul, leur score reste inchang.
A la fin de chaque partie, on demande aux joueurs sils veulent rejouer.
Le score de la dernire partie joue sadditionne au score final.
Exemple :

Page 82

Atelier de programmation 1

On vous demande d'crire un programme en C permettant aux utilisateurs de :


6. Choisir de jouer lun des jeux
7. Jouer le jeu motus
8. Jouer le jeu du morpion
Nota :
Pour mieux comprendre le principe de jeux Motus&Morpion, veuillez visiter les sites suivant :
http://motus.absolu-puzzle.com/index.php
http://www.jeuxjeuxjeux.fr/jeu/morpion/tic+tac+toe+2.html

Page 83

Atelier de programmation 1

Projet N.3 (2012-2013)

Gestion de prt de livre


Dans ce projet on se propose d'implmenter une application pour la gestion de prt de livres dune
bibliothque. Un livre est caractris par numro, un titre et le nombre dexemplaires existants. Pour
la gestion des livres on propose de dfinir 3 tableaux : T_Nlivre pour les numros des livres, T_Titre
pour les titres des livres et T_ Nbr_exp pour les nombres dexemplaires des livres.

T_NLivre N_livre

N_livre2

Titre 2

N_livre2

T_Titre

Titre 1

T_Nbr_exp N_livre

Pour la gestion des emprunts des livres on utilisera pour cela un tableau dentier deux dimensions
comme la montre la figure suivante:

Date_dempreint

N_CIN

N_livre

J1

M1

Date_de retour prevue

J2

M2

A2

..

..

Page 84

Atelier de programmation 1

Comme la matrice ci-dessous le montre un emprunt est caractris par le Numro de CIN (N_CIN) de
lemprunteur le Numro de livre (N_livre) , la date de lemprunt (j 1/M1/A1) et la date de retour
prvue ((j2/M2/A2).

On vous demande d'crire un programme C permettant l'utilisateur de


1. saisir un emprunt en vrifiant sa validit. Pour qu'un emprunt soit valide il faut que le livre soit
disponible.
2. supprimer un emprunt en prcisant la N_CIN et le N_livre. Il est prciser que la suppression doit
effectuer un dcalage dans les tableaux afin d'viter le gaspillage de mmoire.
3. supprimer un ensemble demprunts en prcisant une date demprunt et une date de retour prvue.
Tous les emprunts appartenant cette priode doivent tre supprims
4. afficher l'ensemble des emprunts respectifs une date de retour prvue.
5. Afficher le nombre dexemplaire encore disponible pour le chaque livre.
6. Afficher le livre le plus emprunt dans un priode donne.
7. Afficher lemprunteur le plus fidle pour la bibliothque.

Remarque : Il est conseill de remplir les donnes sur les livres pendant la dclaration des tableaux.

Page 85

Atelier de programmation 1

Quatrime
partie

Sujets Des Examens

Page 86

Atelier de programmation 1

Examen corrig N1
Session principale 2009/2010

Que contiennent X, Y, Z et T la fin de la fonction main () ?


int main ();
int F1 (int *A, int *
B, int * C, int *D);
void F2 (int K, int
L, int M, int N);
int main ()
{ int X, Y, Z, T;
X= 1; Y = 2; Z = 3; T
= 4;
Y = F1 (&X, &Y, &Z,
&T);
return (0);
}

int F1 (int *A, int *


B, int * C, int *D)
{
*B = 5+*B;
F2 (*A, *B, *C, *D);
*A = *C;
return (8);
}

void F2 (int K, int


L, int M, int N)
{
K = 10;
M = 21;
L = K + L;
N = N;
}

Rponse :
X=3,Y=8, Z=3,T=4;

Exercice 2 (16 points)


a. Ecrire une fonction SaisirMatrice qui permet de saisir les dimensions L et C dune matrice M et
de la remplir par des entiers saisis (L et C ne doivent pas dpasser 100).
b. Ecrire la fonction EstPointCol qui rend 1 si un lment donn dune matrice dentiers (dfini par
son numro de ligne et son numro de colonne) est un "point col". Et qui rend 0 sinon. On appelle
"point col" dune matrice, llment qui est la fois maximum sur sa ligne et minimum sur sa
colonne.
c. Ecrire une fonction TousPointsCols qui affiche les coordonnes (numro de ligne et numro de
colonne) de tous les points cols de la matrice M.
d. Ecrire un programme principal qui permet dappeler les fonctions crites en a., et en c.
Exemple : Les points cols de la matrice ci-aprs sont : (0, 3) et (3, 3).

Page 87

Atelier de programmation 1

Rponse :

a.
void SaisirMatrice(int M[][100], int * L, int *C)
{
int i, j;
do {
printf ("Donnez L : ") ; scanf ("%d", L) ;
} while (*L <= 0) || (*L>=100)
do {
printf ("Donnez C : ") ; scanf ("%d", C) ;
} while (*C <= 0) || (*C>=100)
// Saisie de la matrice
for (i=0 ; i < *L; i++)
{
for (j=0 ; j < *C; j++)
{
printf ("Donnez M[%d][%d] : ", i, j) ;
scanf ("%d", &M[i][j]) ;
}
}
}
b.
int EstPointCol (int M[][100], int A, int B, int L, int C)
{
int Max, Min, i, j, trv ;
Max = M[A][B] ;
Min = M[A][B] ;
j =0 ; trv = 0 ;
while ((j < C) && (!trv))
{
if (M [A][j] > Max)
trv = 1 ;
else
j++ ;
}
i = 0 ;

Page 88

Atelier de programmation 1
while ((i < L) && (!trv))
{
if (M[i][B] < Min)
trv = 1 ;
else
i++ ;
}
return (!trv) ;
}
c.
void TousPointsCol (int M[][100], int L, int C)
{
int i, j, n;
// Rechercher les points cols
n = 0 ;
for (i=0 ; i < L; i++)
{
for (j=0 ; j < C; j++)
{
if (EstPointCol (M, i, j, L, C))
{
if (n==0)
{printf ("Les points cols
de cette matrice sont : ") ;}
printf ("(%d, %d), ", i, j) ;
n ++ ;
}
}
}
if (n ==0)
printf ("Cette matrice ne contient pas de points cols") ;
}
d.
int main()
{
int M [100][100];
int L, C;
SaisirMartice (M, &L, &C) ;
TousPointsCol (M, L, C) ;
return (0) ;
}

Page 89

Atelier de programmation 1

Examen corrig N2
Session de contrle 2009/2010

Exercice 1: (8 points)
Soit un tableau dentiers. On appelle un entier valable tout entier strictement suprieur aux entiers qui le
prcdent dans le tableau.
crire une fonction en C qui permet de compter le nombre dentiers valables dans un tableau dentiers
reu en paramtre.

int NombreValables (int T [ ], int N)


{
int i, N, S, R ;
float M ;
S = T [0] ;
R = 0 ;
for (i=1 ; i < N ; i++)
{
M = (float) (S) / (float) (i)
if ((float)(T [i]) > M)
R = R + 1 ;
S = S + T [i] ;
}
return (R)
}

Exercice 2 : (12 points)


crire une fonction en C qui permet de dire si deux matrices sont "fausses jumelles". Deux matrices sont dites
"fausses jumelles" si elles contiennent exactement les mmes entiers (avec les mmes nombres
dapparitions) mme si lordre des entiers nest pas le mme. Exemple : Les deux matrices suivantes sont
dites "fausses jumelles".

int FaussesJumelles(int** M1, int NL1, int NC1, int** M2, int NL2,
int NC2)
{

Page 90

Atelier de programmation 1
int
int
int
int
for

T1 [2][100], T2 [2][100];
n1=0,n2=0;
fs=1;
i=0,j=0;
(i=0;i<NL1*NC1;i++)
T1[1][i]=0;
for(i=0;i<NL1;i++)
{
for(j=0;j<NC1;j++)
{
int x=M1[i][j];
int traite=0;
int k=0;
while(!traite&& k<n1)
{
if (x==T1[0][k])
{
traite = 1;
T1[1][k]=T1[1][k]+1;
}
else
k++;
}
if(!traite)
{
T1[0][n1]= x;
n1++;
}
}
}
for (i=0;i<NL2*NC2;i++)
{
T2[1][i]=0;
}
for(i=0;i<NL2;i++)
{
for(j=0;j<NC2;j++)
{
int x=M2[i][j];
int traite=0;
int k=0;
while(!traite&& k<n2)
{
if (x==T2[0][k])
{
traite = 1;
T2[1][k]=T2[1][k]+1;
}
else
k++;
}
if(!traite)

Page 91

Atelier de programmation 1
{
T2[0][n2]= x;
n2++;
}
}
}

Page 92

Atelier de programmation 1

Rfrences

C. Delannoy. Le livre du C, premier langage. Eyrolles, 2002.


A. Zribi, Z. Elouedi. Apprendre programmer par l'exemple. CPU, 2006.
R. Malgouyres, F. Feschet, Z. Zrour. Algorithmique et structures de donnes en C
2011.
Introduction a la programmation en ansi-c, http://www.ltam.lu/cours-c/

Page 93