Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <math.h>
- void help()
- {
- printf("operace - první argument: \n"
- "\t select:z tabulky vybere a vytiksne hodnoty daných bunek\n"
- "\t min:vyhledani a tisk min hodnoty z daneho rozsahu bunek\n"
- "\t max:vyhledani a tisk max hodnoty z daneho rozsahu bunek\n"
- "\t sum:vypocet a tisk sumy hodnot vsech vybranych bunek\n"
- "\t avg:vypocet a tisk aritmetického prumeru vybranych bunek\n"
- "vyber_bunek nebo-li rozsah tabulky, druha argument: \n"
- "\t row: X znaci vyber vsech bunek na radku X (X > 0)\n"
- "\t col: X znaci vyber vsech bunek ve sloupci X (X > 0)\n"
- "\t rows: X Y znaci vyber vsech bunek od radku X (vcetne) po Y (vcetne)0 < X <= Y\n"
- "\t cols: X Y znaci vyber vsech bunek od sloupce X (vcetne)po Y (vcetne)0 < X <= Y\n"
- "\t range: A B X Y znaci vyber vsech bunek od radku A po radek B a rozsahu sloupcu <X;Y>, 0 < A <= B, 0 < X <= Y\n");
- }
- double cfrac_tan(double x, int n)
- {
- double result = 0;
- double liche;
- // prvotni clen
- liche = n*2-1;
- double delenec;
- delenec = 1/x;
- double vysledek;
- int i;
- for (i = n; i>0; i--){
- vysledek = liche*delenec;
- liche = liche-2;
- // počitame "od zadu" v zretezenm zlomku
- // delime 1.0 pořád dokola
- result = 1.0/(vysledek - result);
- //printf("%e\n",result);
- }
- return result;
- }
- double taylor_tan(double x, int n)
- {
- double clen = x;
- double soucet = x;
- // citatele koeficienty
- double pole1[] = {1, 1, 2, 17, 62, 1382, 21844, 929569, 6404582, 443861162, 18888466084, 113927491862, 58870668456604};
- // jmenovatele koeficienty
- double pole2[] = {1, 3, 15, 315, 2835, 155925, 6081075, 638512875, 10854718875, 1856156927625, 194896477400625, 49308808782358125, 3698160658676859375};
- for (int i = 1; i < n; i++){
- // pocita nasledujici clen x^1, x^3, x^5
- clen *= (x*x);
- // vypocet dle vzorce klasickeho
- soucet += (pole1[i]/pole2[i]*clen);
- }
- return soucet;
- }
- double delka (double a, double c)
- {
- // vypocet dle goniometrických fci v pravouhlem trojuhelniku
- double vzdalenost = c/cfrac_tan( a, 10);
- return vzdalenost;
- }
- double vyska (double a, double b, double c)
- {
- // vypocet dle goniometrickych fci v pravouhlem trojuhelniku
- double vyska = delka(a,c)*cfrac_tan(b,10)+c;
- return vyska;
- }
- int main(int argc, char *argv[])
- {
- double a, b;
- // rozsah pro počet iterací v --tan
- int n,m;
- // implicitní výška (výchozí hodnota 1.5 metrů pro c)
- double c = 1.5;
- char *err;
- // pokud je první parametr == --help, vypíše napovědu
- if (strcmp(argv[1],"--help") == 0){
- help();
- }else if (strcmp(argv[1],"--tan") == 0){
- // argumentů může být při porovnávání tangens přesně 5, pokud jich není pět vypíšeme chybu
- if (argc != 5){
- printf("chyba");
- return -1;
- }
- // převedeme vše na spravné čísla, a na double, n a m na integer
- a = strtod(argv[2],NULL);
- n = strtol(argv[3],NULL,10);
- m = strtol(argv[4],NULL,10);
- // porovnaváme jednotlivé tangens voláním konkrétních funkcí
- for (n; n <= m; n++){
- double vysledekZ = cfrac_tan(a, n);
- double vysledekT = taylor_tan(a, n);
- // fabs - slouží k vypočtu absolutní hodnoty ....
- printf("%d %e %e %e %e %e\n",n, tan(a),vysledekT,fabs(tan(a)-vysledekT), vysledekZ, fabs(tan(a)-vysledekZ));
- }
- // pokud je parametr roven volitelnému -c tak pokračujeme
- }else if (strcmp(argv[1],"-c") == 0){
- // počet parametrů prostě nemůže být větší než 6
- if (argc > 6){
- printf("chyba");
- return -1;
- }
- // převedeme c na číslo
- c = strtod(argv[2],&err);
- if (*err!=0){
- printf("chyba");
- return -1;
- }
- // kontrola parametrů
- if (strcmp(argv[3],"-m") == 0){
- a = strtod(argv[4],&err);
- if (*err != 0){
- printf("chyba");
- return -1;
- }
- // ošetření úhlu a v rozsahu 0 - 1.4
- if(a < 0 || a > 1.4){
- printf("chyba");
- return -1;
- }
- // defaultně vypisujeme a počítáme délku
- printf("%.10e\n", delka(a,c));
- // pokud je zadaný parametr b tak počítáme i výšku
- if (argc == 6){
- // pokud je zadaný parametr b tak ho převedeme na číslo a zkontrolujeme
- b = strtod(argv[5],&err);
- if (*err!=0){
- printf("chyba");
- return -1;
- }
- // nakonec vypočteme výšku
- printf("%.10e\n", vyska(a,b,c));
- }
- }
- // pokud zde není volitelný parametr c
- }else if (strcmp(argv[1],"-m") == 0){
- // převedeme a na číslo a ošetříme viz výše...
- a = strtod(argv[2],&err);
- if (*err!=0){
- printf("chyba");
- return -1;
- }
- // vypočteme vzdálenost
- printf("%.10e\n",delka(a,c));
- if (argc == 4){
- // pokud je zadané b tak ho převedeme na číslo a zkontrolujeme
- b = strtod(argv[3],&err);
- if (*err!=0){
- printf("chyba");
- return -1;
- }
- // nakonec vypočteme výšku
- printf("%.10e\n",vyska(a,b,c));
- }
- }else{
- printf("chyba");
- return -1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement