Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <float.h>
- #include <math.h>
- void help()
- {
- printf("___---*** xslova20-2014 ***---___\n");
- 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");
- printf("-------------------------------------------------------------------------------------\n");
- printf("--help způsobí, že program vytiskne nápovědu používání programu a skončí.\n");
- 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");
- 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");
- printf("-m vypočítá a změří vzdálenosti.\n");
- 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");
- 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");
- 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");
- }
- double taylor_tan(double uhel, unsigned int n){
- unsigned int i;
- double cit[13]={1, 1, 2, 17, 62, 1382, 21844, 929569, 6404582, 443861162, 18888466084, 113927491862, 58870668456604};
- double jme[13]={1, 3, 15, 315, 2835, 155925, 6081075, 638512875, 10854718875, 1856156927625, 194896477400625, 49308808782358125, 3698160658676859375};
- double xx=uhel;
- double vysl=0;
- for(i=0;i<n;i++){
- if(i!=0)xx=xx*uhel*uhel;//umocnime predchozi cislo na 3
- vysl+=(cit[i]*xx)/jme[i];//přičteme ýsledky zlomků do proměnné
- }
- return vysl;
- }
- double cfrac_tan(double x, unsigned int n)
- {
- unsigned int i;
- double jmenovatel=1+n*2;
- double xx = x*x;
- double vysl = 0;
- double predchozi_vysl = 0;
- for(i=n;i>0;i--){
- jmenovatel-=2;
- if(i==1)xx=x;
- vysl = xx/(jmenovatel-predchozi_vysl);
- predchozi_vysl=vysl;
- }
- return vysl;
- }
- double my_tan(double uhel, unsigned int n, unsigned int m){
- unsigned int i;
- if(n>=m){
- printf("0 iterací k vypsání\n");
- return 0;
- }
- double tan_math=tan (uhel);
- for(i=1;i<=m;i++){
- double cfrac = cfrac_tan(uhel,i);
- double cfrac_rozdil=fabs(tan_math-cfrac);
- double taylor = taylor_tan(uhel,i);
- double taylor_rozdil=fabs(tan_math-taylor);
- if(i>n)
- printf("%.2i %e %e %e %e %e\n",i,tan_math,taylor,taylor_rozdil,cfrac,cfrac_rozdil);
- }
- return 0;
- }
- double prevod_argv(char * uhel, char * n, char * m){//převedení char argumentu na číslo double / unsigned long in
- unsigned long int N;
- unsigned long int M;
- double U;
- U=strtod (uhel, NULL);
- N = strtoul (n, NULL,10);
- M = strtoul (m, NULL,10);
- if(!M || !N || !U){
- printf("Špatně zadané parametry");
- }
- my_tan(U,N,M);
- return 0;
- }
- int main(int argc, char *argv[])
- {
- if(argc<5){
- printf("Bylo zadáno málo parametrů, použijte --help\n");
- } else if (strcmp(argv[1], "--help")==0) //podminka pro volani fce --help
- {
- help();
- } else if(strcmp(argv[1], "--tan")==0){
- prevod_argv(argv[2],argv[3],argv[4]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement