[C++] Comptage de caractères sur tableaux

Fermé
Biloo - 13 nov. 2010 à 22:58
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 14 nov. 2010 à 00:01
Bonsoir à tous :)

Désolé de demander de l'aide comme ça, mais je peut vous assurer que j'ai vraiment cherché :(

Mon but est d'écrire un programme qui lit un texte jusqu'au caractère STOP='$', place les caractères dans un tableau, et qui,
dans ce tableau :
- remplace tous les caractères de ponctuation par un espace.
- remplace les fins de ligne par un espace.
- remplace toute suite de plusieurs espaces par un seul.

Jusque là, ça va.

Ensuite, je dois compter :
- le nombre total de caractères du texte,
- le nombre de caractères majuscules,
- le nombre de mots,
- la longueur moyenne et maximale des mots du texte.

Et là, ça me donne n'importe quoi. En fait, il y a des caractères bizarres qui se stockent dans mon tableau, et qui crée des erreurs dans le comptage.

Mon code est :

------------------------------------------------------------------------

#include <iostream>
#include <cstring>
#include <string>
using namespace std;

int main()
{
int i,a,n;
const int MAX=100;
const char STOP='$';
char tab[MAX],c;

i=0;
//a est le compteur d'espace
a=0;


cout <<"Entrez une phrase ponctuee et terminer par "<<STOP<<endl;

/* Saisie (sans delimiation par espace) dans un tableau avec STOP comme valeur d'arrêt */
cin.get(c);
while (c != STOP)
{
tab[i] = c;
cin.get(c);
i++;
}


for (i=0; i<=MAX; i++)
{
c=tab[i];

// Verification des espaces multiple et decalage du tableau pour reduire à un espace.

if ((tab[i]==' ')&&(tab[i+1]==' '))
//On effectue le decalage tant que la valeur i et i+1 du tableau sont des espaces.
{
while ((tab[i]==' ')&&(tab[i+1]==' '))
{
for (n=i;n<MAX;n++)
tab[n]=tab[n+1];

}
}

// Remplace les valeur suivante (ponctutation retour à la ligne...) par un espace
if ((c=='\n')||(c=='!')||(c==',')||(c=='.')||(c==':')||(c=='?')||(c==' '))
{
tab[i]=' ';
a++;

}


}

cout<<"Il y a "<< strlen(tab)<<" caractere(s) dans ce texte " <<endl<<endl;
cout<<"il y a "<<a<<" mot(s)"<< endl;
cout <<tab<<endl;



return 0;
}

--------------------------------------------------------------------------------------------


Voici des résultats : en dessous de 9 caractères, ça affiche toujours 9 au comptage. Au-dessus de 9, ça met un bon résultat une fois sur deux.
Quant au mots, c'est assez irrégulier (je n'ai pas encore traité les majuscules et la moyenne)

Je précise que je n'ai pas le droit au cin.getline(), mais seulement au cin.get() (hélas...)

Si quelqu'un pouvais m'aider, je lui en serais vraiment très reconaissant

Merci d'avance ^^
A voir également:

9 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 13/11/2010 à 23:07
Tu parles de caractères en C++, moi je pense std::string !
Finalement ce que tu fais c'est du C, et à mon avis tu as oublié de décaler '\0' à chaque fois.
La confiance n'exclut pas le contrôle
0
Ah oui, j'ai oublié de dire, string interdit... ^^
Merci quand même :)
0
T'aurais pas une autre idée ? ^^"
0
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
13 nov. 2010 à 23:28
Bonjour,
A mon avis strlen(tab) c'est pas bon : strlen calcule la taille d'une string et pas d'un tableau.
Pour calculer la taille d'un tableau tu peux faire sizeof(tab).
Le problème là c'est que ton tableau est statique char tab[MAX] (donc dans tous les cas, sizeof(tab) te retournera 100)
Donc je te conseille soit de faire un char* tab que tu alloueras dynamiquement
soit tu utilises les vector (dans ce cas ne pas oublier #include<vector> puis pour la déclaration vector<char> tab ;
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
13 nov. 2010 à 23:40
Si strlen(tab) fonctionne très bien.
0

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

Posez votre question
Merci de ta réponse, mais on est vraiment très limités...
L'allocation dynamique et les vector ne sont pas pour tout de suite pour nous^^

Merci en tout cas :)

Tu me conseillerais pas de remplacer le strlen par un compteur ?
0
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
13 nov. 2010 à 23:46
dans ce cas tu peux parcourir ton tableau mais il faut que tu stockes le "$" aussi.
tu crées ton tableau et tu l'initialises (par exemple que des 'x').
Si tu as déclaré par exemple un tab de 5 caractères et que tu rentres la chaine to$, ton tableau aura donc (t o $ x x).
Ensuite tu parcours ton tableau, et tu incrémentes un compteur au fur et à mesure des cases et quand tu tombes sur le $ tu t'arrêtes : comme ça tu devrais avoir la taille du tableau
0
Pourquoi que des 'x' ? Initialiser la taille n'est-elle pas suffisante ? D'ailleurs, comment tu fais pour mettre que des 'x' dans ton tableau?
0
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
13 nov. 2010 à 23:59
Alors non initialiser la taille je ne pense pas que ce soit suffisant car dans ton tableau on ne sait pas vraiment ce qu'il y a au départ......
Alors pourquoi des 'x' ? Bonne question ! Tu peux mettre aussi des '0' ou autre chose....peut-être même mettre NULL ça marcherait !

alors pour remplir un tableau c'est tout simple :
	for (int i=0;i<MAX;i++)
		tab[i] = NULL ;
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 14/11/2010 à 00:02
Bonjour,

strlen fonctionne très bien.
Et pour ma part tu peux utiliser un tableau de char comme tu le fais avec une taille statique. Le but de l'exercice, je pense, ne se situe pas à ce niveau.

Sinon, une petite erreur :
Tu parcours de 0 à MAX inclus. Tu parcours donc un caractère hors chaîne. D'autant plus que tu fais une lecture parfois avec i+1 dans la boucle...

Ensuite, l'algorithme n'est pas correct.
Tu regardes les espaces consécutifs et après tu traites les signes de ponctuations. Imagine la chaîne "cou ?cou".
Avec ton algorithme, tu obtiendras "cou cou" (deux espaces), au lieu de "cou cou".

Si l'utilisateur est un peu farceur, par exemple qu'il rentre une chaîne "cou $ cou", ton programme ne s'arrêtera pas au caractère '$'. Il faut traiter ce cas.

Dans les caractères de ponctuations, tu n'es pas exhaustif. Il manque l'apostrophe, le point virgule et quelques autres. Je te conseille de faire une fonction, cela te facilitera le code.

Cdlt,

Google is your friend
0