#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; }
Archives du 28 novembre 2016
M1102-TD7 Exercie1 Corrigé
[Algo]
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
[/Algo]
M1102-TD7 Exercie2 Corrigé
[Algo]
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
[/Algo]
M1102-TD6 Exercie1 Corrigé
[Algo]
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
[/Algo]
M1102-TD6 Exercie2 Corrigé
[Algo]
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
[/Algo]
M1102-TD6 Exercie3 Corrigé
[Algo]
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
[/Algo]
M1102-TD6 Exercie4 Corrigé
[Algo]
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
[/Algo]
M1102-TD5 Exercie1 Corrigé
[Algo]
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
[/Algo]
M1102-TD5 Exercie2 Corrigé
[Algo]
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
[/Algo]
M1102-TD5 Exercie3 Corrigé
[Algo]
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
[/Algo]