510 likes | 966 Views
Algorithme et structure de données. IUP1 Miage. Objectifs . Acquérir les notions de base de programmation impérative structures de contrôles appels à des procédures récursivité Connaître les bases de la programmation objet Savoir réutiliser du code. Combien ? Quand ?. Cours/TD
E N D
Algorithme et structure de données IUP1 Miage
Objectifs • Acquérir les notions de base de programmation impérative • structures de contrôles • appels à des procédures • récursivité • Connaître les bases de la programmation objet • Savoir réutiliser du code
Combien ? Quand ? • Cours/TD • 3h par semaine pendant 13 semaines le lundi de 9h à 12h • TP sur machine • 3h de TP par semaine pendant 13 semaines le lundi de 13h30 à 16h30
Objectifs • Connaître les structures de données élémentaires, tableaux, piles, files, listes chaînées, arbres • Être sensibilisé aux problèmes algorithmiques et leur complexité • Connaître quelques algorithmes de base (tris, techniques "diviser pour régner", ...)
Le langage ! • JAVA, mais son aspect orienté objet sera réduit au minimum • Il ne s'agit pas d'un cours de programmation Java ! • Cours/TD • Alternance cours et exercices d'application • sur papier • TP sur machine • approfondir les structures de données et algorithmes du cours • faire "tourner" les exercices de TD
Pointeurs … • Ce cours est largement inspiré par : • Algorithmique et Programmation en tronc commun du DEUG • cours ASD en IUP1 de Jean-Marc Fédou • Tutorial en ligne de Sun • Documentation API • http://deptinfo.unice.fr/~pc • pc@unice.fr
Premiers pas en Java • Type de base • Variable • Méthode • Structure de contrôle • Chaîne de caractères
Type de base • Tous les langages de programmation manipulent des variables auxquelles sont affectées des valeurs • La notion de type permet de • définir les valeurs possibles • définir les opérations licites
Type de base byte : entier relatif (Z) • Arithmétique complément à deux sur un octet (8 bits) • [-128 , +127] short : entier relatif (Z) • Arithmétique complément à deux sur deux octets (16 bits) [-65536 , +65535]
Type de base • int : entier relatif (Z) [-2147483648, 2147483647]
float : nombre réelen virgule Flottante IEEE-754 • Soit à coder le nombre +3,25 (+11,01 en base 2) • Normaliser l'écriture en base 2 sous la forme (1,…).2n +11,01 = +(1,101).21 • La représentation IEEE code séparément sur 32 bits • signe (ici +) • exposant n (ici 1) • mantisse (suite de bits après la virgule, ici 101)
float : nombre réel (norme IEEE-754) • Normalisation en base 2 sous la forme : (1,…).2n • signe sur le bit de poids fort (0 pour +) • exposant codé sur 8 bits. En fait, on code sur un octet la valeur n+127 • mantisse codée sur les 23 bits de poids faibles
float : nombre réel (norme IEEE-754) exposant : coder sur un octet n+127 00000000 n+127 11111111 0 n+127 255 • Exposants interdits • 00000000 signifie que le nombre est dénormalisé • 11111111 indique que l'on n'a pas affaire à un nombre • Not a Number (NaN) signale des erreurs de calculs, par exemple une division par 0 • 1 n+127 254 • Le plus petit exposant 126 • le plus grand exposant +127
Norme IEEE-754http://babbage.cs.qc.edu/courses/cs341/IEEE-754.html Programme en langage C qui affiche le code d'un nombre flottant /* Affichage hexadécimal des 4 octets d'un nombre flottant IEEE */ #include <stdio.h> main(){ float x; unsigned char *p = (unsigned char *)&x ; printf("Entrer un nombre flottant : \n"); scanf("%f", &x); printf("%x %x %x %x\n",*p,*(p+1),*(p+2),*(p+3)); }
Type de base • double : nombre décimaux [4.9*10-324, 1.8*10308]
char : le type caractère • Pas de méthode pour stocker directement les caractères • Chaque caractère possède donc son équivalent en code numérique
Le code Unicode (1991) • code des caractères sur 16 bits • Indépendant du système d'exploitation ou du langage • Quasi-totalité des alphabets existants (arabe, arménien, cyrillique, grec, hébreu, latin, ...) • Compatible avec le code ASCII • http://www.unicode.org
Le code ASCII(1960) • code ASCII • American Standard Code for Information Interchange • Le code ASCII de base représente les caractères sur 7 bits (c'est-à-dire 128 caractères possibles, de 0 à 127)
Le code ASCII • Les codes 0 à 31 ne des caractères de contrôle • retour à la ligne (CR) • Bip sonore (BEL) • Les codes 65 à 90 représentent les majuscules • Les codes 97 à 122 représentent les minuscules • modifier le 6ème bit pour passer de majuscules à minuscules • ajouter 32 au code ASCII en base décimale
Type de base • boolean : deux valeurs possibles • true (VRAI) • false (FAUX) • S’il y a du soleil ALORS je vais a la plage • SI (soleil==VRAI) ALORS aller_a_la_plage • SI soleil ALORS aller_a_la_plage
Keyword Description Size/Format (integers) byte Byte-length integer 8-bit two's complement short Short integer 16-bit two's complement int Integer 32-bit two's complement long Long integer 64-bit two's complement (real numbers) float Single-precision floating point 32-bit IEEE 754 double Double-precision floating point 64-bit IEEE 754 (other types) char A single character 16-bit Unicode character boolean A boolean value true or false Type de base
Types de base Primitive Data Types Floating Integer byte 8bits -128 to 127 float 32bits 1.4E-45 3.4E38 short 16bits -32768 to 32767 double 64bits 4.9E-324 1.8E308 int 32bits -2^31 to 2^31-1 long 64 bits -2^63 to 2^63-1 Logical Textual one bit : true or false char 16bits 0 to 65535
Concept de Variable Définition : un élément d’information identifié par un nom • On doit explicitement indiquer le nom et le type d’une variable • On utilise le nom pour faire référence à l’information que la variable contient • Le type détermine les valeurs licites pour la variable et les opérations autorisées
Concept de Variable • Pour donner un nom et un type à une variable il faut la déclarer type name • Une variable a une portée • la section de code ou le nom de la variable peut être utilisé
Variable : déclaration int compteur ; float prixHt ; char aChar ; boolean fin ;
Variable : affectation d’une valeur • Une affectation permet de donner une nouvelle valeur à une variable • La valeur précédente est PERDUE int compteur ; compteur = 3 ;
Variable : affectation d’un valeur int r = 2 ; double pi ; pi = 3.14 ; double perimetre = 2*pi*r ; //déclarer ET affecter char c = ’c’ ; boolean pair = true; int compteur ; compteur = compteur +1 ;
int maxInteger = Integer.MAX_VALUE; float maxFloat = Float.MAX_VALUE; char aChar = 'S'; boolean fin = true; S.o.p("Le plus grand integer est :" + maxInteger); S.o.p("Le plus grand float est :" + maxFloat); S.o.p("Le caractère est :" + aChar); S.o.p("fin est :" + fin); Le plus grand integer est : 2 147 483 647 Le plus grand float est : 3.40282e+38 Le caractère est : S fin est : true
Affectation et Conversion de type • Attention, contrairement à C, Java n'autorise pas conversions de types, sauf s'il n'y a aucune perte de précision • un entier peut être promu en double • un double ne peut pas être promu en entier
Affectation et Conversion de type • Un entier peut être promu en double int i = 2 ; double d = 3.1 ; d = i ; • Un double ne peut pas être promu en entier int i = 2 ; double d = 3.1 ; i = d ; // !!
Affectation et Cast • Un double ne peut pas être promu en entier int i = 2 ; double d = 3.1 ; i = d ; // !! • Un double peut être forcé en entier int i = 2 ; double d = 3.1 ; i = (int) d ;
Variable final • La valeur d’une variable déclarée final ne peut pas être modifiée après avoir été initialisée • Une telle variable est similaire à une constante dans les autres langages de programmation • Pour déclarer une variable final : final int A_FINAL_VAR = 10;
Operator Use Description + op1 + op2 Adds op1 and op2 - op1 - op2 Subtracts op2 from op1 * op1 * op2 Multiplies op1 by op2 / op1 / op2 Divides op1 by op2 % op1%op2 Computes the remainder of dividing op1 by op2 Opérateur Arithmétique
Opérateur Arithmétique • Le résultat peut dépendre du contexte 25 / 3 -----> 8 //pour la division entière de 25 par 8 25.0 / 3 -----> 8.3333333333333334 25 / 3.0 -----> 8.3333333333333334 25 % 3 -----> 1 //pour le reste de la division de 25 par 8 25 % 3.1 -----> 0.1999999999999993 // 25=3.1*8 + 0.2
Operateur Use Returns true if > op1 > op2 op1 is greater than op2 >= op1 >= op2 op1 is greater than or equal to op2 < op1 < op2 op1 is less than op2 <= op1 <= op2 op1 is less than or equal to op2 == op1 == op2 op1 and op2 are equal != op1 != op2 op1 and op2 are not equal Opérateur Relationnel
Le premier programme, Hello, affiche simplement le texte "Hello !" • Créer un fichier sourceHello.java Un fichier source contient du texte, écrit en Java • Compiler le source en fichier bytecodeHello.class Le compilateurjavac, traduit le texte source en instructions compréhensibles par la MachineVirtuelle Java (JVM) • Exécuter le programme contenu dans le fichier bytecode L'interprète java implémente la JVM L'interprète traduit le bytecode en instructions exécutables par votre machine
Write once, run anywhere • La compilation d'un programme, ne génère pas d'instructions spécifiques à votre plate-forme • Mais du bytecode Java, qui sont des instructions de la Machine Virtuelle Java (JVM) • Si votre plate-forme (Windows, UNIX, MacOS, un browser Internet) dispose d’une JVM, elle peut comprendre le bytecode
Créer le fichier source Java Hello.java class Hello { public static void main(String[] args) { System.out.println("Hello !"); } }
Compiler le fichier source > javac Hello.java Si la compilation réussit • le fichier Hello.class est créer • Ce fichier contient le bytecode
Interpréter et Exécuter l'application > java Hello L'argument de l'interprète est • le nom de la classe à exécuter • ce n’est pas le nom du fichier Faire la distinction M/m
Disséquons l'application "Hello" • Définir une classe • Définir la méthode main • Utiliser des méthodes
Définir la classe Hello public class Hello { public static void main(String[] args) { System.out.println("Hello !"); } }
Définir la méthodemain public class Hello { public static void main(String[] args) { System.out.println("Hello !"); } } Une application Java doit contenir une méthode main • Appelée en premier par l'interprète • main appelle les autres méthodes nécessaires pour exécuter l'application
Utiliser d’autres méthodes … public class Hello { public static void main(String[] args) { System.out.println("Hello !"); } }