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). | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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 !). | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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). | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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é. | |||
énoncé correction | |||
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). | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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.
| |||
énoncé correction | |||
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). | |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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.
| |||
énoncé correction | |||
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. | |||
énoncé correction | |||
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.
| |||
énoncé correction | |||
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.
| |||
énoncé correction | |||
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.
| |||
énoncé correction | |||
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. | |||
sujet horaire de passage |
Copyright © 2003 - 2004 Gautier Loyauté, Last modified: Sat Aug 28 18:20:35 CEST 2004 |