Vous êtes sur la page 1sur 11

É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. Répondez sur l’énoncé : les réponses fournies hors de la zone réservée pourront être
ignorées par le correcteur ;
2. Les questions sont de difficultés variés, lisez le sujet en entier avant de commencer ;
3. Les algorithmes sont à rédiger en français ou en anglais, et non pas en langage de
programmation.
4. Sauf mention explicite du contraire, on suppose que la numérotation des indices des
tableaux commence à 0 ;

1 / 10
É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
entier a,
t myType b,
t myType c,
Fin enregistrement

monAlgoPrincipal

variables
entier : a
t myType : t

début
t ← lire("input data.txt")
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 / 10
É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.
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

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

4 / 10
É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) :
/*
author : V. Tourre
file name : question3debug.cpp
*/

#include <cstdlib>
#include <fstream>

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

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

void main(void){

int a, b q;

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 / 10
É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éé une liste à partir d’un fichier, affiche cette liste et calcule
la somme de ces é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.

/* utils.h */

t_liste creerListe(string nomFichier);

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

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

8 / 10
É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.

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

10 / 10
Correspondance Algorithme & C++
S TRUCTURES DE DONNÉES

Types de données (simples) Types de données (composés)


booléen bool types
entier int Tableaux
réel float ou double t_VectEnt : vecteur d’entiers typedef int
caractère char t_VectEnt[MAX] ;
t_MatReels : matrice de réels typedef float
Données simples t_MatReels[MAX][MAX] ;
variables Enregistrements
entiers nb1, nb2, somme int nb1, nb2, somme ; t_Article : enregistrement # include<string>
réel moyenne float moyenne ; entier : référence using namespace std ;
Chaine_de_caractère : libellé struct t_Article {
constantes réel : prix int reference ;
réel PI const float PI=3.15 ; fin enregistrement string libelle ;
entier MAX const int MAX=10 ; float prix ;
caractère OUI const char OUI=’o’ ; };

Opérateurs Données composées


< ≤ 6= = ≥ > < <= != == >= > t_VectEnt vect t_VectEnt vect ;
et ou non && || ! t_MatReels matReels t_MatReels matReels ;
t_Article artCour t_Article artCour ;

S TRUCTURES ALGORITHMIQUES

Structures de choix
Instructions
Choix alternatif
Affectation
si nb1<nb2 alors if (nb1<nb2) {
Sx← sin(A + 3 ∗ x) Sx=sin(A+3*x) ;
écrire (nb2) cout<<nb2<<endl ;
matReels(nb1, nb2) ← 1 matReels[nb1][nb2]=1 ;
sinon } else {
artCour.reference← 123 artCour.reference=123 ;
écrire (nb1) cout<<nb1<<endl ;
Lecture/Ecriture
fin si }
#include <iostream>
using namespace std ;
Choix sélectif
nb1 ← lire ( ) cin>>nb1 ;
artCour ← lire ( ) cin>>artCour.reference choix selon : switch (var) {
>>artCour.libelle var = 1 : case 1 :
>>artCour.prix ; écrire (“positif”) cout<<“positif” ;
écrire (nb1, nb2) cout<<“nb1 :”<<nb1 break ;
<<“nb2 :”<<nb2 ; var = -1 : case -1 :
écrire (vect) for(i=0 ; i<MAX ; i++){ écrire (“négatif”) cout<<“négatif” ;
cout<<vect[i]<<endl ; break ;
} autre : default :
écrire (“nul”) cout<<“nul” ;
fin choix selon }
Commentaires
/* commentaire C
Structures répétitives
/ commentaire / sur plusieurs lignes*/
// commentaire C++
Tant que . . .Faire
Structure générale nb1 ← lire ( ) cin>>nb1 ;
tant que nb1>0 faire while (nb1>0) {
problème . . . /* Explications somme ← somme+nb1 somme=somme+nb1 ;
sur le programme */ nb1 ← lire ( ) cin>>nb1 ;
spécification . . . /* inclusions */ fin tant que }
#include <...>
types . . . typedef ...
constantes . . . const ... Pour . . .Faire
algorithme int main() { pour i ← 0 à MAX faire for (i=0 ;i<=MAX ;i=i+1){
somme ← somme+vect(i) somme=somme+vect[i] ;
début //début du programme
fin pour }
corps de l’algorithme //corps du programme
fin } //fin du programme

111