Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Paint XYZ - Funzioni.h

Funzioni.h

Caricato da: Dany
Scarica il programma completo

  1. //Funzioni:
  2. #include <cmath>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. //Funzione "Pi di x", ovvero quanti numeri primi da 1 a x.
  7. int Primidi (int a)
  8. {
  9.     int b,d,c;
  10.     b=1;
  11.     d=0;
  12.     while (b<a)
  13.     {
  14.             b++;
  15.             c=2;
  16.             while (((b%c)!=0) && (c<=b))
  17.             c++;
  18.             if (c>=b)
  19.             {
  20.                 d++;
  21.             }
  22.     }
  23.     return d;
  24. }
  25. //Calcola numero divisori
  26. int numdiv (int a)
  27. {
  28.         if (a<0)
  29.                 a=-a;
  30.     int b,c=0;
  31.     b=1;
  32.     while (a>=b)
  33.     {
  34.         if (a%b ==0)
  35.         {
  36.                 c++;
  37.                 b++;
  38.         }
  39.         else b++;  
  40.     }
  41.     return c;
  42. }
  43. //Fattoriale
  44. double facto(int a)
  45. {
  46.       if (a>0)
  47.       {
  48.       int i;
  49.       float b=1;
  50.       for (i=1;i<=a;i++)
  51.       {
  52.           b=b*i;
  53.       }
  54.       return b;
  55.       }
  56. }
  57. //Associa funzioni a char
  58. float Fun (char a , float x)
  59. {
  60.       /*Trigonometria*/
  61.       if (a=='s')
  62.          return sin(x);
  63.       if (a=='c')
  64.          return cos(x);
  65.       if (a=='t')
  66.          return tan(x);
  67.       if (a=='a')
  68.          return asin(x);
  69.       if (a=='b')
  70.          return acos(x);
  71.       if (a=='d')
  72.          return atan(x);
  73.       if (a=='h')
  74.          return sinh(x);
  75.       if (a=='i')
  76.          return cosh(x);
  77.       if (a=='j')
  78.          return tanh(x);
  79.       /*Logaritmi*/
  80.       if (a=='L')
  81.          return log10(x);
  82.       if (a=='N')
  83.          return log(x);
  84.       if (a=='D')
  85.          return (log(x))/(log(2.0));
  86.       /*Varie*/
  87.       if (a=='A')
  88.          return fabs(x);
  89.       if (a=='I')
  90.          return (int(x));
  91.       if (a=='P')
  92.          return Primidi(int(x));
  93.       if (a=='!')
  94.          return facto(int(x));
  95.       if (a=='V')
  96.          return numdiv(int(x));
  97.       /*Algebra*/
  98.       if (a=='R')
  99.          return sqrt(x);
  100.       if (a=='C')
  101.          return pow(float(x),float((1/3.0)));
  102.       if (a=='Q')
  103.          return pow(float(x),float((1/5.0)));
  104. }
  105. //Funione a tre parametri char che come risultato ridà il carattere-funzione da mettere nell'rpn
  106. char charfun (char a, char b, char c)
  107. {
  108.         int bo=0;
  109.         /*Trigonometria*/
  110.         if ((a=='s')&&(b=='i')&&(c=='n')){bo++;
  111.                 return 's';}
  112.         if ((a=='c')&&(b=='o')&&(c=='s')){bo++;
  113.                 return 'c';}
  114.         if ((a=='t')&&(b=='a')&&(c=='n')){bo++;
  115.                 return 't';}
  116.         if ((a=='a')&&(b=='s')&&(c=='i')){bo++;
  117.                 return 'a';}
  118.         if ((a=='a')&&(b=='c')&&(c=='s')){bo++;
  119.                 return 'b';}
  120.         if ((a=='a')&&(b=='t')&&(c=='g')){bo++;
  121.                 return 'd';}
  122.         if ((a=='s')&&(b=='n')&&(c=='h')){bo++;
  123.                 return 'h';}
  124.         if ((a=='c')&&(b=='s')&&(c=='h')){bo++;
  125.                 return 'i';}
  126.         if ((a=='t')&&(b=='a')&&(c=='h')){bo++;
  127.                 return 'j';}
  128.         /*Logaritmi*/
  129.         if ((a=='l')&&(b=='o')&&(c=='g')){bo++;
  130.                 return 'L';}
  131.         if ((a=='l')&&(b=='o')&&(c=='n')){bo++;
  132.                 return 'N';}
  133.         if ((a=='l')&&(b=='o')&&(c=='d')){bo++;
  134.                 return 'D';}
  135.         /*Varie*/
  136.         if ((a=='a')&&(b=='s')&&(c=='s')){bo++;
  137.                 return 'A';}
  138.         if ((a=='i')&&(b=='n')&&(c=='t')){bo++;
  139.                 return 'I';}
  140.         if ((a=='q')&&(b=='r')&&(c=='m')){bo++;
  141.                 return 'P';}
  142.         if ((a=='f')&&(b=='a')&&(c=='c')){bo++;
  143.                 return '!';}
  144.         if ((a=='d')&&(b=='i')&&(c=='v')){bo++;
  145.                 return 'V';}
  146.         /*Algebra*/
  147.         if ((a=='r')&&(b=='a')&&(c=='d')){bo++;
  148.                 return 'R';}
  149.         if ((a=='r')&&(b=='a')&&(c=='c')){bo++;
  150.                 return 'C';}
  151.         if ((a=='r')&&(b=='a')&&(c=='q')){bo++;
  152.                 return 'Q';}
  153.         if (bo==0)
  154.         {
  155.                 return 0;
  156.         }
  157.  
  158. }
  159. //Converte le ascisse in coordinate x per la finestra
  160. int conx(double s,float max)
  161. {
  162.         int con;
  163.         con=int(500+(s*500/max));      
  164.         return con;
  165. }
  166. //Converte le ordinate in coordinate y per la finestra
  167. int cony(double s,float max)
  168. {
  169.         int con;
  170.         con=int(500-(s*500/max));
  171.         return con;
  172. }
  173. //Controlla se il carattere nello stack è una funzione
  174. int chkfun (char a)
  175. {
  176.         if ((a=='s')||(a=='c')||(a=='t')||(a=='a')||(a=='b')||(a=='d')||(a=='h')||(a=='i')||(a=='j')||
  177.                         (a=='L')||(a=='N')||(a=='D')||
  178. (a=='A')||(a=='I')||(a=='P')||(a=='!')||(a=='V')||
  179.         (a=='R')||(a=='C')||(a=='Q'))
  180.         {
  181.                 return 1;
  182.         }
  183.         else
  184.                 return 2;
  185. }
  186. //Controlla se (nella Function Window) nella conversione RPN, un carattere è una costante (o una variabile) o un'operatore
  187. int chkchar(char a)    
  188. {  
  189.         if ((('0'<=a)&&(a<='9'))||(a=='x')||(a=='p')||(a=='e')||(a=='y')||(a=='z'))       //Il carattere è una cifra, una costante o la variabile x.
  190.         {
  191.                 return 1;
  192.         }
  193.         if ((a=='+')||(a=='-')||(a=='*')||(a=='/')||(a=='^')||(a=='%'))                //Il carattere è un operatore
  194.         {
  195.                 return 2;
  196.         }
  197.         else
  198.                 return 3;
  199. }
  200. //Controlla la precedenza tra 2 operatori
  201. bool precedence(char op1, char op2)
  202. {
  203.         int first=0;
  204.         if ((op1=='+')||(op1=='-'))
  205.         {
  206.                 first=1;
  207.         }
  208.         if ((op1=='*')||(op1=='/')||(op1=='%'))
  209.         {
  210.                 first=2;
  211.         }
  212.         if ((op1=='^')||(chkfun(op1)==1))
  213.         {
  214.                 first=3;
  215.         }
  216.         /*******************/
  217.         int second=0;
  218.         if ((op2=='+')||(op2=='-'))
  219.         {
  220.                 second=1;
  221.         }
  222.         if ((op2=='*')||(op2=='/')||(op2=='%'))
  223.         {
  224.                 second=2;
  225.         }
  226.         if ((op2=='^')||(chkfun(op2)==1))
  227.         {
  228.                 second=3;
  229.         }
  230.         if ((first == second)||( first < second))
  231.                 return false;
  232.         else
  233.                 return true;
  234. }
  235. //Conta le cifre di un numero intero
  236. float numcif (double a)
  237. {
  238.        if (a<0)
  239.        {
  240.           a=-a;
  241.        }
  242.        double b;
  243.            float c;
  244.        b=log10(a);
  245.        c=ceil(b);
  246.        if (c==b)
  247.        {
  248.           c++;
  249.        }
  250.        if (a==0)
  251.        {
  252.           c=1;
  253.        }
  254.        return c;
  255. }
  256. //Solve RPN
  257. float SolveRPN(string rpn,float x,float y,float z)
  258. {
  259.         stack <float> numbers;
  260.         string longNumber = "";
  261.         float  result=0,prev=0,postv=0;
  262.         int chkop=0;
  263.         for (unsigned int h = 0; h < rpn.size(); h++)
  264.         {
  265.                 /*Il carattere letto e' un numero. Questo numero viene memorizzato
  266.                 * nella stringa di appoggio.
  267.                 * Se il prossimo carattere e' un numero,vuol dire che nella
  268.                 * stringa c'e un numero lungo perche' nella funzione di conversione
  269.                 * dopo ogni numero inserito nella stringa di output veniva messo anche
  270.                 * il simbolo di spazio. La prossima cifra del numero sara' aggiunta
  271.                 * alla fine della stringa di appoggio all'aumentare dell'indice.
  272.                 * Se il prossimo carattere non e' un numero, la stringa d'appoggio
  273.                 * viene convertita in un numero vero e memorizzata nello stack. */
  274.                 if(chkchar(rpn[h])==1)
  275.                 {
  276.                         if (isdigit(rpn[h]))
  277.                         {
  278.                                 longNumber += rpn[h];
  279.                         }
  280.  
  281.                         if (rpn[h]=='x')                         //sostitusco alla x nell'espressione il valore effettivo della x
  282.                         {
  283.                                 numbers.push(x);
  284.                         }
  285.  
  286.                         if ((rpn[h]=='y'))                         //sostitusco alla x nell'espressione il valore effettivo della x
  287.                         {
  288.                                 numbers.push(y);
  289.                         }
  290.                         if (rpn[h]=='z')
  291.                         {
  292.                                 numbers.push(z);
  293.                         }
  294.  
  295.                         if (rpn[h]=='e')                       //sostituisco alla e nell'espressione il valore della costante
  296.                         {
  297.                                 numbers.push(2.71828);
  298.                         }
  299.  
  300.                         if (rpn[h]=='p')                 //sostituisco alla p nell'espressione il valore della costante
  301.                         {
  302.                                 numbers.push(3.14159);
  303.                         }
  304.                         //Se il carattere successivo non è una cifra e è diverso dalla virgola:
  305.                         if((!isdigit(rpn[h + 1]))&& (rpn[h+1]!='.')&&(rpn[h]!='x')&&(rpn[h]!='e')&&(rpn[h]!='p')&&(rpn[h]!='y')&&(rpn[h]!='z'))  
  306.                         {
  307.                                 numbers.push(atof(longNumber.c_str()));
  308.                                 longNumber = "";
  309.                         }
  310.                         if (rpn[h+1]=='.')    //Se il carattere successivo è la virgola:
  311.                         {
  312.                                 numbers.push(atof(longNumber.c_str()));    //legge la parte precedente a questa (la parte intera )
  313.                                 longNumber = "";
  314.                                 prev = numbers.top();
  315.                                 numbers.pop();
  316.                                 int count=2;
  317.                                 while (isdigit(rpn[count+h]))      //Legge la parte successiva e la memorizza come numero
  318.                                 {
  319.                                         longNumber += rpn[h+count];
  320.                                         count++;
  321.                                 }
  322.                                 h=h+count;
  323.                                 postv=(atof(longNumber.c_str()));
  324.                                 longNumber="";
  325.                                 /*somma la parte precedente a quella successiva
  326.                                 fratto 10^il numero di cifre che ha es:
  327.                                 2.985     prev=2   postv=985
  328.                                 985 ha tre cifre quindi 985/10^3=0.985
  329.                                 li sommo e ottengo 2.985*/
  330.                                 numbers.push(prev+(postv/pow(10,numcif(postv))));      
  331.                                 postv=0;prev=0;
  332.                         }
  333.                 }
  334.                
  335.                 if (chkchar(rpn[h])==2)    //Il carattere è un operatore:
  336.                 {      
  337.                         chkop++;                //Controlla se vi è un operatore            
  338.                         result = numbers.top();
  339.                         numbers.pop();
  340.                         if (numbers.empty())       //se c'è un operatore all'inizio, è come se ci fosse lo 0 (es.-6=0-6)
  341.                         {                       //pertanto aggiungo lo 0
  342.                                 numbers.push(0.0);
  343.                         }
  344.                         /*****OPERATORS****************************************/
  345.                         switch(rpn[h])
  346.                         {
  347.                                 case '+':
  348.                                         result = numbers.top() + result ;
  349.                                 break;
  350.                                 case '-':
  351.                                         result = numbers.top() - result ;
  352.                                 break;
  353.                                 case '*':
  354.                                         result = numbers.top() * result ;
  355.                                 break;
  356.                                 case '/':
  357.                                         result = numbers.top() / result ;
  358.                                 break;
  359.                                 case '^':
  360.                                         result = pow(numbers.top() , result) ;
  361.                                 break;
  362.                                 case '%'://Operatore modulo
  363.                                         if (((int) numbers.top()!=0)&&((int) result!=0))
  364.                                         result =int(numbers.top()) % int(result) ;
  365.                                 break;
  366.                         }
  367.                         numbers.pop();
  368.                         numbers.push(result);
  369.                 }
  370.                 if (chkfun(rpn[h])==1)                       //Se c'è un carattere che corrisponde a una funzione:
  371.                 {
  372.                         /*La funzione 'Fun', dato un carattere
  373.                         *corrispondente a una funzione e un valore
  374.                         *float, ne calcola la funzione corrispondente.*/
  375.                         result=Fun(rpn[h],numbers.top());        //Fun è dichiarata in 'funzioni.h'
  376.                         numbers.pop();
  377.                         numbers.push(result);
  378.                 }
  379.                 if (chkop==0)    //Se nell'espressione non vi è alcun  operatore, allora vi deve essere un solo numero, perciò lo si associa a result
  380.                 //infatti chkop si incrementa se il carattere è un operatore(vedi sopra)
  381.                         result= numbers.top();
  382.         }
  383.        
  384.         return result;
  385. }
  386. //Calcola RPN
  387. string FoundRPN(char in[])
  388. {
  389. string rpn="";
  390. stack <char> operators;       //Dichiaro stack che conterrà gli operatori:            
  391. /*****************************************************************************/
  392. //CONVERTO LA STRINGA IN NOTAZIONE INFISSA IN RPN
  393. int h=0;
  394. for (h=0;h<=99;h++)
  395. {
  396.                                                 /* Se il carattere e' un numero, questo viene aggiunto alla fine  
  397.                                         * della stringa di output. Se il prossimo carattere non e' un
  398.                                         * numero, viene aggiunto il simbolo di spazio per la migliore
  399.                                         * leggibilita' dell'espressione in output */
  400.                                         if (chkchar(in[h])==1)
  401.                                         {
  402.                                                         rpn+=in[h];
  403.  
  404.                                                 if ((!isdigit(in[h + 1]))&&(in[h+1]!='.')&&(in[h+1]!=','))
  405.                                                 {
  406.                                                         rpn+=" ";
  407.                                                 }
  408.                                                 if ((in[h+1]=='.')||(in[h+1]==','))
  409.                                                 {
  410.                                                         rpn+=".";
  411.                                                 }
  412.                                         }
  413.                                        
  414.                                         /* Il carattere letto e' un operatore.
  415.                                         *               Se lo stack per gli operatori e' vuoto o il carattere
  416.                                         * precedente era la parentesi aperta o l'operatore letto ha
  417.                                         * una precedenza minore rispetto a quella dell'operatore inserito
  418.                                         * prima, l'operatore letto viene inserito normalmente nello stack.
  419.                                         *               Altrimenti se l'operatore letto ha una precedenza maggiore
  420.                                         * rispetto a quella dell'operatore inserito prima, dallo stack
  421.                                         * viene tolto l'operatore con la precedenza maggiore e viene messo
  422.                                         * nella stringa di output. */
  423.                                         if (chkchar(in[h])==2)
  424.                                         {
  425.                                                 bool usc=false;
  426.                                                 while (usc==false)
  427.                                                 {
  428.                                                         if ((operators.empty())||(operators.top()=='(')||(precedence(in[h],operators.top())))
  429.                                                         {
  430.                                                                 if ((chkchar(in[h-1])==1)||(in[h-1]==')'))
  431.                                                                         operators.push(in[h]);
  432.                                                                 usc=true;
  433.                                                         }
  434.                                                         else if (!precedence(in[h], operators.top()))
  435.                                                         {
  436.  
  437.                                                                 rpn+=operators.top();
  438.                                                                 rpn +=" ";
  439.                                                                 operators.pop();
  440.                                                         }
  441.                                                 }
  442.                                         }
  443.                                         /* Se il carattere è la s, il successivo è la i e quello ancora è la n, allora c'è la funzione sin:  ecc.....
  444.                                         La funzione 'charfun': data una serie di tre caratteri, se corrispondono a una funzione, copia il carattere corrispondente
  445.                                         alla funzione nello stack*/
  446.                                         char chf=charfun(in[h],in[h+1],in[h+2]);
  447.                                         if (chf!=0)
  448.                                                 operators.push(chf);
  449.                                         /*              Se il carattere letto e' una parentesi aperta, questa viene
  450.                                         * messa nello stack.
  451.                                         *               Se e' una parentesi chiusa, vuol dire che tutti gli operatori
  452.                                         * rimasti nello stack fino alla parentesi aperta vanno copiati nella
  453.                                         * stringa di output. La parentesi aperta viene cancellata dallo stack
  454.                                         * e dopo si contunua a leggere la stringa di input */
  455.                                         if (in[h]=='(')
  456.                                         {
  457.                                                 operators.push(in[h]);
  458.                                         }
  459.                                         /*Se il carattere è il meno e precedentemente non vi è alcun valore, vuol dire che si intende
  460.                                         *il negartivo di un valore es:-5, allora sostituisco al '-' ---->  '0-'   */
  461.                                         if ((in[h]=='-')&&(chkchar(in[h-1])!=1))
  462.                                         {
  463.                                                         rpn+='0';
  464.                                                         rpn+=' ';
  465.                                                         operators.push('-');
  466.                                         }
  467.                                         if(in[h] == ')')
  468.                                         {
  469.                                                 while(operators.top() != '(')   //In pratica scorre nello stack verso sinistra copiando gli operatori incontrati.
  470.                                                 {
  471.                                                         rpn+=operators.top();
  472.                                                         rpn+=" ";
  473.                                                         operators.pop();
  474.                                                 }
  475.                                                 operators.pop();      //Cancella la parentesi aperta
  476.                                         }
  477. }
  478.                                 /* Tutti gli operatori rimasti nello stack vanno copiati nella
  479.                                         stringa di output e poi cancellati dallo stack */
  480.  
  481.                                 while(!operators.empty())
  482.                                 {
  483.                                         rpn+=operators.top();
  484.                                         rpn+=" ";
  485.                                         operators.pop();
  486.                 }
  487. //////////////////Eventuale break point per verificare rpn.
  488.                                 rpn+=" ";
  489.         return rpn;
  490. }
  491. //Disegna Punti
  492. void Draw(HDC hdc,int x, int y, int rosso,int verde,int blu,double i,double j,double k, float Mz)
  493. {
  494.      //A seconda del valore dei tre colori e del valore di k (z), compone il colore che
  495.      //sarà usato per comporre i punti.
  496.      rosso=int(rosso*(k+Mz)/(2*Mz));
  497.      verde=int(verde*(k+Mz)/(2*Mz));
  498.      blu=int(blu*(k+Mz)/(2*Mz));
  499.      //Aumenta l'intesità dei colori per far risaltarei quelli disegnati
  500.      //con valori di k molto bassi, altrimenti invisibili.
  501.      if (rosso<=240)
  502.         rosso=rosso+15;
  503.      if (verde<=240)
  504.         verde=verde+15;
  505.      if (blu<=240)
  506.         blu=blu+15;
  507.      //Ogni 'punto' è costituito da 5 pixel a croce.
  508.      SetPixel(hdc,x,y,RGB(rosso,verde,blu));  
  509.      SetPixel(hdc,x+1,y,RGB(rosso,verde,blu));  
  510.      SetPixel(hdc,x-1,y,RGB(rosso,verde,blu));  
  511.      SetPixel(hdc,x,y+1,RGB(rosso,verde,blu));  
  512.      SetPixel(hdc,x,y-1,RGB(rosso,verde,blu));
  513.      //Se il valore della i(x),j(y),k(z)è vicino (uguale) a 0, disegna i relativi pixel
  514.      //di colore giallo per evidenziare l'intersezione con i piani del grafico.
  515.      if (((i<0.01)&&(i>-0.01))||((j<0.01)&&(j>-0.01))||((k<0.01)&&(k>-0.01)))      
  516.      {
  517.         SetPixel(hdc,x,y,RGB(255,255,0));  
  518.         SetPixel(hdc,x+1,y,RGB(255,255,0));  
  519.         SetPixel(hdc,x-1,y,RGB(255,255,0));  
  520.         SetPixel(hdc,x,y+1,RGB(255,255,0));  
  521.         SetPixel(hdc,x,y-1,RGB(255,255,0));
  522.      }
  523. }
  524. /********************************FINE****************************************/