Mathc gnuplot/Fichiers pour gnuplot
Quelques fonctions C à connaitre :
Préambule
modifierf_p=fopen("a.txt","w"); //(write) Créer un fichier en écriture.
f_p=fopen("a.txt","r"); //(read) 0uvrir un fichier en lecture.
f_p=fopen("a.txt","a"); //(append) 0uvrir un fichier en écriture.
// Rajouter le texte en fin de fichier.
printf( "%d",i); // Imprimer sur l'écran.
fprintf(f_p,"%d",i); // Imprimer dans le fichier *f_p
sprintf( s,"%d",i); // Imprimer dans la chaine de caractères s.
Éviter les lettres accentuées dans les fichiers sources (*.c,*.h), cela pose des problèmes pour échanger les fichiers entre Windows et Linux ou à l'international.
Premiers fichiers
modifierUn fichier list.txt
modifier- Copiez cet exemple dans votre éditeur.
- Sauvez-le sous le nom "c01.c"
- Compilez et exécutez-le.
gcc -lm c01.c -o c01.exe ;./c01.exe
- Éditer le fichier "list.txt"
c01.c Un fichier list.txt |
---|
/* ------------------------------ */
/* Save as c01.c */
/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */
double f(double x){return(pow(x,2.));}
/* ------------------------------ */
int main(void)
{
FILE *fp; /*Déclarer un pointeur de fichier. */
double a;
/*Ouvrir le fichier en mode écriture.*/
fp = fopen("list.txt","w"); /*fp est un pointeur de fichier */
/*qui pointe sur "list.txt" */
for(a = -5.0; a <= 5.0; a++)
fprintf(fp," %6.3f %6.3f\n",/*Imprimer dans le fichier */
a, f(a));
fclose(fp); /*Fermer le fichier */
printf("\n\n Ouvrir le fichier list.txt "
"\n\n Press return to continue. ");
getchar();
return 0;}
Un fichier de données pour gnuplot
modifierNous ne mettrons pas d'extension pour les fichiers de données avec gnuplot.
- Compilez et exécutez-ce fichier.
- Éditez le fichier "data"
- Dans gnuplot tapez :
plot "data"
c02.c Un fichier de données pour gnuplot |
---|
/* ------------------------------ */
/* Save as c02.c */
/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */
double f(double x){return(pow(x,2.));}
/* ------------------------------ */
int main(void)
{
FILE *fp = fopen("data","w");
double a = -5.0;
for(; a <= 5.0; a+=.2)
fprintf(fp," %6.3f %6.3f\n",a,f(a));
fclose(fp);
printf(" Dans gnuplot -> plot \"data\" \n\n"
" Press return to continue. \n\n");
getchar();
return 0;
}
Un fichier de commande pour gnuplot
modifierL'extension des fichiers de commande de gnuplot est "*.plt" Ici on dessine deux chaines de caractères.
- Compilez et exécutez-ce fichier.
- Éditez le fichier "a_main.plt"
- Dans gnuplot tapez :
load "a_main.plt"
c03.c Un fichier de commande pour gnuplot |
---|
/* ------------------------------ */
/* Save as c03.c */
/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */
char heq[] = "sin(x)";
char geq[] = "cos(x)";
/* ------------------------------ */
int main(void)
{
FILE *fp = fopen("a_main.plt","w");
fprintf(fp,"# Fichier de commande pour gnuplot \n"
"# En ligne de commande : load \"a_main.plt\"\n"
"#\n"
" set zeroaxis\n"
" plot %s,\\\n"
" %s \n\n"
" reset", geq, heq);
fclose(fp);
printf("\n\n load \"a_main.plt\" with gnuplot."
"\n\n Press return to continue. ");
getchar();
return 0;
}
Cela donne dans le fichier "a_main.plt" :
# Fichier de commande pour gnuplot
# En ligne de commande : load "a_main.plt"
#
set zeroaxis
plot cos(x),\
sin(x)
reset
On peut remarquer que chaque fonction est sur une ligne différente. Important si l'on veut dessiner quatre ou cinq fonctions.
Dessiner une liste et une chaîne de caractères
modifierOn associe les deux méthodes vues précédemment.
- Compilez et exécutez-ce fichier.
- Éditez le fichier "a_main.plt"
- Dans gnuplot tapez :
load "a_main.plt"
c04.c Dessiner une liste et une chaîne de caractères |
---|
/* ------------------------------ */
/* Save as c04.c */
/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */
double f(double x){return(cos(x));}
/* ------------------------------ */
char feq[] = "cos(x)";
/* ------------------------------ */
int main(void)
{
FILE *fp;
double a = -5.0;
fp = fopen("data","w");
for(; a <= 5.0; a+=.2)
fprintf(fp," %6.3f %6.3f\n", a, f(a));
fclose(fp);
fp = fopen("a_main.plt","w");
fprintf(fp,"# Fichier de commande pour gnuplot \n"
"# En ligne de commande : load \"a_main.plt\"\n"
"#\n"
" set zeroaxis\n"
" plot \"data\",\\\n"
" %s\n"
" reset",feq);
fclose(fp);
printf("\n\n load \"a_main.plt\" with gnuplot."
"\n\n Press return to continue. ");
getchar();
return 0;
}
Cela donne dans le fichier "a_main.plt" :
# Fichier de commande pour gnuplot
# En ligne de commande : load "a_main.plt"
#
set zeroaxis
plot "data",\
cos(x)
reset
Une fonction graphique
modifierOn met simplement le contenu de la fonction main() dans G_plot().
- Compilez et exécutez-ce fichier..
- Éditez le fichier "a_main.plt"
- Dans gnuplot tapez :
load "a_main.plt"
c05.c Une fonction graphique |
---|
//* ------------------------------ */
/* Save as c05.c */
/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */
double f(double x){return(cos(x));}
char feq[] = "cos(x)";
/* ------------------------------ */
int G_plot(void)
{
FILE *fp;
double a = -5.0;
fp = fopen("data","w");
for(; a <= 5.0; a+=.2)
fprintf(fp," %6.3f %6.3f\n",a,f(a));
fclose(fp);
fp = fopen("a_main.plt","w");
fprintf(fp,"# Fichier de commande pour gnuplot \n"
"# En ligne de commande : load \"a_main.plt\"\n"
"#\n"
" set zeroaxis\n"
" plot \"data\",\\\n"
" %s\n"
" reset",feq);
fclose(fp);
return 0;
}
/* ------------------------------ */
int main(void)
{
G_plot();
printf("\n\n load \"a_main.plt\" with gnuplot."
"\n\n Press return to continue. ");
getchar();
return 0;
}
Cela donne dans le fichier "a_main.plt" :
# Fichier de commande pour gnuplot
# En ligne de commande : load "a_main.plt"
#
set zeroaxis
plot "data",\
cos(x)
reset
Les ennuis commencent
modifierÀ partir des fichiers précédents, essayer de dessiner la fonction g, sans modifier G_plot() ?
/* ------------------------------ */
double g(double x){return(sin(x));}
char geq[] = "sin(x)";
/* ------------------------------ */
Une solution va être proposée dans le chapitre suivant : Pointeurs de fonctions.
Conclusion
modifierNous avons dessiné des fonctions sous forme de chaînes de caractères et sous la forme de liste de points.
Un problème est apparu : rendre les fonctions graphiques indépendantes de la fonction utilisée.