R1.01 – Prog#7 – Exercice 4

Dans la pratique, il est indispensable de vérifier qu’un fichier a bien été associé à un flux et ouvert avant de tenter d’y lire ou d’y écrire.

Ecrire la fonction validFichier() qui :

  1. saisit au clavier le nom du fichier source (un string). Placer cette saisie dans une boucle, jusqu’à ce que l’ouverture en lecture soit valide ou que trois essais infructueux aient été tentés.
  2. En cas d’erreurs répétées, terminer le programme après avoir affiché dans le flux de sortie standard le message suivant :

    3 echecs d'ouverture de fichier en lecture

  3. saisit au clavier le nom du fichier destination, en effectuant la même validation d’ouverture en écriture que sur le fichier source, et en affichant éventuellement le message :

    3 echecs d'ouverture de fichier en ecriture

  4. dans une boucle, lit le fichier source ligne par ligne et le recopie dans le fichier destination.

Remarque : pour pouvoir tester la validation du fichier destination, vous devez créer le fichier et le protéger en écriture avant de lancer le programme.

R1.01 – Prog#7 – Exercice 5

Il est possible de ne considérer les flux que comme des suites de caractères quelconques, sans distinction entre les caractères éditables ou non, et les caractères d’espacement.

La fonction get(), membre de la classe ifstream, que nous vous proposons d’utiliser ici, extrait et renvoie le prochain caractère du flux quel qu’il soit (la classe ifstream propose trois autres versions de cette fonction, que nous vous laissons découvrir).

Ecrire la fonction fonctionGet() qui, dans une boucle, lit un fichier (dont le nom est saisi au clavier) caractère par caractère et l’affiche à l’écran. La boucle se termine à la rencontre du caractère “fin du fichier”.

R1.01 – Prog#7 – Exercice 6

Dans un fichier texte (= dans un flux), un mot est une suite de caractères sans caractère d’espacement (espace, tabulation, passage à la ligne suivante ‘\n’).

Ecrire la fonction ExtractionsMots() qui, dans une boucle, extrait (opérateur >>) au clavier (ou sur un fichier redirigé sur l’entrée standard cin) tous les mots et les affiche à l’écran à raison d’un par ligne. La boucle se termine lorsque l’extraction échoue (fail()).

Faire plusieurs essais, en saisissant un mot par ligne, plusieurs mots sur la même ligne, en utilisant les tabulations, en saisissant des lignes vierges ou seulement composées de caractères d’espacement.

Vous devez constater que :

  1. n’importe quel caractère (sauf espacement) peut être considéré comme un mot (un ‘.’ seul par exemple),
  2. tous les caractères d’espacement avant un mot sont ignorés,
  3. la seule façon de terminer le programme est de taper le caractère “fin-de-fichier” (Ctrl+D). La condition d’arrêt peut donc aussi utiliser le prédicat eof()

R1.01 – Prog#7 – Exercice 7

Ecrire la fonction extractionsCars() qui, dans une boucle, extrait (opérateur >>) au clavier (ou sur un fichier redirigé sur l’entrée standard cin) tous les caractères et les affiche à l’écran à raison d’un par ligne. La boucle se termine lorsque l’extraction échoue (fail()).

Faire plusieurs essais, en saisissant un ou plusieurs caractères par ligne, séparés ou non par des caractères d’espacement, en saisissant des lignes vierges ou seulement composées de caractères d’espacement.

Vous devez constater que :

  1. n’importe quel caractère éditable (sauf espacement) est extrait,
  2. tous les caractères d’espacement sont ignorés,
  3. la seule façon de terminer le programme est de taper le caractère “fin-de-fichier” (Ctrl+D). La condition d’arrêt peut donc aussi utiliser le prédicat eof() .

R1.01 – Prog#7 – Exercice 8

Un entier est une suite de caractères numériques (digits) éventuellement précédé d’un signe + ou -. Pour qu’un entier soit valide, il faut que la chaîne de caractères qui le représente soit compatible avec son type :

  1. un entier non signé ne peut être précédé du signe -,
  2. la valeur de la chaîne ne peut excéder la valeur maximale du type correspondant (32767 pour un short, 65535 pour un unsigned, etc.

Ecrire la fonction extractionsEntiers() qui, dans une boucle, extrait (opérateur >>) au clavier (ou sur un fichier redirigé sur l’entrée standard cin) tous les entiers et les affiche à l’écran à raison d’un par ligne. La boucle se termine lorsque l’extraction échoue (fail()).

Faire plusieurs essais, en saisissant un ou plusieurs entiers par ligne, séparés ou non par des caractères d’espacement, en saisissant des lignes vierges ou seulement composées de caractères d’espacement.

Vous devez constater que :

  1. n’importe quel entier valide est extrait,
  2. tous les caractères d’espacement sont ignorés,
  3. le programme se termine au premier échec d’extraction. Le caractère “fin-de-fichier” (Ctrl+D) permet aussi de terminer la saisie. La condition d’arrêt ne doit pas utiliser le prédicat eof(), sauf si aucune erreur de saisie n’est à craindre (ce qui est plutôt rare !)

R1.01 – Prog#7 – Exercice 9

Un nombre réel peut être représenté sous deux formes dites virgule fixe ou notation scientifique (ou virgule flottante).

  1. un nombre en virgule fixe est composé d’au maximum quatre parties contiguës (sans espace ou séparateur quelconque) :
    1. son signe : ‘+’ ou ‘-‘. S’il est absent, le nombre est considéré comme positif.
    2. sa partie entière, toujours exprimée en base 10,
    3. le caractère point décimal ‘.’ car nous sommes dans le système anglo-saxon !
    4. sa partie décimale, elle aussi toujours exprimée en base 10,

    Si le point décimal est présent, il doit obligatoirement être précédé ou suivi d’au moins un digit décimal.

  2. un nombre en notation scientifique est composé de trois parties obligatoires :
    1. un nombre réel en virgule fixe, exprimé en base 10, signé ou non,
    2. le caractère ‘e’ ou ‘E’,
    3. un nombre entier exprimé en base 10, signé ou non, qui représente la puissance de 10 par laquelle il faut multiplier la première partie pour obtenir la valeur réelle.

      De plus, pour que la chaîne représentant un nombre réel soit valide, il faut que la valeur soit compatible avec le type correspondant (float ou double).

Ecrire la fonction extractionsReels() qui, dans une boucle, extrait (opérateur >>) au clavier (ou sur un fichier redirigé sur l’entrée standard cin) tous les réels et les affiche à l’écran à raison d’un par ligne. La boucle se termine lorsque l’extraction échoue (fail()).

Faire plusieurs essais, en saisissant un ou plusieurs réels par ligne, séparés ou non par des caractères d’espacement, en saisissant des lignes vierges ou seulement composées de caractères d’espacement.

Vous devez constater que :

  1. n’importe quel réel valide est extrait,
  2. tous les caractères d’espacement sont ignorés,
  3. le programme se termine au premier échec d’extraction (voir les indications ci-dessus). Le caractère “fin-de-fichier” (Ctrl+D) permet aussi de terminer la saisie.

Les réels suivants sont valides :

123
123.45
-12e12
-12.e-12
+12.23
-.23
1234567890

La dernière valeur est valide mais tronquée : 1.23457e+09.

Les réels suivants sont invalides et terminent le programme :

-.e12
1e123456789
-e12

M1103 – TD2 – Exercice 1

Rappel : un palindrome est “un mot, un vers, une phrase que l’on peut lire dans les deux sens” (dictionnaire Larousse).

Ecrire la fonction IsPalindrome() qui renvoie vrai si la chaîne qui lui est passée en paramètre est un palindrome de façon itérative.

On peut aussi en donner la définition récursive suivante :

  1. un mot est un palindrome si sa première et sa dernière lettre sont identiques et si le reste du mot est lui-même un mot palindrome,
  2. un mot d’une seule lettre est un palindrome,
  3. une chaîne vide sera considérée, par extension, comme un palindrome.

Ecrire la fonction IsPalindrome() qui renvoie vrai si la chaîne qui lui est passée en paramètre est un palindrome de façon récursive.

M1103 – TD2 – Exercice 2

On peut donner la définition du calcul d’une puissance d’un nombre de façon récursive comme suit :

Soit x un nombre réel et n un entier relatif. Alors :

  1. xn = 1 si n = 0
  2. xn = 0 si x = 0 (et n ≠ 0)
  3. xn = 1 / (x-n) si n < 0
  4. xn = x * xn-1 sinon

    En vous inspirant de la fonction Factorielle () montrée en cours, écrire la fonction récursive PuissEntRecurs () qui renvoie le résultat xn, x et n étant passés en paramètres.

M1103 – TD2 – Exercice 3

Les nombres romains sont constitués de suites des caractères M, D, C, L, X, V et I, représentant respectivement 1000, 500, 100, 50, 10, 5 et 1. Le calcul de la valeur décimale est très simple lorsque les symboles se présentent dans l’ordre décroissant : il suffit de faire la somme des valeurs des symboles rencontrés. Par exemple, la chaine de caractères MMCVI représente la valeur 2106 (1000 + 1000 + 100 + 5 + 1.

En revanche, lorsque certains symboles sont inversés, il faut les soustraire au symbole suivant. Par exemple, la chaine de caractères CM représente 900 (1000 – 100), et IV représente 4 (5 – 1).

La récursivité offre une élégante solution à ce problème :

  1. si un nombre romain est constitué d’un seul caractère, sa valeur est égale à celle de ce caractère.
  2. la valeur d’un nombre romain est égale à la valeur du premier caractère + la valeur du nombre romain restant, si la valeur de ce premier caractère est supérieure ou égale à celle de son suivant (le deuxième, donc). Par exemple :
        MMXI = M + (MXI) = 
                    MXI = M + (XI)
                               XI = X + (I)
                                         I = 1
                                    10 + 1 = 11
                          1000 + 11 = 1011
              1000 + 1011 = 2011
        2011
    
  3. la valeur d’un nombre romain est égale à la valeur du nombre romain restant après le premier caractère – la valeur du premier caractère, si la valeur de ce caractère est inférieure à celle de son suivant, Par exemple :
        MCMIX = M + (CMIX) = 
                     CMIX = (MIX) - C
                             MIX  = M + (IX)
                                         IX = (X) - I
                                               10
                                              (10 - 1) = 9
                                    1000 + 9 = 1009
                             1009 - 100 = 909
                1000 + 909 = 1909
        1909
    

On suppose qu’existe la fonction ValChRomain() qui renvoie la valeur numérique correspondant au caractère romain qui lui est passé en paramètre.

Ecrire la fonction ValNbRomain() qui renvoie la valeur numérique correspondant à un nombre romain qui lui est passé en paramètre sous forme d’un string. On supposera qu’une chaîne vide a pour valeur 0 et que la chaîne passée en paramètre est valide.

M1103 – TD2 – Exercice 4

Faites la trace de l’algorithme suivant en considérant l’appel LS ("","abc");

Algorithm Ls
Input: X and Y two string 
Output:
if (Y.size() == 0) then {
    cout << X; 
    return;
}
char tmp =Y.last ();
Y .pop_back ();
LS(X,Y); 
string Z = X + tmp; 
LS(Z,Y); 

Déduisez la sortie.