Retrouvez l'univers nintendo sous toutes ses faces !!
 
AccueilPortailFAQS'enregistrerConnexion

Partagez | 
 

 TP2 - Caractères, chaînes, mots et lettres

Aller en bas 
AuteurMessage
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: TP2 - Caractères, chaînes, mots et lettres   Lun 26 Nov - 18:33

Remarques préliminaires

Certains corrigés sont présentés sous deux versions :

  • version "algorithmique", très proche de l'algorithme correspondant,

  • version "concise", beaucoup plus "professionnelle", mais plus difficile à lire par des programmeurs inexpérimentés ...

Dans une première lecture, la seconde version peut être ignorée. Il est cependant conseillé de la travailler pour être capable de la comprendre, puis pour en adopter petit à petit le "style".

La seconde version d'un corrigé se distingue de la première par l'identificateur du fichier, terminé par le postfixe N, comme par exemple CharEtCodeASCII.cxx et CharEtCodeASCIIN.cxx.

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP2 - Caractères, chaînes, mots et lettres   Lun 26 Nov - 18:47

1) - Lecture de strings
Objectifs

Les objectifs de cet exercice sont :

  • de placer un '"' dans une chaîne,

  • d'initialiser un string avec un littéral au moyen du constructeur,

  • de comparer deux strings.

Sujet

Créer le répertoire tp/tpC++/tp_02, qui sera le répertoire courant.

Dans l'espace de noms anonyme du fichier LectureStrings.cxx (ou du fichier tp_02.cxx), écrire la fonction LectureStrings() qui lit des chaînes de caractères (strings) au clavier jusqu'à la chaîne "fin". Le programme doit

  1. afficher à l'écran, seul sur une ligne, le titre de l'exercice suivant
    Code:
    Lecture de chaînes jusqu'à "fin"

  2. séparée par une ligne vierge de la ligne précédente, afficher "l'invite" (le message) suivante :
    Code:
    Tapez une chaine ("fin" pour terminer le programme) :

  3. passer à la ligne suivante et lire la chaîne au clavier (elle va s'afficher seule sur cette nouvelle ligne au fur et à mesure de la saisie),

  4. si ce n'est pas la chaîne "fin", l'afficher sur la ligne suivante en la faisant précéder du "libellé" suivant
    Code:
    Chaine lue :
    et recommencer en 2,

  5. terminer le programme si c'est la chaîne "fin".

Le résultat de l'exécution pourrait être par exemple :
Code:
Lecture de chaînes jusqu'à "fin"

Tapez une chaine ("fin" pour terminer le programme) :
Bonjour
Chaine lue : Bonjour

Tapez une chaine ("fin" pour terminer le programme) :
Adieu
Chaine lue : Adieu

Tapez une chaine ("fin" pour terminer le programme) :
fin

Algorithme

L'algorithme peut être écrit :
Code:
algorithme Saisir_Chaine_jusqua_FIN
debut
    afficher (Le_titre_de_l_exercice);

    boucle
        declarer ChaineLue : string;
       
        afficher (l_invite);
        saisir (ChaineLue);

        si (ChaineLue vaut "fin") sortie;

        afficher (le_libellé);
        afficher (ChaineLue);
        ligne_suivante;
    fboucle

fin

Exécution

Essayer le programme en tapant des lignes contenant des espaces, par exemple Au revoir. Essayer aussi des lignes vides (un "New Line" <NL> simple) ou formées d'espaces, de tabulations. Le comportement peut-être un peu surprenant sera expliqué ultérieurement.

Corrigé

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP2 - Caractères, chaînes, mots et lettres   Lun 26 Nov - 19:19

2) - Taille des chaînes et sgnirts
Objectifs

Les objectifs de cet exercice sont :

  • parcourir un tableau (ou un string),

  • injecter un caractère dans cout,

  • appeler des méthodes d'une classe notation pointée,

  • utiliser les méthodes length() et size(),

  • rappeler l'utilisation de setw().

  • utiliser la fonction standard swap()

Sujet

Dans l'espace de noms anonyme du fichier LongueurStrings.cxx (ou du fichier tp_02.cxx), écrire la fonction LongueurStrings() qui lit des chaînes de caractères (strings) au clavier jusqu'à la chaîne "fin". Le programme doit

  1. afficher à l'écran, seul sur une ligne, le titre de l'exercice suivant :
    Code:
    Longueur d'une chaîne "tableau de caractères"

  2. afficher "l'invite" (le message) suivante (séparée par une ligne vierge de la ligne précédente) ;
    Code:
    Tapez une chaine ("fin" pour terminer le programme) :

  3. lire la chaîne au clavier (elle va s'afficher à la suite sur la même ligne),

  4. si ce n'est pas la chaîne "fin", afficher sur la ligne suivante :


  • le libellé :
    Code:
    Chaine inversée :

  • le nombre de caractères de la chaîne lue, sur une largeur de 4 caractères, suivi d'un '-' entre deux espaces,

  • la chaîne à l'envers.
    et recommencer en 2,


Utiliser alternativement les méthodes length() et size() de la classe string (elles sont équivalentes).

Pour le point 4.3., essayer les trois méthodes proposées en algorithmique :

  1. affichage à l'envers "à la volée" (parcours à l'envers de la chaîne lue et affichage des caractères rencontrés),

  2. création et affichage d'une nouvelle chaîne inversée en concaténant les caractères de la chaîne initiale parcourue à l'envers,

  3. inversion de la chaîne lue par permutations successives, puis affichage. La fonction standard swap() doit être utilisée. Elle est décrite (= déclarée) dans le fichier algorithm (à inclure).


Algorithme

L'algorithme ci-dessous met en oeuvre la troisième solution (inversion de la chaîne sur elle-même puis affichage). Lui ajouter l'affichage de la longueur de la chaîne.
Enoncé de l'exercice d'algorithmique du Td 04 - Tableaux (III) : "Lire et inverser des chaînes de caractères"

Code:
procedure PermuterCaract (E1 : in_out caractere,
                          E2 : in_out caractere)
debut
    declarer KE1 : constante caractere <- E1;

    E1  <- E2;
    E2  <- KE1;

fin

algorithme AfficherChaineInversee
debut

    boucle
        declarer ChaineLue : string;
        afficher ("Tapez une ligne (vide pour terminer) : ");
        saisir (ChaineLue);
        si (taille (ChaineLue) vaut 0) sortie;

        afficher ("Ligne lue : ", ChaineLue);
        ligne_suivante;
        declarer j : entier_naturel;
        j <- taille (ChaineLue) - 1;
       
pour (i variant_de 0 a taille (ChaineLue) / 2 - 1) faire PermuterCaract (ChaineLuej, ChaineLuei); j <- j - 1; ffaire

        afficher ("Inversée  : ", ChaineLue);
        ligne_suivante;

    fboucle

fin

Remarques concernant les deux autres solutions d'affichage ("à la volée" et par construction d'une nouvelle chaîne inversée) qui nécessitent toutes deux la totalité de la chaîne.

Rappelons que la traduction de ce schéma algorithmique en C++ par l'instruction for ( ; ; ) n'est qu'approximative :
  • la déclaration du type de l'indice doit être explicite. Ici, i doit appartenir à l'intervalle semi_ouvert [0, taille (Chaine)[ (ou à l'intervalle fermé [0, taille (Chaine) - 1]). Le type qui s'impose donc pour i est le type entier_naturel.

  • la condition de continuation de boucle doit figurer explicitement dans l'instruction for ( ; ; ) : elle correspond à

    Code:
    tant_que (i >= 0)

  • puisque la valeur nulle de i doit aussi être traîtée. Mais tester si i est positif ou nul suppose qu'il peut devenir négatif, ce qui est impossible puisque son type est entier_naturel !

  • Une solution de facilité est de changer son type en entier tout court, mais c'est absurde !


Une autre solution possible a été vue :
Code:
...
pour (i variant_de taille (Chaine) a 1 descendant)
faire
    afficher (Chainei-1);
ffaire
...

Ce décalage entre l'indice de boucle et l'indice du tableau ne me paraît pas souhaitable. Je préfère la solution suivante :
Code:
...
declarer i : entier_naturel;
i <- taille (Chaine);

// i est le nombre de caractères qu'il reste à afficher

tant_que (i > 0)
faire
    i <- i - 1;
    afficher (Chainei);

    // i est le nombre de caractères qu'il reste à afficher

ffaire;
...

On notera que cet algorithme est juste même si la chaîne est vide.

Exécution

Le résultat de l'exécution pourrait être par exemple
Code:
Longueur d'une chaîne "tableau de caractères"

Tapez une chaine ("fin" pour terminer le programme)  Bonjour
Chaine inversée :  7 - ruojnoB

Tapez une chaine ("fin" pour terminer le programme)  Adieu
Chaine inversée :  5 - ueidA

Tapez une chaine ("fin" pour terminer le programme)  anticonstitutionnel
Chaine inversée :  19 - lennoitutitsnocitna

Tapez une chaine ("fin" pour terminer le programme)  fin

Corrigé

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP2 - Caractères, chaînes, mots et lettres   Lun 17 Déc - 11:33

3) - Caractères et entiers
Objectifs

Les objectifs de cet exercice sont :

d'utiliser le type char,

de montrer que char est un entier (opérations entières possibles),

de montrer qu'une opération sur un char donne un entier (sauf si on passe par un caractère intermédiaire),

de mettre en oeuvre la structure répétitive repeter ... tant_que.

Sujet

Dans l'espace de noms anonyme du fichier CharEtCodeASCII.cxx (ou du fichier tp_02.cxx), écrire la fonction CharEtCodeASCII().

Dans une première boucle, remplir un tableau de toutes les minuscules. Afficher le contenu du tableau.

Dans une seconde boucle, construire une chaîne contenant tous les chiffres dans l'ordre inverse de l'ordre lexicographique ('9', '8', ..., '0'). Afficher la chaine.

Dans une troisième boucle (utiliser le schéma repeter ...tant_que ...), afficher les couples majuscule/minuscule séparés par un espace. Pour cela, utiliser comme variable de boucle un entier NbCouples représentant le nombre de couples déjà affichés et "calculer" chaque lettre par décalage du 'A' et du 'a'. Terminer la boucle lorsque 26 couples de lettres ont été écrits.

Dans une quatrième boucle analogue à la précédente, afficher les valeurs ASCII des couples majuscule/minuscule séparés par un espace, la valeur de la minuscule étant séparée de celle de la majuscule par un '/'. Pour cela, utiliser comme variable de boucle un entier NbCouples représentant le nombre de couples déjà affichés et injecter directement dans le flux le résultat du décalage du 'A' et du 'a'.
Algorithme

On pourra s'inspirer de l'exercice d'algorithmique suivant :
énoncé de l'exercice d'algorithmique du Td 04 - Tableaux (III) : "Générer des sous-ensembles de caractères"
Code:
...
    // minuscules

    declarer TabMinusc : tableau_de caractere; // supposé de taille nulle
    declarer Car : caractere;
    Car <- 'a';
    declarer NbCar : entier_naturel;
    NbCar <- 0;
    boucle
        allonger (TabMinusc, 1);
        TabMinuscNbCar <- Car;
        NbCar <- NbCar + 1;
        si (Car vaut 'z') sortie;
        Car <- succ (Car);
    fboucle

    // chiffres inversés

    Car <- '9';
    declarer TabChiffre : string;              // supposée de taille nulle
    boucle
        TabChiffre <- TabChiffre + Car;        // concaténation
        si (Car vaut '0') sortie;
        Car <- pred (Car);
    fboucle
    ...
Attention : un tableau ne pouvant pas être redimensionné en C++, il faut lui donner sa taille définitive dès la déclaration.


Exécution

Le résultat de l'exécution doit être celui-ci
Code:
Caractères <--> Entiers


Les minuscules :

abcdefghijklmnopqrstuvwxyz


Les chiffres à l'envers :

9876543210


Les couples majuscules/minuscules :

Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz


Valeurs ASCII des couples majuscules/minuscules :

65/97 66/98 67/99 68/100 69/101 70/102 71/103 72/104 73/105 74/106 7 .........

Corrigés

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Sorell
Stratège
avatar

Masculin
Nombre de messages : 521
Localisation : Quel part où le sang coule.
Date d'inscription : 01/05/2008

Feuille de personnage
Surnom dans la team: Sénéchal Noir
Victoire/défaite:
0/0  (0/0)

MessageSujet: Re: TP2 - Caractères, chaînes, mots et lettres   Lun 17 Déc - 11:49

4) - Lecture de lignes - majusc. <--> minusc.
Objectifs

Les objectifs de cet exercice sont :

utiliser les fonctions getline() et empty().

écrire des conditions doubles, avec les opérateurs &&, opérateurs <= et >=

écrire des prédicats,

écrire des fonctions qui ont une chaîne de caractères comme paramètre donnée-résultat et comme valeur de retour,

illustrer la notion de surcharge de sous-programmes,

puis d'utiliser les fonctions standard de traitement des caractères.

Sujet

Version 1

Dans l'espace de noms anonyme du fichier MajuscMinuscV1.cxx (ou du fichier tp_02.cxx), écrire les prédicats IsUpper() et IsLower() qui renvoient true si le caractère qui leur est passé en paramètre est respectivement une majuscule ou une minuscule.

Ajouter les fonctions ToUpper() et ToLower() qui transforment le caractère qui leur est passé en paramètre respectivement en majuscule ou en minuscule (seulement si nécessaire).

Ajouter les fonctions ToUpper() et ToLower() qui transforment la chaîne qui leur est passée en paramètre (donnée/résultat) respectivement en majuscule ou en minuscule (seulement si nécessaire), et qui renvoient aussi cette chaîne. On remarquera qu'ils s'agit de surcharges des deux fonctions précédentes, dont l'utilisation est sans ambiguïté puisqu'elles n'ont pas le même profil.

Ajouter la fonction MajuscMinusc() qui affiche à l'écran, seul sur une ligne, le titre de l'exercice suivant :
Code:
Majuscules <-->  Minuscules

puis lit des lignes (strings) au clavier jusqu'à une ligne vide, précédées de l'affichage de "l'invite" (le message) suivante :

Code:
Tapez une ligne (ligne vide pour terminer le programme) :

Pour chaque ligne lue (non vide), le programme doit
  • afficher le libellé :
    Code:
    Ligne lue          :
    suivi de la ligne lue,

  • sur la ligne suivante, afficher le libellé :
    Code:
    Ligne en majuscules :
    ainsi que la ligne lue transformée en majuscules,

  • réafficher la ligne lue (pour vérifier qu'elle a bien été transformée),

  • sur la ligne suivante, afficher le libellé :
    Code:
    Ligne en minuscules :
    ainsi que la ligne lue transformée en minuscules,


Version 2
Dans l'espace de noms anonyme du fichier MajuscMinuscV2.cxx (ou du fichier tp_02.cxx), modifier la fonction MajuscMinusc() en utilisant exclusivement les fonctions standard du C/C++ applicables aux caractères toupper() et tolower(), incluses dans le fichier cctype).
Algorithme

S'inspirer de l'
énoncé de l'exercice d'algorithmique du Td 04 - Tableaux (III) : "Mise de chaînes de caractères en minuscules ou en majuscules"
Code:
fonction IsLower (C : in caractere)
    renvoie booleen

debut

    renvoie 'a' <= C ET_ALORS C <= 'z';

fin
Code:
fonction IsUpper (C : in caractere)
    renvoie booleen

debut

    renvoie 'A' <= C ET_ALORS C <= 'Z';

fin
Code:
algorithme Lignes_lues_en_majuscules_minuscules
debut

    boucle
        declarer LigneLue : string;
        saisir (LigneLue);
        si (taille (LigneLue) vaut 0) sortie;

        afficher ("Nouvelle ligne");
        ligne_suivante;
        afficher (LigneLue);
        ligne_suivante;

        // Mise en majuscules

        pour (i variant_de 0 a taille (LigneLue) - 1)
        faire
            si (IsLower (LigneLuei))
                LigneLuei <- toupper (LigneLuei);
            fsi
        ffaire

        afficher (LigneLue);
        ligne_suivante;

        // Mise en minuscules

        pour (i variant_de 0 a taille (LigneLue) - 1)
        faire
            si (IsUpper (LigneLuei))
                LigneLuei <- tolower (LigneLuei);
            fsi
        ffaire

        afficher (LigneLue);
        ligne_suivante;
    fboucle

fin

Exécution
L'exécution du programme pourrait ressembler à ceci :
Code:
Majuscules <-->  Minuscules

Tapez une ligne (ligne vide pour terminer le programme) :
qsfdqzsdfqsdSQDFSQDFSQDF21312312312
LigneLue lue          : qsfdqzsdfqsdSQDFSQDFSQDF21312312312
LigneLue en majuscules : QSFDQZSDFQSDSQDFSQDFSQDF21312312312
LigneLue lue          : QSFDQZSDFQSDSQDFSQDFSQDF21312312312
LigneLue en minuscules : qsfdqzsdfqsdsqdfsqdfsqdf21312312312

Tapez une ligne (ligne vide pour terminer le programme) :

Corrigés

_________________


"Les fragments d’un rêve qui ressemblent à un souvenir lointain. Un souvenir éloigné semblable aux bribes d’un rêve. Je veux rassembler ces fragments. Les tiens… et les miens."
- Sora, Kingdom Hearts II
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: TP2 - Caractères, chaînes, mots et lettres   

Revenir en haut Aller en bas
 
TP2 - Caractères, chaînes, mots et lettres
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Mots croisés dofusiens
» ?? 2 lettres et le mot change - partie 2 avec 7 lettres ??
» Jeux de mots, Ramoucho !
» ORIGINE DES MOTS OU EXPRESSIONS
» Pics/mots

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Nintendo-city :: Informatique :: Section C++-
Sauter vers: