info719 : Rappels d algorithmique et programmation C Examen SOLUTIONS

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)

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


Introduction au langage C

Rappels Entrées -Sorties

Les structures de données. Rajae El Ouazzani

Java Licence Professionnelle CISII,

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

Les arbres binaires de recherche

Découverte de Python

Initiation à la programmation en Python

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

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

Algorithmique et Programmation, IMA

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

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

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Algorithmes récursifs

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

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

Corrigé des TD 1 à 5

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Continuité et dérivabilité d une fonction

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

Conventions d écriture et outils de mise au point

Initiation à l algorithmique

1 Recherche en table par balayage

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

Cours 1 : La compilation

Le langage C. Séance n 4

Calcul Formel et Numérique, Partie I

STAGE IREM 0- Premiers pas en Python

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Cours d algorithmique pour la classe de 2nde

Comparaison de fonctions Développements limités. Chapitre 10

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

V- Manipulations de nombres en binaire

Présentation du langage et premières fonctions

Cours 1 : Qu est-ce que la programmation?

I. Introduction aux fonctions : les fonctions standards

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

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Programmation Classique en langage C

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

Représentation d un entier en base b

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

Chapitre 7. Récurrences

Limites finies en un point

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

Les chaînes de caractères

Image d un intervalle par une fonction continue

Cours d Algorithmique et de Langage C v 3.0

Claude Delannoy. 3 e édition C++

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

Programmation système en C/C++

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

Maple: premiers calculs et premières applications

ACTIVITÉ DE PROGRAMMATION

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Le prototype de la fonction main()

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

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Exercices - Polynômes : corrigé. Opérations sur les polynômes

Algorithmique, graphes et programmation dynamique Notes de Cours Rapport de Travaux Pratiques. Laurent Canet

Chap III : Les tableaux

Cours de Systèmes d Exploitation

Architecture des ordinateurs

Licence Sciences et Technologies Examen janvier 2010

as Architecture des Systèmes d Information

TP 1. Prise en main du langage Python

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

4. Groupement d objets

Algorithmique I. Algorithmique I p.1/??

Résolution d équations non linéaires

Quelques algorithmes simples dont l analyse n est pas si simple

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Chapitre 2. Eléments pour comprendre un énoncé

Programmation C. Apprendre à développer des programmes simples dans le langage C

Université Paris-Dauphine DUMI2E 1ère année, Applications

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

ALGORITHMIQUE ET PROGRAMMATION En C

Algorithmes et mathématiques. 1. Premiers pas avec Python. Exo Hello world!

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

4. Les structures de données statiques

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

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

Premiers pas avec Mathematica

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

Chapitre 1 : La gestion dynamique de la mémoire

Solutions du chapitre 4

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Programmer en JAVA. par Tama

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

Transcription:

info719 : Rappels d algorithmique et programmation C Examen SOLUTIONS Pierre Hyvernat Laboratoire de mathématiques de l université de Savoie bâtiment Chablais, bureau 22, poste : 94 22 email : Pierre.Hyvernat@univ-savoie.fr www : http://www.lama.univ-savoie.fr/~hyvernat/ wiki : http://www.lama.univ-savoie.fr/wiki Durée : 2h ; documents et calculatrice non-autorisés. Un barème provisoire est donné dans la marge. 1 point sera réservé à la présentation de vos réponses et de vos calculs... Partie 1 : langage C (2) Question 1. Qu affiche le morceau de programme suivant? int m, n, p; n = 3; m = n+1; int n, p; p = m+7; n = 4; printf("(1) m=%i, n=%i et p=%i\n",m,n,p); printf("(2) m=%i, n=%i et p=%i\n",m,n,p); Solution : le programme affiche (1) m=4, n=4 et p=11 (2) m=4, n=3 et p=-1077735528 (La valeur de p sur la deuxième ligne ne correspond à rien...) (3) Question 2. Même question que précédemment : int m, n; int *p, *q; int **x; m = 42; p = &m; q = &n; *q = m / 2; q = p; printf("(1) m=%i, n=%i, *p=%i et *q=%i\n",m,n,*p,*q); x = &q; 1

m = n+1; **x = 17; *p = **x; *p = *q; printf("(2) m=%i, n=%i, *p=%i, *q=%i et **x=%i\n",m,n,*p,*q,**x); Solution : le programme affiche (1) m=42, n=21, *p=42 et *q=42 (2) m=17, n=21, *p=17, *q=17 et **x=17 (2) Question 3. En C, nous avons vu deux manières de déclarer un tableau de taille 100 : - int T[100] ; - int *T = malloc(100*sizeof(int)) ;. Quelles sont les différences entre ces deux déclarations? Laquelle préférez-vous, et dans quelles circonstances? Solution : - La déclaration int T[100] permet de déclarer un tableau sur la pile. L accès à la pile est très rapide, mais la durée de vie du tableau est alors locale au bloc où il a été déclaré. (En particulier, on ne peut pas faire un return(t) si se tableau est déclaré dans une fonction.) On ne peut pas modifier la taille du tableau. - La déclaration int *T = malloc(100*sizeof(100)) permet de déclarer un tableau dans le tas. Un tel tableau a une durée de vie illimitée (jusqu à la fin du programme, ou jusqu à un free(p) ). On peut donc renvoyer la valeur de T si on est dans une fonction. De plus, il est possible de modifier la taille du tableau. (Le système devra peut-être changer le tableau d emplacement, mais c est le système qui gérera ça.) Par contre, l accès ou tas est un peu plus lent que l accès vers la pile. Partie 2 : complexité (3) Question 1. Parmi les affirmations suivantes, lesquelles sont vraies, et lesquelles sont fausses? (Justifiez brièvement vos réponses.) - n 3 + n 2 = O(n 3 ), - n 3 n 2 = Ω(n 3 ), - (n + 2) k+1 = O ( (n + 1) k+2) pour une constante entière k > 0, - log(n) = O ( log ( log(n) )), - n = Ω ( log(n) ), - sin( nπ 3 ) = O( ln(n) ). Solution : on rappelle que f = O(g) si f(n) g(n) est borné par une constante, et que f = Ω(g) si g = O(f). - Vrai : n3 +n 2 n = 1 + 1 3 n < 3. n - Vrai : 3 n 3 n = 1 + n2 2 n 3 n = 1 + 1 2 n 1 < 3 si n 2. - Vrai car (n + 2) k+1 est un polynôme de degré k + 1 et (n + 1) k+2 est un polynôme de degré k + 2. - Faux, car log(n) << n et donc log(log(n)) << log(n). - Vrai : car log(n) << n. - Vrai : car sin( nπ 3 ) 1. 2

Partie 3 : programmation Remarque : écrivez vos programmes le plus efficacement possible. (3) Question 1. Écrivez, dans une syntaxe aussi proche du C que possible, une fonction de prototype : cherche(int T[], int t, int e) ; Les arguments de cette fonction sont : - un tableau d entiers T, - la taille t de ce tableau, - un entier e. On suppose que le tableau est trié par ordre croissant, et la fonction devra renvoyer : - -1 si l entier e n apparaît pas dans le tableau T, - la valeur d un indice où l entier e apparaît dans T sinon. Estimez la complexité de votre fonction en fonction de la taille t. Solution : on va faire une recherche dichotomique : int cherche(int T[], int t, int e) int debut = 0; // le début du sous-tableau qui nous intéresse int fin = t; // la fin du sous-tableau qui nous intéresse int milieu; // le milieu du sous-tableau qui nous intéresse int indice = -1; // l indice de l élément que l on cherche // on regarde au milieu du tableau, et si on trouve l élément e, on~ // s arr^ete. // Sinon, on regarde dans la partie (droite ou gauche) pertinente. // On s arr^ete quand on obtient un tableau vide. while ((indice == -1) && (fin - debut) > 1) milieu = debut + (fin - debut) / 2; if (e == T[milieu]) indice = milieu; else if (e < T[milieu]) fin = milieu; else debut = milieu; return (indice); (À tester...) Comme on divise la taille du tableau par 2 à chaque étape, on fait au plus log t) étape, et la complexité est donc en O ( log(t) ). (3) Question 2. Le développement de la fonction sinus au voisinage de zéro est donné par : sin(x) = x x3 3! + x5 x2n+1... + ( 1)n 5! (2n + 1)! + o(x2n+1 ) Pour comparer les approximations obtenues, on souhaite écrire une fonction double devsinus(float x, int n); En n utilisant que les fonctions arithmétiques habituelles, expliquez comment vous programmeriez cette fonction. 3

Solution : Pour éviter de dupliquer les calculs, on garde les valeurs de (2n + 1)! et de ( 1) n x 2n+1 dans des variables tampon. double devsinus(float x, int n) double numerateur = (double)x; // la valeur de (-1)^n x^(2n+1) double X = (double)(-x * x); long int fact = 1; // la valeur de (2n+1)! int i; double resultat = x; for (i = 1; i < n + 1; i = i + 1) numerateur = numerateur * X; fact = fact * (2 * i) * (2 * i + 1); resultat = resultat + (numerateur / fact); return (resultat); La complexité de ce programme est O(n). (Tous les programmes que vous avez écrit étaient en O(n 2 )...) (4) Question 3. Le résidu d un nombre n en base b est la somme itérée de ses chiffres, quand il est écrit en base b. Par exemple, le résidu de 13762 en base 10 est 1 car - 1 + 3 + 7 + 6 + 2 = 19, - 1 + 9 = 10, - 1 + 0 = 1. Écrivez un petit programme complet (avec la fonction main), dans une syntaxe aussi proche du C que possible, qui demande un entier n et un entier b à l utilisateur ; et qui affiche le résidu de n en base b. N oubliez pas de commenter votre programme et de justifier ce que vous faites... Pouvez-vous estimer la complexité de votre programme en fonction de n et de b? Remarque : avec la bibliothèque math.h, vous pouvez utiliser toutes les fonctions mathématiques habituelles (exponentielle, logarithme, etc.) Solution : La solution la plus simple est la suivante : int residusimple(int n, int b) int residu = n % (b - 1); if (residu == 0) residu = b - 1; return (residu); (Si si, ça marche...) On peut faire une version assez simple en la remarque suivante : le résidu de 13762, c est la même chose que le résidu de 1376 + 2, càd, en base b, le résidu de n, c est la même chose que le résidu de n b + (n mod b). int residumoinssimple(int n, int b) int residu = n; while (residu >= b) residu = (residu / b) + (residu % b); 4

return (residu); Finalement, si on veut faire comme dans l énoncé, on commence par définir une fonction qui fait une étape du résidu en ajoutant tous les chiffre de n. Comme le chiffre de droite en base b est n mod b et que les chiffres de gauche (sans le chiffre de droite) forment le nombre s b, cette fonction peut s écrire : int residuuneetape(int n, int b) int residupartiel = 0; while (n > 0) residupartiel = residupartiel + (n % b); n = n / b; return (residupartiel); La fonction finale devient donc : int residuetapes(int n, int b) int residu = n; while (residu >= b) residu = residuuneetape(residu, b); return (residu); Voici un exemple de fonction principale pour tester tout ça : int main() int n, b; printf("entrez un nombre : \n "); scanf("%i", &n); printf("entrez une base : \n "); scanf("%i", &b); printf("calcul du résidu de %i en base %i :\n", n, b); printf(" - méthode simple : %i\n", residusimple(n, b)); printf(" - méthode moins simple : %i\n", residusimple(n, b)); printf(" - méthode par étapes : %i\n", residusimple(n, b)); return (0); 5