InitProg par l exemple



Documents pareils
Recherche dans un tableau

STAGE IREM 0- Premiers pas en Python

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C


Cours Informatique Master STEP

Initiation à la programmation en Python

Découverte de Python

TP3 : Manipulation et implantation de systèmes de fichiers 1

Algorithmique et Programmation, IMA

Utilisation d objets : String et ArrayList

TP 1. Prise en main du langage Python

Algorithmes récursifs

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Programmer en JAVA. par Tama

Introduction à MATLAB R

Examen Médian - 1 heure 30

Initiation à l algorithmique

Les probabilités. Chapitre 18. Tester ses connaissances

Corrigé des TD 1 à 5

Bases de programmation. Cours 5. Structurer les données

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

1 Recherche en table par balayage

I. Introduction aux fonctions : les fonctions standards

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Programmation C++ (débutant)/instructions for, while et do...while

Programmation Objet - Cours II

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Solutions du chapitre 4

Cours d initiation à la programmation en C++ Johann Cuenin

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TD3: tableaux avancées, première classe et chaînes

Classes et Objets en Ocaml.

Programme Compte bancaire (code)

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Chapitre 2 Devine mon nombre!

Maple: premiers calculs et premières applications

Les structures de données. Rajae El Ouazzani

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Programmation Web. Madalina Croitoru IUT Montpellier

Plan du cours. Historique du langage Nouveautés de Java 7

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

EXCEL TUTORIEL 2012/2013

Définition des Webservices Ordre de paiement par . Version 1.0

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Initiation à LabView : Les exemples d applications :

Java Licence Professionnelle CISII,

Conventions d écriture et outils de mise au point

L ALGORITHMIQUE. Algorithme

Cours de Programmation 2

Feuille d exercices 2 : Espaces probabilisés

Notions fondamentales du langage C# Version 1.0

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Peut-on tout programmer?

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

4. Groupement d objets

Poker. A rendre pour le 25 avril

Les arbres binaires de recherche

Application 1- VBA : Test de comportements d'investissements

Initiation à Excel. Frédéric Gava (MCF)

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

Plateforme PAYZEN. Définition de Web-services

Présentation du langage et premières fonctions

Conversion d un entier. Méthode par soustraction

Programmation Classique en langage C

Algorithmique avec Algobox

LES DECIMALES DE π BERNARD EGGER

Algorithmique et programmation : les bases (VBA) Corrigé

Baccalauréat ES Polynésie (spécialité) 10 septembre 2014 Corrigé

Langage Java. Classe de première SI

Génie Logiciel avec Ada. 4 février 2013

1.6- Génération de nombres aléatoires

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Les chaînes de caractères

Baccalauréat L spécialité, Métropole et Réunion, 19 juin 2009 Corrigé.

Cours 7 : Utilisation de modules sous python

Raisonnement par récurrence Suites numériques

TD3 - Facturation avec archivage automatisé

KL5121. Pour activer des sorties en fonction de la position d'un codeur

Importer les fichiers élèves - professeurs du secrétariat

Représentation d un entier en base b

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Premiers Pas en Programmation Objet : les Classes et les Objets

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Le langage SQL Rappels

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

EXCEL PERFECTIONNEMENT SERVICE INFORMATIQUE. Version /11/05

Transcription:

InitProg par l exemple Martin Monperrus 16 décembre 2011 Ce cument illustre avec des programmes Ocamlcartes et Ocaml le polycopié du cours Initiation à la programmation (InitProg) de l Université Lille 1. Si vous êtes capables de comprendre et d écrire par vous-mêmes des programmes de ce calibre, vous avez atteint l objectif du cours. Table des matières 1 init_tas et deplacer_sommet 2 2 Le if/ et if//else 3 3 Algèbre booléenne 4 4 La boucle while 5 5 Définition d une procédure 6 6 Appels de procédure 7 7 Arithmétique et variables 8 8 Définition d une fonction 9 9 La boucle for 10 10 Calcul de π avec la suite de Madhava 11 11 Manipulation des chaînes de caractères 12 12 Tri des cartes 13 1

1 init_tas et deplacer_sommet 0 (* {{init_tas et deplacer_sommet}} - init_tas - deplacer_sommet 5 Ce programme initialise le tas 1 avec une alternance de Pique et de Coeur sur le tas 1 et rien sur les autres tas, puis trie toutes les cartes du tas 1 par couleur sur les tas 2 (qui reçoit les Piques) et 3 (qui reçoit les Coeurs). *) 10 (* Rappel: ceci est un commentaire, que ocaml et ocamlcartes ignorent. *) (* Les commentaires vous aident à structurer et comprendre votre propre programme, et, pour les professeurs, à corriger vos travaux. *) (* Nous utilisons le module Cartes *) 15 open Cartes;; (* Initialisation du tas 1 avec 4 cartes. Il y a une alternance de Pique et Coeur. La fonction init_tas prend deux paramètres: - le premier est un numéro de tas entre 1 et 4 20 - le deuxième est une chaîne de caractères décrivant le tas C -> Coeur K -> Carreau T -> Trèfle 25 P -> Pique La carte du dessous correspond au premier caractère: init_tas(1,"cpt");; _La carte du dessous est un coeur Les numéros de carte sont tirés au hasard. 30 *) init_tas(1,"cpcp");; (* Les autres tas sont vides. Un tas vide est représenté par une chaîne de caractères vide notée en Ocaml "" *) init_tas(2,"");; 35 init_tas(3,"");; init_tas(4,"");; 40 (* Nous savons que la carte du dessus est un Pique, nc va sur le tas 2 *) deplacer_sommet(1,2);; (* La suivante est un coeur *) deplacer_sommet(1,3);; (* La suivante est un pique *) 45 deplacer_sommet(1,2);; (* La dernière est un coeur *) deplacer_sommet(1,3);; 50 (* Toutes les cartes sont triées, le programme est terminé! *) pause("fini"); 2

2 Le if/ et if//else 0 (* {{Le if/ et if//else}} - le + et () dans init_tas - if//else 5 Ce programme initialise les tas 1 avec des valeurs aléatoires. Les autres tas sont vides. Ensuite, dépendamment de l'initialisation du tas 1, les coeurs partent sur le tas 2, les trèfles sur le tas 3 et les piques sur le tas 4 *) open Cartes;; 10 (* Initialisation du tas 1: - le + veut dire "ou": (C+P) nne un coeur ou un pique aléatoirement - les parenthèses permettent de délimiter des groupes Ici, les tas possibles sont: 15 T CP PP *) init_tas(1,"((c+p)p)+t");; 20 (* Les autres tas sont vides. Un tas vide est représenté par une chaîne de caractères vide notée en Ocaml "" *) init_tas(2,"");; init_tas(3,"");; 25 init_tas(4,"");; (* Déplacements des cartes *) if sommet_trefle(1) 30 (* un bloc prend une seule instruction ou un bloc -end *) deplacer_sommet(1,3); end (* jamais de ; avant le else *) else 35 (* un bloc else prend une seule instruction ou un bloc -end *) (* nous déplacons le pique du sommet *) deplacer_sommet(1,4); 40 (* sous le pique, avons-nous un coeur ou un autre pique? *) if sommet_coeur(1) deplacer_sommet(1,2) (* jamais de ; avant le else *) else 45 (* c'est nécessairement un pique (d'après le init_tas) *) deplacer_sommet(1,4); (* end bloc else, premier niveau nc deux point-virgules *) 50 pause("fini");; 3

3 Algèbre booléenne 10 0 (* {{Algèbre booléenne}} - la fonction tas_vide, tas_non_vide - l'algèbre booléenne not && 5 Ce programme initialise les tas 1 avec des valeurs aléatoires. Les autres tas sont vides. Ensuite, dépendamment de l'initialisation du tas 1, les rouges partent sur le tas 2, les noires sur le tas *) open Cartes;; (* Initialisation du tas 1 Le tas peut être vide à cause du () *) 15 init_tas(1,"((p+t)+(c+k))+()");; (* Les autres tas sont vides. Un tas vide est représenté par une chaîne de caractères vide notée en Ocaml "" *) init_tas(2,"");; 20 init_tas(3,"");; init_tas(4,"");; (* Si le tas 1 n'est pas vide *) 25 (* NB: faire un sommet_coeur, sommet_carreau, sommet_pique ou sommet_trefle sur un tas vide casse l'automate *) if not(tas_vide(1)) 30 (* si carte est rouge *) if sommet_coeur(1) sommet_carreau(1) deplacer_sommet(1,2); 35 (* si la carte est noire *) (* nous avons peut-être déplacé une carte, nc on rajoute un test *) (* notez que tas_vide(x) = not(tas_non_vide(x)) *) if tas_non_vide(1) && (sommet_pique(1) sommet_trefle(1)) 40 deplacer_sommet(1,3); pause("fini");; 4

4 La boucle while 0 (* {{La boucle while}} - le [] dans init_tas - la boucle while 5 Ce programme initialise les tas 1 et 2 avec n coeurs ou trèfles aléatoirement. Puis déplace tous les coeurs du tas 1 sur le tas 4 et tous les coeurs du sommet du tas 2 sur le tas 4. Le tas 3 est utilisé comme entrepôt *) open Cartes;; 10 (* les crochets veulent dire n au hasard dans [0,52] NB: l'expression entre crochet est exécutée n fois, nc les tas 1 et 2 contiennent une alternance aléatoire de coeur et trèfle *) init_tas(1,"[c+t]");; 15 init_tas(2,"[c+t]");; 20 (* Les autres tas sont vides. *) init_tas(3,"");; init_tas(4,"");; (* déplace tous les coeurs du tas 1 sur le tas 4 *) while tas_non_vide(1) 25 if sommet_coeur(1) deplacer_sommet(1,4) else deplacer_sommet(1,3); (* dans l'entrepôt *) 30 ne;; (* tous les coeurs du sommet du tas 2 sur le tas 4. *) (* Le tas 2 peut être vide si [] nne n=0 ou si il n'y a que des coeurs sur le tas 2 35 et qu'ils ont tous été déplacés *) while tas_non_vide(2) && sommet_coeur(2) deplacer_sommet(2,4); ne;; 40 pause("fini");; 5

5 Définition d une procédure 0 (* {{Définition d'une procédure}} - définition de procédures 5 Ce programme déplace toutes les cartes des tas 1, 2 et 3 sur le tas 4 *) open Cartes;; (** Initialisation des tas: tous les tas possibles *) init_tas(1,"[p+c+k+t]");; 10 init_tas(2,"[p+c+k+t]");; init_tas(3,"[p+c+k+t]");; (* Le tas 4 est vide *) init_tas(4,"");; 15 (* Déplace toutes les cartes du tas x vers le tas y. Types: x et y sont des numéros de tas Contrainte d'utilisaton: x et y dans {1,2,3,4} *) let deplacer_tas(x,y) = 20 while tas_non_vide(x) deplacer_sommet(x,y); ne; 25 (* déplacement des tas en utilisant la procédure deplacer_tas *) deplacer_tas(1,4);; deplacer_tas(2,4);; deplacer_tas(3,4);; 30 pause("fini");; 6

6 Appels de procédure 0 (* {{Appels de procédure}} Ce programme trie toutes les cartes de tous les tas. Les rouges finissent sur le tas 3 et les noires sur le tas 4. trie_tous_tas appelle trie_tas_par_couleur et trie_tas_par_couleur appelle bouge_noir_sur et bouge_rouge_sur Comme au légo, on commence par les plus petites briques: 5 l'ordre de définition des procédures commence par les "petites" procédures qui sont appelées par d'autres. *) open Cartes;; (* déplace la carte du sommet du tas x sur le tas y 10 si et seulement si c'est une carte rouge *) let bouge_rouge_sur(x,y) = if tas_non_vide(x) 15 if sommet_coeur(x) sommet_carreau(x) deplacer_sommet(x,y); end 20 (* déplace la carte du sommet du tas x sur le tas y si et seulement si c'est une carte noire *) let bouge_noir_sur(x,y) = if tas_non_vide(x) 25 if sommet_pique(x) sommet_trefle(x) deplacer_sommet(x,y); end 30 (* trie les cartes du tas x en mettant toutes les cartes rouges sur y et les cartes noires sur z *) let trie_tas_par_couleur(x,y,z) = while tas_non_vide(x) 35 bouge_rouge_sur(x,y); bouge_noir_sur(x,z); ne 40 (* trie toutes les cartes de tous les tas en mettant toutes les cartes rouges sur y et les cartes noires sur z *) let trie_tous_tas(y,z) = (* on libère les tas de destination *) 45 trie_tas_par_couleur(y,1,2); trie_tas_par_couleur(z,1,2); (* et on finit le tri *) trie_tas_par_couleur(1,y,z); trie_tas_par_couleur(2,y,z); 50 trie_tous_tas(3,4);; pause("fini");; 7

7 Arithmétique et variables 10 0 (* {{Arithmétique et variables}} Ce programme teste si 999763 est un nombre premier. *) 5 (* y est une variable constante de type entier (int) *) let x = 999763;; (* y est une variable mutable de type entier (int) *) let y = ref 2;; (* est_entier est une variable mutable de type booléen (bool) *) let est_entier = ref true;; while!y < x (* y est mutable, nc on accède à sa valeur avec! *) 15 (*!!Attention!! la division de deux entiers est euclidienne *) if x = ( x /!y) *!y est_entier := false; 20 (* on incrémente y *) y :=!y + 1; ne;; 25 (* affichage du résultat *) print_int(x); if!est_entier = true 30 print_string(" est premier"); print_newline(); (* retour à la ligne *) end else (* print_endline est équivalent à print_string suivi de print_newline *) 35 print_endline(" n'est pas premier");; 8

8 Définition d une fonction 0 (* {{Définition d'une fonction}} - définition d'une fonction qui renvoie une valeur - variable locale - print_string, print_int, print_newline 5 Ce programme calcule la somme des carrées des entiers naturels de 1 à 10 *) 10 (* retourne le carré de n (de type entier) *) (* NB: cette fonction est consituté d'une seule instruction, la valeur renvoyée par la fonction est la valeur de cette instruction *) let carre(n) = n*n;; 15 (* retourne la somme des carrées des entiers naturels de 1 à *) (* NB: cette fonction est consituté de plusieurs instructions, la valeur renvoyée par la fonction est la valeur de la dernière instruction (ici resultat) *) let somme_carre(n) = let resultat = ref 0 and i = ref 1 in (* ce sont des variables locales *) 20 while!i <= n resultat :=!resultat + carre(!i); i :=!i +1; 25 ne;!resultat; (* Nous appelons notre fonction *) 30 print_string("somme_carre(2)=");; print_int(somme_carre(2));; print_newline();; 35 print_string("somme_carre(5)=");; print_int(somme_carre(5));; print_newline();; print_string("somme_carre(500)=");; 40 print_int(somme_carre(500));; print_newline();; 9

9 La boucle for 0 (** {{La boucle for}} - boucle for/pour (to et wnto) - variable locale (resultat) 5 Ce programme calcule la factorielle d'un entier *) (* retourne la factorielle de l'entier n Contrainte d'utilisation: n>=1 *) let factorielle(n) = 10 let resultat = ref 1 in for i = 1 to n resultat :=!resultat * i; 15 ne;!resultat; 20 (* affiche toutes les valeurs de k! pour k in [ 1, 20 ] *) (* NB: l'utilisation du wnto *) for k = 10 wnto 1 print_int(k); 25 print_string("! = "); print_int(factorielle(k)); print_string("\n"); ne;; 10

10 Calcul de π avec la suite de Madhava 0 (* {{Calcul de $\pi$ avec la suite de Madhava}} Ce programme calcule un approximation de Pi selon une suite de Madaha *) (* Retourne la valeur de a puissance n avec a entier et n entier *) 5 let puissance(a,n) = let resultat = ref 1 in for i = 1 to n 10 resultat :=!resultat*a; ne;!resultat; 15 (* Renvoie une approximation de pi en utilisant la suite de madhava. plus n est grand, meilleure est l'approximation de pi. n est nombre entier *) let calcul_pi_madhava(n) = let resultat = ref 0. and terme = ref 0. in 20 for i = 0 to n terme := (float_of_int(puissance(-1,i))/.float_of_int(2*i+1)); resultat :=!resultat +.!terme; 25 ne; 4. *.!resultat; (* affiche l'evolution des valeurs de la suite *) 30 for k = 0 to 20 let n = k * 500 in print_string("calcul_pi_madhava("); 35 print_int(n); print_string(")="); print_float(calcul_pi_madhava(n)); print_string("\n"); end 40 ne 11

11 Manipulation des chaînes de caractères 0 (* {{Manipulation des chaînes de caractères}} - String.length, String.create - affectation d'un caractère s[i] <- 'a' 5 Ce programme transforme un chaîne de caractère s en vertical *) (* transforme un chaîne de caractère s en vertical *) 10 let transforme_en_vertical(s) = let longueur = String.length(s) in (* renvoie une nouvelle chaîne de taille 2*String.length(s) *) let resultat = String.create (2 * longueur) in 15 for i = 0 to longueur-1 resultat.[2*i] <- s.[i] ; (* Entre chaque caractère de s, i.e. aux indices impaires, la fonction insère un retour à la ligne (en OCcaml s.[x] <- '\n';). *) 20 resultat.[2*i+1] <- '\n' ; ne; resultat; 25 (* appels de la fonction *) print_string(transforme_en_vertical("initprog, je suis au point"));; print_string(transforme_en_vertical("ocaml? C'est super!"));; 30 (* que se passe-t-il ici? *) print_string(transforme_en_vertical(transforme_en_vertical("vertige!")));; 12

12 Tri des cartes 0 (* {{Tri des cartes}} Ce programme trie un tas aléatoire par ordre croissant *) open Cartes;; (* Initialisation des tas *) 5 init_tas(1,"[t+c+p+k]");; init_tas(2,"");; init_tas(3,"");; init_tas(4,"");; 10 (* Déplace tout le tas x sur y et met la plus petite carte (une seule carte) sur z Contrainte d'utilisation: y it être vide Note: si n est le nombre de cartes de x en entrée, le tas y contient n-1 cartes à la fin *) let deplace_plus_petite_carte(x,y,z) = 15 (* on fait l'hypothèse que la première carte est la plus petite *) deplacer_sommet(x,z); while tas_non_vide(x) (* hypothèse invalidée *) 20 if superieur(z,x) deplacer_sommet(z,y); deplacer_sommet(x,z); end 25 else (* z est plus petit que x, on bouge sur y *) deplacer_sommet(x,y); ne; 30 (* Déplace un tas x sur un tas y *) let deplacer_tas(x,y) = while tas_non_vide(x) 35 deplacer_sommet(x,y); ne; (* Trie le tas x par ordre croissant. Met le tas trié sur le tas y en se servant du tas tmp comme tas intermédiaire 40 Contrainte d'utilisation: tmp est vide *) let trier_tas_croissant(x,y,tmp) = while tas_non_vide(x) 45 deplace_plus_petite_carte(x,tmp,y); deplacer_tas(tmp,x); ne; 50 (* Trie le tas 1, le tas trié se trouve en 4 à la fin. Le tas 2 est le tas intermédiaire *) trier_tas_croissant(1,4,2);; pause("fini");; 13