Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction : Pair_Impaire

    12 novembre 2018 à 14:50:24

    Bonjour à vous, 

    Je bloque sur une parti de mon exercice. Les fonctions SaisieTab et AfficheTab marchent correctement, mais je n'arrive pas à extraire les valeurs de la fonction CalculPairImpaire. J'ai très certainement fait des erreurs de pointeurs. Voici l'énoncé :

    Soit T un tableau de NMAX (=30) éléments, contenant des valeurs entières strictement positives saisies dans un ordre croissant.Le programme consistera à déterminer et à afficher parmi les valeurs de T, le nombre de valeurs paires et impaires.

    a) Ecrire la fonction SaisieTab qui permet de saisir dans un ordre croissant nb valeurs entières strictement positives (nb saisi dans la fonction main et passé en paramètres). NB: les valeurs saisies devront être vérifiées pour correspondre aux valeurs autorisées.

    b) Ecrire la fonction CalculPairImpair, qui permet de « renvoyer » le nombre de valeurs paires et le nombre de valeurs impaires présentes dans le tableau tab passé en paramètres (vous n’utiliserez pas de tableaux pour stocker le nombre de valeurs paires et impaires)

    c) Ecrire une fonction AfficheTab qui permet d’afficher les valeurs entières d'un tableau.

    d) Ecrire la fonction main qui x demande à l’utilisateur de saisir le nombre de valeurs n à rentrer dans le tableau T, x appelle la fonction SaisieTab, x appelle la fonction CalculPairImpair. x appelle la fonction AfficheTab x affiche le nombre de valeurs paires et impaires présentes dans le tableau.

    Voici ou j'en suis :

    #include <stdio.h>
    #define NBMAX 30
    
    void SaisieTab (int *tab2, int *n) {
    	int x;
    	for (int i = 0; i < *n; ++i)
    	{
    		printf("x = \n");
    		scanf("%d", &x);
    		tab2[i] = x;
    	}
    }
    
    void Affichage (int const *tab2, int *n)
    {
       int i;
       for (i = 0; i < *n; i++)
       {
          printf ("%d ", tab2[i]);
       }
       printf ("\n");
     }
    
     int Calcul (int *tab2, int *n) {
    
     	int *pair, *impaire;
     	
     	for (int i = 0; i < *n; ++i)
     	{
     		if (tab2[i] % 2 == 0) (pair++);
     			else (impaire++);
     	}
     }
    
    
    int main()
    {
    	int tab[30];
    	int n;
    	int *pair = 0;
    	int *impaire = 0;
    	
    	printf("Nombre de valeur dans le tableau : ");
    	scanf("%d", &n);
    	
    	SaisieTab(tab, &n);
    	Affichage(tab, &n);
    	Calcul(tab, &n);
    
    	printf("Nombre de cas pair : %d\n", &pair);
    	printf("Nombre de cas impair : %d\n", &impaire);
    
    
    	
    
    	return 0;
    }



    • Partager sur Facebook
    • Partager sur Twitter
      12 novembre 2018 à 15:02:07

      J'ai modifié pour qu'il marche, je poste le code puis t'explique:

      #include <stdio.h>
      #define NBMAX 30
       
      void SaisieTab (int *tab2, int *n) {
          int x;
          for (int i = 0; i < *n; ++i)
          {
              printf("x = \n");
              scanf("%d", &x);
              tab2[i] = x;
          }
      }
       
      void Affichage (int const *tab2, int *n)
      {
         int i;
         for (i = 0; i < *n; i++)
         {
            printf ("%d ", tab2[i]);
         }
         printf ("\n");
       }
       
       int Calcul (int *tab2, int *n, int *pair, int *impaire) {
           
          for (int i = 0; i < *n; ++i)
          {
              if (tab2[i] % 2 == 0) *pair = *pair + 1;
                  else *impaire = *impaire + 1;
          }
       }
       
       
      int main()
      {
          int tab[30];
          int n;
          int pair = 0;
          int impaire = 0;
           
          printf("Nombre de valeur dans le tableau : ");
          scanf("%d", &n);
           
          SaisieTab(tab, &n);
          Affichage(tab, &n);
          Calcul(tab, &n, &pair, &impaire);
       
          printf("Nombre de cas pair : %d\n", pair);
          printf("Nombre de cas impair : %d\n", impaire);
       
       
           
       
          return 0;
      }

      Alors les erreurs, en fait tu n'a pas envoyé pair et impaire par adresse quand tu appel ta fonction Calcul, alors qu'elle en a besoin!

      tu déclares tes variables dans la fonction main, ensuite tu les passes par adresse dans ta fonction Calcul, puis quand tu affiches dans ta fonction main, tu n'affiche pas les adresses avec &, tu affiches juste les variables c'est tout!

      Voilà voilà bonne fin de journée :)

      EDIT: Par contre NBMAX fonctionne pas, mais ça c'est vraiment simple alors je te laisse essayer de trouver tout seul, parce que la peut importe le nombre que tu saisies, ça passe, il faut pouvoir redemander la saisie si l'utilisateur tape un nombre > 30.

      -
      Edité par Galak1802 12 novembre 2018 à 15:06:48

      • Partager sur Facebook
      • Partager sur Twitter

      Technicien informatique, Brevet de technicien supérieur Système Numérique.

        12 novembre 2018 à 15:08:27

        Bonjour, voici le code que j'ai corrigé et qui marche :

        #include <stdio.h>
        #define NBMAX 30
         
        void SaisieTab (int *tab2, int n) {
            int x;
            for (int i = 0; i < n; i++)
            {
                printf("x = \n");
                scanf("%d", &x);
                tab2[i] = x;
            }
        }
         
        void Affichage (int const *tab2, int n)
        {
           int i;
           for (i = 0; i < n; i++)
           {
              printf ("%d ", tab2[i]);
           }
           printf ("\n");
         }
         
        void Calcul (int *tab2, int n) {
         
            int pair = 0, impaire = 0;
             
            for (int i = 0; i < n; ++i)
            {
                if (tab2[i] % 2 == 0){
                  (pair++);
        	}
                else{
                  (impaire++);
        	}
            }
        
            printf("Nombres impaire : %d", impaire);
            printf("Nombres pair : %d", pair);
         }
         
         
        int main()
        {
            int tab[30];
            int n;
                 
            printf("Nombre de valeur dans le tableau : ");
            scanf("%d", &n);
            
            if(n >= NBMAX){
        
              printf("Tableau trop grand");
              return 1;
        
            }
        
            SaisieTab(tab, n);
            Affichage(tab, n);
            Calcul(tab, n);  
         
            return 0;
        }



        • Partager sur Facebook
        • Partager sur Twitter
        la vérité se cache dans les eviers
          12 novembre 2018 à 19:05:10

          Hello,

          leach74 a écrit:

          Bonjour, voici le code que j'ai corrigé et qui marche :

          Il fonctionne sans doute, mais ne répond pas aux directives:

          PierreVoillot a écrit:

          b) Ecrire la fonction CalculPairImpair, qui permet de « renvoyer » le nombre de valeurs paires et le nombre de valeurs impaires présentes dans le tableau tab passé en paramètres (vous n’utiliserez pas de tableaux pour stocker le nombre de valeurs paires et impaires)

          Ce que tu ne fais pas.

          -
          Edité par edgarjacobs 12 novembre 2018 à 19:05:35

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            12 novembre 2018 à 19:25:34

            En prenant du recul, il faut voir "calculPairImpair"  en tant qu'action qui

            • reçoit en entrée un tableau
            • fournit en résultat deux nombres

            Revenons à C, le langage étant ce qu'il est (hélas), pour fournir un tableau, on indique deux choses en paramètres

            • le tableau C
            • sa taille
            ...... CalculPairImpair (int tableau[], int taille, ....)
            {
               ...
            }

            et pour fournir deux résultats d'un coup... il n'y a pas de moyen direct.

            Alors on contourne.

            • La solution qui est rejetée par l'énoncé, c'est de passer un tableau qui servira à récupérer les résultats
            void CalculPairImpair(int tableau[], int taille, int resultats[2])
            {
               ...
            }
            

            C'est pas idiot - c'est d'ailleurs la solution utilisée par l'appel système pipe(), pour retourner deux numéros de descripteurs - mais bon, il faut autre chose.

            • la solution présentée au dessus, c'est voir les résultats comme des "paramètres de sorties" de l'action, des trucs qui indiquent où la fonction doit placer les résultats. En C, faute de passage par référence, on passe les adresses des entiers
            void CalculPairImpair(int tableau[], int taille, int *adr_min, int *adr_max)
            {
              ...
            }
            

            Enfin, une autre solution est faire retourner une paire de nombres.... dans une structure qui représente une paire

            struct Paire {
               int min, max;
            };
            
            struct Paire CalculPairImpair(int tableau[], int taille)
            {
                struct Paire resultat;
                resultat.min = 0;
                resultat.max = 0;
            
                ...
                         if (....) resultat.min++;
                ....
            
                return resultat;
            }
            



            -
            Edité par michelbillaud 12 novembre 2018 à 19:27:30

            • Partager sur Facebook
            • Partager sur Twitter
              19 novembre 2018 à 11:27:02

              Bonjour

              Grâce à vous j'ai enfin pu comprendre un peu mieux cette histoire de pointeur ! Et en reprenant un peu mes cours j'avance plus vite maintenant. Merci à vous pour votre temps et vos explications !

              Cordialement

              • Partager sur Facebook
              • Partager sur Twitter

              Fonction : Pair_Impaire

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown