Mettre en majuscules la lettre d'un mot particulier

lili200016 Messages postés 1 Date d'inscription mercredi 1 mars 2023 Statut Membre Dernière intervention 1 mars 2023 - Modifié le 1 mars 2023 à 19:30
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 - 23 juil. 2023 à 03:20

Écrivez un programme capable de trouver une lettre donnée à l’intérieur d’un mot, entré par l’utilisateur. Le programme doit indiquer la ou les positions successives du caractère et afficher le ou les caractères trouvés en majuscules.
Exemple :
Entrer un mot : extraordinaire
Lettre à rechercher : a
Résultat : extrAordinAire
La lettre a apparaît aux positions 5 et 11.

Il me manque juste l'étape d'écrire le mot avec la lettre en majuscule. Je ne sais pas comment utiliser toupper sur une lettre en particulier d'un mot. MERCI!!!!

#include <iostream>
#include <string.h>
#include  <istream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <ctype.h>
using namespace std;
int main ()
{
  const int LongMot = 20;
  char mot[100000000], lettre[10000000];
  cout << "Entrer un mot de plus de 10 caractères : ";
  cin >> mot;
  cout << "Entrer la lettre à rechercher: ";
  cin >> lettre;

  // Positions de la lettre dans le mot
  string a = mot;
  int f; // Pas trouvée
  int i = a.find (lettre);
  f = i; // Si la lettre n'est pas trouvée du tout, f sera égal à -1
  while (i != -1)
    {
      cout << "La lettre se retrouve à la position " << i + 1 << endl;
      i = a.find (lettre, i + 1);
    }

return 0;
}

7 réponses

Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
1 mars 2023 à 07:30

BONJOUR

tu pourrais ne pas utiliser find, et à la place boucler sur le tableau de char.

Au fur et à mesure tu concatènes ta string de sortie avec le caractère ou sa majuscule.


0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
1 mars 2023 à 07:31

PS pour tes prochains posts, merci de faire comme décidé là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

0
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
Modifié le 1 mars 2023 à 08:49

Bonjour lili200016,

Voici pour ton programme un exemple qui fonctionne sous Windows.

#include <windows.h>
#include <iostream>
#include <string> 
#include <cstddef>

std::string print(const std::string tab)
{
    char* buf = new char[tab.size()+1];
    CharToOemA(tab.c_str(), buf);
    std::string str(buf);
    delete [] buf;
    return str;
}

int main ()
{
    std::string mot;
    std::cout << print("Entrez un mot de plus de 10 caractères : ");
    std::cin >> mot;
    std::cout << print("Entrez la lettre à rechercher: ");
    char lettre;
    std::cin >> lettre;
    std::size_t found = mot.find_first_of(lettre);
    std::cout << "La lettre " << lettre << print(" apparaît aux positions : ");
    while (found!=std::string::npos)
    {
        std::cout << found+1 << " ";
        mot[found] = toupper(lettre);
        found = mot.find_first_of(lettre, found+1);
    }
    std::cout << std::endl << print("Le mot modifié : ");
    std::cout << mot << std::endl;
    return 0;
}

On peut en faire des variantes. Bien cordialement, pgl10


0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 11
1 mars 2023 à 20:05

Bonjour,

attention le type retourné par std::string::find() n'est pas int, c'est std::string::size_type et s'il n'est pas trouvé la valeur n'est pas -1, c'est std::string::npos. Ton code peut marcher, mais ça n'est pas garanti.

 Pour convertir en majuscule, il faut juste convertir le caractère et tu connais sa position. Il suffit d'insérer entre les lignes 25 et 26:

        mot[i] = toupper( static_cast<unsigned char>(mot[i]) );

Voir la doc de toupper() pour comprendre pourquoi il faut faire un cast du caractère en unsigned char.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
2 mars 2023 à 10:28

Bonjour Dalfab,

Merci de rappeler que le prototype de la fonction toupper() est : int toupper(int c)
Pour cela, je propose la variante suivante.

#include <windows.h>
#include <iostream>
#include <cstddef>
#include <string>

std::string print(const std::string tab)
{
    char* buf = new char[tab.size()+1];
    CharToOemA(tab.c_str(), buf);
    std::string str(buf);
    delete [] buf;
    return str;
}

int main ()
{
    std::string mot;
    std::cout << print("Entrez un mot de plusieurs caractères : ");
    std::cin >> mot;
    char lettre;
    std::cout << print("Entrez la lettre à rechercher : ");
    std::cin >> lettre;
    int code = static_cast<int>(lettre);
    while (code < 97 || code > 122)
    {
        std::cout << "Il faut une minuscule, recommencez : ";
        std::cin >> lettre;
        code = static_cast<int>(lettre);
    }
    std::size_t found = mot.find_first_of(lettre);
    std::cout << "La lettre " << lettre << print(" apparaît aux positions : ");
    while (found != std::string::npos)
    {
        std::cout << found+1 << " ";
        mot[found] = toupper(lettre);
        found = mot.find_first_of(lettre, found+1);
    }
    std::cout << std::endl << print("Le mot modifié : ");
    std::cout << mot << std::endl;
    return 0;
}

Voici deux commentaires au sujet de l'instruction : mot[found] = toupper(lettre);
1°) La variable lettre de type char est convertie implicitement en type int. Et sa valeur est comprise entre 97 et 122.
2°) La page https://cplusplus.com/reference/string/string/find_first_of/  montre que le type std::size_t et le type std::string::size_type sont identiques. Et sa valeur ne peut pas être std::string::npos à cet endroit.

Bien cordialement, pgl10

0
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
Modifié le 2 mars 2023 à 15:44

Bonjour tous,

Avec le code source ci-joint la variable mot, de type std::string, qui est lue avec l'instruction : std::cin >> mot; comporte nécessairement une suite de caractères sans aucun caractère <espace>. Mais si on souhaite aussi pouvoir lire dans la variable mot une phrase qui comporte plusieurs mots séparés avec le caractère <espace> c'est très facile : il suffit de remplacer l'instruction : std::cin >> mot; par l'instruction : std::getline (std::cin, mot);

De plus, avec un contrôle différent dans l'instruction : while (code < 97 || code > 122) la lettre donnée par l'utilisateur pourrait aussi être l'un des caractères suivants : àáâãäåæçèéêëìíîïðñòóôõöùúûüý qui ont une majuscule dans la liste des codes ASCII de 0 à 255.

0
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
23 juil. 2023 à 03:20

Bonjour,

A moins d'avoir des accents ou de l'unicode pas besoin de passer par des fonctions complexes.

En effet, une simple soustraction ASCII permet de passer d'une minuscule à la majuscule :
 

#include <iostream>
#include <iomanip>
#include <list>
using namespace std;

const int TAILLE_MOT_MAX = 1024;
const int TAILLE_MOT_MIN = 10;

int main ()
{
	// Variables
	char mot[TAILLE_MOT_MAX];
	char lettre[2] = {0, 0};
	int len = 0;
	list<int> positions;
	
	// Saisies
	while (len < TAILLE_MOT_MIN) 
	{
		cout << "Entrer un mot de plus de " << TAILLE_MOT_MIN << " caracteres : ";
		cin >> setw(TAILLE_MOT_MAX) >> mot;
		len = strlen(mot);
		if (len < TAILLE_MOT_MIN)
		{
			cout << "Le mot fait moins de " << TAILLE_MOT_MIN << " caracteres !" << endl;
		}
	}	
	while (lettre[0] < 'a' || lettre[0] > 'z')
	{
		if (lettre[0] != 0)
		{
			cout << "Lettre saisie invalide !" << endl;
		}
		cout << "Entrer la lettre a rechercher: ";
		cin >> setw(2) >> lettre;
	}

	// Recherche / remplacement du mot
	for (int i = 0; i<len; ++i)
	{
		if (mot[i] == lettre[0])
		// Lettre trouvée
		{
			// Passer en majuscule
			mot[i] -= 'a' - 'A';
			
			// Mémoriser la position
			positions.push_back(i+1);
		}
	}

	// Afficher le résultat
	cout << "Resultat : " << mot << endl;
	for (int position : positions)
	{
		cout << "La lettre " << lettre[0] << " se retrouve a la position " << position << endl;
	}

	return 0;
}

0
Rejoignez-nous