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

Turbo Pascal Discussion :

[TP] Combinaison : calculs corrects mais affichage toujours à 0


Sujet :

Turbo Pascal

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Points : 72
    Points
    72
    Par défaut [TP] Combinaison : calculs corrects mais affichage toujours à 0
    Je viens de faire un programme qui calcule la combinaison.
    Le calcul est juste mais l'affichage et toujours égal à 0.
    SVP aidez-moi à le corriger :

    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
    program combinison ;
    uses wincrt;
    var
    x,n,p:integer;
    function fact(x:integer):longint;
    var
    s,i:longint;
    begin
    s:=1;
    	for i := 1 to x do
    	begin
    s:=s*i
    	end;
    fact:=s;
    end;
    procedure lecture(var n:integer;var p:integer);
    begin
    	repeat
    writeln('donnes le nombre d objet');
    readln(n) ;
    writeln('donnes le nomre d objet à tiré');
    readln(p);
    	until (n >= p) and (p >=1)  ;
    end;
    procedure combini (n:integer;p:integer);
    	var
    A:integer;
    c,k,v:longint;
    	begin
    c:= fact(n);
    v:=fact(n-p);
    k:=c*v;
    A:=c div k ;
    writeln('le nombre de tirage est:   ',A);
    end;
    begin
    lecture(n,p);
    combini(n,p);
    end.

  2. #2
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    C'est parce que la formule est fausse.

    La bonne formule est : C(n,p)=n!/(p!(n-p)!)

    Ton algorithme mêne à n!/(n!(n-p)!), ce qui pour des entiers renvoie toujours zéro puisqu'on effectue la division euclidienne d'un nombre plus petit par un nombre plus grand.

    Donc, quelque part, il faut que fact(p) apparaisse.

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 668
    Points
    5 668
    Par défaut
    Jak,
    Citation Envoyé par gadalla
    Je viens de faire un programme qui calcule la combinaison.
    Le calcul est juste mais l'affichage et toujours égal à 0.
    SVP aidez-moi à le corriger :

    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
    program combinison;
     
    uses wincrt;
     
    var
      x, n, p: integer;
     
    function fact(x: integer): longint;
    var
      s, i: longint;
    begin
      s := 1;
      for i := 1 to x do
      begin
        s := s * i
      end;
      fact := s;
    end;
     
    procedure lecture(var n: integer; var p: integer);
    begin
      repeat
        Writeln('donnes le nombre d objet');
        Readln(n);
        Writeln('donnes le nomre d objet à tiré');
        Readln(p);
      until (n >= p) and (p >= 1);
    end;
     
    procedure combini(n: integer; p: integer);
    var
      A: integer;
      c, k, v: longint;
    begin
      c := fact(n);
      v := fact(n - p);
      k := c * v;
      A := c div k;
      Writeln('le nombre de tirage est:   ', A);
    end;
     
    begin
      lecture(n, p);
      combini(n, p);
    end.
    Leitmotiv : en soignant la présentation, c'est tout de suite plus lisible.

    Je n'ai pas cherché d'où vient l'erreur, mais un conseil : puisque tu as des longint, transforme toutes tes variables integer en longint.

    D'autre part, le calcul de (n!)/( (p!)*((n-p)!) )
    se ramène à
    ( n*(n-1)*(n-2)*...(n-(p-1)) ) / (p!)
    Ce qui permet de calculer plus loin, car on évite la factorielle de n, la plus grande (et factorielle est une fonction qui augmente très vite).
    On peut encore simplifier pour aller plus loin encore, mais ça demande des tests supplémentaires.

    Et oui, CapJack a mis le doigt sur l'erreur.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Points : 72
    Points
    72
    Par défaut
    MERCI 0 TOUS maintenant il est executable avec une bonne mise en forme

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

Discussions similaires

  1. Calculs : correction mais sans effacer les formules
    Par francescu dans le forum Excel
    Réponses: 14
    Dernier message: 23/04/2013, 13h48
  2. PHP-GetText - Msgid fr, mais affichage toujours anglais
    Par ericdebra dans le forum Langage
    Réponses: 0
    Dernier message: 02/02/2011, 01h38
  3. Réponses: 4
    Dernier message: 08/06/2010, 13h06
  4. Réponses: 10
    Dernier message: 19/07/2007, 22h37
  5. [MySQL] Requete SQL correcte Mais aucun affichage
    Par jenga dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 10/04/2006, 13h55

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