Advertisement
Guest User

Untitled

a guest
Nov 25th, 2014
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.74 KB | None | 0 0
  1. /*
  2. * Soubor: proj2.c
  3. * Datum: 2014-11-23
  4. * Autor: Tomas Bartu, xbartu03@stud.fit.vutbr.cz
  5. * Projekt: Iteracni vypocty, projekt 2 pro predmet IZP
  6. * Popis: Vypocet vzdalenosti a vysky mereneho objektu pomoci udaju ze senzoru natoceni mericiho pristroje
  7. */
  8.  
  9.  
  10. #include <stdio.h>
  11. // obecne funkce jazyka C
  12. #include <stdlib.h>
  13. // kvuli funkci strcmp
  14. #include <string.h>
  15. // isalpha, isdigit
  16. #include <ctype.h>
  17. // limity ciselnych typu
  18. #include <limits.h>
  19. // typ bool, konstanty true, false
  20. #include <stdbool.h>
  21. // promenna errno
  22. #include <errno.h>
  23. //pro pouziti tan
  24. #include <math.h>
  25.  
  26. //definice pro vypocet absolutni odchylky, pro prehlednost
  27. #define ODCHYLKA_TAYLOR tan(arg1) - taylor_tan(arg1,i)
  28. #define ODCHYLKA_CFRAC tan(arg1) - cfrac_tan(arg1,i)
  29.  
  30. //prototypy funkcí
  31. double taylor_tan(double x, unsigned int n);
  32. double cfrac_tan(double x, unsigned int n);
  33. int okParam(int argc, char *argv[]);
  34. int jeNapoveda(int argc, char *argv[]);
  35. double vypocet(int argc, char *argv[]);
  36. void zpracovani_tan(char *argv[]);
  37. void zpracovani_m(int argc, char *argv[]);
  38.  
  39.  
  40. /**
  41. * Napoveda, ktera bude dále vypsana pomocí funkce v pripade, že dojde k zadani argumentu --help
  42. * Retezec s textem napovedy
  43. */
  44. const char *HELPMSG =
  45. "Program Iteracni vypocty.\n"
  46. "Autor: Tomas Bartu (c) 2014\n"
  47. "Program provadi iteracni vypocty a implementuje vypocet vzdalenosti ze zadanych parametru.\n"
  48. "Pouziti programu:";
  49.  
  50. /**
  51. * Datovy vyctovy typ pro ruzne druhy chyb
  52. *
  53. */
  54. enum tecodes
  55. {
  56. WRONGARG, // spatne zadane parametry
  57. NOTNUMBER, // nejedna se o cislo
  58. ANOTHERR, // jina chyba
  59. };
  60.  
  61. /**
  62. * Text ktery bude vypisovan pro jednotlive chyby
  63. */
  64. const char *ECODEMSG[] =
  65. {
  66. [WRONGARG] = "Zadal jste neplatne parametry prikazove radky. Pro napovedu pouzijte --help\n",
  67. [NOTNUMBER] = "Nespravne zadane cislo! Pro napovedu pouzijte --help\n",
  68. [ANOTHERR] = "Nastala chyba. Pro napovedu pouzijte --help\n",
  69. };
  70. /**
  71. * Zpracuje druh chyby a nasledne vypise chybovou hlasku.
  72. * @param int ecode, ktery oznacuje druh chyby
  73. */
  74. void printECode(int ecode)
  75. {
  76. if (ecode < WRONGARG || ecode > NOTNUMBER)
  77. { ecode = ANOTHERR; }
  78. //vypis chyby
  79. fprintf(stderr, "%s", ECODEMSG[ecode]);
  80. }
  81. void zpracovani_m(int argc, char *argv[]) {
  82.  
  83. double alfa, beta;
  84. double vyska_predmetu;
  85. double vzdalenost = 0;
  86. double vyska = 1.5;
  87.  
  88. if((strcmp("-m", argv[1]) == 0)) {
  89. alfa = atof(argv[2]);
  90. if(alfa < 0 || alfa > 1.4) { printECode(ANOTHERR); return;}
  91. vzdalenost = vyska / cfrac_tan(alfa, 10);
  92. printf("%.10e\n", vzdalenost);
  93.  
  94. if(argc == 4) {
  95. beta = atof(argv[3]);
  96. if(beta < 0 || beta > 1.4) { printECode(ANOTHERR); return; }
  97. vyska_predmetu = (cfrac_tan(beta, 10) * vzdalenost) + vyska;
  98. printf("%.10e\n", vyska_predmetu);
  99. }
  100. } else {
  101. alfa = atof(argv[4]);
  102. if(alfa < 0 || alfa > 1.4) { printECode(ANOTHERR); return;}
  103. vyska = atof(argv[2]);
  104. if(vyska < 0 || vyska > 100) { printECode(ANOTHERR); return;}
  105. vzdalenost = vyska / cfrac_tan(alfa, 10);
  106. printf("%.10e\n", vzdalenost);
  107. if(argc == 6) {
  108. beta = atof(argv[5]);
  109. if(beta < 0 || beta > 1.4) { printECode(ANOTHERR); return;}
  110. vyska_predmetu = (cfrac_tan(beta, 10) * vzdalenost) + vyska;
  111. printf("%.10e\n", vyska_predmetu);
  112.  
  113. }
  114.  
  115. }
  116. }
  117. void zpracovani_tan(char *argv[]) {
  118. double arg1 = atof(argv[2]);
  119. int arg2 = atoi(argv[3]);
  120. int arg3 = atoi(argv[4]);
  121. // osetreni chyb, a aby nebylo zadano vetsi cislo nez 1.4
  122. if(arg1 == 0 || arg2 == 0 || arg3 == 0 || arg1> 1.4 || arg1 < 0) { printECode(NOTNUMBER); return;}
  123. if(arg3 < arg2 || arg3 > 13) { printECode(ANOTHERR); return; }
  124. if(arg2 == 0) {printECode(ANOTHERR); return;}
  125.  
  126. int i;
  127. //volani funkci
  128. for(i = 1; i <= arg3; i++) {
  129. if(i >= arg2) {
  130. // vypis
  131. printf("%d %e %e %e %e %e\n", i, tan(arg1), taylor_tan(arg1, i), (ODCHYLKA_TAYLOR), cfrac_tan(arg1, i), (ODCHYLKA_CFRAC));
  132.  
  133. }
  134.  
  135.  
  136. }
  137.  
  138. }
  139. /**
  140. * Hlavni program
  141. * funkce main
  142. * @param int argc - pocet parametru z prikazove radky
  143. * @param char *argv[] - textove retezce z parametru
  144. * @return EXIT_SUCCESS
  145. */
  146. int main(int argc, char *argv[])
  147. {
  148. /* zde si overuju jestli jsou argumenty v poradku pomoci funkce okParam, jde v podstate o to ze,
  149. * okParam vraci nulu kdyz doslo k chybnemu parametru, takze pokud nevraci 1 tak chyba
  150. */
  151. if(!okParam(argc, argv))
  152. {
  153. printECode(WRONGARG);
  154. }
  155. else if(jeNapoveda(argc, argv))
  156. {
  157. printf("%s", HELPMSG);
  158. } else {
  159. // pokud je zadano --tan
  160. if((strcmp("--tan", argv[1]) == 0)) {
  161. zpracovani_tan(argv);
  162. //pokud -m
  163. } else if((strcmp("-m", argv[1]) == 0) || (strcmp("-m", argv[3]) == 0)) {
  164.  
  165. zpracovani_m(argc, argv);
  166.  
  167. } else {
  168. return 0;
  169. }
  170. }
  171. return EXIT_SUCCESS;
  172. }
  173.  
  174. /**
  175. * Testuje zda jsou zadany spravne a vhodne argumenty prikazove radku
  176. * V pripade ze jsou spatne, vraci nulu, naopak vraci jednicku
  177. * @param int argc
  178. * @param char *argv[]
  179. * @return V pripade nalezeni chyby 0, naopak 1
  180. */
  181. int okParam(int argc, char *argv[])
  182. {
  183. // zde testuji rozsah, pokud je argc rovno jedna nebo je vetsi nez 6, jedna se o spatne argumenty, takze vracim nulu
  184. if(argc == 1 || argc > 6)
  185. {
  186. return 0;
  187. }
  188. if(argc > 2 && strcmp("--help", argv[1]) == 0) {
  189. return 0;
  190. }
  191. // v pripade ze se nejedna o help
  192. if(strcmp("--help", argv[1]) != 0)
  193. {
  194. //mam switch ktery otestuje jednotlive hodnoty argc
  195. switch(argc) {
  196. case 3: if((strcmp("-m", argv[1]) != 0)) return 0; break;
  197. case 4: if((strcmp("-m", argv[1]) != 0)) return 0; break;
  198. case 5: if(strcmp("--tan", argv[1]) == 0) { return 1;}
  199. else if((strcmp("-c", argv[1]) == 0) && (strcmp("-m", argv[3]) == 0)) {return 1;}
  200. else {return 0;}
  201. break;
  202. case 6: if(strcmp("-c", argv[1]) == 0) {
  203. if(strcmp("-m", argv[3]) == 0) {return 1;}
  204. return 0;
  205. } else {
  206. return 0;
  207. }
  208. break;
  209. default: return 0; break;
  210. }
  211. }
  212. return 1;
  213. }
  214.  
  215. /**
  216. * Vraci pripad kdy se jedna o napovedu, ktery dale overuji v mainu
  217. * @param int argc, char *argv[]
  218. */
  219. int jeNapoveda(int argc, char *argv[])
  220. {
  221.  
  222. return ((argc == 2) && (strcmp("--help",argv[1]) == 0));
  223. }
  224.  
  225. double taylor_tan(double x, unsigned int n)
  226. {
  227. double tay_jmenovatele[] = {1, 3, 15, 315, 2835, 155925, 6081075, 638512875, 10854718875, 1856156927625, 194896477400625, 49308808782358125, 3698160658676859375};
  228. double tay_citatele[] = {1, 1, 2, 17, 62, 1382, 21844, 929569, 6404582, 443861162, 18888466084, 113927491862, 58870668456604};
  229.  
  230. unsigned int j, i;
  231. double pom, vysledek = 0;
  232. for (i = 1; i <= n; i++)
  233. {
  234. pom = 1;
  235.  
  236. for (j = 1; j <= (2 * i - 1); j++)
  237. {
  238. pom = pom * x;
  239. }
  240. vysledek = vysledek + ((tay_citatele[i-1] * pom) / tay_jmenovatele[i-1]);
  241. }
  242. return vysledek;
  243. }
  244.  
  245. double cfrac_tan(double x, unsigned int n){
  246.  
  247. double factor = 0;
  248. for(int i = n; i >0; i--) {
  249. factor = 1/(((i*2-1)/x)-factor);
  250. }
  251. return factor;
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement