Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Projekt č. 1, předmět IZP
- * Autor: Dominik Dvořák, xdvora1t@stud.fit.vutbr.cz
- * Skupina: 1BIA
- * Datum: 11.11.2013
- * Název souboru: proj1.c
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdbool.h>
- char buff[1024]; //buffer pro funkce vyberu a nasledne vybranou operaci
- //****************************************************************************************************
- int Error(int error) //funce pro výpis chybových stavů
- {
- if (error==1) fprintf(stderr,"Error! \n - prvnim argumentem mohou byt pouze fce: \n - select \n - min \n - max \n - sum \n - avg \n - --help"); //chyba názvu prvního arumentu
- if (error==2) fprintf(stderr,"Error! \n - druhym argumentem muze byt pouze: \n - row \n - col \n - rows \n - cols \n - range"); //chyba názvu 2 argumentu
- if (error==3) fprintf(stderr,"Error! \n - vyber row ocekava 1 argument - cislo zvoleneho radku "); //chyba počtu argumentů
- if (error==4) fprintf(stderr,"Error! \n - vyber col ocekava 1 argument - cislo zvoleneho sloupce "); //chyba počtu argumentů
- if (error==5) fprintf(stderr,"Error! \n - vyber rows ocekava 2 argumenty - rozmezi zvolenych radku "); //chyba počtu argumentů
- if (error==6) fprintf(stderr,"Error! \n - vyber cols ocekava 2 argumenty - rozmezi zvolenych sloupcu "); //chyba počtu argumentů
- if (error==7) fprintf(stderr,"Error! \n - vyber range ocekava 4 argumenty - rozmezi zvolenych sloupcu a radku "); //chyba počtu argumentů
- if (error==8) fprintf(stderr,"Error! \n - 2. argument musi byt vetsi nez 1. "); //chyba počtu argumentů
- if (error==9) fprintf(stderr,"Error! \n - operace ocekava vyber bunek: \n - row \n - col \n - rows \n - cols \n - range"); //program spu?těn pouze s operací
- if (error==10) fprintf(stderr,"Error! \n - zadany rozsah bunek neobsahuje zadne ciselne hodnoty"); //pouze písmena či znaky VS funkce sum etc.
- if (error==11) fprintf(stderr,"Error! \n - argument 3 (5) musi byt <= nez argument 4 (6) "); //chyba argumentů
- if (error==12) fprintf(stderr,"Error! \n - argumenty musi byt >= 1 "); //chyba argumentů
- if (error==13) fprintf(stderr,"Error! \n - zadany parametr presahuje rozsah tabulky "); //chyba argumentů
- if (error==14) fprintf(stderr,"Error! \n - argument 3 musi byt < nez arg. 4 "); //chyba argumentů
- return(EXIT_FAILURE);
- }
- //****************************************************************************************************
- void Help() //funkce pro výpis nápovědy
- {
- fprintf(stdout,
- "\n"
- "Program implementuje funkce vyhledani maxima, minima, \n" "funkce souctu a aritmetickeho prumeru vybranych bunek. \n"
- "Tabulku ve forme textoveho souboru program ocekava na \n" "standardnim vstupu. Pozadovanou operaci a vyber bunek \n"
- "specifikujte v argumentu prikazove radky.\n" "\n" "Spusteni programu: \n" "./proj1 operace vyber_bunek <tabulka.txt |nebo| ./proj1 --help \n"
- "\n" "--help - tisk napovedy \n" "\n" "operace: \n" " select - vyber a tisk zvol. bunek \n"
- " min - tisk nejmensi hodnoty zvol. bunek \n" " max - tisk nejvet. hodnoty zvol. bunek \n"
- " sum - suma zvol. bunek \n" " avg - aritmeticky prum. zvol. bunek \n" "\n" "vyber_bunek: \n"
- " row X - vyber vsech bunek na radku X \n" " cal X - vyber vsech bunek ve sloupci X \n"
- " rows X Y - vyber bunek na radcich X az Y (vcetne X;Y) \n" " cals X Y - vyber bunek ve sloupcich X az Y (vcetne X;Y) \n"
- " range A B X Y - vyber bunek od rad. A po rad. B a od sl. \n" " X po sl. Y (vcetne A;B;X;Y) \n"
- );
- }
- //****************************************************************************************************
- void _42_ (char* argv3,char* argv4,char* argv5,char* argv6, int argc, long *arg3, long *arg4, long *arg5, long *arg6) //funkce pro načtení argumentů 3 - 6
- {
- if ((argc==4) || (argc==5) || (argc==7)) *arg3 = strtol(argv3, NULL, 10);
- if ((argc==5) || (argc==7)) *arg4 = strtol(argv4, NULL, 10);
- if ((argc==6) || (argc==7)) *arg5 = strtol(argv5, NULL, 10);
- if (argc==7) *arg6 = strtol(argv6, NULL, 10);
- }
- //****************************************************************************************************
- char VyberBunek (char* argv2, int argc, long arg3, long arg4, long arg5, long arg6) //funkce pro výběr buněk
- {
- static long shelper=1; //statická pomocná proměnná pro loopy funkcí
- char c; //char do return VyberBunek, dále pouzit ve fci operace
- char buff2[1024]; //pomocný buffer pro odřádkování
- if ((strcmp(argv2, "row")) == 0) //výběr řádku X
- {
- if (arg3<1) Error(12);
- else if (argc==4)
- {
- while (shelper!=arg3) //odřádkování, dokud nejsme na řádku arg3
- {
- fgets(buff,1024,stdin);
- shelper++;
- }
- scanf("%s", buff); //načtení buňky po bílý znak
- c=getchar(); //načtení bílého znaky
- }
- else Error(3);
- }
- else if ((strcmp(argv2, "col")) == 0) //výběr sloupce X
- {
- if (arg3<1) Error(12);
- else if (argc==4)
- {
- while (shelper!=arg3+1) //loop dokud nebudeme na sloupci X
- {
- scanf("%s",buff);
- shelper++;
- c=getchar();
- if (((c=='\n') || (c=='\r')) && (shelper!=(arg3+1))) Error(13); //chyba, pokud jsme za "hranicí" tabulky
- }
- if ((c=='\n') || (c=='\r')) fseek(stdin,-1,1); //fseek -1 kvůli správnému odřádkování
- else fgets(buff2,1024,stdin); //odřádkování
- shelper=1;
- }
- else Error(4);
- }
- else if ((strcmp(argv2, "rows")) == 0) //výběr řádku X - Y
- {
- if ((arg3<1) || (arg4<1)) Error(12);
- if (arg3>=arg4) Error(14);
- else if (argc==5)
- {
- while (shelper!=arg3)
- {
- fgets(buff,1024,stdin);
- if ((shelper!=(arg3+1)) && feof(stdin)) Error(13);
- c=10;
- fseek(stdin,-1,1);
- shelper++;
- }
- scanf("%s", buff);
- c=getchar();
- }
- else Error(6);
- }
- else if ((strcmp(argv2, "cols")) == 0) //výběr sloupců X - Y
- {
- if ((arg3<1) || (arg4<1)) Error(12);
- if (arg3>=arg4) Error(14);
- else if (argc==5)
- {
- static long helper=1;
- static long helper2=0;
- if (shelper==1)
- {
- while (shelper!=arg3+1)
- {
- scanf("%s", buff);
- shelper++;
- helper=1;
- c=getchar();
- if (((c=='\n') || (c=='\r')) && (shelper!=(arg3+1))) Error(13); //chyba, pokud jsme za "hranicí" tabulky
- }
- }
- if ((shelper!=1) && (helper!=1)) scanf("%s", buff);
- helper++;
- helper2++;
- if (helper2-1==arg4-arg3)
- {
- fgets(buff2,1024,stdin);
- shelper=1;
- helper2=0;
- }
- }
- else Error(6);
- }
- else if ((strcmp(argv2, "range")) == 0) //výběr X - Y a A - B
- {
- if ((arg3<1) || (arg4<1) || (arg5<1) || (arg6<1)) Error(12);
- else if ((arg3>arg4) || (arg5>arg6)) Error(11);
- else if (argc==7)
- {
- static long helper=1; //pomocná proměnná
- static long helper2=1; //pomocná proměnná
- static long helper3=1; //pomocná proměnná
- if (helper2==1)
- {
- while(helper2!=arg3)
- {
- fgets(buff2,1024,stdin); //odřádkování na arg3
- helper2++;
- }
- }
- if (arg6==arg5)
- {
- while (helper!=arg5+1) //loop dokud nebudeme na sloupci X
- {
- scanf("%s",buff);
- helper++;
- c=getchar();
- if (((c=='\n') || (c=='\r')) && (helper!=(arg5+1))) Error(13); //chyba, pokud jsme za "hranicí" tabulky
- }
- if ((c=='\n') || (c=='\r')) fseek(stdin,-1,10); //fseek -1 kvůli správnému odřádkování
- else fgets(buff2,1024,stdin); //odřádkování
- helper=1;
- }
- else
- {
- static long helper=1;
- static long helper2=0;
- if (helper3==1)
- {
- while (helper3!=arg5+1)
- {
- scanf("%s", buff);
- helper3++;
- helper=1;
- c=getchar();
- if (((c=='\n') || (c=='\r')) && (helper!=(arg5+1))) Error(13); //chyba, pokud jsme za "hranicí" tabulky
- }
- }
- if ((helper3!=1) && (helper!=1)) scanf("%s", buff);
- helper++;
- helper2++;
- if (helper2-1==arg6-arg5)
- {
- fgets(buff2,1024,stdin);
- helper3=1;
- helper2=0;
- }
- }
- }
- else Error(7);
- }
- else Error(2);
- return c; //vrácení bílého znaku
- }
- //****************************************************************************************************
- bool Integer(char buff[1024], double *c, bool *onlychars) //funkce pro zji?tění, zda jde o číselnou hodnotu
- {
- int Integer0=0;
- *c=strtod(buff,NULL);
- if ((*c==0) & (strcmp(buff,"0") == 0))
- {
- Integer0=1;
- (*onlychars)++;
- }
- else if (*c>0)
- {
- Integer0=1;
- (*onlychars)++;
- }
- else Integer0=0;
- return Integer0;
- }
- //****************************************************************************************************
- int Operace(char* argv1, char* argv2, char* argv3, char* argv4, char* argv5, char* argv6, int argc) //funce pro všechny operace
- {
- long arg3, arg4, arg5, arg6; //argumenty 3 - 6
- _42_(argv3, argv4, argv5, argv6, argc, &arg3, &arg4, &arg5, &arg6);
- long c_h = 0; //ridici prom. pro loop
- double c = 0.0; //proměnná pro sum, min, max a avg
- bool onlychars; //proměnná pro sum, min, max a avg
- long c_hh = 0; //++ kdyz je konec řádku nebo eof - loop
- long avg_h = 0; //pomocná proměnná pro průměr
- double vysl = 0.0; //proměnná pro sum, min, max a avg
- long rowsloop = arg4-arg3+1; //proměná pro loop rows
- long rangeloop = (arg4-arg3+1)*(arg6-arg5+1); //proměná pro loop range
- for(;;)
- {
- char chr=VyberBunek(argv2, argc, arg3, arg4, arg5, arg6);
- if (((strcmp(argv2, "col")) == 0) && (chr==EOF)) break; //break u col
- if (((strcmp(argv2, "cols")) == 0) && (chr==EOF)) break; //break u cols
- if (((strcmp(argv2, "rows")) == 0) && ((c_hh!=rowsloop) && (chr==EOF))) Error(13); //error "hranic" taulky u rows
- if (((strcmp(argv2, "rows")) == 0) && ((c_hh==rowsloop) || (chr==EOF))) break; //break u rows
- if (chr==EOF) Error(13); //chyba, pokud jsme za hranicí tabulky
- Integer(buff, &c, &onlychars); //zjistění zda jde o číslo
- if ((chr== '\r') || (chr== '\n') || (feof(stdin))) c_hh++; //++ kdyz je konec řádku nebo eof - loop
- c_h++;
- if ((strcmp(argv1, "select"))==0) printf("%s \n",buff); //operace select
- if ((strcmp(argv1, "min"))==0) //operace min
- {
- bool Integer0=Integer(buff, &c, &onlychars);
- if (Integer0!=0)
- {
- if (c_h==1) vysl=c;
- }
- if (Integer0!=0) if (c_h!=1)
- {
- if (c<vysl) vysl=c;
- }
- }
- if ((strcmp(argv1, "max"))==0) //operace max
- {
- if (c_h==1) vysl=c;
- if (c_h!=1)
- {
- if (c>vysl) vysl=c;
- }
- }
- if ((strcmp(argv1, "sum"))==0) vysl=vysl+c; //operace sum
- if ((strcmp(argv1, "avg"))==0) //operace avg
- {
- bool Integer0=0;
- Integer0=Integer(buff, &c, &onlychars);
- if (Integer0==1) avg_h++;
- vysl=vysl+c;
- }
- if (((strcmp(argv2, "row")) == 0) && ((chr=='\r') || (chr=='\n') || (chr==EOF))) break; //break u row
- if (((strcmp(argv2, "range")) == 0) && (c_h==rangeloop)) break; //break u range
- if ((c_h!=rangeloop) && (chr==EOF)) Error(13);
- }
- if (((onlychars)==0) && (((strcmp(argv1, "min"))==0) || ((strcmp(argv1, "max"))==0) ||
- ((strcmp(argv1, "sum"))==0) || ((strcmp(argv1, "avg"))==0))) Error(10);
- else
- {
- if ((strcmp(argv1, "min"))==0) printf("Nejmensi hodnota ze zvolenych bunek je: %.10g",vysl);
- if ((strcmp(argv1, "max"))==0) printf("Nejvetsi hodnota ze zvolenych bunek je: %.10g",vysl);
- if ((strcmp(argv1, "sum"))==0) printf("Suma zvolenych bunek je: %.10g",vysl);
- if ((strcmp(argv1, "avg"))==0) printf("Aritmeticky prumer zvolenych bunek je: %.10g",vysl/avg_h);
- }
- return (EXIT_SUCCESS);
- }
- //****************************************************************************************************
- int main(int argc, char **argv)
- {
- if (argc>1)
- {
- if ((strcmp(argv[1], "--help")) == 0) //výpis nápovědy
- {
- Help();
- }
- else if (((strcmp(argv[1], "select")) == 0) | ((strcmp(argv[1], "min")) == 0) | ((strcmp(argv[1], "max")) == 0) |
- ((strcmp(argv[1], "sum")) == 0) | ((strcmp(argv[1], "avg")) == 0))
- {
- if (argc>=3) Operace(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],argc); //volání funkce se vsemi moznými argumenty
- else Error(9);
- }
- else Error(1);
- }
- return (EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement