IN TD 08 4 novembre 2011

Documents pareils
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)

Introduction au langage C

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

Les structures de données. Rajae El Ouazzani

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

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

Les arbres binaires de recherche

Cours d algorithmique pour la classe de 2nde

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

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Les structures. Chapitre 3

Programme Compte bancaire (code)

Java Licence Professionnelle CISII,

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

3IS - Système d'exploitation linux - Programmation système

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

Programmation Classique en langage C

I. Introduction aux fonctions : les fonctions standards

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

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Cours Programmation Système

Le langage C. Séance n 4

Algorithmique et Programmation, IMA

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

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

Chapitre 1 : La gestion dynamique de la mémoire

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Conventions d écriture et outils de mise au point

Cours 6 : Tubes anonymes et nommés

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

INITIATION A LA PROGRAMMATION

Le prototype de la fonction main()

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Cours Langage C/C++ Programmation modulaire


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

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

Programmation impérative

Compression de Données - Algorithme de Huffman Document de Conception

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

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

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Programmation système I Les entrées/sorties

MINIMUM. connaissances nécessaires à la programmation des microcontrôleurs PIC18 en langage C (une introduction au langage c A.N.S.

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

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

TP2 : tableaux dynamiques et listes chaînées

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

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

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

Programmation en langage C

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Algorithmique, Structures de données et langage C

Algorithmes récursifs

Testez votre installation. Créer un répertoire vide

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

Cours de Systèmes d Exploitation

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

Cours d Algorithmique et de Langage C v 3.0

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

Cryptographie RSA. Introduction Opérations Attaques. Cryptographie RSA NGUYEN Tuong Lan - LIU Yi 1

as Architecture des Systèmes d Information

V- Manipulations de nombres en binaire

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

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Playing with ptrace() for fun and profit

Premiers Pas en Programmation Objet : les Classes et les Objets

Quelques éléments de compilation en C et makefiles

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

TP, première séquence d exercices.

Chap III : Les tableaux

Programmation système de commandes en C

Plan Pédagogique du cours

Cours de C. Allocation dynamique. Sébastien Paumier

ALGORITHMIQUE ET PROGRAMMATION En C

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Langage Éric Guérin 5 octobre 2010

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Les chaînes de caractères

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Claude Delannoy. 3 e édition C++

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Initiation à l algorithmique

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

COMPARAISONDESLANGAGESC, C++, JAVA ET

IUT ANNECY Département Mesures Physiques Cours d informatique Initiation au langage C

SUPPORT DE COURS. Langage C

Programmation système en C/C++

Le système de gestion des fichiers, les entrées/sorties.

Outils pour la pratique

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

CORRECTION EXERCICES ALGORITHME 1

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

et Programmation Objet

OS Réseaux et Programmation Système - C5

Systeme d'exploitation

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Notes de Cours - Programmation Pascal Ferraro

Transcription:

IN 101 - TD 08 4 novembre 011 Corrigé Solution 1 : Bibliothèque pour gérer les rationnels À la fin de l exercice, le fichier ratio.h contient tous les prototypes de fonctions et la déclaration du type ratio. Il est aussi pratique de préciser tous les includes nécessaires au fonctionnement de la bibliothèque, stdio.h pour les printf et stdlib.h pour les malloc. La ligne du début #ifndef RATIO H et le #define RATIO H qui la suit servent à éviter de déclarer la structure et les fonctions deux fois si jamais le fichier ratio.h est inclus deux fois. Ce n est pas forcément nécessaire ici, mais c est une pratique à avoir : les utilisateurs de votre bibliothèque peuvent faire autant d includes qu ils veulent sans risques. 1 #ifndef _RATIO_H #define _RATIO_H 3 4 #include <stdio.h> #include <stdlib.h> 7 typedef struct { 8 int numer; 9 int denom; 10 } ratio; 11 1 ratio* rat_init(int a, int b); 13 void rat_print(ratio* r); 14 ratio.h 1 ratio* rat_add(ratio* r1, ratio* r); 1 ratio* rat_mul(ratio* r1, ratio* r); 17 void rat_free(ratio* r); 18 19 void rat_simplify(ratio* r); 0 1 ratio* rat_clone(ratio* r); double rat_eval(ratio* r); 3 void rat_inv(ratio* r); 4 ratio* rat_addint(ratio* r, int a); #endif 1.a ] La déclaration du type a sa place dans le.h, avec le prototype. Le corps de la fonction va lui dans le fichier. Il faut utiliser malloc pour que la structure ne soit pas dans la pile et soit encore accessible après avoir quitté la fonction rat init. Notez que le fichier doit commencer par inclure le fichier ratio.h (avec des guillemets "" et non pas les <> car le fichier est dans le répertoire, pas à un emplacement de bibliothèque système) pour pouvoir connaître le type ratio. 1

3 ratio* rat_init(int a, int b) { 4 ratio* res = (ratio*) malloc(sizeof(ratio)); res->numer = a; res->denom = b; 7 return res; 8 } 1.b ] Voici la fonction d affichage et le main qui permet de tester. 1 void rat_print(ratio* r) { printf("%d/%d", r->numer, r->denom); 3 } 3 int main() { 4 ratio* a = rat_init(3,); rat_print(a); return 0; 7 } 1.c ] Voici les nouvelles fonctions et de quoi les tester. 1 ratio* rat_add(ratio* r1, ratio* r) { ratio* res = rat_init(r1->numer*r->denom + r->numer*r1->denom, 3 r1->denom*r->denom); 4 return res; } 7 ratio* rat_mul(ratio* r1, ratio* r) { 8 ratio* res = rat_init(r1->numer*r->numer, r1->denom*r->denom); 9 return res; 10 } 11 1 void rat_free(ratio* r) { 13 free(r); 14 } 3 int main() { 4 ratio* a = rat_init(3,); ratio* b = rat_init(,7); ratio* c = rat_add(a,b); 7 rat_print(c); 8 rat_free(a); // on libère a avant de l écraser 9 a = rat_mul(b,c);

10 rat_print(a); 11 rat_free(a); rat_free(b); rat_free(c); 1 return 0; 1.d ] Pour simplifier on utilise la fonction interne gcd que l on n inclut pas dans le.h. Une fois mat simplify programmé, on peut l appeler sur res dans mat add et mat mul avant le return. Ici, le passage d argument par pointeur simplifie beaucoup la vie : on modifie directement la fraction sans avoir à renvoyer quoi que ce soit. 1 int gcd(int a, int b) { int r; 3 while (b!= 0) { 4 r = a%b; a = b; b = r; 7 } 8 return a; 9 } 10 11 void rat_simplify(ratio* r) { 1 int pgcd = gcd(r->numer, r->denom); 13 r->numer /= pgcd; 14 r->denom /= pgcd; 1 } 1.e ] Voici les dernières fonctions de la bibliothèque. 1 ratio* rat_clone(ratio* r) { ratio* res = rat_init(r->numer, r->denom); 3 return res; 4 } double rat_eval(ratio* r) { 7 double res = (double) r->numer/r->denom; 8 return res; 9 } 10 11 void rat_inv(ratio* r) { 1 int tmp = r->numer; 13 r->numer = r->denom; 14 r->denom = tmp; 1 } 1 17 ratio* rat_addint(ratio* r, int a) { 18 ratio* res = rat_init(r->numer + a*r->denom, r->denom); 19 return res; 0 } 3

Solution : Utilisation de votre bibliothèque de rationnels.a ] Voici à quoi peut ressembler la fonction pour la calcul de et un main pour la tester. Notez bien l utilisation de rat free dans la boucle pour libérer un rationnel à chaque tour de boucle : il est remplacé par le nouveau rationnel que rat addint a alloué juste avant. 3 ratio* sqrt_deux(int n) { 4 int i; ratio *r, *res; // on démarre avec 1/ et on applique la transfo : x -> 1/(+x) 7 r = rat_init(1,); 8 for (i=1; i<n; i++) { 9 res = rat_addint(r,); 10 rat_inv(res); 11 rat_free(r); 1 r = res; 14 res = rat_addint(r,1); // le +1 de la fin 1 rat_free(r); // bien libérer tout ce qui ne sert plus avant le return 1 return res; 17 } 18 19 int main() { 0 int i; 1 ratio* r; for (i=1; i<30; i++) { 3 printf("précision %d => ",i); 4 r = sqrt_deux(i); rat_print(r); // on affiche la fraction printf(" = %.10f\n", rat_eval(r)); // et son évaluation 7 rat_free(r); 8 } 9 return 0; 30 }.b ] La fonction est très simple (il faut quand même faire les mat free au bon moment), mais on manque très vite de précision avec des simples int pour représenter un rationnel : 1 ratio* sum_carres(int n) { int i; 3 ratio *r1, *r, *res; 4 r1 = rat_init(0,1); for (i=1; i<=n; i++) { r = rat_init(1, i*i); 7 res = rat_add(r1,r); 8 rat_free(r1); 9 rat_free(r); 10 r1 = res; 11 } 1 return res; 4

En utilisant des long long int au lieu d int dans la structure ratio on peut aller un peu plus loin, mais on reste loin d une bonne approximation de π. Il faudrait utiliser des entiers multi-précision (comme pour le 100! du TD 0) pour faire mieux, ou alors directement tout calculer en double si une valeur approchée suffit..c ] L équation x = b a+x a pour solution une des racines de x +ax b qui sont a± 4a +b. La racine positive est N a. Il suffit donc de calculer cette fraction continue et d y ajouter a pour obtenir la racine carrée de N. La principale difficulté est de savoir quand arrêter les calculs car il n est pas évident de savoir quand les int utilisés pour la représentation vont déborder. Sinon, le code ressemble beaucoup au code de la racine de. 1 double racine(int n) { int a, b, i; 3 ratio *r1, *r; 4 double res; // on calcule le plus grand carré plus petit que n 7 a=1; 8 while ((a+1)*(a+1) <= n) { 9 a++; 10 } 11 b = n-a*a; 1 13 // si n est un carré, le travail est fini 14 if (b == 0) { 1 return a; 1 } 17 18 // sinon on démarre à b/a et on itère la fonction : x -> b/(a+x) 19 r1 = rat_init(b,*a); 0 while ((r1->numer < 10000000) && (r1->denom < 10000000)) { 1 r = rat_addint(r1, *a); rat_free(r1); 3 rat_inv(r); 4 // pour faire propre, il faudrait un fonction rat_mulint dans r->numer *= b; r1 = r; 7 } 8 r = rat_addint(r1,a); // on ajoute le a de la fin 9 res = rat_eval(r); 30 rat_free(r1); // on libère tous les rationnels 31 rat_free(r); 3 return res; 33 }