Partage

La fonction printf

Sujet résolu
Le 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
Publicité
Le 28 février 2010 à 13:28:47
Le 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
Le 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.
Le 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.
Le 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é.
Le 28 février 2010 à 14:04:28

Personnelement, je connais plutot fonction variadique (à nombre variable d'arguments).
Le 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 :)
Recueil de codes C et C++ : http://fvirtman.free.fr/recueil/index.html
Le 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 ...
Le 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
Le 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.
Recueil de codes C et C++ : http://fvirtman.free.fr/recueil/index.html
Le 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
Le 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 :)
Recueil de codes C et C++ : http://fvirtman.free.fr/recueil/index.html
Le 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: )
Le 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;
}
Le 28 février 2010 à 20:34:27

Moi non plus , je comprend pas du tout les calcul venant de la boucle >_<
Le 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.
Staff Le 28 février 2010 à 21:55:02

La meilleur explication que j'ai trouvée ici
Le 28 février 2010 à 22:05:26

Topic plus ou moins résolu :)

La fonction printf

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown