IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Prog mettant en oeuvre les pointeurs.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Par défaut Prog mettant en oeuvre les pointeurs.
    Bonsoir, j'écris une petit prog dans lequel j'entre une phrase et ou je dois compter le nombre de consonnes et voyelles.
    Voilà ce que j'ai fait, mais je coince parce que en fait bah ca compte pas
    Je commence un peu les pointeurs donc pastappez ;D

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    void comptage(char tab[], int *pVoy, int *pCons)
    {
    	int i;
    	for(i=0; i<90; i++)
    		{
    			if(tab[i] == 'a' || tab[i] == 'e' || tab[i] == 'i' || tab[i] == 'o' || tab[i] == 'u' || tab[i] == 'y' )
    				*pVoy++;
    			else
    				*pCons++;
    		}
     
    }
    int main(int argc, char *argv[])
    {
     
    	char tab[90];
    	int nbVoy = 0, nbCons = 0;
     
    	int *pVoy = &nbVoy;
    	int *pCons = &nbCons;
     
    	puts("Entrez une phrase");
    	fgets(tab, sizeof tab, stdin);
    	printf("Vous avez entre: ");
    	puts(tab);
    	comptage(tab, pVoy, pCons);
    	printf("Dans votre phrase, il y a %d voyelles\n", *pVoy);
    	printf("Dans votre phrase, il y a %d consonnes\n", *pCons);
    	system("pause");
    }
    Merci à tous.

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Ça ne compte pas !

    La cause est du à la priorité des opérateurs de déréférencement et d'incrémentation dans la fonction comptage.

    Il y a d'autre erreurs, par exemple le comptage des consonnes n'est pas bon, car les espaces et autre caractères comme la ponctuation sont comptée comme consonnes. Aussi tu comptes sur la totalité du tableau même si la chaîne de caractères est plus courte.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Par défaut
    Oui, c'est en cours de correction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    void comptage (const char tab[], int * const pVoy, int * const pCons,const int len) // le parametre const permet de dire au compilateur
    {																	 //la modification des caractères de tab. 
    	int i;															//si tu modifies la chaîne dans la fonction, 
    	for(i=0; i< len; i++)												//le compilateur emettra une erreur. 
    		{
    			if(tab[i] == 'a' || tab[i] == 'e' || tab[i] == 'i' || tab[i] == 'o' || tab[i] == 'u' || tab[i] == 'y' )
    				(*pVoy)++;
    			else
    				(*pCons)++;
    		}
     
    }
    int main(int argc, char *argv[])
    {
     
    	char tab[90];
    	int nbVoy = 0, nbCons = 0;
    	int *pVoy = &nbVoy;        // Solution 2: Supprimmer ces deux lignes.
    	int *pCons = &nbCons;		
    	int len=0;
     
    	puts("Entrez une phrase");
    	fgets(tab, sizeof tab, stdin);
    	printf("Vous avez entre: ");
    	puts(tab);
    	len = strlen(tab) ;
    	comptage(tab, pVoy, pCons,len);         // Mettre ici comptage(tab, &nbVoy, &nbCons); 
    	printf("Dans votre phrase, il y a %d voyelles\n", *pVoy); // Soit *pVoy soit nbVoy car: *pVoy = nbVoy
    	printf("Dans votre phrase, il y a %d consonnes\n", nbCons);
    	system("pause");
    }
    Mais là j'ai encore les espaces en trop, je suis dessus ;D

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Quelques remarques :

    - Tu passes à la fonction la longueur de la chaine, len, que tu calcules dans le main(). Logiquement, c'est la fonction qui devrait la déterminer et le paramètre len devrait être une simple variable locale.

    - Cette longueur est obtenue par strlen(). Or ta fonction doit parcourir la chaine pour effectuer le comptage. Ceci amène à parcourir deux fois la chaine. Puisque tu dois parcourir la chaine, pourquoi ne pas détecter toi-même sa fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void comptage (const char tab[], int * pVoy, int * pCons) 
    {
    	int i =0 ;
    	while(tab[i]!= '\0') 											
    	{
    ....
               i++;       
            }	
    }
    - Il est la plupart du temps inutile de spécifier en const les paramètres de la fonction (comme pVoy ou pCons): la fonction ne peut de toute façon pas modifier les arguments correspondants. Par contre, il est utile de spécifier const les objets dont on passe l'adresse (comme dans le cas de tab où on spécifie que les char sont constants mais pas que tab est constant)

    - Puisque tu t'exerces aux pointeurs, utilise les complétement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void comptage (const char tab[], int * pVoy, int * pCons) 
    {
    	while(*tab!= '\0') 											
    	{
              if(*tab == 'a' || ....
    ....
               tab++;       
            }	
    }
    - Tu peux utiliser des adresses sans créer d'objets pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comptage(tab, &nbVoy, &nbCons);

Discussions similaires

  1. [LG]Les pointeurs: Forme en "Anneaux"
    Par k o D dans le forum Langage
    Réponses: 4
    Dernier message: 20/10/2004, 07h29
  2. Réponses: 4
    Dernier message: 13/08/2004, 18h39
  3. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31
  4. pointeurs, toujours les pointeurs :/
    Par giviz dans le forum C
    Réponses: 16
    Dernier message: 08/10/2003, 15h02
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo