• Aucun résultat trouvé

IUT d'orsay Année scolaire Département Informatique Formation Initiale 1 ère Année. Programmation C++ Devoir surveillé N 1, Janvier 2003

N/A
N/A
Protected

Academic year: 2022

Partager "IUT d'orsay Année scolaire Département Informatique Formation Initiale 1 ère Année. Programmation C++ Devoir surveillé N 1, Janvier 2003"

Copied!
5
0
0

Texte intégral

(1)

IUT d'Orsay Année scolaire 2002-2003 Département Informatique

Formation Initiale 1ère Année

Programmation C++

Devoir surveillé N°1, Janvier 2003

Durée 1h30.

Tous documents autorisés.

Enseignants responsables de l'épreuve: Y. Manoussakis et H. Maynard Attention: L’exercice 1 est à rendre sur l’annexe 1

Exercice 1

(environ 4 points)

Les programmes donnés en Annexe 2 comportent éventuellement des erreurs. Certains vont échouer à la compilation, d’autres provoquer des comportements erronés à l’exécution. Pour chaque extrait de programme vous devez indiquer en 2ème colonne :

• S’il est correct,

• les instructions erronées, et les erreurs de compilation ou d’exécution qu’elles provoquent,

• les corrections à effectuer pour que l’extrait de programme soit correct.

Exercice 2

(environ 4 points)

On considère dans cet exercice la classe Losange donnée en Annexe 1, un losange étant défini par la longueur de son coté et l’angle le plus petit.

1. Compléter les parties manquantes dans le fichier losange.h,

2. Donner la définition du constructeur dans losange.C. Pour construire un objet sans problèmes, dans le corps du constructeur utiliser la valeur absolue de c pour la longueur d’un coté et a modulo 360 pour l’angle.

3. Donner la définition de la fonction membre verifCarre dans losange.C.

4. Quelques erreurs sont glissées volontairement dans le main(). Lesquelles ?

(2)

Exercice 3 Adressage dispersé

(environ 12 points)

NB : les questions 1, 2, 3, 4, 5, 6 sont indépendantes les unes des autres. Pour la question 7, si vous n’avez pas réussi à écrire les fonctions précédentes, vous pouvez vous contenter d’ en donner le prototype.

Introduction : rechercher un élément dans un tableau est une opération fréquente qui peut être très couteuse si le tableau est grand. Une technique de programmation classique appelée « adressage dispersé » permet, quand le cas s’y prête, de retrouver directement l’emplacement (l’indice) d’un élément dans un tableau en fonction de la valeur de cet élément. La fonction qui permet de trouver l’indice d’un élément à partir de sa valeur est appelée fonction de hachage. Une bonne fonction de hachage est une fonction qui provoquera peu de collisions (cas où deux éléments différents ont les memes indices). Les collisions, inévitables cependant, sont gérées par exemple en introduisant un tableau supplémentaire, de taille beaucoup plus petite que le premier, appelé « tableau des collisions ».

On désire écrire un programme permettant de mémoriser des chaînes de caractères selon la technique de l’adressage dispersé. On utilisera donc deux tableaux de chaînes.

Le premier tableau, celui dans lequel on va pouvoir accéder directement à un élément à partir de sa valeur, de grande taille (tailleP), est appelé tabPrinc. Le second tableau, de taille en beaucoup plus petite (tailleC), est appelé tabCol. Lors de l’ajout, de la recherche, ou de la suppression d’une chaîne, son emplacement (son indice) dans le tableau principal, est donné par la valeur de la fonction de hachage pour la chaîne (appelée clé). Le tableau principal pourra donc comporter des « trous » (cases inoccupées). En cas de collision (tentative de mettre une chaîne dans une case i du tableau principal déjà occupée par une chaîne de même clé), les chaînes sont mises séquentiellement dans le tableau des collisions (1ère chaîne, 1ère case, 2ème chaîne, 2ème case, et ainsi de suite).

La clé de hachage utilisée dans cet exercice est un entier calculé en faisant la somme des codes ASCII des caractères qui composent la chaîne, modulo la taille du tableau principal ( tailleP)(voir exemple question 5).

Exemple avec tabPrinc qui contient 10 cases, et tabCol qui contient 6 cases : - on ajoute "toto". Valeur de la clé : 4. "toto" est alors placé dans la case

numéro 4 du tableau principal.

- on ajoute "titi " . Valeur de la clé : 6. "titi " est alors placé dans la case numéro 6 du tableau principal.

- on ajoute "otot ". Valeur de la clé :4. La case 4 du tableau tabPrinc étant déjà occupée, "otot " est placé dans la 1ère case libre (i.e. la case avec indice 0) du tableau des collisions.

- on ajoute "tiit ". Valeur de la clé :6. La case 6 du tableau tabPrinc étant déjà occupée, « tiit » est placé dans la première case libre (i.e. la case avec indice 1) du tableau des collisions.

tabPrinc:

TOTO TITI

tabCol :

OTOT TIIT

(3)

1. Ecrire une fonction vide qui renvoie vrai si une chaîne est vide.

2. Ecrire une procédure enMaj qui convertit une chaîne en majuscules.

3. Ecrire une procédure init qui initialise un tableau de chaînes avec des chaînes vides.

4. Ecrire une procédure affiche qui, pour chaque chaîne non vide d'un tableau de chaînes passé en paramètre, affiche l'indice de la chaîne et son contenu.

5. Ecrire une fonction clé, qui prend une chaîne de caractère et qui retourne un entier égal à la somme des codes ASCII des caractères qui composent la chaîne, modulo un entier passé également en paramètre.

Exemple :

clé("toto",10) retourne 4, parce que (116+ 111 +116+111)%10=4

6. Ecrire une procédure ajoute qui ajoute une chaîne dans le tableau qui convient (tableau principal ou tableau des collisions).

7. Ecrire un programme complet qui effectue l'ajout d'une série de chaînes dans les tableaux jusqu'à ce que l'utilisateur rentre une chaîne vide. A la fin le programme devra afficher le contenu des deux tables.

NB : toutes les chaînes sont converties en majuscules avant d’être insérées dans les tableaux.

8. Ecrire une fonction recherche qui, pour une chaîne donnée, retourne un entier qui contiendra selon les cas les valeurs suivantes :

- 0 si la chaîne n'est présente dans aucun des tableaux, - une valeur positive si la chaîne est dans la table principale, - une valeur négative si la chaîne est dans la table des collisions.

(4)

ANNEXE 1

Nom : Prenom : Groupe :

Programmes Vos reponses

/*on suppose que dans la mémoire, Tab est tout de suite après i */

int Tab[8]={-2, 5, 11, -5, 0, 3, 1, 8};

int i;

/*Décaler cycliquement les éléments d’une position vers la gauche */

for (i=0; i<7; i++) Tab[i-1]=Tab[i];

Tab[6]=-2;

include<iostream.h>

void échanger(char &, char &) ; main (){

échanger(‘c’,’A’) ; }

void échanger(char &c1, char &c2) {

char aux ; cout<<c1<<c2 ;

aux=c1 ; c1=c2 ; c2=aux ; cout<<c1<<c2 ;

}

…………..

int x, y ;

//boucle pour saisir deux nombres non nuls do

{

cout<< "Donner deux nombres non nuls svp : ";

cin >>x ; cin>>y ; }

while ( !x || ! y);

(5)

ANNEXE 2

Le fichier losange.h

#ifndef LOSANGE

#define LOSANGE class Losange { private :

int cote; // la longueur d’un coté

int angle; // l’angle donné en degrés: 90, 45 etc.

public :

Losange(int=0, int=0) ; // le constructeur int perimetre () const ; //calcule le périmètre

int verifCarre() const ; //vérifie si le losange est un carré

……….

}

#endif

Le fichier losange.C

#include <iostream.h>

#include "losange.h"

Losange::Losange(int c, int a) { ………}

void Losange::afficher() const{

cout<< "Voici la longueur de la cote : "<< cote <<endl;

cout<< "Voici l’angle : " <<angle<<endl;

}

double Losange::périmètre () const{

return 4*cote;

}

void Losange::doubler() { cote*=2;}

int Losange::verifCarre() const{

{ …………};

Le fichier prog.C

#include <iostream.h>

#include "losange.h"

void main(){

int x,y ; Losange lg1 ;

lg1.cote=3 ; lg1.angle=45;

lg1.afficher();

cin>>x ;//saisir la cote cin>>y ;//saisir l’angle Losange lg(x,y) ;

lg.afficher() ; lg.doubler() ;

cout<<"La nouvelle cote deux fois plus large: " << lg.cote ; if (lg.verifCarre ()) cout<<”Il s’agit bien un carré”<<endl ; }

Références

Documents relatifs

7- Définir une requête SQL qui trouve le montant total (facture) à payer pour les commandes de chaque client.. On voudrait maintenant créer une table FACTURE qui stocke les

(a) Écrire une fonction Est_ancetre qui prend en entrée deux espèces et qui renvoie True si la première espèce est ancêtre de la seconde, et False sinon.. (b) Écrire une

Écrire une fonction bienPlace(chaine1,chaine2) qui prend en paramètres deux chaînes de caractères et renvoie le nombre de caractères situés à la même position dans chaine1

Ÿ Si cette résiliation intervient après le début de la scolarité, le montant de la scolarité est calculé prorata temporis de la durée effective du contrat sur la base des frais

Écrivez le code C d’un programme index qui affiche sur sa sortie standard, en mode texte, l’ensemble des positions (offset) auxquelles se trouvent les instances d’un certain

Tous les commentaires ayant malencontreusement été effacés, il vous faut partir de zéro pour comprendre ce que fait ce programme, en répondant aux questions ci-dessous..

Tous les commentaires ayant malen- contreusement été effacés, il vous faut partir de zéro pour comprendre ce que fait ce programme, en répondant aux questions ci-dessous?. Attention

L’aluminium est le métal le plus utilisé après le fer ,dans plusieurs domaines ( cuisine – emballage –industrie ….). Le symbole chimique d’atome d’aluminium (Al ). 2-1)