M1102 – TP6 Corrigés (exo1 – 5)

#include <iostream>
#include <vector>
#include <cctype>
#include <utility>

#include "nsUtil.h"

using namespace std;
using namespace nsUtil;
string & ToUpper (string & Str)
{
    for (char & car : Str)
        car = toupper (car);
    return  Str;
}

vector <string> & ToUpper (vector <string> & VString)
{
    for (string & str : VString)
        str = ToUpper(str);
    return VString;
}

vector <string> & ToUpper (vector <string> & VString, const unsigned & LineNumber)
{
    ToUpper(VString [LineNumber]);
    return VString;
}

string & ToLower (string & Str)
{
    for (char & car : Str)
        car = tolower (car);
    return  Str;
}

vector <string> & ToLower (vector <string> & VString)
{
    for (string & str : VString)
        str = ToLower (str);
    return VString;
}

vector <string> & ToLower (vector <string> & VString, const unsigned & LineNumber)
{
    ToLower (VString [LineNumber]);
    return VString;
}



vector <string> & Swap (vector <string> & VString, const unsigned & PosBeg, const unsigned & PosEnd)
{
    swap (VString[PosBeg], VString[PosEnd]);
    return VString;
}


int main(int argc, char *argv[])
{
    if (2 != argc)
    {
        cerr << "gros boulet" << endl;
        exit (0);
    }

    string InputFile (argv[1]);
    //unsigned long Width (stoul(argv[2]));
    vector <string> VFile (FileToVectString (InputFile));
    EditVStringV3 (VFile);
    string Instruction, Complement;
    while (true)
    {
        cin >> Instruction;
        Instruction = ToLower (Instruction);
        if ("fin" == Instruction)
        {
            break;
        }
        //sauvergarde
        else if ("sav" == Instruction)
        {
            string FileOut;
            cin >> FileOut;
            VectStringToFile (VFile, FileOut);

        }
        //majuscule
        else if ( "maj" ==  Instruction)
        {
            cin >> Complement;
            if (ToLower(Complement) == "tout")
                ToUpper (VFile);
            else
                ToUpper (VFile, stoul(Complement));
        }
        //minuscule
        else if ( "min" ==  Instruction)
        {
            cin >> Complement;
            if (ToLower (Complement) == "tout")
                ToLower (VFile);
            else
                ToLower (VFile, stoul(Complement));
        }

        EditVStringV2 (VFile);
    }//while

    return 0;
}


M1102-TD7 Exercie1 Corrigé

fonction isupper (Car : in caractere) renvoie booleen
debut
renvoie ('A' <= Car ET_ALORS Car <= 'Z');
fin

fonction islower (Car : in caractere) renvoie booleen
debut
renvoie ('a' <= Car ET_ALORS Car <= 'z');
fin

fonction isdigit (Car : in caractere) renvoie booleen
debut
renvoie ('0' <= Car ET_ALORS Car <= '9');
fin

fonction CarDeMot (Car : in caractere) renvoie booleen
debut
renvoie (islower (Car) OU_SINON isupper(Car) OU_SINON isdigit (Car) OU_SINON Car vaut '_');
fin

//approche mot/mot
//fonction CompterNbMots (Chaine : in string) renvoie entier_naturel
//debut
//	declarer Cpt : entier_naturel;
//	Cpt <- 0;
//	declarer i : entier_naturel;
//	i <- 0;
//
//	boucle
//		//on se positionne sur le début du prochain mot
//		tant_que ((i < taille (Chaine)) ET_ALORS  (NON CarDeMot (Chaine [i])))
//		faire
//			i <- i + 1;
//		ffaire
//		si (i vaut taille (Chaine)) sortie;
//
//		//si on ne sort pas, c'est qu'on est sur le debut d'un mot
//		Cpt <- Cpt + 1;
//
//		//on passe le mot courant
//		tant_que (i < taille (Chaine) ET_ALORS CarDeMot (Chaine [i]))
//		faire
//			i <- i + 1;
//		ffaire
//	fboucle
//
//	renvoie Cpt;
//fin

//approche caractere/caractere
fonction CompterNbMots (Chaine : in string) renvoie entier_naturel
debut
declarer Cpt : entier_naturel;
Cpt <- 0;
declarer EstDansMot : booleen;
EstDansMot <- faux;

pour (i variant_de 0 a taille (Chaine) -1)
faire
//on identifie le debut d'un nouveau mot
si (NON EstDansMot ET_ALORS CarDeMot (Chaine [i]))
Cpt <- Cpt + 1;
EstDansMot <- vrai;
//on identifie la fin du mot courant
sinon_si (EstDansMot ET_ALORS NON CarDeMot (Chaine [i]))
EstDansMot <- faux;
fsi
ffaire
renvoie Cpt;
fin

algorithme ComptageDeMots
debut
declarer LigneLue : string;
boucle
afficher ("Entrer une ligne : ");
saisir (LigneLue);
si (0 vaut taille (LigneLue)) sortie;
afficher (LigneLue);
ligne_suivante;
afficher ("Nombre de mots de la ligne :", CompterNbMots (LigneLue));
ligne_suivante;
fboucle
fin

M1102-TD7 Exercie2 Corrigé

fonction isupper (Car : in caractere) renvoie booleen
debut
renvoie ('A' <= Car ET_ALORS Car <= 'Z');
fin

fonction islower (Car : in caractere) renvoie booleen
debut
renvoie ('a' <= Car ET_ALORS Car <= 'z');
fin

fonction isdigit (Car : in caractere) renvoie booleen
debut
renvoie ('0' <= Car ET_ALORS Car <= '9');
fin

fonction CarDeMot (Car : in caractere) renvoie booleen
debut
renvoie (islower (Car) OU_SINON isupper(Car) OU_SINON isdigit (Car) OU_SINON Car vaut '_');
fin

fonction DebutMot (Car : in caractere) renvoie booleen
debut
renvoie (islower (Car) OU_SINON isupper(Car));
fin

//approche mot/mot
//fonction CompterNbMots (Chaine : in string) renvoie entier_naturel
//debut
//	declarer Cpt : entier_naturel;
//	Cpt <- 0;
//	declarer i : entier_naturel;
//	i <- 0;
//
//	boucle
//		//on se positionne sur le début du prochain mot
//		//seul le predicat change par rapport a l'exercice 1
//		tant_que ((i < taille (Chaine)) ET_ALORS  (NON DebutMot (Chaine [i])))
//		faire
//			i <- i + 1;
//		ffaire
//		si (i vaut taille (Chaine)) sortie;
//
//		//si on ne sort pas, c'est qu'on est sur le debut d'un mot
//		Cpt <- Cpt + 1;
//
//		//on passe le mot courant
//		tant_que (i < taille (Chaine) ET_ALORS CarDeMot (Chaine [i]))
//		faire
//			i <- i + 1;
//		ffaire
//	fboucle
//
//	renvoie Cpt;
//fin

//approche caractere/caractere
fonction CompterNbMots (Chaine : in string) renvoie entier_naturel
debut
declarer Cpt : entier_naturel;
Cpt <- 0;
declarer EstDansMot : booleen;
EstDansMot <- faux;

pour (i variant_de 0 a taille (Chaine) -1)
faire
//on identifie le debut d'un nouveau mot
si (NON EstDansMot ET_ALORS DebutMot (Chaine [i]))
Cpt <- Cpt + 1;
EstDansMot <- vrai;
//on identifie la fin du mot courant
sinon_si (EstDansMot ET_ALORS NON CarDeMot (Chaine [i]))
EstDansMot <- faux;
fsi
ffaire
renvoie Cpt;
fin

algorithme ComptageDeMots
debut
declarer LigneLue : string;
boucle
afficher ("Entrer une ligne : ");
saisir (LigneLue);
si (0 vaut taille (LigneLue)) sortie;
afficher (LigneLue);
ligne_suivante;
afficher ("Nombre de mots de la ligne :", CompterNbMots (LigneLue));
ligne_suivante;
fboucle
fin

M1102-TD6 Exercie1 Corrigé

fonction CompterDoublonsV1 (Chaine : in string) renvoie entier_naturel
debut

si (taille(Chaine) < 2) renvoie 0;

declarer Compt : entier_naturel;
Compt <- 0;

declarer i : entier_naturel;
i <- 1;

tant_que (i < taille (Chaine))
faire
si (NON isspace (Chaine [i]) ET_ALORS Chaine [i] vaut Chaine [i-1])
Compt <- Compt +1;
i <- i + 1;
fsi
i <- i + 1;
ffaire

renvoie Compt;
fin

algorithme Nb_de_Doublons
debut

boucle
// Saisie

declarer LigneLue : string;
afficher ("Entrer une string (ligne vide pour sortir) : ");
saisir (LigneLue);

si (taille (LigneLue) vaut 0) sortie;

// La ligne traitée est non vide

// Comptage

declarer NbreDoublons : entier_naturel;

NbreDoublons <- CompterDoublonsV1 (LigneLue);

// Affichage
afficher (LigneLue);
ligne_suivante;
afficher ("Nombre de doublons : ", NbreDoublons);
ligne_suivante;
fboucle

fin

M1102-TD6 Exercie2 Corrigé

fonction isspace (C : in caractere) renvoie booleen
debut
renvoie (C vaut ' ' OU_SINON C vaut '\t' OU_SINON C vaut '\n');
fin

fonction CompterDoublonsV2 (Chaine : in string) renvoie entier_naturel
debut

si (taille(Chaine) < 2) renvoie 0;

declarer Compt : entier_naturel;
Compt <- 0;

pour (i variant_de 1 a taille (Chaine) - 1)
faire
si ((Chaine [i] vaut Chaine [i-1]) OU_SINON (isspace (Chaine [i]) ET_ALORS isspace (Chaine [i-1])))
Compt <- Compt + 1;
fsi
ffaire
renvoie Compt;
fin

algorithme Nb_de_Doublons
debut

boucle
// Saisie

declarer LigneLue : string;
afficher ("Entrer une string (ligne vide pour sortir) : ");
saisir (LigneLue);

si (taille (LigneLue) vaut 0) sortie;

// La ligne traitée est non vide

// Comptage

declarer NbreDoublons : entier_naturel;

NbreDoublons <- CompterDoublonsV2 (LigneLue);

// Affichage
afficher (LigneLue);
ligne_suivante;
afficher ("Nombre de doublons : ", NbreDoublons);
ligne_suivante;
fboucle
fin

M1102-TD6 Exercie3 Corrigé

fonction isspace (C : in caractere) renvoie booleen
debut
renvoie (C vaut ' ' OU_SINON C vaut '\t' OU_SINON C vaut '\n');
fin

fonction CompterDoublonsV3 (Chaine : in string) renvoie entier_naturel
debut

si (taille(Chaine) < 2) renvoie 0;

declarer Compt : entier_naturel;
Compt <- 0;

declarer CarPrec : caractere;
CarPrec <- Chaine [0];

pour (i variant_de 1 a taille (Chaine) - 1)
faire
si (isspace (Chaine [i])) continue;
si (CarPrec vaut Chaine [i])
Compt <- Compt + 1;
fsi
CarPrec <- Chaine [i];
ffaire
renvoie Compt;
fin

algorithme Nb_de_Doublons
debut

boucle
// Saisie

declarer LigneLue : string;
afficher ("Entrer une string (ligne vide pour sortir) : ");
saisir (LigneLue);

si (taille (LigneLue) vaut 0) sortie;

// La ligne traitée est non vide

// Comptage

declarer NbreDoublons : entier_naturel;

NbreDoublons <- CompterDoublonsV3 (LigneLue);

// Affichage
afficher (LigneLue);
ligne_suivante;
afficher ("Nombre de doublons : ", NbreDoublons);
ligne_suivante;
fboucle

fin

M1102-TD6 Exercie4 Corrigé

fonction TrouveCarDansStr (Caract : in caractere,
Chaine : in string,
Debut  : in entier_naturel) renvoie entier_naturel
debut
declarer i : entier_naturel;
i <- Debut;
tant_que (i < taille(Chaine) ET_ALORS Caract ne_vaut_pas Chaine [i])
faire
i <- i +1;
ffaire
renvoie i;
fin

fonction FindSubInStr (SsChaine : in string, Chaine : in string, Debut : in entier_naturel) renvoie entier_naturel
debut

//on se demande s'il y a la place pour faire la recherche
si (taille (SsChaine) + Debut >= taille (Chaine)) renvoie taille (Chaine);

//peut-on accéder à l'élément en position 0 de la sous-chaine? non => on sort
si (taille (SsChaine) vaut 0) renvoie taille (Chaine);

declarer i : entier_naturel;
i <- Debut;

declarer j : entier_naturel;
j <- 0;

boucle
//on cherche la première occurence de SsChaine [0] dans Chaine à partir de la position i
i <- TrouveCarDansStr (SsChaine [0], Chaine, i);

//cas 0: si la recherche a échouée (on ne peut pas trouver le sous-motif), alors on sort
si (i vaut taille (Chaine)) sortie;

//si on ne sort pas, l'assertion SsChaine [0] vaut Chaine [i] est vraie
//cas 1 : on se demande alors si on peut placer la sous-chaine entre la position i et la fin de la chaine sans faire de
//débordement de case. Si ce n'est pas le cas, on sort de la boucle
si (i + taille (SsChaine) > taille (Chaine)) sortie;

//cas 2: on peut lancer la recherche
//on parcourt donc le reste de la sous-chaine
j <- 1;
tant_que (j < taille (SsChaine) ET_ALORS Chaine [i + j] vaut SsChaine [j])
faire
j <- j +1;
ffaire

//si on a atteint la fin de la sous-chaine, on sort de la boucle
si (j vaut taille (SsChaine)) sortie;

//si on ne sort pas, on prépare la prochaine recherche
i <- i + 1;
fboucle

si (j ne_vaut_pas taille (SsChaine))
i <- taille (Chaine);
fsi
renvoie i;
fin
//astuce : même si le test ligne 34 (cas 0) est juste, il est couvert par celui en ligne 39 (cas 1)
//on pourrait donc s'en passer :)

algorithme TestFindSubInStr
debut
boucle
// Saisie

declarer LigneLue : string;
afficher ("Entrer une string (ligne vide pour sortir) : ");
saisir (LigneLue);

si (taille (LigneLue) vaut 0) sortie;

// La ligne traitée est non vide

declarer SousChaine : string;
boucle
afficher ("Entrer la sous-chaine cherchee  : ");
saisir (SousChaine);
si (taille (SousChaine) ne_vaut_pas 0) sortie;
fboucle

declarer Pos : entier_naturel;
afficher ("Entrer la position à partir de laquelle vous souhaitez faire la recherche : ");
saisir (Pos);

declarer PosCherchee : entier_naturel;
PosCherchee <- FindSubInStr (SousChaine, LigneLue, Pos);

// Affichage
si (PosCherchee < taille (LigneLue))
afficher ("On trouve  le motif \"", SousChaine, "\" dans la chaine ", LigneLue);
afficher (" pour la première fois à partir de la position ", Pos, " en position ", PosCherchee);
sinon
afficher ("On ne trouve pas le motif \"", SousChaine, "\" dans la chaine ", LigneLue, " a partir de la position ", Pos);
fsi
ligne_suivante;
fboucle
fin

M1102-TD5 Exercie1 Corrigé

fonction TrouveCarDansStr (Caract : in caractere, 
                           Chaine : in string, 
                           Debut  : in entier_naturel) renvoie entier_naturel
debut
	declarer i : entier_naturel;
	i <- Debut;
	tant_que (i < taille(Chaine) ET_ALORS Caract ne_vaut_pas Chaine [i])
	faire
		i <- i +1;
	ffaire
	renvoie i;
fin

fonction ComptCarac (Caract : in caractere, 
                     Chaine : in string) 	renvoie entier_naturel
debut
	declarer Cpt : entier_naturel;
	Cpt <- 0;
	
	declarer Pos : entier_naturel;
	Pos <- 0;
	
	boucle
		Pos <- TrouveCarDansStr (Caract, Chaine, Pos);
		si (Pos vaut taille (Chaine)) sortie;
		Cpt <- Cpt + 1;
		Pos <- Pos + 1;		
	fboucle
	
	renvoie Cpt;
fin

algorithme ComptagePetitEnsemble
debut
	declarer KStrVoy : constante string <- "aeiouy";
	
	declarer TabCpt : tableau_de taille (KStrVoy) entier_naturel;
	
	declarer Chaine : string;
	afficher ("Veuillez saisir une chaine de caractères : ");
	saisir (Chaine);
	
	//comptage
	pour (i variant_de 0 a taille (KStrVoy) -1)
	faire
		TabCpt [i] <- ComptCarac (KStrVoy [i], Chaine);
	ffaire
	
	//nb total d'occurence
	declarer Somme : entier_naturel;
	Somme <- 0;
	pour (i variant_de 0 a taille (TabCpt) - 1)
	faire
		Somme <- Somme + TabCpt [i];
	ffaire
	
	//affichage final
	pour (i variant_de 0 a taille (KStrVoy) -1)
	faire
		afficher ("Le caractère ", KStrVoy [i], " apparait ", TabCpt [i], " fois en absolu et ", TabCpt [i]*100 / Somme, "% en relatif");
		ligne_suivante;
	ffaire
fin

M1102-TD5 Exercie2 Corrigé

fonction TrouveCarDansStr (Caract : in caractere, 
                           Chaine : in string, 
                           Debut  : in entier_naturel) renvoie entier_naturel
debut
	declarer i : entier_naturel;
	i <- Debut;
	tant_que (i < taille(Chaine) ET_ALORS Caract ne_vaut_pas Chaine [i])
	faire
		i <- i +1;
	ffaire
	renvoie i;
fin

algorithme ComptagePetitEnsemble
debut
	declarer KStrVoy : constante string <- "aeiouy";
	
	declarer TabCpt : tableau_de taille (KStrVoy) entier_naturel;
	pour (i variant_de 0 a taille (TabCpt) - 1)
	faire
		TabCpt [i] <- 0;
	ffaire
	
	declarer Chaine : string;
	afficher ("Veuillez saisir une chaine de caractères : ");
	saisir (Chaine);
	
	//comptage
	pour (i variant_de 0 a taille (Chaine) -1)
	faire
		declarer Pos : entier_naturel;
		Pos <- TrouveCarDansStr (Chaine [i], KStrVoy, 0);
		si (Pos vaut taille (KStrVoy)) continue;
		TabCpt [Pos] <- TabCpt [Pos] + 1;
	ffaire
	
	//nb total d'occurence
	declarer Somme : entier_naturel;
	Somme <- 0;
	pour (i variant_de 0 a taille (TabCpt) - 1)
	faire
		Somme <- Somme + TabCpt [i];
	ffaire
	
	//affichage final
	pour (i variant_de 0 a taille (KStrVoy) -1)
	faire
		afficher ("Le caractère ", KStrVoy [i], " apparait ", TabCpt [i], " fois en absolu et ", TabCpt [i]*100 / Somme, "% en relatif");
		ligne_suivante;
	ffaire
fin

M1102-TD5 Exercie3 Corrigé

fonction isspace (C : in caractere) renvoie booleen
debut
renvoie (C vaut ' ' OU_SINON C vaut '\t' OU_SINON C vaut '\n');
fin

//variante avec une boucle pour
//fonction CompterDoublonsV0 (Chaine : in string) renvoie entier_naturel
//debut
//
//	si (taille(Chaine) < 2) renvoie 0;
//
//	declarer Compt : entier_naturel;
//    Compt <- 0;
//
//	pour (i variant_de 1 a taille (Chaine) - 1)
//	faire
//		si (isspace (Chaine [i])) continue;
//		si (Chaine [i] vaut Chaine [i-1])
//			Compt <- Compt + 1;
//		fsi
//	ffaire
//
//  renvoie Compt;
//fin

//variante en utilisant une boucle tant_que
fonction CompterDoublonsV0 (Chaine : in string) renvoie entier_naturel
debut

si (taille(Chaine) < 2) renvoie 0;

declarer Compt : entier_naturel;
Compt <- 0;

declarer i : entier_naturel;
i <- 1;

tant_que (i < taille (Chaine))
faire
si (NON isspace (Chaine [i]) ET_ALORS Chaine [i] vaut Chaine [i-1])
Compt <- Compt +1;
fsi
i <- i + 1;
ffaire

renvoie Compt;
fin

algorithme Nb_de_Doublons
debut

boucle
// Saisie

declarer LigneLue : string;
afficher ("Entrer une string (ligne vide pour sortir) : ");
saisir (LigneLue);

si (taille (LigneLue) vaut 0) sortie;

// La ligne traitée est non vide
// Comptage
declarer NbreDoublons : entier_naturel;

NbreDoublons <- CompterDoublonsV0 (LigneLue);

// Affichage
afficher (LigneLue);
ligne_suivante;
afficher ("Nombre de doublons : ", NbreDoublons);
ligne_suivante;
fboucle

fin