Documente Academic
Documente Profesional
Documente Cultură
Premire
partie
Atelier de programmation 1
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("
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()
{
Atelier de programmation 1
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
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)
{
int I,n;
int j;
printf (donner un entire n) ;
scanf(%i, &n)
printf("\n");
}
Atelier de programmation 1
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;
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
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};
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.
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 */
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");
*/
Atelier de programmation 1
IFUS++;
IB++;
}
/* Edition du rsultat */
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
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
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;
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
Exercice2 :
#include "stdio.h"
#include "ctype.h" // toupper
#include "string.h"
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"
(ch[i+1]==' '))
{
for (j=i+1; j<(N-1); j++)
{ch[j]=ch[j+1];}
N--;
Atelier de programmation 1
}
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];
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];
if(strlen(ch1)!=strlen(ch2))
egaux=0;
else
{
while((egaux==1)&&(i<strlen(ch1)))
{
occ1=0; occ2=0;
Atelier de programmation 1
if(occ1!=occ2) egaux=0;
i++;
}
}
if(egaux==1)
printf("deux chaines equivalentes");
else
printf("non equivalentes");
Atelier de programmation 1
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
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
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];
}
}
}
Atelier de programmation 1
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
{
}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)
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
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 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
Atelier de programmation 1
Atelier de programmation 1
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
Atelier de programmation 1
Atelier de programmation 1
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;
}
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;
}
}
Atelier de programmation 1
Deuxime
partie
Devoirs surveills
Atelier de programmation 1
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
#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
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
5 = 2+3
8 = 5+3
10= 8+2
10
88
Atelier de programmation 1
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
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
\0
\0
\0
\0
Mot 2= ballon
\0
Mot 3= Arbre
\0
Atelier de programmation 1
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
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
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
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
do{
printf("donner une taille logique N");
scanf("%i",&n);
}while((n<1)||(n>100));
// remplissage dun tableau dentiers distincts
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++)
{
}
}
//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
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
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");
fflush(stdin);
fgets(t, 100, stdin);
l=strlen(t)-1;
occ=1;
i=0;
while((i<l-1))
sinon
{
if(i==(l-2))
identiques
{if(t[i]==t[i+1])
{occ=2;
Page 75
Atelier de programmation 1
printf("%d%c", occ, t[i]);
}
Else
{
occ=1;
printf("%d%c", occ, t[i]);
printf("%d%c", occ, t[i+1]);
}
i++;
}
else
{
if(t[i]==t[i+1])
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
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 :
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.
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 :
: 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
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
Page 83
Atelier de programmation 1
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
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).
Remarque : Il est conseill de remplir les donnes sur les livres pendant la dclaration des tableaux.
Page 85
Atelier de programmation 1
Quatrime
partie
Page 86
Atelier de programmation 1
Examen corrig N1
Session principale 2009/2010
Rponse :
X=3,Y=8, Z=3,T=4;
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 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
Page 93