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 saisie de nombres pairs et impairs


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2022
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Programme de saisie de nombres pairs et impairs
    *Bonjour, j'ai besoin d'aide*

    je travaille sur cet exercice:

    Écrire un programme qui saisit des entiers pairs positifs.
    Le programme s'arrête dans les cas suivants :

    • Si l’utilisateur saisi un nombre impair
    • Si l’utilisateur saisi un entier négatif
    • Si l’entier saisi est supérieur à 50 ou inférieur à 5
    • Si la somme des valeurs saisie est supérieur à 500 ;
    • Si on arrive à 10 tentatives (saisies)



    A la fin, le programme affiche :
    • Le nombre d'entiers positifs saisis.
    • Le plus grand entier saisi
    • Le plus petit entier saisi
    • La racine carrée du plus grand entier saisi
    • Le factoriel du plus petit entier saisi
    • La somme des entiers saisis
    • La moyenne des valeurs saisies



    Mon problème, c'est que je n'obtiens pas le résultat souhaité

    voici mon code: (voir pièces jointe)

    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
    #include<stdio.h>;
    #include<math.h>;
    /*
    x=la variable qui stock l'entier saisi
    max et min= respectivement le plus grand et le plus petit  entier saisie
    fac= factoriel du plus petit entier saisi
    s= la somme des entier saisie
    c= compteur
    r=racine carrée du plus grand entier saisie
    m=moyenne des entier saisie
     
    */
     
     
        int main(){
            int x,max,min,fac,s,c;
            float r,m;
            s=0;r=0;fac=1;max=0;i=0;x=0;min=0;
            float note;
                //verification
                while(x%2==0){
                    printf("donner un nombre paire compris entre 5 et 50: %d\n",x);
            scanf("%d",&x);
            if(c>=10){
                break;
            }
            if((x>5)||(x<50)){
                if(x>max){
                    max=x;
                    r=sqrt(max);
                    }
                        if(x<min){
                            min=x;
                        }
            for(i=1;i<=min;i++){
                    fac=fac*i;
                }
            }
            if(s<500){
                s=s+x;
            }    
            c=c+1;
                }
        printf("le nombre d'entier saisi est:%d\n",c);
        printf("le plus grand entier saisi est:%d\n",max);
        printf("le plus petit entier  saisi est:%\n",min);
        printf("la racine carré du plus grand entier saisi est:%f\n",max);
        printf("le factoriel du plus petit entier saisi est:%d\n",fac);
        printf("la somme des entier saisi est:%d\n",s);
        printf("la moyenne des valeurs saisi est:%f\n",m);
     
     
        return 0;
        }
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 318
    Points : 355
    Points
    355
    Par défaut
    /*
    x=la variable qui stock l'entier saisi
    max et min= respectivement le plus grand et le plus petit entier saisie
    fac= factoriel du plus petit entier saisi
    s= la somme des entier saisie
    c= compteur
    r=racine carrée du plus grand entier saisie
    m=moyenne des entier saisie

    */
    Ce serait plus logique de faire comme ceci, en tous cas c'est cela que je conseille à mes élèves:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int iNbsaisi=0,max=0,min=0,iFactorielle=1,iSommeSaisie=0,cpt=0;
    float fRacineCarree=0.0,fMoyenne=0.0;
    float fNote=0.0;
    ...ensuite il faut que je voie cela en profondeur et il est tard je suis fatigué...
    l'utilisation de scanf() attire mon attention, mais tu ne décris pas ce qui te semble "absurde" à l'exécution du programme... scanf() n'est pas la fonction de saisie que je conseillerais d'utiliser même pour les débutants.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Déjà si tu indentes correctement ton code, tu arriveras à te relire plus fcilement et surtout nous on arrivera à te lire facilement.
    Pourquoi tu calcules la factorielle à chaque nouveau "plus petit" trouvé? Si je rentre 60, 50, 40, 30 tu calculeras factorielle de 60, 50 et 40 pour rien. Et si en plus tu n'initialises pas "fac" avant de commencer le calcul, tu continues à multiplier indéfiniment les résultats les uns sur les autres.
    Et tu devrais réfléchir sur ce que signifie "nombre compris entre 5 et 50".

  4. #4
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 318
    Points : 355
    Points
    355
    Par défaut
    Re-salut ^^

    Je parie que tu as des soucis à la saisie, pour le calcul de la factorielle (en effet il n'existe pas de fonction dans la librairie mathématique standard qui calcule la factorielle, si mes souvenirs sont bons), la fonction pour calculer la racine carrée est sqrt() (square root).
    De plus, je ne suis pas certain que la boucle while() soit adaptée dans ce cas-ci.

    Il manque des informations: si les nombres saisis doivent être affichés à la fin du programme, peut-être aurions nous besoin d'un tableau pour les stocker, vu qu'ils sont affichés lors du scanf() ou lors de l'utilisation de "mon petit trick"... si dans l'énoncé
    il est spécifié que cela doit se faire à la fin du programme il faudrait dès lors faire une boucle "for" pour afficher le contenu de ce tableau contenant les nombres saisis (valides bien entendu)

    Mon petit trick qui "contourne" les soucis liés à l'utilisation de scanf():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("Saisissez un nombre:");
    fgets(sSaisie,10,stdin);		// saisir 10 caractères max en entrée (stdin)
    iNbSaisi=atoi(sSaisie);		// on va le convertir (si l'utilisateur introduit nimp, iNbSaisi sera égal à 0)
    sSaisie est un tableau de type char décrit comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char 	sSaisie[11];						// un int peut contenir 2.147.483.647 mais dans l'énoncé si iNbSaisi est supérieur à 50 on ne l'accepte pas... mais bon on réserve 11 "digits" pour un entier signé

  5. #5
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 318
    Points : 355
    Points
    355
    Par défaut
    Voilà une fonction qui calcule une factorielle...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    unsigned long long factorielle(unsigned int param)
    {
    	static unsigned long long intermediate=1;
     
    	if(!param) return 1;
    	if(param==1) return intermediate;
    	intermediate*=param;
    	factorielle(--param);
    }
    Je ne sais plus en math si une factorielle peut retourner un nombre négatif, je pense que le domaine c'est [1,...[ ou quelque chose du genre
    Dans cette fonction que j'utilise au delà de 18 j'obtiens des "choses bizarres" sur lesquelles il faudra que je me penches...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sirius:/datas1/netbeans/2022/factorielle # ./factorielle 31
    Résultat:                            4999213071378415616
                                   4.999.213.071.378.415.616
    sirius:/datas1/netbeans/2022/factorielle # ./factorielle 32
    Résultat:                           12400865694432886784
                                   9.223.372.036.854.775.808
    sirius:/datas1/netbeans/2022/factorielle # ./factorielle 33
    Résultat:                            3400198294675128320
                                   3.400.198.294.675.128.320
    La fonction ne vérifie pas que le nombre soit supérieur à 0... un oubli...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 668
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 668
    Points : 10 669
    Points
    10 669
    Par défaut
    Citation Envoyé par hurukan Voir le message
    Voilà une fonction qui calcule une factorielle...
    Tu es sérieux ? Y-a-t-il des optimisations de récurrence que je ne vois pas ?

    Édit 01: la factorielle de @hurukan utilise la récursion terminale ("tail call optimization") d'après ce que je comprends
    Édit 02: l'affichage résultat ligne 6 est "1.240.086.569.4432.886.784" et non "9.223.372.036.854.775.808".
    Mais les factorielles sont erronées (les nombres sont trop grands) : c'est aux fraises à partir de 21!.

    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
    size_t factorielle(size_t val) {
        size_t fact;
     
        for(fact=1; (val > 1); fact*=val, --val);
     
        return fact; 
    }
     
    // No TRE
    size_t factorielle_recur01(size_t val) {
        return ((val > 1)? (val * factorielle_recur01(val - 1)): 1); 
    }
     
    // TRE
    size_t factorielle_recurTRE(size_t val, size_t acc) {
        return ((val > 1)? factorielle_recurTRE((val - 1), (val * acc)): acc); 
    }
     
    size_t factorielle_recur02(size_t val) {
        return factorielle_recurTRE(val, 1); 
    }

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hurukan Voir le message
    Je parie que tu as des soucis à la saisie, pour le calcul de la factorielle
    Non, regarde son code, il fait bien sa boucle de multiplications. Sauf qu'il calcule la factorielle à chaque saisie et qu'il ne la réinitialise pas pour chaque nouveau calcul mais il n'a pas tenté d'utiliser la librairie mathématique.

    Citation Envoyé par hurukan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("Saisissez un nombre:");
    fgets(sSaisie,10,stdin);		// saisir 10 caractères max en entrée (stdin)
    fgets(sSaisie,10,stdin) n'en fait pas saisir 10 max mais 9 max !!!

    Citation Envoyé par hurukan Voir le message
    sSaisie est un tableau de type char décrit comme ceci:

    De fait char sSaisie[10] suffit.

    Citation Envoyé par hurukan Voir le message
    iNbSaisi=atoi(sSaisie); // on va le convertir (si l'utilisateur introduit nimp, iNbSaisi sera égal à 0)
    Et comment faire alors la différence avec 0? Faut pas utiliser atoi() mais sscanf() qui renvoie 1 si le nombre a été correctement récupéré ou 0 si ce n'est pas le cas.

    Citation Envoyé par hurukan Voir le message
    Voilà une fonction qui calcule une factorielle...
    Du static et de la récursivité pour faire un truc aussi ultra trivial qu'une boucle???
    En plus d'être totalement absurde, donner cette fonction à un débutant qui en est à peine à tenter de faire saisir des nombres et trouver le min/max est totalement inutile. Il ne va rien y piger et ça risque de le dégoûter du C. Pareil pour ta saisie basée sur fgets() qu'il ne connait certainement pas encore.

    Citation Envoyé par hurukan Voir le message
    Je ne sais plus en math si une factorielle peut retourner un nombre négatif
    La définition de la factorielle part du principe qu'elle travaille sur les entiers naturels. Et une multiplication de positifs ne donne que des positifs.
    Ensuite il existe une fonction nommée "gamma" qui extrapole ce que "pourrait" donner la factorielle d'un réel (exemple 3.5! qui serait sur une courbe située entre 3! et 4!). Elle s'appuie sur un calcul intégral et on peut l'utiliser sur des négatifs.

  8. #8
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 318
    Points : 355
    Points
    355
    Par défaut
    fgets(sSaisie,10,stdin) n'en fait pas saisir 10 max mais 9 max !!!
    Oui 9 caractères plus '\0' donc 10 caractères... lorsque 9 caractères ont été saisis (je me réfère au man 3p fgets)

    Et comment faire alors la différence avec 0? Faut pas utiliser atoi() mais sscanf() qui renvoie 1 si le nombre a été correctement récupéré ou 0 si ce n'est pas le cas.
    Oui dans l'énoncé les nombres en-dessous de 5 on les oublie, cela a pour effet d'arrêter la boucle... donc atoi() convient que le nombre soit ou non bien converti... sinon il est conseillé d'utiliser strtol() dans le man.

    La fonction factorielle est un test... j'avais vu ça je ne sais plus où et je l'ai prise telle qu'elle. (à partir d'un truc en c++ puis j'ai laissé cela de côté pendant un moment... au moins 10 ans lol)

    Comme j'ai fait une recherche sur "factorielle" je suis retombé dessus et j'ai juste lancé l'exécutable puis j'ai copié/collé le code source sans revenir dessus.
    C'est vrai que c'est pas vraiment comme cela habituellement que l'on écrit une fonction calculant une factorielle et de toutes au-delà d'un certain point il devient difficile de "faire tenir" une factorielle dans un int ou même un long long.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hurukan Voir le message
    Oui 9 caractères plus '\0' donc 10 caractères... lorsque 9 caractères ont été saisis
    Le "\0' ne compte pas quand on parle de "saisie". Si on te dit "combien de caractères saisis dans toto" tu réponds 4, pas 5 !!! Et l'utilisateur à qui tu dis "ici tu peux saisir 10 caractères" s'attend à pouvoir en saisir 10, pas 9. Lui cette histoire de '\0' ça lui passe à 10km au dessus de lui.
    fgets(saisie, 10, stdin) fait saisir 9 caractères et rajoute un '\0'.

Discussions similaires

  1. Nombres pairs ou impairs
    Par leratx dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 25/11/2009, 14h35
  2. [Turbo Pascal] Nombres pairs et impairs dans un tableau
    Par 159753 dans le forum Turbo Pascal
    Réponses: 16
    Dernier message: 18/03/2009, 16h48
  3. Nombre pair ou bien impair
    Par monoar dans le forum Ruby
    Réponses: 10
    Dernier message: 12/08/2007, 21h21
  4. [TP] Nombres pairs et impairs
    Par The future scientist dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 04/05/2007, 17h32
  5. Réponses: 4
    Dernier message: 30/06/2002, 20h23

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