Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Projekt č. 2, předmět IZP
- * Autor: Dominik Dvořák, xdvora1t@stud.fit.vutbr.cz
- * Skupina: 1BIA
- * Datum: 24.11.2014
- * Název souboru: proj2.c
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- void Help()
- {
- printf("Program implementuje vypocet fce tg se zadanym poctem iteraci \n"
- "a dale vypocet delky a vysky pomoci udaju zadanych uzivatelem.\n"
- "\n"
- "Spusteni programu:\n"
- "./proj2 --help\n"
- "./proj2 --tan A N M\n"
- "./proj2 [-c X] -m A [B]\n"
- "A, B - uhel [rad]\n"
- "N, M - pocet iteraci [1]\n"
- "X - vyska mereni [m]\n"
- "\n"
- "Priklady spravneho spusteni:\n"
- "./proj2 --tan 1.024 6 10\n"
- "./proj2 -m 0.3 0.9\n"
- "./proj2 -c 1.7 -m 0.15 1.3\n"
- "\n"
- "Rozsah moznych hodnot:\n"
- "N >= M\n"
- "0 < N <= M < 14\n"
- "0 < A <= 1.4\n"
- "0 < B <= 1.4\n"
- "0 < X <= 100\n"
- "(implicitni hodnota X je 1.5)\n"
- );
- }
- //**************************************
- int Error(unsigned int n) //funce pro výpis chybových stavů
- {
- if (n == 1) fprintf(stderr,"Error! \n - chyba v argumentech, pro napovedu zadejte jmeno programu a --help\n"); //chyba argumentu
- 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
- 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
- return 1;
- }
- //**************************************
- double dabs(double number) //fce na absolutni hodnotu
- {
- if (number < 0) number *= -1;
- return number;
- }
- //**************************************
- double Taylor_Tan(double rad, unsigned int iter) //fce pro vypocet tangens pomoci Taylorovy rady
- {
- long long numer[13] = {1, 1, 2, 17, 62, 1382, 21844, 929569, 6404582, //citatele pro Taylorovu radu
- 443861162, 18888466084, 113927491862, 58870668456604};
- long long denom[13] = {1, 3, 15, 315, 2835, 155925, 6081075, 638512875, //jmenovatele
- 10854718875, 1856156927625, 194896477400625,
- 49308808782358125, 3698160658676859375};
- unsigned int i = 1; //
- unsigned int a = 1; //
- unsigned int x = 0; //
- double powa = rad;
- double result;
- while (x != iter)
- {
- if (x == 0)
- {
- result = rad;
- }
- else
- {
- while (i != a)
- {
- powa = rad * powa;
- i++;
- }
- result = result + ((numer[x] * powa) / denom[x]);
- i = 1;
- powa = rad;
- }
- x++;
- a = a + 2;
- }
- return result;
- }
- //**************************************
- double Cfrac_Tan(double rad, unsigned int n) //fce pro vypocet tg pomoci zretezenych zlomku
- {
- unsigned int k = n; //pocet iteraci
- double numer = rad * rad; //mocnina
- double addend;
- double fraction;
- for (; k >= 1 ; k--)
- {
- addend = (k+1) * 2 - 1;
- fraction = numer / (addend - fraction);
- }
- return rad / (1 - fraction);
- }
- //**************************************
- void Tan_Comp(double rad, unsigned int begin, unsigned int end) //fce pro porovnání vypoctu tg pomocí Taylora a zretez. zlomku
- {
- unsigned int arr_ix = 1;
- double CArray [end - begin];
- double TArray [end - begin];
- for (unsigned int i = begin; i != end + 1; i++)
- {
- CArray [arr_ix] = Cfrac_Tan(rad, i - 1);
- TArray [arr_ix] = Taylor_Tan(rad, i);
- double x = dabs(TArray [arr_ix] - tan (rad));
- double y = dabs(CArray [arr_ix] - tan (rad));
- printf("%d %e %e %e ", i , tan(rad), TArray [arr_ix], x);
- printf("%e %e\n", CArray [arr_ix], y);
- arr_ix++;
- }
- }
- //**************************************
- void Measur_Dist(double alpha, double beta, double c) //fce pro vypocet vzdalenosti
- {
- double result = 0, result_old = 1;
- unsigned int n = 1;
- while (dabs(result - result_old) > 0.0000000001) //pocet iteraci je dan presnosti na 10 desetinnych mist
- {
- result_old = result;
- result = Cfrac_Tan (alpha, n);
- n++;
- }
- double lenght = c / result;
- printf("%.10e\n", lenght);
- if (beta != -42)
- {
- result = 0;
- result_old = 1;
- n = 1;
- while (dabs(result - result_old) > 0.0000000001)
- {
- result_old = result;
- result = Cfrac_Tan (beta, n);
- n++;
- }
- printf("%.10e\n", lenght * result + c);
- }
- }
- //**************************************
- int main(int argc, char **argv)
- {
- if (argc>1)
- {
- if ((strcmp(argv[1], "--help")) == 0) //vypis napovedy
- {
- Help();
- }
- else if ((strcmp(argv[1], "--tan")) == 0)
- {
- if (atoi(argv[3]) < 1 || atoi(argv[4]) > 13 || atoi(argv[3]) > atoi(argv[4])) Error(1); //kontrola rozsahu
- else if (strtod(argv[2], NULL) > 1.4 || strtod(argv[2], NULL) <= 0) Error(2); //kontrola velikosti uhlu
- else Tan_Comp(strtod(argv[2], NULL), atoi(argv[3]), atoi(argv[4]));
- }
- else if ((strcmp(argv[1], "-m")) == 0)
- {
- double c = 1.5;
- unsigned int error = 0;
- double beta = -42; //pokud neni zadana beta, je dosazena -42 - ovlivnuje pozdejsi chovani programu
- if (argc==4) //jen pokud je zadana i beta
- {
- beta = strtod(argv[3],NULL);
- if (beta > 1.4 || beta <= 0) error = Error(2); //kontrola bety
- }
- if (strtod(argv[2], NULL) > 1.4 || strtod(argv[2], NULL) <= 0) error = Error(2); //kontrola alphy
- if (error == 0) Measur_Dist(strtod(argv[2], NULL), beta, c); //spusti se, pokud nejsou zadne predchozi errory
- }
- else if ((strcmp(argv[1], "-c")) == 0)
- {
- double c = 1.5;
- unsigned int error = 0;
- c = strtod(argv[2], NULL);
- if (c > 100 || c <= 0) error = Error(3); //kontrola c
- double beta = -42;
- if (argc == 6)
- {
- beta = strtod(argv[5], NULL);
- if (beta > 1.4 || beta <= 0) error = Error(2);
- }
- if (strtod(argv[4], NULL) > 1.4 || strtod(argv[4], NULL) <= 0) error = Error(2);
- if (error == 0) Measur_Dist(strtod(argv[4], NULL), beta, c);
- }
- else Error(1); //chybny argument
- }
- return (EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement