Академический Документы
Профессиональный Документы
Культура Документы
Le langage C est un langage volu et structur, assez proche du langage machine destin des applications de contrle de processus (gestion d'entres/sorties, applications temps rel ...). Le langage C possde assez peu d'instructions, il fait par contre appel des bibliothques, fournies en plus ou moins grand nombre avec le compilateur.
Edition du programme source, l'aide d'un diteur (traitement de textes). Compilation du programme source, c'est dire cration des codes machine destins au microprocesseur utilis. Le compilateur indique les erreurs de syntaxe mais ignore les fonctions-bibliothque appeles par le programme. Editions de liens: Le code machine des fonctionsbibliothque est charg, cration d'un fichier binaire, non listable, appel fichier executable Excution du programme
Exemple
#include <stdio.h> /* bibliotheque d'entrees-sorties standard */ #include <conio.h> void main() { int a, b, somme ; /* dclaration de 3 variables */ puts("BONJOUR"); /* utilisation d'une fonction-bibliotheque */ a = 10 ; /* affectation* / b = 50 ; /* affectation */ somme = (a + b)*2 ; /* affectation et oprateurs */ printf( Voici le resultat : %d\n , somme) ; puts("Pour continuer frapper une touche..."); getch(); /* Attente d'une saisie clavier */ }
LES DIFFERENTS TYPES DE VARIABLES Les entiers Numration: En dcimal les nombres s'crivent tels que, prcds de 0x en hexadcimal. exemple: 127 en dcimal s'crit 0x7f en hexadcimal.
Remarque: En langage C, le type char est un cas particulier du type entier: un caractre est un entier de 8 bits Les rels Un rel est compos - d'un signe - d'une mantisse- d'un exposant Un nombre de bits est rserv en mmoire pour chaque lment.
4
LES INITIALISATIONS Le langage C permet l'initialisation des variables dans la zne des dclarations: char c; c = 'A'; int i; i = 50; est quivalent char c = 'A';
est quivalent
int i = 50;
Cette rgle s'applique tous les nombres, char, int, float ...
SORTIES DE NOMBRES OU DE TEXTE A L'ECRAN LA FONCTION PRINTF Exemple: affichage d'un texte: printf("BONJOUR"); /* pas de retour la ligne du curseur apres l'affichage, */ printf("BONJOUR\n"); /* affichage du texte, puis retour la ligne du curseur. */ La fonction printf exige l'utilisation de formats de sortie, avec la structure suivante:
printf("%format",nom_de_variable);
#include <stdio.h> #include <conio.h> void main() { char c; c ='A'; /* c est le caractere alphanumerique A */ printf("decimal = %d ASCII = %c\n",c,c); puts("Pour continuer frapper une touche..."); getch(); /* Attente d'une saisie clavier */ }
7
AUTRES FONCTIONS DE SORTIES Affichage d'un caractre: La fonction putchar permet d'afficher un caractre: c tant une variable de type char, l'criture putchar(c); est quivalente printf("%c\n",c); Affichage d'un texte: La fonction puts permet d'afficher un texte: l'criture puts("bonjour"); est quivalente printf("bonjour\n");
Il vaut mieux utiliser puts et putchar si cela est possible, ces fonctions, non formates, sont d'excution plus rapide, et ncessitent moins de place en mmoire lors de leur chargement.
LES OPERATEURS
Oprateurs arithmtiques sur les rels: + - * / avec la hirarchie habituelle. Oprateurs arithmtiques sur les entiers: + - * / (quotient de la division) % (reste de la division) avec la hirarchie habituelle. Exemple particulier: char c,d; c = 'G'; d = c+'a'-'A'; Les caractres sont des entiers sur 8 bits, on peut donc effectuer des oprations. Sur cet exemple, on transforme la lettre majuscule G en la lettre minuscule g.
Oprateurs logiques sur les entiers: & ET | OU ^ OU EXCLUSIF ~ COMPLEMENT A UN DECALAGE A GAUCHE DECALAGE A DROITE. Exemples: p = n 3; /* p est gale n dcal de 3 bits gauche */ p = n 3; /* p est gale n dcal de 3 bits droite */
L'oprateur sizeof(type) renvoie le nombre d'octets rservs en mmoire pour chaque type d'objet. Exemple: n = sizeof(char); /* n vaut 1 */
oui
condition vraie
non
alors
{BLOC1 INSTRUCTIONS}
bloc 1 d' instructions bloc 2 d' instructions
suite du programme
11
Syntaxe en C
if (expression)
{ ............; /* bloc 1 d'instructions */ ............; ............; } else { ............; /* bloc 2 d'instructions */ ............; ............; } Remarque : les {} ne sont pas ncessaires lorsque les blocs ne comportent qu'une seule instruction.
12
oui
condition vraie
non
suite du programme
13
if ((expression1) && (expression2)) " si l'expression1 ET l'expression2 sont vraies " if ((expression1) || (expression2)) " si l'expression1 OU l'expression2 est vraie " if (!(expression1)) " si l'expression1 est fausse "
test de OU LOGIQUE
14
switch(variable de type char ou int) au cas o la variable vaut: { case valeur1: ......; - cette valeur1: excuter ce bloc d'instructions. .......; break; case valeur2:........; - cette valeur2: excuter ce bloc d'instructions. ........; break; . etc ... . default: .......;- aucune des valeurs prcdentes: excuter ce bloc ........; d'instructions, pas de "break" ici. } le bloc "default" n'est pas obligatoire. Linstruction switch correspond une cascade dinstructions if ...else
15
tant
que
(expression
vraie)
oui
condition vraie
non
faire{BLOC D'INSTRUCTIONS}
bloc d' instructions
16
Syntaxe en C
while (expression) { ............; /* bloc d'instructions */ ............; ............; }
Le test se fait d'abord, le bloc d'instructions n'est pas forcment excut. Remarque: les {} ne sont pas ncessaires lorsque le bloc ne comporte qu'une seule instruction.
17
initialisation
non
{BLOC D'INSTRUCTIONS}
bloc d'instructions
modification
suite du programme
18
Syntaxe en C
for(initialisation ; condition de continuit ; modification) { ............; /* bloc d'instructions */ ............; ............; } Remarques: Les {} ne sont pas ncessaires lorsque le bloc ne comporte qu'une seule instruction. Les 3 instructions du for ne portent pas forcment sur la mme variable. Une instruction peut tre omise, mais pas les ;
19
Exemples
i = 0
non
suite du programme
i=i+1
20
boucle infinie
Utilisation de variables diffrentes resultat = 0; for(i = 0 ; resultat<30 ; i++) { ............; /* bloc d'instructions */ ............; ............; resultat = resultat + 2*i; }
21
bloc d'
rpter{BLOC D'INSTRUCTIONS} tant que (expression vraie)
instructions
oui
condition vraie
non
suite du programme
22
Syntaxe en C
do { ............; /* bloc d'instructions */ ............; ............; } while (expression);
23
En langage C, une expression nulle de type entier (int) est fausse, une expression non nulle de type entier (int) est vraie.
Exemples: int a,b,c,delta; delta = b*b-4*a*c; if(delta != 0) { ....... } est quivalent int a,b,c,delta; delta = b*b-4*a*c; if(delta) { ....... }
est quivalent
24
NOTION DE PROTOTYPE
Les
fichiers de type ".h" (conio.h, dos.h stdio.h etc...), appels fichiers d'en tte contiennent la dfinition des prototypes des fonctions utilises dans le programme. Le prototype prcise la syntaxe de la fonction: son nom, les paramtres ventuels passer, la valeur ventuelle retourne au programme.
Grce
aux lignes "#include", le compilateur lit les fichiers de type ".h" et vrifie que la syntaxe de l'appel la fonction est correcte.
25
Exemple: clrscr
fonction prototype prototype dans Efface l'cran de la fentre dos. void clrscr(); conio.h et donc bibliothque charger.
26
prototype dans conio.h et donc bibliothque charger. La fonction kbhit renvoie un entier au programme. Cet entier vaut 0, tant qu'il n'y a pas eu de frappe clavier. On ne peut donc pas crire la fonction telle que. Il faut la traiter comme une variable de type int. ex: while(kbhit ()== 0); /* tend que kbhit vaut 0,
27
Exemple: log
fonction prototype prototype dans Fonction logarithme nprien.. double log(double); math.h et donc bibliothque charger.
La fonction log, renvoie au programme un rel. On traite la fonction comme une variable de type double. Il faut lui passer un paramtre de type double.
LES POINTEURS
29
Une variable de type pointeur se dclare l'aide de l'objet point prcd du symbole * (oprateur d'indirection).
Exemple: char *pc; pc est un pointeur pointant sur un objet de type char int *pi; pi est un pointeur pointant sur un objet de type int float *pr; pr est un pointeur pointant sur un objet de type float
Exemple: char *pc; *pc = 34 ; printf("CONTENU DE LA CASE MEMOIRE: %c\n",*pc); printf("VALEUR DE L'ADRESSE EN HEXADECIMAL: %p\n",pc);
30
/* pi pointe sur un objet de type entier */ /* pr pointe sur un objet de type rel */ /* pc pointe sur un objet de type caractre */ /* 421 est le contenu de la case mmoire pi et des 3 suivantes */ /* on range 53 4 cases mmoire plus loin */ /* on range 0xabcd 8 cases mmoire plus loin */ /* 45,7 est rang dans la case mmoire pr et les 3 suivantes */ /* incrmente la valeur du pointeur pr (de 4 cases mmoire) */ pr VAUT: %p\n",pr); /* affichage de la valeur de l'adresse pr */ /* le contenu de la case mmoire pc est le code ASCII de 'j' */ /* dcrmente la valeur du pointeur pc (d'une case mmoire) */
31
ALLOCATION DYNAMIQUE
Lorsque l'on dclare une variable char, int, float .... un nombre de cases mmoire bien dfini est rserv pour cette variable. Il n'en est pas de mme avec les pointeurs. Exemple: char *pc; *pc = 'a'; /* le code ASCII de a est rang dans la case mmoire pointe par c */ *(pc+1) = 'b'; /* le code ASCII de b est rang une case mmoire plus loin */ *(pc+2) = 'c'; /* le code ASCII de c est rang une case mmoire plus loin */ *(pc+3) = 'd'; /* le code ASCII de d est rang une case mmoire plus loin */
Dans cet exemple, le compilateur a attribu une valeur au pointeur c, les adresses suivantes sont donc bien dfinies; mais le compilateur n'a pas rserv ces places: il pourra trs bien les attribuer un peu plus tard d'autres variables. Le contenu des cases mmoires pc pc+1 pc+2 pc+3 sera donc perdu.
32
Exercice : adr1 et adr2 sont des pointeurs pointant sur des rels. Le contenu de adr1 vaut -45,78; le contenu de adr2 vaut 678,89. Ecrire un programme qui affiche les valeurs de adr1, adr2 et de leur contenu.
#include <stdio.h> #include <conio.h> #include <alloc.h> void main() { float *adr1,*adr2; adr1 = (float*)malloc(4); adr2 = (float*)malloc(4); *adr1 = -45.78; *adr2 = 678.89; printf("adr1 = %p adr2 = %p r1 = %f r2 = %f\n",adr1,adr2,*adr1,*adr2); free(adr1); free(adr2); printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE "); getch(); }
33
EXERCICES
Exercice n 1: Saisir un texte. Ranger les caractres en mmoire. Lire le contenu de la mmoire et y compter le nombre d'espaces et de lettres e .
Exercice n 2: Saisir 6 entiers et les ranger partir de l'adresse adr_deb. Rechercher le maximum, l'afficher ainsi que son adresse.
34
Exemple: char c;
printf("TAPER UNE LETTRE: "); scanf("%c",&c); On saisit ici le contenu de l'adresse &c c'est dire le caractre c lui-mme. On peut donc aussi procder ainsi: char *adr; printf("TAPER UNE LETTRE: "); scanf("%c",adr); On saisit ici le contenu de l'adresse adr. Cette mthode s'applique aux caractres (char), aux entiers (int), aux rels (float).
35
LES TABLEAUX DE NOMBRES (INT ou FLOAT) Les tableaux correspondent aux matrices en mathmatiques. Un tableau est caractris par sa taille et par ses lments.
36
Exemples: int compteur[10]; float nombre[20]; Cette dclaration signifie que le compilateur rserve dim places en mmoire pour ranger les lments du tableau.
Exemples: int compteur[10]; le compilateur rserve des places pour 10 entiers, soit 20 octets en TURBOC et 40 octets en C standard. float nombre[20]; le compilateur rserve des places pour 20 rels, soit 80 octets. Remarque: dim est ncessairement une VALEUR NUMERIQUE. Ce ne peut tre en aucun cas une combinaison des variables du programme.
37
Utilisation
Un lment du tableau est repr par son indice. En langage C les tableaux commencent l'indice 0. L'indice maximum est donc dim-1. Appel: nom[indice] Exemples: compteur[2] = 5; nombre[i] = 6.789; printf("%d",compteur[i]); scanf("%f",&nombre[i]); Tous les lments d'un tableau (correspondant au dimensionnement maximum) ne sont pas forcment dfinis. D'une faon gnrale, les tableaux consomment beaucoup de place en mmoire. On a donc intrt les dimensionner au plus juste.
38
On peut initialiser les tableaux au moment de leur dclaration: Exemples: int liste[10] = {1,2,4,8,16,32,64,128,256,528}; float nombre[4] = {2.67,5.98,-8,0.09}; int x[2][3] = {{1,5,7},{8,4,3}}; /* 2 lignes et 3 colonnes */
39
TABLEAUX ET POINTEURS
En dclarant un tableau, on dfinit automatiquement un pointeur (on dfinit en fait l'adresse du premier lment du tableau). Les tableaux une dimension: Les critures suivantes sont quivalentes: dclaration int *tableau; tableau = (int*)malloc(sizeof(int)*10); *tableau *(tableau+i) tableau (tableau + i) tableau[0] tableau[i] &tableau[0] &(tableau[i])
int tableau[10];
le 1er lment un autre lment adresse du 1er lment adresse d'un autre lment
Remarque: La dclaration d'un tableau entrane automatiquement la rservation de places en mmoire. Ce n'est pas le cas lorsque l'on dclare un pointeur. Il faut alors utiliser une fonction d'allocation dynamique comme malloc.
40
TABLEAUX ET POINTEURS(suite)
Les tableaux plusieurs dimensions: Un tableau plusieurs dimensions est un pointeur de pointeur. Exemple: int t[3][4]; t est un pointeur de 3 tableaux de 4 lments ou bien de 3 lignes 4 lments.
t[0]
t[0][0] t[0][2]
t[1]
Les critures suivantes sont quivalentes: t[0] &t[0][0] t adresse du 1er lment t[1] &t[1][0] adresse du 1er lment de la 2me ligne t[i] &t[i][0] adresse du 1er lment de la ime ligne t[i]+1 &(t[i][0])+1 adresse du 1er lment de la ime +1 ligne
t[2]
t[2][3]
41
En langage C, les chanes de caractres sont des tableaux de caractres. Leur manipulation est donc analogue celle d'un tableau une dimension: Dclaration: char nom[dim]; ou bien char *nom; nom = (char*)malloc(dim); char *texte; texte = (char*)malloc(10);
Exemple:
Le compilateur rserve (dim-1) places en mmoire pour la chane de caractres: En effet, il ajoute toujours le caractre NUL ('\0') la fin de la chane en mmoire.
42
Saisie: On peut utiliser la fonction scanf et le format %s. Une chane tant un pointeur, on n'crit pas le symbole &. On utilisera de prfrence la fonction gets non formate.
char texte[10]; printf("ENTRER UN TEXTE: "); scanf("%s",texte); est quivalent
gets(texte);
Remarque: scanf ne permet pas la saisie d'une chane comportant des espaces: les caractres saisis partir de l'espace ne sont pas pris en compte (l'espace est un dlimiteur au mme titre que LF) mais rangs dans le tampon d'entre. Pour saisir une chane de type "il fait beau", il faut utiliser gets.
43
Comparaison (string.h): int strcmp(char *chaine1,char *chaine2) renvoie un nombre: - positif si la chane1 est suprieure la chaine2 (au sens de l'ordre alphabtique) - ngatif si la chane1 est infrieure la chane2 - nul si les chanes sont identiques. Aussi : strcnmp ; stricmp; strnicmp Copie (string.h): void *strcpy(char *chaine1,char *chaine2) recopie chaine2 dans chaine1 et renvoie l'adresse de chane1.
44
exemple: printf("ENTRER UN TEXTE: "); gets(texte); n = atoi(texte) ; printf("%d",n); /* affiche 123 si texte vaut "123" */ /* affiche 0 si texte vaut "bonjour" */
45
LES FONCTIONS
En langage C les sous-programmes s'appellent des fonctions. L'imbrication de fonctions n'est pas autorise en C: une fonction ne peut pas tre dclare l'intrieur d'une autre fonction. Par contre, une fonction peut appeler une autre fonction. Cette dernire doit tre dclare avant celle qui l'appelle.
Une fonction possde un et un seul point d'entre, mais ventuellement plusieurs points de sortie ( l'aide du mot return).
Une variable connue uniquement d'une fonction ou de main() est une variable locale. Une variable connue de tout le programme est une variable globale.
46
47
48
49
51
52
FONCTIONS RECURSIVES
Le langage C autorise la rcursivit des appels de fonctions. Celle-ci peut prendre deux aspects:
-rcursivit
elle mme, -rcursivit croise: lappel dune fonction entrane celui dune autre fonction qui, son tour appelle la fonction initiale(le cycle pouvant dailleurs faire intervenir plus de deux fonctions). Exemple classique: Int fact(int n) { If (n>1) return(fac(n-1)*n); Else return(1); }
55
Exercices
Exercice n:1 Un programme contient la dclaration suivante: float liste[8] = {1.6,-6,9.67,5.90,345,-23.6,78,34.6}; /* variable globale */ Ecrire une fonction de prototype float min(void) qui renvoie le minimum de la liste. Ecrire une fonction de prototype float max(void ) qui renvoie le maximum de la liste. Les mettre en oeuvre dans main(). Exercice n:2 Ecrire un programme qui construit et affiche le triangle de Pascal en calculant les coefficients binomiaux: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 On n'utilisera pas de tableau, c.--d. il faudra calculer les coefficients d'aprs la formule ci-dessous, tout en dfinissant et utilisant les fonctions adquates.
56
Structures
Le langage C autorise la dclaration de types particuliers: les structures . Une structure est constitue de plusieurs lments de mme type ou non. Exemple: Dclaration: typedef struct { char nom[10]; char prenom[10]; int age; float note; } fiche; /* On dfinit un type struct */
Utilisation: On dclare des variables par exemple: fiche f1,f2; L'affectation globale est possible avec les structures: on peut crire:
f2 = f1;
57
STRUCTURES ET TABLEAUX
Dclaration:
fiche f[10];
Utilisation: strcpy(f[i].nom,"DUPONT") /* pour un indice i quelconque */ strcpy(f[i].prenom,"JEAN"); f[i].age = 20; f[i].note = 11.5;
58
STRUCTURES ET POINTEURS
On peut dclarer des pointeurs sur des structures. Cette syntaxe est trs utilise en langage C, elle est notamment ncessaire lorsque la structure est un paramtres modifiable dans la fonction. Un symbole spcial a t cr pour les pointeurs de structures, il s'agit du symbole -> Exemple: ( partir de la structure dfinie prcdemment) Dclaration: fiche *f; /* on dclare un pointeur de fiche */ Utilisation: f = (fiche*)malloc(sizeof(fiche)); /* rserve de la place */ strcpy(f->nom,"DUPONT"); strcpy(f->prenom,"JEAN"); f->age = 20; f->note = 11.5;
Exercice Crer une structure point{int num;float x;float y;} , puis crire Une fonction saisie permet de saisir un point, une fonction affiche permet d'afficher un point.
59
SOLUTION
#include <stdio.h> #include <conio.h> void saisie(point *pp,int i) {float xx,yy; printf("\nRELEVE N%1d\n",i); printf("X= ");scanf("%f",&xx); printf("Y= ");scanf("%f",&yy); pp->num = i;pp->x = xx;pp->y = yy;} void affiche(point *pp) {printf("\nRELEVE N%1d",pp->num); printf("\nX= %f",pp->x); printf("\nY= %f\n",pp->y);} void main() { point p[4]; /* tableau de points */ int i; printf("SAISIE:\n\n"); for(i=0;i<4;i++)saisie(&p[i],i); printf("\n\nRELECTURE:\n\n"); for(i=0;i<4;i++)affiche(&p[i]); printf("\n\nPOUR SORTIR FRAPPER UNE TOUCHE "); getch();}
60
LES FICHIERS
Un fichier est un ensemble d'informations stockes sur une mmoire de masse (disque dur, disquette, bande magntique, CD-ROM). En C, un fichier est une suite d'octets. Les informations contenues dans le fichier ne sont pas forcment de mme type (un char, un int, une structure ...) On distingue gnralement deux types d'accs: Accs squentiel Accs direct Un pointeur fournit l'adresse d'une information quelconque.
pointeur
61
LES FICHIERS
Il existe dautre part deux faons de coder les informations stockes dans un fichier :
1- En BINAIRE : Fichier dit "binaire", les informations sont codes telles que. Ce sont en gnral des fichiers de nombres. Ils ne sont pas listables.
2- En ASCII : Fichier dit "texte", les informations sont codes en ASCII. Ces fichiers sont listables. Le dernier octet de ces fichiers est EOF (caractre ASCII spcifique).
62
64
3 - Fermeture: int fclose(FILE *fichier); Il faut toujours fermer un fichier la fin d'une session. Exemple : FILE *fichier ; fichier = fopen(" a :\toto.dat ", " rb ") ; /* Ici instructions de traitement */ fclose(fichier) ; 4 - Destruction: int remove(char *nom); Exemple : remove(" a :\toto.dat ") ;
65
66
67
int fread(void *p,int taille_bloc,int nb_bloc,FILE *fichier); analogue fwrite en lecture. Retourne le nombre de blocs lus, et 0 la fin du fichier.
int fscanf(FILE *fichier, char *format, liste d'adresses); analogue fprintf en lecture.
68
EXERCICES
Exercice 1: Copier un fichier texte dans un autre: crer un fichier "essai.dat" sous diteur. Tester le programme en vrifiant aprs excution la prsence du fichier copi dans le directory. Exercice 2: Calculer et afficher le nombres de caractres d'un fichier ASCII (Utiliser n'importe quel fichier du rpertoire). Exercice 3: Crer et relire un fichier binaire de 10 entiers. Exercice 4: Crer et relire un fichier texte de 5 chanes de 3 caractres. Exercice 5: Ajouter une fiche (c'est dire une chane de 3 caractres) au fichier prcdent et relire le fichier.
70
Ecrire un programme en C qui lit les points de N lves d'une classe dans un devoir et les mmorise dans un tableau POINTS de dimension N. 1- Rechercher et afficher: - la note maximale, - la note minimale, - la moyenne des notes. 2- A partir des POINTS des lves, tablir un tableau NOTES de dimension 5 qui est compos de la faon suivante: NOTES[4] contient le nombre de notes suprieur ou gal 16 NOTES[3] contient le nombre de notes suprieur ou gal 14 et infrieur strictement 16 NOTES[2] contient le nombre de notes suprieur ou gal 12 et infrieur strictement 14 NOTES[1] contient le nombre de notes suprieur ou gal 10 et infrieur strictement 12 NOTES[0] contient le nombre de notes infrieur strictement 10
71
En utilisant la notion de pointeur; crire un programme en C qui classe, par ordre croissant, les 10 lments rels d'un tableau A.
72