on Mac - robertomecca.com

Transcript

on Mac - robertomecca.com
Da C, C++ a GNUplot su Mac (in breve)
C, C++
Gli ingredienti di cui si ha bisogno per scrivere e compilare/eseguire un programma in C (o
C++) tramite Mac sono gli stessi di Linux, ossia un editor di testo e un compilatore per tale
tipo di linguaggio.
Per quanto riguarda l’editor di testo, è possibile utilizzare TextEdit dato in dotazione
standard ricordandosi di fare attenzione all’estensione del file che deve essere sempre
.cpp
Uno dei compilatori più famosi è invece possibile scaricarlo da sito http://gcc.gnu.org/.
E’ gratuito e per istallarlo basta seguire la procedura indicata nel sito stesso.
Il modo molto più semplice di avere contemporaneamente un editor di testo (tra i più
evoluti) e un compilatore dello stesso tipo precedente è quello di installare xCode. Questo
software per sviluppatori consente di programmare in diversi tipi di linguaggi di
programmazione compreso il C e C++.
L’ultima versione di xCode (4.3.1) può essere installata gratuitamente andando sull’App
Store (previa registrazione).
Attenzione: la versione 4.3.1 funziona solo su Mac OS Lion.
Per scaricare le versioni precedenti di xCode bisogna completare la registrazione su
http://connect.apple.com/ e scegliere una versione opportuna rispetto a quella del proprio
sistema operativo.
Una volta editato un programma in C (o C++), la compilazione può essere effettuata anche
tramite Terminale.
Terminale è un applicazione per Mac che permette di utilizzare le potenzialità Unix del Mac
OS. Una volta posizionatisi (da Terminale) nella cartella dove è salvato il file .cpp, la
compilazione si ha scrivendo
g++ nome_file.cpp -o nome_eseguibile
Mentre per eseguirlo si scrive
./nome_eseguibile
GNUplot
In molti casi servirà utilizzare dei dati in uscita da un esecuzione di programma in C (o C+
+) di cui si vuole avere una visualizzazione grafica. GNUplot è utile proprio a leggere i dati
in output e a graficarli.
!
!
Installazione
- scaricare il programma dal link GNUplot_DownLoad dalla stessa pagina che conteneva
questo documento;
- aprire una finestra di Terminale e posizionarsi all’interno della cartella decompressa
gnuplot-4.4.4;
- digitare:
!
./configure
!
!
!
make
make check
sudo make install
!
Utilizzo (elaborazione grafica per output in C)
Un utilizzo tipico di GNUplot è quello di graficare, dati in input un elenco di punti nel piano
(o nello spazio), la curva (o la superficie) “unendo” i punti vicini (in genere) tramite
segmenti. Concentrando l’attenzione sulle curve nel piano, vediamo un esempio di
programma in C che scrive in output un file .txt adatto per essere letto da GNUplot.
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int main()
{int i,n;
double h,a,b,x,y;//a e b sono gli estremi dell’intervallo
printf("\n Questo programma stampa in un file i valori delle ascisse e
delle ordinate");
printf("\n di una funzione test (in questo caso della funzione seno)");
printf("\n per poi poterle stampare con GNU PLOT");
printf("\n Inserisci gli estremi dell’intervallo [a,b]");
printf("\n in cui si vuole stampare la funzione:");
printf("\n a = "); scanf("%lf",&a);
printf("\n b = "); scanf("%lf",&b);
printf("\n Inserisci il numero di intervalli su cui costruire la
funzione");
printf("\n n = ");scanf("%d",&n);
h=(b-a)/double (n);
printf("\n I dati salvati sul file sin.dat sono posizionati nel seguente
modo:\n\n");
FILE *fp1;
fp1=fopen("sin.txt","w+");
if (fp1==NULL) { printf("impossibile");
system("PAUSE");exit(1);}
for (i=0;i<=n;i++)
{ x=a+i*h;
y=sin(x);
printf("\n %5.5lf %5.5lf\n",x,y);
fprintf(fp1," %5.5lf %5.5lf\n",x,y); }
fclose(fp1);
return(0);
}
Per poter graficare con GNUplot i dati contenuti in “sin.txt” ci si deve posizionare tramite
Terminale nella cartella che contiene il file .txt e lanciare GNUplot scrivendo
gnuplot
plot ‘sin.txt’ with lines
E’ anche possibile salvare in un unico file i dati relativi a due (tre, etc) diversi grafici di
funzione come mostrato nel seguente esempio.
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int main()
{int i,n;
double h,a,b,x,ysin,ycos;//a e b sono gli estremi dell’intervallo
printf("\n Questo progrmma stampa in un file i valori delle ascisse e delle
ordinate");
printf("\n di due funzioni test (in questo caso delle funzioni seno e
coseno)");
printf("\n per poi poterle stampare con GNU PLOT");
printf("\n Inserisci gli estremi dell’intervallo [a,b]");
printf("\n in cui si vogliono stampare le funzioni:");
printf("\n a = "); scanf("%lf",&a);
printf("\n b = "); scanf("%lf",&b);
printf("\n Inserisci il numero di intervalli su cui costruire le
funzioni");
printf("\n n = ");scanf("%d",&n);
h=(b-a)/double (n);
printf("\n I dati salvati sul file sincos.dat sono posizionati nel seguente
modo:\n\n");
FILE *fp1;
fp1=fopen("sincos.txt","w+");
if (fp1==NULL) { printf("impossibile");
system("PAUSE");exit(1);}
for (i=0;i<=n;i++)
{ x=a+i*h;
ysin=sin(x);
ycos=cos(x);
printf("\n %5.5lf %5.5lf %5.5lf\n",x,ysin,ycos);
fprintf(fp1," %5.5lf %5.5lf %5.5lf\n",x,ysin,ycos); }
fclose(fp1);
return(0);
}
Il doppio (triplo, etc) plottaggio si effettua aprendo GNUplot e scrivendo poi
plot ‘sincos.txt’ using 1:2 with lines, ‘sincos.txt’ using 1:3 with lines
L’esempio che segue fornisce lo stesso output del programma precedente con la
sola differenza che e’ lo stesso programma a lanciare direttamente GNUplot
facendogli leggere i comandi (precedentemente caricati in comandi.txt).
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int main()
{int i,n;
double h,a,b,x,ysin,ycos;//a e b sono gli estremi dell’intervallo
printf("\n Questo progrmma stampa in un file i valori delle ascisse e delle
ordinate");
printf("\n di due funzioni test (in questo caso delle funzioni seno e
coseno)");
printf("\n per poi poterle stampare con GNU PLOT");
printf("\n Inserisci gli estremi dell’intervallo [a,b]");
printf("\n in cui si vogliono stampare le funzioni:");
printf("\n a = "); scanf("%lf",&a);
printf("\n b = "); scanf("%lf",&b);
printf("\n Inserisci il numero di intervalli su cui costruire le
funzioni");
printf("\n n = ");scanf("%d",&n);
h=(b-a)/double (n);
printf("\n I dati salvati sul file sincos.dat sono posizionati nel seguente
modo:\n\n");
FILE *fp1;
fp1=fopen("sincos.txt","w+");
if (fp1==NULL) { printf("impossibile");
system("PAUSE");exit(1);}
for (i=0;i<=n;i++)
{ x=a+i*h;
ysin=sin(x);
ycos=cos(x);
printf("\n %5.5lf %5.5lf %5.5lf\n",x,ysin,ycos);
fprintf(fp1," %5.5lf %5.5lf %5.5lf\n",x,ysin,ycos); }
fclose(fp1);
FILE *file;
file=fopen("comandi.txt","wt");
fprintf(file,"plot 'sincos.txt' using 1:2 with lines, 'sincos.txt' using
1:3with lines \n");
fprintf(file,"pause-1");
fclose(file);
system("gnuplot comandi.txt");
}
return(0);