Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <float.h>
  6. #include <math.h>
  7.  
  8. void help()
  9. {
  10. printf("___---*** xslova20-2014 ***---___\n");
  11. printf("Program vypočítá vzdálenost a výšku měřeného objektu pomocí údajů ze senzorů natočení měřicího přístroje. Výpočet se provede pouze pomocí matematických operací +,-,*,/.\n");
  12. printf("-------------------------------------------------------------------------------------\n");
  13. printf("--help způsobí, že program vytiskne nápovědu používání programu a skončí.\n");
  14. printf("--tan srovná přesnosti výpočtu tangens úhlu A (v radiánech) mezi voláním tan z matematické knihovny, a výpočtu tangens pomocí Taylorova polynomu a zřetězeného zlomku. \n");
  15. printf("Argumenty N a M udávají, ve kterých iteracích iteračního výpočtu má srovnání probíhat. 0 < N <= M < 14\n");
  16. printf("-m vypočítá a změří vzdálenosti.\n");
  17. printf("Úhel α je dán argumentem A v radiánech. Program vypočítá a vypíše vzdálenost měřeného objektu. 0 < A <= 1.4 < π/2.\n");
  18. printf("Pokud je zadán, úhel β udává argument B v radiánech. Program vypočítá a vypíše i výšku měřeného objektu. 0 < B <= 1.4 < π/2\n");
  19. printf("Argument -c nastavuje výšku měřicího přístroje c pro výpočet. Výška c je dána argumentem X (0 < X <= 100). Argument je volitelný - implicitní výška je 1.5 metrů.\n");
  20. }
  21.  
  22.  
  23. double taylor_tan(double uhel, unsigned int n){
  24. unsigned int i;
  25. double cit[13]={1, 1, 2, 17, 62, 1382, 21844, 929569, 6404582, 443861162, 18888466084, 113927491862, 58870668456604};
  26. double jme[13]={1, 3, 15, 315, 2835, 155925, 6081075, 638512875, 10854718875, 1856156927625, 194896477400625, 49308808782358125, 3698160658676859375};
  27. double xx=uhel;
  28. double vysl=0;
  29. for(i=0;i<n;i++){
  30. if(i!=0)xx=xx*uhel*uhel;//umocnime predchozi cislo na 3
  31. vysl+=(cit[i]*xx)/jme[i];//přičteme ýsledky zlomků do proměnné
  32. }
  33. return vysl;
  34. }
  35.  
  36. double cfrac_tan(double x, unsigned int n)
  37. {
  38. unsigned int i;
  39. double jmenovatel=1+n*2;
  40. double xx = x*x;
  41. double vysl = 0;
  42. double predchozi_vysl = 0;
  43. for(i=n;i>0;i--){
  44. jmenovatel-=2;
  45. if(i==1)xx=x;
  46. vysl = xx/(jmenovatel-predchozi_vysl);
  47. predchozi_vysl=vysl;
  48. }
  49. return vysl;
  50. }
  51.  
  52. double my_tan(double uhel, unsigned int n, unsigned int m){
  53. unsigned int i;
  54. if(n>=m){
  55. printf("0 iterací k vypsání\n");
  56. return 0;
  57. }
  58. double tan_math=tan (uhel);
  59. for(i=1;i<=m;i++){
  60. double cfrac = cfrac_tan(uhel,i);
  61. double cfrac_rozdil=fabs(tan_math-cfrac);
  62. double taylor = taylor_tan(uhel,i);
  63. double taylor_rozdil=fabs(tan_math-taylor);
  64. if(i>n)
  65. printf("%.2i %e %e %e %e %e\n",i,tan_math,taylor,taylor_rozdil,cfrac,cfrac_rozdil);
  66. }
  67. return 0;
  68. }
  69.  
  70. double prevod_argv(char * uhel, char * n, char * m){//převedení char argumentu na číslo double / unsigned long in
  71. unsigned long int N;
  72. unsigned long int M;
  73. double U;
  74. U=strtod (uhel, NULL);
  75. N = strtoul (n, NULL,10);
  76. M = strtoul (m, NULL,10);
  77. if(!M || !N || !U){
  78. printf("Špatně zadané parametry");
  79. }
  80. my_tan(U,N,M);
  81. return 0;
  82. }
  83. int main(int argc, char *argv[])
  84. {
  85. if(argc<5){
  86. printf("Bylo zadáno málo parametrů, použijte --help\n");
  87. } else if (strcmp(argv[1], "--help")==0) //podminka pro volani fce --help
  88. {
  89. help();
  90. } else if(strcmp(argv[1], "--tan")==0){
  91. prevod_argv(argv[2],argv[3],argv[4]);
  92. }
  93. return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement