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 :

Comparer les valeurs de deux tableaux


Sujet :

C

  1. #1
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut Comparer les valeurs de deux tableaux
    Bonsoir, j'ai deux tableaux déclarés comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int tableau[5];
    const int tableau_autorise[10]={1,2,3,4,5,6,7,8,9,10};
    Dans mon code l'utilisateur donne des valeurs à mon premier tableau, et j'aimerai comparer si les valeurs entrées dans ce tableau sont comprises dans celles de tableau_autorise.

    J'ai commencé à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        for (i=0; i < 5; i++)
        {
            for (j=0; j < 10; j++)
            {
                if (tableau[i] != tableau_autorise[j])
                {
                    ???
                }
            }
        }

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Bonsoir,

    Les indices des tableaux vont de 0 à N-1
    Tes boucles for ne sont donc pas correctes.

  3. #3
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut
    Effectivement, j'ai rectifié. Mais ce que j'aimerai c'est après ma boucle pouvoir dire :

    Les valeurs saisies dans tableau appartienne ou n'appartiennent pas à tableau_autorise.

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Et bien voilà, tu y as fais le plus dur. Le code que tu as posté sera typiquement dans une fonction "int valide(const int *tab, const int *ref)", donc à l'intérieur du if tu fais un "return 0", et après la boucle extérieure tu fais un "return 1".

  5. #5
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut
    Mais imaginons que l'utilisateur entre la valeur 3 pour tableau[0], la boucle va d'abord comparer tableau[0] et tableau_autorise[0].

    Elle va renvoyer 0 car 3 =/= 1, or 3 est une valeur autorisé dans tableau_autorise.

    En fait je veux verifier que les valeurs de tableau soient dans tableau_autorise, peu importe si c'est dans le désordre.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Tu retournes 1 si tu trouves le nombre. Une fois la boucle finie (c'est-à-dire : si rien n'est trouvé), tu retournes 0.

    Tu t'es trompé d'opérateur dans ton "if".

    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
     /* à compléter */
    int fonction( .... )
    {
         for (i=0; i < 5; i++)
        {
            for (j=0; j < 10; j++)
            {
                if (tableau[i] == tableau_autorise[j])
                {
                    return 1;
                }
            }
        }
        return 0;
    }
    EDIT :
    Par contre, la fonction renverra 1 si au moins l'une des valeurs est trouvée dans le second tableau, parmi tes 5 valeurs de ton premier tableau.
    Je ne sais pas si c'est ce que tu veux faire. Donne plus de précisions.

  7. #7
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut
    Oui, toutes les valeurs saisies dans ce tableau doivent apparaître dans tableau_autorise.

    Après je vais demander à l'utilisateur de re-saisir la/les valeur(s) "fausse(s)".

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Oui, toutes les valeurs saisies dans ce tableau doivent apparaître dans tableau_autorise.

    Après je vais demander à l'utilisateur de re-saisir la/les valeur(s) "fausse(s)".
    C'est pour ça qu'il faut bien préciser les questions, car j'avais compris ta question différemment.
    Dans ce cas, reste sur la solution de matafan.

    Tu vérifies pour chaque valeur de ton tableau 1 toutes celles du tableau 2. Si tu as parcouru tout le tableau 2 sans trouver aucune égalité avec la valeur courante du tableau 1, tu retournes la valeur 0. Pour cela, tu peux, dès une égalité trouvée, provoquer une sortie forcée de la boucle imbriquée via un "break". A la sortie de cette boucle, tu testes si j est égal à 10. Si c'est le cas, c'est que tu as parcouru tout le tableau sans rien trouver ; dans ce cas, tu retournes 0.

    A la sortie de ta première boucle, tu retournes 1 d'office : cela veut dire que tout le tableau a été scanné avec succès car sinon une valeur 0 aurait été retournée avant d'arriver jusque là.

  9. #9
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    Bonjour,
    Vous pourriez sérier les difficultées, pour rendre votre code plus lisible et plus maintenable. Par exemple une fonction isIntInTab() utilisée par une fonction isTabInTab():
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    #define MAXVALS 15
     
    static int isIntInTab(int value){
    	static int tableau_autorise[MAXVALS] = {1, 3, 5, 7, 9, 11};
    	int idx;
    	for(idx = 0; idx < MAXVALS; idx++){
    		if(value <= tableau_autorise[idx]){
    			return (value == tableau_autorise[idx]);
    		}
    	}
    	return 0;
    }
     
    static int isTabInTab(const int* tab, int tabsize){
    	int idx;
    	for(idx = 0; idx < tabsize; idx++){
    		if(!isIntInTab(tab[idx])){
    			return 0;
    		}
    	}
    	return 1;
    }
     
     
    int main(void) {
    	const int tableau[]={1, 3, 5, 7, 9, 1, 3, 5, 7, 11};
    	printf("%s\n", isTabInTab(tableau, sizeof tableau / sizeof tableau[0])? "OK" : "ERROR") ;
    	return EXIT_SUCCESS;
    }
    Vous pouvez éliminer les return multiples avec un break par exemple. Vous pouvez constater qu'avec deux fonctions, vous arrêtez le test proprement dès que vous savez qu'il échoue.
    J'ai mis tableau_autorise en static dans isIntInTab(), ça sous-entend qu'il est petit, et la création d'un setter avec tri, par exemple. En fait, il faudrait savoir la taille de tableau_autorise, et s'il change jamais au run-time, souvent ou rarement. Enfin, j'utilise le fait qu'il est trié, mais il semble que rien n'empêche de le trier.

  10. #10
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut
    @Pierre : J'ai testé ton code et effectivement ca marche bien, je n'aurai jamais codé quelque chose comme ça moi même^^ Et j'ai du mal à le comprendre donc je vais avoir du mal à l'ajouter dans mon code je pense ><

    Citation Envoyé par jeroman Voir le message
    C'est pour ça qu'il faut bien préciser les questions, car j'avais compris ta question différemment.
    Dans ce cas, reste sur la solution de matafan.

    Tu vérifies pour chaque valeur de ton tableau 1 toutes celles du tableau 2. Si tu as parcouru tout le tableau 2 sans trouver aucune égalité avec la valeur courante du tableau 1, tu retournes la valeur 0. Pour cela, tu peux, dès une égalité trouvée, provoquer une sortie forcée de la boucle imbriquée via un "break". A la sortie de cette boucle, tu testes si j est égal à 10. Si c'est le cas, c'est que tu as parcouru tout le tableau sans rien trouver ; dans ce cas, tu retournes 0.

    A la sortie de ta première boucle, tu retournes 1 d'office : cela veut dire que tout le tableau a été scanné avec succès car sinon une valeur 0 aurait été retournée avant d'arriver jusque là.
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int fonction( .... )
    {
         for (i=0; i < 5; i++)
        {
            for (j=0; j < 10; j++)
            {
                if (tableau[i] == tableau_autorise[j])
                    break;
            }
            if (j == 10)
                return 0;
        }
        return 1;
    }
    ?

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Si ton tableau est déjà rempli et que tu veux corriger, au fur et à mesure, les valeurs inadéquates, tu peux t'inspirer de ce genre de code :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <stdio.h>
     
    int fonction(int * tableau, int taille_tableau, int const * const tableau_autorise , int taille_tableau_autorise , int i, int * p_erreur_indice_tableau)
    {
    	int j;
     
    	for ( ; i < taille_tableau ; i++)
    	{
    		for ( j = 0 ; j < taille_tableau_autorise; j++ )
    		{
    			if ( tableau[i] == tableau_autorise[j] )
    			break;
    		}
    		if (j == taille_tableau_autorise)
    		{
    			*p_erreur_indice_tableau = i;
    			return 0;
    		}
    	}
    	return 1;
    }
     
    int main(void)
    {
    	int tableau[5] = { 0 , 6 , 10 , 11 , 10 }; /* valeurs au pif */
    	const int tableau_autorise[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
    	int erreur_indice_tableau;
    	int taille_tableau, taille_tableau_autorise;
    	int i;
     
    	taille_tableau = sizeof tableau / sizeof tableau[0];
    	taille_tableau_autorise = sizeof tableau_autorise / sizeof tableau_autorise[0];
     
    	printf("Valeurs autorisees : ");
    	for ( i = 0 ; i < taille_tableau_autorise ; i++ )
    		printf("%d " , tableau_autorise[i] );
    	printf("\n\n");
     
    	printf("Contenu du tableau : ");
    	for ( i = 0 ; i < taille_tableau ; i++ )
    		printf("%d " , tableau[i] );
    	printf("\n\n");
     
    	i = 0;
    	while ( !fonction(tableau , taille_tableau , tableau_autorise , taille_tableau_autorise , i , &erreur_indice_tableau) )
    	{
    		printf("La valeur a l'indice %d (valeur %d) du tableau n'est pas correcte. Entrez une nouvelle valeur : " , erreur_indice_tableau , tableau[erreur_indice_tableau]);
    		scanf("%d" , &tableau[erreur_indice_tableau]);
    		i = erreur_indice_tableau ;
    	}
     
    	printf("\nLe tableau a ete scanne avec succes. Voici son contenu : ");
    	for ( i = 0 ; i < taille_tableau ; i++)
    		printf("%d " , tableau[i] );
    	printf("\n");
     
    	return 0;
    }
    Par contre, si ton tableau n'est pas déjà rempli mais que tu comptes le remplir au fur et à mesure, il faudra modifier ce code car il ne conviendra pas.

  12. #12
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut
    Merci jeroman, j'ai réussi a intégrer ce code dans mon programme et ca a l'air de plutot tres bien marcher^^

    Sauf si j'ai le malheur d'entrer un char dans le tableau, ce qui donne une boucle infinie, je vais essayer de régler ca.

  13. #13
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Points : 133
    Points
    133
    Par défaut
    Utiliser des entier pourrait aussi être adapté non ?

    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
    int fonction( .... )
    {
         int bool;
         int bool2 = 0;
         for (i=0; i < 5; i++)
        {
            bool=0;
            for (j=0; j < 10; j++)
            {
                if (tableau[i] == tableau_autorise[j])
                {
                    bool = 1;
                }
            }
             if(bool==1)
             {
                 bool2++;
             }
        }
        if (bool2==5)
        {
            return 1;
        }
        return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/03/2013, 18h38
  2. Comparer les valeurs de deux colonnes d'une feuille excel
    Par charrynsasi dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/12/2012, 14h40
  3. comparer les éléments de deux tableaux
    Par Nayra dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 26/11/2010, 16h26
  4. [MySQL] Comparer les valeurs de 2 tableaux serialisés dans une requête
    Par lodan dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/05/2010, 08h59
  5. [DeskI XiR2] Comparer les valeurs de deux colonnes
    Par EmmanuelleC dans le forum Débuter
    Réponses: 2
    Dernier message: 27/02/2009, 08h45

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