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
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.
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.
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é.
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
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 ...
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 . 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 . 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
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
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.
Tout d'un coup , j'ai l'impression que les doubles sont beaucoup moins flexible . 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
Pas facile à reduire ce min et max pour trouver le carré j'aurai pu lui faire une boucle concernant tout les nombre qui existe . (je te jure j'ai essayé mais j'ai fermé mon programme bien avant la fin du traitement )
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;
}
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.
× 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.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Objectif Zéro Bug - le test logiciel professionnel | L'électronique de zéro | Tableaux & pointeurs | Pointeurs sur fonctions | Lecture/écriture binaire