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 :

[Paradoxe des anniversaires] Plantage du programme


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Points : 9
    Points
    9
    Par défaut [Paradoxe des anniversaires] Plantage du programme
    Bonjour,

    Ci-dessous, j'ai essayé de détailler un maximum mon problème.

    Le paradoxe des anniversaires : quelle est la probabilité P que sur n personnes, au moins 2 aient le même anniversaire (représenté par un nombre entre 1 et 365).

    Je dois écrire un programme qui simule cette expérience (j'utilise Code Blocks sous Windows).
    Je dois faire un tirage aléatoire pour les n anniversaires, je mets ces valeurs dans un tableau et je fais m fois ce tableau (donc une double boucle selon moi).
    Ensuite, je regarde combien de tableaux (parmi les m) comportent au moins 2 anniversaires identiques.


    D'abord je vous fais une liste de ce qui se trouve dans mon programme :
    - La fonction Random, je l'ai trouvée sur Internet, et cela nécessitait l'emploi de l'instruction srand (time (NULL));
    - La fonction verif, est une fonction que j'ai codée pour vérifier si 2 éléments consécutifs du tableau sont identiques ("consécutifs" parce que je l'utilise après quickSort). Elle est censée renvoyer 0 si non et 1 si oui
    - echanger est appelée par quickSort, je les ai trouvées sur Internet. quickSort trie le tableau par ordre croissant, j'ai testé plusieurs fois sur un tableau de taille 10 et ça marchait bien donc je ne pense pas que le problème vienne de là
    - Et enfin, le main est de moi sauf pour le srand (time (NULL));
    Les variables i, j, k sont dédiées aux boucles, et c est le compteur. Il augmente de 1 à chaque fois qu'un tableau contient 2 éléments identiques.


    J'ai plusieurs soucis (testé sur 2 ordinateurs différents) :

    1) si n>7 le programme plante. Et j'aimerais bien pouvoir aller jusqu'à 25 (classe d'élèves par exemple)

    2) si n>4 alors il ne fera qu'un tableau. Par exemple n=4 et m=1000 ça marche, il me sort bien 1000 tableaux différents de 4 éléments, mais pour n=5 et m=2, il ne m'en sort qu'un.

    3) la variable c prend toujours la 4ème valeur du dernier tableau, et ça, ça me laisse vraiment perplexe, et j'ai tendance à penser que ma fonction verif n'est pas top top.


    Merci d'avance pour votre aide !

    Voici le 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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <conio.h>
     
    int Random (int _iMin, int _iMax)
    {
    return (_iMin + (rand () % (_iMax-_iMin+1)));
    }
     
    int verif(int n, int t[n])
    {
        int conforme;
        int i;
     
        conforme=0;
        i=0;
     
        while (i<n-1)
        {
            if (t[i]==t[i+1])
            {
                conforme=1;
            }
            i++;
        }
     
        return (conforme);
    }
     
    void echanger(int tableau[], int a, int b)
    {
        int temp = tableau[a];
        tableau[a] = tableau[b];
        tableau[b] = temp;
    }
     
    void quickSort(int tableau[], int debut, int fin)
    {
        int gauche = debut-1;
        int droite = fin+1;
        const int pivot = tableau[debut];
     
        /* Si le tableau est de longueur nulle, il n'y a rien à faire. */
        if(debut >= fin)
            return;
     
        /* Sinon, on parcourt le tableau, une fois de droite à gauche, et une
           autre de gauche à droite, à la recherche d'éléments mal placés,
           que l'on permute. Si les deux parcours se croisent, on arrête. */
        while(1)
        {
            do droite--; while(tableau[droite] > pivot);
            do gauche++; while(tableau[gauche] < pivot);
     
            if(gauche < droite)
                echanger(tableau, gauche, droite);
            else break;
        }
     
        /* Maintenant, tous les éléments inférieurs au pivot sont avant ceux
           supérieurs au pivot. On a donc deux groupes de cases à trier. On utilise
           pour cela... la méthode quickSort elle-même ! */
        quickSort(tableau, debut, droite);
        quickSort(tableau, droite+1, fin);
    }
    int main (int argc, char *argv[])
    {
     
    int i, j, k, c, n, m, tab[n];
     
    c=0;
     
    printf("Entrez n :\n");
    scanf("%d",&n);
     
    printf("Entrez m :\n");
    scanf("%d",&m);
     
    srand (time (NULL));
     
    i=0;
        do
        {
            for (j = 0 ; j < n ; j++)
            {
     
                tab[j] = Random (1,365);
            }
     
            quickSort(tab, 0, n-1);
            printf("\nLe tab est :\n");
     
            for (k = 0 ; k < n ; k++)
            {
            printf("%d\n",tab[k]);
     
            }
     
            printf("\n\n\n");
     
            c=c+verif(n, tab);
            i=i+1;
        } while (i<m);
     
        printf("Compteur :%d",c);
     
        return 0;
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu as déjà un problème à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int i, j, k, c, n, m, tab[n];
    tu n'as pas encore fixé la valeur de n, ton tableau peut donc faire n'importe quelle taille selon la valeur (aléatoire) de n à ce moment là.

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Je l'ai pas dit c'est vrai, mais n et m vont être saisis par l'utilisateur avec des scanf

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui... mais après avoir créé ton tableau.

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Ah désolé, je vois...

    J'ai essayé et ça MARCHE !

    Merci beaucoup et désolé pour ma première réponse un peu hâtive



    (bon maintenant je dois chercher comment mettre ce sujet en RESOLU)

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

Discussions similaires

  1. Paradoxe des trois anniversaires
    Par coyotte507 dans le forum Mathématiques
    Réponses: 7
    Dernier message: 05/02/2008, 22h01
  2. envoyer des sms de mon programme ver un portable
    Par Nadirov dans le forum Delphi
    Réponses: 3
    Dernier message: 14/08/2006, 16h29
  3. Réponses: 2
    Dernier message: 05/06/2006, 16h53
  4. Comment jouer des sons dans un programme ???
    Par aldur_disciple dans le forum MFC
    Réponses: 8
    Dernier message: 17/08/2005, 12h10
  5. [TP] Echanger des données entre deux programmes
    Par ILIAS Raphaël dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 22/03/2005, 09h31

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