Projekt 2

/* ========================================================================== */
/*                                                                            */
/*   proj2.c                                                                  */
/*   (c) 2001 xmunkf00 Filip Munk                                             */
/*   xmunkf00@stud.fit.vutbr.cz                                               */
/*                                                                            */
/*============================================================================*/
/*                                                                            */
/*   Vypocet tg a ln pomoci iteracnich vzorcu                                 */
/*   prepocty dat vystupujicich z radaru. prevod rychlosti na drahu a naopak  */
/*                                                                            */
/* ========================================================================== */
 
//////////////////////////////////
//Pripojeni hlavickovych souboru//
//////////////////////////////////
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
////////////////////////////////
//Konstanty a jine datove cosi//
////////////////////////////////
const double CAS=0.5;
/////////////////////////
//Matematicke konstanty//
/////////////////////////
const double PI=3.1415926535897932384626433;
const double E =2.7182818284590452353602874;
 
 
////////////////////////////////
//Text napovedy               //
////////////////////////////////
 
const char *HELP= "\nProgram tg_ln_rad (projekt 2).\n"
           "Autor: Filip Munk (c) 2008\n\n"
           "Format vstupu: -tg [EPS] [JEDNOTKA]\n"
           "               -ln [EPS]\n"
           "               -radar1\n"
           "               -radar2\n"
           "PARAMETRY\n\n"
           "\t-h\t  \tVypise tuto obrazovku.\n"
           "\t-tg\t [EPS] Pocita tg s presnosti zadanou v dalsim argumentu.\n"
           "\t-ln\t [EPS] Pocita ln s presnosti zadanou v dalsim argumentu.\n\n"
           "  EPS\n\n"
           "epsilon je mozno zadat jako cislo 1e-x a nebo jako desetinne cuslo.\n\n"
           "  JEDNOTKA\n\n"
           "\t deg\t"
           "Pokud jednotka neni zadana funkce tangens pocita na vstupu s radiany."
           "Pokud je zadano deg funkce pocita s uhlem ve stupnich.";
 
 
////////////////////////////////////
//cast Matematicka a goniometricka//
////////////////////////////////////
 
////////////////////////////////////////////////
//prevadi data v argumentu z radianu na stupne//
////////////////////////////////////////////////
double proj2_rad2deg(double data)
{
    data*=180;
    return data;
}
 
/////////////////////////////////////////////////
//prevadi data v argumentu ze stupnu na radiany//
/////////////////////////////////////////////////
double proj2_deg2rad(double data)
{
    data/=180;
    return data;
}
///////////////////////////////////////
//absolutni hodnota ze zadaneho cisla//
///////////////////////////////////////
 
double proj2_sin2konv(double data)
{
    if (data>0.5)
        return proj2_sin2konv(data-0.5);
    if (data<-0.5)
        return proj2_sin2konv(data+0.5);
 
    else
        return data;
}
 
double proj2_abs(double data)
{
    if (data<0)
        data*=-1;
    return data;
}
////////////////////////////////////
//pocita mocninu ze zadaneho cisla//
///////////////////////////////////////////////////////
//prvni argument - zaklad sinu                       //
//druhy argument - epsilo (presnost)                 //
//funkce vraci desetinne cislo                       //
///////////////////////////////////////////////////////
double proj2_exp(double base, double exp)
{
    while (exp>1)
    {
        base*=base;
        exp--;
    }
 
    return base;
}
 
 
////////////////////////
//Prirozeny logaritmus//
////////////////////////////////////////
//prvni argument - zaklad logaritmu   //
//druhy parametr - epsilon (prestnost)//
////////////////////////////////////////
double proj2_ln(double data, double eps)
{
    /* double exp=0;
     //Urceni krytickych hodnot pri logaritmu
     if (data== 0)
     {
         return -INFINITY;
     }
     if (data < 0)
     {
         return NAN;
     }
 
     //Prevod do oboru konvergence;
     while (data>=1)
     {
         data/=E;
         exp++;
     }
 
 
     double data2=data;
     double item=0;
     double up=data;
     double down=1;
     double iter=3;
     double down2=data2;
     double data3=data*data;
     double data4=data2*data2;
     double temp=data/data2;
 
 
     data-=1;
     data2+=1;
 
     while (proj2_abs(temp)>=eps )
     {
         up *=data3;
         down2*=data4;
         down=iter*down2;
         temp=(up/down);
         item+=temp;
         iter+=2;
         printf("%.50lf\n", temp);
     }
     item+=data/data2;
     item*=2;
     if (exp!=0)
     {
         item+=exp;
     }
 
 
     return item;*/
    if (data== 0)
    {
        return -INFINITY;
    }
    if (data < 0)
    {
        return NAN;
    }
    double exp=0;
    while (data>=2)
    {
        data/=E;
        exp++;
        //printf("%.308lf\n",data);
    }
    //double temp=data;
    double data2=data;
 
    data-=1;
    data2+=1;
    double item=0;
    double up=data;
    double down=1;
    double iter=3;
    double down2=data2;
    double data3=data*data;
    double data4=(data2*data2);
    double temp=data/data2;
    while (proj2_abs(temp)>=eps )
    {
        up *=data3;
        down2*=data4;
        down=iter*down2;
        temp=(up/down);
        item+=temp;
        iter+=2;
        //printf("%.50lf\n", temp);
    }
    item+=data/data2;
    item*=2;
    if (exp!=0)
    {
        item+=exp;
    }
 
 
    return item;
}
 
////////////
//sinus X //
//////////////////////////////////////
//prvni argument - zaklad sinu      //
//druhy argument - epsilo (presnost)//
//funkce vraci desetinne cislo      //
//////////////////////////////////////
double proj2_kpi(double data)
{
    int res;
    res= 0;
    if (data < 0)
    {
        res++;
    }
    return res;
}
double proj2_sin(double data, double eps)
{
    int kolik=1;
    if (data>=1)
    {
        while (data>=1)
        {
            data-=1;
            kolik*=-1;
        }
 
    }
    if (data<=-1)
    {
        while (data<=-1)
        {
            data+=1;
        }
        kolik&=-1;
    }
    data*=PI;
 
    int tmp=proj2_kpi(data);
 
    data = proj2_abs(data);
 
    double data2 = proj2_exp (data, 2);
    int iter = 3;
    double iter1=iter;
    double temp = data;
    double add = data;
    while (proj2_abs (add) >= eps)
    {
        iter1=iter - 1;
        add = (-add/(iter * iter1));
        add*=data2;
        iter += 2;
        temp += add;
    }
    if (tmp != 0)
    {
        temp *= -1;
    }
    temp*=kolik;
 
    return temp;
}
///////////////////////////////////////////////////////
//funkce pro vypocet cos .vyuziva vztahu k funkci sin//
///////////////////////////////////////////////////////
//prvni argument - zaklad sinu                       //
//druhy argument - epsilo (presnost)                 //
//funkce vraci desetinne cislo                       //
///////////////////////////////////////////////////////
double proj2_cos(double data, double eps)
{
    data=data+(0.5);
    data=proj2_sin(data,eps);
 
    return data;
}
///////////////////////////////////////////////////////
//funkce pro vypocet tg                              //
///////////////////////////////////////////////////////
//prvni argument - zaklad sinu                       //
//druhy argument - epsilo (presnost)                 //
//funkce vraci desetinne cislo                       //
///////////////////////////////////////////////////////
double proj2_tg(double data, double eps)
{
    double sinus,cosin;
    int cosint;
    cosin=proj2_cos(data, eps);
    cosint=cosin;
    sinus=proj2_sin(data,eps);
    data=sinus/cosin;
    return data;
}
//////////////////////////////////////
//pocita faktorial ze zadaneho cisla//
//////////////////////////////////////
double proj2_fact(double data)
{
    if (data == 0)
        return 1;
    else
        return data*proj2_fact(data-1);
    //  data=data-1;
}
////////////////////////////////////
//cast s Fyzikou (draha, rychlost)//
////////////////////////////////////
double  proj2_radar1(double data , double v0,float cas)
{
 
data=((data/2)*proj2_exp(cas,2)+v0*cas);
 
    return data;
}
double proj2_radar2(double data, double s0,float cas)
{
data-=s0*cas;
data/=proj2_exp(cas,2);
data*=2;
 
 
    return data;
}
 
////////////////////////////////////////////////////
//Zbytek podpurne funkce. nacitani dat a argumentu//
////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
    double data,eps,vstup,v0;
    int res;
    double v0x,v0y,v0z;
    // double x,y,z;
    int menidlo=0;
    float cas=0;
    v0x=0;
    v0y=0;
    v0z=0;
 
    if (argc==2 && (strcmp(argv[1],"-radar1")==0 || strcmp(argv[1],"-radar2")==0))
    {
        while ((res=scanf("%lf",&data))==1)
        {  cas+=CAS;
             if (menidlo==0)
            {
                v0=v0x;
            }
            else if (menidlo==1)
            {
                v0=v0y;
            }
            else if (menidlo==2)
            {
                v0=v0z;
            }
 
                if (strcmp(argv[1],"-radar1")==0)
                {
                    data=proj2_radar1(data, v0,cas);
                }
 
                else
                {
                    data=proj2_radar2(data, v0,cas);
                }
        if (menidlo==0)
        {
            v0x=data;
        }
        else if (menidlo==1)
        {
            v0y=data;
        }
        else if (menidlo==2)
        {
            v0z=data;
        }
        printf("%lf ", data);
 
        menidlo++;
        if (menidlo==3)
            menidlo=0;
                }}
    else if ((argc==4 || argc==3)  && (strcmp(argv[1],"-tg")==0 || strcmp(argv[1],"-ln")==0))
    {
 
        if (strcmp(argv[1],"-tg")==0)
        {
 
            eps=atof(argv[2]);
            while ((res=scanf("%lf",&data))==1)
            {
 
                if ( argc==4 && strcmp(argv[3],"deg")==0)
                {
                    data=proj2_deg2rad(data);
                }
                data=proj2_tg(data,eps);
                printf("%lf\n", data);
            }
 
        }
        else
        {
            eps=atof(argv[2]);
            while ((res=scanf("%lf",&data))==1)
            {
                data=proj2_ln(data,eps);
                printf("%lf\n", data);
            }
        }
 
    }
    else
    {
        printf(HELP);
 
    }
 
    return EXIT_SUCCESS;
}
 
/////////////////////////////////////////////////////////////////
//#############################################################//
//##################!! konec proj2.c  !!#######################//
//#############################################################//
/////////////////////////////////////////////////////////////////