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 :

comparaison de 2 tableaux 1 dimension


Sujet :

C

  1. #1
    Membre confirmé Avatar de zozoman
    Homme Profil pro
    Futur ex-prof
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Futur ex-prof
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut comparaison de 2 tableaux 1 dimension
    Bonjour à tous,

    Je fais un programme de détermination du PGCD, PPCM. Ce programme va être transformé et je ferai apparaitre des fonction quand il sera opérationnel.

    Je voudrais comparer les valeurs de mes deux tableaux et prendre la plus grande. J'ai fait deux boucles for mais il semble que le programme sort immédiatement des boucles. Je ne vois pas l'erreur.

    Merci de m'aider

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #include <stdio.h>
    #include<conio.h>
    #include<math.h>
     
    int main(int argc, char *argv[])
     
    {
        int nombre1_entre = 0;
        int nombre2_entre = 0;
        int tableau_diviseurs_de_nombre1[100]={1};
        int tableau_diviseurs_de_nombre2[100]={1};
        int position_diviseur_nombre1 = 1;
        int position_diviseur_nombre2 = 1;
        int boucle_diviseurs_nombre1 = 0;
        int boucle_diviseurs_nombre2 = 0;
        int commun_diviseur = 1;
        int diviseur;
     
        printf("Ce programme permet de déterminer le PGCD et le PPCM de deux nombres donnes\n\n");
        printf("\n\nEntrez le premier nombre : ");
        scanf("%d",&nombre1_entre);
        printf("\n\nEntrez le second nombre : ");
        scanf("%d",&nombre2_entre);
     
        //  Détermination de tous les diviseurs de nombre1_entré
     
        diviseur = 0;
        printf("\n\nListe de tous les diviseurs du premier nombre : \n\n%d\t",tableau_diviseurs_de_nombre1[0]);
        for(diviseur = 2 ; diviseur <= nombre1_entre ; diviseur++)
        {
            if (nombre1_entre%diviseur==0 && diviseur<=nombre1_entre)
            {
                tableau_diviseurs_de_nombre1[position_diviseur_nombre1]=diviseur;
                printf("%d\t",tableau_diviseurs_de_nombre1[position_diviseur_nombre1]);
                position_diviseur_nombre1++;
            }
        }
        printf("\n\n");
     
        // Détermination de tous les diviseurs de nombre2_entré
     
        diviseur = 0;
        printf("\n\nListe de tous les diviseurs du deuxieme nombre : \n\n%d\t",tableau_diviseurs_de_nombre2[0]);
        for(diviseur = 2 ; diviseur <= nombre2_entre ; diviseur++)
        {
            if (nombre2_entre%diviseur==0 && diviseur<=nombre2_entre)
            {
                tableau_diviseurs_de_nombre2[position_diviseur_nombre2]=diviseur;
                printf("%d\t",tableau_diviseurs_de_nombre2[position_diviseur_nombre2]);
                position_diviseur_nombre2++;
            }
        }
        printf("\n\n\n");
     
        //  Déterminations des diviseurs communs
     
        for (boucle_diviseurs_nombre1 = 0 ; boucle_diviseurs_nombre1 == position_diviseur_nombre1 ; boucle_diviseurs_nombre1++);
        {
            printf("%d\t%d\n",boucle_diviseurs_nombre1,boucle_diviseurs_nombre2);
            for (boucle_diviseurs_nombre2 = 0 ; boucle_diviseurs_nombre2 == position_diviseur_nombre2 ; boucle_diviseurs_nombre2++)
            {
                if (tableau_diviseurs_de_nombre1[boucle_diviseurs_nombre1] == tableau_diviseurs_de_nombre2[boucle_diviseurs_nombre2] && tableau_diviseurs_de_nombre1[boucle_diviseurs_nombre1] !=0 && tableau_diviseurs_de_nombre2[boucle_diviseurs_nombre2] !=0)
                {
                    commun_diviseur = commun_diviseur * tableau_diviseurs_de_nombre1[boucle_diviseurs_nombre1];
                }
            }
        }
     
        printf("Le PGCD de %d et de %d est %d\n\n\n",nombre1_entre,nombre2_entre,commun_diviseur);
     
        return 0;
     
    }

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    un peu difficile à lire (plus pour la longueur que pour l'utilisation de variables bien nommées )
    Je dirai en première lecture que tes dernières boucles for sont un peu fausse
    for(i=0; i==12; i++) par exemple ne fait pas grand chose ... je suppose que tu voulais écrire un for(i=0; i!=12; i++) ?

    Edit: de plus for(i=0;i!=12;i++); ne fait pas grand chose.

    Question : la dernière partie calcule quoi exactement ?

  3. #3
    Membre confirmé Avatar de zozoman
    Homme Profil pro
    Futur ex-prof
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Futur ex-prof
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    Merci pour ton aide

    voici ce que je voulais faire :

    les diviseurs de nombre_entre1 sont dans tableau1
    les diviseurs de nombre_entre2 sont dans tableau2

    on compare les nombres 1 à 1 de tableau1 et tableau2
    Si un nombre commun est trouvé, on le multiplie à PGCD initialisé à 1

    le != ne change pas le résultat (=1)

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Il doit aussi y avoir un ; mal placé après le premier for ...
    Je ne pense pas que ton algo soit correct.

  5. #5
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Tout d'abord félicitation de faire l'effort d'essayer d'utiliser des bon noms de variables. Par contre, il ne faut pas qu'une variable contienne son type, c'est-à-dire que les noms styles "tableau_de_..." sont à proscrire car ça ne sert à rien.

    Il faut toujours essayer de trouver des noms les plus compréhensibles, entre deux noms aussi compréhensible l'un que l'autre on choisira le plus court. (En tout cas je pense que c'est une bonne règle).

    La technique du calcul du pgcd n'est pas génial et il y a des algorithmes plus performant, comme le fameux algo d'euclide pour le pgcd, ce sont des algo bateau donc je te copie/colle ça en bas, libre à toi de ne pas regarder ;-)

    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
    // pre : b != 0 && a > b
    long int pgcd(long int a, long int b)
    {
      long int r;
      while((r = a % b))
      {
        a = b;
        b = r;
      }
      return b;
    }
     
    // pre : a and b != 0
    long int ppcm(int a, int b)
    {
      return a*b / ((a > b) ? pgcd(a, b) : pgcd(b,a));
    }
    Autre chose, tes deux premières boucles trouvent les diviseurs d'un nombre mais ne sont pas performantes ! Une simple amélioration serait de s'arrêter lorsqu'on dépasse la moitié du nombre. (En effet, n n'est pas divisible par (n/2) + 1) ou encore de commencer à 2 si le nombre est paire ou à 3 s'il est impaire (et d'incrémenter de 2 par 2).

  6. #6
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut confusion
    salut !

    si tu fais le produit des diviseurs communs, tu n'as pas le pgcd :
    diviseurs_communs(8, 12 ) = {1, 2, 4}
    en fait pgcd signifie plus grand commun diviseur et pas produit. je crois que tu confond avec l'utilisation de la décomposition en facteurs premiers. mais ce n'est pas un bon algorithme ici.

    rien n'est plus performant que l'algorithme d'Euclide pour le pgcd.

    @Trademark
    // pre : b != 0 && a > b
    le a > b est inutile mais un antispoil
    // Voir plus bas, évite ainsi le spoil.
    pour un algo vieux de 2500 ans me semble nuisible.

    A+

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zozoman Voir le message
    Ce programme va être transformé et je ferai apparaitre des fonction quand il sera opérationnel.
    Salut

    Mauvaise approche. C'est comme si tu disais "je vais construire une maison et je ferai apparaitre les fondations quand elle sera construite".
    Les fonctions ne sont pas des buts à atteindre mais des outils. Si tu commences par réfléchir à "comment résoudre ton problème" puis "comment décomposer les différentes taches" les fonctions arriveront toutes seules et tu gagneras du temps dans ton codage (à éviter de répéter certains algorithmes)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 12h14
  2. [MySQL] Comparaison des tableaux 2 dimensions en PHP
    Par hessaid dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 28/06/2008, 21h36
  3. [Tableaux] Comparaison de 2 tableaux
    Par vodasan dans le forum Langage
    Réponses: 9
    Dernier message: 10/01/2008, 08h51
  4. Tableaux à plusieurs dimensions
    Par Diabolik dans le forum Assembleur
    Réponses: 3
    Dernier message: 08/12/2003, 12h15
  5. [langage] erreurs utilisation tableaux 2 dimensions
    Par drosof dans le forum Langage
    Réponses: 11
    Dernier message: 01/07/2003, 11h44

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