Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.44 KB | None | 0 0
  1. /*
  2.  * Soubor:  proj1.c
  3.  * Datum:   20.11.2014
  4.  * Autor:   Adam Bezak - 1BIA - xbezak01@stud.fit.vutbr.cz
  5.  * Projekt: Iteracni vypocty
  6.  * Popis:   Implementujte vypocet vzdalenosti a vysky mereneho objektu pomoci udaju ze senzoru
  7.  *          natoceni mericiho pristroje. Vypocet provedte pouze pomoci matematickych operaci +,-,*,/.
  8.  *
  9.  */
  10.  
  11. #include <stdio.h> // vstup a vystup
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include <math.h>
  15.  
  16. #define ERR_TOO_FEW_ARGS        11
  17. #define ERR_TOO_MANY_ARGS       12
  18. #define ERR_UNDEFINED_ARG       13
  19. #define ERR_INVALID_LIMITS      14
  20. #define ARGV_MAX_COUNT 5
  21.  
  22. #define TRUE 1
  23. #define ACTION_HELP 1
  24. #define ACTION_TAN 2
  25. #define ACTION_RANGE 3
  26.  
  27. #define RADIANS 0
  28. #define WHERE_N 1
  29. #define WHERE_M 2
  30.  
  31. #define RADIANS_A 0
  32. #define RADIANS_B 1
  33. #define HEIGHT 2
  34.  
  35. #define UNDEF -1
  36. #define MAX 14
  37. #define MAX_RAD 1.4
  38. #define CONST_HEIGHT 1.5
  39. #define MAX_HEIGHT 100
  40. #define ITERATIONS 9
  41.  
  42. const long long citatel[] = {1, 1, 2, 17, 62, 1382, 21844, 929569, 6404582, 443861162, 18888466084, 113927491862, 58870668456604};
  43. const long long menovatel[] = {1, 3, 15, 315, 2835, 155925, 6081075, 638512875, 10854718875, 1856156927625, 194896477400625, 49308808782358125, 3698160658676859375};
  44.  
  45. /* protypy funkcii */
  46.  
  47. /* MAIN */
  48. int parse_args(int argc, char *args[], int *action, double *params_tan, double *params_range);
  49. void print_errors(int error);
  50. void help();
  51. int iteration_tan(double *params_tan);
  52. double taylor_tan(double x, unsigned int n);
  53. double cfrac_tan(double x, unsigned int n);
  54. double f_ak(int i, double x);
  55. int f_bk(int i);
  56. double myabs(double n);
  57. int iteration_range(double *params_range, int argc);
  58.  
  59. int main(int argc, char *argv[]) {
  60.     int action, setup_result;
  61.     double params_tan[3];
  62.     double params_range[3];
  63.     setup_result = parse_args(argc, argv, &action, params_tan, params_range);
  64.     if (setup_result != TRUE) {
  65.         print_errors(setup_result);
  66.         return setup_result;
  67.     }
  68.     switch(action) {
  69.         case ACTION_HELP:
  70.             help();
  71.             break;
  72.         case ACTION_TAN:
  73.             iteration_tan(params_tan);
  74.             break;
  75.         case ACTION_RANGE:
  76.             iteration_range(params_range, argc);
  77.             break;
  78.     }
  79. /*for(int i = 0; i != 3; i++) {
  80.     printf("%lf\n", params_range[i]);
  81.     printf("%lf\n", params_tan[i]);
  82. }*/
  83.  
  84.     return 0;
  85. }
  86. int parse_args(int argc, char *args[], int *action, double *params_tan, double *params_range) {
  87.     //////////////////// INICIALIZIACIA ////////////////////
  88.     *action = 0;
  89.     argc --;
  90.     char *endptr = NULL;
  91.         params_tan[RADIANS] = UNDEF;
  92.         params_tan[WHERE_N] = UNDEF;
  93.         params_tan[WHERE_M] = UNDEF;
  94.  
  95.         params_range[RADIANS_A] = UNDEF;
  96.         params_range[RADIANS_B] = UNDEF;
  97.         params_range[HEIGHT] = CONST_HEIGHT;
  98.     //////////////////// ACTION ///////////////////////
  99.  
  100.     if (argc < 1) return ERR_TOO_FEW_ARGS;
  101.     // max parametrov 5 - [-c X] -m A [B]
  102.     if (argc > ARGV_MAX_COUNT) return ERR_TOO_MANY_ARGS;
  103.     if (strcmp(args[1], "--help") == 0){
  104.         if (argc > 1) return ERR_TOO_MANY_ARGS;
  105.         *action = ACTION_HELP;
  106.         return TRUE;
  107.     }
  108.     else if (strcmp(args[1], "--tan") == 0) *action = ACTION_TAN;
  109.     else if (argc == 2) {
  110.         if (strcmp(args[1], "-m") == 0) {
  111.             params_range[RADIANS_A] = strtod(args[2], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  112.             *action = ACTION_RANGE;
  113.         }
  114.         else return ERR_UNDEFINED_ARG;
  115.     }
  116.     else if (argc == 3) {
  117.         if (strcmp(args[1], "-m") == 0) {
  118.             params_range[RADIANS_A] = strtod(args[2], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  119.             params_range[RADIANS_B] = strtod(args[3], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  120.             *action = ACTION_RANGE;
  121.         }
  122.         else return ERR_UNDEFINED_ARG;
  123.     }
  124.     else if (argc == 4) {
  125.         if (strcmp(args[1], "-c") == 0) {
  126.             params_range[HEIGHT] = strtod(args[2], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  127.         }
  128.         else return ERR_UNDEFINED_ARG;
  129.         if (strcmp(args[3], "-m") == 0) {
  130.             params_range[RADIANS_A] = strtod(args[4], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  131.             *action = ACTION_RANGE;
  132.         }
  133.         else return ERR_UNDEFINED_ARG;
  134.     }
  135.     else if (argc == 5) {
  136.         if (strcmp(args[1], "-c") == 0) {
  137.             params_range[HEIGHT] = strtod(args[2], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  138.         }
  139.         else return ERR_UNDEFINED_ARG;
  140.         if (strcmp(args[3], "-m") == 0) {
  141.             params_range[RADIANS_A] = strtod(args[4], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  142.         }
  143.         else return ERR_UNDEFINED_ARG;
  144.         *action = ACTION_RANGE;
  145.         params_range[RADIANS_B] = strtod(args[5], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  146.     }
  147.     /*else if (strcmp(args[1], "-c") == 0) {
  148.         params_range[HEIGHT] = strtod(args[2], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  149.         if (strcmp(args[3], "-m") == 0) {
  150.             params_range[RADIANS_A] = strtod(args[4], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  151.         }
  152.         if (strcmp(args[5]))
  153.     }
  154.     else if (strcmp(args[1], "-m") == 0) {
  155.         params_range[RADIANS_A] = strtod(args[2], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  156.     }
  157.     */
  158.     else return ERR_UNDEFINED_ARG;
  159.     switch (*action) {
  160.         case ACTION_TAN:    
  161.             if (argc < 4) return ERR_TOO_FEW_ARGS;
  162.             if (argc > 4) return ERR_TOO_MANY_ARGS;
  163.             params_tan[RADIANS] = strtod(args[2], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  164.             params_tan[WHERE_N] = strtod(args[3], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  165.             params_tan[WHERE_M] = strtod(args[4], &endptr); if (*endptr != '\0') return ERR_UNDEFINED_ARG;
  166.             break;
  167.         //case ACTION_M:
  168.     }
  169.     for(int i = 0;i!=3;i++) {
  170.         if (params_tan[i] == 0) {
  171.         return ERR_INVALID_LIMITS;
  172.         }
  173.     }
  174.  
  175.     if (
  176.         (params_tan[WHERE_M] < params_tan[WHERE_N]) ||
  177.         (params_tan[WHERE_M] > MAX) ||
  178.         (params_tan[RADIANS] > MAX_RAD)
  179.         )
  180.     {
  181.         return ERR_INVALID_LIMITS;
  182.     }
  183.  
  184.     if (
  185.         (params_range[RADIANS_A] > MAX_RAD) ||
  186.         (params_range[RADIANS_B] > MAX_RAD) ||
  187.         (params_range[HEIGHT] > MAX_HEIGHT)
  188.         )
  189.     {
  190.         return ERR_INVALID_LIMITS;
  191.     }
  192.  
  193.     return TRUE;
  194. }
  195. int iteration_tan(double *params_tan) {
  196.     double math_tan = tan(params_tan[RADIANS]);
  197.     double result_taylor, result_cfrac;
  198.     double f_abs_taylor, f_abs_cfrac;
  199.    
  200.     for(int i = (int) params_tan[WHERE_N] ;i<=params_tan[WHERE_M];i++) {
  201.         result_taylor = taylor_tan(params_tan[RADIANS], (unsigned int) i);
  202.         result_cfrac = cfrac_tan(params_tan[RADIANS], (unsigned int) i);
  203.         f_abs_taylor = myabs(result_taylor - math_tan);
  204.         f_abs_cfrac = myabs(result_cfrac - math_tan);
  205.         printf("%d %e %e %e %e %e\n", (int) i, math_tan, result_taylor, f_abs_taylor, result_cfrac, f_abs_cfrac);
  206.     }
  207.     return TRUE;
  208. }
  209. int iteration_range(double *params_range, int argc) {
  210.     argc--;
  211.     double result_alfa, result_beta, range, height;
  212.  
  213.     if ((argc == 2) && ((params_range[RADIANS_B] != UNDEF) || (params_range[HEIGHT] != MAX_HEIGHT))) {
  214.         result_alfa = cfrac_tan(params_range[RADIANS_A], ITERATIONS);
  215.         range = (params_range[HEIGHT] / result_alfa);
  216.         printf("%e\n", range);
  217.     }
  218.     else if ((argc == 3) && (params_range[HEIGHT] != MAX_HEIGHT)) {
  219.         result_alfa = cfrac_tan(params_range[RADIANS_A], ITERATIONS);
  220.         result_beta = cfrac_tan(params_range[RADIANS_B], ITERATIONS);
  221.         range = (params_range[HEIGHT] / result_alfa);
  222.         height = (params_range[HEIGHT] + (result_beta * range));
  223.         printf("%.10e\n%.10e\n", range, height);
  224.     }
  225.     else if ((argc == 4) && (params_range[RADIANS_B]) == UNDEF) {
  226.         result_alfa = cfrac_tan(params_range[RADIANS_A], ITERATIONS);
  227.         range = (params_range[HEIGHT] / result_alfa);
  228.         printf("%.10e\n", range);
  229.     }
  230.     else if (argc == 5) {
  231.         result_alfa = cfrac_tan(params_range[RADIANS_A], ITERATIONS);
  232.         result_beta = cfrac_tan(params_range[RADIANS_B], ITERATIONS);
  233.         range = (params_range[HEIGHT] / result_alfa);
  234.         height = (params_range[HEIGHT] + (result_beta * range));
  235.         printf("%.10e\n%.10e\n", range, height);
  236.     }
  237.     return TRUE;
  238. }
  239. /*
  240.     double result = 0;
  241.     for (int i=0; i<n; i++) {
  242.         result += ((citatel[i]*x_x)/menovatel[i]);
  243.     }
  244.     return result;
  245.  
  246.     prva iteracia:
  247.     result = 0 + x_x;
  248. */
  249. double taylor_tan(double x, unsigned int n) {
  250.     double result = x;
  251.     double x_x = x*x;
  252.  
  253.     for(unsigned int i = 1; i < n; i++) {
  254.         result += ((citatel[i]*x_x)/menovatel[i]);
  255.     }
  256.     return result;
  257. }
  258. double cfrac_tan(double x, unsigned int n) {
  259.     double result = 0.0;
  260.     double ak, bk;
  261.     for (unsigned int i = n; i > 0; i--) {
  262.         ak = f_ak(i, x);
  263.         bk = f_bk(i);
  264.         result =  (ak / (bk + result));
  265.     }
  266.     return result;
  267. }
  268. double f_ak(int i, double x){
  269.     return i > 1 ? -(x*x) : x;
  270. }
  271. int f_bk(int i){
  272.     return (2*i)-1;
  273. }
  274. double myabs(double n) {
  275.     return n > 0 ? n : -n;
  276. }
  277. void print_errors(int error) {
  278.         fprintf(stderr, "Chyba: ");
  279.         switch (error) {
  280.                 case ERR_TOO_FEW_ARGS:
  281.                         fprintf(stderr, "Zadal si malo argumentov, napis --help pre napovedu.\n");
  282.                         break;
  283.                 case ERR_TOO_MANY_ARGS:
  284.                         fprintf(stderr, "Zadal si vela argumentov, napis --help pre napovedu.\n");
  285.                         break;
  286.                 case ERR_UNDEFINED_ARG:
  287.                         fprintf(stderr, "Zadal si nedefinovane argumenty, napis --help pre napovedu.\n");
  288.                         break;
  289.                 case ERR_INVALID_LIMITS:
  290.                         fprintf(stderr, "Zadal si zle limity alebo 0, napis --help pre napovedu.\n");
  291.                         break;
  292.         }
  293. }
  294. void help() {
  295.     printf ("\n-------------------------------NAPOVEDA-------------------------------\n"
  296.            "\nPopis programu:\n"
  297.            "\nProgram funguje ako jednoduchy tabulkovy kalkulator, ktory vyhladava: \n"
  298.            "maximun, minimum, vypocita sucet a aritmeticky priemer vybranych buniek.\n"
  299.            "Tabulku vo formate textoveho suboru ocakava na standartnom vstupe.\n"
  300.            "\nARGUMENTY PROGRAMU:\n"
  301.            "\nArgument --help/-h: \n"
  302.            "-------Pri zadani argumentu --help/- sa vytiskne napoveda pouzivani programu.\n"
  303.            "-------Tento argument funguje len samostatne!\n"
  304.            "\nArgument I:\n"
  305.            "-------Povinny argument, ktory reprezentuje jednu z nasledujucich operacii.\n"
  306.            "-------'select' Z danej tabulky vyberie a nasledne vytiskne hodnoty danych buniek.\n"
  307.            "-------'min' Vyhladavanie a nasledny tisk minimalnej hodnoty z daneho rozsahu buniek.\n"
  308.            "-------'max' Vyhladavanie a nasledny tisk maximalnej hodnoty z daneho rozsahu buniek.\n"
  309.            "-------'sum' Vypocita a vytiskne sumy hodnot vsetkych vybranych buniek.\n"
  310.            "-------'avg' Vypocita a vytiskne aritmeticky priemer vybranych buniek.\n"
  311.            "\nArgument II:\n"
  312.            "-------Povinny argument, ktory symbolizuje rozsah tabulky, nad ktorym ma byt prevedena dana operacia.\n"
  313.            "-------Je dany argumentami :\n"
  314.            "-------'row X' znaci vyber vsetkych buniek na riadku X. (X > 0)\n"
  315.            "-------'col X' znaci vyber vsetkych buniek v stlpci X. (X > 0)\n"
  316.            "-------'rows X Y' znaci vyber vsetkych buniek od riadku X (vratane) az po Y (vratane). (0 < X <= Y)\n"
  317.            "-------'cols X Y' znaci vyber vsetkych buniek od stlpca X (vratane) az po Y (vratane). (0 < X <= Y)\n"
  318.            "-------'range A B X Y' znaci vyber buniek od riadku A po riadok B a od stlpca X po stlpec Y,\n"
  319.            "-------(vratane danych riadkov a stlpcov). (0 < A <= B), (0 < X <= Y)\n"
  320.            "\nSyntax argumentov:\n"
  321.            "I je povinny argument, ktory musi byt zadany ako prvy a za nim musi byt parameter II vo spravnom\n"
  322.            "tvare a formate. Poradie argumentov je pevne dane a nemoze sa lubovolne zamienat!!!\n");        
  323. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement