Exercices en langage C++/Les tableaux de char
Exercices en langage C++ |
---|
Sommaire |
|
Liens |
Modifier ce modèle |
Les tableaux de caractères
[modifier | modifier le wikicode]Exercice 1
[modifier | modifier le wikicode]Écrire une fonction qui a en paramètres une chaîne de caractères (paramètre en entrée) et un entier e (paramètre en sortie). Cette fonction renvoie un booléen. La fonction renvoie true si la chaîne de caractères est un entier écrit sous la forme d'une suite de chiffres qui ne commence pas par 0, elle renvoie false sinon. Si la chaîne est correcte, la fonction renvoie dans e la valeur de cet entier.
Cet exercice a pour but de vérifier les points techniques suivants :
- La manipulation de chaînes de caractères ;
- la validation d'une chaîne de caractères ;
- transformation d'une chaîne vers un autre type.
Voici le fichier source :
#include <iostream>
bool valide_entier(char chaine[], int &refNombreEntier) {
bool valide = true;
refNombreEntier = 0;
valide = !(chaine[0] < '1' || chaine[0] > '9');
int compteur = 0;
while (valide && chaine[compteur]!='\0') {
if (chaine[compteur] >= '0' && chaine[compteur] <= '9') {
refNombreEntier = 10 * refNombreEntier + (chaine[compteur] - '0');
compteur++;
} else {
valide = false;
}
}
return valide;
}
int main() {
int nombreEntier;
char chaine[20];
do {
std::cout << "Tapez une chaîne de caractères : ";
std::cin >> chaine;
} while (!valide_entier(chaine, nombreEntier));
std::cout << "L'entier vaut : " << nombreEntier << std::endl;
return EXIT_SUCCESS;
}
Exercice 2
[modifier | modifier le wikicode]Écrire une fonction qui a en paramètre une chaîne de caractères (paramètre en entrée et en sortie) et qui transforme toutes les minuscules de la chaîne en majuscules.
Cet exercice a pour but de vérifier les points techniques suivants :
- La manipulation de chaînes de caractères ;
- transformation d'une chaîne de caractères ;
- majuscules et minuscules.
Voici le fichier source :
#include <iostream>
void minusculesVersMajuscules(char chaine[]) {
int compteur = 0;
// Le caractère de la chaîne n’est pas le marqueur terminal
while(chaine[compteur] != '\0') {
// Le caractères est une minuscule
if(chaine[compteur] >= 'a' && chaine[compteur] <= 'z') {
chaine[compteur] = chaine[compteur] + ('A'-'a');
}
compteur++; // Pour accéder au caractère suivant
}
}
int main() {
char chaine[255];
std::cout << "Tapez une chaîne de caractères à transposer en majuscules : ";
std::cin >> chaine;
std::cout << chaine;
minusculesVersMajuscules(chaine);
std::cout << "La même chaîne en majuscules est : " << chaine << std::endl;
return EXIT_SUCCESS;
}
Exercice 3
[modifier | modifier le wikicode]Écrire une fonction qui a en paramètre une chaîne de caractères (paramètre en entrée et en sortie) et qui supprime toutes les voyelles.
- y est une voyelle dans ce programme ;
- la phrase peut contenir des espaces mais doit avoir moins de 80 caractères incluant le '\0' ;
- Si une voyelle à un accent, elle sera traité comme une consonne (tout comme une voyelle majuscule) ;
- La voyelle est remplacée par un . pour afficher la suppression de la voyelle.
#include <iostream>
void remplaceVoyelle(char chaine[]) {
int compteur = 0;
while(chaine[compteur] != '\0') {
if((chaine[compteur] == 'a') || (chaine[compteur] == 'e') || (chaine[compteur] == 'i') ||
(chaine[compteur] == 'o') || (chaine[compteur] == 'u') || (chaine[compteur] == 'y')) {
chaine[compteur] = '.';
}
compteur++;
}
}
int main() {
char chaine[255];
std::cout << "Tapez une chaîne de caractères : ";
std::cin >> chaine;
remplaceVoyelle(chaine);
std::cout << "Voici la phrase avec la modification : "<< chaine << std::endl;
return EXIT_SUCCESS;
}
Exercice 4
[modifier | modifier le wikicode]Écrire une fonction qui a en paramètres deux chaînes de caractères ch1 et ch2 (paramètres en entrée) et renvoie un booléen indiquant si la chaîne ch2 est contenue dans la chaîne ch1.
Cet exercice a pour but de vérifier les points techniques suivants :
- La manipulation de chaînes de caractères ;
- recherche d'une chaîne incluse dans une autre chaîne.
Voici le fichier source :
bool chainePrincipaleContientSecondaire(char chainePrincipale[],
char chaineSecondaire[]) {
int ii, i, j = 0;
bool estFini, estTrouve = false;
while (!estTrouve && chainePrincipale[ii] != '\0') {
if(chainePrincipale[ii] == chaineSecondaire[j]){
ii++;
j++;
if (chaineSecondaire[j] == '\0') {
estTrouve = true;
}
} else {
i++;
ii = i;
j = 0;
}
}
return estTrouve;
}
int main() {
char chainePrincipale[255], chaineSecondaire[255];
std::cout << "Tapez une chaîne de caractères principale : ";
std::cin >> chainePrincipale;
std::cout << "Tapez une chaîne de caractères secondaire : ";
std::cin >> chaineSecondaire;
if(chainePrincipaleContientSecondaire(chainePrincipale, chaineSecondaire)) {
std::cout << "La chaine principale contient la chaine secondaire." << std::endl;
} else {
std::cout << "La chaine principale ne contient pas la chaine secondaire." << std::endl;
}
return EXIT_SUCCESS;
}
Exercice 5
[modifier | modifier le wikicode]Écrire un programme qui demande à l’utilisateur de taper un verbe du premier groupe et qui le conjugue à l'indicatif présent.
Cet exercice a pour but de vérifier les points techniques suivants :
- La manipulation de chaînes de caractères ;
- la construction d'une chaîne à partir d'une autre.
Voici le fichier source :
#include <iostream>
#include <cstring>
int main() {
char chaine[255];
std::cout << "Tapez un verbe du premier groupe : ";
std::cin >> chaine;
int longueurChaine = strlen(chaine);
if (longueurChaine <= 2 ||
chaine[longueurChaine-1] != 'r' || chaine[longueurChaine-2] != 'e') {
std::cout << "Le verbe n'est pas du premier groupe." << std::endl;
} else {
chaine[longueurChaine-2] = '\0';
std::cout << "Je " << chaine << "e" << std::endl;
std::cout << "Tu " << chaine << "es" << std::endl;
std::cout << "Il " << chaine << "e" << std::endl;
std::cout << "Nous " << chaine << "ons" << std::endl;
std::cout << "Vous "<< chaine << "ez" << std::endl;
std::cout << "Ils " << chaine << "ent" << std::endl;
}
return EXIT_SUCCESS;
}
Exercice 6
[modifier | modifier le wikicode]Écrire un programme qui saisit une chaîne pouvant contenir des espaces et qui affiche chaque mot de la chaîne, le séparateur étant l’espace.
Exemple, on tape : je pense donc je suis
Le programme affiche :
mot 1 : je
mot 2 : pense
mot 3 : donc
mot 4 : je
mot 5 : suis
Cet exercice a pour but de vérifier les points techniques suivants :
- La manipulation de chaînes de caractères ;
- analyse syntaxique d'une chaîne de caractères.
Voici le fichier source :
#include <iostream>
int main() {
char phrase[50];
char mot[50];
int i, j, indiceDuMot = 0;
int state = 1;
std::cout << "Tapez une phrase : ";
std::cin.getline(phrase, 50);
while(phrase[i] != '\0'){
if (state == 1) {
if (phrase[i]!=' ') {
state = 2;
j = 0;
mot[0] = phrase[i];
j++;
}
} else {
if (phrase[i] != ' ') {
mot[j] = phrase[i];
j++;
} else {
state = 1;
indiceDuMot++;
mot[j] = '\0';
std::cout << "Mot : " << indiceDuMot << " : " << mot << std::endl;
}
}
i++;
}
if(state == 2) {
indiceDuMot++;
mot[j]='\0';
std::cout << "Mot : " << indiceDuMot << " : " << mot << std::endl;
}
return EXIT_SUCCESS;
}
Exercice 7
[modifier | modifier le wikicode]Écrire un programme qui demande à l’utilisateur de taper une chaîne de caractères et qui indique si cette chaîne est un palindrome ou non.
Cet exercice a pour but de vérifier les points techniques suivants :
- La manipulation de chaînes de caractères ;
- validation d'une chaîne.
Voici le fichier source :
#include <iostream>
#include <cstring>
int main() {
char chaine[50];
int compteurCroissant = 0;
// On part du principe qu’il s’agit d’un palindrome et on va démontrer le contraire
bool laChaineEstUnPalindrome = true;
std::cout << "Tapez une chaîne de caractères : "; std::cin >> chaine;
int compteurDecroissant = strlen(chaine) - 1; // Suppression du \0 terminal
while (laChaineEstUnPalindrome && compteurCroissant < compteurDecroissant) {
if(chaine[compteurCroissant] != chaine[compteurDecroissant]) {
laChaineEstUnPalindrome = false;
} else {
compteurCroissant++;
compteurDecroissant--;
}
}
if (laChaineEstUnPalindrome) {
std::cout << "La chaîne de caractères est un palindrome." << std::endl;
} else {
std::cout << "La chaîne de caractères n’est pas un palindrome." << std::endl;
}
return EXIT_SUCCESS;
}
Éxercice 8
[modifier | modifier le wikicode]Écrire un programme qui demande à l’utilisateur de taper une chaîne de caractères et qui affiche la lettre (minuscule ou majuscule) la plus fréquente.
Cet exercice a pour but de vérifier les points techniques suivants :
- La manipulation de chaînes de caractères ;
- manipulation sur les majuscules ou minuscules ;
Voici le fichier source :
#include <iostream>
int main() {
char chaine[50];
int poidsDesLettres[52];
std::cout << "Tapez une chaîne de caractères : "; std::cin >> chaine;
// Initialisation des valeurs du tableau à zéro
for(int index = 0; index < 52; index++) {
poidsDesLettres[index] = 0;
}
int index = 0;
while (chaine[index] != '\0') {
if (chaine[index] >= 'A' && chaine[index] <= 'Z') {
poidsDesLettres[chaine[index] - 'A']++;
} else if (chaine[index] >= 'a' && chaine[index] <= 'z') {
poidsDesLettres[chaine[index] - 'a' + 26]++;
}
index++;
}
/* Affichage du nombre d’occurrences de chaque lettre. On parcours seulement la moitié
du tableau puisque l’on va afficher à la fois les minuscules et les majuscules
*/
for(int index = 0; index < (52 / 2); index++) {
// Récupération de la représentation sous forme de caractère du nombre
char minuscule = (char) index + 'a';
char majuscule = (char) index + 'A';
std::cout << "Lettre \'" << majuscule << "\' : " << poidsDesLettres[index]
<< "\t\tLettre \'" << minuscule << "\' : " << poidsDesLettres[index + 26] << std::endl;
}
int nombreMaximal = poidsDesLettres[0];
char cmax = 'A';
for(int index = 1; index < 52; index++) {
// Recherche du maximal
if (nombreMaximal < poidsDesLettres[index]) {
nombreMaximal = poidsDesLettres[index];
// Réprésentation du maximal sous forme de caractère
if (index < 26) {
cmax = (char)(index + 'A');
} else {
cmax = (char)(index - 26 + 'a');
}
}
}
std::cout << "La lettre la plus fréquente est : " << cmax << std::endl;
return EXIT_SUCCESS;
}