Vous êtes sur la page 1sur 6

DS Informatique 2e année

GM/GC
École Nationale d’Ingénieurs de Saint−Étienne
Algorithmie et programmation 2005-2006

1 Arithmétique des pointeurs 2 pts


Soit P un pointeur qui ’pointe’ sur un tableau A:
int A [ 9 ] = {12 , 2 3 , 3 4 , 4 5 , 5 6 , 6 7 , 7 8 , 8 9 , 9 0 } ;
int ∗P ;
P = A;

Quelles valeurs ou adresses fournissent ces expressions:


1. *P+2
2. *(P+2)
3. A+3
4. P+(*P-10)

1. *P+2 donne la valeur 14


2. *(P+2) donne la valeur 34
3. A+3 donne l’adresse de la composante A[3]
4. P+(*P-10) donne l’adresse de la composante A[2]
correction

2 Allocation dynamique 4 pts

✐2.1 dites ce qu’il se passe si on écrit, dans un bloc d’instructions :


{
double ∗p ;
p=m a l l o c (100∗ s i z e o f ( double ) ) ;
p[245]=4.3;
}

Le système d’exploitation risque d’arrêter le programme à l’exécution de la ligne où


l’on affecte la valeur 4.3 à la case 245 qui correspondant à zone non allouée.
correction

✐2.2 dans quelle zone mémoire se trouve la variable p ?

La pile.
correction

✐2.3 à quelle zone mémoire fait référence l’adresse contenue dans p ?

1
Le tas.
correction

✐2.4 on veut écrire une fonction permettant de calculer la somme de flottants. En supposant
qu’on écrive :
int main ( int argc , char ∗∗ argv )
{
double ∗p ;
double S ;
p=m a l l o c ( a t o i ( argv [ 1 ] ) ∗ s i z e o f ( double ) ) ;
S=somme tab ( p , . . . ) ;
}

Soit l’entête :
. . . somme tab ( double∗ tab , . . . ) ;

Complétez l’entête et écrivez la routine somme permettant de calculer la somme des flot-
tants se trouvant à l’adresse tab.
double somme tab ( double ∗ tab , int N)
{
/∗ V a r i a b l e s l o c a l e s ∗/
double somme=0;
int i ;
/∗ C a l c u l de l a somme ∗/
for ( i =0; i <N; i ++)
{
somme += tab [ i ] ;
}
return somme ;
}

correction

3 Arbres binaires de recherche 3 pts

✐3.1 Construisez un arbre binaire de recherche par adjonctions successives de feuilles pour la
suite de lettres suivantes :
E N I S E

E N

I S

correction

✐3.2 Quelle est la hauteur de cet arbre (cf. page 32 du polycopié pour la définition de la
hauteur) ?

2
La hauteur est de 2
correction

✐3.3 Construisez un arbre de recherche avec les mêmes lettres mais de hauteur maximale.

correction

✐3.4 À votre avis existe-t-il une méthode systématique pour trouver un arbre de hauteur
minimale ?
On classe les éléments par ordre croissant (ici EEINS), on prend la médiane comme
racine. Et on réitère de façon récursive pour les sous-arbres gauche et droit.
correction

✐3.5 En supposant que que le type arbre binaire de recherche soit :


typedef struct noeud {
struct noeud ∗ f g a u c h e ;
struct noeud ∗ f d r o i t ;
char v a l ;
} Tnoeud ;
typedef Tnoeud∗ Tarbre ;

Écrire l’entête d’une fonction calculant la hauteur d’un arbre.


int haute ur ( Tarbre A ) ;

correction

4 Algorithmie et structure de données 9 pts


On souhaite écrire un programme permettant de jouer au sudoku. On ne cherche ni à générer
des grilles ni à faire trouver une solution par le programme, mais on veut accompagner le joueur en
validant chacune de ses entrées.
Pour cela on va créer des routines et un type de données. Attention, dans le type à définir, on
ne veut pas mémoriser la solution finale, on ne veut que mémoriser les éléments de départ ainsi que
les « coups » joués par l’utilisateur.
✐4.1 Proposez un type Tsudoku permettant de mémoriser les informations nécessaires.

Type
Tsudoku = Tableau entier [9][9]

on initialisera les cases non encore jouées à -1 par exemple.


correction

3
✐4.2 En supposant qu’on identifie les 9 zones comme suit :
0 1 2
3 4 5
6 7 8
Donnez le schéma fonctionnel et l’entête de la routine zone renvoyant le numéro de la
zone d’une case donnée.

Routine zone(
D i,j:entier ):entier

correction

✐4.3 Donnez le schéma fonctionnel et l’entête de chacune des routines suivantes :


– verifier ligne : qui vérifie que pour une ligne ` donnée, la valeur V n’est pas déjà
présente sur la ligne `.
Routine verifier ligne(
D s:Tsudoku ;
D l:entier ;

D v:entier ):booléen

correction

– verifier colonne : qui vérifie que pour une colonne c donnée, la valeur V n’est pas
déjà présente sur la colonne c.
Routine verifier colonne(
D s:Tsudoku ;
D c:entier ;

D v:entier ):booléen

correction

– verifier zone : qui vérifie que pour une zone z donnée, la valeur V n’est pas déjà
présente sur la zone z.
Routine verifier zone(
D s:Tsudoku ;
D z:entier ;

D v:entier ):booléen

correction

✐4.4 Donnez le schéma fonctionnel et l’entête de la routine coup valide permettant de vérifier
si mettre la valeur V à une position donnée est autorisé.

Routine coup valide(


D s:Tsudoku ;
D i,j:entier ;

D v:entier ):booléen

correction

✐4.5 Donnez le schéma fonctionnel et l’entête de la routine jouer permettant de mémoriser


un coup s’il est valide.

Routine jouer(
T s:Tsudoku ;
D i,j:entier ;
D v:entier )

correction

On vous demande maintenant d’implémenter les routines suivantes :


✐4.6 La routine coup valide.

4
Début
verifier colonne(s,j,v) ET
Retourner verifier ligne(s,i,v) ET
verifier zone(s,zone(i,j),v)
Fin

correction

✐4.7 La routine jouer.

Si coup valide(s,i,j,v) Alors


s[i][j]←v
FinSi

correction

✐4.8 La routine zone. L’opérateur mod (reste de la division entière) ou l’opérateur div (division
entière) vous seront probablement utiles pour cette question.

Retourner (j div 3) + 3 × (i div 3)

Avec le shéma suivant :


j/3 0 1 2
i/3 0 1 2 3 4 5 6 7 8
0
0 1
2
3
1 4
5
6
2 7
8
correction

✐4.9 Une ébauche de l’algorithme permettant de jouer au sudoku.

5
Variable
jeu:Tsudoku
Début
charger une grille de départ
TantQue grille du jeu non décodée Faire
Afficher("veuillez saisir un nombre et une position")
saisir(nombre,i,j)
jouer(jeu,i,jnombre)
FinTantQue
Fin

Il reste bien sûr à définir une routine permettant de savoir si la grille a été « solutionnée
», et une routine pour charger une grille de départ...
correction

5 Complexité algorithmique 2 pts


On suppose qu’on dispose d’un algorithme de complexité O(N log2 N ) traitant 1000000 de données
en 0.5 secondes sur une machine donnée.
✐5.1 Calculez le temps que mettrait un algorithme résolvant le même problème avec une com-
plexité O(N 2 ), pour traiter les mêmes données.

Il y a un rapport entre les deux complexité de N/ log2 N . Le temps est dans le même
rapport, soit :
0.5 × 106 / log2 (106 ) = 25085.83
Soit environ 7 heures.
correction

Vous aimerez peut-être aussi