Université Paris 7 Denis Diderot Introduction à l informatique et à la programmation (IF1) Corrigé de l examen du 6 janvier 2009

Documents pareils
Corrigé des exercices sur les références

Programme Compte bancaire (code)

Java Licence Professionnelle CISII,

as Architecture des Systèmes d Information

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

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

Utilisation d objets : String et ArrayList

Programmer en JAVA. par Tama

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

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

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

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

Premiers Pas en Programmation Objet : les Classes et les Objets

Langage Java. Classe de première SI

Corrigés des premiers exercices sur les classes

Projet de programmation (IK3) : TP n 1 Correction

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Package Java.util Classe générique

Recherche dans un tableau

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

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Généralités sur le Langage Java et éléments syntaxiques.

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Tp 1 correction. Structures de données (IF2)

Chapitre 10. Les interfaces Comparable et Comparator 1

Introduction à MATLAB R

Architecture des Systèmes d Information Architecture des Systèmes d Information

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

Structurer ses données : les tableaux. Introduction à la programmation

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Les bases de l informatique et de la programmation. École polytechnique


Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

INF 321 : mémento de la syntaxe de Java

TD/TP PAC - Programmation n 3

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

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

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

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Programmation avec des objets : Cours 7. Menu du jour

Principes des langages de programmation INF 321. Eric Goubault

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

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

Objets et Programmation. origine des langages orientés-objet

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours de Systèmes d Exploitation

Threads. Threads. USTL routier 1

Un ordonnanceur stupide

Algorithmique et Programmation, IMA

Exercices sur les interfaces

Les structures de données. Rajae El Ouazzani

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Claude Delannoy. 3 e édition C++

Introduction au langage C

Cours 1: Java et les objets

Les processus légers : threads. Système L3, /31

Cours d Algorithmique et de Langage C v 3.0

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

1 Recherche en table par balayage

Solutions du chapitre 4

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Une introduction à Java

PROGRAMMATION PAR OBJETS

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Présentation du langage et premières fonctions

Conventions d écriture et outils de mise au point

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

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

TP : Gestion d une image au format PGM

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

STAGE IREM 0- Premiers pas en Python

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)

INITIATION AU LANGAGE JAVA

2. Comprendre les définitions de classes

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Auto-évaluation Programmation en Java

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

Algorithmique et programmation : les bases (VBA) Corrigé

Langage à objets : JAVA (1)

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

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Derrière toi Une machine virtuelle!

Apprendre Java en 154 minutes

Programmation par les Objets en Java

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

1. Langage de programmation Java

Programmation en Java IUT GEII (MC-II1) 1

Les algorithmes de base du graphisme

Les chaînes de caractères

4. Groupement d objets

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

I. Introduction aux fonctions : les fonctions standards

Notions fondamentales du langage C# Version 1.0

Transcription:

Exercice 1. Université Paris 7 Denis Diderot Introduction à l informatique et à la programmation (IF1) Corrigé de l examen du 6 janvier 2009 1.1. Pour répondre à la question, nous avons regroupé dans une table ce qui est effectivement calculé par le programme selon les valeurs des variables booléennes a, b et c (ce qui n est pas évalué par le programme est matérialisé par une séquence ---). a b c!b a!b c!a!a&&c c a b!c&&(a b) 0 0 0 1 1 --- 1 0 : Affichage de C --- --- --- 0 0 1 1 1 1 : Affichage de A --- --- --- --- --- 0 1 0 0 0 --- --- --- 1 1 1 : Affichage de D 0 1 1 0 0 --- --- --- 0 1 0 : Affichage de E 1 0 0 1 1 --- 0 0 : Affichage de C --- --- --- 1 0 1 1 1 1 : Affichage de A --- --- --- --- --- 1 1 0 1 1 --- 0 0 : Affichage de C --- --- --- 1 1 1 0 1 1 : Affichage de A --- --- --- --- --- Le programme affiche donc : C si (!a &&!b &&!c) (a &&!b &&!c) (a && b &&!c) A si (!a &&!b && c) (a &&!b && c) (a && b && c) D si (!a && b &&!c) E si (!a && b && c) 1.2. On observe que : La première condition correspondant à l affichage de C se réduit à : (!c && (!b (a && b))) La fonction peut donc se définir par (on a repoussé le retour de la valmeur A au dernier else pour éviter l écriture explicite d une condition compliquée). if (!c && (!b (a && b))) return( C ); else if (!a && b &&!c) return( D ); else if(!a && b && c) return( E ); else return( A ); Exercice 2. 2.1. Nombre de nombres différents compris dans un tableau compris entre 0 et 20 On utilise un tableau dejavu de booléens de taille 21. Ce tableau est initialisé automatiquement à la valeur false lors de son allocation. Ce tableau va permettre de mémoriser les nombres compris entre 0 et 20 qu on a rencontrés. Le tableau initial t va être parcouru une fois (par exemple depuis l indice 0 jusqu au dernier indice t.length-1). Si t[i] n est pas dans l intervalle [0:20], on l ignore. Dans le cas contraire : si le nombre n a pas encore été rencontré, c est-à-dire si dejavu[t[i]] a la valeur false, on incrémente le compteur cpt et on repère le nombre comme déjà vu en affectant à dejavu[t[i]] la valeur true; si le nombre a déjà été rencontré, c est-à-dire si dejavu[t[i]] a la valeur true, on l ignore. 1

public static int combien(int[] t){ boolean[] dejavu = new boolean[21]; int cpt = 0; // le compteur de nombres differents for(int i = 0; i < t.length; i++) { // pas dans l intervalle ou deja vu : nombre ignore if(t[i] < 0 t[i] > 20 dejavu[t[i]]) continue; // un nouveau nombre a ete rencontre cpt++; // on le comptabilise dejavu[t[i]] = true; // on note qu on l a vu return cpt; 2.2. Nombre de nombres différents sans connaissance d intervalles La solution utilisée précédemment n est pas brutalement utilisable puisqu on ne connaît pas l intervalle de définition des nombres contenus dans le tableau. On va pour chaque élément t[i] le comparer avec tous ses précédents dans le tableau et on le comptabilisera que s il n est égal à aucun d eux. public static int combien(int[] t){ boolean vu; int n = 1; for(int i = 1; i < t.length; i++) { vu = false; for(int j = 0 ; j < i; j++) if(t[i] == t[j]){ vu = true; break; if (!vu) n++; return n; Exercice 3. Jeu du pendu/mastermind 3.1. Tableau contenant les nombres de pions bien et mal placés public static int[] trouve(char[] tab1, char[] tab2){ int[] cumul = new int[2]; boolean[] dejautilise = new boolean[tab1.length]; for (int i = 0; i < tab1.length; i++){ if(tab1[i] == tab2[i]) { cumul[0] ++; continue; for(int j = 0; j < tab1.length; j++){ if(tab1[j] == tab2[j] dejautilise[j]) continue; if(tab1[j] == tab2[i]){ cumul[1]++; dejautilise[j]= true; break; return cumul; 2

3.2. Construction de la réponse public static char[] reponse (int[] cumul){ char[] rep = new char[cumul[0] + cumul[1]]; for(int i = 0; i < cumul[0]; i++) rep[i] = + ; for(int i = 0; i < cumul[1]; i++) rep[cumul[0] + i] = - ; return rep; 3.3. Une partie contre la machine import fr.jussieu.script.*; class MasterMind { public static int[] trouve(char[] tab1, char[] tab2){ /* code deja ecrit */... public static char[] reponse (int[] cumul){ /* code deja ecrit */... public static void ecrirereponse(char[] t){ for(int i = 0; i < t.length; i++) Deug.print(t[i]); Deug.println(); public static void main(string[] args){ char[] solution = couleur(); for (int = 0; i < 4) solution[i] = couleur(); char[] proposition = new char[4]; int [] nombre; char[] reponse; char c; for (int rep = 0; rep < 12; rep ++) { Deug.print("Proposition " + (rep + 1) + " : "); for(int i = 0; i < solution.length; i++) proposition[i] = Deug.readChar(); c = Deug.readChar(); nombre = trouve(proposition, solution); if(nombre[0] == 4){ Deug.println("Bravo. Solution trouvee en " + (rep + 1) + " coups"); Deug.exit(); reponse = reponse(nombre); ecrirereponse(reponse); Deug.println("===================="); Deug.print("Vous avez perdu! La reponse etait : "); ecrirereponse(solution); 3

Exercice 4. 4.1. Construction du tableau des points de rupture public static int[] rupture(int[] t){ int[] tt = new int[t.length]; int n = 1; tt[0] = 0; for (int i = 1; i < t.length; i++){ if (t[i] > t[i-1]) continue; tt[n] = i; n++; int[] res = new int[n]; for(int i = 0; i < n; i++) res[i] = tt[i]; 4.2. Décomposition d un tableau en suite de tableaux strictement croissants public static int[][] factorisation(int[] t){ int[] r = rupture(t); int[][] res = new int[r.length][]; for (int i = 0; i < r.length - 1; i++){ res[i] = new int[r[i+1] - r[i]]; for(int j = 0; j < res[i].length; j++) res[i][j] = t[r[i] + j]; res[r.length - 1] = new int[t.length - r[r.length-1]]; for(int j = 0; j < res[r.length - 1].length; j++) res[r.length - 1][j] = t[r[r.length-1] + j]; Exercice 5. Othello/Reversi 5.1. Initialisation du jeu public static void init(int[][] t){ // initialisation de toutes les cases a 2 (libre) for(int i = 0; i < t.length; i++) for(int j = 0; j < t[i].length; j++) t[i][j] = 2; t[3][3] = t[4][4] = 0; // pions blancs t[3][4] = t[4][3] = 1; // pions noirs 5.2. Fonction retournant le nombre de voisins d une case public static int nvoisins(int lig, int col){ if(lig == 0 lig == 7) if(col == 0 col == 7) return 3; else return 5; if(col == 0 col == 7) return 5; return 8; 4

5.3. Fonction retournant le tableau de tous les voisins d une case public static int[][] voisins(int[][] table, int lig, int col){ int nbvoisins = nombrevoisins(i, j, table.length); int[][] rep = new int[nbvoisins][2]; int n = 0; if(lig!= table.length - 1) { rep[n][0] = lig + 1; rep[n][1] = col ; n++; if(lig!= table.length - 1 && col!= table.length - 1) { rep[n][0] = lig + 1; rep[n][1] = col + 1; n++; if(col!= table.length - 1) { rep[n][0] = lig; rep[n][1] = col + 1; n++; if(lig!= 0 && col!= table.length - 1) { rep[n][0] = lig - 1; rep[n][1] = col + 1; n++; if(lig!= 0) { rep[n][0] = i - 1; rep[n][1] = col; n++; if(lig!= 0 && col!= 0) { rep[n][0] = lig - 1; rep[n][1] = col - 1; n++; if(col!= 0) { rep[n][0] = lig; rep[n][1] = col - 1; n++; if(lig!= table.length - 1 && col!= 0) { rep[n][0] = lig + 1; rep[n][1] = col - 1; n++; return rep; 5.4. Positions sur la table avec voisin de couleur opposée public static int[][] possibles(int[][] table, int couleur){ int[][] vs; int[][] pt = new int[table.length * table.length][]; int n = 0; for(int i = 0; i < table.length - 1; i++) for(int j = 0; j < table.length - 1; j++){ if(table[i][j]!= 2) continue; vs = voisins(table, i, j); for(int k = 0; k < vs.length; k++) if(table[vs[k][0]][vs[k][1]] == 1 - couleur){ pt[n] = new int[4]; pt[n][0] = i; pt[n][1] = j; pt[n][2] = vs[k][0] - i; // vers ligne du voisin autre couleur pt[n][3] = vs[k][1] - j; // vers colonne du voisin autre couleur n++; if(n == 0) return null; int[][] res = new int[n][]; for(int i = 0; i < n; i++) res[i] = pt[i]; 5

5.5. Positions valides sur la table public static int[][] valides(int[][] table, int couleur){ int a, b, c; int pos[][] = possibles(table, couleur); if (pos == null) return null; // le joueur est bloque int[][] valides = new int[pos.length][]; int n = 0; // le nombre de cases envisageables // pour chaque position potentielle, il faut rechercher s il existe // un pion notre couleur dans la direction du voisin de couleur differente for (int i = 0; i < pos.length; i++) { a = pos[i][0] + 2 * pos[i][2]; b = pos[i][1] + 2 * pos[i][3]; c = 1; while(a >= 0 && a <= table.length - 1 && b >= 0 && b <= table.length - 1) { if(table[a][b] == 2) break; if(table[a][b] == couleur){ valides[n] = new int[3]; valides[n][0] = pos[i][0]; valides[n][1] = pos[i][1]; valides[n][2] = c; n++; break; c++; a += pos[i][2]; b += pos[i][3]; if (n == 0) return null; int[][] res = new int[n][]; for(int i = 0; i < n; i++) res[i] = valides[i]; 6