Introduction à l'algorithmique en C
Introduction à l'algorithmique en C
الرحـــيــم
)GI(S1
Algorithmique debase
2010/2011
Ait Moussa
Département de mathématiques et
d'Informatique
Bureau m2
Plan duI:cours
Partie
Introduction à l'informatique
Initiation à Windows
Partie II:
Algorithmique et Langage de
programmation C
Partie I
algorithmique et C
Chapitre 1
Les éléments de base, les opérateurs
et les expressions
Chapitre 2
Entrées/sorties
Chapitre 3
Structures de contrôle
Chapitre 4
Les boucles
Chapitre 5
Les tableaux
Chapitre 6
Les fonctions
Références
Langage C.
Code :
PC Poche : Langage C.
Code :
Langage C.
Code :
Programmer en langage C: cours et
exercices.
Claude DeLannoy
Chapitre 1
Clair
Exprimé dans un langage
compréhensible par le lecteur (l’être
humain)
Algorithme utilisateur
Phase de programmation
Programme
compilateur
Phase de compilation
Programme machine
(code binaire)
ordinateur
Phase d’exécution
Résultat
Etapes à suivre pour décrire un algorithme:
Algorithme
Résultat souhaité x
Algorithme 1: un algorithme
général
Calculer le discriminant.
Déduire les solutions.
calculer le discriminant:
=b2-4*a*c ;
Déduire les solutions:
si le discriminant est positif,
l’équation a 2 racines réelles:
X1=(-b-)/(2*a)
et
X2=(-b+)/(2*a)
si le discriminant est nul,
l’équation a une racine double:
X=-b/(2*a)
si le discriminant est
strictement négatif, l’équation
n’a pas de racine réelle.
L’algorithme 3 décrit les
solutions à l’aide des
instructions simples est
plus précises.
Variables
Définition: Une variable est une donnée
dont la valeur peut être modifiée, qui
possède un nom et un type et qui peut
être rangée en mémoire.
nom12 1nom
nom_20 nom.2
Nom_de_variable Nom de variable
deuxieme_choix deuxième_choix
mot_francais mot_français
Mots réservés
Les noms suivants ne peuvent pas être déclarés comme
noms de variables. Ce sont des noms réservés du
langage C.
Nom_variable : type ;
type Nom_variable;
variable valeur;
Exemple :
x 1;
On affecte la valeur 1 à la variable x
le contenue de la variable après l’affectation est
égal à 1.
Instruction d’affectation
Nom_variable = donnée;
Exemple :
x = 1;
Il est nécessaire de déclarer la variable en lui
affectant un type. Par exemple:
float x;
Initialisation des variables
En C, il est possible d’initialiser des variables lors
de la déclaration. L’initialisation se fait de la
façon suivante:
type Nom_variable = donnee;
Exemple :
int i = 2;
float x = 10.3;
char c = 'A';
Déclaration des constantes
Définition : Une constante est une variable
dont la valeur ne change pas le long du
programme.
En C, une constante est définit de la façon
suivante :
#define nom_constante valeur
Exemple :
#define Pi 3.1415927
Dans tout le programme, Pi sera remplacé par
3.1415927
Déclaration des constantes (suite)
Remarque :
Les constantes définies par #define ne sont pas
typés (n’ont pas de type).
Pour, déclarer des constantes typés, on ajoute
le mot clés const devant le type de la variable
qu'on veut utiliser comme constante.
Exemple :
const float pi = 3.1415927;
dites quelles seront les valeurs des variables
a,
b et c, après l’exécution de chacune des
instructions :
a = 5
b = 3
c = a + b
a = 2
c = b - a
Qu’obtiendra-t-on dans les variables a et b,
après exécution des instructions suivantes
(dans cet ordre) ?
a := 5
b := a + 4
a := a + 1
b := a - 4
Instruction A B
A=1 1 à la Programmation.pdf-
S'initier
B=A+3 1 4
A=3 3 4
Qu’obtiendra-t-on dans les variables a et b,
après exécution des instructions suivantes
(dans cet ordre) ?
a := 5
b := a + 4
a := a + 1
b := a - 4
Qu’obtiendra-t-on dans les variables n1 et n2
après exécution des instructions ?
n1 = 5
n2 = 7
n1 = n2
n2 = n1
Même question avec les instructions :
n1 = 5
n2 = 7
n2 = n1
n1 = n2
Que font ces instructions ?
entier n, p, q
n = 5
p = 5
q = n / (n-p)
Que font ces instructions ?
entier n, p
n = 10
p = 4
n = n * p ;
p = n / p
Soient deux variables a et b déclarées par :
caractère a, b
Écrire les instructions permettant d’échanger
leur contenu.
Les opérateurs
Définition : Les opérateurs sont des symboles
qui permettent de manipuler des variables,
c'est-à-dire effectuer des opérations, les
évaluer, ...
On distingue plusieurs types d'opérateurs:
les opérateurs de calcul
les opérateurs d'affectation
les opérateurs d'incrémentation
les opérateurs de comparaison
les opérateurs logiques
Les opérateurs de calcul
Les opérateurs de calcul permettent de modifier
mathématiquement la valeur d'une variable.
L'opérateur d'affectation "=" :
Permet d'affecter une valeur à une variable.
Exemple :
x = 10.2;
i=2;
Il est possible d'enchaîner plusieurs opérations
d'affectations :
i = j = k = 3;
Les opérateurs de calcul (suite)
L'addition "+" :
Syntaxe
nom_var = expression1 + expression2 ;
Exemple :
x = y + 2; /* si y vaut 3, la valeur de x sera
5*/
z = x + y + 3;
Les opérateurs de calcul (suite)
La soustraction "-" :
Peut être utilisée de deux façons:
nom_var = - expression1;
nom_var = expression1 - expression2 ;
Exemple :
x = y - 2; /* si y vaut 3, la valeur de x sera
1*/
z = -(x + y + 3);
Les opérateurs de calcul (suite)
La multiplication "*" :
Syntaxe
nom_var = expression1 * expression2 ;
Exemple :
x = 2 * y ; /* si y vaut 3, la valeur de x sera
6*/
z = 4.5 * x * y;
Les opérateurs de calcul (suite)
La division "/" :
Syntaxe
nom_var = expression1 / expression2 ;
Remarque :
Si expression1 et expression2 délivrent des
valeurs entières, alors il s'agit d'une division
entière.
Si l'une des expressions, délivre une valeur
réelle, il s'agit d'une division réelle.
La division (suite)
Exemple :
13/2 retourne 6
-13/2 et 13/-2 retournent –6.
13/2.0 retourne 6.5
Remarque :
x/(y + z) correspond à x
yz x/(y + z) x/y +
x/y + z correspond à x z z
y
Les opérateurs de calcul (suite)
Le modulo "%" :
Syntaxe
nom_var = expression1 % expression2 ;
Retourne le reste de la division de expression1
par expression2 (expression1 et expression2
doivent retourner des valeurs entières).
Si expression1 est un multiple de expression2
alors nom_var est égale à zéro.
Le modulo (suite)
Exemple :
13%2 retourne 1
-13%2 retourne -1
13%-2 retourne 1
8%2 retourne 0
Remarque :
Il faut que la valeur de b*(a/b) + a%b soit égale
à a.
Les opérateurs d'affectation
Souvent en retrouve des expressions de la forme :
x = x +2;
Avec les opérateurs d'affectation, cette
expression peut s'écrire sous la forme :
x += 2;
Le C associe à la plupart des opérateurs un
opérateur d'affectation de la forme "op="
Si exp1 et exp2 sont des expressions, alors
exp1 op= exp2 est équivalent à exp1 = exp1 op
exp2
Les opérateurs d'affectation (suite)
+= ajouter à (x += 3 x = x + 3)
-= diminuer de (x -= 3 x = x - 3)
*= multiplier par (x *= 3 x = x * 3)
/= diviser par (x /= 3 x = x / 3)
%= modulo (x %= 3 x = x % 3)
Remarques :
x *= y+2 signifie x = x*(y+2) et non x = x*y + 2
x /= y+2 signifie x = x/(y+2) et non x = x/y + 2
x -= y+2 signifie x = x-(y+2) et non x = x – y + 2
x %= y+2 signifie x = x%(y+2) et non x = x%y + 2
Les opérateurs d'incrémentation
Le langage C comporte deux opérateurs qui
permettent d'augmenter ou de diminuer des
variables d'une unité.
++ : opérateur d'incrémentation
-- : opérateur de décrémentation
x++ est équivalent à x += 1 ou bien x = x + 1
x-- est équivalent à x -= 1 ou bien x = x - 1
Les opérateurs de comparaison
Les opérateurs de comparaison sont :
< (inférieur)
<= (inférieur ou égal)
> (supérieur)
>= (supérieur ou égal)
== (égalité) (différent de = (affectation))
!= (différence, <> en notation
algorithmique)
Les opérateurs logiques
Les opérateurs logiques sont :
&& (et logique), || (ou logique) et ! (non
logique).
#include <math.h>
(mettre avant main() )
Dans ce qui suit, x et y sont de type double et
toutes les fonctions retournent un double.
Pour les fonctions trigonométriques, les
angles sont exprimés en radians.
Les fonctions mathématiques
(suite)
sin(x) : sinus de x
cos(x) : cosinus de x
tan(x) : tangente de x
asin(x) : arc sinus de x
acos(x) : arc cosinus de x
atan(x) : arc tangente de x
sinh(x) : sinus hyperbolique de x
cosh(x) : cosinus hyperbolique de x
tanh(x) : tangente hyperbolique de x
Les fonctions mathématiques
(suite)
programme
Exemple 2
#include<stdio.h>
main()
{
char c='A';
printf("le code de %c est %d", c, c);
}
programme
Exemple 3
#include<stdio.h>
main()
{
double x=10.2, y=2.5;
printf("%f sur %f est %f", x, y, x/y);
}
programme
Exemple 4
#include<stdio.h>
main()
{
double x=10.2, y=2.5;
printf("%e sur %e est %e", x, y, x/y);
}
programme
Séquences d’échappement
Le programme :
#include<stdio.h>
main()
{
printf("premier ");
printf("programme en C");
}
Affichera à l'écran :
premier programme en C programme
Pour afficher à l'écran :
Séquences d’échappement (suite)
premier
programme en C
en deux lignes, le programme précédent, devra
s'écrire comme suit:
#include<stdio.h>
main()
{
printf("premier \nprogramme en C");
}
programme
Séquences d’échappement (suite)
Les séquences d’échappement permettent
d'afficher des caractères non imprimables :
\n nouvelle ligne (new line)
\a déclenche un signal sonore (alarme)
\\ \ (back slash)
\t tabulation horizontale
\’ apostrophe
\" guillemet
Saisie des données
La fonction scanf permet de lire des données à
partir du clavier. Sa syntaxe est le même que
celui de printf :
scanf("format", &var1, &var2, …);
Les noms des variables, sont précédés du
symbole &.
Ils sont les mêmes que ceux de printf, avec la
Spécificateurs de format de scanf
différence d'utiliser :
Remarques:
Une valeur chaîne de caractères s’écrit entre
deux quottes "
Exemple "ceci est une chaîne"
{
i++;
j--;
x = 3.4;
}
La notion de bloc (suite)
Un bloc est équivalent à une instruction. Donc,
on peut mettre un bloc là ou on peut mettre
des instructions.
Structure conditionnelle
if (condition){
suite d'instructions 1
}
else {
suite d'instructions 2
}
L'instruction if-else (suite)
Comme pour la forme Si… Sinon … FinSi, si
condition est vraie, on exécute la suite
d'instructions 1, sinon (c'est à dire condition
est fausse), c'est la suite d'instructions 2 qui
est exécutée.
Remarques
la condition doit être entre des parenthèses
s'il n'y a qu'une instruction, les accolades
ne sont pas nécessaires
il est possible de définir plusieurs
conditions à remplir avec les opérateurs ET
et OU (&& et ||)
par exemple:
1. if ((condition1)&&(condition2)) teste si les
deux conditions sont vraies
2. if ((condition1)||(condition2)) exécutera les
instructions si l'une des deux conditions est
vraie
Exemple:
Traduire (en langage C) les
instructions qui calculent le
maximum et le minimum de deux
réels.
float a, b;
float max, min;
if (a > b) {
max = a;
min = b;
}
else {
max = b;
min = a;
}
Exercice
1. Ecrire un algorithme qui permet de saisir
trois réels a, b et c et de calculer
l'expression : d = a/(b*c)
2. Traduire l'algorithme en langage C
Solution (Algorithme)
Algorithme division
variable
a, b, c, d : de type réel;
Début
Afficher (" entrer trois réels ");
Lire(a, b, c); si ( b*c = 0)
Si ((b = 0) ou (c = 0) ) alors {
Afficher("Division impossible");
}
Sinon {
d a/(b*c);
Afficher(d);
}
FinSi
Fin
Solution (Programme C)
#include<stdio.h>
main()
{
float a, b, c, d ;
printf (" entrer trois réels "); if ( b*c == 0)
scanf ("%f%f%f", &a,&b,&c) ;
if ( (b == 0) || (c == 0) )
printf("Division impossible\n");
else{
d = a/(b*c);
printf("%f sur %f * %f = %f\n",a,b,c,d);
}
}
Forme Si … FinSi
Si le bloc2 d’instructions est vide (il
n’y a pas d’instruction à exécuter)
alors l’instruction conditionnelle a
la forme suivante:
Si C alors {
bloc1 d’instructions;
}
FinSi
L'instruction if
En langage C, la partie else est facultative.
if (condition){
suite d'instructions
}
Exercice
1. Ecrire un algorithme qui permet de saisir
deux réels et de calculer leurs maximum et
leurs minimum sans utiliser le mot clés
Sinon (forme Si .. FinSi).
2. Traduire l'algorithme en langage C
Solution (Algorithme)
Algorithme Max_Min
variable
a, b, max, min : de type réel;
Début
Afficher (" entrer deux réels ");
Lire(a, b);
max b;
min a;
Si (a > b) alors {
max a;
min b;
}
FinSi
Afficher (" max = ", max, " min = ",
min);
Fin
Solution (Programme C)
#include<stdio.h>
main()
{
double a, b, max, min;
printf (" entrer deux réels ");
scanf ("%lf%lf", &a,&b) ;
max = b;
min = a;
programme
if (a > b) {
max = a;
min = b;
}
printf("max = %f min =%f", max, min);
}
ifs imbriqués
Un if peut lui même contenir un autre if en tant
qu'instruction. Comme la partie else est
facultative, le else s'associe au if le plus
proche qui n'a pas de else.
Exemple :
if(n>0)
if (a>b)
max = a;
else
max = b;
ifs imbriqués (suite)
Dans l'exemple, le else correspond au
deuxième if (if (a>b)).
Pour n=1, a=3 et b=2 on aura max=3
Pour n=1, a=3 et b=4 on aura max=4
Pour n=0, quelque soit les valeurs de a et b,
max n'est pas défini.
Si on veut que le else correspond au premier if, il
ifs imbriqués (suite)
faut utiliser des accolades :
if(n>0){
if (a>b)
max = a;
}
else
max = b;
Pour n=1, a=3 et b=2 on aura max=3
Pour n=0, a=3 et b=2 on aura max=2
Pour n=1, a=2 et b=3, max n'est pas défini
Remarque
Pour éviter toute confusion lors de l'utilisation de
plusieurs if, il faut mettre automatiquement des
accolades.
Exemple :
if(n>0){
if (a>b)
max = a;
else
max = b;
}
L'instruction else-if
La combinaison de plusieurs if-else, aboutit à la
construction suivante :
if (condition1)
bloc 1
else if (condition2)
bloc 2
else if (condition K)
bloc K
else
bloc K+1
L'instruction else-if (suite)
Les conditions sont évaluées du haut vers le
bas. Si une des conditions est vraie, le bloc
correspondant est exécuté et la séquence se
termine.
Le dernier else correspond au cas ou toutes les
conditions sont fausses. Il peut être omise.
Exemple
if (A > B)
printf("%d est plus grand que %d\n", A, B);
else if (A < B)
printf("%d est plus petit que %d\n", A, B);
else
printf("%d est égal à %d\n", A, B);
programme
Choix selon des valeurs
La construction de choix permet de construire
une instruction complexe de la forme :
selon expression
valeur1 : bloc1 d’instructions
valeur2 : bloc2 d’instructions
autrement : bloc d’instructions
fin selon
dont le fonctionnement est le suivant :
l'expression est tout d'abord calculée et doit
avoir un résultat de type entier ou caractère
valeur1, valeur2 … doivent être des
expressions constantes
si le résultat du calcul donne une des valeurs
prévues, alors les instructions correspondantes
sont exécutées,
si le résultat du calcul donne une valeur qui
n'était pas prévue, les instructions associées au
cas autrement sont exécutées. Le cas
autrement est facultatif.
Exemple
Cette construction est pratique pour
l’algorithme suivant, dans lequel on suppose
que la variable jour contient un entier
compris entre 1 et 7 représentant le jour de
la semaine du lundi au dimanche.
L'algorithme affiche en toutes lettres le nom
du jour correspondant.
Algorithme choix_jour
Variable
jour: de type entier
Début
Ecrire("donner un numéro")
Lire(jour)
selon jour
1 : Ecrire("Lundi")
2 : Ecrire("Mardi")
3 : Ecrire("Mercredi")
4 : Ecrire("Jeudi")
5 : Ecrire("Vendredi")
6 : Ecrire("Samedi")
7 : Ecrire("Dimanche")
autrement : Ecrire("Erreur")
fin selon
Fin
L'instruction switch
Pour traduire la construction selon en langage
C, il suffit de combiner l'instruction switch,
avec des instructions break :
switch (expression) {
case étiquette1: suite d'instructions
break;
case étiquette 2: suite d'instructions
break;
case étiquette...: suite d'instructions
break;
default: suite d'instructions
}
Remarques
étiquette1, …, étiquette n, doivent être des
expressions constantes.
Lorsque l'expression testée est égale à une
des valeurs suivant un case, la suite
d'instructions qui suit celui-ci est exécuté.
Le mot clé break indique la sortie de la
structure conditionnelle.
Le mot clé default précède la suite
d'instructions qui sera exécutée si
l'expression n'est pas égale à une des valeurs.
Attention: si on omet l'instruction break,
après exécution du cas choisi, les instructions
des cas suivants seront exécutées.
Traduction de l'algorithme choix_jour
#include<stdio.h>
main()
{
int jour;
printf("donner un numéro\n");
scanf("%d",&jour);
switch (jour)
{
case 1 : printf("Lundi");break;
case 2 : printf("Mardi");break;
case 3 : printf("Mercredi");break;
case 4 : printf("Jeudi");break;
case 5 : printf("Vendredi");break;
case 6 : printf("Samedi");break;
case 7 : printf("Dimanche");break;
default : printf("Erreur");
}
}
programme
Exemple
scanf("%d",&n);
switch(n){
case 0:
printf("n=0 \n");
break;
case 1: case 2: case 3:
printf("0 < n < 4 \n");
break;
default :
printf("n < 0 ou n >3 \n");
}
programme
Les boucles
Les boucles permettent de faire
exécuter plusieurs fois les mêmes
instructions. Elles s’arrêtent
lorsqu’une certaine condition est
vérifiée.
On appelle parfois ces structures
instructions répétitives ou bien
itérations.
Les boucles
Pour l’écriture d’un algorithme on utilise les
formes suivantes:
tant que
faire … tant que
pour
Le langage C dispose de :
while (tant que)
do while (faire … tant que)
for (pour)
Boucle "Tant Que"
Soit C une expression logique, appelée
condition d’arrêt ou test de sortie, le schéma
"Tant Que" a la forme suivante:
On a:
S(k)=S(k-1)+k, pour 1≤k≤n
avec S(0)=0
int k, n, S;
S = 0; /* S(0) */
k = 1;
while (k <= n) {
S = S+k; /* S = S(k) à l’étape k */
k = k+1;
}
programme
Exemple
/* affiche les nombres de 10 à 1*/
i = 10;
while (i>0){
printf("%d\n",i);
i--;
}
programme
Exemple 2
/* affiche les nombres de 0 à 9*/
i = 0;
while (i<10){
printf("%d\n",i);
i++;
}
programme
Exemple 3
scanf("%d",&i);
while (i<10){
printf("%d\n",i);
i++;
}
Remarque :
Si la valeur saisie est supérieur ou égale à 10,
aucun affichage ne sera fait.
programme
Boucle « Faire …Tant que »
On peut utiliser la boucle " Faire …tant que "
lorsqu’on connais que le corps de la boucle
sera exécuté au moins une fois.
Faire {
instructions; /* corps de la boucle
*/
}
Tant que C;
Interprétation
Contrairement à la boucle "Tant
Que", le corps de la boucle est
exécuté au moins une fois, car le
test de sortie de la boucle est
effectué après.
k 1;
S 0;
Faire {
S S+k;
k k+1;
}
Tant que (k <= n);
L'instruction do-while
Sa syntaxe est la suivante:
do{
suite d'instructions
}
while (condition)
L’incrémentation du compteur
(cpt cpt+val) s’effectue de
manière implicite à la fin
d’exécution de chaque itération.
Exemple
calculer la somme des n premiers
entiers positifs, avec n≥1.
S 0;
Pour (k 1 à n, à pas de 1) Faire {
S S+k;
}
FinPour
Afficher(k,S);
Remarque
Lorsque le "pas" d’incrémentation
vaut 1, dans ce cas la boucle "Pour"
peut s’écrire sous la forme:
S 0;
Pour (k 1 à n) Faire {
S S+k;
}
FinPour
La boucle for
Sa syntaxe est la suivante:
for (exp1; exp2; exp3) {
suite d'instructions
}
est équivalent à :
exp1;
while (exp2) {
suite d'instructions
exp3;
}
La boucle for (suite)
exp1 est évaluée une fois avant le passage de la
boucle.
Elle est utilisée pour initialiser les données de la
boucle.
exp2 est évaluée avant chaque passage de la
boucle.
Elle est utilisée pour décider si la boucle est
répétée ou non.
exp3 est évaluée à la fin de chaque passage de la
boucle.
Elle est utilisée pour réinitialiser les données de la
boucle.
Exemple
calculer la somme des n premiers
entiers positifs, avec n≥1.
#include <stdio.h>
Exemple
main()
{
int k, n, S;
printf("Donner un entier : ");
scanf("%d", &n);
S=0;
for(k=1; k<=n; k++)
S = S+k;
printf("S=%d ",S);
}
programme
Exemple
(Affichage des nombres de 0 à 9)
Algorithme :
Pour (i 0 à 9) Faire {
Afficher(i);
}
FinPour
Traduction :
/* affiche les nombres de 0 à 9 */
for(i=0; i<10; i++)
printf("%d\n",i);
programme
Exemple
Affichage des carrées des nombres impairs de
1 à 30
Algorithme :
Pour (i 1 à 30, à pas de 2) Faire {
Afficher("le carrée de", i, " est ",i*i);
}
FinPour
Traduction :
for(i=1; i<=30; i+=2)
printf("le carrée de %d est %d\n",i,i*i);
programme
Exercice :
1. Ecrire un algorithme qui permet
d'afficher les carrées des nombres
pairs de 1 à n (n saisi au clavier), en
utilisant la boucle :
a) pour.
b) tant que.
2. Traduire l'algorithme en langage C
Solution :
(a) boucle pour
Algorithme carres_paire_pour
variable
i, n : de type entier;
Début
Afficher("Saisir un entier");
Lire(n);
Pour (i 2 à n à pas de 2) Faire {
Afficher("le carrée de", i, " est ",i*i);
}
FinPour
Fin
(a) boucle for
#include<stdio.h>
main(){
int i, n;
printf("Saisir un entier");
scanf("%d",&n);
printf("Saisir un entier");
scanf("%d",&n);
i = 2;
while(i<=n){
printf("le carrée de %d est %d\n",i,i*i);
i += 2;
}
}
Programme
Exercice :
1. Ecrire un algorithme qui permet de calculer la
factorielle N! = 123…(N-1)N d'un
entier naturel N saisi au clavier (0!=1), en
utilisant la boucle :
a) pour.
b) tant que.
2. Traduire l'algorithme en langage
C
Solution :
(a) boucle pour
Algorithme factorielle_pour
variable
i, N, fact : de type entier;
Début
Afficher("Saisir un entier");
Lire(N);
fact 1;
Pour (i 1 à N) Faire {
fact fact*i;
}
FinPour
Afficher(fact);
Fin
(a) boucle for
#include<stdio.h>
main(){
int i,N,fact;
printf("Saisir un entier");
scanf("%d",&N);
fact = 1;
for(i=1;i<=N;i++)
fact *= i;
printf("%d! = %d\n",N,fact);
}
(b) boucle tant que
Algorithme factorielle_tant_que
variable
i, N, fact : de type entier;
Début
Afficher("Saisir un entier");
Lire(N);
fact 1;
i 1;
Tant Que(i<=N) Faire{
fact fact*i;
i i + 1;
}
FinTQ
Afficher(fact);
Fin
(b) boucle while
#include<stdio.h>
main(){
int i,N,fact;
printf("Saisir un entier");
scanf("%d",&N);
fact = 1;
i=1;
while(i<=N){
fact *= i;
i++;
}
printf("%d! = %d\n",N,fact);
}
Exercice :
1. Ecrire un algorithme qui calcule nm, (n et m
saisis au clavier) avec m>0, en utilisant la
boucle :
a. pour.
b. faire…tant que
c. tant que.
2. Traduire l'algorithme en langage
C
(a) algorithme
Algorithme puissance_pour
variable
i, n, m, res : de type entier;
Début
Afficher("Saisir n et m");
Lire(n,m);
res 1;
Pour (i 1 à m) Faire
res res*n;
FinPour
printf(n, " exposant ", m, " est ", res);
Fin
(c) programme C
#include<stdio.h>
main(){
int i, n, m, res;
printf("Saisir n et m");
scanf("%d%d",&n,&m);
res = 1;
for(i=1;i<=m;i++)
res *= n;
5 prix[i]
prix[12]
Ainsi, avec notre tableau prix, pourra-t-on
parler des variables indicées suivantes :
prix [i + 2]
prix [2 * i - 1]
à condition cependant que les valeurs des
expressions utilisées comme indice restent
bien comprises (ici) entre 1 et 12.
prix[1], prix[3] ou prix[i] se nomment souvent
des variables indicées
les valeurs entières servant de repère se
nomment des indices
Un élément de tableau est assimilable à une
variable
D’une manière générale, l’indice d’une
variable indicée peut être n’importe quelle
expression arithmétique entière.
Déclaration
Tout d’abord, nous conviendrons que tous les
éléments d’un tableau sont d’un même type
de base (entier, réel, caractère, booléen).
Par exemple, dans le tableau prix précédent,
tous les éléments pourraient être de type
réel.
Nous conviendrons de fournir cette information
à l’aide d’une instruction de déclaration telle
que :
tableau réel prix [20] // notes est un tableau de
20 éléments de type réel
Nous admettrons qu’il est possible de déclarer
plusieurs tableaux de même type, dans une
même instruction :
tableau entier t[30], x[5] // t est un tableau de 30
entiers, // et x est un tableau de 5 entiers
Manipulation des éléments
d’un tableau
d’une affectation,
figurer dans une expression arithmétique,
figurer dans la liste d’une instruction de
lecture ou d’écriture.
Affectation de valeurs à des
éléments d’un tableau
tableau entier x [4]
les instructions :
x[1] 12
x[2] 2
x[3] 15
x[4] 9
placent respectivement les valeurs 12, 2, 15
et 9 dans chacun des éléments du tableau x
caractère voyelle [6]
début
voyelle [1] ’a’
voyelle [2] ’e’
voyelle [3] ’i’
voyelle [4] ’o’
voyelle [5] ’u’
voyelle [6] ’y’
fin
place dans le tableau nommé voyelle les six caractères
correspondants aux 6 voyelles :
a e i o u y
La syntaxe d’un tableau en langage C:
Type_éléments
Nom_tableau[Nombre_éléments]
Nombre_éléments: le nombre
d’éléments du tableau.
Exercices
Réécrivez les algorithmes précédents
en langage C
Déclarer un tableau de 5 entiers, un
tableau de 20 caractères, un tableau
de 100 nombres réels en simple
précision et un tableau de 100
nombres réels en double précision.
Lecture des éléments d’un tableau
Soit tableau entier x [4]
on pourra lire une valeur pour son premier
élément par :
lire (x[1])
De même :
Lire( x[1], x[3])
lira deux valeurs entières qui seront affectées
respectivement au premier et au troisième
élément du tableau x.
Il est possible de lire des valeurs pour chacun
des éléments de x en utilisant une répétition
appropriée :
répéter pour i 1 à 4
lire (x[i])
Écriture des éléments d’un tableau
tableau entier nombre [6]
i:entier
nombre [1] 0
répéter pour i 2 à 5
nombre [i] 1
nombre [6] 2
répéter pour i 1 à 6
écrire nombre ([i])
0
1
1
1
1
2
Utilisation de variables indicées
dans des expressions
k:entier
tableau entier a[6], b[6]
écrire («donnez 6 entiers : »)
répéter pour k 1 à 6
lire (a [k])
répéter pour k 1 à 6
b[k] a [k] + 1
répéter pour k 1 à 6
écrire (b [k])
donnez 6 entiers : 8 5 10 3 20 1
9
6
11
4
21
2
Exercice 7.1: Quels résultats fournira ce
programme ?
tableau entier nombre [5]
i:entier
répéter pour i 1 à 5
nombre [i] := i * i
répéter pour i 1 à 5
écrire nombre [i]
Exercice 7.2: Quels résultats fournira ce
programme ?
tableau entier c [6]
i:entier
répéter pour i 1 à 6
lire (c[i])
répéter pour i 1 à 6
c [i] c [i] * c [i]
répéter pour i 1 à 3
écrire (c [i])
répéter pour i 4 à 6
écrire (2*c[i])
Type_éléments Nom_tableau[taille]={
valeur_1,valeur_2,…
valeur_n};
Indiquer les éléments de chacun
des tableaux suivants, ainsi que
leur nombre:
int a[5]={1,2,3,4,5};
int b[5],i;
b=a;
for(i=1;i<=5;i++) b[i]=a[i];
L’instruction b=a est fausse, car
l’affectation globale entre tableaux
est impossible en C.
printf("%d\t “,a[i]);
}
Propriétés de la taille d’un tableau en C
#define N 10
const int k=5;
int a[15];
int b[N];
char c[K];
float d[2*N];
double e[N+K+1];
Le tableau a à pour taille 15 (taille
définie par une constante numérique)
Le tableau b à pour taille 10 (taille
définie par un macro #define)
Le tableau c à pour taille 5 (taille définie
par une constante symbolique)
Le tableau d à pour taille 20 (taille
définie par l’expression symbolique 2*N).
Le tableau e à pour taille 16 (taille
définie par l’expression symbolique
N+K+1)
Introduction aux tableaux à deux
dimensions
Matière Matière Matière Matière
1 2 3 4
Mohamme 12 10 18 11
d
Driss 15 13 16 14
Fatima 14 16 17 15
il est possible de placer ces différentes valeurs
dans un tableau à deux dimensions.
12 10 18 11
15 13 16 14
14 16 17 15
Déclaration
tableau réel notes [3, 4] // réservation d’un
tableau de 20 valeurs (3 x 4)
10 20 30
40 50 60
Notez bien que si nous inversons
l’ordre des répétitions en
écrivant :
répéter pour j 1 à 3
répéter pour i 1 à 2
lire (x[i, j])
nous obtiendrons, avec les mêmes
données, un résultat différent
10 30 50
20 40 60
Écriture des éléments
Déclarer un tableau d’entiers de 2
dimension de taille [4,5], un
tableau de caractères de 2
dimension de taille [10,10].
Solution
int tab1[4][5];
char tab2[10][10];
Ecrire un programme qui demande
la saisie d’une matrice d’ordre 3
à coefficients entiers et qui
l’affiche ligne par ligne.
#include <stdio.h>
# define N 3
main()
{int tab[N][N];
int i,j;
Printf(`` saisie des coefficients de la matrice:\
n``);
For(i=0;i<N;i++)
For(j=0;j<N;j++)
{printf(``tab[%d][%d]=``,i,j);
Scanf(``%d``,&tab[i][j]);
}
Ecrire un programme qui saisit
deux matrices carrés d’ordre 4,
calcule leur somme et leur
produit et affiche les résultats
#include<stdio.h>
#define N 4
main(){
int a[N][N], a[N][N], s[N][N], p[N][N];
int i,j,k;
printf(‘’ saisie de la matrice a:\n’’);
for(i=0;i<N;i++)
for(j=0;j<N;i++)
{printf(‘’a[%d][%d]= ‘’,i,j);
scanf(‘’ %d‘’,&a[i][j]); }
printf(‘’ saisie de la matrice b:\n’’);
for(i=0;i<N;i++)
for(j=0;j<N;i++)
{printf(‘’b[%d][%d]= ‘’,i,j);
scanf(‘’ %d‘’,&b[i][j]); }
printf(‘’ calcul de la matrice s=a+b:\n’’);
for(i=0;i<N;i++){
for(j=0;j<N;i++)
{ s[i][j]=a[i][j] +b[i][j];
printf(‘’a[%d][%d]= ‘’,i,j); }
}
printf(‘’ calcul de la matrice p=a*b:\n’’);
for(i=0;i<N;i++)
{for(j=0;j<N;i++){
p[i][j]=0;
for(k=0;k<N;i++) p[i][j]+=a[i][k]+b[k]
[j];
printf(‘’p[%d][%d]= %d ‘’,i,j,p[i][j]);
}
}
}
Chaîne de cacactères
char ligne[13];
int i;
for(i=0;i<9;i++)
{
ligne[i]=‘a’+i; /* ‘a’+i accède au ième
caractère après ‘a’ */
}
ligne[9]=‘\0’;
Ces instructions permettront de remplir une
chaîne ligne caractère par caractère. En
suite, on place la caractère nul ‘\0’ de fin de
string.
i 0 1 2 3 4 5 6 7 8 10 11 12
Ligne[i] ‘a’ ‘b ‘c’ ‘d’ ‘e’ ‘f’ ‘g’ ‘h’ ‘i’ ‘\0’ ? ?
’
Le caractère nul `\0`, est un caractère de
contrôle qu’il ne faut pas oublier. Il doit être
placé obligatoirement en fin de chaîne. Sans
lui la chaîne n’a pas de fin
Initialisation de chaîne de caractères
char S[ 8]=``bonjour``;
printf(```%c``,S[0]); // affiche b
putchar(S[0]) // affiche b
scanf(``%c``,&S[0]) getchar(S[0])
scanf(``%s``,S) gets(S)
Quelques fonctions pour le taraitement
de chaînes
void*strcpy(char*chaîne1,char*chaîne2):
copie la chaîne 2 dans la chaîne1, +’\0’ et
renvoie chaîne 1.
int strcmp(char*chaîne1,char*chaîne2): compare les
chaînes de caractères chaîne 1 et chaîne 2, renvoie
un nombre: