Planche: 1

PC1
Jean-Jacques.Levy@inria.fr
http://www.polytechnique.fr/poly/~levy/
INRIA -- Rocquencourt
tel: 01 39 63 56 89


secrétariat: Catherine Bensoussan
cb@lix.polytechnique.fr
Aile 00,
LIX
tel: 54-67


http://w3.edu.polytechnique.fr/informatique/


Planche: 2

Plan

  1. Programme de l'enseignement de l'informatique
  2. Equipement informatique de l'X
  3. Mon activité à l'INRIA
  4. Les ctp des groupes 1 et 11
  5. La date de Pâques

Planche: 3

1-Programme de l'enseignement de l'informatique

Mécanismes fondamentaux de la programmation

Planche: 4

2-Un bel équipement informatique

Mac/PC: 20 Mac en salle 34, les machines Windows sont à la responsabilité des élèves.

Unix: 90 machines (HP, DEC, PC)

La règle est l'interconnexion


Planche: 5

3-Mon activité à l'INRIA


Planche: 6

4-Les autres enseignants des groupes 1 et 11


Planche: 7

Pascal ou C ou C++ ou Java ou ML ??

Caml (INRIA) vient de ML (Milner, Edimbourg)


Planche: 8

Date de Pâques

Lilius et Clavius en 16xx. (Knuth vol1, p.155)

Soit Y l'année, dont on cherche la date de Paques. Assume Y < 100000

-1 [Golden number].
G = (Y mod 19) + 1

-2 [Century]
C = ë Y/100 û + 1

-3 [Corrections]
X = ë 3 C / 4 û - 12, Z = ë (8 C + 5) /25 û -5

-4 [Find Sunday]
D = ë 5 Y / 4 û - X -10

-5 [Epact.]
E = (11 G + 20 + Z - X)   mod   30. Si E = 25 and G > 11, ou si E = 24, alors E ¬ E + 1

-6 [Find full moon]
N = 44 - E.
Si
N < 21, alors N ¬ N + 30

-7 [Advance to Sunday]
N ¬ N + 7 - ((D + N) mod 7)

-8 [Get month] If
N > 31, date is (N - 31) APRIL Otherwise, date is N MARCH.


Vérifier si ca marche pour 14250. Si pb lequel?



Planche: 9

Pâques en Java

public class Paques {

  static String paques (int y) {

    int g = (y % 19) + 1;
    int c = y / 100 + 1;
    int x = 3 * c / 4 - 12;
    int z = (8 * c + 5) / 25 - 5;
    int d = 5 * y / 4 - x - 10;
    int e = (11 * g + 20 + z - x) % 30;
    if ( e == 25 && g > 11 || e == 24 )
        ++e;
    int n = 44 - e;
    if (n < 21) 
        n = n + 30;
    int j = n + 7 - ((d + n) % 7);
    if (j > 31)
        return (j - 31) + " avril";
    else
        return j + " mars";
  }

Planche: 10

Pâques en Java -- bis

  public static void main (String args[]) {
    if (args.length == 0) {
        System.err.println ("Il faut un argument");
        System.exit(1);
    }
    int annee = Integer.parseInt(args[0]);
    System.out.println (paques (annee));
  }

}
Sous Unix, on tape les commandes

% javac Paques.java
% java Paques 2000
23 avril 2000


Planche: 11

Pâques en Ocaml

let paques y =
  let g = (y mod 19) + 1 in
  let c = y / 100 + 1 in
  let x = 3 * c / 4 - 12
  and z = (8 * c + 5) / 25 - 5 in
  let d = 5 * y / 4 - x - 10 in
  let e = 
    let tmp = (11 * g + 20 + z - x) mod 30 in
    if tmp = 25 && g > 11 || tmp = 24 then tmp + 1 else tmp in
  let n =
    let tmp = 44 - e in
    if tmp < 21 then tmp + 30 else tmp in
  let j = n + 7 - ((d + n) mod 7) in
  if j > 31 then (j - 31, "avril") else (j, "mars");;

Planche: 12

Pâques en Ocaml -- bis

Sous le top-level interactif, on tape simplement
paques 2000;;
- : int * string = 23, "avril"
(la réponse inclut une indication sur le type). Si on rajoute un programme principal,

open Printf;;

let main () =
  let a = int_of_string Sys.argv.(1) in
  let (j, m) = paques a in
  printf "%d %s %d\n" j m a;;

main();;
on peut aussi compiler le fichier Ocaml et exécuter le résultat

% ocamlc -o paques paques.ml
% paques 2000
23 avril 2000

Planche: 13

Remarques sur Java

Un programme est une suite de définition de
classes. Il démarre par la fonction publique main.

Chaque classe contient des déclarations de
variables et de fonctions. Ici la fonction paques prend un entier en argument et retourne une chaîne. La fonction main prend un tableau de chaînes en argument et ne retourne aucune valeur (void).

Le corps d'une fonction est une suite de déclarations de
variables et d'instructions.

Attention = est le symbole d'affectation; == est le test d'égalité, comme en C.


Planche: 14

Remarques sur Ocaml

Un programme est une suite de
phrases terminées par le symbole ;;

Une phrase est une déclaration ou une expression.

On ne déclare pas les types des symboles déclarés. Le système les calcule automatiquement.

Toutes les variables sont des
constantes (mais peut-être pas le contenu des structures non scalaires). Donc le symbole = est utilisé à la fois pour la définition des objets et pour le test d'égalité.


Planche: 15

Calcul du jour

let bissextile a = 
  (a mod 4 = 0) && 
  not ( (a mod 400 = 0) && not (a mod 1000 = 0)) ;;

let jmax m a = 
  match m with
    1 | 3 | 5 | 7 | 8 | 10 | 12 -> 31
  | 2 -> if bissextile a then 29 else 28
  | 4 | 6 | 9 | 11 -> 30 
  | _ -> failwith "mauvais numéro de mois" ;;

Planche: 16

Calcul du jour -- bis

let aujourd'hui = (5, 11, 1998) ;;
let jour_daujourdhui = 4 ;;

let demain (j,m,a) =
  if j = jmax m a then 
    if m = 12
      then (1,1,a+1)
      else (1,m+1,a)
    else (j+1,m,a) ;;

Planche: 17

Calcul du jour -- ter

let string_of_jour d =
  match d with
    0 -> "dimanche"      | 1 -> "lundi"      | 2 -> "mardi"
  | 3 -> "mercredi"      | 4 -> "jeudi"      | 5 -> "vendredi"
  | 6 -> "samedi"        | _ -> failwith "mauvais numéro de jour" ;;

let jour cible =
  let date = ref aujourd'hui in
  let jour = ref jour_daujourdhui in
  while !date <> cible do
    jour := (!jour+1) mod 7;
    date := demain !date
  done;
  string_of_jour !jour ;;

jour (25,12,2020);;
- : string = "vendredi"

Planche: 18

Calcul du jour -- Java

class Jour {

  static boolean bissextile (int a) {
      return (a % 4 == 0) && 
             !( (a % 400 == 0) && !(a % 1000 == 0));
  }

  static int nbDeJours[] = {
     31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  };

  static int jmax (Date d) {
    if (d.m == 2 && bissextile (d.a))
        return 29;
    else 
        return nbDeJours[d.m - 1];
  }

Planche: 19

Calcul du jour -- Java bis

  static Date aujourdhui = new Date (5, 11, 1998);
  static int jourDaujourdhui = 4;

  static Date demain (Date d) {

    if (d.j == jmax (d))
        if (d.m == 12) 
           return new Date (1, 1, d.a + 1);
        else
           return new Date (1, d.m + 1, d.a);
    else
        return new Date (d.j + 1, d.m, d.a);
  
  }

Planche: 20

Calcul du jour -- Java ter

  static String nomDuJour[] = {
     "dimanche", "lundi", "mardi", "mercredi", 
     "jeudi", "vendredi", "samedi"
  };

  static String jour (Date cible) {

    Date d = aujourdhui;
    int j = jourDaujourdhui;
    while (!d.equals (cible)) {
        j = (j + 1) % 7;
        d = demain (d);
    }
    return nomDuJour[j];
  }

Planche: 21

Calcul du jour -- Java 4

  public static void main (String args[]) {
    if (args.length < 3) {
        System.err.println ("Il faut 3 arguments");
        System.exit(1);
    }
    int j = Integer.parseInt(args[0]);
    int m = Integer.parseInt(args[1]);
    int a = Integer.parseInt(args[2]);
    System.out.println (jour (new Date (j, m, a)));
  }
}

Planche: 22

Calcul du jour -- Java 5

class Date {

  int    j; // jour
  int    m; // mois
  int    a; // annee

  Date (int jour, int mois, int annee) {
    j = jour; 
    m = mois;
    a = annee;
  }
  
  public boolean equals (Date d) {
    return j == d.j && m == d.m && a == d.a;
  }

  public String toString () {
    return j + "/" + m + "/" + a;
  }

Planche: 23

Exercices en TD


Ce document a été traduit de LATEX par HEVEA.