Advertisement
robonx12

Untitled

Dec 3rd, 2014
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.21 KB | None | 0 0
  1. /* Projekt č. 2, předmět IZP
  2.  * Autor: Dominik Dvořák, xdvora1t@stud.fit.vutbr.cz
  3.  * Skupina: 1BIA
  4.  * Datum: 24.11.2014
  5.  * Název souboru: proj2.c
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <math.h>
  12.  
  13. void Help()
  14.     {
  15.         printf("Program implementuje vypocet fce tg se zadanym poctem iteraci \n"
  16.                "a dale vypocet delky a vysky pomoci udaju zadanych uzivatelem.\n"
  17.                 "\n"
  18.                 "Spusteni programu:\n"
  19.                 "./proj2 --help\n"
  20.                 "./proj2 --tan A N M\n"
  21.                 "./proj2 [-c X] -m A [B]\n"
  22.                 "A, B - uhel [rad]\n"
  23.                 "N, M - pocet iteraci [1]\n"
  24.                 "X - vyska mereni [m]\n"
  25.                 "\n"
  26.                 "Priklady spravneho spusteni:\n"
  27.                 "./proj2 --tan 1.024 6 10\n"
  28.                 "./proj2 -m 0.3 0.9\n"
  29.                 "./proj2 -c 1.7 -m 0.15 1.3\n"
  30.                 "\n"
  31.                 "Rozsah moznych hodnot:\n"
  32.                 "N >= M\n"
  33.                 "0 < N <= M < 14\n"
  34.                 "0 < A <= 1.4\n"
  35.                 "0 < B <= 1.4\n"
  36.                 "0 < X <= 100\n"
  37.                 "(implicitni hodnota X je 1.5)\n"
  38.               );
  39.     }
  40. //**************************************
  41. int Error(unsigned int n) //funce pro výpis chybových stavů
  42.     {
  43.         if (n == 1) fprintf(stderr,"Error! \n - chyba v argumentech, pro napovedu zadejte jmeno programu a --help\n"); //chyba argumentu    
  44.         if (n == 2) fprintf(stderr,"Error! \n - chyba velikosti uhlu, rozmezi je pouze (0;1.4>, pro napovedu zadejte jmeno programu a --help\n\n"); //chyba velikosti uhlu
  45.         if (n == 3) fprintf(stderr,"Error! \n - chyba vysky arg. -c, rozmezi je pouze (0;100>, pro napovedu zadejte jmeno programu a --help\n\n"); //chyba velikosti vysky
  46.         return 1;
  47.     }  
  48. //**************************************
  49. double dabs(double number)  //fce na absolutni hodnotu
  50.     {
  51.         if (number < 0) number *= -1;
  52.         return number;
  53.     }  
  54. //**************************************   
  55. double Taylor_Tan(double rad, unsigned int iter)  //fce pro vypocet tangens pomoci Taylorovy rady
  56.     {  
  57.         long long numer[13] = {1, 1, 2, 17, 62, 1382, 21844, 929569, 6404582, //citatele pro Taylorovu radu
  58.                               443861162, 18888466084, 113927491862, 58870668456604};
  59.         long long denom[13] = {1, 3, 15, 315, 2835, 155925, 6081075, 638512875, //jmenovatele
  60.                               10854718875, 1856156927625, 194896477400625,
  61.                               49308808782358125, 3698160658676859375};
  62.         unsigned int i = 1; //
  63.         unsigned int a = 1; //
  64.         unsigned int x = 0; //
  65.         double powa = rad;
  66.         double result; 
  67.         while (x != iter)
  68.             {              
  69.                 if (x == 0)
  70.                     {
  71.                         result = rad;  
  72.                     }
  73.                 else
  74.                     {
  75.                         while (i != a)
  76.                             {
  77.                                 powa = rad * powa;
  78.                                 i++;
  79.                             }  
  80.                         result = result + ((numer[x] * powa) / denom[x]);
  81.                         i = 1;
  82.                         powa = rad;
  83.                     }  
  84.                 x++;
  85.                 a = a + 2;     
  86.             }
  87.         return result;
  88.     }  
  89. //**************************************       
  90. double Cfrac_Tan(double rad, unsigned int n)  //fce pro vypocet tg pomoci zretezenych zlomku
  91.     {  
  92.         unsigned int k = n; //pocet iteraci
  93.         double numer = rad * rad; //mocnina
  94.         double addend;
  95.         double fraction;
  96.         for (; k >= 1 ; k--)   
  97.             {
  98.                  addend = (k+1) * 2 - 1;
  99.                  fraction = numer / (addend - fraction);
  100.             }
  101.         return rad / (1 - fraction);   
  102.     }
  103. //**************************************
  104. void Tan_Comp(double rad, unsigned int begin, unsigned int end) //fce pro porovnání vypoctu tg pomocí Taylora a zretez. zlomku
  105.     {  
  106.         unsigned int arr_ix = 1;
  107.         double CArray [end - begin];
  108.         double TArray [end - begin];
  109.         for (unsigned int i = begin; i != end + 1; i++)
  110.             {
  111.                 CArray [arr_ix] = Cfrac_Tan(rad, i - 1);
  112.                 TArray [arr_ix] = Taylor_Tan(rad, i);
  113.                 double x = dabs(TArray [arr_ix] - tan (rad));
  114.                 double y = dabs(CArray [arr_ix] - tan (rad));
  115.                 printf("%d %e %e %e ", i , tan(rad), TArray [arr_ix], x);
  116.                 printf("%e %e\n", CArray [arr_ix], y);
  117.                 arr_ix++;
  118.             }      
  119.     }
  120. //**************************************
  121. void Measur_Dist(double alpha, double beta, double c) //fce pro vypocet vzdalenosti
  122.     {  
  123.         double result = 0, result_old = 1;
  124.         unsigned int n = 1;
  125.         while (dabs(result - result_old) > 0.0000000001) //pocet iteraci je dan presnosti na  10 desetinnych mist
  126.             {  
  127.                 result_old = result;
  128.                 result = Cfrac_Tan (alpha, n);
  129.                 n++;     
  130.             }
  131.         double lenght = c / result;
  132.         printf("%.10e\n", lenght);
  133.         if (beta != -42)
  134.             {
  135.                 result = 0;
  136.                 result_old = 1;
  137.                 n = 1;
  138.                 while (dabs(result - result_old) > 0.0000000001)   
  139.                     {  
  140.                         result_old = result;
  141.                         result = Cfrac_Tan (beta, n);
  142.                         n++;     
  143.                     }
  144.                 printf("%.10e\n", lenght * result + c);
  145.             }  
  146.     }          
  147. //**************************************       
  148. int main(int argc, char **argv)
  149.     {
  150.         if (argc>1)
  151.           {
  152.          
  153.             if ((strcmp(argv[1], "--help")) == 0)   //vypis napovedy
  154.                 {            
  155.                     Help();
  156.                 }      
  157.             else if ((strcmp(argv[1], "--tan")) == 0)
  158.                 {  
  159.                     if (atoi(argv[3]) < 1 || atoi(argv[4]) > 13 || atoi(argv[3]) > atoi(argv[4])) Error(1); //kontrola rozsahu
  160.                     else if (strtod(argv[2], NULL) > 1.4 || strtod(argv[2], NULL) <= 0) Error(2); //kontrola velikosti uhlu
  161.                     else Tan_Comp(strtod(argv[2], NULL), atoi(argv[3]), atoi(argv[4]));
  162.                 }
  163.             else if ((strcmp(argv[1], "-m")) == 0) 
  164.                 {  
  165.                     double c = 1.5;
  166.                     unsigned int error = 0;
  167.                     double beta = -42; //pokud neni zadana beta, je dosazena -42 - ovlivnuje pozdejsi chovani programu
  168.                     if (argc==4) //jen pokud je zadana i beta
  169.                         {
  170.                             beta = strtod(argv[3],NULL);
  171.                             if (beta > 1.4 || beta <= 0) error = Error(2); //kontrola bety
  172.                         }
  173.                     if (strtod(argv[2], NULL) > 1.4 || strtod(argv[2], NULL) <= 0) error = Error(2); //kontrola alphy
  174.                     if (error == 0) Measur_Dist(strtod(argv[2], NULL), beta, c); //spusti se, pokud nejsou zadne predchozi errory
  175.                 }
  176.             else if ((strcmp(argv[1], "-c")) == 0) 
  177.                 {  
  178.                     double c = 1.5;
  179.                     unsigned int error = 0;
  180.                     c = strtod(argv[2], NULL);
  181.                     if (c > 100 || c <= 0) error = Error(3); //kontrola c
  182.                     double beta = -42;
  183.                     if (argc == 6)
  184.                         {
  185.                             beta = strtod(argv[5], NULL);
  186.                             if (beta > 1.4 || beta <= 0) error = Error(2);
  187.                         }
  188.                     if (strtod(argv[4], NULL) > 1.4 || strtod(argv[4], NULL) <= 0) error = Error(2);
  189.                     if (error == 0) Measur_Dist(strtod(argv[4], NULL), beta, c);
  190.                 }      
  191.             else Error(1); //chybny argument
  192.           }
  193.         return (EXIT_SUCCESS);   
  194.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement