Você está na página 1de 3

UNIVERSITE LIBRE DE BRUXELLES

Faculté des Sciences


INFO-F-101  Programmation
Septembre 2007

Remarques préliminaires
 On vous demande de répondre à chaque question sur des feuilles séparées (les correcteurs
sont diérents).
 N'oubliez pas d'inscrire vos nom et prénom sur chacune des feuilles.
 Vous disposez de quatre heures.
 Vous ne pouvez pas utiliser de notes.
 Toutes les réponses doivent être dûment justiées. Une réponse non argumentée, même
correcte, ne vous donnera pas droit au maximum des points.

Question 1
(Dans cette question, on ignorera les problèmes de précision des calculs en virgule ottante.)
1. Que renvoie la fonction calcul ci-dessous ?
2. Donner, en français, puis sous forme d'une formule logique, l'invariant de la boucle for.

double calcul (double V[], int n) {


double resultat = 0;
for (int i = 0; i < n; ++i)
resultat = resultat * i / (i+1) + V[i] / (i+1);
return resultat;
}

Question 2
1. Expliquer le but et le fonctionnement de la procédure count décrite ci-dessous. On suppose que
le vecteur v passé en paramètre ne contient que des entiers compris entre 0 et M-1.
2. Donner, en termes des quantités n et M, la complexité de chacune des trois boucles for. En
déduire la complexité de la fonction.
3. Pour quelles valeurs de M cette procédure est-elle "ecace" ? Expliquer.

#define M 10

void count (int v[], int n)


{
int i, j, c[M];
for (i = 0; i < M; ++i) c[i] = 0;
for (i = 0; i < n; ++i) c[v[i]]++;
for (i = 0, j = 0; i < M; )
if (c[i] == 0)
i++;
else {
c[i]--;
v[j] = i;
j++;
}
}

Question 3
An de trier les lettres transitant par une centre de tri postal (en Belgique), il est commode de procéder
de la façon suivante. On utilise 10 paniers qui reçoivent les lettres en fonction de leur code postal.
Toutes les lettres dont le code postal est compris entre 1000 et 1999 vont dans le panier 1, car elles
sont destinées à la Région de Bruxelles ; toutes celles dont le code postal est compris entre 2000 et
2999 vont dans le panier 2, qui correspond à la région anversoise, etc. Cette première sélection permet
de  dégrossir  le tri du courrier, car chaque panier pourra ensuite être trié de façon indépendante
des autres.
Sur base de cette idée, on peut proposer une méthode permettant de trier une liste d'entiers
compris entre 1 et N (où N est une constante globale connue). Chaque entier peut être assimilé à une
lettre. Pour xer les idées, considérons la liste L suivante, pour N = 14.

9 11 3 2 7 4

On xe ensuite une constante K (supposée globale et connue), qui correspond, dans notre exemple
ci-dessus, au nombre de paniers.
Le tri consistera donc à créer K listes dans lesquelles on insère les éléments de la liste L les uns après
les autres, en fonction de la valeur de leur champ info : les éléments dont l'information est comprise
entre 1 et bN/Kc iront dans la première liste, ceux dont l'information est entre bN/Kc + 1 et 2 × bN/Kc
iront dans la seconde liste, et ainsi de suite (où bc est la fonction plancher). Les têtes de ces K listes
seront stockées dans un tableau elem * T[K] (la tête de la ie liste dans T[i]). Sur notre exemple, et
pour K = 3, on obtient :

T
3 2 4

9 7

11

Ensuite, on trie chaque liste de T à l'aide d'une procédure standard. Finalement, on obtient la
liste L triée en assemblant les K listes du tableau T, de telle manière que les éléments de la liste T[1]
apparaissent d'abord, puis ceux de T[2], T[3], etc.

2
On vous demande d'écrire void TriPostal(elem * L), qui réalise le tri décrit ci-dessus sur la
liste L. Vous trierez les listes du tableau T à l'aide du tri par insertion dont le code doit être fourni lui
aussi.

Question 4
Une grille S de sudoku généralisé est une matrice carrée de dimensions n qui peut être décomposée en n
sous-matrices rectangulaires de n éléments chacune, toutes des mêmes dimensions et sans intersection
entre elles. Dans chacune des sous-matrices, ainsi que dans chaque ligne et chaque colonne de S , chaque
nombre de 1 à n ne doit apparaître qu'une seule fois.
Voici quelques exemples de grilles de sudoku généralisé :
1 2 3 4 5 6
1 2 3 4 4 5 6 1 2 3
1 2 3 4 1 2 2 3 1 6 4 5
2 1 2 1 4 3 5 6 4 3 1 2
4 3 2 1 3 1 2 5 6 4
6 4 5 2 3 1
Nous vous demandons de réaliser une fonction bool isGeneralizedSudoku(int A[][],int n ),
qui teste si la matrice A, de dimension n × n, qui lui est passée en paramètre est une grille de sudoku
généralisé.

Question 5
On vous demande d'écrire une fonction swap(liste phrase, int pos_mot1, int pos_mot2) qui
va échanger la place de deux mots dans une phrase. La phrase est codée par une liste simplement liée
dont le champ info de chaque élément est un caractère. Ce dernier peut être soit une lettre majuscule,
soit une lettre minuscule, soit un espace. Chaque mot de cette phrase suit un espace sauf le premier
qui commence par une majuscule.
Exemple Si on appelle la fonction swap(phrase, 2,4) sur la liste simple dont le contenu forme
la phrase suivante :
Il lit un programme
on obtient le résultat suivant :
Il programme un lit
Notez que si le premier mot a été échangé, il ne doit plus commencer par une majuscule, par
contre, celui qui le remplace en tête de phrase devra commencer par une majuscule.
Pour programmer cette fonction, nous utilisons la déclaration suivante :
class Elem {
public:
char info;
Elem* next;

Elem(char i, Elem* nx) {


info = i;
next = nx;
}
};

typedef Elem* liste;

Você também pode gostar