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 :

Programme de maths en C


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut Programme de maths en C
    Bonjour à tous j'ai un problème au niveau d'un exercice de programmation en C

    voici le sujet :


    Ecrire un programme qui calcule la fréquence de sortie de k numéros parmi n dans un ensemble de q valeurs, sachant que :


    freq(k,n,q) = [C(n,k) * C(q-n,n-k)] / C(q,n)

    Ps : le C renvoie à la notion de combinaison en Maths avec la 1er lettre le chiffre du bas et la 2eme le chiffre du haut :-)

    Le programme comportera obligatoirement au moins deux sous-programmes.
    Les valeurs de k, n et q seront fournis par l'utilisateur





    Voilà donc franchement la galère si vous pouviez me venir en aide ce serait fort sympathique à vous

    bonne soirée

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Bonsoir et bienvenue sur le forum,

    Voilà donc franchement la galère si vous pouviez me venir en aide ce serait fort sympathique à vous
    Comme ce n'est pas notre rôle de faire tes exercices et que ce ne serait pas te rendre service, il te faut poster ce que tu as déjà réalisé et poser des questions précises sur les points sur lequel tu bloques.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    Ok merci d'avoir pris le temps de me lire déjà

    Alors je bloque au niveau des calculs à faire en fait...le reste je saurai le taper dans conText par exemple

    Franchement pour l'instant j'ai ça :
    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
    #include <stdio.h>
     
    int main()
    {
      int k,n,q;
     
     
     
      printf("Rentrez le nombre k de bons numeros qu'il faut : ");
      scanf("%d",&k);
     
      printf("Rentrez le nombre n de numeros que vous avez joue : ");
      scanf("%d",&n);
     
      printf("Rentrez le nombre total q de numeros possibles : ");
      scanf("%d",&q);
    C'est la 1ere fois que j'ai un tel programme à faire et bon il me parait compliquer à résoudre surtout au niveau des calculs

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 34
    Points : 35
    Points
    35
    Par défaut
    Le programme comportera obligatoirement au moins deux sous-programmes.

    des "sous programmes" ?
    des fonctions non ?

    tu peux déjà essayer de t'organisant en divisant ton code.

    gros indice, il faudrait factoriser le code du calcul de C(n,q) dans une fonction séparée de main.

    comme ca tu n'as plus qu'à l'appeler.
    déjà fait ca.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    Je pense pas que ce soit des fonctions on en a pas vu encore je crois

    Puis c'est sur le sujet que ya marqué des SOUS-PROGRAMMES donc jpense que c'est ça enfin j'en sais trop rien lol


    Pour ce qui est de C(q,n) ça fait :

    q! / (n!*(q-n)!)

    mais vous pensez pas qu'il faille simplifier le tout je m'explique :

    ça fait si je me trompe pas :


    (n! / k!(n-k)!) * [(q-n)! / (n-k)!*(q-2n-k)!]
    /
    q! / (n!*(q-n)!)

  6. #6
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Bonjour,

    Je suis du même avis que dzada, pour moi sous-programme en C sous entends des fonctions.

    En plus si tu n'as pas encore vu les fonctions je ne pense pas que ce soit plus compliqué que ça.

    Pour les fonctions a vu d'œil tu pourrais en faire 3.
    Une pour la saisie, une pour l'affichage et une pour le calcul.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    Oui d'accords mais Quel calcul c'est ça le gros problème...!?



  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
    En C, c'est beaucoup plus propre de bien séparer les différentes opérations en fonctions (après, ça dépend si on veut optimiser, mais là est un autre débat).

    On peut résoudre le problème en 4 fonctions :
    * la fonction "main" qui par exemple demande les saisies, appelle la fonction "freq" et affiche le résultat. Après, ça dépend comment on doit entrer les valeurs (fichier ? saisies au clavier ? ...)
    * la fonction "freq", qui calcule l'équation [C(n,k) * C(q-n,n-k)] / C(q,n), avec k,n et q comme paramètres.
    * la fonction "C", qui calcule q! / (n!*(q-n)!), avec q et n comme paramètres.
    * la fonction "factorielle", qui sera appelée par "C" pour effectuer son calcul.

    Rien de très compliqué... sauf si tu débutes totalement.

    Découpé en plusieurs fonctions comme cela, un code est plus propre.

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    Oui je débute totalement ça fait 2semaines je connaissais pas du tout et là direct j'ai déjà ça à faire

    Moi ce que je veux savoir c'est comment on fait pour enchainer ça en langage C :


    (n! / k!(n-k)!) * [(q-n)! / (n-k)!*(q-2n-k)!]
    /
    q! / (n!*(q-n)!)


    Moi j'ai appris à faire n! comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int n,i;
    float p;
     
    p=1;
    i=0;
     
    while(i<n){
    i=i+1;
    p=p*i;
    }

    C'est tout ce que j'ai appris au niveau factorielle pour le moment mais j'en ai jamais enchainé comme là

  10. #10
    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
    En fait, c'est simple. Tu enchaines les calculs comme tu le ferais normalement.

    Par exemple, en C, tu peux écrire des instructions du style :
    ... tout comme tu peux aussi écrire d'autres choses du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = une_fonction(b) + c * une_autre_fonction(d,e) ;
    Dans cet exemple, on additionne la valeur retour de "une_fonction" avec le résultat de "c" multiplié par la valeur retour de "une_autre_fonction", en envoyant la valeur de "b" à la première fonction et en envoyant la valeur de "d" et "e" à la seconde. Puis on met le résultat dans "a".

    Pour ton exo, ce sera quelque chose de similaire.

  11. #11
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Le mieux est sans doute de faire une fonction qui calcule C(n,k). Son prototype sera par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int Cnk(unsigned int n, unsigned int k);
    Pour calculer C(n,k), il faut absolument éviter de passer par les factorielles : Elles croissent trop vite et pour n = 13 tu dépasses déjà la capacité d'un unsigned int de 32 bits : 13! = 6 227 020 800. Les C(n,k) croissent mais de façon beaucoup plus modérée. Par exemple pour n = 13, le plus grand des C(n,k) est seulement 1716.

    Au lieu de prendre la formule brute, une formule de récurrence est mieux adaptée. Il y en a plusieurs.
    Par exemple, on peut utiliser celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C(n,0) = 1
    C(n,k) = (n-k+1)*C(n,k-1)/k ; k=1,...n
    On peut utiliser une forme récursive (la fonction s'appelle elle-même), mais une forme itérative (avec une boucle) est simple et beaucoup plus efficace. On peut également réduire le nombre de boucles pour les valeurs élevées de k en observant que C(n,k) = C(n,n-k)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Calcul de C(n,k) :
    On va calculer successivement les valeurs  de C(n,0), C(n,1),...C(n,k).
    Elles seront placées dans une variable Cnk de type unsigned int.  
    Si Cnk contient la valeur de C(n,i), à partir de cette valeur on peut calculer 
    C(n,i+1) et mettre le résultat à nouveau dans Cnk pour calculer la suivante.
    
    1- Si n <2k  poser k = n-k
    
    2- Initialiser une variable Cnk à 1. (soit la valeur de C(n,0))
    
    3- Pour i = 1,2,...,k : Calculer Cnk = Cnk*(n-i+1)/i  (soit C(n,i) = (n-i+1)*C(n,i-1)/i)
    
    4- retourner Cnk

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    Franchement je dois avouer que j'ai du mal à te suivre surtout pourquoi on garde seulement le "n"


    looool

  13. #13
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Franchement je dois avouer que j'ai du mal à te suivre surtout pourquoi on garde seulement le "n"
    Ton problème est d'abord de savoir calculer les C(n,k). Une fois ceci fait, tu n'as plus qu'à utiliser ta fonction Cnk() pour obtenir les valeurs de C(n,k), C(q-n,n-k) et C(q,n) de ta formule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    freq(k,n,q) = [C(n,k) * C(q-n,n-k)] / C(q,n)
    Celle-ci deviendra en C (peut-être à effectuer en flottant mais le principe est là)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    freqknq = Cnk(n,k) * Cnk(q-n,n-k) / Cnk(q,n)
    je ne comprend pas du tout cette remarque 'pourquoi on garde seulement le "n" '

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    Ah ok je vois mieux là...ma remarque c'était parce-que tu m'avais marqué C(n,0), C(n,1)...

    Jvais essayer de faire quelque chose et jte dit tout ça




    Edit : J'arrive pas

    Je comprend juste comment calculer n! mais aprés pour enchainer avec
    k! et (n-k)!

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    up ! personne peut m'indiquer le calcul svp jme prend la tête depuis 2jours dessus

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Vu de l'extérieur, si votre professeur vous a donné cet exercice, c'est que vous devriez être capable de le faire.
    Vu sous un autre aspect : imaginez que ce forum n'existe pas, vous seriez obligé de le créer, mais avant ça, vous seriez obligé d'apprendre à analyser un problème, puis à le traduire dans un langage quelconque.
    Encore un autre aspect, il y a probablement une trentaine d'élèves dans votre chasse, or aucun autre ne semble avoir posé la question sur ce forum, soit ils regardent avec assiduité des différente réponses, soit ils ont trouvé un autre forum. Mais ne me dires surtout pas qu'ils ont tous terminé l'exercice, là c'est vraiment pas possible.
    En conclusion, ouvrez vos bouquins et faites le programme tout seul.

  17. #17
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ne passe pas par les factorielles.

    Commence par écrire une fonction qui calcule la valeur de c(n,k) comme je te l'ai indiqué plus haut :
    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
    Calcul de C(n,k) :
    
    Prototype :
    unsigned int Cnk(unsigned int n, unsigned int k);
    
    On va calculer successivement les valeurs  de C(n,0), C(n,1),...C(n,k).
    Elles seront placées dans une variable Cnk de type unsigned int.  
    Si Cnk contient la valeur de C(n,i), à partir de cette valeur on peut calculer 
    C(n,i+1) et mettre le résultat à nouveau dans Cnk pour calculer la suivante.
    
    1- Si n <2k  poser k = n-k
    
    2- Initialiser une variable Cnk à 1. (soit la valeur de C(n,0))
    
    3- Pour i = 1,2,...,k : Calculer Cnk = Cnk*(n-i+1)/i  (soit C(n,i) = (n-i+1)*C(n,i-1)/i)
    
    4- retourner Cnk
    Ce n'est pas compliqué et ça prend 4 ou 5 lignes de code. Poste ta fonction ou ton essai de fonction. Si tu ne montres pas de code et ne poses pas de questions précises, on ne peut pas savoir sur quoi tu butes.

    On verra ensuite pour le calcul utilisant la fonction.

  18. #18
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    Mr Pierre Dolez merci d'avoir pris le temps de me lire je vais vous répondre...

    Déjà premièrement je débute en langage C alors que certains qui se retrouvent avec moi en ont déjà fait depuis 2 voire 3ans...moi 2 semaines

    Ensuite niveau Bouquin nous n'en avons pas et côté cours je le connais par coeur le problème étant que les factorielles de ce type je n'ai pas appris à les faire...seulement n!

    Pour les autres élèves je n'en ai aucune idée mais en tout cas tout le monde est perdu...la différence avec les autres c'est que moi je veux apprendre à le réaliser et surtout le comprendre... et pas me taper une mauvaise note...



    Pour Diogene merci de prendre encore le temps de me répondre je vais voir ce que je peux faire mais je n'ai pas encore appris les fonctions...seulement les scanf, printf, if...else,while et un peu les tableaux

    Je sais pas si tu entends ça par fonction mais c'est le seul truc que j'ai appris pour l'instant...


    Avec un ami on avait pensé à ça mais c'est pas bon :

    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
     
    #include <stdio.h>
     
    int main()
    {
      int K,k,K_f,n,T,t,T_f,Q,q,Q_f;
      float F;
     
     
      scanf("%d",&K);
      K_f=1;
      k=1;
      while(k<=K){
        k=k+1;
        K_f=K_f*k;
     
      }
      printf("%d",K_f);
      scanf("%d",&Q);
      Q_f=1;
      q=1;
      while(q<=Q){
        q=q+1;
        Q_f=Q_f*q;
     
      }
      printf("%d",Q_f);
      scanf("%d",&n);
     
      T=(q-(2*n)+K);
      t=1;
      T_f=1;
     
      while(t<=T){
        t=t+1;
      T_f=T_f*t;
     
    }
      printf("%d",&T_f);
      F=1/(K_f*Q_f*T_f);
      printf("%f",T);
     
      return;
    }
    On avait pensé simplifier les factorielles et on avait trouvé :

    K!*q!*(q-2n+K)!
    avec le (q-2n+K) qu'on a appelé T

  19. #19
    Invité
    Invité(e)
    Par défaut
    Ne le prenez pas mal, mais il faut savoir qu'un grand nombre des développeurs ont appris seuls. Certains ont la chance d'avoir des cours et un professeur. On peut admettre que celui-ci sait ce qu'il doit enseigner à ses élèves, le niveau qu'ils ont, etc.

    Je vais essayer de vous expliquer ce qu'est une fonction.
    Dans un programme, on doit faire une chose, bien isolée et qui a des chances de se répéter souvent, ou tout simplement, il s'agit d'une chose un peu compliquée, et on préfère la traiter à part.
    Pour cela on dispose de la possibilité de faire une fonction.
    La logique peut se résumer ainsi :
    Valeur Fonction( Param1, Param2, Param3)
    {
    "Corps de la fonction."
    " là on calcule Valeur en fonction des 3 paramètres "
    return Valeur;
    }
    Cela veut dire que si dans le programme, on écrit
    v = Fonction(p1, p1, p3);
    alors v aura la valeur calculée par la fonction. Autrement dit cette seule ligne remplace tout le corps de la fonction.

    Ce que j'ai écrit n'est pas du code C, mais le principe d'une fonction. C'est à dire que c'est valable dans tous les langages. On peut estimer que fonction et sous-programme sont synonymes.

    Ecrivez votre code, là on pourra vous orienter.
    Concernant le cours, pas vraiment nécessaire de le savoir par coeur, par contre il est indispensable de l'avoir compris.

    Si j'ouvre mon bouquin au chapitre de "Fonctions", j'ai 3 pages, je les ai résumées en 3 lignes, mais pour commencer, ça suffit.

    Un dernier conseil avant d'écrire du code, écrivez "en français" ce que vous voulez faire, du genre
    1- le lis 3 valeurs
    2- je vérifie qu'elle sont cohérentes.
    (*- j'ai le même calcul plusieurs fois donc, je vais faire une fonction)
    3- je calcule la valeur cherchée
    4- j'affiche le résultat.
    Autre conseil, évitez le under-line, ça nuit à la bonne lisibilité, et mettez un espace de chaque côté des opérateurs.
    Les commentaires explicatifs sont vivement conseillés.
    Dernière modification par Invité ; 04/10/2010 à 19h49.

  20. #20
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    Je ne le prend pas mal c'est juste que cet exercice me met sur les nerfs depuis 2 jours car je sais même pas le commencer

    Pour ce qui est d'une fonction merci de me l'expliquer mais ce que je voulais dire c'est que ne les ayant pas encore appris...je doute fort qu'il faille les utiliser ici...du moins dans mon cas donc existe t-il un moyen de faire sans ?

Discussions similaires

  1. Problème de programmation de math
    Par black_hole dans le forum Mathématiques
    Réponses: 0
    Dernier message: 23/01/2014, 16h27
  2. Maths discrètes - dualité en programmation linéaire
    Par Lucas Panny dans le forum Mathématiques
    Réponses: 1
    Dernier message: 14/09/2009, 14h09
  3. Math physique chimie dans la programmation
    Par doc752 dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 01/09/2009, 17h53
  4. programme maths en c
    Par aimad41 dans le forum C
    Réponses: 17
    Dernier message: 21/01/2007, 13h42
  5. [Math] Utiliser cos, sin, log ou les programmer ?
    Par zaim dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 13/04/2006, 20h49

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