Mini Projet 1
Mini Projet 1
Mini Projet 1
1
Mini Projet 2:
Ecrire un programme en C pour afficher une liste de mots dans l'ordre inverse.
Entrée:
*nombre de mots
*Liste de mots
Sortie:
*Liste de mots en ordre inverse
Exemple d’exécution:
1
Département Informatique
Faculté de sciences – Université Ibn Zohr
Objectif
L’objectif est d’initier les étudiants à la programmation à
travers l’utilisation du langage C.
#include <stdio.h>
main()
{
printf ("Hello World \n" ) ;
}
Analyse de l’exemple
La ligne :
main()
Déclarations
Les deux instructions :
• int i ;
• float x ;
sont des "déclarations".
La première précise que la variable nommée i est de type int, c'est-à-dire qu'elle est
destinée à contenir des nombres entiers (relatifs). Nous verrons qu'en C il existe plusieurs
types d'entiers.
L’autre déclaration précise que la variable x est de type float, c'est-à-dire qu'elle est
destinée à contenir des nombres flottants (approximation de nombres réels). Là encore,
nous verrons qu'en C il existe plusieurs types flottants.
En C, les déclarations des types des variables sont obligatoires et doivent être
regroupées au début du programme (on devrait plutôt dire : au début de la fonction
main). Il en ira de même pour toutes les variables définies dans une fonction ; on les
appelle "variables locales" (en toute rigueur, les variables définies dans notre exemple sont
des variables locales de la fonction main). Nous verrons également (dans le chapitre
consacré aux fonctions) qu'on peut définir des variables en dehors de toute fonction ; on
parlera alors de variables globales. 7
10
La fonction scanf doit être en mesure de ranger la valeur qu'elle aura lue
dans l'emplacement correspondant à cette variable, c'est-à-dire à son
adresse. Effectivement, nous verrons que & est un "opérateur" signifiant 12
"adresse de ".
#include <stdio.h>
Est en fait un peu particulière. Il s'agit de "directive" qui sera prise en compte avant la
traduction (compilation) du programme. Les directives, contrairement au reste du programme,
doivent être écrites à raison d'une ligne par ligne et elles doivent obligatoirement commencer en début
De ligne. Leur emplacement au sein du programme n'est soumis à aucune contrainte (mais une directive
ne s'applique qu'à la partie du programme qui lui succède). D'une manière générale, il est préférable
de les placer au début, comme nous l'avons fait ici.
Cet directive demande en fait d'introduire (avant compilation) des instructions (en langage C)
situées dans les fichiers stdio.h. Son rôle ne sera complètement compréhensible qu'ultérieurement.
Pour l'instant, notez que, dès lors que vous faites appel à une fonction prédéfinie, il est nécessaire
d'incorporer de tels fichiers, nommés "fichiers en-têtes", qui contiennent des déclarations
appropriées concernant cette fonction : stdio.h pour printf et scanf.
Fréquemment, ces déclarations permettront au compilateur d'effectuer des contrôles sur le nombre et
le type des arguments que vous mentionnerez dans l'appel de votre fonction. 13
15
16
17
➢ Le mot clé int représente les nombres entiers relatifs. Un bit est réservé pour
représenter le signe du nombre (0 pour un nombre positif et 1 pour un nombre
négatif)
➢ Les différents types d’entiers
• short int (short) ≥ 16 bits
• int ≥ 32 bits (processeur 32 bits)
• long int (long) ≥ 32 bits
• unsigned short int (unsigned short) ≥ 16 bits
• unsigned int ≥ 32 bits (processeur 32 bits)
• unsigned long int (long) ≥ 32 bits
C prévoit que, sur une machine donnée, on puisse trouver jusqu’à trois
« tailles » différentes d’entiers. Chaque taille impose naturellement ses
limites. Toutefois, ces dernières dépendent, non seulement du mot clé
considéré, mais également de la machine utilisée : tous les int n’ont pas la
même taille sur toutes les machines! 18
19
20
➢ Exemple en C :
➢ Des constantes entières : 48, -25
➢ Des constantes float : 12.43, -0.38
➢ Des constantes double : 4.25E+4
➢ Les constantes char : ‘a’, ‘r’, ‘+’, ‘$’
➢ Le caractère de saut de ligne \n
➢ Le caractère de tabulation \t 21
➢ Il est possible de déclarer une variable en lui donnant une valeur initiale.
➢ La syntaxe d’une déclaration de variable est la suivante:
22
#define a 10
int a = 10;
➢ Il est possible de déclarer que la valeur d’une variable ne doit pas changer lors de
l’exécution du programme.
Par exemple :
23
24
25
les expressions
o Les expressions en langage C peuvent être constituées de variables,
constantes, éléments de tableau et références à des fonctions combinés
entre eux à l’aide d’opérateurs.
26
27
Exemple:
++i est une expression qui réalise une action: incrémenter la valeur de i. Elle aura
comme valeur, la valeur de i aprés incrémentation.
i = 5 est une expression de valeur 5 qui réalise une action : affecter à i la valeur 5.
28
• Les opérateurs binaires ne sont définis que sur deux opérandes ayant le
même type : ( int, long int, float, double, long double ). Ils fournissent le
même type que leurs opérandes.
Expression sa valeur
a+b 13
a–b 7
a*b 30
a /b 3
a%b 1
Étant données v1 et v2 deux variables de type flottant et dont les valeurs respectives sont 12.5 et 2.0.
Expression sa valeur
v1 + v2 14.5
v1 – v2 10.5
v1 * v2 25.0
v1 / v2 6.25
Étant donnés c1 et c2 de type caractère représentant respectivement les caractères ‘P’ et ‘T’.
Expression sa valeur
c1 80 ( code ASCII de P)
c2 84 ( code ASCII de T)
c1 + c2 164
c1 + c2 + 5 169
c1 + c2 + ‘5’ 215
30
Le code ASCII du caractère ‘5’ est 53.
* / %
+ - moins prioritaire
31
Une expression mixte est une expression, dans laquelle interviennent des opérandes
de types différents. Dans une expression mixte, le compilateur met en place des
instructions de conversion de la valeur d’un opérande pour obtenir une expression
dont tous les opérandes ont le même type. Le résultat de la conversion sera exprimée
dans le type de plus haute précision.
On distingue deux types de conversion :
32
Une conversion de type suit un certain ordre qui permet de ne pas dénaturer la valeur
initiale.
int → long → float → double → long double
Cet ordre permet de convertir par exemple, int en long ou double ou long double
mais l’inverse n’est pas possible.
Exemple:
int n;
long p;
float x;
Les opérateurs arithmétiques ne sont pas définis pour le type short et char. Le
langage C prévoit que toute valeur de l’un de ces types apparaissant dans une
expression, est d’abord convertie en int. On parle alors de promotion numérique.
Exemple
Cas du type short:
34
Remarque :
La valeur entière associée à un caractère donné n’est pas la même sur toutes les machines.
Exemple
> Supérieur à
== égal à
!= Différent de
Exemple 1:
int a,b,c,d;
a<b==c<d
l’expression a < b est de type entier; elle prend la valeur 1 ou 0.
c < d est de type entier; elle prend la valeur 1 ou 0.
Suivant les valeurs de (a < b ) et de ( c< d ) , l’expression donnée aura comme valeur
1 ou 0.
Exemple 2:
int x, y, a;
L’expression x + y < a permet de comparer la valeur de l’expression ( x + y ) et la
valeur de a.
Le résultat sera 1 ou 0.
Remarque importante:
Une comparaison peut porter sur 2 caractères
a) cas de comparaison d’égalité:
( l’existence d’une conversion de promotion numérique char → int n’a guère
d’influence).
char c1,c2;
c1 = = c2 est vraie ( a la valeur 1) si c1 et c2 ont la même valeur ou bien c1
et c2 contiennent des caractères de même code ( le même caractère).
char c1,c2;
c1 < c2 est vraie si le code du caractère c1 a une valeur inférieure au code du
caractère c2.
Le résultat dépendra du codage employé. 38
|| Ou
! non
A priori, les opérateurs logiques ne portent que sur des opérandes qui sont eux-
mêmes des expressions logiques.
Mais, ils acceptent des opérandes numériques ( types int et float) avec les règles
de conversion implicites.
Dans ce contexte, on considère que :
La valeur nulle ( 0 ) correspond à faux
toute valeur non nulle correspond à vrai
39
0 || 0 0
Valeur non || 0 Valeur non
nulle nulle
0 || Valeur non Valeur non
nulle nulle
Valeur non || Valeur non Valeur non
nulle nulle nulle
! 0 Valeur non
nulle
! Valeur non 0 40
nulle
! plus prioritaire
&&
|| moins prioritaire
les opérateurs arithmétiques sont plus prioritaires que les opérateurs logiques.
L’opérateurs ! ( non) a une priorité supérieure à celle de tous les opérateurs
arithmétiques binaires et opérateurs relationnels.
41
! a == b équivaut à (! a) == b
int n,p;
Remarque:
• Le second opérande de l’opérateur && n’est pas évalué si le premier opérande a été
évalué á 0 car l’expression complète aura la valeur 0 ( faux).
L’expression valeur
( i >= 6 ) || ( c = = 119 ) 1
( c != ‘p’ ) || ( i + f <= 10 ) 1
Exemple 3 :
int i = 7;
float f = 5.5;
L’expression valeur
f> 5 1
!(f>5) 0
! ( i > f + 1) 0 43
La partie gauche de l’opérateur d’affectation " = " doit être une lvalue (left value).
lvalue est une expression à laquelle on peut affecter une valeur.
Les variables sont des lvalues.
La partie à droite de l’opérateur est une expression dont la valeur est affectée à la lvalue.
• La priorité de cet opérateur est inférieure à celle de tous les opérateurs arithmétiques et
les opérateurs de comparaison.
int i ;
int j =3;
45
Incrémentation
On distingue deux opérateurs unaires:
L’opérateur d’incrémentation noté ++
L’opérateur de décrémentation noté - -
Exemple:
int i = 5;
i++ équivaut à i = i + 1
i devient égale à 6
la valeur de cette expression est 5
++i équivaut á i = i + 1
i devient égal á 6
la valeur de cette expression est 6.
46
Décrémentation
L’opérateur de décrémentation noté --
• un opérateur de pré-décrémentation s’il est placé à gauche de la "lvalue" sur laquelle il porte.
La valeur de l’expression décrémentation est celle de la "lvalue" après décrémentation.
• un opérateur de post-décrémentation s’il est placé à droite de la "lvalue" sur laquelle il porte.
La valeur de l’expression décrémentation est celle de la "lvalue" avant décrémentation.
Exemple:
int i = 4 ;
--i équivaut à i = i - 1
i devient égale à 3
la valeur de cette expression est 3.
i-- équivaut à i = i - 1
i devient égale à 3
la valeur de cette expression est 4.
47
Priorité
Priorités relatives à ces opérateurs:
Ces opérateurs sont de plus haute priorité que les opérateurs arithmétiques.
Exemple:
int i, j, k ;
L’expression 3 * i++ * j-- + k++ équivaut à 3 * (i++)* (j--) + ( k++).
Si t est un tableau :
t[ i++] = 1 permet d’initialiser tous les éléments du tableau
_ affecte la valeur 1 à t[ 0]
_ puis incrémente de 1 la valeur de i.
48
Exemple:
int i,k;
i += k équivaut à i = i + k
i *= k équivaut à i = i * k.
49
Exemple:
int n , p;
50
Exemple1:
L’expression a*b, i + j
évalue a * b
puis i + j
L’éxpression i++, j = i + k
incrémente la valeur de i
puis évalue j = i + k.
Exemple2 :
51
Syntaxe de l’instruction if
L’instruction if présente deux formes :
if (expression)
instruction_1;
else
instruction_2;
if (expression)
instruction_1;
int x;
printf("Entrer un entier");
scanf("%d" ,&x);
if (x > 0)
printf("X est positif");
int x;
printf("Entrer un entier");
scanf("%d" ,&x);
if (x>0)
x = x – 1;
else
x = x + 2;
printf("La valeur de x est :%d" ,x); 53
switch (Variable)
{
case Valeur1 : Liste d'instructions;
break;
case Valeur2 : Liste d'instructions;
break;
case ValeursN : Liste d'instructions;
break;
default: Liste d'instructions;
}
"Variable" indique une expression dont la valeur est testée successivement par chacune
des cases.
Le mot clé default précède la liste d'instructions qui sera exécutée si l'expression n'est jamais
égale à une des valeurs.
Le mot clé break indique la sortie de la structure conditionnelle.
54
#include<stdio.h>
main()
{
char operation ;
int a=5, b=-7 ;
printf( "Choisir une opération (+ ou - ou *) : " ) ;
scanf("%c",&operation);
switch (operation)
{
case '+': printf("\n a + b = %hd", a+b) ;
break ;
case '-': printf("\n a - b = %hd", a-b) ;
break ;
case '*': printf("\n a * b = %hd", a*b) ;
break ;
default : printf("\n Mauvais choix !") ;
}
}
55
1) la structure : while
2) la structure : do - while
3) la structure : for
while ( <expression> )
<bloc d'instructions>
• Tant que l'<expression> fournit une valeur différente de zéro, le <bloc d'instructions>
est exécuté.
• Si l'<expression> fournit la valeur zéro, l ’exécution continue avec l'instruction qui suit
le bloc d'instructions. 56
• Le <bloc d'instructions> est exécuté zéro ou plusieurs fois.
int I = 0 ;
while (I<10)
{
printf("%i \n", I);
I++;
}
57
La structure do - while en C
do{
<bloc d'instructions>
}while ( <expression> );
Le <bloc d'instructions> est exécuté au moins une fois et aussi longtemps que
l'<expression> fournit une valeur différente de zéro.
En pratique, la structure do - while n'est pas si fréquente que while; mais dans certains cas,
elle fournit une solution plus élégante. Une application typique de do - while est la saisie
de données qui doivent remplir une certaine condition:
58
59
<expr1> ;
<expr2> est évaluée avant chaque passage de la
while ( <expr2> ) boucle. Elle est utilisée pour décider si la boucle est
répétée ou non.
{
<bloc d'instructions>
<expr3>; <expr3> est évaluée à la fin de chaque passage de la
} boucle. Elle est utilisée pour réinitialiser les données
de la boucle.
60
#include <stdio.h>
main()
int n, tot ; {
int i, n, som ;
for (tot=0, n=1 ; n<101 ; n++)
tot+=n ;
som = 0 ;
for (i=0 ; i<4 ; i++)
printf ("La somme des nombres de 1 à 100 est %d\n", tot) ; { printf ("donnez un entier ") ;
scanf ("%d", &n) ;
som += n ;
}
printf ("Somme : %d\n", som) ;
}
61
Ne peut être utilisée que dans le corps d’une boucle ou d’un "switch " et
provoque la fin de ces instructions.
Exemple:
#include<stdio.h>
main()
{
int l_indice ;
for(l_indice = 1; l_indice<10; l_indice++)
{
if(l_indice == 5){
break; }
printf("%d ", l_indice) ;
}
}
62
Ne peut être utilisée que dans le corps d’une boucle while, do ou for. Son effet et
d’interrompre l’exécution des instructions de la boucle et de relancer l’évaluation du
test.
Exemple:
#include<stdio.h>
main()
{
int l_indice ;
for(l_indice =1; l_indice<10; l_indice++)
{
if(l_indice == 5)
continue ;
printf("%d ", l_indice) ;
}
}
63
64
La déclaration
int JOURS[12]={31,28,31,30,31,30,31,31,30,31,30,31};
65
Exemples
Les déclarations suivantes en C:
int A[25]; ou bien long A[25];
float B[100]; ou bien double B[100];
int C[10];
char D[30];
Mémorisation
En C, le nom d'un tableau est le représentant de l'adresse du premier élément du tableau. Les adresses des autres composantes
sont calculées (automatiquement) relativement à cette adresse.
Exemple:
short A[5] = {1200, 2300, 3400, 4500, 5600};
Si un tableau est formé de N composantes et si une composante a besoin de M octets en mémoire, alors le tableau occupera de
N*M octets. 66
Réservation automatique
Si la dimension n'est pas indiquée explicitement lors de l'initialisation, alors l'ordinateur réserve
automatiquement le nombre d'octets nécessaires.
Exemples
int A[ ] = {10, 20, 30, 40, 50};
==> réservation de 5*sizeof(int) octets (dans notre cas: 10 octets)
float B[ ] = {-1.05, 3.33, 87e-5, -12.3E4};
==> réservation de 4*sizeof(float) octets (dans notre cas: 16 octets)
int C[ ] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};
==> réservation de 10*sizeof(int) octets (dans notre cas: 20 octets) 67
68
Exemple
Exemple
MAX = (A[0]>A[1]) ? A[0] : A[1];
A[4] *= 2;
En C,
- l'accès au premier élément du tableau se fait par T[0]
- l'accès au dernier élément du tableau se fait par T[N-1]
69
71
/* Affichage du tableau */
printf("Tableau donné :\n");
for (I=0; I<N; I++)
printf("%d \n", T[I]);
/* Calcul de la somme */
for (SOM=0, I=0; I<N; I++)
SOM += T[I];
/* Edition du résultat */
printf("Somme de éléments : %ld\n", SOM);
}
72
73
Remarques et précisions
• Les identificateurs d’une fonction ou d’une variable obéissent aux mêmes règles
de construction.
• Le type d’une fonction est déterminé par le type de résultat qu’elle retourne : int,
long int, char, double etc…. Une fonction qui ne renvoie pas de valeur au
programme appelant est de type void. Le type par défaut d’une fonction est int. 74
75
Définition :
double carré_réel (double lvalue)
{
return lvalue * lvalue ;
}
Appel :
carré_réel(5.6) ;
76