IUP2 - LSI

EXAMEN D'INFORMATIQUE

MARS 1994

Durée : 3h


Partie 1 : gestion de bibliothèque


A1) On désire faire un programme de gestion de bibliothèque pour l'IPST. Les livres sont codifiés en fonction de leur sujet, par rubriques (mécanique, électronique, informatique, automatisme, mathématiques, physique, gestion, économie...), chaque rubrique se décomposant en sous-rubriques, elles mêmes pouvant se décomposer... On suppose que chaque décomposition se fait en 2 à 20 sous-rubriques, et qu'il n'y a jamais plus de 6 niveaux de décomposition (mais il peut y en avoir moins, le nombre de niveaux sous chaque rubrique peut être différent). Dans chaque rubrique (même si elle possède des sous-rubriques), on peut stocker des ouvrages : titre (80 caractères maxi), auteur (40 caractères maxi), résumé (maxi 10 lignes de 80 caractères, mais souvent moins).

Comment peut-on stocker ces informations pour une utilisation optimale ? Vous proposerez plusieurs solutions, en précisant leurs avantages et inconvénients dans différents cas (nombre de livres, nombre de rubriques...). Envisagez également le traitement que l'on pourra faire de ces données (recherche d'un livre, d'un auteur, ajout d'une rubrique...).

C1) On suppose déclarer :

typedef struct sentite{
	int code_rubr;
	char nom_rubr[20];
	struct sentite * fils[20];
	struct sfeuille * livre;
		}entite;
typedef struct sfeuille {
	char titre[];
	char auteur[];
	char resume[];
	struct sfeuille *suiv;
		}feuille;

Expliquez, à partir d'un petit exemple de votre choix, comment serait stocké un arbre avec ces déclarations (petits schémas conseillés).

Avec cette structure de données, en supposant un arbre déjà saisi en mémoire et accessible par une variable racine de type entite*, écrire une fonction récursive qui permette d'afficher tous les ouvrages d'un auteur donné. La saisie du nom de l'auteur est également à prévoir.


Partie 2 : calcul matriciel


On désire faire une bibliothèque d'utilitaires pour le calcul matriciel (tableaux à 2 dimensions).

A2) On se limite pour cette question aux matrices carrées. Le déterminant d'une matrice peut se calculer de la manière suivante :

           N
    DETn = Sigma (-1)i+1.M[i,1].DETn-1
          i=1

c'est à dire : le déterminant d'une matrice carrée M (N,N) vaut la somme (sur chaque ligne) de l'élément de la ligne en 1ère colonne par le déterminant de la sous-matrice obtenue en enlevant la ligne et la 1ère colonne (en changeant le signe à chaque fois). Le déterminant d'une matrice (1,1) est son seul élément. Il existe (heureusement) d'autres méthodes plus rapides.

Ecrire l'algorithme permettant d'implanter au mieux cette méthode. On n'oubliera pas de bien préciser, entre autre, la détermination de la sous-matrice d'ordre (n-1). Cherchez également à ne pas utiliser de calcul de puissance pour le calcul du signe.

C3) Le type matrice est déclaré de la manière suivante :

#define MAX 10
typedef struct {
	int nblig;
	int nbcol;
	float comp[MAX][MAX];
		}matrice;

Les matrices ne sont pas nécessairement carrées. Ecrire en C les fonction suivantes : (les allocations en mémoire sont supposées faites avant l'appel de ces fonctions, et ne doivent pas être traitées ici)

void saisie (matrice *m) : saisie du nombre de lignes et de colonnes puis des composantes.

void addition (matrice *m1, matrice *m2, matrice *m3) : fait la somme des deux matrices m1+m2, résultat dans m3 (dont le contenu initial est perdu). On vérifiera que m1->nblig vaut m2->nblig, de même pour les colonnes.

void multiplication (matrice *m1, matrice *m2, matrice *m3) : fait le produit des deux matrices m1*m2, résultat dans m3 (dont le contenu initial est perdu). On vérifiera que m2->nblig vaut m1->nbcol.

 

Remarques :


voir les pistes de solutions

retour au sommaire des sujets d'examens


P. TRAU, ULP-IPST, 10/10/97