Algorithmique - Correction du TD5



Documents pareils
Consigne : je remplis le tableau en tenant compte des informations de la ligne supérieure et de la colonne de gauche (droite pour les gauchers)

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Plus petit, plus grand, ranger et comparer

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

Algorithmique et Programmation, IMA


Solutions du chapitre 4

Les structures de données. Rajae El Ouazzani

GOL502 Industries de services

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)

TP 1. Prise en main du langage Python

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

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

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

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

B B A C U C C U C G 2 E 0 B 0

Les arbres binaires de recherche

Java Licence Professionnelle CISII,

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Les chaînes de caractères

Cours d Algorithmique et de Langage C v 3.0

Recherche dans un tableau

Programme Compte bancaire (code)

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

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

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Introduction à l algorithmique et à la programmation M1102 CM n 3

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

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

Package Java.util Classe générique

Chap III : Les tableaux

Prêt(e) pour le CE1. Tu es maintenant au CE1. Avant de commencer les leçons, nous allons réviser avec toi!

Logique binaire. Aujourd'hui, l'algèbre de Boole trouve de nombreuses applications en informatique et dans la conception des circuits électroniques.

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

Travaux Dirigés n 1 : chaînes de caractères

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

AC AB. A B C x 1. x + 1. d où. Avec un calcul vu au lycée, on démontre que cette solution admet deux solutions dont une seule nous intéresse : x =

Représentation d un entier en base b

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

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

Algorithmique et programmation : les bases (VBA) Corrigé

Chapitre 10. Les interfaces Comparable et Comparator 1

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

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

2 Comment fonctionne un ordinateur, dans les grandes lignes

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

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

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

SUPPORT DE COURS. Langage C

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

TP1 : Initiation à Java et Eclipse

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Chapitre 2 Devine mon nombre!


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

Initiation à la programmation en Python

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

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Canevas théoriques du projet sur le poker Partie A

Programmation Par Objets

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

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

Découverte de Python

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

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

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

Quelques pistes pour exploiter les outils disponibles du logiciel «Notebook» en classe d éducation préscolaire

WINSCOP. De créer des factures, et de les faire contrôler et valider à distance. De créer des devis, des notes de frais (achats et kilométriques).

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Exe Livret Animateur_Exe Livret Animateur 01/02/11 11:10 Page1

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

PARCOURS 3 EXPERIMENTATION APPRENTISSAGE : PHASE 2 CARA CREATION DU PROGRAMME POUR LA PHASE 2

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

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

INF 321 : mémento de la syntaxe de Java

F411 - Courbes Paramétrées, Polaires

Programmation système I Les entrées/sorties

ALGORITHMIQUE ET PROGRAMMATION En C

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Jeux mathématiques en maternelle. Activités clés. Jeu des maisons et des jardins (Yvette Denny PEMF)

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

Simulation de variables aléatoires

Programmer en JAVA. par Tama

Licence Sciences et Technologies Examen janvier 2010

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

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

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

TD/TP PAC - Programmation n 3

Comment accéder à une vision synthétique de mon activité commerciale?

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

A.P.I. Kuka Manuel de l utilisateur Version 0.0.5

Présentation du langage et premières fonctions

Utilisation d objets : String et ArrayList

Cours 1 : Qu est-ce que la programmation?

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Fonctions homographiques

Programmation en Java IUT GEII (MC-II1) 1

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Transcription:

Algorithmique - Correction du TD5 IUT 1ère Année 20 janvier 2013 1 Les énumérations et structures Exercice 1. Ecrire un algorithme permettant de résoudre le problème suivant : Données : une chaîne représentant un mot en minuscules (nom simple, verbe, adjectif) de la langue française. Résultat : le nombre de voyelles et le nombre de consonnes dans la chaîne. Par exemple, le mot élève contient trois voyelles et deux consonnes. #include <string > // Retourne le nombre de voyelles d un mot int nombre_de_voyelles ( const string& mot) string voyelles = " aeiouyàâèéêëîïôùûœ" ; int nbvoyelles = 0 ; for ( int i = 0 ; i < mot. s i z e ( ) ; i ++) bool est_une_voyelle = 0 ; while (! est_une_voyelle && j < voyelles. size ( ) ) est_une_voyelle = (mot[ i ] == voyelles [ j ] ) ; nbvoyelles += est_une_voyelle ; return nbvoyelles ; Exercice 2. Ecrire un algorithme permettant de résoudre le problème suivant : Données : deux chaînes x et y représentant chacune un mot en majuscules (on n utilise pas les accents) de la langue française. Résultat : vrai si x et y sont des anagrammes et faux sinon. Rappelons que x est un anagramme de y si x est une permutation des lettres de y Par exemple, le mot CHIEN est un anagramme du mot NICHE. De la même manière, le mot LIERRE est un anagramme du mot RELIER. Mais LIRE n est pas un anagramme de LIERRE puisqu il n utilise qu un seul R et qu un seul E. #include <string > 1

// Trie l e s caractères d un mot selon l ordre lexicographique void t r i e r ( string& mot) int t a i l l e = mot. s i z e ( ) ; for ( int i = 0 ; i < t a i l l e 1 ; i ++) for ( int j = i +1; j < t a i l l e ; j ++) i f (mot[ j ] < mot[ i ] ) swap(mot[ i ],mot[ j ] ) ; // Teste s i deux mots sont des anagrammes bool anagrammes( const string& mot1, const string& mot2) string copie1 (mot1 ) ; string copie2 (mot2 ) ; t r i e r ( copie1 ) ; t r i e r ( copie2 ) ; return ( copie1 == copie2 ) ; Exercice 3. Ecrire un algorithme permettant de résoudre le problème suivant : Données : une chaîne de caractères x représentant un mot ou une expression de la langue française dont tous les caractères sont en majuscules. Résultat : vrai si x est un palindrome et faux sinon. Rappelons que x est un palindrome s il se lit de la même manière de gauche à droite et de droite à gauche. Par exemple, le mot RADAR et l expression MON NOM sont des palindromes. Mais l expression LE SEL n est pas (strictement) un palindrome à cause du caractère espace. #include <string > // Teste s i un mot est un palindrome bool palindrome ( const string& mot) int t a i l l e = mot. s i z e ( ) ; int milieu = t a i l l e / 2 ; bool est_symetrique = 1 ; int i = 0 ; while ( est_symetrique && i < milieu ) est_symetrique = (mot[ i ] == mot[ t a i l l e i 1 ] ) ; return est_symetrique ; Exercice 4. Ecrire un algorithme permettant de résoudre le problème suivant : Données : une phrase de la langue française ne contenant pas de symbole de ponctuation autre que le point final. Résultat : le nombre de mots dans la phrase. Par exemple, la phrase "Le chat est couché dans le canapé." contient 7 mots. 2

#include <string > // Compte l e nombre de mots dans une phrase int nombre_de_mots ( const string& phrase ) int i = 0, mots = 0 ; while ( i < phrase. s i z e ( ) ) while ( phrase [ i ] == ) mots++; while ( i < phrase. s i z e ( ) && phrase [ i ]! = ) return mots ; Exercice 5. Ecrire un algorithme permettant de résoudre le problème suivant : Données : une phrase P de la langue française et un mot m, tous deux écrits en majuscules. Résultat : le nombre d occurrences de m dans P. Par exemple, la phrase "LE CHAT S APPELLE PACHA." contient 2 fois le mot LE et 2 fois le mot CHA. #include <string > // Compte le nombre d occurrences de mot dans phrase ( variante de l algorithme vu dans le cours 7) int nombre_de_mots ( const string& phrase, const string& mot) int i = 0, occurrences = 0 ; while ( i < phrase. s i z e ( ) mot. s i z e ( ) ) bool trouve = 1 ; int temp = i ; while ( trouve && j < mot. s i z e ( ) ) trouve = (mot[ j ] == phrase [ i ] ) ; occurrences += trouve ; i = temp + 1 ; return occurrences ; 2 Les tableaux multi-dimensionnels Exercice 6. Ecrire un algorithme permettant de résoudre le problème suivant : 3

Données : une matrice M de dimension n n Résultat : vrai si M est la matrice identité et faux sinon. Dans la matrice identité, tous les éléments de sa diagonale sont égaux à 1 et tous les autres éléments sont égaux à 0. typedef float Matrice [n ] [ n ] ; // Teste s i une matrice M donnée est la matrice identité bool i d e n t i t e ( const Matrice& M) int i = 0, bool e s t _ i d e n t i t e = 1 ; while ( e s t _ i d e n t i t e && i < n) while ( e s t _ i d e n t i t e && j < n) i f ( i == j ) e s t _ i d e n t i t e = (M[ i ] [ j ] == 1 ) ; else e s t _ i d e n t i t e = (M[ i ] [ j ] == 0 ) ; return e s t _ i d e n t i t e ; Exercice 7. Ecrire un algorithme permettant de résoudre le problème suivant : Données : deux matrices A et B de dimension m n Résultat : la somme A + B des deux matrices. Rappelons que si C est la somme de A et de B, alors pour toute rangée 1 i m et toute colonne 1 j n de C, nous avons c i j = a i j + b i j. typedef float Matrice [m] [ n ] ; // Calcule la somme C de deux matrices A et B void somme( const Matrice& A, const matrice& B, matrice& C) for ( int i = 0 ; i < m; i ++) for ( j < n ; j ++) C[ i ] [ j ] = A[ i ] [ j ] + B[ i ] [ j ] ; Exercice 8. Ecrire un algorithme permettant de résoudre le problème suivant : Données : deux matrices A et B de dimension n n Résultat : le produit AB des deux matrices. 4

Rappelons que si C est le produit de A et de B, alors pour toute rangée 1 i n et toute colonne 1 j n de C, nous avons c i j = n k=1 a ikb k j. typedef float Matrice [n ] [ n ] ; // Calcule l e produit C de deux matrices A et B void somme( const Matrice& A, const matrice& B, matrice& C) for ( int i = 0 ; i < m; i ++) for ( j < n ; j ++) float prod = 0 ; for ( int k = 0 ; k < n ; k++) prod += A[ i ] [ k ] * B[ k ] [ j ] ; C[ i ] [ j ] = prod ; Exercice 9*. Nous cherchons à construire un algorithme permettant d effectuer des rotations d objets en 2D. Etant donné un réel positif θ, la rotation en 2D selon l angle θ est donnée par la matrice suivante : [ ] cosθ sinθ R = sinθ cosθ 1. Ecrire une procédure qui prend en entrée un point P dans R 2 et un angle θ, et qui effectue une rotation de P par θ. 2. Ecrire un algorithme qui prend en entrée un tableau de points (l objet géométrique que l on cherche à faire tourner) et un angle θ et qui effectue une rotation par θ de tous ses points. // Si Q est une matrice et P un point, l application de Q sur P est la matrice produit QP // dans laquelle P est vu comme un vecteur colonne typedef float Matrice [ 2 ] [ 2 ] ; typedef float Point [ 2 ] ; // Calcule l a rotation du point P par l a matrice R void rotation ( const Matrice& R, Point& P) Point Q; Q[ 0 ] *= (R [ 0 ] [ 0 ] P [ 0 ] + R [ 0 ] [ 1 ] P [ 1 ] ) ; Q[ 1 ] *= (R [ 1 ] [ 0 ] P [ 0 ] + R [ 1 ] [ 1 ] P [ 1 ] ) ; P [ 0 ] = Q[ 0 ] ; P [ 1 ] = Q[ 1 ] ; // Calcule l a rotation de tout un objet O constitué de points void rotation ( const Matrice& R, vector <Point>& O) for ( int i =0; i < O. s i z e ( ) ; i ++) rotation (R,O[ i ] ) ; 5

Exercice 10*. Le tic-tac-toe (morpion) est un jeu de plateau à deux joueurs, le joueur et le joueur. Le plateau est un tableau 3 3 initialement vide. A chaque tour de jeu, le joueur place une croix dans une case vide, puis le joueur place un cercle dans une autre case vide. Le jeu se termine lorsqu un des deux cas se produit : L un des joueurs a rempli une rangée, une colonne ou une diagonale. Dans ce cas le joueur gagne 1 points et son adversaire 1 point. Tout le plateau est rempli, sans qu aucune rangée, colonne ou diagonale n ait été remplie par un des joueurs. Dans ce cas, les deux joueurs ont 0 point. Vous devez construire un algorithme qui prend en entrée un état du jeu et teste si le jeu est terminé. Si c est bien le cas, l algorithme calcule le nombre de points gagnés par chaque joueur. // Modéliser l e s cases du jeu enum Case croix, rond, vide ; // Modéliser l e jeu typedef Case TicTacToe [ 3 ] [ 3 ] ; // Modéliser l e s points : index 0 pour la croix, index 1 pour le rond typedef Points [ 2 ] ; // Teste s i un joueur a gagné bool Gagne( const TicTacToe& jeu, const Case joueur ) bool agagne = 0 ; int i = 0 ; // Teste rangées while (! agagne && i < 3) agagne = jeu [ i ] [ 0 ] == jeu [ i ] [ 1 ] && jeu [ i ] [ 1 ] == jeu [ i ] [ 2 ] && jeu [ i ] [ 2 ] == joueur ; i = 0 ; // Teste colonnes while (! agagne && i < 3) agagne = jeu [ 0 ] [ i ] == jeu [ 1 ] [ i ] && jeu [ 1 ] [ i ] == jeu [ 2 ] [ i ] && jeu [ 2 ] [ i ] == joueur ; // Teste diagonales i f (! agagne ) agagne = jeu [ 0 ] [ 0 ] == jeu [ 1 ] [ 1 ] && jeu [ 1 ] [ 1 ] == jeu [ 2 ] [ 2 ] && jeu [ 2 ] [ 2 ] == joueur ; i f (! agagne ) agagne = jeu [ 0 ] [ 2 ] == jeu [ 1 ] [ 1 ] && jeu [ 1 ] [ 1 ] == jeu [ 2 ] [ 0 ] && jeu [ 2 ] [ 0 ] == joueur ; return agagne ; // Teste s i le jeu est rempli 6

bool Rempli ( const TicTacToe& jeu ) bool estrempli = 1 ; int i = 0 ; while ( estrempli && i < 3) while ( estrempli && j < 3) estrempli = jeu [ i ] [ j ]!= vide ; return estrempli ; // Teste l état du jeu et retourne des points s i le jeu est f i n i bool Tester ( const TicTacToe& jeu, Points& points ) i f (Gagne( jeu, croix ) ) points [ croix ]++; points [ rond] ; return true ; i f (Gagne( jeu, rond ) ) points [ croix ] ; points [ rond ] ++; return true ; return Rempli ( jeu ) ; Exercice 11*. Puissance 4 est un jeu à deux joueurs constitué d un plateau vertical de 6 rangées et de 7 colonnes. Le plateau est initialement vide. A chaque tour de jeu, le joueur rouge pose un jeton rouge dans une colonne j. Par gravité, le jeton vient au-dessus de la dernière case remplie de la colonne j. Le joueur jaune réalise la même opération en posant un jeton jaune dans une colonne. Vous devez construire une procédure qui prend en entrée un état du jeu, un joueur (jaune ou rouge) et une colonne (j ), et produit en sortie l état suivant du jeu. On supposera que la colonne j choisie par le joueur contient au moins une case vide. // Modéliser l e s cases du jeu enum Case jaune, rouge, vide ; // Modéliser l e jeu typedef Case Puissance4 [ 6 ] [ 7 ] ; // Mettre à jour le jeu selon l action du joueur ( choix d une colonne ) void MettreAJour ( TicTacToe& jeu, const Case joueur, const int colonne ) 7

int rangee = 5 ; while ( rangee >= 0 && jeu [ rangee ] [ colonne ]!= vide ) rangee ; // Cas où la colonne est pleine (on ne f a i t rien ) i f ( rangee < 0) return ; // Cas où la colonne n est pas pleine (on met à joueur ) jeu [ rangee ] [ colonne ] = joueur ; Exercice 12*. Le jeu Puissance 4 se termine lorsqu un des deux cas se produit. L un des joueurs a construit une rangée, colonne ou diagonale avec 4 pions consécutifs de sa couleur. Dans ce cas le joueur gagne 1 points et son adversaire 1 point. Tout le plateau est rempli, sans qu aucune rangée, colonne ou diagonale de 4 pions consécutifs n ait été construite par un des joueurs. Dans ce cas, les deux joueurs ont 0 point. Comme pour l exercice 10, vous devez construire un algorithme qui prend en entrée un état du jeu et teste si le jeu est terminé. Si c est bien le cas, l algorithme calcule le nombre de points gagnés par chaque joueur. // Modéliser l e s cases du jeu enum Case jaune, rouge, vide ; // Modéliser l e jeu typedef Case Puissance4 [ 6 ] [ 7 ] ; // Modéliser l e s points : index 0 pour le jaune, index 1 pour le rouge typedef Points [ 2 ] ; // Teste s i une rangée de 4 a été remplie par le joueur bool RangeeDe4 ( const Puissance4& jeu, const Case joueur ) bool motif = 0 ; int i = 0 ; while (! motif && i < 6) motif = 1 ; while ( motif && j < 4) motif = ( jeu [ i ] [ j ] == jeu [ i ] [ j +1]) && ( jeu [ i ] [ j +1] == jeu [ i ] [ j +2]) && ( jeu [ i ] [ j +2] == joueur ) ; return motif ; // Teste s i une colonne de 4 a été remplie par le joueur 8

bool ColonneDe4 ( const Puissance4& jeu, const Case joueur ) bool motif = 0 ; while (! motif && j < 7) int i = 5 ; motif = 1 ; while ( motif && i > 2) motif = ( jeu [ i ] [ j ] == jeu [ i 1][ j ] ) && ( jeu [ i 1][ j ] == jeu [ i 1][ j ] ) && ( jeu [ i 1][ j ] == joueur ) ; i ; return motif ; // Teste s i une diagonale de 4 a été remplie par le joueur bool DiagonaleDe4 ( const Puissance4& jeu, const Case joueur ) bool motif = 0 ; while (! motif && j < 7) int i = 5 ; // On teste l e s diagonales vers la droite i f ( j <= 3) motif = 1 ; while ( motif && i > 2) motif = ( jeu [ i ] [ j ] == jeu [ i 1][ j +1]) && ( jeu [ i 2][ j +2] == jeu [ i 3][ j +3]) && ( jeu [ i 3][ j +3] == joueur ) ; i ; i = 5 ; // On teste l e s diagonales vers la gauche i f (! motif && j >= 3) motif = 1 ; while ( motif && i > 2) motif = ( jeu [ i ] [ j ] == jeu [ i 1][ j 1]) && ( jeu [ i 2][ j 2] == jeu [ i 3][ j 3]) && ( jeu [ i 3][ j 3] == joueur ) ; i ; return motif ; 9

// Teste s i un joueur a gagné bool Gagne( const Puissance4& jeu, const Case joueur ) return ( RangeeDe4 ( jeu, joueur ) ColonneDe4 ( jeu, joueur ) DiagonaleDe4 ( jeu, joueur ) ) ; // Teste s i le jeu est rempli bool Rempli ( const Puissance4& jeu ) bool estrempli = 1 ; int i = 0 ; while ( estrempli && i < 6) while ( estrempli && j < 7) estrempli = jeu [ i ] [ j ]!= vide ; return estrempli ; // Teste l état du jeu et retourne des points s i le jeu est f i n i bool Tester ( const Puissance4& jeu, Points& points ) i f (Gagne( jeu, jaune ) ) points [ 0 ] + + ; points [1] ; return true ; i f (Gagne( jeu, rouge ) ) points [0] ; points [ 1 ] + + ; return true ; return Rempli ( jeu ) ; 10