Licence Sciences 2ème Année
Filière -- Mathématiques, Informatique et Applications aux Sciences 2004 - 2005
Algorithmique avec le langage C
2ème semestre 2005
TD 1 -- Quelques exercices d'introduction
Auteur Marc Zipstein 16 Février 2005
Quelques exercices d'introduction

Cette première séance de TD a pour but de faire des rappels sur les concepts de base du langage C (tests, boucles, tableaux, fonctions, ...). Nous introduirons dans un second temps la notion de complexité en temps qui est une donnée très importante d'un algorithme. Cette notion correspond en fait au temps nécessaire à l'exécution d'un algorithme. Celle-ci sera abordée à travers deux exercices, le premier concernant la multiplication tandis que le second s'intéressant à la rotation dans un tableau (trois solutions possibles à ce problème seront développées).

Examen surprise 1 -- Sur la bonne compréhension du TD1
Auteur G. Loyauté 23 Février 2005
Sur la bonne compréhension du TD1

Cet petit examen surprise porte sur la compréhension du principe de passage par adresse et les conséquences de son utilisation. Ainsi que sur la rotation gauche dans un tableau en utilisant une fonction miroir.

TD 2 -- Récursivité
Auteur Marc Zipstein 23 Février 2005
Récursivité

Durant ce TD, nous allons voir une méthode de programmation très puissante : la récursivité. Elle permet d'écrire très facilement des programmes compréhensibles et souvent efficaces bien que son problème principal est d'obliger le compilateur à utiliser une pile afin de mémoriser les calculs intermédiaires. En utilisant la récursivité, nous écrirons des fonctions permettant de calculer la factorielle d'un nombre, au travers trois fonctions différentes, de calculer la puissance et nous verrons le principe de la recherche dichotomique. Enfin, nous verrons le problème du monnayeur.

TD 3 -- Récursivité (suite)
Auteur Marc Zipstein 02 Mars 2005 et 09 Mars 2005
Récursivité (suite)

Durant ce TD, nous allons utiliser la récursivité afin de résoudre le problème des tours de Hanoï. Nous verrons dans un second temps la taille du problème qu'un ordinateur (présentant des caractéristiques particulières) donné peut résoudre en considérant que le déplacement d'un plateau est une instruction élémentaire (ce qui n'est pas le cas en vrai !).

Examen surprise 2 -- Récurrence, preuve et programmation
Auteur G. Loyauté 02 Mars 2005
Récurrence, preuve et programmation

Cet examen surprise porte sur la compréhension du principe de la récursivité, ses avantages et ses inconvénients. Il portera sur la démonstration par récurrence de certaines propriétés sur les nombres de Fibonacci (encadrement, nombre d'appels, ...), ainsi que sur les nombres de Catalan. Enfin, un exercice bonus s'intéresse à la génération de toutes les permutations d'ordre n.

TD 4 -- Tableaux et tris
Auteur Marc Zipstein 16 Mars 2005
Tableaux et tris

Ce TD va s'intéresser à l'opération fondamentale en Informatique qu'est le tri d'une suite d'éléments. Il existe plusieurs algorithmes de tri (tri à bulles, tri par insertion, tri rapide, ...) chacun pouvant présenter des variantes. Nous allons ainsi voir le réarrangement des éléments d'un tableau qui positionne tout les éléments pairs d'un côté et les impairs de l'autre. Dans un second temps, nous verrons le problème du drapeau tricolore qui permet de regrouper les trois types d'éléments d'un ensemble. Enfin, nous verrons deux variantes d'algorithmes de tri que sont le tri par distribution et le tri de Shell. Il faut noter que le tri par distribution ne peut pas être exploité sur n'importe quel ensemble de valeurs.

TD 5 -- Coercition et ensembles
Auteur Marc Zipstein 06 Avril 2005 et 13 Avril 2005
Coercition et ensembles

Ce TD va s'intéresser à l'allocation dynamique de la mémoire en manipulant des ensembles d'entiers représentés par des tableaux. Nous verrons ainsi des fonctions utilitaires permettant de tester si un ensemble est vide, de le mettre à vide, de réaliser la saisie d'un ensemble, de faire l'allocation et la libération de celui-ci. Ainsi que des fonctions moins triviales que sont l'union et l'intersection de deux ensembles. Nous verron aussi l'utilisation du pointeur void * permettant de réaliser des fonctions de copie et de comparaison générique.

Examen surprise 3 -- Récurrence et tris
Auteur G. Loyauté 06 Avril 2005
Récurrence et tris

Cet examen surprise va porter sur la bonne compréhension du principe de passage par adresse et une de ses utilisations, de la récurrence au travers du problème du positionnement des huit reines sur un échiquier et enfin des algorithmes de tri et plus spécifiquement du tri de Shell (vu au TD précédent).

TD 6 -- Listes chaînées par pointeurs
Auteur Marc Zipstein 13 Avril 2005, 20 Avril 2005 et 11 Mai 2005
Listes chaînées par pointeurs

Ce TD va se consacrer à une nouvelle structure de donnée : les listes chaînées. A travers des fonctions permettant de déterminer le nombre d'éléments présents dans une liste, si un élément est présent ou non, l'affichage d'une liste, une fonction miroir et le listage de mots, fonctions d'insertions et d'extractions, nous manipulerons cette structure de données. Nous verrons aussi une petite comparaison entre listes chaînées et tableaux d'éléments.

Examen surprise 4 -- Allocation dynamique et ensembles
Auteur G. Loyauté 13 Avril 2005
Allocation dynamique et ensembles

Cet examen surprise va porter sur la bonne compréhension de l'allocation dynamique et notamment des fonctions C (malloc, calloc, realloc et free) permettant de faire de la gestion dynamique de la mémoire. Une seconde partie sera consacrée à la manipulation d'ensemble et plus spécifiquement sur l'union et l'intersection de deux ensembles d'entiers.

TD 7 -- Listes chaînées triées
Auteur Marc Zipstein 11 Mai 2005 et 18 Mai 2005
Listes chaînées triées

Ce TD se consacre à la manipulation de listes chaînées triées d'entiers à travers quelques fonctions. Celles-ci vont permettre entre autre de rechercher une valeur dans une liste, de comparer deux listes ou de supprimer les doublons. La fonction la plus importante, pour l'utilisation de listes triées, est bien entendue l'insertion, étant la seule à influer fortement sur la nature triée de la liste. En effet, les autres utilisent le tri sur les élements afin d'obtenir des complexités en moyenne meilleure. Nous verrons enfin, un exercice un peu plus difficile qui est la fusion de deux listes chaînées triées.

Examen surprise 5 -- Listes simplement chaînées et fichiers
Auteur G. Loyauté 11 Mai 2005
Listes simplement chaînées et fichiers

Cet examen surprise va porter sur la bonne compréhension des listes chaînées et des fichiers. Pour ce faire, des fonctions permettant de créer une liste simplement chaînée à partir d'un fichier sera demandée, ainsi qu'une fonction réalisant l'insertion en fin de liste (attention au cas particulier de la liste vide). Enfin, un retour sur les tris et plus spécifiquement sur le tri bulle sera effectué.

TD 8 -- File d'attente
Auteur Marc Zipstein 18 Mai 2005
File d'attente

Le but de ce TD est d'implanter quelques opérations de base permettant de manipuler une nouvelle structure de donnée : les files d'attente. Pour ce faire deux structures différentes seront utilisées, dans un premier temps des listes simplement chaînées puis des listes doublement chaînées circulaires. Dans le premier cas, il faudra définir proprement la structure afin de permettre des ajouts rapides dans la file d'attente (utilisation de deux pointeurs, le premier sur la tête de liste, le second sur la fin de liste).

TD 9 -- Manipulation de bits et tableaux de listes
Auteur Marc Zipstein 25 Mai 2005
Manipulation de bits et tableaux de listes

Le but de ce TD est de manipuler des bits en C en utilisant les opérateurs logiques ainsi que les masques. Nous implanterons ainsi des fonctions permettant de transformer des chaînes de caractères en binaires et inversement, ainsi que des fonctions permettant de récupérer ou de fixer la valeur d'un bit spécifié par sa position. Enfin, nous concluerons par un exercice permettant de stocker le plus efficacement possible des entiers en utilisant un tableau de listes chaînées. Ce dernier exercice permettra d'introduire le principe de hachage.

Examen surprise 6
Auteur G. Loyauté 25 Mai 2005

Cet examen surprise va porter sur la bonne compréhension des listes doublement chaînées à travers une implantation originale et quelques fonctions. Avant toute chose, la définition des structures de données et des types est une opération obligatoire. Ensuite, on demandera d'implanter des fonctions permettant de réaliser une insertion triée dans la liste ainsi que l'extraction d'un élément de celle-ci. Enfin, une fonction obligatoire lors de toute allocation dynamique est la libération de tous les éléments présents dans la liste.

Le véritable enseignement n'est point de te parler, mais de te conduire. A. Saint-Exupéry

Algorithmique avec le langage C
2ème semestre 2005
TP 1 -- Quelques rappels sur le langage C
18 Février 2005
Quelques rappels sur le langage C

Tout d'abord, lisez entièrement la charte des TPs.

Durant cette première séance de travaux pratiques, nous faisons le rappel des concepts de base du langage C (tests, boucles, tableaux, fonctions, ...). Nous verrons aussi un concept très important à appréhender qui est la différence entre le passage par valeur et par adresse des arguments d'une fonction.

Afin de prendre de bonnes habitudes (en vue notamment du projet), l'ensemble des fonctions programmées devront être commentées et testées. Nous rappelons aussi que les options appliquées lors de la compilation seront -Wall et -ansi et qu'il est très fortement déconseillé d'utiliser dans votre code des variables globales.
De plus il est conseillé de respecter une convention de présentation du code unique (pour exemple, la convention du langage C ou la convention du langage Java).

Questions supplémentaires à l'exercice 1 :

Est-il possible en utilisant un opérateur logique d'échanger les valeurs de deux variables ? Si oui lequel ?
Est-il possible en utilisant des opérations arithmétiques classiques d'échanger les valeurs de deux variables ? si oui lesquels ? A quoi faut-il faire attention ?

TP 2 -- Introduction à la récursivité
Auteur Marc Zipstein 25 Février 2005
Introduction à la récursivité

Cette séance de TP va consister à l'écriture et au test de différentes fonctions récursives. Nous implanterons ainsi certaines fonctions vues en TD ou en cours (fonction factorielle, les trois fonctions puissances, la fonction de calcul du pgcd et la fonction de recherche dichotomique) en utilisant un paramètre permettant de déterminer le nombre d'appels récursifs réalisés par chacune de ces fonctions.
Dans un second temps, nous comparerons la fonction récursive permettant de calculer le nième nombre de Fibonacci à sa version itérative, et illustrer ainsi qu'une résolution récursive d'un problème donné n'est pas toujours optimale.
Nous verrons enfin, le problème des Tour de Hanoï et notamment l'affichage des différentes étapes de la résolution de ce célèbre problème.

Chacun des algorithmes ainsi implanté devra être accompagné du calcul de sa complexité.

Nous rappelons que l'ensemble des fonctions programmées devront être commentées et testées, que les options appliquées lors de la compilation seront -Wall et -ansi et qu'il est très fortement déconseillé d'utiliser dans votre code des variables globales.

TP 3 -- Récursivité (suite)
Auteur Marc Zipstein 04 Mars 2005
Récursivité (suite)

Durant cette séance de TP, nous allons approfondir la notion de récursivité (vue durant le TP précédent) à travers la résolution de deux problèmes. Le premier concerne les chaînes de caractères et plus spécifiquement leur inversion ainsi que la détermination des mots palindromes (un mot que l'on peut lire indifféremment de droite à gauche ou de gauche à droite).
Le second problème plus complexe nommé problème du sac à dos, cherche à déterminer si étant donné un ensemble d'entiers positifs, il en existe un sous-ensemble tel que la somme de ses éléments soit égal à un entier positif donné.

Chacun des algorithmes ainsi implanté devra être accompagné du calcul de sa complexité.

Nous rappelons que l'ensemble des fonctions programmées devront être commentées et testées, que les options appliquées lors de la compilation seront -Wall et -ansi et qu'il est très fortement déconseillé d'utiliser dans votre code des variables globales.

TP 4 -- Tableaux et Tris
Auteur Marc Zipstein 11 Mars 2005
Tableaux et Tris

Durant cette séance de TP, nous allons utiliser une opération fondamentale en Informatique : le tri. Il existe plusieurs algorithmes de tri et de nombreuses variantes que nous allons implanter dans ce TP. De plus, il est intéressant de pouvoir observer le comportement en cours de déroulement des divers algorithmes de tris. Pour se faire, nous allons utiliser la librairie graphique MlvLib.

Chacun des algorithmes ainsi implanté devra être accompagné du calcul de sa complexité.

Nous rappelons que l'ensemble des fonctions programmées devront être commentées et testées, que les options appliquées lors de la compilation seront -Wall et -ansi et qu'il est très fortement déconseillé d'utiliser dans votre code des variables globales.

TP 5 -- Ensembles et Allocation dynamique
Auteur Marc Zipstein 18 Mars 2005
Ensembles et Allocation dynamique

Durant cette séance de TP, nous allons utiliser l'allocation dynamique (plus spécifiquement les fonctions malloc, realloc et free) afin de manipuler des ensembles d'entiers de taille variable. Nous verrons de plus des fonctions permettant de réaliser l'union et l'intersection de deux ensembles. Dans un dernier temps, nous verrons l'utilisation de la fonction realloc qui permet d'adapter la place mémoire strictement nécessaire à un ensemble.

Chacun des algorithmes ainsi implanté devra être accompagné du calcul de sa complexité.

Nous rappelons que l'ensemble des fonctions programmées devront être commentées et testées, que les options appliquées lors de la compilation seront -Wall et -ansi et qu'il est très fortement déconseillé d'utiliser dans votre code des variables globales.

TP 6 -- Fichiers et Listes chaînées
Auteur Marc Zipstein 25 Mars 2005
Fichiers et Listes chaînées

Cette séance de TP sera consacrée dans un premier temps à la manipulation des fichiers (structure FILE permettant de représenter un fichier en C) notamment au travers des fonctions fopen, fscanf, fprintf et fclose. Dans un second temps, nous verrons une structure récursive, les listes chaînées. En effet, cette structure a un de ces champs qui est de type pointeur sur cette structure. Nous verrons ainsi, des fonctions d'insertion, de création, d'affichage et de libération sur les liste chaînées.

Chacun des algorithmes ainsi implanté devra être accompagné du calcul de sa complexité.

Nous rappelons que l'ensemble des fonctions programmées devront être commentées et testées, que les options appliquées lors de la compilation seront -Wall et -ansi et qu'il est très fortement déconseillé d'utiliser dans votre code des variables globales.

TP 7 -- Listes chaînées
Auteur Marc Zipstein
Listes chaînées

Dans ce TP, nous allons poursuivre l'implantation des listes chaînées commencée durant le TP précédent. Nous verrons notamment la fonction permettant d'extraire une cellule d'une liste, puis une fonction réalisant le tri fusion sur une liste chaînée. Afin de réaliser l'ensemble des fonctions, il est fortement recommander de dessiner les listes et de numéroter les différentes actions à effectuer. Pour réaliser les tests de vos fonctions, un fichier de nombre aléatoire est disponible, ainsi que le programme permettant de générer ce fichier. Pour vérifier que votre programme marche bien, pensez à utiliser la commande sort (avec l'option -g pour l'ordre numérique) qui permet de trier les lignes d'un fichier.

Chacun des algorithmes ainsi implanté devra être accompagné du calcul de sa complexité.

Nous rappelons que l'ensemble des fonctions programmées devront être commentées et testées, que les options appliquées lors de la compilation seront -Wall et -ansi et qu'il est très fortement déconseillé d'utiliser dans votre code des variables globales.

TP 8 -- Compléments sur les listes chainées
Auteur Marc Zipstein
Compléments sur les listes chainées

Dans ce TP, nous allons compléter la manipulation des listes chaînées au travers quelques implantations un peu plus complexes (listes doublement chaînées et listes circulaires). Ainsi, dans un premier temps nous utiliserons une liste chaînée circulaire afin de résoudre le problème de la permutation de Josephus. Dans un second temps, nous verrons la structure de donnée possible afin d'implanter des listes doublement chaînées ainsi que les fonctions de bases que sont la création, l'insertion et la suppression d'une cellule de la liste. Enfin, nous essayerons de résoudre avec une liste doublement chaînée circulaire le problème de la permutation de Josephus.

Chacun des algorithmes ainsi implanté devra être accompagné du calcul de sa complexité.

Nous rappelons que l'ensemble des fonctions programmées devront être commentées et testées, que les options appliquées lors de la compilation seront -Wall et -ansi et qu'il est très fortement déconseillé d'utiliser dans votre code des variables globales.

TP 9 -- Compléments sur les listes chainées (fin du TP 8)
Auteur Marc Zipstein
Compléments sur les listes chainées (fin du TP 8)

Dans ce TP, nous allons finir les exercices proposés dans le TP précédent.

Chacun des algorithmes ainsi implanté devra être accompagné du calcul de sa complexité.

Nous rappelons que l'ensemble des fonctions programmées devront être commentées et testées, que les options appliquées lors de la compilation seront -Wall et -ansi et qu'il est très fortement déconseillé d'utiliser dans votre code des variables globales.

Projet -- Enveloppe convexe dans le plan par listes doublement chaînées
Auteur Marc Zipstein
Enveloppe convexe dans le plan par listes doublement chaînées

L'objectif de ce projet est de vous faire implémenter un algorithme de détermination d'enveloppe convexe dans le plan en utilisant une structure de type liste doublement chaînée.

Les soutenances auront lieu le Mercredi 1 Juin 2005 et le Vendredi 3 Juin 2005.