Advertisement
Guest User

proj2.c

a guest
Nov 26th, 2014
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. void help()
  7. {
  8.     printf("operace - první argument: \n"
  9.     "\t select:z tabulky vybere a vytiksne hodnoty daných bunek\n"
  10.     "\t min:vyhledani a tisk min hodnoty z daneho rozsahu bunek\n"
  11.     "\t max:vyhledani a tisk max hodnoty z daneho rozsahu bunek\n"
  12.     "\t sum:vypocet a tisk sumy hodnot vsech vybranych bunek\n"
  13.     "\t avg:vypocet a tisk aritmetického prumeru vybranych bunek\n"
  14.     "vyber_bunek nebo-li rozsah tabulky, druha argument: \n"
  15.     "\t row: X znaci vyber vsech bunek na radku X (X > 0)\n"
  16.     "\t col: X znaci vyber vsech bunek ve sloupci X (X > 0)\n"
  17.     "\t rows: X Y znaci vyber vsech bunek od radku X (vcetne) po Y (vcetne)0 < X <= Y\n"
  18.     "\t cols: X Y znaci vyber vsech bunek od sloupce X (vcetne)po Y (vcetne)0 < X <= Y\n"
  19.     "\t range: A B X Y znaci vyber vsech bunek od radku A po radek B a rozsahu sloupcu <X;Y>, 0 < A <= B, 0 < X <= Y\n");
  20.  
  21. }
  22.  
  23. double cfrac_tan(double x, int n)
  24. {
  25.     double result = 0;
  26.     double liche;
  27.     // prvotni clen
  28.     liche = n*2-1;
  29.  
  30.     double delenec;
  31.  
  32.     delenec = 1/x;
  33.  
  34.     double vysledek;
  35.  
  36.     int i;
  37.  
  38.     for (i = n; i>0; i--){
  39.         vysledek = liche*delenec;
  40.         liche = liche-2;
  41.         // počitame "od zadu" v zretezenm zlomku
  42.         // delime 1.0 pořád dokola
  43.         result = 1.0/(vysledek - result);
  44.         //printf("%e\n",result);
  45.     }
  46.  
  47.     return result;
  48. }
  49.  
  50.  
  51. double taylor_tan(double x, int n)
  52. {
  53.     double clen = x;
  54.     double soucet = x;
  55.  
  56.     // citatele koeficienty
  57.     double pole1[] = {1, 1, 2, 17, 62, 1382, 21844, 929569, 6404582, 443861162, 18888466084, 113927491862, 58870668456604};
  58.     // jmenovatele koeficienty
  59.     double pole2[] = {1, 3, 15, 315, 2835, 155925, 6081075, 638512875, 10854718875, 1856156927625, 194896477400625, 49308808782358125, 3698160658676859375};
  60.     for (int i = 1; i < n; i++){
  61.         // pocita nasledujici clen x^1, x^3, x^5
  62.         clen *= (x*x);
  63.         // vypocet dle vzorce klasickeho
  64.         soucet += (pole1[i]/pole2[i]*clen);
  65.     }
  66.  
  67.     return soucet;
  68. }
  69.  
  70.  
  71. double delka (double a, double c)
  72. {
  73.     // vypocet dle goniometrických fci v pravouhlem trojuhelniku
  74.     double vzdalenost = c/cfrac_tan( a, 10);
  75.     return vzdalenost;
  76. }
  77.  
  78.  
  79. double vyska (double a, double b, double c)
  80. {
  81.     // vypocet dle goniometrickych fci v pravouhlem trojuhelniku
  82.     double vyska = delka(a,c)*cfrac_tan(b,10)+c;
  83.     return vyska;
  84. }
  85.  
  86.  
  87. int main(int argc, char *argv[])
  88. {
  89.     double a, b;
  90.     // rozsah pro počet iterací  v --tan
  91.     int n,m;
  92.  
  93.     // implicitní výška (výchozí hodnota 1.5 metrů pro c)
  94.     double c = 1.5;
  95.     char *err;
  96.  
  97.     // pokud je první parametr == --help, vypíše napovědu
  98.     if (strcmp(argv[1],"--help") == 0){
  99.         help();
  100.     }else if (strcmp(argv[1],"--tan") == 0){
  101.         // argumentů může být při porovnávání tangens přesně 5, pokud jich není pět vypíšeme chybu
  102.         if (argc != 5){
  103.             printf("chyba");
  104.             return -1;
  105.         }
  106.  
  107.         // převedeme vše na spravné čísla, a na double, n a m na integer
  108.         a = strtod(argv[2],NULL);
  109.         n = strtol(argv[3],NULL,10);
  110.         m = strtol(argv[4],NULL,10);
  111.  
  112.         // porovnaváme jednotlivé tangens voláním konkrétních funkcí
  113.         for (n; n <= m; n++){
  114.             double vysledekZ = cfrac_tan(a, n);
  115.             double vysledekT = taylor_tan(a, n);
  116.             // fabs - slouží k vypočtu absolutní hodnoty ....
  117.             printf("%d %e %e %e %e %e\n",n, tan(a),vysledekT,fabs(tan(a)-vysledekT), vysledekZ, fabs(tan(a)-vysledekZ));
  118.         }
  119.  
  120.     // pokud je parametr roven volitelnému -c tak pokračujeme
  121.     }else if (strcmp(argv[1],"-c") == 0){
  122.         // počet parametrů prostě nemůže být větší než 6
  123.         if (argc > 6){
  124.             printf("chyba");
  125.             return -1;
  126.         }
  127.  
  128.          // převedeme c na číslo
  129.          c = strtod(argv[2],&err);
  130.  
  131.          if (*err!=0){
  132.             printf("chyba");
  133.             return -1;
  134.          }
  135.  
  136.           // kontrola parametrů
  137.           if (strcmp(argv[3],"-m") == 0){
  138.  
  139.                  a = strtod(argv[4],&err);
  140.  
  141.                 if (*err != 0){
  142.                     printf("chyba");
  143.                     return -1;
  144.                 }
  145.  
  146.                  // ošetření úhlu a v rozsahu 0 - 1.4
  147.                  if(a < 0 || a > 1.4){
  148.                         printf("chyba");
  149.                         return -1;
  150.                  }
  151.  
  152.                  // defaultně vypisujeme a počítáme délku
  153.                  printf("%.10e\n", delka(a,c));
  154.  
  155.                  // pokud je zadaný parametr b tak počítáme i výšku
  156.                  if (argc == 6){
  157.                     // pokud je zadaný parametr b tak ho převedeme na číslo a zkontrolujeme
  158.                     b = strtod(argv[5],&err);
  159.  
  160.                     if (*err!=0){
  161.                         printf("chyba");
  162.                         return -1;
  163.                     }
  164.  
  165.                  // nakonec vypočteme výšku
  166.                  printf("%.10e\n", vyska(a,b,c));
  167.               }
  168.           }
  169.     // pokud zde není volitelný parametr c
  170.     }else if (strcmp(argv[1],"-m") == 0){
  171.             // převedeme a na číslo a ošetříme viz výše...
  172.             a = strtod(argv[2],&err);
  173.  
  174.             if (*err!=0){
  175.                 printf("chyba");
  176.                 return -1;
  177.             }
  178.  
  179.             // vypočteme vzdálenost
  180.             printf("%.10e\n",delka(a,c));
  181.  
  182.             if (argc == 4){
  183.                 // pokud je zadané b tak ho převedeme na číslo a zkontrolujeme
  184.                 b = strtod(argv[3],&err);
  185.  
  186.                 if (*err!=0){
  187.                     printf("chyba");
  188.                     return -1;
  189.                 }
  190.  
  191.                  // nakonec vypočteme výšku
  192.                  printf("%.10e\n",vyska(a,b,c));
  193.             }
  194.     }else{
  195.         printf("chyba");
  196.         return -1;
  197.     }
  198.  
  199.     return 0;
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement