Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Soubor: proj2.c
- * Datum: 2014-11-23
- * Autor: Tomas Bartu, xbartu03@stud.fit.vutbr.cz
- * Projekt: Iteracni vypocty, projekt 2 pro predmet IZP
- * Popis: Vypocet vzdalenosti a vysky mereneho objektu pomoci udaju ze senzoru natoceni mericiho pristroje
- */
- #include <stdio.h>
- // obecne funkce jazyka C
- #include <stdlib.h>
- // kvuli funkci strcmp
- #include <string.h>
- // isalpha, isdigit
- #include <ctype.h>
- // limity ciselnych typu
- #include <limits.h>
- // typ bool, konstanty true, false
- #include <stdbool.h>
- // promenna errno
- #include <errno.h>
- //pro pouziti tan
- #include <math.h>
- //definice pro vypocet absolutni odchylky, pro prehlednost
- #define ODCHYLKA_TAYLOR tan(arg1) - taylor_tan(arg1,i)
- #define ODCHYLKA_CFRAC tan(arg1) - cfrac_tan(arg1,i)
- //prototypy funkcí
- double taylor_tan(double x, unsigned int n);
- double cfrac_tan(double x, unsigned int n);
- int okParam(int argc, char *argv[]);
- int jeNapoveda(int argc, char *argv[]);
- double vypocet(int argc, char *argv[]);
- void zpracovani_tan(char *argv[]);
- void zpracovani_m(int argc, char *argv[]);
- /**
- * Napoveda, ktera bude dále vypsana pomocí funkce v pripade, že dojde k zadani argumentu --help
- * Retezec s textem napovedy
- */
- const char *HELPMSG =
- "Program Iteracni vypocty.\n"
- "Autor: Tomas Bartu (c) 2014\n"
- "Program provadi iteracni vypocty a implementuje vypocet vzdalenosti ze zadanych parametru.\n"
- "Pouziti programu:";
- /**
- * Datovy vyctovy typ pro ruzne druhy chyb
- *
- */
- enum tecodes
- {
- WRONGARG, // spatne zadane parametry
- NOTNUMBER, // nejedna se o cislo
- ANOTHERR, // jina chyba
- };
- /**
- * Text ktery bude vypisovan pro jednotlive chyby
- */
- const char *ECODEMSG[] =
- {
- [WRONGARG] = "Zadal jste neplatne parametry prikazove radky. Pro napovedu pouzijte --help\n",
- [NOTNUMBER] = "Nespravne zadane cislo! Pro napovedu pouzijte --help\n",
- [ANOTHERR] = "Nastala chyba. Pro napovedu pouzijte --help\n",
- };
- /**
- * Zpracuje druh chyby a nasledne vypise chybovou hlasku.
- * @param int ecode, ktery oznacuje druh chyby
- */
- void printECode(int ecode)
- {
- if (ecode < WRONGARG || ecode > NOTNUMBER)
- { ecode = ANOTHERR; }
- //vypis chyby
- fprintf(stderr, "%s", ECODEMSG[ecode]);
- }
- void zpracovani_m(int argc, char *argv[]) {
- double alfa, beta;
- double vyska_predmetu;
- double vzdalenost = 0;
- double vyska = 1.5;
- if((strcmp("-m", argv[1]) == 0)) {
- alfa = atof(argv[2]);
- if(alfa < 0 || alfa > 1.4) { printECode(ANOTHERR); return;}
- vzdalenost = vyska / cfrac_tan(alfa, 10);
- printf("%.10e\n", vzdalenost);
- if(argc == 4) {
- beta = atof(argv[3]);
- if(beta < 0 || beta > 1.4) { printECode(ANOTHERR); return; }
- vyska_predmetu = (cfrac_tan(beta, 10) * vzdalenost) + vyska;
- printf("%.10e\n", vyska_predmetu);
- }
- } else {
- alfa = atof(argv[4]);
- if(alfa < 0 || alfa > 1.4) { printECode(ANOTHERR); return;}
- vyska = atof(argv[2]);
- if(vyska < 0 || vyska > 100) { printECode(ANOTHERR); return;}
- vzdalenost = vyska / cfrac_tan(alfa, 10);
- printf("%.10e\n", vzdalenost);
- if(argc == 6) {
- beta = atof(argv[5]);
- if(beta < 0 || beta > 1.4) { printECode(ANOTHERR); return;}
- vyska_predmetu = (cfrac_tan(beta, 10) * vzdalenost) + vyska;
- printf("%.10e\n", vyska_predmetu);
- }
- }
- }
- void zpracovani_tan(char *argv[]) {
- double arg1 = atof(argv[2]);
- int arg2 = atoi(argv[3]);
- int arg3 = atoi(argv[4]);
- // osetreni chyb, a aby nebylo zadano vetsi cislo nez 1.4
- if(arg1 == 0 || arg2 == 0 || arg3 == 0 || arg1> 1.4 || arg1 < 0) { printECode(NOTNUMBER); return;}
- if(arg3 < arg2 || arg3 > 13) { printECode(ANOTHERR); return; }
- if(arg2 == 0) {printECode(ANOTHERR); return;}
- int i;
- //volani funkci
- for(i = 1; i <= arg3; i++) {
- if(i >= arg2) {
- // vypis
- printf("%d %e %e %e %e %e\n", i, tan(arg1), taylor_tan(arg1, i), (ODCHYLKA_TAYLOR), cfrac_tan(arg1, i), (ODCHYLKA_CFRAC));
- }
- }
- }
- /**
- * Hlavni program
- * funkce main
- * @param int argc - pocet parametru z prikazove radky
- * @param char *argv[] - textove retezce z parametru
- * @return EXIT_SUCCESS
- */
- int main(int argc, char *argv[])
- {
- /* zde si overuju jestli jsou argumenty v poradku pomoci funkce okParam, jde v podstate o to ze,
- * okParam vraci nulu kdyz doslo k chybnemu parametru, takze pokud nevraci 1 tak chyba
- */
- if(!okParam(argc, argv))
- {
- printECode(WRONGARG);
- }
- else if(jeNapoveda(argc, argv))
- {
- printf("%s", HELPMSG);
- } else {
- // pokud je zadano --tan
- if((strcmp("--tan", argv[1]) == 0)) {
- zpracovani_tan(argv);
- //pokud -m
- } else if((strcmp("-m", argv[1]) == 0) || (strcmp("-m", argv[3]) == 0)) {
- zpracovani_m(argc, argv);
- } else {
- return 0;
- }
- }
- return EXIT_SUCCESS;
- }
- /**
- * Testuje zda jsou zadany spravne a vhodne argumenty prikazove radku
- * V pripade ze jsou spatne, vraci nulu, naopak vraci jednicku
- * @param int argc
- * @param char *argv[]
- * @return V pripade nalezeni chyby 0, naopak 1
- */
- int okParam(int argc, char *argv[])
- {
- // zde testuji rozsah, pokud je argc rovno jedna nebo je vetsi nez 6, jedna se o spatne argumenty, takze vracim nulu
- if(argc == 1 || argc > 6)
- {
- return 0;
- }
- if(argc > 2 && strcmp("--help", argv[1]) == 0) {
- return 0;
- }
- // v pripade ze se nejedna o help
- if(strcmp("--help", argv[1]) != 0)
- {
- //mam switch ktery otestuje jednotlive hodnoty argc
- switch(argc) {
- case 3: if((strcmp("-m", argv[1]) != 0)) return 0; break;
- case 4: if((strcmp("-m", argv[1]) != 0)) return 0; break;
- case 5: if(strcmp("--tan", argv[1]) == 0) { return 1;}
- else if((strcmp("-c", argv[1]) == 0) && (strcmp("-m", argv[3]) == 0)) {return 1;}
- else {return 0;}
- break;
- case 6: if(strcmp("-c", argv[1]) == 0) {
- if(strcmp("-m", argv[3]) == 0) {return 1;}
- return 0;
- } else {
- return 0;
- }
- break;
- default: return 0; break;
- }
- }
- return 1;
- }
- /**
- * Vraci pripad kdy se jedna o napovedu, ktery dale overuji v mainu
- * @param int argc, char *argv[]
- */
- int jeNapoveda(int argc, char *argv[])
- {
- return ((argc == 2) && (strcmp("--help",argv[1]) == 0));
- }
- double taylor_tan(double x, unsigned int n)
- {
- double tay_jmenovatele[] = {1, 3, 15, 315, 2835, 155925, 6081075, 638512875, 10854718875, 1856156927625, 194896477400625, 49308808782358125, 3698160658676859375};
- double tay_citatele[] = {1, 1, 2, 17, 62, 1382, 21844, 929569, 6404582, 443861162, 18888466084, 113927491862, 58870668456604};
- unsigned int j, i;
- double pom, vysledek = 0;
- for (i = 1; i <= n; i++)
- {
- pom = 1;
- for (j = 1; j <= (2 * i - 1); j++)
- {
- pom = pom * x;
- }
- vysledek = vysledek + ((tay_citatele[i-1] * pom) / tay_jmenovatele[i-1]);
- }
- return vysledek;
- }
- double cfrac_tan(double x, unsigned int n){
- double factor = 0;
- for(int i = n; i >0; i--) {
- factor = 1/(((i*2-1)/x)-factor);
- }
- return factor;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement