Vous êtes sur la page 1sur 9

École Centrale de Nantes EI1 – 2013 / 2014

Algorithmique et Programmation

Devoir Surveillé, Algorithmique et Programmation

18 novembre 2013, de 8h à 10h


(+30 min pour les étudiants étrangers – amphi A)

Aucun Document Autorisé


la fiche de traduction est disponible en dernière page du sujet

Nom : Prénom : Groupe : Note :

1. Certains étudiants ont écrit dans les marges, au dos des feuilles ou sur une copie séparée
(surtout des étudiants étrangers). Dans un souci d’équité on considère que toutes les
réponses sont à prendre en compte, même si elles sont données en dehors des cases
prévues à cet effet ;
2. Les algorithmes sont à rédiger en français ou en anglais, en revanche la rédaction
d’algorithme en langage C sera (légèrement) pénalisée.
3. Pour les exercices d’écriture d’algorithme ou d’analyse descendante, les solutions in-
diquées ne sont que des exemples de correction. Une solution est toujours comptée
juste si elle répond à la question.

1/9
École Centrale de Nantes EI1 – 2013 / 2014

1 Algorithmes
1.1 Analyse d’algorithme (3 points)
Question 1 : Que représente le type de données ? Que fait cet algorithme principal, ainsi que la fonction qu’il utilise ?

types
t myType : Enregistrement Structure de données (0,5 point maximum)
entier a – c’est un arbre : 0,25 point
t myType b – c’est un arbre binaire : 0,5 point
t myType c
Fin enregistrement Algorithme principal (1 point au maximum)
– Il lit dans un fichier les valeurs d’un arbre binaire (0,5 point),
– Il appelle la fonction myFunction pour traiter l’arbre (0,5 point),
– Il affiche le résultat à l’écran (0,5 point),
– Exemple d’exécution (0,5 point).

monAlgoPrincipal Fonction (1,5 point au maximum)


– C’est un algorithme récursif (0,5 pt)
variables – C’est un algorithme d’affichage infixe des valeurs de l’arbre / il affiche à
entier : a l’écran les valeurs dans l’ordre infixe (0,5 pt)
t myType : t
– C’est un algorithme de calcul du maximum d’un arbre / il retourne le
maximum de l’arbre (0,5 pt)
début
t ← lire("input data.txt") – Exemple d’exécution : (0,5 point).
a ← myFunction(t)
écrire("la valeur est " + a)
fin

fonction myFunction : r ← myFunction(u)


entrées
t myType : u
sorties
entier : r

début
r ← u.a
si (u.b 6= RIEN) alors
r ← max(r, myFunction(u.b))
finsi
écrire(u.a + " :")
si (u.c 6= RIEN) alors
r ← max(r, myFunction(u.c))
finsi
retourner r
fin

2/9
École Centrale de Nantes EI1 – 2013 / 2014

1.2 Écriture d’algorithmes (4 points)


Question 2 : Écrivez un algorithme qui permet de traiter une file de caractères alphanumériques sur le modèle (caractère,
chiffre, caractère, chiffre, ... caractère, chiffre) terminée par un point. Le premier traitement transforme la file en
écrivant un nombre de caractère égal au chiffre qui suit, et supprime le chiffre. Le deuxième traitement demande un
motif à l’utilisateur, et fait une recherche du nombre de motif présent dans la file. Vous ne pouvez pas stocker toute
la file d’entrée en mémoire (dans un tableau ou dans un fichier), mais vous pouvez stocker le motif et le résultat du
premier traitement.
– Traitement 1 : 2 points
traitement de file : (2 fonctionnel, 1,5 petites erreurs, 1 beaucoup de petites erreurs ou une grosse, 0,5 beaucoup de
grosses erreurs, 0 pas compris et/ou très grosses erreurs)

– Traitement 2 : 2 points
recherche de motif : (2 fonctionnel, 1,5 petites erreurs, 1 beaucoup de petites erreurs ou une grosse, 0,5 beaucoup
de grosses erreurs, 0 pas compris et/ou très grosses erreurs)

3/9
École Centrale de Nantes EI1 – 2013 / 2014

exemple :
file d’entrée : a 1 b 2 c 0 a 1 b 1 d 0 b 1 a 1 b 2 e 0 a 1 .
résultat du premier traitement : a b b a b b a b b a .
motif entré par l’utilisateur : a b b a
résultat du deuxième traitement : 3

monAlgoPrincipal

variables
entier : mark, mark2
caractère : ccour
caractère : toRepeat
t tabChar : res1
t tabChar : motif
entier : nbMotif

début
mark ← 0
ccour ← lire()
// 1st process
tant que (ccour 6= ’.’) faire
si (ccour ∈ [A-Za-z])alors
toRepeat ← ccour
sinon
// ccour ∈ [0-9]
nbRepeat ← convertToInt(ccour)
pour i de 0 à nbRepeat-1 faire
écrire(toRepeat)
res1[i+mark] ← toRepeat
fin pour
mark ← mark + nbRepeat
finsi
ccour ← lire()
fintantque
res1[mark] ← ’.’
ecrire(res1)
// 2nd process
motif ← lire()
mark ← 0
pour mark de 0 à taille(res1)-2
mark2 ← taille(motif)
tant que (mark + mark2 - taille(motif) ≥ 0 ET mark2 ≥ 0
ET motif[mark2] = res1[mark+mark2-taille(motif)]) faire
mark2 ← mark2 - 1
fintantque
si (mark2 < 0) alors
nbMotif ← nbMotif + 1
finsi
fintantque
ecrire("la valeur est " + nbMotif)
fin

4/9
École Centrale de Nantes EI1 – 2013 / 2014

2 Programmation
2.1 Analyse de code C++ (4 points)
Question 3 : Déboguez le code suivant (rayez les erreurs et corrigez directement dans le code) :
On compte +0,5 point par faute trouvée (max 4 points), et pas de malus par faute ajoutée.
/*
author : V. Tourre
file name : question3debug.cpp
*/

#include <cstdlib>
#include <iostream>

using namespace std;

void division(int a, int b, int& c, int* d){

c = a/b;
*d = a%b;

int main(void){

int a, b, q, r;

cout << "Entrer le nombre à diviser" << endl;


cin >> a;
while(a < 0) {
cout << "Le nombre doit ^etre positif ou nul" << endl;
cin >> a;
}

cout << "Entrer le diviseur" << endl;


cin >> b;
while(b < 1) {
cout << "Le nombre doit ^
etre positif" << endl;
cin >> b;
}

division(a, b, q, &r);

cout << "le résultat de la division est " << q << endl
<< "le reste de la division est "<< r << endl;

return (EXIT_SUCCESS);
}

5/9
École Centrale de Nantes EI1 – 2013 / 2014

2.2 Écriture de code C++ (6 points)


Question 4 : Écrivez en C++ :
– la définition d’une liste d’entier simplement chainée t liste dans un fichier typedef.h,
– une fonction d’affichage d’une liste et une fonction de somme des éléments d’une liste dans un fichier fonctions.cpp
ainsi que la déclaration de ces fonctions dans un fichier fonctions.h associé,
– un programme principal dans un fichier main.cpp qui crée une liste à partir d’un fichier, affiche cette liste et calcule
la somme de ses éléments.
La déclaration de la fonction creerListe pour créer une liste à partir d’un fichier est fournie dans un fichier utils.h.
Vous ne devez pas écrire la fonction creerListe, vous devez l’utilisez dans votre fonction principale.
– typedef.h : 1 point
structure de liste avec un entier

– fonctions.cpp : 3 points
1 point par fonction correcte, 1 point pour les inclusions

– fonctions.h : 0,5 point


déclaration des fonctions correctes

– main.cpp : 1,5 points


1 point pour le main, 0,5 pour les inclusions

6/9
École Centrale de Nantes EI1 – 2013 / 2014

/* utils.h */

t_liste creerListe(string nomFichier);

/* typedef.h */
struct t_liste {
int value;
t_liste* next;
};

/* fonctions.cpp */

#include <iostream>
#include "typedef.h"

using namespace std;

/* possible aussi avec un pointeur sur une liste en paramétre */


void affiche(t_liste l) {

cout << l.value << ":";

if (l.next != NULL) {
affiche(*(l.next));
}
}

/* possible aussi avec un pointeur sur une liste en paramétre */


int somme(t_liste l) {

int res = 0;

if(l.next != NULL) {
res = somme(*(l.next));
}

return l.value + res;


}

/* fonctions.h */

void affiche(t_liste l);


int somme(t_liste l);

7/9
École Centrale de Nantes EI1 – 2013 / 2014

/* main.cpp */

#include <iostream>
#include <string>
using namespace std;

#include "typedef.h"
#include "utils.h"
#include "fonctions.h"

int main(){

t_liste l;
int total = 0;

l = creerListe("data.txt");

affiche(l);
cout << endl;

total = somme(l);
cout << "somme : " << total << endl;

return 0;
}

8/9
École Centrale de Nantes EI1 – 2013 / 2014

3 Analyse descendante (3 points)


Proposez un programme pour trier une liste de mots par ordre alphabétique. Le programme permettra de charger un
ensemble de mots depuis un fichier, de trier les mots avec l’algorithme de votre choix et de stocker le résultat dans un fichier
texte.
Question 5 : Faire l’analyse descendante de ce problème : les structures de données, l’algorithme principal (forme libre
autorisée), les spécifications des fonctions secondaires pertinentes, et l’algorithme de la fonction de tri.
– Structure de données : 0,5 point

– Algorithme principal : 0,5 point (rappel : l’algorithme doit être compréhensible, il n’est pas obligatoirement écrit avec
le formalisme du polycopié)

– Spécifications fonctions secondaires : 1 point

– Algo de tri : 1 point


Structure de donnée :
mot : chaine de caractère / string
liste de mot : liste chainée de mots / tableau de mots

Algorithme principal :

variables : tabMot : tableau de Mot

– tabMot ← chargeListe(nomfichier)
– tabMot ← triListeMot(tabMot)
– stockeMot(tabMot)

Fonctions :
chargeListe :
tabMot ← chargeListe(nomfichier)
entrée : chaine de caractère : nomFichier
sortie : tableau de mot : tabMot

triListeMot
tabMot ← triListeMot(tabMot)
entrée : tableau de mot : tabMot
sortie : tableau de mot : tabMot

stockeMot
stockeMot(tabMot)
entrée : tableau de mot : tabMot
sortie : rien

Pour le tri, toutes les méthodes de tris sont autorisées, celles vues en cours et les autres.

9/9