Partage
  • Partager sur Facebook
  • Partager sur Twitter

La fonction printf

Sujet résolu
    28 février 2010 à 13:28:47

    Bonjour,

    Ayant fini le tutoriel de Mateo , j'ai decider de refaire toute les fonctions (ou du moins celle que j'utilise souvent), Après avoir fait quelques fonctions assez simple carré,puissance ... je passe Maintenant au printf .

    Malheuresement je ne comprend pas comment je peux ecrire du code sans cette fonction , j'aimerais donc quelques idées pour demarrer à coder cette fonction

    Pour l'instant je vais simplement essayé de pouvoir encrire des chiffres , pour les caractère on verra plus tard


    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      28 février 2010 à 13:32:20

      il faut chercher le prototype de cette fonction qui est intégrer dans l'un des dossier de votre compilateur si ton compilateur donne toi l'accès
      • Partager sur Facebook
      • Partager sur Twitter
        28 février 2010 à 13:54:30

        En fait, pour recoder une ebauche de printf, tu vas devoir utiliser d'autre fonctions standards qui permettent d'ecrire du texte (genre puts, putc ...).
        Parce que si tu essais de recoder printf a partir de 0, ça va etre beaucoup trop dur.
        • Partager sur Facebook
        • Partager sur Twitter
          28 février 2010 à 13:59:38

          C'est une fonction elliptique (je crois que ca s'appel comme ca). Fais une recherche dessus. Le mieux serai effectivement de trouver le prototype de la fonction.
          • Partager sur Facebook
          • Partager sur Twitter
            28 février 2010 à 14:02:36

            Citation : light-next

            Après avoir fait quelques fonctions assez simple carré,puissance ... je passe Maintenant au printf .


            En gros tu passes de extrémement simpliste à très compliqué. Ya pas mal de choses que tu n'as pas vues (dans le tuto de M@teo du moins) que tu dois connaître pour recoder un printf(), même basique et allégé.
            • Partager sur Facebook
            • Partager sur Twitter
              28 février 2010 à 14:04:28

              Personnelement, je connais plutot fonction variadique (à nombre variable d'arguments).
              • Partager sur Facebook
              • Partager sur Twitter
                28 février 2010 à 14:09:59

                printf est une fonction a arguments variables (qui demande de connaitre stdarg) et une fonction avec beaucoup de cas a traiter (%s, %d %f %0.6f ... \\ \n %% ... etc)
                Elle sera longue a refaire.

                Elle s'appuie sur la fonction fputc qui écrit un caractère. Certains étudiants d'écoles d'info ont ce TP a faire, de recoder printf : mais ils en chient déja pas mal :)
                • Partager sur Facebook
                • Partager sur Twitter

                Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  28 février 2010 à 14:14:08

                  Ha donc elle s'appuie elle meme sur fputc.
                  Ca facilite un peu le travail.
                  Mais rien que pour parser et traiter la premiere chaine (qui correspond au format), il y a deja de quoi s'amuser ...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 février 2010 à 16:10:31

                    ok je ferai ça lorsque j'aurais un peu plus d'experience alors ;) .

                    Pour ne pas crée de topic pour chaque fonction que je veux faire , je vais poster ici lorsque j'ai des difficultées pour créer tel ou tel fonction .

                    En voici une :D . J'essaye de refaire la fonction sqrt Pour cela je me suis demander quel formule il faut que j'utilise , etant en terminal je ne le sais toujours pas :lol: . Bon donc je vais faire avec un peu de logique ce qui me donne ça :

                    Fonction :
                    double racine( double racine )
                                {
                    
                                double resultat = 0.000;
                                double i = 0.000;
                                double maximum = racine;
                    
                    
                                for( i = 0.000 ; i < maximum ; i += 0.001 )
                    
                                        {
                                            if( i * i == racine)
                    
                                            {
                                                resultat = i;
                    
                    
                                            }
                    
                     
                                        }
                    
                                return resultat;
                    
                    
                                }
                    


                    Prototype :
                    double racine(double naturel);
                    


                    Main.c :
                    printf("%f",racine(25));
                    


                    Malheuresement j'obtient 0.0000 au lieu de 5.00000 :colere2:


                    Ah oui , le nombre x sera en general plus grand que la racine de x , apart si celui si est inferieur à 1 donc pour la condition je la ferai plus tard
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 février 2010 à 18:24:04

                      Déja, jamais de == sur un double. C'est la d'ou vient ton soucis.
                      Car 5.0 * 5.0, est ce que, pour la machine, ça fait exactement 25, ou alors ça fait 25.000000000000000000000000001 ?

                      Tu ne sais pas...

                      Donc pas de ==

                      Sinon, je te suggere plutot une approche dichotomique.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                        28 février 2010 à 19:37:39

                        Citation : Fvirtman

                        Déja, jamais de == sur un double


                        Tout d'un coup , j'ai l'impression que les doubles sont beaucoup moins flexible :D . Enfin si l'on peut pas comparer des doubles ...

                        Qu'est ce cette approche dichotomique ?

                        J'ai pu voir sur wikipedia >_< , que c'est une serie de conditions de superieur / inferieur contrairement au egalité , cela permet de faire beaucoup moins de conditions ... c'est ce que j'ai compris

                        Mais la à l'occurence même avec cette approche je vais à la fin faire une conditions d'egalité ... ce qui m'amenera encore au defaut du type double :(

                        Merci
                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 février 2010 à 19:50:22

                          tu fais la dichotomie jusqu'a ce que ta borne max et min aient une différence plus petite qu'un espilon que tu détermines.

                          La dichotomie, regarde le juste prix pour comprendre, a la fin quand ils évaluent la vitrine. C'est ça :)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                            28 février 2010 à 20:08:25

                            Pas facile à reduire ce min et max pour trouver le carré ;) j'aurai pu lui faire une boucle concernant tout les nombre qui existe :D . (je te jure j'ai essayé mais j'ai fermé mon programme bien avant la fin du traitement :lol: )
                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 février 2010 à 20:14:35

                              Ya un algorithme qui calcule la racine carrée d'un nombre. Par contre je saurai pas l'expliquer (chui nul en maths) donc je poste juste le code...
                              #include <stdio.h>
                              
                              int main(void)
                              {
                                  double N = 9781412;   //on cherche la racine de N
                                  double essai = N;   //initialisation à n'importe quel nombre sauf 0
                                  double dernierEssai; //cette variable sert à savoir si on est assez précis
                              
                                  do
                                  {
                                      dernierEssai = essai; 
                                      essai = ((N/essai) + essai)/2;   //pour converger...
                                  }while(dernierEssai != essai); //si ce tour de boucle n'a rien changé, la précision est maximale
                              
                                  printf("%f\n", essai);
                              
                                  return 0;
                              }
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                                28 février 2010 à 20:34:27

                                Moi non plus , je comprend pas du tout les calcul venant de la boucle >_<
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 février 2010 à 20:53:14

                                  Moi je saurais pas trop l'expliquer non plus. Je peux essayer de t'expliquer l'algorithme :

                                  Imagines que tu cherches la racine de 50 :

                                  tu fais une approximation (50/2 = 25 par exemple)
                                  ensuite tu calcules la moyenne de 50/25(=2) et de 25.
                                  On trouve (25+2) / 2 = 13.5

                                  tu recommences, cette fois-ci l'approximation est 13.5
                                  tu calcules la moyenne de 50/13.5(=3.7037037) et de 13.5.
                                  On trouve (3.7037037+13.5) / 2 = 8.60185185

                                  tu recommences avec 8.60185185...


                                  La variable dernierEssai sert juste à savoir si il faut s'arrêter.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    28 février 2010 à 22:05:26

                                    Topic plus ou moins résolu :)
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    La fonction printf

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown