CSI 2531 Gestion de fichiers Hiver 2004

Computer Science University of Ottawa

Devoir à la maison #1 (100 points, poids 10%)

A rendre le lundi 9 février 2004 a 17:00  (par le biais de webCT)

1 Programme: Tri par clé (80 points)

 

1.1 Description du problème

 

On vous demande d’écrire un programme qui lit un fichier, trie les enregistrements, et écrit le résultat dans un autre fichier en utilisant C++ comme langage de référence. Le format de l’enregistrement du fichier en entrée est différent de celui en sortie.

Description de l’enregistrement du fichier en entrée:

Les enregistrements arrivent dans un ordre indéterminé. Chaque enregistrement a une longueur variable et se termine par 2 caractères indiquant la fin de la ligne. Les champs de l’enregistrement sont de longueur variable et sont séparés par le caractère |. La description des champs est la suivante:

  • Code cours                              (7 caractères)
  • Titre cours                                (Longueur variable >= 1)
  • Nombre de crédits                    (3 caractères)
  • Informations préalables             (Longueur variable >= 0)
  • Description cours                      (Longueur variable >= 1)

Le fichier en entrée devrait être lu comme un fichier binaire.

Description de l’enregistrement du fichier en sortie:

Le fichier en sortie aura les enregistrements tries par code cours. Chaque enregistrement a une longueur variable.

Les enregistrements sont presque identiques à ceux dans le fichier en sortie, excepté que les enregistrements en sortie ne contiennent pas les 2 caractères fin de ligne à la fin, et que les deux premiers octets de l’enregistrement consistent en un indicateur de longueur contenant le nombre d’octets dans l’enregistrement (non comptabilisé la longueur de l’indicateur lui-même.) Le fichier de sortie devrait être écrit en binaire.

Méthode de tri par clé:

Il est très important que vous suiviez la méthode de tri par clé décrite ici. Il est déconseillé d’utiliser une autre méthode. Le tri par clé est une méthode pour trier par une clé spécifiée. Il est utilisé dans des situations où la mémoire principale est insuffisante pour contenir tous les enregistrements du fichier, mais elle est assez large pour contenir toutes les clés du fichier. Nous travaillerons sous cette supposition.

Le tri par clé consiste en les étapes suivantes:

1. Lire le fichier en entrée, un enregistrement a la fois, stocker seulement les clés dans un tableau (code cours) et l’octet offset de l’enregistrement. (Notons: Votre tableau ne devrait pas contenir le contenu total de l’enregistrement, mais simplement la clé)

2. Trier le tableau en ordre croissant de la clé.

3. Utiliser les informations dans le tableau pour écrire séquentiellement les enregistrements du fichier en sortie dans l’ordre trié par clé. Notez qu’après le tableau est triée, vous aurez à balayer les positions du tableau dans l’ordre. Pour chaque position du tableau, vous avez besoin d’utiliser l’octet offset afin de positionner et lire l’enregistrement a partir du fichier d’entrée, et immédiatement écrire séquentiellement l’enregistrement dans le fichier de sortie avec le nouveau format. Notez que dans la première étape, une fois vous avez l’octet offset pour un enregistrement et pour un enregistrement précédent, vous pouvez calculer la longueur de l’enregistrement, laquelle sera nécessaire quand on écrira l’enregistrement de sortie dans l’étape 3. En C++, vous pouvez facilement obtenir la position du pointeur courent dans un fichier en utilisant la méthode tellg.

 


1.2 Les détails d’implémentation et les standards pour vos arguments de la ligne de commande de votre programme:

 

Le nom du fichier en entrée pour votre programme sera donné sur la ligne de commande. Ceci veut dire que votre programme est compilé et un fichier exécutable est crée, vous allez l’exécuter sur l’invite de DOS et spécifier quelques arguments lesquels représenteront les noms de fichiers à être utilisés dans votre programme. Les détails du comment accéder aux arguments de la ligne de commande dans votre programme seront expliqués dans un page séparée dans le web. Plus précisément, le mécanisme principal qui fait cela implique l’utilisation  des arguments suivants dans le programme principal: int main (int argc, char* argv[]) ...

 

Vous pouvez chercher dans l’Internet les informations sur l’utilisation des ces paramètres ou dans le livre C++.

 

Création et exécution de votre programme:

Les standards ci-dessous (noms de fichiers et chemin de l’exécution de votre programme) devraient être suivis scrupuleusement. Vous pouvez utiliser votre créativité dans le sens ou vous concevez votre classe et votre programme, mais le numéro, le nom de fichier et le chemin qui sont utilisés par l’assistant devrait suivre le standard.

 

Créer un projet et l’appeler tricle avec les classes et les fichiers suivants:

Tricle (fichiers: tricle.cpp, tricle.h)

Programme principal (fichier: main.cpp)

Le programme exécutable sera appelé tricle.exe par défaut.

Ce programme (tricle.exe) sera exécuté à l’invite de DOS ou l’utilisateur peut spécifier les arguments de la ligne de commande utilisant le format suivant:

tricle.exe <fichier en entrée> <fichier en sortie> ou tricle <fichier en entrée> <fichier en sortie>

ou <fichier en entrée> est le nom physique du fichier en entrée et <fichier en sortie> est nom physique du fichier en sortie.

 

Tester et vérifier vos fichiers en sortie:

Vous devez fournir deux fichiers en entrée pour tester votre programme: small.txt et courses.txt. Vous utiliserez un programme fourni par nous qui vérifie vos fichiers en sortie. Vous vérifierez parmi autres choses que le fichier de sortie est trié et qu’il bougera d’enregistrement en enregistrement via la longueur initiale de l’indicateur. Toutefois, vous devriez créer le fichier en sortie dans un format exact qui est spécifié dans le devoir. Quand le programme de vérification est disponible, il vous sera fourni dans le site webCT.

 

Documentation et style:

Votre programme doit être bien documenté et écrit en bon style. Une partie de la note sera réservée à la documentation et au style. Pour documenter votre programme, écrire les commentaires pour expliquer les actions des lignes suivantes. Pour chaque fonction ou méthode ajoutez une explication complète avant elle, l’expliquant et ce que ses paramètres représentent. Pour chaque classe crée, ajoutez une explication avant elle.

Quand et comment envoyer votre devoir:

Créer un répertoire nommé a1 contenant seulement ce qui suit: main.cpp, tricle.cpp, tricle.h et written.txt. Le fichier written.txt contient vos réponses aux questions écrites données dans la Section 2. Chaque fichier doit contenir une entête d’étudient: Nom, numéro étudient, Cours et Section. Compressez le répertoire et envoyez le fichier compressé au webCT (un seul fichier est envoyé.)

 

 

 


2 Partie écrite: Dispositif  de stockage secondaire (20 marks)

2.1 Disques (10 marks)

Étant donnée un disque système Western Digital Caviar AC22100 avec les caractéristiques suivantes:

Capacité: 2,100 MB

Temps de recherché moyen: 12 msec

Délai de rotation moyen: 6msec

Vitesse de transfert: 12 msec/piste

Octets par secteur: 512

Secteurs par piste: 63

Pistes par cylindre: 16

Cylindres: 4092

Supposez que vous voulez stocker un fichier avec 350,000 enregistrements de 80 octets.

1. Combien de cylindres sont nécessaires pour contenir le fichier étant donné qu’un enregistrement peut occuper plusieurs secteurs, pistes ou cylindres?

2. Combien de cylindres sont nécessaires pour contenir le fichier si un enregistrement ne peut pas occuper plus d’un secteur?

3. Supposez la situation en question 2, et supposez qu’il n’y a pas d’interférence provenant d’autres processus et que le fichier remplit complètement un cylindre avant de continuer sur un autre cylindre et que les cylindres demandés sont dispersés aléatoirement sur le disque. Combien de temps prendrait-on pour accéder au fichier entier en séquence?

4. Sous les mêmes suppositions que la question 3, combine de temps prendrait-on pour accéder au fichier entier aléatoirement (accession a chaque enregistrement, mais en ordre aléatoire)?

 

2.2 Bandes magnétiques (10 marks)

Supposez que vous voulez stocker un fichier avec 350,000 enregistrements de 80 octets de long sur une bande magnétique de densité 1600 octets par inch, un gap d’interblocage de 0.5 inch, et une longueur de bande de 2400 pieds.

1. Quel sont le minimum et le maximum du facteur de blocage qui est nécessaire pour utiliser exactement trois bandes magnétiques?

2. Quel est la densité d’enregistrement quand le facteur de blocage de 50 est utilisé?

3. La vitesse de la bande magnétique es 150 inch par seconde. Quel est la vitesse de transmission de cette configuration?