0% ont trouvé ce document utile (0 vote)
78 vues49 pages

Cours 1

Transféré par

mncfb02
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
78 vues49 pages

Cours 1

Transféré par

mncfb02
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Programmation en C

et C++
ALTN51
L3 APP LSI

Marwa HARZI --- [Link]@[Link]


Soufia BENNAI --- [Link]@[Link]

2022 / 2023
Présentation du cours

Cours de 30h répartis en:

§ DE (2h).
§ TPA (1h).
§ CTD / CTP (27h).

Évaluations :

§ Devoir écrit (DE) -- 60.00% (Mardi 04 octobre 2022)


§ Interrogation de TP (TP) -- 40.00%
Chapitre n°1 :
Les concepts de Base
en langage C
Qu'est-ce qu'un langage ?

• Un compromis entre la machine (qui ne comprend que des 0 et des 1, en fait des
niveaux électriques) et l'utilisateur ou programmeur.

• Un moyen de donner des instructions (ordres) à la machine.


• Possède une syntaxe : une grammaire extrêmement pointilleuse : la machine
ne fait pas d’efforts.

• Possède un lexique : orthographe des mots de référence, là encore pas d’effort.

• Plus ou moins souple

• De niveau plus ou moins élevé.

• Plusieurs familles de langages.


Pourquoi le langage C ?

• Langage impératif, déclaratif :

• Très diffusé : ressources importantes.

• Utilisé depuis longtemps : fiable, documenté, normalisé


• Portable : nombreux compilateurs.
• Sert de base à : JAVA, C++, C#.

• Cohérent.
Historique du langage C :

• Inspiré par les langages : BCPL (Basic Combined Programming Language) 1967 ([Link])

• B (amélioration de BCPL) 1970 par [Link] 1970 le langage B était fruste et non
portable

• 1971 : problème de B avec le PDP-11

• 1972 : première version de C écrite en assembleur (B. Kernighan/D. Ritchie)

• 1973 : écriture d'un compilateur C portable (A. Snyder)

• 1975 : écriture de PCC (Portable C Compiler) 1987 : début de normalisation par l'IEEE

• 1989 : norme ANSI X3-159 (d'où le nom C ANSI)

• depuis : apparitions de langages basés sur le C, souple et puissant.


Présentation du langage C

• Langage de bas-niveau : accès à des données que manipulent les ordinateurs.

• Conçu pour écrire des programmes de système d'exploitation : 90% du noyau


UNIX est écrit en C.

• Compilateur C écrit en C !
• Suffisamment général pour des applications variées : scientifiques, accès aux bases
de données.

• Langage de haut-niveau : modules (fichiers séparés).


Le C : un langage compilé

• L'ordinateur (le micro-processeur) ne comprend que le langage machine,


constitué d'une suite de 0 et de 1.

• Traduction des ordres donnés dans d'autres langages (PASCAL, C, Basic,...)

ü Traduction au fur et à mesure : interprétation

ü Traduction de tout un programme : compilation

• Compilateur : traduit un langage de programmation en langage machine


Principe de la compilation

Le programme en C est un fichier 'texte' (.c)


transformation en un fichier .exe (entête + code)

langage C modulaire : plusieurs fichiers .c ---> 1 fichier .exe

production de l'exécutable en 2 étapes :

• la compilation proprement dite

génération de fichiers .o 'intermédiaires'

• l'édition des liens

réunion de fichiers .o en un exécutable .exe


Les types

ü Un langage manipule des données :

ü Les valeurs manipulées en langage C sont physiquement des 0 et des 1, mais


elles sont regroupées : significations différentes

• nombres entiers

• nombres à virgule

• caractères

chaque valeur peut avoir un traitement différent : procédés de calcul, affichage, saisie.
Les types de base

Ø Le type char :
• Codé sur 1 octet,
• 255 valeurs différentes,
• Intervalle de -128 à +127 ou de 0 à 255,

• Utilisé pour les caractères ou pour les 'petits' nombres entiers.

Ø Le type int :
• Codage variable en taille, généralement 2 octets,
• 65536 valeurs différentes,
• Intervalle de -32768 à +32767, ou de 0 à +65535,
• Utilisé pour les nombres entiers.
Les types de base

Ø Le type float :
• Représentation de nombres en virgule flottante (dits nombres réels
mais limitations !)
• Codé sur 4 octets selon la norme IEEE-754.
• Intervalle de -1038 à -10-38 et de 10-38 à 1038

Ø Le type double :

• Extension du type float

• Codé sur 8 octets intervalle : de -10308 à -10-308 et de 10-308 à 10308


Les types de base

Les modificateurs : à mettre devant le type

signed types int et char : indique que les valeurs peuvent être positives ou
négatives : cas par défaut

unsigned types int et char : valeurs positives seulement

short type int : force le stockage sur 2 octets

long • type int : force le stockage sur 4 octets


• type double : stockage sur 10 octets (précision étendue)
Les types de base : résumé
Nom du type taille en octets intervalle

(signed) char 1 [-128;+127]

unsigned char 1 [0;255]

(signed) short int 2 [-32768;+32767]

unsigned short int 2 [0;65535]

(signed) int 2 ou 4, selon la machine

unsigned int 2 ou 4, selon la machine

(signed) long int 4


unsigned long int 4

Nom du type taille en octets intervalle


float 4 [-1038;+1038]
double 8 [-10308;+10308]
long double 10 [-104932;+104932]
Les types de base

Le type void : type particulier, signifiant 'rien'.


Utile pour écrire les premiers programmes.
vu en détail plus tard
Syntaxe et premier programme

L'ordinateur ne traduit pas des intentions, mais des ordres :


• domaine de l'utilisateur # domaine de l'ordinateur.
• capacités de l'utilisateur # capacités de l'ordinateur.

---> savoir comment lui donner des ordres pour qu'il soit efficace.

Solution language C :
compromis entre les utilisateur et ordinateur ---> qui nécessite une syntaxe très
stricte (pas d'ambiguïtés)
Syntaxe et premier programme

Le premier programme : présentation de la syntaxe

Directive permettant d'utiliser printf. Ne fait aucune action


en elle-même.

#include <stdio.h>
void main()
Ceci est une instruction, qui décrit ce
{ que le programme doit faire

printf("Bonjour\n");
Éléments indiquant le début et la fin du
programme. Ne font pas d'action.
}

Le rôle de ce programme est d'afficher le mot "Bonjour" à l'écran


Les commentaires

§ Lignes ignorées par le compilateur


§ utiles pour le programmeur pour noter ce qui est fait
§ 2 syntaxes :

1. C: encadrer le commentaire par /* (début) et */ (fin du commentaire)

2. C++ : faire débuter la ligne par //

La majorité des compilateurs comprend les 2 syntaxes/


Les variables

Toute valeur susceptible d'être modifiée (de varier) doit être stockée dans
une variable.

Pour manipuler une variable, on est obligé de préciser ce qu'elle est pour
que le langage puisse la traitercorrectement.

C'est le rôle d'une déclaration de variable :

présentation des éléments indispensables au compilateur :

• le nom de la variable

• le type de la variable
Les variables : déclaration

Le nom : c'est un identificateur à choisir. Moyen facile de repérer la variable.

Au niveau syntaxique :

• un nom de variable doit commencer par une lettre ou '_' (underscore)

• il y a 31 caractères significatifs

• différence minuscules/majuscules

• il peut contenir des chiffres, des lettres, et'_’

Exemples :

une_variable ---> correct


Toto ---> correct
x9 ---> correct
6o6on ---> incorrect : commence par un chiffre
une-variable ---> incorrect : contient le caractère ‘-’
ceciEstUnIdentificateurDeVariableA43Lettres ---> correct
Les variables : déclaration

Le type : permet au langage C de savoir comment coder les valeurs de la variable et comment les
traiter.
Au niveau syntaxique : on utilise les noms de types déjà vus :
char, int, float, double, void et les modificateurs adéquats.

La déclaration de variable se fait de la manière suivante :

type de la variable nom de la variable; !!! ne pas oublier le;

Exemples et significations :

Int unNombre; unNombre est une variable de type int


char x; x est une variable de type char
Float valeur_numero_4; valeur_numero_4 est une variable de type float
short int toto; toto est une variable de type short int
Les variables : déclaration

• Dans un programme, on ne peut utiliser que des


variables préalablement déclarées.(erreur sinon)

• Rôle et placement dans le programme : #include <stdio.h>


void main()
une déclaration de variable n'est pas une instruction,
{
elle n'effectue pas d'action visible ou sensible. déclarations de toutes les variables
instructions du programme
}
• Ce que fait le compilateur : il utilise dans la
mémoire une boîte pour stocker la valeur de la
variable, et repère son adresse (là où elle se situe).
Le nom est associé à cette adresse pour faciliter
l'écriture.
Les variables : déclaration
En pratique :

• On ne connaît pas toujours toutes les variables au début du programme : on peut les y
ajouter au fur et à mesure si on en a besoin.

• Problème de clarté : choisir des noms significatifs : facilite la relecture, ne change rien au
programme.

#include <stdio.h>
void main()
{
int valeur1;
float x_1;
float x_2;
}

Syntaxiquement correct (le compilateur accepte), ne fait rien.


Les variables : déclaration abrégées

• Écriture concise pour déclarer plusieurs variables de même type.

• Au lieu d'une variable: liste de variables séparées par des virgules, terminée par un point-
virgule.

Exemple :

Au lieu de:
int a;
int b; int c;

Écrire :
int a,b,c;
Opérations de base
Les affichages : utilisation de printf

• C'est une fonction (vu plus tard) qui permet de réaliser un affichage à l'écran.
• Capable d'afficher les valeurs des variables (pas leur nom !)
• syntaxe générale :

printf(texte_formaté, liste_de_variables…);

Qu'est-ce que le texte formaté ?

C'est un texte contenant des mots ou caractères à afficher : caractères normaux (lettres) et spéciaux (mise en page)

basé sur le codage ASCII : codes pour quelques caractères spéciaux


• \n : passage à la ligne
• \a : bip
• \t :tabulation horizontale
• \v : tabulation verticale
• un texte doit se trouver entre double guillemets " "
Opérations de base

Exemples : textes simples

printf("Bonjour"); affiche le texte Bonjourà l'écran


printf("\tSalut"); affiche une tabulation horizontale puis le texte Salut
printf("\a\a\nhello \n"); 'affiche' deux bips, un passage à la ligne, le texte hello, puis un autre passage à la ligne

Exemples : textes formatés, affichage de variables (pour afficher une variable : ne pas donner son nom dans le texte).
Exemple de programme pour afficher une variable

#include <stdio.h>
void main()
{
int uneValeur; /* declaration de valeur */
uneValeur = 5; /* affectation de la variable */
printf("uneValeur"); /* on veut afficher '5' */
}
Opérations de base

Le programme précédent affiche le texte uneValeur.

Utiliser un code de format dans la chaîne pour préciser que l'on veut afficher une valeur, le type de la
valeur est précisé.

Code type de la valeur à afficher


%d entier signé
%c caractère
%u entier non signé
%e nombre à virgule – exposant
%f nombre à virgule float
%lf nombre à virgule double
%g nombre à virgule : meilleure
%s chaîne de caractères
Opérations de base
La chaîne contient le texte et les formats, la liste des valeurs à afficher est précisée à la suite de la chaîne.

Exemple : reprise du programme précédent

uneValeur est un entier signé : format %d mis dans la chaîne

#include <stdio.h>
void main()
{
int uneValeur; /* declaration de valeur */
uneValeur = 5; /* affectation de la variable */
printf("%d",uneValeur); /* on veut afficher '5' */
}

printf("%d",uneValeur); se lit alors : - le format de la valeur à afficher est %d


ou
- affichage d'un entier signé dont la valeur est donnée par uneValeur.

On peut mélanger texte et formats : On peut afficher plusieurs valeurs avec un seul printf.
Opérations de base

Texte et plusieurs formats : exemple de programme

#include <stdio.h>
void main
{
char carac;
double valD;

carac='H';
valD = 3.14159;

printf("deux valeurs : %c et %lf\n",carac,valD);


}

résultat:
deux valeurs : H et 3.141590000
Opérations de base

Saisie de valeurs : emploi de scanf


comme printf, scanf est une fonction qui permet de faire des saisies, en
utilisant aussi des formats pour interpréter ce qui est saisi.
Emploi légèrement différent : pas de texte, seulement une chaîne avec des
formats.

En fait, on n'utilise qu'un format par scanf

saisie d'une valeur Û un scanf


possibilité de saisir plusieurs valeurs dans un scanf : emploi pas évident,
source de confusion.
Opérations de base

Saisie de valeurs : emploi de scanf


scanf s'emploie de la manière suivante :
scanf(chaine_de_format, adresse_de_la_variable);

différent de printf : variables, ici adresses.

Faire précéder la variable dont on veut saisir la valeur de l'opérateur


&.
Les codes pour les formats sont les mêmes que pour printf (%d, %u,
%f,…)
Opérations de base
Exemples de saisies avec scanf : différents types
#include <stdio.h>

void main()
{
unsigned int value_1;
char unCaractere;
double nbVirgule;
int x;

/* 4 saisies séparées pour les 4 valeurs */

scanf("%u",&value1);
scanf("%c",&unCaractere);
scanf("%lf",&nbVirgule);
scanf("%d",&x);

printf("%u %c %lf %d\n", value_1, unCaractere,


nbVirgule, x);
}
Opérations de base

• Effet de scanf : arrêt du programme en cours, attente d'une saisie :


entrer la valeur souhaitée et valider avec entrée.
• scanf n'affiche pas de message : le faire précéder d'un printf pour que
l'utilisateur sache ce qu'il doit faire (pas d'écran noir sans instructions,
recommandé, pas obligatoire)
• ne pas inclure de codes de mise en page dans le scanf, notamment pas
de \n !!!
• Nécessitera d'appuyer 2 fois sur entrée : une fois pour terminer le
format du scanf, une fois pour valider.
Les expressions

ü Une expression est une valeur qui peut être calculée par l'ordinateur,
qui contient des termes et des opérateurs reliés par une syntaxe
précise.
ü Plus simplement : une suite de symboles qui est comprise par le
langage et qui donne un résultat.

ü Déjà connu : les expressions mathématiques qui donnent une valeur


• 1+2´4-(5/6) est une expression mathématique valide et
calculable, qui vaut : 49/6

• !21+ ´ ´2 n'est pas une expression, bien que constituée de


symboles tous connus : ne respecte pas une syntaxe
donnée.
Les expressions

• En C : même principe : règles de syntaxe et de priorités pour calculer la


valeur d'une expression.
• De plus, une expression a un type : sa valeur calculée sera utilisée par le
langage, donc doit avoir un type.

• Termes possibles dans une expression :


ü les variables peuvent être utilisées (puisqu'elles ont un type et
une valeur)
ü des constantes numériques peuvent être
utilisées
ü Opérateurs : nous en verrons tout un
ensemble.
Constantes numériques

• Constantes entières : nombre sans virgule, précédé ou non du signe -


exemples : 3 0 824 -12000

• Constantes caractère : les caractères sont des valeurs entières, on peut


leur attribuer une valeur comme pour les entiers ci-dessus, mais aussi
directement un caractère en l'encadrant de simples guillemets : la
valeur sera alors le code ASCII du caractère
exemples : 'a' 23 ‘H' ';'
Constantes numériques

• Constantes à virgule : un nombre écrit sous la forme classique ou


scientifique (avec exposant) : partie entière. partie décimale E
exposant
Exemples : 3.14 0.0001 1.27E+32 65634.23476432E-5

• Pour un nombre à virgule n'ayant pas de partie décimale : noter


juste le .
Exemple : 1. -8. Le point indique que ce n'est
pas un entier.
Opérateurs

Arité (cardinalité) des opérateurs : nombre de termes (ou opérandes)


Opérateurs mathématiques et priorités :

opérations classiques 2-aires :


addition : + soustraction : - multiplication : * division :/
* et / prioritaires sur + et -
modulo 2-aire : %

a%b donne le reste de la division entière de a par b.


ajout de parenthèses possible pour gérer les priorités : à employer sans
modération : ne change pas le programme, facile à lire!
Opérateurs d’affectation

Opérateur =
cet opérateur a un rôle particulier.
À sa gauche, on doit trouver une variable obligatoirement (et pas
une expression complexe)
À sa droite, on trouve une expression.
Rôle : calcule l'expression à droite de l'opérateur = et donne cette
valeur à la variable à gauche de cet opérateur.
Peut sembler évident, mais attention !
Opérateurs d’affectation
void main()
{
int a,b;
double d,e;

/* toujours la même chose : calcul de l'expression */


/* à droite, affectation à la variable de gauche */

a=4;
b=a+2;
a=b*5+a/2-17;

d= 6.02252E+23;
e=5.*d;

/* curiosité ? */
b = b-1;
e = e/1000.;
}
Opérateurs d’affectation

Une affectation n'est pas une équation !


Lorsque l'on écrit b = b-1; (d'ailleurs l'équation n'aurait pas de
solutions !), on calcule la valeur de b-1, puis on range cette valeur
dans b.

retour sur les trois premières lignes du programme, pour exemple :

a=4; l'expression vaut 4 : a reçoit cette valeur


b=a+2; calcul de a (4) +2 : l'expression vaut 6, b reçoit 6
b=b-1; calcul de b (6) -1, l'expression vaut 5, b reçoit 5
Opérateurs d’affectation

Une affectation est elle-même une expression ! Sa valeur est égale à la


valeur calculée et donnée à la variable de gauche.
Reprise des exemples précédents :
a=4; est une expression qui vaut 4
b=a+2; est une expression qui vaut 6
b=b-1; est une expression qui vaut 5

possibilité d'affectations multiples du type :


void main()
{
int a,b,c;

a=b=c=17;
}
Opérateurs d’affectation

Expression calculée (ou évaluée) de droite à gauche :


a=b=c=17; 1
2
3

étape 1 : évaluation de 17, rangement dans la variable c;


étape 2 : c=17 est une expression qui vaut 17, rangée dans b par :
b=c=17;
étape 3 : b=c=17 est une expression qui vaut 17, rangée dans a par
a=b=c=17;
étape 4 : a=b=c=17 est une expression qui vaut 17, qui n'est pas
rangée.
Opérateurs composés

Combinaison d'opérateurs mathématiques et d'affectation :


permet d'appliquer un opérateur mathématique à une variable puis d'affecter
le résultat de cette opération à lavariable.
Opérateurs :
addition et affectation : +=
soustraction et affectation : -=
multiplication et affectation :*=
division et affectation: /=

emploi par l'exemple :

x += 4; signifie x=x+4; e *= d+5.1; signifie e=e*(d+5.1);


y /= x; signifie y =y/x; et ainsi de suite
Changer le type d’une expression
• Les expression peuvent contenir des termes qui sont de type différents : le
compilateur accepte ces expression (elles sont valides) mais effectue des
changements de type pour les valeurs.
• Perte de précision possible (le compilateur émet alors des warnings) cette
opération s'appelle cast ou transtypage.

Exemple :

int a,b;
double x;
a=5;
x=3.1415926;
b=a+x; /* l'expression est affectee a un int ! */

warning C4244: '=' : conversion from 'double ' to 'int ',


possible loss of data
Changer le type d’une expression
Les expression peuvent contenir des termes qui sont de type
différents : le compilateur accepte ces expression (elles sont valides)
mais effectue des changements de type pour les valeurs.
Perte de précision possible (le compilateur émet alors des warnings)
cette opération s'appelle cast ou transtypage.
Exemple :
int a,b;
double x;
a=5;
x=3.1415926;
b=a+x; /* l'expression est affectee a un int ! */

warning C4244: '=' : conversion from 'double ' to 'int ',


possible loss of data
Changer le type d’une expression
Une opération peut ne pas donner le résultat escompté :
exemple classique, lorsque l'on divise 2 entiers entre eux : division
entière même si le résultat est stocké dans un double !
Le transtypage est effectué au fur et à mesure de l'évaluation de
l'expression, pas en analysant l'expression !
Exemple :
int a=5;
int b=2;
double x=a/b;

printf("x=%lf\n",x) affichera 2.0000 !

a/b est une division entière, résultat 2, converti en double ensuite !


Changer le type d’une expression

• Solution : effectuer soit même les transtypages pour être certain du type des valeurs !

• Pour transtyper une expression d'un type en un autre, il suffit de noter entre parenthèses le type
souhaité devant l'expression :

• (type_souhaité)expression.

• Soit i un entier : (double)i donne la même valeur mais en type double

• soit x un double : (int)x transtypera x en int, en supprimant les chiffres après la virgule
Changer le type d’une expression
Exemple pour faire la division correctement : il faut transtyper a et b
individuellement en double !
Si l'on écrit : x=(double)(a/b); ne change rien
x=(double)a/(double)b; on aura le résultat souhaité

Vous aimerez peut-être aussi