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);