Rappels Un algorithme est une suite finie d’opérations logiques ordonnées Un ordinateur effectue la suite d’opérations logiques, c’est une machine de stockage et de traitement de l’information: BÊTE et RAPIDE L’ordinateur ne se trompe jamais! C’est le rôle du programmeur de mettre au point les algorithme et donc de définir de façon efficace la suite d’opérations. Structure d’un programme C #include <stdio.h> Commandes préprocesseur (#) float aplusb(float a, float b); Déclaration des fonctions Programme principal int main () { float a,b,c; Déclaration des variables a=1.5; b=3.1; c=0.; Initialisation des variables c=aplusb(a,b); printf(“a+b=%f”,c); Appel des modules/fonctions return 0; } float aplusb(float a,float b) { return a+b; } Définition des fonctions/modules Les types d’algorithmes Iteratif Démontrabilité difficile Récursif Récursif croisé Démontrabilité aisée (par récurrence) Les types courants de variables en C Type Octets Portée char 1 -128 a 127 short int 2 -32768 a +32767 int 4 -2147483648 a +2147483647 long int 8 -4294967296 a +4294967295 unsigned char 1 0 a +255 unsigned short int 2 0 a +65535 unsigned int 4 0 a + 4294967295 unsigned long int 8 … float 4 … double 8 … void 0 NULL Exemple de cast: int z; float x; z=1; x=(float) z; Les opérations en C Attention les opérations ont des priorités 1 primaire (),[] --> 2 unaire !,++,--,(type),*,&,sizeof <-- 3 multiplication *,/,% --> 4 addition +,- --> 5 décalage <<,>> --> 6 relationnel <,<=,>,>= --> 7 égalité ==,!= --> 8 Logique binaire &,^,| --> 9 conditionnel &&,||,?: --> 10 affectation =,+=,-=,/=,… <-- Il faut penser à mettre des parenthèses comme pour les opérations mathématiques: 1+2*3 n’est pas égal a (1+2)*3 Les conditionnelles Pour effectuer des opérations dans certains cas et d’autres opérations autrement, il faut utiliser des opérations de test:des structures équivalentes au si,sinon If ([condition1]) { instruction1; instruction2; …; } else if ([condition2]){ instructionN; …; } else { instructionX; …; } Block d’instructions à effectuer si [condition1] est vrai Block d’instructions à effectuer si [condition2] est vrai Block d’instructions à effectuer si [condition1] sinon Les conditionnelles Une condition est une opération relationnelle de test qui retourne un vrai ou faux (0 ou 1): Syntaxe : (expr1 <opérateur logique> expr2) Par exemple: X=1 se traduit par X>Y (X==1), vaut 1 si X=1 et 0 sinon. (X>Y) Les conditions peuvent être combinées à l’aide des opérateurs Logiques ET (&&), OU (||) et de négation (!). La logique suit l’algèbre de Bool. Elements d’algèbre de Bool ET logique OU logique NON logique A B A && B A B A || B A !A 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 Les opérations logiques se combinent avec des () comme les opérations algébriques standardes Les conditionnelles Lorsque les opérations à effectuer dépendent de valeurs prédéfinies d’une variable ou d’une expression, on peut soit combiner les conditions si-sinon si soit utiliser une instruction de switch: Switch (expr){ case val1 : block d’instruction1; break; case val2 : block d’instruction2; break; … default : block d’instruction par defaut; } Expression dont la valeur est testée Si expr vaut val1 Attention : ne pas oublier Si expr ne vaut aucune des valeurs proposées Les conditionnelles Utiliser des conditions sur des variables logiques ou entières n’est pas un problème. Lorsque l’on travaille sur les réels, le problème est plus compliqué: - les réels ont des problèmes de troncature dus à l’encodage (cf cours précèdent) - si l’on veut comparer deux réels (ou doubles) entre eux, il faut se fixer une limite de précision et tester la différence: Ex: float a,b; if (a==b){ … } float a,b; Syntaxe correcte mais if (abs(a-b)<0.0001){ a de grandes chances de … ne pas fonctionner } Exercices: Ex 1: binaire et algèbre binaire 1) Ecrivez la représentation binaire de 7 et 15. 2) Additionnez les deux représentations binaires et vérifiez a posteriori que le nombre binaire obtenu correspond à 7+15 3) Quel est le plus grand entier que l’on peut coder sur 2 octets (signé et non signé) Ex 2: algèbre de Bool Construisez le tableau de valeur de l’expression suivante: C = (!A && B) || (A && !B) Exercices: #include <stdio.h> int main() { float a=0.4,b=1.7,c=2.5,d; int x=2,y; d=a+b; printf("a+b=%f\n",d); d=x+a; printf("d=x+a=%f\n",d); y=x+a; printf("y=x+a=%i\n",y); d=c+(a+b)*x; printf("d=c+(a+b)*x=%f\n",d); y=c+(a+b)*x; printf("y=c+(a+b)*x=%i\n",y); return 0; } Ex 3: variables et types Le programme sur la gauche effectue des opérations arithmétiques de bases sur les entiers et les réels. Quelles sont les valeurs affichées par le programme pour ces différentes opérations? Exercices: Ex 4: parité d’un nombre Ecrivez un programme C qui pour un entier donné indique sa parité. Le nombre sera passé par argument avec le prototype suivant pour la fonction main: int main(int argc, char *argv) { int i=atoi(argv[1]); … } Exercices: Ex 5: racines d’un polynôme du second ordre Ecrivez un programme qui permet de calculer les racines d’un polynôme du second ordre. P(x)=a x2+b x+c Commencer par définir vos variables. Pour entrer les variables vous utiliserez la commande C scanf: scanf(“%d %d %d”,&a,&b,&c) qui permet de saisir au clavier les paramètres.