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 :

Comprendre comment écrire une fonction


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Comprendre comment écrire une fonction
    Bonjour,

    Je dois écrire une fonction appelée conversion qui prend en paramètre une note (type int) et renvoie un caractère (type char).
    Si la note est comprise entre 0 et 20, elle sera convertie dans la lettre correspondante. Si elle n'est pas comprise dans cet intervalle, le caractère renvoyé sera 'X'. La fonction ne doit faire ni lecture au clavier ni affichage à l'écran.
    un main qui lit au clavier un int et affiche le résultat de la conversion de cet entier par la fonction conversion .
    On va leur fournir un convertisseur qui leur permettra de convertir les anciennes notes entre 0 et 20 en nouvelles notes entre A et F.
    La table de conversion est la suivante:
    Notes de 16 à 20: A
    Notes de 13 à 15: B
    Notes de 10 à 12: C
    Notes de 8 à 9: D
    Notes de 6 à 7: E
    Notes de 0 à 5: F

    J'ai commencé à écrire le programme
    Je pense que le main est OK. Il me manque une boucle if pour le renvoi du X si la valeur tapée au clavier est inférieure à 0 ou supérieure à 20.
    C'est la fonction convert qui me pose quelques soucis d'écritures. Je ne comprends pas comment intégrer la table de conversion noté ci-dessus.

    Code C : 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
    #include <stdio.h>
    #include <stdlib.h>
    int convert(int note)
    {
     int a = 16;
    char aaa = aa;
    printf("%c", aaa); 
    }
     
    int main() 
    {
     int note;
     note=0;
     printf("une note comprise entre 0 et 20\n");
     scanf("%d",&note) ;
     printf ("conversion de la note de %d\n", note);
     convert (xxxx)
    return 0;
    }

    Soyez indulgent, je débute en programmation ;-)
    Merci
    Yohan

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bonjour,

    Pour commencer, prends tout de suite une bonne habitude : utiliser le bon vocabulaire.

    if n'est pas une boucle !

    Pour ton problème, écris ce que tu ferais en français, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    si condition1
    alors
      ce qu'il faut faire quand la condition1 est remplie
    sinon
      ce qu'il faut faire quand la condition1 n'est pas remplie (on passe à la suivante)
      si condition2
      alors
        ce qu'il faut faire quand la condition2 est remplie
      sinon
        ce qu'il faut faire quand la condition2 n'est pas remplie (on passe à la suivante)
     
    etc.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Le début de l'énoncé "Je dois écrire une fonction appelée conversion qui prend en paramètre une note (type int) et renvoie un caractère (type char). ". Je commencerais donc par écrire char conversion( int note ) au lieu de ton int convert(int note).
    Et au sujet du main, l'énoncé "un main qui lit au clavier un int et affiche le résultat de la conversion de cet entier par la fonction conversion", le code lit bien un int, puis ni conversion de cet entier, ni récupération de la conversion, ni affichage du résultat. Non il n'est pas OK!

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Fonction !!
    Bonjour,
    Merci pour votre aide ;-)
    J'ai avancé un peu.
    Il me reste encore a comprendre comment construire le tableau de conversion et voir pourquoi la fonction ne renvoie pas la lettre A lorsque je renseigne une note entre 16 et 20.


    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
     
    #include <stdio.h>
     
    char conversion(int noteo) //noteo  correspond à la note enregistrer
    {
     int noter; //initialise la variable note resultat
     char notec; // note changé en char de type A B C 
     notec=0;  //on met la variable à 0
     
     scanf("%d",&noteo); //enregistre la valeur entrée au clavier
     if (noteo>0 && noteo<20) // premier test
     {
          printf("la note choisie est %d\n" ,noteo);
     }
                if (noteo>16 && noteo<20) // test si l'entrée est entre 16 et 20
                   { 
                       noter= 'A'; // on enregistre la note A pour les notes de 16 à 20
                   }
                    else /// a construire
                    {
     printf("X\n"); // sort de la premier boucle
                    }
    return noter;
    printf("La conversion en char est %d\n", noter);
    }
     
     
    int main() {
     int noteo;
     noteo = 0;
     printf("entrer une note comprise entre 0 et 20 \n"); //Demande d'entrer une valeur entre 0 et 20
     noteo=conversion(noteo); //appel de la fonction qui donne le résultat, la note en A, B , C, D, ....
     return 0;
    }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Est-ce que c'est ce genre de chose que tu dois produire ? Si j'ai bien compris ça correspond au cahier des charges.

    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
    #include <stdio.h>
     
    char conversion(int note){
        if (note<0 || note>20) return 'x';
        if (note>=16) return 'a';
        if (note>=13) return 'b';
        if (note>=10) return 'c';
        if (note>=8) return 'd';
        if (note>=6) return 'e';
        return 'f';
    }
     
    int main(){
        int note=0;
        printf("entrer une note comprise entre 0 et 20: ");
        scanf("%d",&note);
        printf("resultat: %c\n",conversion(note));
        return 0;
    }
    Dernière modification par hp41c ; 04/05/2017 à 00h02.

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bravo hp41c,
    @bo_yoyo, le code de hp41c a très bien utilisé la chronologie pour arriver à un code optimal, le tiens comporte beaucoup d'erreurs dues essentiellement à une non maîtrise de cette chronologie. Relis le bien et comprend le.

  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 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bo_yoyo Voir le message
    Je dois écrire une fonction appelée conversion qui prend en paramètre une note (type int) et renvoie un caractère (type char).
    Si la note est comprise entre 0 et 20, elle sera convertie dans la lettre correspondante. Si elle n'est pas comprise dans cet intervalle, le caractère renvoyé sera 'X'. La fonction ne doit faire ni lecture au clavier ni affichage à l'écran.
    un main qui lit au clavier un int et affiche le résultat de la conversion de cet entier par la fonction conversion .

    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
    #include <stdio.h>
    
    char conversion(int noteo) //noteo  correspond à la note enregistrer
    {
     int noter; //initialise la variable note resultat
     char notec; // note changé en char de type A B C 
     notec=0;  //on met la variable à 0
    
     scanf("%d",&noteo); //enregistre la valeur entrée au clavier
     if (noteo>0 && noteo<20) // premier test
     {
          printf("la note choisie est %d\n" ,noteo);
     }
                if (noteo>16 && noteo<20) // test si l'entrée est entre 16 et 20
                   { 
                       noter= 'A'; // on enregistre la note A pour les notes de 16 à 20
                   }
                    else /// a construire
                    {
     printf("X\n"); // sort de la premier boucle
                    }
    return noter;
    printf("La conversion en char est %d\n", noter);
    }
    Soyez indulgent, je débute en programmation ;-)
    Bonsoir

    Débuter en programmation ne te dispense pas de lire l'énoncé. Et ne te dispense pas non plus de lire les messages qu'on te fait (surtout celui de droggo qui te dit que "if" n'est pas une boucle !!!).

    Mis à part ça, les erreurs de ton programme c'est tout d'abord une trop grande quantité de variables. Tu en places "en veux-tu, en voilà" sans trop savoir à quoi elles vont te servir. Et plus tu as de variables plus ça devient complexe.
    Autre chose: quand on écrit un code C, on l'écrit proprement surtout au niveau de l'indentation. Ca permet entre autres de s'y retrouver à l'écriture et surtout quand on y revient pour le faire évoluer. Regarde par exemple le code de hp41c. Sans même présumer de son efficacité, rien que dans l'indentation on le lit 100 fois mieux et 100 fois plus vite que le tien.

    Et sinon, si l'instruction return te fait quitter la fonction, ça ne sert alors à rien de rajouter un printf() derrière.
    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]

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 9
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bravo hp41c
    Je ne pense pas que lui donner la fonction toute faite lui soit d'une quelconque aide.

    Attention :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof('a') == sizeof(int)

  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 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par matt42 Voir le message
    Je ne pense pas que lui donner la fonction toute faite lui soit d'une quelconque aide.
    Dans l'absolu tu as absolument raison et je pense comme toi.

    Toutefois, il peut arriver que parfois un petit exemple serve de point de départ et soit bénéfique (pourvu que ça ne devienne pas systématique). Et si ce n'est pas le cas, alors sa réussite à son exo grace à cet exemple ne sera qu'éphémère et sombera rapidement dans l'oubli. Et donc j'ai trouvé le code de hp41c tellement élégant que je le range dans cette catégorie d'exemple qui "peut" être ici plus bénéfique que néfaste.

    Bref c'est à considérer comme "exception qui confirme la règle" quoi...
    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]

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Merci
    Bonjour
    J’enregistre vos réponses et vos recommandations.
    Je suis en train de décortiquer cette fonction et d'essayer de mieux comprendre.
    En résumé, If n'est pas une condition, trop de variable (une variable est seulement nécessaire) et la mauvaise chronologie de ma fonction.
    Bref, j'ai du travail devant moi.
    Merci a vous.
    Yohan

  11. #11
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Une autre façon de faire, pour éviter les répétitions de code if .. return, est de stocker le barème dans un tableau, et de faire un truc comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int bareme[] = { 16, 13, 10, 8, 6 };
    /* correspond à : a   b   c  d  e */
     
    char conversion(int note){
        int n = 0;
        if (note < 0 || note > 20) return 'x';
        while (note < bareme[n++]);
        return 'a' -1 + n;
    }
    Avec l'avantage que pour modifier le barème appliqué, il suffit de modifier les données du tableau

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/10/2015, 11h04
  2. Réponses: 5
    Dernier message: 26/04/2010, 18h14
  3. Réponses: 1
    Dernier message: 26/08/2008, 14h26
  4. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13
  5. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24

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