Alg. 1.0 : Recette de l'omelette
|
Ce langage correspond mot pour mot (on peut faire des traductions littérales) à un autre langage, l'assembleur, qui est plus simple à comprendre. Il existe des traducteurs simples de l'assembleur vers la langage machine. On appelle ces traducteurs des compilateurs.
| .file "ex.c" |
| .version "01.01" |
| gcc2_compiled.: |
| .section .rodata |
| .LC0: |
| .string "Bonjour\n" |
| .text |
| .align 4 |
| .globl main |
| .type main,@function |
| main: |
| pushl %ebp |
| movl %esp,%ebp |
| pushl $.LC0 |
| call printf |
| addl $4,%esp |
| .L1: |
| leave |
| ret |
| .Lfe1: |
| .size main,.Lfe1-main |
| .ident "GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)" |
Alg. 1.0 : Recette de l'omelette, haut niveau
|
rappel : il s'agit de la traduction dans le langage de l'ordinateur d'un programme écrit dans le langage C.Un programme écrit en C a toujours besoin d'utiliser des fonctions qui ont déjà été définies dans des bibliothèques de fonctions. Lors de la traduction, le compilateur (gcc) regarde dans le fichier où est défini le programme les bibliothèques qui sont utilisées. Ces bibliothèques sont ensuite utilisées pour créer l'application.
| dendron | % | gcc toto.c | |
| dendron | % | gcc -o toto toto.c | |
|
Alg. 1.0 : Exemples d'affectation
|
![]()
Figure 1.4: un simulateur de vol écrit en C
Alg. 2.0 : Boucle qui ne s'arrête pas
|
| Ce sont des opérations dont le résultat est un entier ! |
x peut être de n'importe quel type, mais il faut que y ait le même type.
Expression valeur (x == y) 1 si x est égal à y, et 0 sinon (x != y) 1 si x est différent de y, et 0 sinon (x < y) 1 si x est strictement plus petit que y, et 0 sinon (x > y) 1 si x est strictement plus grand que y, et 0 sinon (x <= y) 1 si x est plus petit ou égal à y, et 0 sinon (x >= y) 1 si x est plus grand ou égal à y, et 0 sinon Opérateurs booléens
| L'instruction d'affectation, x=y, signifie que la variable x prend la valeur de la variable y. Une erreur très courante est de confondre x=y et x==y dans les tests. Pour C, les deux opérations sont possibles, donc il ne signale pas d'erreur. |
Dans le Tableau ,
Alg. 2.0 : Tests
|
|
instruction valeur de i valeur de j valeur de (i >=j) Notes début On a juste déclaré les variables i et j i=30 ; 30 j=12 ; 30 12 1 while cond 30 12 1 la condition est différente de 0, donc on entre dans la boucle i = i - j; 18 12 1 while cond 18 12 1 la condition est différente de 0, donc on entre dans la boucle i = i - j; 6 12 1 while cond 6 12 0 la condition est égale à 0, donc on passe à l'instruction suivant la boucle printf("%d\n",i); 6 12 0 On affiche la valeur entière de i (%d), et on passe à la ligne (\n) return 0; 6 12 0 La fonction main doit rendre un entier, on retourne l'entier 0, qui signifie une exécution correcte Exécution d'une boucle while simple
|
Ce n'est pas efficace, car on se souvient de tous les éléments qu'on a calculé, alors qu'on a juste besoin du dixième.
Sur la Figure 2.2, on remarque qu'il n'est pas utile d'avoir toutes les cases. On peut effectuer le calcul du dixième élément de la suite avec l'algorithme suivant :
|
On remarque qu'on n'a pas besoin de la variable case_droite ! Si on remplace les deux affectations de la boucle du Programme par :
case_gauche case_droite instruction 3 case_gauche = 3 ; 3 7 case_droite = case_gauche + 4; 7 7 case_gauche = case_droite ; 7 11 case_droite = case_gauche + 4; 11 11 case_gauche = case_droite ; 11 15 case_droite = case_gauche + 4; 15 15 case_gauche = case_droite ; 15 19 case_droite = case_gauche + 4; 19 19 case_gauche = case_droite ; 19 23 case_droite = case_gauche + 4; 23 23 case_gauche = case_droite ; ... Évolution des valeurs de case_droite et case_gauche.
|
Alg. 2.0 : Demander à un utilisateur de répondre o ou n
|
Alg. 3.0 : Programme écrivant des lettres
|
Alg. 3.0 : Cas où il y a plus de 2 réponses possibles
|
Alg. 3.0 : Calcul de la valeur absolue
|
Alg. 3.0 : Affichage d'un résultat
|
Alg. 3.0 : Affichage d'un résultat (amélioré)
|
Alg. 3.0 : Lecture d'un entier
|
Alg. 3.0 : Test d'une condition
|
Alg. 3.0 : Utilisation de switch ...case
|
Alg. 3.0 : break et conditions imbriquées
|
Alg. 3.0 : Cas où on veut pouvoir faire plusieurs actions
|
| trois | ||
| quatre | ||
| le nombre n'est pas entre 1 et 4 |
On donne à la fonction des entrées, ou paramètres, pour effectuer le calcul. En sortie, la fonction rend un résultat.
Alg. 4.0 : Une fonction main
|
| plus : | int ×int | → | int |
Alg. 4.0 : En-tête de la fonction plus
|
Alg. 4.0 : Déclaration d'une variable resultat dans la
fonction plus
|
Alg. 4.0 : Exemple complet de la fonction plus
|
Alg. 4.0 : Fonction plus sans variables locales
|
Alg. 4.0 : Spécialisation de la fonction printf
|
Pour voir exactement comment marche cette communication, il faut se souvenir que la mémoire est comme un gigantesque placard avec plein de cases. Les fonctions main et plus utilisent des variables qui désignent des cases qui sont séparées les unes des autres :
|
Alg. 4.0 : Lecture d'un entier dans la variable i
|
| Il est très simple de faire un programme incompréhensible en utilisant les adresses. Il convient donc de les utiliser avec précaution. Par exemple, essayez de deviner ce que fait le programme de l'Exemple (avant de le taper et de l'exécuter). |
|
Alg. 4.0 : Une fonction fois
|
Alg. 4.0 : fonction lisant un caractère
|
Alg. 4.0 : fonction lisant un entier positif
|
Alg. 4.0 : fonction lisant un nombre décimal
|
Alg. 4.0 : fonction lisant N nombres flottants et rendant
leur maximum
|
|
Alg. 5.0 : Déroulement d'une assignation
|
|
| Les entiers et les nombres décimaux sont représentés de deux manières totalement différentes. Par exemple, les 32 bits qui représente 1 dans le type int n'ont rien à voir avec les 32 bits qui représentent 1 dans le type float . |
| retour sur scanf : Quelle que soit la variable x, & x est l'adresse de cette variable. Donc la fonction scanf ne modifie pas ses arguments (l'adresse des variables lues). Elle modifie les emplacements désignés par ces adresses, et donc les variables ! |
|
|
| Les cases disponibles d'un tableau de N cases sont numérotées de 0 à N-1 |
|
|
| différence entre t[] et *p : On peut changer l'adresse désignée par un pointeur, mais l'adresse désignée par un tableau est constante. Elle doit être fixée à la compilation du programme. |
|
|
| scanf arrête la lecture d'une chaîne de caractères dès qu'un caractère blanc (espace, tabulation ou passage à la ligne) est rencontré. |
Alg. 6.0 : Définition de constantes
|
Alg. 6.0 : Utilisation de constantes (avant remplacement)
|
Alg. 6.0 : Utilisation de constantes (après remplacement)
|
Alg. 6.0 : Définitions de macros
|
Alg. 6.0 : Mauvaise utilisation de macros
|
Alg. 6.0 : Mauvaise utilisation de macros (suite)
|
Alg. 6.0 : Exemple de fichier .h
|
Alg. 6.0 : Exemple de compilation séparée --- fichier Cours.c
|
Alg. 6.0 : Exemple de compilation séparée --- fichier Cours.h
|
Alg. 6.0 : Exemple de compilation séparée --- fichier Utilisation.c
|
This document was translated from LATEX by HEVEA.